I2C Communication Protocol: Understanding I2C Primer, PMBus, and SMBus
I2C(Inter-Integrated Circuit)是一种常用的串行通信协议,用于建立设备之间的通信,特别是对于两个或多个不同的电路。 I2C Primer 是最常用的 I2C。文章将根据 I2C Primer 的基本特性和标准,解决通信实现过程中的正确使用问题。从 I2C 的基础知识出发,将逐步了解其变体子集、系统管理总线 (SMBus) 和电源管理总线 (PMBus) 的可用性及其差异。三者中的每一个都有其独有的功能,以满足不同的客户需求。
通过使用一条串行数据(SDA)线、一条串行时钟(SCL)线和一个公共地线来承载所有的通信,可以最大限度地减少连接。
图1. 集成电路之间直接通信
每个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 |
理论上,寻址方式的最大节点数为或;但是,保留 16 个地址用于特殊用途。
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数据是以消息形式传输的,消息被分解成数据帧。 读写协议包含带有节点二进制地址的地址帧和另一个数据帧,其中包含正在传输的数据、启动和停止条件、重复启动位、读/写位以及每个数据帧之间的确认/不确认位。
图3. 一个I2C消息。
I2C规范表相当的重要,工程师根据它设计与总线要求兼容的IC。每个数据速率都有自己的时序规范,主节点必须遵守这些规范以实现正确数据传输。表3为时序规范表重要的指标和参数。
指标 | 描述的参数 | 单位 |
---|---|---|
SCL时钟频率 | kHz | |
保持时间(重复)开始条件 | ||
SCL引脚的低电平周期 | ||
SCL引脚的高电平周期 | ||
重复启动状态的建立时间 | ||
数据保持时间 | ||
数据建立时间 | ||
SDA信号的上升时间 | ||
SDA信号的下降时间 | ||
停止条件下的建立时间 |
在总线上的传输是一种读或写的操作。读和写协议建立在一系列子协议的基础上,如启动和停止条件、重复启动位、地址字节、数据传输位和确认/不确认位。
顾名思义,启动条件总是发生在传输的开始阶段,由主设备发起。这样做是为了唤醒总线上闲置的节点设备。在SCL线从高电平切换到低电平之前,SDA线会从高电平切换到低电平。见图4
图4. 启动条件
在不发出停止条件的情况下,可以在传输过程中重复启动条件。这是一种特殊情况,称为重复启动,用于改变数据传输方向,重复传输尝试,使几个IC同步,甚至控制串行存储器。见图5。
图5. 重复启动条件
地址帧包含一个7位或10位的序列,取决于可用性(参考数据手册)。见图6。
图6. 地址帧
I2C没有像SPI那样的片选线,所以它需要另一种方式来让节点知道数据是发送给它的,而不是另一个节点。它通过寻址来做到这一点。地址帧总是新信息中起始位之后的第一帧。
主机将它想与之通信的节点的地址发送给与之相连的每个节点。然后每个节点将从主站发送的地址与自己的地址进行比较。如果地址匹配,它就向主节点发送一个低电压ACK位。如果地址不匹配,该节点不做任何事情,SDA线保持高电平。
地址帧的末尾包括一个独立的位,它通知节点,主机是否要向它写数据或从它接收数据。如果主机想向节点发送数据,读/写位处于一个低电压水平。如果主系统要求从节点获得数据,该位处于高电压水平。见图7。
图7. 读/写位。
消息中的每个帧后面都有一个确认/不确认位。 如果一个地址帧或数据帧被成功接收,接收设备会向发送方返回一个ACK位。图例。在下面的数字中,白色方框代表节点,而蓝色方框则代表主机。见图8。
图8. 确认/不确认位
在主机检测到来自节点的ACK位后,准备发送第一个数据帧。数据帧总是8比特长,以最重要的比特为先发送。每个数据帧后面都有一个ACK/NACK位,以验证该帧是否被成功接收。在发送下一个数据帧之前,主节点或节点必须收到ACK位(取决于谁在发送数据)。见图9。
图9. 数据帧。
在所有数据帧发送完毕后,主机可以向节点发送一个停止条件以停止传输。停止条件是在SCL线从低到高的转换之后,SDA线的电压从低到高的转换,SCL线保持高电平。 在SCL线从低到高转换之后,SDA线从低电压水平转换到高电压水平。见图10。
图10. 停止条件
关于I2C传输写单一位置的例子,见图11。
由于 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节点设备迫使主设备进入等待状态。当节点设备需要更多的时间来管理数据时,它可以执行时钟延展。例如,存储收到的数据或准备传输另一个字节的数据。这通常发生在节点设备收到并确认一个字节的数据之后。
是否需要进行时钟延展取决于节点设备的功能。这里有两个例子。
根据不同的公司和制造商,在编写数据手册方面有不同的方法。作为一个开始,图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是一个两线制的总线,与飞利浦在1980年代开发的I2C总线相似。两个主要信号是时钟,即SMBCLK,和数据,即SMBDAT。I2C引脚和SMBus是相互兼容的,但也有明显的区别,如:
这是一个明确的要求,即SMBus设备在每次收到自己的地址时都必须确认(ACK),而不管该设备可能正在做什么。这保证了主设备可以准确地确定总线上有哪些设备在活动。
所有SMBus变化都是按照指定的SMBus协议进行的。
SMBus包括一个可选的信号,SMBALERT#,节点设备可以用它来快速通知主设备或系统主机它有信息给主设备,如报告一个故障状况。
图16. SMBus拓扑结构
图17. SMBus上拉电路
SMBus 地址长度为7位,通常表示为 4 位后跟 3 位后跟字母 b,例如 0001 110b。这些地址占据总线上 8 位字段的高 7 位。然而,该字段的低位具有另一种不属于 SMBus 地址的语义含义。
一个7位的目标地址从主机发送到总线上的一个或多个设备(一般调用地址)。、开始和停止条件是转换状态,而不是一个比特,并且在符号上方显示了比特数的数字。
图 19. SMBus 消息
表 6. SMBus 参数
符号 | 参数 | 单位 |
---|---|---|
SMBus 工作频率 | kHz | |
停止和启动条件之间的总线空闲时间 | μs | |
在(重复)启动条件后的保持时间 | μs | |
重复启动条件设置时间 | μs | |
停止条件设置时间 | μs | |
数据保持时间 | ns | |
数据建立时间 | ns | |
检测时钟低电平超时 | ms | |
时钟低电平周期 | μs | |
时钟高电平周期 | μs | |
除了SMBus之外,还有一个变种,即PMBus,它是一个开放标准的电源管理协议。这个灵活和高度通用的标准允许基于模拟和数字技术的设备之间进行通信,并提供真正的互操作性,这将降低设计复杂性,缩短电力系统产品的上市时间。
PMBus用于对带有电源控制和管理组件的电源进行数字管理。它的命令和结构满足电源管理的需求。这意味着I2C引脚和PMBus在电气要求和命令语义上是兼容和互通的。
电源管理中的一个基本参数是监测过压水平,而PMBus提供了一个设置和读取过压水平的命令。通过增加I2C底层和SMBus的可用功能,PMBus作为现有标准,特别是SMBus的基础上的协议层。
I2C规范只描述了2线总线的物理层、定时和流量控制。I2C规范没有描述信息的格式(像SMBus协议),也没有描述信息的内容。PMBus规范是一个完整的电源管理协议。它包括如何将比特和字节从一个设备获取到另一个设备(即传输);它还描述了一种命令语言,赋予这些比特和字节以意义。
对于冗余系统,一旦电源安装在系统中,有三个信号来设置电源的地址位置。地址2、地址1和地址0。对于非冗余系统,电源的设备地址位置应该是B0h。
所有地址 | 主要寻址,用于具有两个寻址引脚的大多数服务器电源 | 附近寻址,前提是电源上提供了三个寻址引脚 | ||||||
系统寻址 地址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设备可以共享一条总线。
表 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 |
本网站文章版权均为本人所有,未经同意不得私自搬运复制,欢迎注明引用出处的合理转载,图片转载请留言。文章内容仅用于技术研究和探索,不得用于违法目的。