单片机
返回首页

AVR内部EEPROM数据丢失问题的原因与解决方案

2012-08-16 来源:51hei

总结一下引起 AVR 内部 EEPROM 数据丢失的原因:

    1. 程序问题;
    2. 程序跑飞;
    3. EEPROM相关寄存器因强磁场、高压静电等外部干扰出错所产生的写入动作;
    4. 系统有很大的感性负载,在断电的时候会产生一个反向高压,EEPROM有可能会自擦除。
      ……(还有什么原因,欢迎大家继续列举,以便完善及想办法解决)

    针对问题1,程序问题不再该文讨论范围内。

    针对问题2,程序跑飞,这个因该是引起 EEPROM 数据丢失的主要原因。但是引起程序跑飞的原因却是多方面的。
    
    第一. 电压不正常,工作不稳定,程序跑飞。针对这个问题,可以开启内部BOD、或者外加复位芯片解决,在低功耗场合,外部复位是有必

要的,毕竟BOD功耗太高。

    第二,晶体振荡受干扰,频率不稳定,程序跑飞。针对这个问题,建议晶体使用全幅振荡,并且走线的时候尽量短,并且使用地线隔离。

    第三系统受外界环境干扰,修改了PC等寄存器,程序跑飞。针对这个干扰问题,这个引起程序跑飞的可能性应该不大,如果环境实在恶劣

,那么就应该想到做电磁屏蔽,ESD保护等,如果还不行,那么只能建议换换别的单片机试试看了。

    针对问题3,我们只能优化电路设置,尽量避免,比如加屏蔽罩,加ESD保护,加TVS保护,电源加电容退耦等等。

    针对问题4, 如果系统真的具有很大的感性负载,那么请注意加续流二极管、滤波电容等做保护,不要让这种反向高压产生,无论如何,这

种因为感性负载突然断电自激产生的高压,不仅仅会对EEPROM有影响,而是对整个系统都存在威胁。

经过上面硬件上的一些处理,虽然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校验,数据格式下图所示:

 点击浏览下一页
 

 2. EEPROM读写操作
    EEPROM的操作以段为单位,
    段写入函数:写数据到数据区时,先计算数据CRC16校验,然后同时把数据写入到数据区和备份区;
    段读取函数:读取数据时,同时读取数据区以及备份区,如果数据区校验有误,备份区数据校验正确,就用备份区数据恢复数据区数据;  

  如果备份区数据有误,数据区数据正确,那么数据写入备份区重新备份;如果数据区备份区数据都有误,那么返回读取失败。

3. 数据区与备份区的对应关系
    数据读写操作以段进行,内部的数据区与备份区怎么映射呢?为了防治数据与备份同时被意外修改,那么数据与备份地址空间相隔不能太

近,并且数据与备份的地址,应该尽量不同。假设数据地址为 Data_Addr,备份地址为 Bakup_Addr,我使用下面的函数映射地址:
                 Bakup_Addr = ( Data_Addr + 0x100 ) ^ 0x03F 
    加0x100是把地址定义到备份区, 与0x03F异或,是把低6bits取反,这样处理,数据与备份的地址空间较远,并且地址有7bits的不同。
    例如,第 3 段 的地址: 0x018 - 0x01F, 
          对应的备份区为:0x127 - 0x120 
          如下图所示:  
 点击浏览下一页
 

 

4. 读写函数加入写保护判断,在读写EEPROM前关闭写保护,读写完毕后,立即开启写保护,这样可以有效防止程序跑飞造成的EEPROM意外修改



5. 第0块建议禁止使用。

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 简洁的过零调功器电路设计与分析

  • IGBT模块通过控制门极阻断过电流

  • CCFL的工作原理及电子驱动电路解析

  • 比较常见的功率整流器和滤波电路

  • 基于M66T旋律发​​生器的电路图解析

  • 基于TDA1554的立体声放大器电路

    相关电子头条文章