I2C总线简介
I2C结合了SPI和UART的优点。利用I2C,您可以将多个从设备连接到单个主设备上(如SPI),并且可以让多个主器件掌握单个或多个从器件。当您希望有多个微掌握器记录数据到单个存储卡或将文本显示到单个LCD时,这非常有用。

与UART通信一样,I2C仅利用两条线在设备之间传输数据:

SDA(串行数据) - 主站和从站发送和吸收数据的线路。
SCL(串行时钟) - 承载时钟旗子暗记的线路。
I2C是一种串行通信协议,因此数据沿着单线(SDA线)逐位传输。
与SPI一样,I2C是同步的,因此位输出通过主机和从机之间共享的时钟旗子暗记与位采样同步。时钟旗子暗记始终由主机掌握。
I2C如何事情
利用I2C时,数据被转换成messages,messages则被分解为数据帧。每条messages都有一个地址帧,个中包含从站的二进制地址,以及一个或多个包含正在传输的数据的数据帧。该还包括每个数据帧之间的启动和停滞条件,读/写位和ACK / NACK位:
启动条件:在SCL线路从高电平切换到低电平之前,SDA线路从高电平切换到低电平。
停滞条件:SCL线路从低电平切换到高电平后,SDA线路从低电平切换到高电平。
地址帧:每个从站唯一的7或10位序列,用于在主站想与之通信时识别从站。
读/写位:单个位,指定主器件是向从器件发送数据(低电压电平)还是从器件要求数据(高电压电平)。
ACK / NACK位:中的每个帧后跟一个应答/不应答位。如果成功吸收到地址帧或数据帧,则从吸收设备向发送方返回ACK位。
地址
I2C没有像SPI这样的从选择线,因此它须要另一种方法让从器件知道数据正在发送给它,而不是另一个从器件。它通过地址来做到这一点。地址帧始终是新中起始位之后的第一帧。
主设备将与其通信的从设备的地址发送给与其连接的每个从设备。然后,每个从设备将从主设备发送的地址与其自己的地址进行比较。如果地址匹配,则将低电压ACK位发送回主机。如果地址不匹配,则从器件不实行任何操作,SDA线保持高电平。
读/写位
地址帧在末端包括一个位,用于关照从设备,主设备是想要向其写入数据还是从主设备吸收数据。如果主设备想要向从设备发送数据,则读/写位是低电平。如果主设备向从设备要求数据,则该位是高电平。
数据框架
在主设备检测到来自从设备的ACK位之后,准备好发送第一个数据帧。
数据帧始终为8位长,并以最高有效位先发送。紧接着每个数据帧的ACK / NACK位以验证帧已被成功吸收。在发送下一个数据帧之前,主机或从机必须吸收ACK位(取决于发送数据的人)。
在发送了所有数据帧之后,主设备可以向从设备发送停滞条件以停滞传输。停滞条件是SCL线上从低电平到高电平转换后,SDA线上从低电平变为高电平,SCL线保持高电平。
I2C数据传输步骤
1.主机向每一个连接的从设备发送数据,然后将SDA旗子暗记从高切换到低,之后在将SCL从高切换到低电平。
2.主设备向每个从设备发送它想要与之通信的从设备的7或10位地址,以及读/写位:
3.每个从设备将主设备发送的地址与其自己的地址进行比较。如果地址匹配,则从器件通过将SDA线拉低一位来返回ACK位。如果主设备的地址与从设备的地址不匹配,则从设备将SDA线保持为高电平。
4.主设备发送或吸收数据帧:
5.在传输了每个数据帧之后,吸收设备将另一个ACK位返回给发送方以确认成功吸收到该帧:
6.要停滞数据传输,主机通过在将SDA切换为高电平之前切换SCL为高电平来向从机发送停滞条件:
有多个从设备的单一主设备
由于I2C利用寻址,因此可以从单个主设备掌握多个从设备。利用7位地址,可以利用128(27)个唯一地址。利用10位地址并不常见,但供应1,024(210)个唯一地址。要将多个从器件连接到单个主器件,请像这样连接它们,利用4.7K欧姆上拉电阻将SDA和SCL线连接到Vcc:
有多个从设备及多个主设备
多个主设备可以连接到单个从设备或多个从设备。当两个主设备考试测验通过SDA线同时发送或吸收数据时,同一系统中涌现多个主设备的问题。为理解决这个问题,每个主设备须要在发送之前检测SDA线路是低还是高。如果SDA线为低电平,则表示另一个主掌握器已掌握总线,主掌握器应等待发送。如果SDA线路很高,那么传输信息是安全的。要将多个主设备连接到多个从设备,请利用下图,利用4.7K欧姆上拉电阻将SDA和SCL线路连接到Vcc:
I2C的优点和缺陷
与其他协议比较,I2C听起来很繁芜,不随意马虎在程序中实现而导致数据丢失、无应答、“去世等”等问题。但却有很多优点:
优点
只利用两根电线
支持多个主理事器和多个从做事器
ACK / NACK位确认每个帧都已成功传输
硬件没有UART那么繁芜
众所周知且广泛利用的协议
缺陷
数据传输速率比SPI慢
数据帧的大小限定为8位
实现比SPI更繁芜的硬件








