在使用EEPROM进行读写操作时,发现不能正常读写,我原本是想从串口打印显示写入EEPROM的内容,但是串口助手上并不能打印出信息,只能打印出Write to AT24C02:
如图
由主函数执行顺序可知,串口并没有打印下一句Read from AT24C02:,那么我们可以推断函数运行到AT24C02_Write_Buf()之后没有往下执行,应该是卡在写操作了。
于是我就在AT24C02_Read_Buf()函数这里打了一个断点进行调试,结果串口助手可以正常打印出向EEPROM里面写入的数据。那么证明我们的函数是没有问题的,函数没有问题直接运行却不能打印出数据,只可能是因为直接运行的时候每个字节的连续读写速度太快了,EEPROM反应不过来,而我们在调试的时候一步一步点击,执行速度变得非常慢,读写就成功了。
找到了问题所在,我就开始思考,代码都是依照AT24C02芯片手册来写的,怎么就出问题了呢,当时写的时候还特意注意了一下有关连续写入之间的间隔,也没有看到哪里明确规定了两次写入必须要间隔多长时间才能进行下一次写入操作。
于是我就又去翻阅AT24C02的芯片手册,找到了当时我看到的关于写周期的相关要求,如下图
有关写周期的内容在芯片手册里面有两处明显提到了这个问题,第一次是最开始的介绍部分,给了一段这样的内容Self-timed Write Cycle (5 ms max),意思是自定时写周期(最大5毫秒),
,第二次明显提到写周期问题的是上面那样一个表格,表格里面对始终信号线拉低拉高之类的操作都规定了最小时间间隔,大多数是us级,唯独在最下面有一个ms级延时的规定,就是我们写周期的规定。
但是问题又来了,不管是第一次的芯片介绍部分还是这个表格里面的规定,都只是规定了一次写操作的最大时间应该不超过5ms,并没有提到最短应该间隔多长时间。这也就导致我之前在写代码的时候,并没有设置两次写入之间要延时多长时间,只是在结束位末尾象征性的给了300us的延时作为结束缓冲。
实际上手册本意应该是想让我们每次写入后给一定时间的延时的,但是可能考虑到其他的因素并没有给出最短延时,不过经过我的测试,EEPROM不管是AT24C02还是AT24C64,都可以按照手册上面给的最大延时来设置间隔。例如AT24C02手册说5ms,AT24C64手册上面说10ms,我们在每个写入一位的函数的末尾加上对应延时就可以了。