梦里水乡 发表于 2023-9-10 18:39:12

关于STC8A8K64D4的EEPROM读写问题


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)"=====

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




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

乘风飞扬 发表于 2023-9-10 18:49:45

下载时默认擦除整个Flash,包括EEPROM区间的内容。
修改代码重新烧录时已经把上次写入的内容擦除了。

梦里水乡 发表于 2023-9-11 21:30:33

乘风飞扬 发表于 2023-9-10 18:49
下载时默认擦除整个Flash,包括EEPROM区间的内容。
修改代码重新烧录时已经把上次写入的内容擦除了。 ...

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

魏十一 发表于 2024-5-22 10:16:29

梦里水乡 发表于 2023-9-11 21:30
噢,貌似有道理,将图中√我去掉试试
我也是网上抄的代码,现在可以写入和读取了
页: [1]
查看完整版本: 关于STC8A8K64D4的EEPROM读写问题