一、原理:
1、页写:一次性向AT24C02里的多个数据存储单元地址写入多个数据
(1)在AT24C02的页写模式下,每次写入数据后,存储单元地址会自动加1。
(2)一页有8个数据存储单元,蓝桥杯的AT24C02一共有256个数据存储单元,也就是说,蓝桥杯的AT24C02只有256 / 8 = 32个页。
(3)如果一页写入了8个以上的数据,那么存储单元地址就会从头开始,比如从0x00开始页写,一直写到了0x07,这时如果继续页写,就会从0x00开始覆盖原来的内容。
(4)在一次页写里面,无需任何的延时;但是在多次页写时,要有5ms的延时。以下是Deepseek的回复。
2、页读:一次性向AT24C02里的多个数据存储单元地址读取多个数据(与上述页写原理类似,不做重复)
注意:在写入设备地址后,还需要写入开始页读的存储单元地址,下述原理图未标出。
二、代码:(只给出页写页读代码,其他代码未给出,请自己写)
注:写入之后不能立即读取,要延时10ms左右
1、页写代码
/*
函数:AT24C02页写函数
参数:*Data:要写入的数据数组的首地址,Address:页写的首地址(最好是8的倍数,比如0x00,0x08,0x10等等),num:Data数组的长度
功能:一次性往AT24C02里的多个数据存储地址写入多个字节数据
返回值:无
*/
void AT24C02_Page_Write(unsigned char *Data,Address,num)
{
I2CStart();
I2CSendByte(0xA0);
I2CWaitAck();
I2CSendByte(Address);
I2CWaitAck();
while(num--)
{
I2CSendByte(*Data++);
I2CWaitAck();
}
I2CStop();
Delayms(5); // 进行多次页写时,要加一个5ms延时,单次页写则不用加
}
2、页读代码
/*
函数:AT24C02页读函数
参数:*Data:要写入的数据数组的首地址,Address:页写的首地址(最好是8的倍数,比如0x00,0x08,0x10等等),num:Data数组的长度
功能:一次性往AT24C02里的多个数据存储地址读取多个字节数据
返回值:无
*/
void AT24C02_Page_Read(unsigned char *Data,Address,num)
{
unsigned char Temp;
I2CStart();
I2CSendByte(0xA0);
I2CWaitAck();
I2CSendByte(Address);
I2CWaitAck();
I2CStart();
I2CSendByte(0xA1);
I2CWaitAck();
while(num--)
{
*Data++ = I2CReceiveByte();
if(num != 0) I2CSendAck(0); // 没读完
if(num == 0) I2CSendAck(1); // 读完了
}
I2CStop();
}