转载-----瑞生网
在电子开发过程中,会遇到很多莫名其妙的问题,很多人都会怪罪于硬件本身或者电路连接,但实际上,大多数情况下,都是自己对硬件的一知半解造成的,瑞生今天给大家说说在使用AT24CXX系列的EEPROM芯片时,大多数人都不知道的细节。希望对你做(高稳定)(高可靠)(高质量)产品有帮助。
1.给24cxx写入数据后,要等待至少5ms,才能再对它进行读写操作,你知道吗?
上图是24cxx的datasheet,红线圈起来的特性(Self-timed Write Cycle),就是说它的写入周期。
上图是写入一个字节的时序图以及解释,看最后两句,“当发送完Stop以后,EEPROM进入写入周期,时间需要twR。所有的输入引脚在写入周期都被禁能,EEPROM将不会有任何反应,直到写入周期完成”。这句话中提到了twr就是写入周期,我们在手册上查时序时间表,如下图:
从图中红色圈起来的额部分即可再次看到手册上前面描述的5ms Self-timed Write Cycle.好了,这是理论上。
实践一下吧。找到瑞生LPC1114开发板例程EEPROM的模拟I2C通信的例程,你看一下“写一个字节”的函数。如下图所示:
void AT24C02_WriteOneByte(uint8_t WriteAddr, uint8_t DataToWrite) { I2C_Start(); I2C_Send_Byte(0XA0); I2C_Wait_Ack(); I2C_Send_Byte(WriteAddr); //发送地址 I2C_Wait_Ack(); I2C_Send_Byte(DataToWrite); //发送字节 I2C_Wait_Ack(); I2C_Stop();//产生一个停止条件 delay_24c02();// AT24C02的写入周期是5ms,这里的延时一定要大于或者等于5ms }
最后一行,就是我加的延时大于5ms的延时函数。你把这个延时函数去掉,试着“写完就读”看看是否会读出写进入的数。(实际上,不管你写入什么,都会读出0xFF)
2. 24CXX系列芯片带“页写入”功能,每次最多可连续写入8个或者16个字节,你知道吗?
AT24C01、AT24C02一次可连续写入8个字节;AT24C04、AT24C08、AT24C16一次可连续写入16个字节。
这里说的连续写入,是写入一个字节后,没有发送Stop命令,继续写下一个字节的情况。如下图:
3. 24CXX系类芯片有连续读出功能,你用过吗?
这里说的连续读出,是指读完一个数据以后没有发送Stop信号,读完一个再读一个,最后发送一个Stop信号。
4. 你知道下面时序图中的3个ACK一样吗?
上图就是第3条说的连续读出的时序。图中有3种ACK,底下的ACK是EEPROM给单片机发出的应答信号,上面的ACK是单片机给EEPROM发出的ACK信号,NO ACK是单片机给EEPROM发出的“不应答”信号。
应答:EEPROM给单片机发应答,EEPROM会把SDA引脚拉低,单片机负责检测SDA电平;单片机给EERPOM应答,单片机把SDA拉低,EEPROM会检测到SDA拉低,然后再输出一个字节。
不应答:千万不要理解成“不要给它应答”,而是发送一个“SDA为高电平”的信号。
很多人在做这个连续读出函数的时候,不知道读出一个数据以后,要给EEPROM发送应答信号,而是还在检测EEROPM给他发送的应答信号,造成从第二个字节开始,就无法读出正确的字节。