因项目用到的AT24C32存在两批不一样的芯片,一批是ATML还没被microchip收购时候买的芯片,一批是microchip收购了ATML之后买的芯片;他们的数据手册上关于写周期是这么描述的:ATML的写周期时间是最大10ms,microchip的写周期是最大5ms;
在实际的使用中,一般都是使用单字节写入的方式进行操作,即使需要连续写入也只是利用for循环调用单字节写入的形式,或,其他的方式调用单字节写入函数的方式进行;为了减少不必要的延时导致CPU被占用,项目采用的是软定时2ms调度的方式进行EEPROM的读写操作,这样在写周期的时候系统不会阻塞,可以执行其他的任务。重点注意一下这个2ms ,这个2ms就是实际的写周期时间,一直以来使用ATML的芯片都没有出现问题,(提醒一下数据手册上ATML的写周期时间最大是10ms);然而,当换成microchip生产的芯片之后,这个2ms就不够用了,在进行连续大量的写入操作的时候会写入失败!就是这么操蛋,改成5ms就可以了。
你以为这就结束了,必不可能这么简单呀。在项目中,对EEPROM进行大量读写的情况在首次上电和恢复默认值操作的时候,这个程序里是写成了先写入,写入完成之后全部读出进行一一校对,再根据校对结果判定是不是写入成功。这样其实就有个问题,在恢复默认值的时候,一直在while(判定结果),while里面有超时判定,校对失败和超时都会输ERROR。但是在以前使用2ms的写周期,现在变成了5ms,这就导致了时间直接加长了2.5倍。在项目中对时间的要求又很高,不允许时间变长2.5倍怎么办?
然后看了各种资料,最后在官方资料中找到一种解决方案,在写周期时间内进行轮询应答的方式来检测EEPROM是否可以操作了。
轮询应答的代码是这样的,
然后在需要进行读写操作的时候调用这个函数,看看EEPROM是不是准备好了;然后我在项目直接将EEPROM的任务调度时间间隔改成1ms,进入任务后先判断EEPROM是否准备好,准备好了就进行读写操作,否则就直接return;这样处理之后,时间就和原来的差不多了,虽然还是比原来的时间要多一点,但是在可接受的范围了。系统调度的时间间隔其实是为了解决这个写周期时间的,意思就是说读取EEPROM的数据时,其实可以在us级的时间间隔内进行连续读取,因此如果还想减少这个恢复默认值的任务所占用的时间,可以将任务调度的时间放到100us这个数量级,也就是更快的查询EEPROM的状态,进而间接的减少连续读写过程中的字节与字节之间的时间间隔,这样整体的时间占用会更少。(相当对提高了判断时间间隔,这样读取和写入的时间都会有影响)
问:为什么不用页写?
答:其实一开始我想的也是使用页写,但是项目写入的数据不是连续地址,这是其一,其二是如果采用页写,程序得大改,做市场级产品的人都应该明白,大改意味着什么?想想美国现在的核系统为什么仍在使用二战时期的计算机和系统?
最后:
如果你对EEPROM的操作有什么经验或者对我这个处理方式有另类的处理方式,请给我发消息~ 期待与你交流!