搜索
bottom↓
回复: 11

紧急求助:ATmega128内部EEPROM数据掉电丢失的问题?

[复制链接]

出0入0汤圆

发表于 2013-3-26 20:02:08 | 显示全部楼层 |阅读模式
本帖最后由 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 写使能*/
                }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入442汤圆

发表于 2013-3-26 20:26:42 | 显示全部楼层
你肯定是没写进去。EEPROM本来就是掉电保存的。

出0入4汤圆

发表于 2013-3-26 20:28:22 | 显示全部楼层
为什么我没遇到过。是不是I2C时序不太合适?没分析你的程序

出0入0汤圆

 楼主| 发表于 2013-3-26 20:28:35 | 显示全部楼层
可为什么有时候可以呢?

崩溃中……

出0入0汤圆

 楼主| 发表于 2013-3-26 20:40:32 | 显示全部楼层
wye11083 发表于 2013-3-26 20:26
你肯定是没写进去。EEPROM本来就是掉电保存的。

data_in来自串口buf
写入程序“eprom_write(0x00, 0x0E, data_in);”有问题么?

出0入442汤圆

发表于 2013-3-26 21:00:13 | 显示全部楼层
EEDR = *p_buff ++;?你不要自以为聪明用这种复杂体!老老实实一行一行写!错误都是不经意间发生的!

出0入0汤圆

发表于 2013-3-26 21:05:44 | 显示全部楼层
while(number --)?

出0入0汤圆

 楼主| 发表于 2013-3-27 07:14:12 | 显示全部楼层
wye11083 发表于 2013-3-26 20:26
你肯定是没写进去。EEPROM本来就是掉电保存的。

写应该是写进去了
因为初次写入再断电一般没事
但多开关几次就会出现问题
肯定是数据丢失造成的

出0入4汤圆

发表于 2013-3-27 08:03:32 | 显示全部楼层
你的读函数是否有问题,是否应修改为:/*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;
                }
}
你原先的很明显跟写函数不一样吗

出0入0汤圆

发表于 2013-3-31 14:27:56 | 显示全部楼层
数据写入后,马上回读一下,进行对比.看是否正确.

出0入0汤圆

发表于 2013-3-31 14:40:58 | 显示全部楼层
搜索一下,论坛里面有很多例子的。

出50入0汤圆

发表于 2013-4-1 23:49:42 | 显示全部楼层
写加入校验,并且在写入E2ROM操作完毕后delay_ms(10),让数据完全写入E2ROM.
其它要注意程序在意外时不要去写E2ROM,并且读取后校验数据的可靠性。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 03:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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