打印
[技术问答]

新唐N76E003+GPRS 内部EEPROM读取故障排除手记

[复制链接]
691|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。

void n76e003_flash_num_read(void)
{
        unsigned char block = 0;
        unsigned char buf_cnt = 0;
        unsigned char num_buf[8];
        unsigned long num_temp = 0;
        for (block = 0; block < 16; block++)
        {
                for (buf_cnt = 0; buf_cnt < 4; buf_cnt++)
                {
                        num_buf[buf_cnt] = n76e003_flash_read(0x4700 + (block >> 3) + buf_cnt);
                }
                num_temp = (num_buf[0] << 24) + (num_buf[1] << 16) + (num_buf[2] << 8) + (num_buf[3]);
                num_total = (num_total > num_temp) ? num_total : num_temp;
        }
        block = num_total / AvrgMaxNum;
        for (buf_cnt = 0; buf_cnt < 4; buf_cnt++)
        {
                num_buf[buf_cnt + 4] = n76e003_flash_read(0x4700 + (block >> 3));
        }
        num_left = (num_buf[4] << 24) + (num_buf[5] << 16) + (num_buf[6] << 8) + (num_buf[7]);
}


使用特权

评论回复
地板
LM莫|  楼主 | 2020-6-28 20:26 | 只看该作者
解决问题

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

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


使用特权

评论回复
5
稳稳の幸福| | 2020-6-28 23:12 | 只看该作者
这个是,,看看。

使用特权

评论回复
6
小灵通2018| | 2020-6-28 23:49 | 只看该作者
用到FMC吧

使用特权

评论回复
7
小灵通2018| | 2020-7-25 10:40 | 只看该作者
原来如此,其实这个时候为了靠谱不需要用移位,你直接乘法也会被翻译成移位。这样更显然。

使用特权

评论回复
8
小灵通2018| | 2020-7-25 10:40 | 只看该作者
之前我试过,现在的开发软件都会自动使用移位。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

447

帖子

3

粉丝