一、功能描述
数据存储有多种方式,常见的有RAM、FLASH以及接下来要进行学习的EEPROM。
保存在RAM中的数据在掉电后就会丢失,保存在FLASH中的数据不能随意改变,无法记录变化的数值,故使用EEPROM来保存数据。
EEPROM共256个字节的存储空间,地址从0x00~0xff,想把数据存储在哪个位置,此刻写的就是哪个地址,可重复擦写30w到100w次。
参考上方图表,结合设备原理图可以确定EEPROM的设备地址。
本次选用的EEPROM设备地址为0xA0.
二、读写操作时序
2.1 写数据
第一步:首先是IIC的起始信号,接着发送EEPROM的地址和读写位的组合,读写位选择“写”。
第二步:发送要写入数据的EEPROM内部存储地址add。
第三步:发送要存储的数据第一个字节、第二个字节… …。
注意:
1、写数据的过程中,每个字节结束后EEPROM都会回应一个“应答位0”,告诉我们写EEPROM成功,如果没有应答表示未成功。
2、写数据过程中,每成功写入一个字节,EEPROM地址自动加1,当加到最大值后,再增加会溢出。
void I2C_Write_AT24C02(uint8_t add,uint8_t data)
{
I2CStart();
I2CSendByte(0xA0);
I2CWaitAck();
I2CSendByte(add);
I2CWaitAck();
I2CSendByte(data);
I2CWaitAck();
I2CStop();
}
2.2 读数据
第一步:首先是IIC的起始信号,接着发送EEPROM的地址和读写位的组合,读写位选择“写”。
第二步:发送要读取的EEPROM内部存储地址add。
第三步:重新发送I2C的起始信号和器件地址,并且在方向位选择“读”操作。
(在前三步,每一个字节实际上都是在“写”,因此EEPROM都会回应一个“应答位0”。)
第四步:读取从器件发回的数据,每读一个字节,如果还想继续读下一个字节,就发送一个“应答位0”,如果不想继续读了,就发送一个“非应答位1”。
应答位: ACK 非应答位:NACK
//读取EEPROM中一个字节
uint8_t I2C_Read_AT24C02(uint8_t add)
{
I2CStart();
I2CSendByte(0xA0);
I2CWaitAck();
I2CSendByte(add);
I2CWaitAck();
I2CStart();
I2CSendByte(0xA1);
I2CWaitAck();
data = I2CReceiveByte();
I2CWaitAck();
I2CStop();
return data;
}
多字节和页写入后续用到时会继续补充!
欢迎大家批评指教!