找回密码
 立即注册
查看: 1080|回复: 3

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

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




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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 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
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2024-07-16 16:50:24

2

主题

16

回帖

90

积分

注册会员

积分
90
发表于 2024-5-22 10:16:29 | 显示全部楼层
梦里*** 发表于 2023-9-11 21:30
噢,貌似有道理,将图中√我去掉试试

我也是网上抄的代码,现在可以写入和读取了
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:16 , Processed in 0.133906 second(s), 71 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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