蓝桥杯之AT24C02的页写页读

发布于:2025-03-24 ⋅ 阅读:(32) ⋅ 点赞:(0)

一、原理:

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();
}