内置集成电路总线协议 I²C 简明指南

内置集成电路总线(Inter-Integrated Circuit)是一种串行通信协议,其英文缩写为 I²C,因为中间存在 2 个英文字母 I,所以被读作 I Square C,中文读作 I 平方 C 或者 I 方 C 总线。本文后续内容为了书写方便,会将 I²C 简写为 I2C。该总线协议需要串行数据线(SDA,Serial Data)和串行时钟线(SCL,Serial Clock)两条信号线,接线方式较为简单,通常用于连接微控制器、存储器、传感器等低速元器件。

I²C 总线通信协议当中,规定总线上可以存在一个主设备以及多个从设备主设备掌控着整个通信过程,负责发起、控制、停止通信。而从设备则需要等待主设备请求、接收、发送数据。主设备与从设备之间的数据交换采用特定的数据帧格式,每个数据帧包含有 地址数据控制 信息。主设备会根据从设备的 I2C 地址来选择总线上需要进行通信的外设,从设备则根据控制信息返回相应的响应。

演进历程

1982荷兰飞利浦(Philips)公司为自家的芯片产品制订了 I²C 总线技术规范,原始规范只能提供 100kHz 的通信速率,以及 7 位的地址空间(由于存在有保留地址,总线上设备数量被限制为 112 个)。后续在 1992 年发布了第一个公共规范,增加了 400kHz 快速模式,以及扩展的 10 位地址空间。经过多年的发展,目前 I2C 协议规范已经能够提供下面表格当中的五种工作速率模式:

I2C 总线模式 英文名称 典型传输速率
标准模式 Standard Mode 100 KHz
快速模式 Fast Mode 400 KHz
增强快速模式 Fast Mode Plus 1 MHz
高速模式 High-Speed Mode 3.4 MHz
极速模式 Ultra-Fast Mode 5 MHz

注意英特尔(Intel)公司于 1995 年推出的系统管理总线SMBus,System Management Bus)是一种基于 I2C 总线演变而来的变体,其提供了更加严格的控制模式,传输速率被限制在 10kHz ~ 100kHz 范围之间,并且支持时钟超时、固定逻辑电平(I2C 的逻辑电平由总线上拉电阻连接的 VCC 决定)等特性。

漏极开路设计

芯片内置的 I2C 总线驱动器,通常采用漏极开路设计(不同于 UART 和 SPI 总线),这意味着其可以将总线信号线拉低,但不能将总线信号驱动为高电平。从而在一个设备试图将 I2C 总线驱动为高电平,而另外一个设备又试图将总线电平拉低的时候,不会出现争抢总线资源的情况,从而避免损坏芯片内部的 I2C 总线驱动器,以及随之带来的功耗过大问题。正是因为如此,I2C 总线的信号线上都会存在一个上拉电阻 ,用于协助总线恢复到高电平状态。

注意:I2C 上拉电阻的选型需要根据总线上的主从设备进行选型(后续的内容会给出理论指导),但一个好的经验法则是从 4.7kΩ 电阻开始,然后逐步向下进行调整。

探究上拉电阻的取值

上拉电阻的推导

I2C 总线是一种采用了漏极开路(Open-Drain)或者集电极开路(Open-Collector)的通信标准,因而可以支持具有不同工作电压的芯片和传感器相互通信。如下图所示,当总线没有被芯片引脚内部的漏极开路下拉为低电平时,I2C 总线的上拉电阻就会将总线电平进行拉高:

芯片 I2C 引脚内部的输入缓冲器,所能够读取的最小有效低电平 \(V_{OL}\) 决定了上拉电阻最小值 \(R_{P_{min}}\)

\[ R_{P_{min}} = \frac{V_{CC} - V_{OL_{max}}}{I_{OL}} \]

上拉电阻最大值 $R_{P_{min}} $ 受限于 I2C 总线的等效电容 \(C_B\),I2C 总线规范当中定义了信号的上升时间(Rise Time),如果上拉电阻的取值过大,可能会导致 I2C 总线在被下拉之前,没有足够的时间上升到有效的逻辑高电平。从时间 \(t=0\) 开始,RC 电路对振幅为 VCC 的电压阶跃响应,可以使用 RC 时间常数进行表示,因此 I2C 总线上的电压波形可以表达为下面的方程:

\[ V(t) = V_{CC} \times \bigg( 1 - e^{\frac{-t}{R_P \times C_B}} \bigg) \]

注意RC 时间常数 \(\tau\) 是指电阻值 \(R\) 与电容值 \(C\) 的乘积,其单位为,表达的是电容器通过电阻器进行充电放电的时间特性。

通常情况下,I2C 总线上的输入高电平电压(Input High Voltage)\(V_{IH}\)输入低电平电压(Input Low Voltage)\(V_{IL}\)上拉参考电压 \(V_{CC}\) 之间的关系可以表达为如下的方程组:

\[ \begin{cases} V_{IH} = 0.7 \times V_{CC} = V_{CC} \times \big(1 - e^{\frac{-t_1}{R_P \times C_B}} \big) \\ V_{IL} = 0.3 \times V_{CC} = V_{CC} \times \big(1 - e^{\frac{-t_2}{R_P \times C_B}} \big) \end{cases} \]

基于上述方程组,可以将 I2C 总线信号的上升时间 \(t_R\) 描述为下面的公式:

\[ t_R = t_2 - t_1 = 0.8473 \times R_P \times C_B \]

由此,就可以推导出上拉电阻最大值 \(R_{P_{max}}\)上升时间 \(t_R\) 之间的函数关系:

\[ R_{P_{max}} = \frac{t_R}{0.8473 \times C_B} \]

推导出上拉电阻的最小值 \(R_{P_{min}}\) 与最大值 \(R_{P_{max}}\) 之后,就可以根据预定的传输速率和功率进行恰当的取值,较小的阻值可以带来更快的响应速度,较大的阻值则会带来更少的功率耗散。

I2C 总线规范参数

I2C 总线协议规范当中,对于前面内容提到的 \(t_R\)\(C_B\)\(V_{OL}\) 参数作出了如下定义:

参数名称 描述 标准模式(最大) 快速模式(最大) 增强快速模式(最大)
\(t_R\) SDA 和 SCL 信号的上升时间 1000 ns 300 ns 120 ns
\(C_B\) I2C 传输线等效电容 400 pF 400 pF 550 pF
\(V_{OL}\) 低电平输出电压(3mA 电流源,\(V_{CC} > 2V\) 0.4 V 0.4 V 0.4 V
  低电平输出电压(2mA 电流源,\(V_{CC} \leq 2V\) - \(0.2 \times V_{CC}\) \(0.2 \times V_{CC}\)

下面图像表达了 I2C 总线在标准模式和快速模式下,上拉电阻最小值 \(R_{P_{min}}\)上拉参考电压 \(V_{CC}\) 之间的关系:

下面图像表达了 I2C 总线在标准模式和快速模式下,上拉电阻最大值 \(R_{P_{max}}\)上拉参考电压 \(V_{CC}\) 之间的关系:

上拉电阻计算实例

当一个 I2C 总线处于快速模式下的时候,已知传输线等效电容 \(C_B = 200pF\)总线参考电压 \(V_{CC} = 3.3V\) 参数,通过如下步骤就可以计算出上拉电阻的阻值:

\[ \begin{cases} R_{P_{max}} = \frac{t_R}{0.8473 \times C_B} = \frac{300 \times 10^{-9}}{0.8473 \times 200 \times 10^{-12}} = 1.77 kΩ \\ R_{P_{min}} = \frac{V_{CC} - V_{OL_{max}}}{I_{OL}} = \frac{3.3 - 0.4}{3 \times 10^{-3}} = 966.667 Ω \end{cases} \]

注意:上述计算步骤采用了前面 I2C 总线规范参数表格当中的数据,

经过上述的计算步骤,就可以基于当前的速率功耗需求,选择 966.667Ω ~ 1.77kΩ 范围之间的任意上拉电阻值。

内置集成电路总线协议 I²C 简明指南

http://www.uinio.com/Electronics/I2C/

作者

Hank

发布于

2025-09-06

更新于

2025-09-08

许可协议