I2C通信读写数据过程

版权声明:本文为博主原创文章,如需转载,请注明出处 https://blog.csdn.net/qq_36554582/article/details/87989756

1、先来看读数据的操作流程
在这里插入图片描述
这里面需要注意的有:

  • I2C通信启动后面不需要等待应答信号
  • 写入数据地址之后,下一步不能直接进行读取数据,需要先再一次地开启动I2C通信才可以
    程序如下:
u8 x24c02_Read(u8 address)
{
	u8 dat;
	I2CStart();//注意开启I2C之后,不需要进行应答信号的等待,如果加上了应答信号的等待,可能会导致数据无法进行正常读取
	I2CSendByte(0xa0);
	I2CWaitAck();
	
	I2CSendByte(address);
	I2CWaitAck();
	
	I2CStart();//注意此处必须再重新开启I2C

	I2CSendByte(0xa1);
	I2CWaitAck();
	dat = I2CReceiveByte();
	I2CWaitAck();
	
	I2CStop();
	I2CWaitAck();

	return dat;
}

2、再来看数据写入的过程
在这里插入图片描述
这里面需要注意的有:

  • I2C通信启动后面不需要等待应答信号
  • 写入数据地址之后,经过一个应答信号的等待,下一步就可以直接进行写入数据

程序如下:

void x24c02_Write(u8 address,u8 dat)
{
	I2CStart();//注意开启I2C之后,不需要进行应答信号的等待,如果加上了应答信号的等待,可能会导致数据无法进行正常读取
	I2CSendByte(0xa0);
	I2CWaitAck();
	
	I2CSendByte(address);
	I2CWaitAck();
	I2CSendByte(dat);//写入数据地址之后,这里可以直接进行数据的读取
	I2CWaitAck();
	I2CStop();
}

谨记:

  • I2C通信的启动后面不需要进行应答信号的等待
  • 在每一次的读操作或者写操作函数的后面,都需要加上几毫秒的延时,否则会导致数据读取错误
    如:
	temp = x24c02_Read(0x00);
	Delay_Ms(10);
	x24c02_Write(0x00,++temp);
	Delay_Ms(10);
  • 0xa0是设备地址+写命令
  • 0xa1是设备地址+读命令

3、写入32位整型数据:

void x24c02_Write_int(u8 address,int dat)
{
	x24c02_Write(address,(u8)(dat & 0xff));
	Delay_Ms(2);
	x24c02_Write(address+1,(u8)(dat >> 8 & 0xff));
	Delay_Ms(2);
	x24c02_Write(address+2,(u8)(dat >> 16 & 0xff));
	Delay_Ms(2);
	x24c02_Write(address+3,(u8)(dat >> 24 & 0xff));
	Delay_Ms(2);
}

4、读取32位整型数据:

int x24c02_Read_int(u8 address)
{
	int dat;
	dat = (int)x24c02_Read(address);
	Delay_Ms(2);
	dat += (int)x24c02_Read(address+1) << 8;
	Delay_Ms(2);
	dat += (int)x24c02_Read(address+2) << 16;
	Delay_Ms(2);
	dat += (int)x24c02_Read(address+3) << 24;
	Delay_Ms(2);
	return dat;
}

猜你喜欢

转载自blog.csdn.net/qq_36554582/article/details/87989756