AT24C02是一款由Atmel公司(现Microchip Technology)生产的基于I2C接口的2Kb(256字节)电可擦除可编程只读存储器(EEPROM)。以下是AT24C02的主要特性:
存储容量:2Kb,即256字节,组织为32页,每页8字节 (M24C02 每页16字节)。
接口标准:采用两线制I2C串行接口,包括SDA(Serial Data Line)和SCL(Serial Clock Line)。
工作电压:通常为2.5V至5.5V。
寻址方式:7位I2C地址,可以通过硬件连线调整其中的部分位来支持多片AT24C02在同一总线上工作。
写入操作:写入一个字节后,需要最小5ms的写周期才能保证数据被正确写入。写操作支持页写,一页为8字节,但不支持跨页写入。
在使用AT24C02时,需要注意每次写入一页(8字节)数据后,确保有足够的写周期延时,然后再进行下一页的写入操作。读取数据时,则可以根据地址连续或随机读取任意位置的字节。
/*-------------------------------------------------*/
/*函数名:24C02写入一字节数据 */
/*参 数:addr:地址 wdata:需要写入的数据 */
/*返回值:0:正确 其他:错误 */
/*-------------------------------------------------*/
uint8_t M24C02_WriteByte(uint8_t addr, uint8_t wdata)
{
i2c_Start(); //发送起始信号
i2c_SendByte(M24C02_WADDR); //发送24C02写操作器件地址
if(i2c_WaitAck()!=0) return 1; //等待应答,错误的话,返回1
i2c_SendByte(addr); //发送内部存储空间地址
if(i2c_WaitAck()!=0) return 2; //等待应答,错误的话,返回2
i2c_SendByte(wdata); //发送数据
if(i2c_WaitAck()!=0) return 3; //等待应答,错误的话,返回3
i2c_Stop(); //发送停止信号
return 0; //正确,返回0
}
/*-------------------------------------------------*/
/*函数名:24C02写入一页(16字节)数据 */
/*参 数:addr:地址 wdata:需要写入的数据指针 */
/*返回值:0:正确 其他:错误 */
/*-------------------------------------------------*/
uint8_t M24C02_WritePage(uint8_t addr, uint8_t *wdata){
uint8_t i; //用于for循环
i2c_Start(); //发送起始信号
i2c_SendByte(M24C02_WADDR); //发送24C02写操作器件地址
if(i2c_WaitAck()!=0) return 1; //等待应答,错误的话,返回1
i2c_SendByte(addr); //发送内部存储空间地址
if(i2c_WaitAck()!=0) return 2; //等待应答,错误的话,返回2
for(i=0;i<EE_PAGE_SIZE;i++){ //循环16次写入一页
i2c_SendByte(wdata[i]); //发送数据
if(i2c_WaitAck()!=0) return 3+i; //等待应答,错误的话,返回3+i
}
i2c_Stop(); //发送停止信号
return 0; //正确,返回0
}
/*---------------------------------------------------------*/
/*函数名:24C02读取数据 */
/*参 数:addr:地址 rdata:接收缓冲区 datalen:读取长度 */
/*返回值:0:正确 其他:错误 */
/*---------------------------------------------------------*/
uint8_t M24C02_ReadData(uint8_t addr, uint8_t *rdata, uint16_t datalen){
uint8_t i; //用于for循环
i2c_Start(); //发送起始信号
i2c_SendByte(M24C02_WADDR); //发送24C02写操作器件地址
if(i2c_WaitAck()!=0) return 1; //等待应答,错误的话,返回1
i2c_SendByte(addr); //发送内部存储空间地址
if(i2c_WaitAck()!=0) return 2; //等待应答,错误的话,返回2
i2c_Start(); //再次发送起始信号
i2c_SendByte(M24C02_RADDR); //发送24C02读操作器件地址
if(i2c_WaitAck()!=0) return 3; //等待应答,错误的话,返回3
for(i=0;i<datalen-1;i++){ //循环datalen-1次,一个字节一个字节接收数据
rdata[i] = IIC_Read_Byte(1); //接收数据,发送应答给从机
}
rdata[datalen-1] = IIC_Read_Byte(0); //接收最后一个字节,不发送应答信号
i2c_Stop(); //发送停止信号
return 0; //正确,返回0
}
/*-------------------------------------------------*/
/*函数名:把OTA_Info结构体缓冲区数据保存到24C02 */
/*参 数:无 */
/*返回值:无 */
/*-------------------------------------------------*/
void M24C02_WriteOTAInfo(void)
{
uint8_t i; //用于for循环
uint8_t *wptr; //uint8_t类型指针
wptr = (uint8_t *)&OTA_Info; //wptr指向OTA_Info结构体首地址
for(i=0;i<OTA_INFOCB_SIZE/EE_PAGE_SIZE;i++){ //每次写入一页16个字节
M24C02_WritePage(i*EE_PAGE_SIZE,wptr+i*EE_PAGE_SIZE); //写入一页数据
delay_ms(5); //延时-------必须加延时保证成功写入
}
}