如果您正在使用 OLED 显示器,气压传感器或陀螺仪 / 加速度计模块的项目,您可能会发现正在使用 I2C 总线。
 
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 更复杂的硬件