找回密码
 立即注册
查看: 362|回复: 2

关于STC8A8K64D4的EEPROM读写问题

[复制链接]

该用户从未签到

6

主题

23

回帖

108

积分

注册会员

积分
108
发表于 2023-9-10 18:39:12 | 显示全部楼层 |阅读模式

STC8A8K64D4
11.0592
设置用户EEPROM大小:0.5K
以下是我从手册上摘抄的代码,上电运行,可以读出正确值,单独写入EEPROM(地址0x0000),断电,修改代码再单独读EEPROM(地址0x0000),读出的数值为0xFFFF,IAP读写模式,代码参考如下:



//----------------------------------------------------------------------------
void IapIdle()
{
  IAP_CONTR = 0;                              //关闭IAP功能
  IAP_CMD = 0;                                //清除命令寄存器
  IAP_TRIG = 0;                               //清除触发寄存器
  IAP_ADDRH = 0x80;                           //将地址设置到非IAP区域
  IAP_ADDRL = 0;
}


//----------------------------------------------------------------------------
char IapRead(int addr)
{ //EEPROM读字节数据
  char dat;


  IAP_CONTR = 0x80;                         //使能IAP
        IAP_TPS=11;
  IAP_CMD = 1;                                //设置IAP读命令
  IAP_ADDRL = addr;                           //设置IAP低地址
  IAP_ADDRH = addr >> 8;                      //设置IAP高地址
       
  IAP_TRIG = 0x5A;                            //写触发命令(0x5A)
  IAP_TRIG = 0xA5;                            //写触发命令(0xA5)
  _nop_();
  dat = IAP_DATA;                             //读IAP数据
       
  IapIdle();                                  //关闭IAP功能


  return dat;
}


//----------------------------------------------------------------------------
void IapProgram(int addr, char dat)
{ //EEPROM写字节数据
  IAP_CONTR = 0x80;                         //使能IAP
        IAP_TPS=11;
  IAP_CMD = 2;                                //设置IAP写命令
  IAP_ADDRL = addr;                           //设置IAP低地址
  IAP_ADDRH = addr>>8;                        //设置IAP高地址
  IAP_DATA = dat;                             //写IAP数据
               
  IAP_TRIG = 0x5A;                            //写触发命令(0x5A)
  IAP_TRIG = 0xA5;                            //写触发命令(0xA5)
  _nop_();
       
  IapIdle();                                  //关闭IAP功能
}


//----------------------------------------------------------------------------
void IapErase(int addr)
{ //EEPROM扇区擦除
  IAP_CONTR =0x80;                         //使能IAP
        IAP_TPS=11;
  IAP_CMD = 3;                                //设置IAP擦除命令
  IAP_ADDRL = addr;                           //设置IAP低地址
  IAP_ADDRH = addr>>8;                        //设置IAP高地址
       
  IAP_TRIG = 0x5A;                            //写触发命令(0x5A)
  IAP_TRIG = 0xA5;                            //写触发命令(0xA5)
  _nop_();                                    //
       
  IapIdle();                                  //关闭IAP功能
}
       


sbit LED_OPEN       = P3^5;                  //开门LED
        char aa,bb;
void main(void)
{

//◆=====主循环控制流程(开始)====
  while (1)
  {
// 第一次去掉注释,让它写入0x0000处数值为0x03,第二次注释掉本段代码,单独执行后面读程序       
//        IapErase(0x0000);
//  IapProgram(0x0000,0x03);
//               
                LED_OPEN=0;

          bb = IapRead(0x0000);
          bb = IapRead(0x0000);
//判断数据对错
        if(bb==0xFFFF)        //第一次(bb==0x03),就可以进入判断,第二次就就不行了,只能执行(bb==0xFFFF),说明读出的数值为0XFFFF

        {
        delay_ms(1000);
        LED_OPEN=1;
        }
            delay_ms(1000);

  } //=====End of "while(1)"=====

  //◎=====主循环控制流程(结束)====
}




期间我关过中断,也不行,谁遇到过能给我思路?谢谢
回复 送花

使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:55
  • 签到天数: 141 天

    [LV.7]常住居民III

    27

    主题

    1338

    回帖

    4169

    积分

    论坛元老

    积分
    4169
    发表于 2023-9-10 18:49:45 | 显示全部楼层
    下载时默认擦除整个Flash,包括EEPROM区间的内容。
    修改代码重新烧录时已经把上次写入的内容擦除了。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    6

    主题

    23

    回帖

    108

    积分

    注册会员

    积分
    108
     楼主| 发表于 2023-9-11 21:30:33 | 显示全部楼层
    乘风飞扬 发表于 2023-9-10 18:49
    下载时默认擦除整个Flash,包括EEPROM区间的内容。
    修改代码重新烧录时已经把上次写入的内容擦除了。 ...

    噢,貌似有道理,将图中√我去掉试试

    EEPROM

    EEPROM
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-16 08:43 , Processed in 0.062168 second(s), 40 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表