[技术问答] 新唐N76E003+GPRS 内部EEPROM读取故障排除手记

[复制链接]
970|7
 楼主| LM莫 发表于 2020-6-28 20:24 | 显示全部楼层 |阅读模式
设计目的

将数组写入N76E003的eeprom中,然后再下次开机时读取。


 楼主| LM莫 发表于 2020-6-28 20:25 | 显示全部楼层
出现问题

数据写入后再次读取,发现读取数据错误。通过断点跟踪调试,发现有如下错误,例如:上次写入是00 01 读取后编程了01 00。


 楼主| LM莫 发表于 2020-6-28 20:26 | 显示全部楼层
分析问题
如下图代码所示,程序逻辑是:

1、从4700H开始读,每次读取8个字节,一共读取16次。

2、比较每一次取出的值,找到最大的那个值,即为最新值。

如果写入4700H地址的值是00 01 当block这个变量是0-7时,读取地址是4700H+(block>>3)

问题就出在这里,程序原意是4700H+(block*8)即4700H+(block<<3),由于手残写错了符号,造成的结果是在16次读取过程中,前8次读取的内容是4700H即00,后8次读取的是4701H即01,这样经过移位计算后,实际值00 01就变成了01 00。

  1. void n76e003_flash_num_read(void)
  2. {
  3.         unsigned char block = 0;
  4.         unsigned char buf_cnt = 0;
  5.         unsigned char num_buf[8];
  6.         unsigned long num_temp = 0;
  7.         for (block = 0; block < 16; block++)
  8.         {
  9.                 for (buf_cnt = 0; buf_cnt < 4; buf_cnt++)
  10.                 {
  11.                         num_buf[buf_cnt] = n76e003_flash_read(0x4700 + (block >> 3) + buf_cnt);
  12.                 }
  13.                 num_temp = (num_buf[0] << 24) + (num_buf[1] << 16) + (num_buf[2] << 8) + (num_buf[3]);
  14.                 num_total = (num_total > num_temp) ? num_total : num_temp;
  15.         }
  16.         block = num_total / AvrgMaxNum;
  17.         for (buf_cnt = 0; buf_cnt < 4; buf_cnt++)
  18.         {
  19.                 num_buf[buf_cnt + 4] = n76e003_flash_read(0x4700 + (block >> 3));
  20.         }
  21.         num_left = (num_buf[4] << 24) + (num_buf[5] << 16) + (num_buf[6] << 8) + (num_buf[7]);
  22. }


 楼主| LM莫 发表于 2020-6-28 20:26 | 显示全部楼层
解决问题

将4700H+(block>>3)更改为4700H+(block<<3)后,程序正常运行。

上面贴出的程序是错误的程序,仅用于说明问题,请谨慎参考。


稳稳の幸福 发表于 2020-6-28 23:12 | 显示全部楼层
这个是,,看看。
小灵通2018 发表于 2020-6-28 23:49 | 显示全部楼层
用到FMC吧
小灵通2018 发表于 2020-7-25 10:40 | 显示全部楼层
原来如此,其实这个时候为了靠谱不需要用移位,你直接乘法也会被翻译成移位。这样更显然。
小灵通2018 发表于 2020-7-25 10:40 | 显示全部楼层
之前我试过,现在的开发软件都会自动使用移位。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

447

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部