最近研究I2C,从书上和网上找了些。把认为好的内容摘录下来,方便以后回顾。
I2C总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。
发送器件地址指的是物理地址,由于I2C是总线,所以上面可以接很多器件,如AT24C02只是其中一个器件(有三个引脚,单独使用通常接地,所以这三位地址是000)。发送器件子地址是EEPROM内部地址,就是数据要放在哪个地址上。写数据到AT24C02的时候只发送一次器件地址是因为AT24C02内部的地址你写入后可以自动+1的功能,所以你不需要一直写地址。
关键在读,为什么要发送器件地址接着发送器件子地址接着再发送器件地址 是因为第一次发器件地址,找到你的AT24C02,然后给内部地址指针写数据,这是关键,就是为了给这个指针写数据,指明你要读出的数据在哪。由于你要读,而刚才发的是写指令。所以得重启下,然后发读指令+地址就可以读出数据了。
根据上面的 说明读写数据的代码如下
//I2C从AT24C02读数据
void I2cRead(uchar I2cAddress,uchar *I2cData,uchar Bytes){
I2cStart();//启动总线
I2cWriteByte(WriteDeviceAddress);//发送器件地址
WaitAck();
I2cWriteByte(I2cAddress);//发送器件子地址
WaitAck();
I2cStart();//启动总线 ***注意之前是写,结束后需要重新启动,然后才能读
I2cWriteByte(ReadDeviceAddress);//发送器件地址
WaitAck();
while(Bytes--){
*I2cData=I2cReadByte();//读取数据
I2cAck();
I2cData++;
}
I2cNoAck();
I2cStop();
}
//I2C写数据到AT24C02
void I2cWrite(uchar I2cAddress,uchar *I2cData,uchar Bytes){
I2cStart();//启动总线
I2cWriteByte(WriteDeviceAddress);//发送器件地址
WaitAck();
I2cWriteByte(I2cAddress);//发送器件子地址
WaitAck();
while(Bytes--){
I2cWriteByte(*I2cData);//发送数据
WaitAck();
I2cData++;
}
I2cStop();
DelayMs(10);
}
文章评论(0条评论)
登录后参与讨论