匠人猜想过的几中可能原因:
1、上拉电阻是采用CPU内部上拉电阻,是否太大了? 2、快速频繁地断电/上电,是否会打乱读写的时序?并凑巧拼接出一个错误的读写命令? 3、中断的打搅?(可能性不大吧?)
菜农认为1: 最好再外加上拉电阻,5V时在4.7K左右,3.3V在3.3K左右.这样可加大驱动能力和加速边沿的翻转. 菜农认为2: 这个是最关键的原因所在. 首先应该提供电源的保护机制,即能及时知晓外部电源是否具备写入EEPROM数据的能量. 如果有掉电中断,那么在系统完全失去能量前会有一端时间的.这个时间与系统的电容存储的电能等有关.在此时间里只能写入一部分的EEPROM数据,若写入的数据很小,可能全部写入成功.所以在外部EEPROM的环境下,最好加大电容甚至要加法拉电容,以便增大写入数据块的长度. 在无掉电保护机制的环境下,可以采用迂回战术来弥补无保护机制的问题.主要应该做到以下考虑: 1.上电后不应该立即对EEPROM进行写操作! 2.在EEPROM中找个空闲位置,写入EEPROM正常标志,一般为0x55aa. 这个标志有很多的意义: 当读出不为0x55aa时,可认为是掉电或EEPROM为空白片或EEPROM为盗版片.我们可以采取任何的手段进行处理. 在其他外围也不正常时,我们可认为是真掉电而进入休眠.否则,我们认为是EEPROM空白即可对其初始化. 注意:必须对EEPROM初始化即写入全部的默认配置数据后,才能写入0x55aa标志!!!因为可能在没初始化后又再次掉电!!! 这样做后才能保证EEPROM初始化数据的完整及可靠(可信). 3.每次写入前最好先读出数据,若与写入数据相同就不要招惹EEPROM!!! 这样在提高寿命的同时,也变相地把EEPROM当RAM使用了. 最好在此再读0x55aa标志(可能老头很烦人),以变相地确定电源没掉电,至少能短期地保证后面数据写入的安全. 4.写入数据后应该再次读出,若写入失败就应该再次重试3次以上,否则通知老板该EEPROM坏了. 5.在写入前应该设置一个全局的写入成功标志为假.在写入和校验成功后,再设置其为真. 如果在写入期间掉电,那么在启动程序时就应该处理其标志,这样可以"断点续写". 菜农认为3: 此点并不是太重要,因为一般的I2C总线的SDA/SCL不会再被其他功能复用的,除非他是匠人~~~ 菜农主张必须在一处操作硬件,数据都应该放入缓冲区内处理,各模块无权操作I2C总线.必须由"专人负责"!!! 这在菜农的设计中一直是这样坚持的,因为婆婆多了肯定坏事.
就忽悠到这里吧,菜农要喂肚子了~~~但认为最重要的是: 0x55aa,法拉电容,上拉电阻,数据校验,容错处理....
|
|
文章评论(0条评论)
登录后参与讨论