问题现象:
1、项目上有一个历史记录只能记录第一条信息,且该记录信息有误。有时会恢复255条历史记录信息(实际5条)。
2、设置信息在断电后,发生丢失或信息错误等现象。
确定思路:
上网查资料显示:数据一般存在STM32F103VET6的 flash中,所以就有以下排查思路:
1、代码调用的问题。
2、电源问题。如果在程序在向flash中写入数据时,电源有电压不稳定,生成尖峰脉冲,会导致数据丢失,或者数据错误。
3、flash中地址挤兑问题。如果设置信息保存的数据地址和历史记录的数据地址发生重合,那么会在双方调取自己数据时发生数据错误的问题。
4、环境干扰问题。
因为这个问题出现在家里,电磁干扰并不严重,所以这个选项可能性实在太低。
排查过程:
1、电源问题。
因为大佬都是周末才能过来开代码,所以先干自己能干的。给项目更换了更好的电源模块。增加了电源模块到主板的距离,避免电源模块对主板的电磁干扰。测试,问题现象依然存在。
2、代码调用的问题。
大佬来了,排查一个下午。查实一下问题:
⑴ 增加每次读命令后的等待时间,问题依然存在。
⑵ 将flash中的信息直接显示在LCD屏上,证实:flash可以写入一行代数据,移动起始地址,还是可以写入一行数据(但仅限一行)。flash并没有物理损坏。
⑶ flash中地址挤兑问题 通过代码中的实现可以看清楚是将设置信息和历史记录放在同一个扇区。但是两者数据地址并不冲突。为了确保一定不出问题,将两者分别放入两个扇区,结果依然问题依旧。
之后还做了很多代码上的试验,但是问题都没有得到解决。
放下所有,重新审视这个问题。静待花开。
重新观察电路板。发现AT24C512这个EEPROM好像乖乖的。查资料得知:ATMEL228 24C512 PU27 A这个芯片的最低电源电压时4.5V,而我们给的电源电压时3.3V。答案呼之欲出。
周一来了,换上新的24C512 ,上电测试,问题解决。
真的是山重水复疑无路,柳暗花明又一村。