问题描述
- 先向eeprom写入4字节数据,然后再读出,判断数据是否写入成功;
- 读出的数据虽然不是随机数,但是并不是写入的数据
问题分析(以at24cxx为例)
- 众所周知,eeprom写数据时是有写周期的,也即iic传递时间(虽然iic总线速率也足够快,但是如果跟高速mcu相比的话,还是有点不够看),写完数据后,iic总线进入空闲状态,mcu才能进行读动作,如果总线释放时间过短,导致eeprom没有正确识别到空闲状态,那么读出的数据肯定是有问题的;
- 在网上查阅资料发现,当写入数据超过一页(128字节)时,eeprom会在当前页循环写入,也即超过128字节的数据会覆盖掉当前页的起始字节,该情况也有可能导致数据读出异常(问题数据并没有超过128字节,所以排除该原因);
- 在进行读写操作时,没有关闭外部中断,存在外部中断打断读写过程的可能(开发环境为stm32+rtt,其中eeprom的读写操作都进行了加锁保护,所以排除该原因)。
方案验证
写操作完成后,添加少许延时,再进行读操作,数据读取正常。
at24cxx_write(eeprom_dev, DEV_SLEEP_ENTRY_TIME_ADDR, (uint8_t *)&now, 4); //记录进入休眠时间
rt_thread_mdelay(5);
at24cxx_read(eeprom_dev, DEV_SLEEP_ENTRY_TIME_ADDR, (uint8_t *)&tmp, 4);
问题结论
由以上分析可以得出结论,如果eeprom读写时序间隔太短,那么iic总线释放时间就会太短,此时eeprom可能无法正确识别读写时序,进而导致读写出现问题。所以,建议在进行eeprom的连续读写操作时,最好在中间加上5~10ms的延时,确保总线释放。