I2C 为什么只要两根线就能搞定通信?

描述

 

到目前为止,我们已经讨论了 SPI 通信和 UART 通信的基础知识,现在让我们讨论本系列的最后一个协议,即集成电路间协议(I2C)。

如果您曾经构建过使用 OLED 显示器 、 气压传感器或陀螺仪/加速度计模块的项目,您可能会发现自己正在使用 I2C。


 

I2C 通信简介 

I2C 结合了 SPI 和 UART 的最佳特性。使用 I2C,您可以将多个从机连接到单个主机(类似 SPI),并且可以让多个主机控制一个或多个从机。当您希望使用多个微控制器将数据记录到单个存储卡或将文本显示到单个 LCD 时,这非常有用。


 

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

通信

SDA(串行数据) ——主机和从机发送和接收数据的线路。

SCL(串行时钟) ——传输时钟信号的线路。

I2C 是一种串行通信协议,因此数据沿着单根线(SDA 线)逐位传输。

与 SPI 类似,I2C 也是同步的,因此位的输出与位的采样通过主机和从机共享的时钟信号同步。该时钟信号始终由主机控制。

通信
 

I2C 的工作原理 

使用 I2C 时,数据以消息形式传输。 消息被分解成数据帧 。每条消息包含一个地址帧(包含从设备的二进制地址)以及一个或多个数据帧(包含正在传输的数据)。消息还包含起始和停止条件、读/写位以及每个数据帧之间的 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(2 ^7 )个唯一地址。使用 10 位地址并不常见,但可以提供 1,024(2 ^10 )个唯一地址。要将多个从设备连接到一个主设备,请按如下方式连接它们,并使用 4.7K 欧姆上拉电阻将 SDA 和 SCL 线连接到 Vcc:

通信

多主多从

多个主设备可以连接到一个或多个从设备。同一系统中多个主设备的问题在于,当两个主设备尝试同时通过 SDA 线发送或接收数据时。为了解决这个问题,每个主设备在发送消息之前都需要检测 SDA 线是低电平还是高电平。如果 SDA 线为低电平,则表示另一个主设备已控制总线,该主设备应等待发送消息。如果 SDA 线为高电平,则表示可以安全发送消息。要将多个主设备连接到多个从设备,请使用下图,并使用 4.7K 欧姆上拉电阻将 SDA 和 SCL 线连接到 Vcc:

通信

I2C 的优点和缺点 

与其他协议相比,I2C 有很多方面可能听起来比较复杂,但有一些很好的理由可以解释为什么您可能想或不想使用 I2C 来连接特定设备:

优点

仅使用两根电线 

支持多主多从 

ACK/NACK 位确认每个帧已成功传输 

硬件比 UART 简单 

著名且广泛使用的协议 


 

缺点 

数据传输速率比 SPI 慢

数据帧的大小限制为8位 

实现所需的硬件比 SPI 更复杂

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分