什么是I2C通信协议?

介绍

集成电路间协议 (I2C或IIC) 是一种串行、同步、多主、板对板、半双工通信协议。顾名思义,它主要用于印刷电路板 (PCB) 内的通信。飞利浦半导体公司于 1982 年发明了它,目的是使用更少的微控制器引脚与其他电子设备配合使用。它仅使用两条线路与连接的设备进行通信;因此,有时也称为双线协议。I2C 支持主从配置,但这里的术语从主从变为控制器目标或控制器外设。

多个从设备与主设备连接到同一总线

硬件接口

I2C的物理接口由两条线组成:SDA 和 SCL。SCL(串行时钟)是总线主设备的时钟信号,SDA(串行数据)是数据信号。I2C 驱动器是“开漏”的,这意味着设备只能将输出接地,或将其输出置于高阻抗状态,这意味着它无法将其输出驱动到逻辑 1。高阻抗状态意味着输出未连接到任何位置,即处于浮动状态。SDA 和 SCA 线上各有一对外部电阻器,当设备将其输出置于高阻抗状态时,它们会将线路拉高。这种开漏配置可防止线路短路,因为主设备和连接在一起的所有从设备永远不会对同一条线路施加冲突的电压。

开漏I2C驱动器
I2C 驱动器的时钟输入和数据输入缓冲器用作 I2C设备的输入,因为它们用于读取线路的状态。另一方面,当设备在总线上写入时,MOSFET 控制线路上的输出。

I2C总线支持不同的模式,从而支持不同比特率的数据交换。

模式速度
标准模式标准模式
快速模式400千比特/秒
高速模式加1兆位/秒
高速模式3.4兆位/秒

需要注意的是,这些比特率决定了总线上数据传输的速度,而不是设备的处理速度。

数据帧

I2C 协议在主从(控制器-外设)配置下运行,因此,总线上的读/写权限仅由主设备拥有。主设备决定哪个从设备将接收或向主设备发送数据。I2C 具有专门的数据帧,可以与总线上最多 128 个设备进行通信。

在这里插入图片描述
开始条件

在通信空闲状态下,SDA 和 SCL 线被拉高。要启动通信,主机将 SDA 线拉低,同时 SCL 线仍为高,并提醒总线上的从机设备已准备好进行通信。

寻址从属设备

在此启动条件之后,主设备会向其想要通信的从设备发送一个 7 位地址。连接到总线的所有设备都会读取该地址,具有该地址的设备会响应主设备的请求。

读/写操作

7 位地址后面跟着一个 R/W 位 - “1” 表示读取操作,“0” 表示写入操作。R/W 决定谁将接管 SDA 线进行数据传输,主设备还是从设备。读取和写入操作从主设备的角度执行,如下所示:

  • 读操作- 主机将接收从机传输的数据,因此也称为从总线读取。
  • 写操作- 主机将数据传输给从机。因此这称为写入总线。

值得注意的是,主机(而不是从机)在 SCL 线上生成时钟信号来对 SDA 线上的数据进行采样

确认/否定确认

要检查从机是否连接到总线或总线是否繁忙,主机会等待从机的确认,即主机等待从机在第 9 个时钟周期将 SDA 线拉低。如果满足此条件,主机会收到从机的肯定响应,称为 ACK。但如果 SDA 线在第 9 个时钟周期保持高位,则称为 NACK。此机制使主机能够检查具有给定地址的从机是否存在于总线上。ACK/NACK 的另一个用途是确定从机是否已无错误地接收到传输的位。

数据

主机发送或接收的数据是进行通信的实际数据。数据帧的所有其他部分都是协议的支持机制。如前所述,有两种操作:写入和读取。

写操作
首先,主机通过发送 7 位地址来寻址总线上的从机。如果从机在总线上存在或处于活动状态,则它已准备好进行传输。之后,主机发送W位以通知从机,主机将接管 SDA 线并将数据发送给从机。主机在下一个时钟周期等待从机的 ACK。在收到从机的 ACK 后,主机在每个时钟周期逐位发送“数据” 。主机将数据写入总线,因此在I2C协议中将其称为“写入”操作。

读操作
如果主机想要接收从机的数据,它会在总线上寻址从机并发出R位,然后等待从机的 ACK。在收到从机的 ACK 后,主机允许从机接管 SDA 线以将数据传输给主机。主机此时从总线读取数据,因此在I2C协议中这称为“读取”操作。

与UART相比,使用I2C的优势之一是主机可保持通信,并且在所有数据传输完成之前无需重新初始化通信,这意味着每个数据帧可传输的位数没有限制。例如:如果主机想要向从机写入 32 位数据,则​​无需开始和结束通信 4 次(每次 8 位)。在从机每次发送 ACK 之后,可以向从机发送另一个 8 位数据块。与UART不同,I2C减少了每个数据帧的起始位和停止位造成的开销。但如果我们想将操作模式从读取更改为写入或反之亦然,则需要结束帧。

除了减少位开销之外,ACK/NACK 还可用作I2C总线中的错误检查机制。对于写入操作,如果主机收到从机的 NACK,它会将数据重新发送给从机。如果主机在读取从机时收到 NACK,主机会丢弃已收到的位。

停止条件
传输完成后,主机通过将 SDA 线从低电平变为高电平(SCL 为高电平)来断言停止条件。这将完成事务并使通信重新处于空闲状态。至此,我们完成了对 I2C 数据帧及其所有部分的解释。但这还不是全部。I2C提供了一些非常酷的功能,这些功能对于创建强大的系统非常有用。并非所有I2C设备都支持这些功能,但需要注意它们。

时钟拉伸

如前所述,设备支持的I2C通信比特率不一定是设备的数据处理速度。那么,如果主机向从机请求一些数据,而从机尚未准备好所请求的数据,该怎么办?由于主机将在下一个时钟周期期待从机的 ACK,如果从机未能将SDA 线拉低,则主机将认为通信失败。为了克服通信中的这种限制,从机使用“时钟拉伸”来通知主机它很忙,需要更多时间来处理数据。从机通过将 SCL 线拉低来实现这一点,这会暂停通信,因为I2C 中的数据采样是在 SCL 线的上升沿完成的。并非所有I2C 设备都支持时钟拉伸;因此,需要设备的数据表来验证这一点。这有时也会导致问题,因为如果设备出现故障,并保持 SCL 线拉低,则整个总线将暂停,主机无法与其他从机通信。

时钟延长实现

总线仲裁

I2C总线支持多个主设备,可以与连接到总线的所有设备通信。连接到总线上的主设备不断监控 SDA 和 SCL 线路的启动和停止条件,并保持待处理的传输,直到总线再次空闲。这就是它们在同一总线上并发操作的方式,但可能会出现两个主设备同时发起传输的情况。为了避免这种情况,总线上的主设备不断监控 SDA 线路,以检查 SDA 线路是否被另一个主设备拉低。如果其中一个主设备检测到 SDA 为低而本应为高,则它断定另一个主设备当前处于活动状态,并立即终止自己的传输。此过程称为总线仲裁。
在这里插入图片描述
如上图所示,主设备 A 和主设备 B 同时发起数据传输。但是,主设备 B 设法将 SDA 线拉低,而主设备 A 则希望将 SDA 线拉高。主设备 A 检测到此冲突,并失去仲裁权,即不再控制 SDA 线。

权衡:功率与速度

更高的比特率对于现代通信系统至关重要。为了快速处理数据,还需要快速从从设备获取数据。I2C 支持每秒 3.2Mbits 的比特率。这意味着I2C 线路每秒将在高电平和低电平之间切换 320 万次。由于 PCB 走线或用于通信的电线上的高电容,线路的这种快速切换变得困难,并且时钟线路的上升时间增加。上升时间是线路从逻辑低电平转换为逻辑高电平所需的时间。下面是线路中每个电容的上升时间差异的示例。红色波形的电容为 30nF,因此与电容为 1nF 的绿色波形相比,它的上升速度要慢得多。
在这里插入图片描述
为了解决时钟信号上升时间增加的问题,使用电阻低于 4.7 kΩ 的上拉电阻。这样可以让更多的电流流入线路,但会增加I2C线路的功耗。因此,此协议需要在速度和功耗之间进行权衡,因为速度越高,功耗也就越大。

概括

I2C 广泛用于将传感器接线板、存储设备、显示器和其他从属设备连接到微控制器 - 因为它需要的硬件连接最少。由于它在业余爱好者社区中很受欢迎,因此有大量资源可用于实现和调试此协议。我们希望本教程能让您清楚地了解I2C 的工作原理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值