到目前为止,我们已经讨论了SPI通信和UART通信的基础知识,因此现在让我们进入本系列的最后一个协议,即集成电路总线或I2C。
如果你在项目里使用OLED显示器,气压传感器或陀螺仪/加速度计模块,那你很可能会发现自己正在使用I2C通信协议。
I2C通信简介
I2C结合了SPI和UART中最好的功能。使用I2C,您可以将多个从设备连接到单个主设备(像SPI那样),也可以由多个主设备控制一个或多个从设备。当你希望有多个微控制器将数据记录到单个存储卡或将文本显示到单个LCD显示器时,该功能非常有用。
与UART通信一样,I2C仅使用两根信号线在设备之间传输数据:
SDA(Serial Data,串行数据)–主设备和从设备发送和接收数据的信号线。
SCL(Serial Clock,串行时钟)–传送时钟信号的信号线。
I2C是串行通信协议,因此数据沿着单根信号线(SDA线)一比特一比特地传输。
与SPI一样,I2C是同步的,因此比特位输出通过主设备和从设备之间共享的时钟信号同步到比特位采样。时钟信号始终由主设备控制。
使用的信号线 | 2 |
最大传输速度 | 标准模式:100kbps |
快速模式:400kbps | |
高速模式:3.4Mbps | |
极速模式:5Mbps | |
同步/异步 | 同步 |
串行/并行 | 串行 |
最大主设备数 | 无限 |
最大从设备数目 | 1008 |
使用I2C通信协议,数据是以消息的形式传输。消息被分解为数据帧。每条消息都有一个包含从设备的二进制地址的地址帧,以及一个或多个包含正在发送的数据的数据帧。该消息还包括每个数据帧之间的开始和停止条件,读/写位和ACK / NACK位:
编址
I2C没有像SPI那样的从设备选择信号线,因此它需要另一种方式来使从设备知道主设备正在向其发送数据,而不是另一个从设备。它通过寻址来实现。地址帧始终是新消息中起始位之后的第一帧。
数据帧
主设备检测到从设备的ACK位后,就可以发送第一个数据帧了。
数据帧长度始终为8比特,并以最高有效位优先发送。每个数据帧后紧跟一个ACK / NACK位,以验证是否已成功接收到该帧。在发送下一个数据帧之前,主设备或从设备必须接收ACK位(取决于谁发送数据)。
发送完所有数据帧后,主设备可以向从设备发送停止条件以停止传输。停止条件是SDA信号线完成电平由低至高的转换后,SCL信号线紧接着完成电平由低到高的转换,而SCL信号线保持高电平。
I2C数据传输步骤
1.在将SCL信号线从高电平切换到低电平之前,主设备通过将SDA信号线从高电平切换到低电平来向每个连接的从设备发送启动条件:
补充说明:小编由I2C协议的标准手册查得其启动(START)条件与停止(STOP)条件的时序图如下,
2.主设备向每个从设备发送要与之通信的从设备的7位或10位地址,以及读/写位:
3.每个从设备将主设备发来的地址与其自己的地址进行比较。如果地址匹配,则从设备通过将SDA信号线拉低一位来返回ACK位。如果主设备的地址与从设备的地址不匹配,则从设备将SDA线拉高。
4.主设备发送或接收数据帧:
5.传输完每个数据帧后,接收设备将另一个ACK位返回给发送方,以确认已成功接收到该帧:
6.为了停止数据传输,主设备将SCL切换为高电平,然后再将SDA切换为高电平,从而向从设备发送停止条件:
由于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连接到特定设备:
- 仅使用两根信号线
- 支持多个主设备和多个从设备
- ACK / NACK位用于确认每个帧都已成功传输
-
硬件不如使用UART复杂
- 数据传输速率比SPI慢
- 数据帧的大小限制为8位
-
比SPI更复杂的硬件实现
谢谢阅读!希望大家从本系列有关电子通信协议的文章中学到了一些东西。如果你还没有阅读本系列,这里提示一下,第一部分介绍了SPI通信协议,第二部分介绍了UART驱动的通信。
如果你有任何疑问或需要补充的内容,请随时在(原文)下面发表评论,并且一定要订阅,以便在你的收件箱中获取更多类似的文章!
系列回顾:
原文链接:https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol