记忆一隅

I2C 通信协议:了解I2C Primer、PMBus 和 SMBus

2021-12-04 · 25 min read
电路

I2C Communication Protocol: Understanding I2C Primer, PMBus, and SMBus

摘要

I2C(Inter-Integrated Circuit)是一种常用的串行通信协议,用于建立设备之间的通信,特别是对于两个或多个不同的电路。 I2C Primer 是最常用的 I2C。文章将根据 I2C Primer 的基本特性和标准,解决通信实现过程中的正确使用问题。从 I2C 的基础知识出发,将逐步了解其变体子集、系统管理总线 (SMBus) 和电源管理总线 (PMBus) 的可用性及其差异。三者中的每一个都有其独有的功能,以满足不同的客户需求。

I2C Primer

接口

通过使用一条串行数据(SDA)线、一条串行时钟(SCL)线和一个公共地线来承载所有的通信,可以最大限度地减少连接。
图1. 集成电路之间直接通信
图1. 集成电路之间直接通信

每个I2C设备中均有两根传输线。

  • SDA是主设备和节点发送和接收数据的线路。
  • SCL是携带时钟信号的线路。SCL总是由I2C主设备产生。规范中有要求时钟信号的低电平和高电平的最短周期
    I2C总线只使用两条双向线。每个设备都通过SDA和SCL进行IC间通信。
    图 2. I2C 上拉电阻连接方式
    图 2. I2C 上拉电阻连接方式

最重要的硬件部分是上拉电阻,供 SDA 和 SCL 线使用。 I2C 兼容设备通过集电极开路或漏极开路引脚连接到总线,在有信号传输时,将线路拉低进行通信。当没有数据传输时,I2C总线处于高电平空闲状态;线被被动拉高。总线通过切换线路、拉低和释放来进行数据传输。数据比特在时钟下降沿采样。
开漏输出需要一个上拉电阻(图 2 中的 Rp)才能正确输出高电平。上拉电阻连接在输出引脚上拉电压(图 2 中的 VDD)之间。4.7K是VCC和VDD电压为5V时最常用的上拉电阻值。
作为参考,屏蔽的2 AWG双绞线的电容范围为100 pF/m至240 pF/m。因此,I2C链接的最大总线长度在100 kBaud时约为1米,或在10 kBaud时为10米。非屏蔽电缆的电容通常要小得多,只能在其他屏蔽的外壳内使用。

表1. I2C的主要特点

特性 规格
线数 2
最大速度 标准模式 = 100 kbps,快速模式 = 400 kbps,
高速模式 = 3.4 Mbps,超快模式 = 5 Mbps
同步还是异步? 同步
串行还是并行? Serial
最大主机数 不限
最大子节点数 1008

理论上,寻址方式的最大节点数为272^72102^{10};但是,保留 16 个地址用于特殊用途。
I2C是同步的,所以数据比特的输出与采样是通过主控和节点之间共享的时钟信号同步的。该时钟信号由主控制器控制。

保留的 I2C 节点地址

有 16 个保留的 I2C 地址。这些地址对应于以下两种模式之一:0000 XXX 1111 XXX。表 2 显示了为特殊目的保留的 I2C 地址。

表二. I2C保留地址

I2C 节点地址 R/W 位 描述
0000 000 0 广播地址
0000 000 1 起始字节
0000 001 X CBUS 地址
0000 010 X 保留用于不同的总线格式
0000 011 X 保留用于未来用途
0000 1XX X 高速模式主代码
1111 1XX X 保留以备将来使用
1111 0XX X 10 位节点地址

I2C 是如何工作的?

I2C数据是以消息形式传输的,消息被分解成数据帧。 读写协议包含带有节点二进制地址的地址帧和另一个数据帧,其中包含正在传输的数据、启动和停止条件、重复启动位、读/写位以及每个数据帧之间的确认/不确认位。

图3. 一个I2C消息。

时序规范表

I2C规范表相当的重要,工程师根据它设计与总线要求兼容的IC。每个数据速率都有自己的时序规范,主节点必须遵守这些规范以实现正确数据传输。表3为时序规范表重要的指标和参数。

指标 描述的参数 单位
fSCLf_{SCL} SCL时钟频率 kHz
tHD(STA)t_{HD(STA)} 保持时间(重复)开始条件 μs\mu s
tLOWt_{LOW} SCL引脚的低电平周期 μs\mu s
tHIGHt_{HIGH} SCL引脚的高电平周期 μs\mu s
tSU(STA)t_{SU(STA)} 重复启动状态的建立时间 nsns
tHD(DAT)t_{HD(DAT)} 数据保持时间 nsns
tSU(DAT)t_{SU(DAT)} 数据建立时间 nsns
trt_r SDA信号的上升时间 nsns
tft_f SDA信号的下降时间 nsns
tSU(STO)t_{SU(STO)} 停止条件下的建立时间 μs\mu s

I2C传输子协议

在总线上的传输是一种读或写的操作。读和写协议建立在一系列子协议的基础上,如启动和停止条件、重复启动位、地址字节、数据传输位和确认/不确认位。

启动条件

顾名思义,启动条件总是发生在传输的开始阶段,由主设备发起。这样做是为了唤醒总线上闲置的节点设备。在SCL线从高电平切换到低电平之前,SDA线会从高电平切换到低电平。见图4

图4. 启动条件

重复启动条件

在不发出停止条件的情况下,可以在传输过程中重复启动条件。这是一种特殊情况,称为重复启动,用于改变数据传输方向,重复传输尝试,使几个IC同步,甚至控制串行存储器。见图5。

图5. 重复启动条件

地址帧

地址帧包含一个7位或10位的序列,取决于可用性(参考数据手册)。见图6。

图6. 地址帧
I2C没有像SPI那样的片选线,所以它需要另一种方式来让节点知道数据是发送给它的,而不是另一个节点。它通过寻址来做到这一点。地址帧总是新信息中起始位之后的第一帧。
主机将它想与之通信的节点的地址发送给与之相连的每个节点。然后每个节点将从主站发送的地址与自己的地址进行比较。如果地址匹配,它就向主节点发送一个低电压ACK位。如果地址不匹配,该节点不做任何事情,SDA线保持高电平。

读/写位

地址帧的末尾包括一个独立的位,它通知节点,主机是否要向它写数据或从它接收数据。如果主机想向节点发送数据,读/写位处于一个低电压水平。如果主系统要求从节点获得数据,该位处于高电压水平。见图7。

图7. 读/写位。

ACK/NACK位

消息中的每个帧后面都有一个确认/不确认位。 如果一个地址帧或数据帧被成功接收,接收设备会向发送方返回一个ACK位。图例。在下面的数字中,白色方框代表节点,而蓝色方框则代表主机。见图8。

图8. 确认/不确认位

数据帧

在主机检测到来自节点的ACK位后,准备发送第一个数据帧。数据帧总是8比特长,以最重要的比特为先发送。每个数据帧后面都有一个ACK/NACK位,以验证该帧是否被成功接收。在发送下一个数据帧之前,主节点或节点必须收到ACK位(取决于谁在发送数据)。见图9。

图9. 数据帧。

停止条件

在所有数据帧发送完毕后,主机可以向节点发送一个停止条件以停止传输。停止条件是在SCL线从低到高的转换之后,SDA线的电压从低到高的转换,SCL线保持高电平。 在SCL线从低到高转换之后,SDA线从低电压水平转换到高电压水平。见图10。

图10. 停止条件

I2C传输的步骤:写

关于I2C传输写单一位置的例子,见图11。

  1. 主机通过将SDA线从高电平切换到低电平,然后再将SCL线从高电平切换到低电平,向每个连接的节点发送启动条件。
  2. 主机向每个节点发送它想与之通信的7位或10位地址,以及写位。例如,一个7位的地址是0x2D。加上一个相当于0的写位,就是0x5A。
  3. 每个节点将从主机发送的地址与自己的地址进行比较。如果地址匹配,节点通过将SDA线拉低一个位来返回一个ACK位。如果来自主机的地址与节点自己的地址不匹配,节点将SDA线保持高电平。通过在SCL的第九个脉冲期间将SDA线拉低,并在NACK位设置为高电平,可以实现ACK。
  4. 主机发送或接收数据帧。
  5. 在每个数据帧传输完毕后,接收设备向发送方返回另一个ACK位,以确认成功收到该帧。
  6. 停止数据传输,主机通过在将SDA切换为高电平之前将SCL切换为高电平来向节点发送一个停止信号。

    图11. 写入单个位置的I2C传输示例

I2C数据传输的步骤:读取

  1. 主机通过将SDA线从高电平切换到低电平,然后再将SCL线从高电平切换到低电平,向每个连接的节点发送启动条件。
  2. 主机向每个节点发送它想与之通信的7位或10位地址,以及写位。例如,一个7位的地址是0x2D。加上一个相当于0的写位,就是0x5A。
  3. 每个节点将从主机发送的地址与自己的地址进行比较。如果地址匹配,节点通过将SDA线拉低一个位来返回一个ACK位。如果来自主站的地址与节点自己的地址不匹配,节点将SDA线保持高电平。
  4. 在最初的启动、寻址和确认之后,由于主站已经知道它的节点和要指向的地址,一些设备有一个重复的启动条件来清理传输状态。注意:仅用于读取!
  5. 主机向每个节点发送它想与之通信的7位或10位地址,以及读位。例如,一个7位的地址是0x2D。加上一个相当于1的读取位,它将是0x5B。
  6. 每个节点将从主机发送的地址与自己的地址进行比较。如果地址匹配,节点通过将SDA线拉低一个位来返回一个ACK位。如果来自主机的地址与节点自己的地址不匹配,节点将SDA线保持高电平。
  7. 在ACK位之后,主站接收来自节点的数据帧。
  8. 在每个数据帧传输完毕后,主机再向发送方返回一个ACK位,以确认成功收到该帧,如果读请求已经完成,主机则返回一个NACK。
  9. 要停止数据传输,主机通过在将SDA切换为高电平之前将SCL切换为高电平来向节点发送一个停止信号。

    图12. I2C传输读取单个位置示例

单主节点多子节点

由于 I2C 采用地址寻址方式,可以单个主节点控制多个节点。对于 7 位地址,有 128 (27) 个唯一地址可供使用。使用 10 位地址的设备并不常见,但可提供 1024 (210) 个唯一地址。要将多个节点连接到单个主机,请使用 4.7 kΩ 上拉电阻将 SDA 和 SCL 线连接到 VCC。

多主节点多子节点

多个主节点主机可以连接到一个子节点或多个子节点。当两个主机同时试图通过SDA线发送或接收数据时,同一系统中的多个主机的问题就出现了。
为了解决这个问题,每个主机在传输信息之前需要检测SDA线是低电平还是高电平。如果SDA线为低电平,这意味着另一个主设备控制了总线,主设备应该等待发送信息。如果SDA线是高电平,那么就可以安全地发送消息了。要将多个主机连接到多个节点,请使用图13所示的图,用4.7kΩ的上拉电阻将SDA和SCL线连接到VCC。

图13. 多主节点多子节点互联

仲裁

几个I2C主设备可以被连接到同一个I2C总线上并同时运行。通过不断监测SDA和SCL的启动和停止条件,它们可以确定总线目前是否处于空闲状态。如果总线繁忙,主设备就会推迟待定的I2C传输,直到停止条件表明总线再次空闲。
然而,可能会发生两个主设备同时开始传输的情况。在传输过程中,主设备不断监测SDA和SCL。如果其中一个检测到SDA是低电平,而它应该是高电平,它就认为另一个主设备在活动,并立即停止其传输。这个过程被称为 "仲裁"。两个主设备都产生一个起始位,并继续进行它们的传输。
如果多个主设备碰巧选择了相同的逻辑电平,就不会发生什么。一旦主设备试图施加不同的逻辑电平,驱动信号为低电平的主设备就被宣布为赢家;输家检测到逻辑不匹配并放弃传输。

  • 赢家继续其传输,没有中断--没有损坏的数据,没有驱动器的争夺,不需要重新启动交易。
  • 理论上,输家可以在仲裁过程中监测节点地址,如果它恰好是被寻址的节点,可以做出适当的响应。
  • 如果竞争的主设备都在请求同一节点的数据,仲裁过程不会中断任何一个的数据传输,也不会检测到不匹配的传输,节点会将其数据输出到总线上,多个主设备都可以接收。

时钟延展

这也被称为时钟同步。
注意:I2C规范没有规定时钟延展的任何超时条件,也就是说,任何设备都可以控制SCL,只要它有这个意愿。在I2C通信协议中,时钟速度和信号总是由主设备产生的。由I2C主设备产生的信号在主设备和节点连接之间提供同步。
在有些情况下,节点或子节点没有完全工作,需要在接收主设备产生的时钟之前放慢速度。这是通过一种被称为时钟延展的机制来实现的。在时钟延展期间,为了降低总线速度,节点被允许按住时钟。而在主控端,有必要在其高电平状态后,将时钟信号读回。然后,它必须等待,直到该线达到高电平状态。

带宽

虽然时钟延展是一种常见的做法,但对通信带宽有影响。在使用时钟延展时,共享总线的总带宽可能会大大减少。即使使用这种技术,总线性能必须仍然是可靠和快速的。有必要介绍一下使用时钟延展的大概效果,特别是在由多个设备共享的I2C总线上的情况。
时钟延展允许一个I2C节点设备迫使主设备进入等待状态。当节点设备需要更多的时间来管理数据时,它可以执行时钟延展。例如,存储收到的数据或准备传输另一个字节的数据。这通常发生在节点设备收到并确认一个字节的数据之后。

哪些I2C节点设备需要进行时钟延展?

是否需要进行时钟延展取决于节点设备的功能。这里有两个例子。

  • 一个处理设备,如微处理器或微控制器,可能需要额外的时间来处理一个中断,接收和管理数据,并执行适当的函数。
  • 一个较简单的设备,如EEPROM,不在内部处理数据,所以它不需要时钟延展来执行任何功能。

I2C 数据手册样本概览

根据不同的公司和制造商,在编写数据手册方面有不同的方法。作为一个开始,图14显示了一个数据手册样例和基本的I2C细节,包括寄存器和电子规格。

图 15. 微控制器内存映射

表4展示了最常用的I2C寄存器。名称和描述可能因数据手册的不同而不同,但功能和用法是通用的。
表4. I2C寄存器描述

名称 描述
I2C_ADDR1 主地址字节1
I2C_ADDR2 主地址字节2
I2C_BYT 开始字节
I2C_ID 节点地址设备ID
I2C_MCTL 主控制
I2C_MRX 主接收数据
I2C_SCTL 节点控制
I2C_SRX 节点接收
I2C_STAT 主和节点FIFO状态

I2C的创建可能因用途不同而不同。表5展示了一个基本的I2C驱动API要求样例。
表 5. I2C 驱动程序开发

主节点 子节点
初始化 初始化
主节点Tx处理程序 子节点Tx处理程序
主节点Rx处理程序 子节点Rx处理程序
事件中断 事件中断
错误中断 错误中断

SMBus

SMBus被用于需要对参数进行关键监控的应用中。它最常用于计算机主板和嵌入式系统应用。它对温度、电源电压、风扇监控和/或控制集成芯片有额外的监控规范。
SMBus是一个两线制的总线,与飞利浦在1980年代开发的I2C总线相似。两个主要信号是时钟,即SMBCLK,和数据,即SMBDAT。I2C引脚和SMBus是相互兼容的,但也有明显的区别,如:

  • SMBus逻辑电平阈值是固定的,与器件的电源电压不成正比。这允许具有不同电源电压的器件在同一个引脚上运行。例如,一个SMBus可能有从1.8V、3.3V和5V供电的器件。
  • SMBus都以相同的速度工作,最高为100 kHz,但I2C引脚有400 kHz和2MHz版本。
  • SMBus规定了最低的时钟速度,并限制了时钟在一个事务中可能被延展的量。违反超时限制会导致所有SMBus设备重置其I/O逻辑,以允许总线重新启动。 这增强了总线的稳健性。
  • 两者的超时也不同。I2C底层没有超时,而SMBus有超时。
  • 数据包错误检查(PEC)最初是为SMBus定义的。在每个事务结束时都会增加一个包错误代码字节。
  • 其余的一些区别涉及到传输类型、警报线、暂停线以及断电或上电信息。

这是一个明确的要求,即SMBus设备在每次收到自己的地址时都必须确认(ACK),而不管该设备可能正在做什么。这保证了主设备可以准确地确定总线上有哪些设备在活动。
所有SMBus变化都是按照指定的SMBus协议进行的。
SMBus包括一个可选的信号,SMBALERT#,节点设备可以用它来快速通知主设备或系统主机它有信息给主设备,如报告一个故障状况。


图16. SMBus拓扑结构

图17. SMBus上拉电路

SMBus地址

SMBus 地址长度为7位,通常表示为 4 位后跟 3 位后跟字母 b,例如 0001 110b。这些地址占据总线上 8 位字段的高 7 位。然而,该字段的低位具有另一种不属于 SMBus 地址的语义含义。
一个7位的目标地址从主机发送到总线上的一个或多个设备(一般调用地址)。、开始和停止条件是转换状态,而不是一个比特,并且在符号上方显示了比特数的数字。

图 19. SMBus 消息

表 6. SMBus 参数

符号 参数 单位
fSMBf_{SMB} SMBus 工作频率 kHz
tBUFt_{BUF} 停止和启动条件之间的总线空闲时间 μs
THDSTAT_{HD-STA} 在(重复)启动条件后的保持时间 μs
TSUSTAT_{SU-STA} 重复启动条件设置时间 μs
tSU(STO)t_{SU(STO)} 停止条件设置时间 μs
tHD(DAT)t_{HD(DAT)} 数据保持时间 ns
tSU(DAT)t_{SU(DAT)} 数据建立时间 ns
tTIMEOUTt_{TIMEOUT} 检测时钟低电平超时 ms
tLOWt_{LOW} 时钟低电平周期 μs
tHIGHt_{HIGH} 时钟高电平周期 μs

PMBus:重新定义电源管理

除了SMBus之外,还有一个变种,即PMBus,它是一个开放标准的电源管理协议。这个灵活和高度通用的标准允许基于模拟和数字技术的设备之间进行通信,并提供真正的互操作性,这将降低设计复杂性,缩短电力系统产品的上市时间。
PMBus用于对带有电源控制和管理组件的电源进行数字管理。它的命令和结构满足电源管理的需求。这意味着I2C引脚和PMBus在电气要求和命令语义上是兼容和互通的。
电源管理中的一个基本参数是监测过压水平,而PMBus提供了一个设置和读取过压水平的命令。通过增加I2C底层和SMBus的可用功能,PMBus作为现有标准,特别是SMBus的基础上的协议层。
I2C规范只描述了2线总线的物理层、定时和流量控制。I2C规范没有描述信息的格式(像SMBus协议),也没有描述信息的内容。PMBus规范是一个完整的电源管理协议。它包括如何将比特和字节从一个设备获取到另一个设备(即传输);它还描述了一种命令语言,赋予这些比特和字节以意义。

寻址

对于冗余系统,一旦电源安装在系统中,有三个信号来设置电源的地址位置。地址2、地址1和地址0。对于非冗余系统,电源的设备地址位置应该是B0h。

表7. PMBus寻址
所有地址 主要寻址,用于具有两个寻址引脚的大多数服务器电源 附近寻址,前提是电源上提供了三个寻址引脚
系统寻址
地址2/地址1/地址0
0/0/0 0/0/1 0/1/1 0/1/1 1/0/0 1/0/1 1/1/0 1/1/1
PMBus 器件读取地址 B0h/B1h B2h/B3h B4h/B5h B6h/B7h B8h/B9h BAh/BBh BCh/BDh BEh/BFh

硬件

电源中的设备应与SMBus 2.0高功率规范兼容,用于基于VDD的I2C电源和驱动(对于VDD=3.3 V)。该总线应在3.3 V下运行。

电源来源

电源内的电路应从待机输出中获得电源。对于冗余电源,设备应从OR'ing设备的系统侧供电。每当交流电加到电源或系统中的并联冗余电源时,PMBus设备应处于开启状态。

上拉

在电源内部的SCL或SDA线路上只能有弱的上拉电阻。主上拉电阻由系统提供,可以连接到3.3V或5V。在系统设计中,主要的上拉电阻应位于电源的外部,并从待机轨道获得电源。

数据速度

电源中的PMBus设备应以完整的100 kbps SMBus速度运行,并尽可能避免使用时钟延展,因为这会降低总线的速度。

总结

SMBus最初是为了电池管理系统而开发的,它使用I2C硬件,但增加了第二级软件层,最终允许设备在不重新启动系统的情况下进行热插拔。PMBus通过定义一套专门用于管理电源转换器的设备命令来扩展SMBus,暴露了设备属性,如测量的电压、电流、温度等。一般来说,I2C引脚、SMBus和PMBus设备可以共享一条总线。

I2C, SMBus, PMBus 优点

  • 只用两根线
  • 有 ACK/NACK 位
  • 广为人知的协议
  • 支持多个主设备和多个节点
  • 硬件比 UART 简单
  • 被广泛采用

缺点

  • 数据传输速率比 SPI 慢
  • 数据帧的大小限制为 8 位
  • 实现所需的硬件比 SPI 更复杂

表 8. I2C Primer、SMBus 和 PMBus 的总结规范

表8. I2C Primer、SMBus和PMBus规格总结
规格 I2C Primer

SMBus

高功率 | 低功率
PMBus
信号 分组差错校验(可选)
SMBALERT(可选)
块大小限制






32 字节


32 字节


255 字节
时序 数据速率:
标椎模式
快速模式
快速模式+
高速模式

时钟速度

总线超时

总线主器件请求延迟(最小值)
SCL 保持时间(最大值)
数据保持时间(最小值)
100 kbps
400 kbps
1 Mbps
3.4 Mbps
0 Hz zhi 3.4 MHz




100 kbps




10 kHz 至 100 kHz
25 ms 至 35 ms
50 μs

2 ms
300 ns
100 kbps




10 kHz 至 100 kHz
25 ms 至 35 ms
50 μs

2 ms
300 ns
100 kbps
400 kbps


10 kHz 至 400 kHz
25 ms 至 35 ms
50 μs

2 ms
300 ns
电气 每个总线段的容性负载(最大值)

上升时间(最大值)

0.4V时的上拉电流(最大值)

每个器件的漏电流(最大值)
VIL输入逻辑低电平阈值(最大值)
VIH输入逻辑高电平阈值(最小值)
VOL输出逻辑低电平阈值(最大值)
400 pF
1 μs(100 kHz时), 300 ns(400 kHz时)
3 mA (标准和快速模式)
±10 μA
0.3 VDD 或 1.5 V
0.7 VCC 或 3 V
0.4 V
400 pF
1 μs
4 mA
±10 μA
0.8 V
2.1 V
2.4 V

1 μs
350 μA
±5 μA
0.8 V
2.1 V
0.4 V
400 pF
1 μs(100 kHz时), 300 ns(400 kHz时)
4 mA
±10 μA
0.8 V
2.1 V
0.4 V

文章翻译自https://www.analog.com/media/en/analog-dialogue/volume-55/number-4/i2c-communication-protocol-understanding-i2c-primer-pmbus-and-smbus.pdf