找回密码
 立即注册
查看: 137|回复: 8

stc8h8k64u的EEPROM,断电上电读取部分数据出错。

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2026-05-17 11:34:02

2

主题

2

回帖

28

积分

新手上路

积分
28
发表于 2026-5-17 11:34:02 | 显示全部楼层 |阅读模式

工作逻辑:stc8h8k64u的串口DMA_485和触摸屏通讯,单片机每200ms读取一次触摸屏的参数寄存器(共19个16位寄存器),如果发现用户对触摸屏的参数寄存器做了改动,和上一次值不一样,就擦除EEPROM,把19个参数写一遍,正常情况下,如果用户不操作触摸屏,每次读取的寄存器参数和前一次一样,就不会触发操作擦写EEPROM;所以每次上电开机,把存在EEPROM中上次断电前存入的参数,读取使用。

目前出现的问题:单片机串口DMA工作正常,触摸屏发送的数据(44个字节),22个字节存入EEPROM中然后再读出通过串口输出,可以看到读出来的数据都是是正确的,这是否表明已经正确写入了eeprom中了?但是当我断电上电再读eeprom,会出现前5个字节的数据是正常的,后面的数据有2字节是对的,其余全部是错的。工作中大部分时间是不擦写eeprom的。

程序在烧录的时候,频率选择33.1776MHz;分配给eeprom的空间是6KB;我擦除的是两个扇区0x1000,0x1200;分别存储在0x1010,0x01020.......0x101f;  0x1210,0x12020.......0x1260;
断电上电数据正确的是0x1010......0x1070;

我单独写了一个测试eeprom的程序,下面的程序是正常的,折腾两天了,一直解决不了。附上eeprom擦写读程序,那位大佬帮忙指点一下。
void IapIdle()

{       

IAP_CONTR = 0;                              //关闭IAP功能 

IAP_CMD   = 0;                              //清除命令寄存器        

IAP_TRIG  = 0;                              //清除触发寄存器       

IAP_ADDRH = 0x80;                           //将地址设置到非IAP区域       

IAP_ADDRL = 0;

}

uchar EEPROM_Read(uint Addr)

{      

 uchar Data;                

EA = 0;                

IAP_CONTR = 0x80;                          //使能IAP                        

IAP_TPS = 33;                               //设置等待参数33.1776MHz        

IAP_CMD = 0x01;                             //设置IAP读命令        

IAP_ADDRL = Addr;                           //设置IAP低地址       

 IAP_ADDRH = Addr >> 8;                      //设置IAP高地址       

 IAP_TRIG = 0x5a;                            //写触发命令(0x5a)       

 IAP_TRIG = 0xa5;                            //写触发命令(0xa5)        

nop();        nop();        nop();        

Data = IAP_DATA;                            //读IAP数据       

 IapIdle();                                  //关闭IAP功能         

EA = 1;               

 return Data;

}

void EEPROM_Write(uint Addr, uchar Data)

{         

EA = 0;                

IAP_CONTR = 0x80;                          //使能IAP                

IAP_TPS = 33;                               //设置等待参数33.1776MHz       

IAP_CMD = 0x02;                             //设置IAP写命令                

IAP_ADDRL = Addr;                           //设置IAP低地址       

 IAP_ADDRH = Addr >> 8;                      //设置IAP高地址        

IAP_DATA = Data;                             //写IAP数据       

 IAP_TRIG = 0x5a;                            //写触发命令(0x5a)        

IAP_TRIG = 0xa5;                            //写触发命令(0xa5)       

 nop();        nop();        nop();       

 IapIdle();                                  //关闭IAP功能        

EA = 1;

}

void EEPROM_Erase(uint Addr)

{        

EA = 0;              

IAP_CONTR = 0x80;                          //使能IAP                

IAP_TPS = 33;                               //设置等待参数33.1776MHz               

 IAP_CMD = 0x03;                             //设置IAP擦除命令        

IAP_ADDRL = Addr;                           //设置IAP低地址        

IAP_ADDRH = Addr >> 8;                      //设置IAP高地址        

IAP_TRIG = 0x5a;                            //写触发命令(0x5a)       

 IAP_TRIG = 0xa5;                            //写触发命令(0xa5)        

nop();        nop();        nop();        IapIdle();                                  //关闭IAP功能        

EA = 1;

}

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:453
  • 最近打卡:2026-07-03 08:57:36

830

主题

1万

回帖

2万

积分

管理员

积分
23929
发表于 2026-5-17 12:08:23 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:120
  • 最近打卡:2026-07-05 08:00:11
已绑定手机

3

主题

180

回帖

857

积分

高级会员

积分
857
发表于 2026-5-17 12:29:22 | 显示全部楼层
多加几个nop(); 试试。
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2026-05-17 11:34:02

2

主题

2

回帖

28

积分

新手上路

积分
28
发表于 2026-5-17 15:31:25 | 显示全部楼层
wul*** 发表于 2026-5-17 12:29
多加几个nop(); 试试。

加了nop();没有改善,还是一样,
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2026-05-17 11:34:02

2

主题

2

回帖

28

积分

新手上路

积分
28
发表于 2026-5-17 15:31:52 | 显示全部楼层
神*** 发表于 2026-5-17 12:08
【新提醒】EEPROM的使用 请 配合比较器做掉电检测 | 唯一正解,电力系统标准应用 - EEPROM/DataFlash 国芯 ...

硬件已经做好了,不好加元器件呢

点评

先飞线测试下  详情 回复 发表于 2026-5-17 15:35
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:453
  • 最近打卡:2026-07-03 08:57:36

830

主题

1万

回帖

2万

积分

管理员

积分
23929
发表于 2026-5-17 15:35:09 | 显示全部楼层
dxm*** 发表于 2026-5-17 15:31
硬件已经做好了,不好加元器件呢

先飞线测试下
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:120
  • 最近打卡:2026-07-05 08:00:11
已绑定手机

3

主题

180

回帖

857

积分

高级会员

积分
857
发表于 2026-5-17 16:45:05 | 显示全部楼层
dxm*** 发表于 2026-5-17 15:31
加了nop();没有改善,还是一样,

程序没有问题,再降频11.0592试试。不是有特别需求不要使用高频时钟,可以避免许多麻烦。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:712
  • 最近打卡:2026-07-03 09:07:06
已绑定手机

50

主题

2691

回帖

9338

积分

论坛元老

积分
9338
发表于 2026-5-18 10:41:06 | 显示全部楼层
烧录附件例子到芯片里试试,功能验证正常后再进行修改或者移植。

STC8-EEPROM多字节读写操作-通过串口1输出-STC8.zip

16.81 KB, 下载次数: 1

回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:719
  • 最近打卡:2026-07-05 11:17:37

37

主题

173

回帖

1089

积分

金牌会员

积分
1089
发表于 2026-5-18 13:31:21 | 显示全部楼层
我也出现过。将keil编辑优化改一下解决。原来在6 往小改。我的也困扰很久。最后发现优化问题。而且问题很好复现
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-7-5 14:05 , Processed in 0.075125 second(s), 83 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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