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