收藏 | 电子通信协议之I2C通信协议篇

 

 

到目前为止,我们已经讨论了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如何工作

使用I2C通信协议,数据是以消息的形式传输。消息被分解为数据帧。每条消息都有一个包含从设备的二进制地址的地址帧,以及一个或多个包含正在发送的数据的数据帧。该消息还包括每个数据帧之间的开始和停止条件,读/写位和ACK / NACK位:

 

 

启动条件:在SCL信号线从高电平切换到低电平之前,SDA信号线从高电平切换到低电平。 
停止条件:SCL信号线从低电平切换到高电平后,SDA线从低电平切换到高电平。 
地址帧:每个从设备唯一的7位或10位序列,用于在主设备要与之通信时标识该从设备。
读/写位:1比特,指定主机是向从机发送数据(低电压电平)还是从从机请求数据(高电压电平)。
ACK / NACK位:消息中的每个帧后都有一个确认/否确认位。如果成功接收到地址帧或数据帧,则会从接收设备向发送方返回一个ACK位。

编址

I2C没有像SPI那样的从设备选择信号线,因此它需要另一种方式来使从设备知道主设备正在向其发送数据,而不是另一个从设备。它通过寻址来实现。地址帧始终是新消息中起始位之后的第一帧。

主设备将要与之通信的从设备的地址发送给与其连接的每个从设备。然后,每个从设备将从主设备发送的地址与其自己的地址进行比较。如果地址匹配,它将向主机发送一个低电压ACK位。如果地址不匹配,则从设备不执行任何操作,并且SDA线保持高电平。
读/写位
地址帧的末尾包含一个位,该位通知从设备,主设备是否要向其写入数据或从中接收数据。如果主设备要向从设备发送数据,则读/写位为低电压电平。如果主设备正在向从设备请求数据,则该位为高电压电平。

数据帧

主设备检测到从设备的ACK位后,就可以发送第一个数据帧了。

数据帧长度始终为8比特,并以最高有效位优先发送。每个数据帧后紧跟一个ACK / NACK位,以验证是否已成功接收到该帧。在发送下一个数据帧之前,主设备或从设备必须接收ACK位(取决于谁发送数据)。

发送完所有数据帧后,主设备可以向从设备发送停止条件以停止传输。停止条件是SDA信号线完成电平由低至高的转换后,SCL信号线紧接着完成电平由低到高的转换,而SCL信号线保持高电平。

I2C数据传输步骤

1.在将SCL信号线从高电平切换到低电平之前,主设备通过将SDA信号线从高电平切换到低电平来向每个连接的从设备发送启动条件:

 

 

补充说明:小编由I2C协议的标准手册查得其启动(START)条件与停止(STOP)条件的时序图如下,

如该时序图,所有事务均是以START (S) 条件开始,并以STOP (P) 条件终止。当SCL保持为高电平,SDA从高电平到低电平跳变时,定义为STRAT条件,表示开始传输。而当SCL为高电平,SDA由低电平到高电平跳变时,定义为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很可能听起来有些复杂,但是有一些充分的理由让您愿意或拒绝使用I2C连接到特定设备:

优点
  • 仅使用两根信号线
  • 支持多个主设备和多个从设备
  • ACK / NACK位用于确认每个帧都已成功传输
  • 硬件不如使用UART复杂
缺点
  • 数据传输速率比SPI慢
  • 数据帧的大小限制为8位
  • 比SPI更复杂的硬件实现

谢谢阅读!希望大家从本系列有关电子通信协议的文章中学到了一些东西。如果你还没有阅读本系列,这里提示一下,第一部分介绍了SPI通信协议,第二部分介绍了UART驱动的通信。

如果你有任何疑问或需要补充的内容,请随时在(原文)下面发表评论,并且一定要订阅,以便在你的收件箱中获取更多类似的文章!

系列回顾:

收藏 | 电子通信协议之SPI通信协议篇
收藏 | 电子通信协议之UART通信协议篇

原文链接:https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol

 

 

扫描上图二维码可直达课程页面,马上试听
往期精彩:
获取验证通关密语,就在本周日开班的验证V2课程
30w+还送股送房?60+IC企业2019薪资全面攀升!
UVM RAL模型:用法和应用
我们准备做第二期线下培训,依旧认真且严肃
如果你突然被裁员了,你的Plan B是什么?
[彩虹糖带你入门UVM]
理解UVM-1.2到IEEE1800.2的变化,掌握这3点就够

发表评论

电子邮件地址不会被公开。 必填项已用*标注