EEPROM可靠性.doc_第1页
EEPROM可靠性.doc_第2页
EEPROM可靠性.doc_第3页
EEPROM可靠性.doc_第4页
EEPROM可靠性.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

其实论坛上讨论 AVR 内部 EEPROM 可靠性,以及如何合理使用内部 EEPROM 的帖子已经很多了,写这个帖子之前,还特意搜索了一下,EEPROM相关的主题贴一共有6页之多,酷贴达5个之多,没有看完,只选择性的看了一些,然后主要把注意力放在了两个与可靠性相关的,“穿着裤子”的贴上,又仔细的读了一遍,在这些的基础上,我做一个总结吧,希望能终结 内部 EEPROM 可靠性问题的讨论。当然该贴只是针对其可靠性问题,掉电存 EEPROM 的问题,以及存 EEPROM 速度的问题,不在该文的讨论范围之列。 针对 AVR EEPROM 的可靠性问题,以前使用 Mega88 做过专门的测试,测试数据结果直接发_论坛上了,没有做文档,这个测试结果好像找不到了,应该是回复在下面这两个帖子其中之一的后面,网站被黑,可能回复没有恢复全。这两个帖子也是我主要参考得两个帖子。讨论:eeprom的可靠性研究myppfish /bbs/bbs_content.jsp?bbs_sn=672954&bbs_page_no=1&search_mode=1&search_text=EEPROM&bbs_id=1000原创治标治本,彻底解决AVR单片机EEPROM数据丢失问题 my_avr /bbs/bbs_content.jsp?bbs_sn=1440595&bbs_page_no=1&search_mode=1&search_text=EEPROM&bbs_id=1000 测试的结论是 AVR 内部 EEPROM 是可靠的,如果有问题,也是所有 EEPROM 的通病。当然由于测试手段有限,该结论可能存在片面性,如果哪位愿意继续深入测试,并且否定了这个结论,还请不吝赐教,谢谢。AVR 内部 EEPROM 可靠归可靠,但是如果使用不当,确也很容易出错,所以搞得少数人以为 AVR 内部 EEPROM 不稳定。 首先,总结一下引起 AVR 内部 EEPROM 数据丢失的原因: 1. 程序问题; 2. 程序跑飞; 3. EEPROM相关寄存器因强磁场、高压静电等外部干扰出错所产生的写入动作; 4. 系统有很大的感性负载,在断电的时候会产生一个反向高压,EEPROM有可能会自擦除。 (还有什么原因,欢迎大家继续列举,以便完善及想办法解决) 针对问题1,程序问题不再该文讨论范围内。 针对问题2,程序跑飞,这个因该是引起 EEPROM 数据丢失的主要原因。但是引起程序跑飞的原因却是多方面的。 第一. 电压不正常,工作不稳定,程序跑飞。针对这个问题,可以开启内部BOD、或者外加复位芯片解决,在低功耗场合,外部复位是有必要的,毕竟BOD功耗太高。 第二,晶体振荡受干扰,频率不稳定,程序跑飞。针对这个问题,建议晶体使用全幅振荡,并且走线的时候尽量短,并且使用地线隔离。 第三系统受外界环境干扰,修改了PC等寄存器,程序跑飞。针对这个干扰问题,这个引起程序跑飞的可能性应该不大,如果环境实在恶劣,那么就应该想到做电磁屏蔽,ESD保护等,如果还不行,那么只能建议换换别的单片机试试看了。 针对问题3,我们只能优化电路设置,尽量避免,比如加屏蔽罩,加ESD保护,加TVS保护,电源加电容退耦等等。 针对问题4, 如果系统真的具有很大的感性负载,那么请注意加续流二极管、滤波电容等做保护,不要让这种反向高压产生,无论如何,这种因为感性负载突然断电自激产生的高压,不仅仅会对EEPROM有影响,而是对整个系统都存在威胁。 好了,说了这么多,设计也都按照上面的做了,EEPROM 就可以100没有问题了?不是的,经过上面硬件上的一些处理,虽然EEPROM数据丢失的可能已经很小了,但是我们仍然不能保证EEPROM数据就不会丢失了。这时 EEPROM 数据的可靠性,那就得从软件上去考虑了,接着我们从软件的方面继续讨论。 我的做法是,数据分块,分区,校验,备份。当然这里讲的处理方法,仅仅是提供一种想法,你可以做不同数据长度的分块,不同大小的分区,采用不同的地址映射方法,以及采用更多次的数据备份。下面以 Mega168 为例继续讨论。1. Mega168 EEPROM 512字节,把EEPROM分为两个区,每个区256个字节,然后以8个字节为一个段,那么每个区就有32段。 数据区:0x000 - 0x0FF 0段:0x000 - 0x007 1段:0x008 - 0x00F 31段:0x0F8 - 0x0FF 备份区:0x100-0x1FF 每个段8个字节,其中前6个字节为有效数据,后2个字节为CRC16校验,数据格式下图所示:(原文件名:数据分区.JPG) 2. EEPROM读写操作 EEPROM的操作以段为单位, 段写入函数:写数据到数据区时,先计算数据CRC16校验,然后同时把数据写入到数据区和备份区; 段读取函数:读取数据时,同时读取数据区以及备份区,如果数据区校验有误,备份区数据校验正确,就用备份区数据恢复数据区数据;如果备份区数据有误,数据区数据正确,那么数据写入备份区重新备份;如果数据区备份区数据都有误,那么返回读取失败。3. 数据区与备份区的对应关系 数据读写操作以段进行,内部的数据区与备份区怎么映射呢?为了防治数据与备份同时被意外修改,那么数据与备份地址空间相隔不能太近,并且数据与备份的地址,应该尽量不同。假设数据地址为 Data_Addr,备份地址为 Bakup_Addr,我使用下面的函数映射地址: Bakup_Addr = ( Data_Addr + 0x100 ) 0x03F 加0x100是把地址定义到备份区, 与0x03F异或,是把低6bits取反,这样处理,数据与备份的地址空间较远,并且地址有7bits的不同。 例如,第 3 段 的地址: 0x018 - 0x01F, 对应的备份区为:0x127 - 0x120 如下图所示: (原文件名:地址映射.JPG) 4. 读写函数加入写保护判断,在读写EEPROM前关闭写保护,读写完毕后,立即开启写保护,这样可以有效防止程序跑飞造成的EEPROM意外修改。 5. 第0块建议禁止使用。 以下是Mega168 的 EEPROM C语言库函数(汇编比较晦涩,就不上了),另外送上 CRC16 CRC32 校验的函数,以及 Mega168 UART0 通信函数库,以便于测试。编译环境 Studio + WinAVR 。点击此处下载 ourdev_438338.rar(文件大小:53K) (原文件名:EEPROM Test.rar) 程序仿真结果:1. 利用 MKII 仿真,EEPROM 数据被擦除后,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论