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

目录

设计目的

出现问题

分析问题

解决问题


设计目的

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

出现问题

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

分析问题

如下图代码所示,程序逻辑是:

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]);
}

解决问题

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

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

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 成长之路 设计师:Amelia_0503 返回首页