相信你经过检查读写程序都没有问题的话。
那么从你所说的现象判断,是程序跑飞所致。
当单片机复位不良、或者抗干扰性能不好时,程序很容易跑飞(程序跳转到未知位置开始执行),尤其RISC的单片机这种现象特别明显,因为其指令长度固定,基本上程序存储器中任何一个单元就是一条指令,所以当程序计数器乱跳时,跳到任何一个位置都会找到一条可以执行的指令并开始从这里执行。
如果跑飞时刚好跳到写EEPROM指令程序前面一段,就会出现在未给待写入数据正确赋值的情况下写入EEPROM的情况,导致EEPROM被误写。
因为刚好跳到写EEPROM指令前面一段是小概率事件,所以一般被改写的只有开始几个字节。
解决办法:
1、完善上电复位电路,确保单片机在电源电压稳定的情况下才开始运行。在上电期间,如果电压不稳定,是导致单片机程序跑飞的最主要原因。
2、增强电路抗干扰性能。
3、在写EEPROM指令前加一条条件跳转指令,当某软件标志位1未设置时就跳转,并且在写EEPROM指令后立即清除软件标志位1。
当需要写EEPROM时,在正确赋值写入数据之后紧接着设置软件标志位1,然后立即调用写EEPROM子程序。
按以上优化的程序,将使误写现象降到最低概率,因为只有恰好跳转到设置软件标志位1指令时才会发生误写现象。
如果以上优化还让你不放心,你可以做成2级甚至更多级的防误写,在设置软件标志位1之前加一条条件跳转指令,只有当软件标志位2设置时才不跳转……
可以查一下数据是怎么丢的,错成了什么数,分几种情况:
1、数据变成FF,软件可能有误擦除操作
2、数据错一两位,其他位正常,可能存在芯片质量问题
3、变成了完全不相关的另外一个数,应该是软件误操作,擦除和写全干了
另外,你也该说一下型号啊,EEPROM有好多种呢,并行、两线串行、三线串行、还有MCU内置的等
软件处理不良的可能性较大
1:外界干扰,你工作的环境是不是处于公路旁边?有汽车马达干扰!或者附近有高频辐射源?比如电台电信基站?
做好电源滤波,而且要等电源开机稳定后几秒在去读写EEPROM
2:电源异常使EEPROM的数据彻底丢失;看看你的电源是否稳定?
3:复位电路是否正常?
4:scl,sda有没有上拉电阻?
BOD开启,BODLEVEL=4V,或者写EEPROM是被打断.
烧录器接触不好??.或者芯片坏了?或者烧录器坏了?再要么是你写的软件有问题?再么是你的电脑上的软件的问题?
单片机上电时,初始化结束后,延时一段时间再对EEPROM进行操作.