串行EEPROM 应该是一种很可靠的设备,但在我的使用中,经常会出现数据出错的情况,毛主席老人家说:知己知比,方能百战不败!是什么原因呢?其实这种情况多发生在插拔电的情况下。让我们来瞧瞧:
1. EEPROM 读写的时序可能有小小的不对
2. 是在掉电时,在电压降低到一定程度后到完全没电之间的一段时间内,在MCU与EEPROM 的读写信号线上出现非控制的快速随机电平,这些电平可能会组合出一些被EEPROM 认为合法的写命令,结果将EEPROM 中的值修改掉了;
3. 在上电的复位期间,I/O 脚上电平未定,也可能随机组合出一些写命令;
4. 在读EEPROM 操作过程中,出现了复位(如充电复位)等,形成类似于(二)的情况;
5. 在电压降低后,可能会出现MCU 跑飞了,结果运行到了写EEPROM 的底层驱动程序中,强来将数据写入了进去!嘿嘿!让我们尝尝强扭的瓜不甜!
对待敌人可不能手软,怎样扼杀他们在萌芽状态!看我的绝招:
1. 摆阔气:按Datasheet 上的时序,发现多数时候读写正确,但有时偶尔不对,这时可以降低读写的速度,多几个NOP,不要太小气吗?咱们度量(ROM)还是能容的下的!
2. 避风头:为防止读EEPROM 的过程中出现复位,我们可以在MCU 复位后200ms 内禁止读写EEPROM,因充电引起的复位抖动,一般在数十毫秒内,过了这段时间,再出现复位的可能性不大,
3. 查证件:在写EEPROM 的底层驱动程序中,在执行写动作时,判断一下某些标志,有良名证的才能通过,否则,只好打回原籍(跳到复位地址)
4. 多买保险(3份最佳)以自救:对于重要的数据(如通信密码、参数设置等,这些部分信息量不大,我们要采用三次备份的手段。这些信息存放在三个不同的PAGE 内,最好PAGE 内的地址也不一样。在我们写这些数据时,要针对不同的地址写三次,而读时,对于三处读来的数据,如果全相同,没什么可说的了,如果有两个相同,一个不同,则使用大数判决,使用相同的那个值,并将这个数值写到不同的那个地址去。当然,如果三个值全不同,只好随便取一个(如第一个),再将其写入另两个地址中去。这种方法非常有效,因为一般误擦除不会是全部数据,而只是某一处而已,我们可以允许EEPROM 某单元被误擦除,只要读了一次,就恢复了。
关键字:EEPROM 保护方法
引用地址:
EEPROM的几种保护方法
推荐阅读最新更新时间:2024-03-16 13:23
新唐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次读
[单片机]
pic 18f45k80单片机eeprom模块代码
/// eeprom读写程序,eeprom数据地址范围为(00-ff) void Eeprom_Write(u8 u8Addr,u8 Buf) { EECON1bits.EEPGD = 0; // 选择eeprom访问 EECON1bits.CFGS = 0; // 选存取 EECON1bits.WREN = 1; // 允许写入数据 EEADR = u8Addr; // 地址 EEDATA = Buf; // 数据 EECON2 = 0X55; EECON2 = 0XAA; EECON1bits.WR = 1; while(EEC
[单片机]
AVR(ATMEGA128/16)内部EEPROM读写
下面这程序是128的 /****************************内部EEPROM头文件***************************/ #ifndef __eeprom_H__ #define __eeprom_H__ void EEPROM_write(unsigned int Address, unsigned char Da ta);//写入一个字节 void EEPROM_write_num(unsigned int Address, unsigned char Da ta ,uchar num);//写多个字节 unsigned char EEPROM_read(unsigned int Add
[单片机]
24C02(EEPROM)以字节读写程序(ASM)
24C02以字节读写时序 选择性读时序 .................24c02字节读写程序(已调试过 )....................... ;//////////////////////////////////////////////////// ;AT89C52与AT24C02的IIC通信 ;控制数码管显示0-P ;AT24C02采用字节写和选择性读 ;//////////////////////////////////////////////////// DAUN EQU 18 ;写入字节数,对24C02(256BK)最大为255 ADDR EQU 41H ;24C02操作数据地址 WRD
[单片机]
1.10.1_I2C_I2C协议与EEPROM_P
在2440开发板上,有两个接口SCL和SDA,其中SCL是时钟线,SDA是数据线,他们分别连接一个上拉电阻(控制SDA的电平和SCK电平),这两条线上挂载了许多设备,这些设备也有两条线,分别连接ARM的SCL和SDA。 那么我们怎么传输数据? 比如说和一个存储芯片连接,我们需要把数据发给它,也要从芯片里读取数据。 假设有一个老师和ABCD四个学生,假设老师要发球,那么他会这样做。 老师会告诉学生说,注意我要发球了(start) 然后老师会申明这个球要发给哪个学生,比如发给A,老师会说,A,我要把球给你了(地址方向,地址A,方向是从老师到A) 然后老师把球扔出来(传输) 最后A收到球了,他要告诉老师,老师我收到球了
[单片机]
延长EEPROM使用寿命的方法
EEPROM(Electrically Erasable Programmable Read一Only Memory)即电子擦除式只读存储器,它是一种非挥发性存储器,与擦除式只读存储器(EPROM)类似,电源消失后,储存的数据依然存在,要消除储存在其中的内容,不是用紫外线照射方式,而是以电子信号直接消除即可。
正是由于EEPROM具有以上特点,该器件可广泛应用于对数据存储安全性及可靠性要求高的应用场合,如门禁考勤系统,测量和医疗仪表,非接触式智能卡,税控收款机,预付费电度表或复费率电度表、水表、煤气表以及家电遥控器等应用场合。该类型存储器在可靠数据存储领域会获得越来越广泛的应用。
但是,EEPROM有固定的使用寿命,这是指某
[应用]
(51基础篇) - 021 STC89C51系列单片机 内部EEPROM 驱动
最近又看了一下关于stc单片机的知识,感觉在使用中EEPROM是个经常用到的东西,特地学习了一下,给大家分享一下心得,如有不足,多多包涵,废话不多说,一图解千言,先上图: /*--------------------------------------------------------------分界线-----------------------------------------------------------------------------------*/ main_eepprom.c 1 #include STC89C5xRC.H 2 3 #ifdef EEPROM 4 #include ee
[单片机]
stm32 i2c eeprom 24C02
电路图 举例 #define i2c_scl PBout(10) #define i2c_sda PBout(11) #define i2c_ack PBin(11) void I2C_init() { GPIO_InitTypeDef gpio10 = { GPIO_Pin_10, GPIO_Speed_50MHz, GPIO_Mode_Out_PP }; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //时钟使能 GPIO_Init(GPIOB, &gpio10); } void I2
[单片机]