I2C总线浅析

I2C总线把我搞得头都大了,经过一晚上的调试终于理解了I2C总线的工作原理。我发现对我来说看时序图,各种分析根本没用,用软件模拟一遍I2C才真的有效。

I2C总线的基本特点

  • I2C总线有一条时钟线和一条数据线
  • I2C任意一条线被置为0(低电平)后,无法再被置为1(高电平),将这条线置为0的设备控制了这条线,这点学过电路原理应该不难理解
  • I2C有主从设备之分,主设备控制了通信的全过程

主机发送数据

首先,主机发送一个SCL为1时将SDA有1变为0,表示开始信号,通知即将开始通信。主机将SCL(时钟线)置为0,通知从设备不要读取SDA(数据线)上的信息。主机更改SDA上的状态,然后将SCL置为1,通知从设备接受SDA上的信息。如此反复,知道发送完一个字节的信息。然后,主机释放SDA线(将SDA置为1),将SCL置为1,通知从设备发送应答。如果SDA被从设备置为0,则表示从设备应答;反之,则为不应答。主设备将SCL置为0,通知从设备应答时间已过。应答与否的含义应该取决于主设备与从设备之间的约定。如果主设备想终止本次通信,则在SCL为1时将SDA由0变为1,表示停止信号。主机发送第一个字节应是从设备地址,用于指定通信的从设备。

主机接受数据

首先,主机发送一个开始信号,然后发送一个地址,然后等待从设备应答。然后将SCL置为0,释放SDA,通知从设备发送信息。主设备将SCL置为1,表示要求数据维持稳定;读取数据后,将SCL置为0,通知从设备发送下一位信息。每读取一个字节,主设备应在SCL为1时置SDA为0或1,表示应答。如此循环,知道主机发送一个停止信号停止通讯。

从机与主机通信

有上面不难得出从机如何与主机通信。

例:与EEPROM AT24C02通信

读取时,首先,主机发送开始信号,一字节地址,等待应答,一地址片内地址,等待应答。然后再次发送一个开始信号,表示准备读取,然后读取一字节,发送非应答,结束信号。

写入时,首先,主机发送开始信号,一字节地址,等待应答,一地址片内地址,等待应答,一字节数据,等待应答,最后发送一字节结束信号。

以上均只字节写入/读取方式,没有使用页写入/读取方式。

另外,本人还写了一个例程,https://github.com/coderbaka/guotianxiang-c51/tree/master/i2c

以上如有错误,望不吝赐教。

猜你喜欢

转载自www.cnblogs.com/coderbaka/p/12380280.html