紧急求助:ATmega128内部EEPROM数据掉电丢失的问题?
本帖最后由 lanpad 于 2013-3-26 20:25 编辑通过串口向ATmega128的EEPROM写入数据:
eprom_write(0x00, 0x0E, data_in);
每次上电时从EEPROM中读出:
eprom_read(0x00, 0x0E, data_out);
可是每次断电重启之后有时会出现读出数据出错的情况
请问该如何解决?
已经尝试了在熔丝位设置时设置Bodlevel启动电压2.7V或4.0V,同时勾选了EEPROM掉电保护。可是不管用
读写程序如下:
/*EEPROM读取函数*/
/*addr:地址;number:长度;p_buff:读出数据存放指针*/
void eprom_read(unsigned int addr, unsigned char number, unsigned char *p_buff) {
while(EECR & (1 << EEWE)); /* 等待上一次写操作结束 */
while(number --) {
EEAR = addr ++; /* 设置地址寄存器 */
EECR |= (1 << EERE); /* 置位EERE 读使能 */
*p_buff++ = EEDR;
}
}
/*EEPROM写入函数*/
/*addr:地址;number:长度;p_buff:写入数据存放指针*/
void eprom_write(unsigned int addr, unsigned char number, unsigned char *p_buff) {
while(number --) {
while(EECR & (1 << EEWE)); /* 等待上一次写操作结束 */
EEAR = addr ++; /* 设置地址寄存器 */
EEDR = *p_buff ++; /* 设置数据寄存器 */
EECR |= (1 << EEMWE); /* 置位EEMWE 主机写使能*/
EECR |= (1 << EEWE); /* 置位EEWE 写使能*/
}
} 你肯定是没写进去。EEPROM本来就是掉电保存的。 为什么我没遇到过。是不是I2C时序不太合适?没分析你的程序 可为什么有时候可以呢?
崩溃中…… wye11083 发表于 2013-3-26 20:26 static/image/common/back.gif
你肯定是没写进去。EEPROM本来就是掉电保存的。
data_in来自串口buf
写入程序“eprom_write(0x00, 0x0E, data_in);”有问题么? EEDR = *p_buff ++;?你不要自以为聪明用这种复杂体!老老实实一行一行写!错误都是不经意间发生的! while(number --)? wye11083 发表于 2013-3-26 20:26 static/image/common/back.gif
你肯定是没写进去。EEPROM本来就是掉电保存的。
写应该是写进去了
因为初次写入再断电一般没事
但多开关几次就会出现问题
肯定是数据丢失造成的 你的读函数是否有问题,是否应修改为:/*EEPROM读取函数*/
/*addr:地址;number:长度;p_buff:读出数据存放指针*/
void eprom_read(unsigned int addr, unsigned char number, unsigned char *p_buff) {
while(number --) {
while(EECR & (1 << EEWE)); /* 等待上一次写操作结束 */
EEAR = addr ++; /* 设置地址寄存器 */
EECR |= (1 << EERE); /* 置位EERE 读使能 */
*p_buff++ = EEDR;
}
}
你原先的很明显跟写函数不一样吗
数据写入后,马上回读一下,进行对比.看是否正确. 搜索一下,论坛里面有很多例子的。 写加入校验,并且在写入E2ROM操作完毕后delay_ms(10),让数据完全写入E2ROM.
其它要注意程序在意外时不要去写E2ROM,并且读取后校验数据的可靠性。
页:
[1]