I2C_pull_up_reg

本文最后更新于 2026年4月2日 晚上

I2C上拉电阻选择

I²C 总线是开漏/开集结构,需要外部上拉电阻(Rp)将信号线(SDA/SCL)拉高。上拉电阻的取值由总线电容(Cb)目标通信速率共同决定,核心在于满足信号上升时间(tr)的要求。

计算公式

  1. RC 充电公式
    信号从 30% VDD 上升到 70% VDD 所需的时间(即上升时间 tr)由以下公式决定:

    tr=0.8473×Rp×Cbt_r = 0.8473 \times R_p \times C_b

  2. 常数 0.8473 的来源
    这个常数是数学推导的结果。它来源于一阶 RC 充电电路方程,计算电压从 30% VDD 升至 70% VDD 所需时间的精确解:

    tr=RpCb×ln(0.70.3)0.8473×Rp×Cbt_r = R_p C_b \times \ln\left(\frac{0.7}{0.3}\right) \approx 0.8473 \times R_p \times C_b

    结论:0.8473 是理论计算出的固定常数,用于描述在标准工程定义下的上升时间。

  3. 取值范围的约束

    • 下限约束(电阻不能太小):由 GPIO 引脚的最大灌电流(Sink Current)能力决定,以防止损坏引脚。计算公式为:

      Imax=VDDRpI_{max} = \frac{V_{DD}}{R_p}

      此电流值应小于 GPIO 的规格(通常为 4-8 mA)。
    • 上限约束(电阻不能太大):由总线电容和通信速率决定,确保上升时间满足协议要求。电阻太大,RC 充电慢,上升沿过缓,会导致高速通信失败。

计算示例
假设总线电容 Cb 为 200 pF,需要在 400 kHz 模式下满足 tr < 300 ns 的要求。根据公式计算 Rp 的理论最大值:

Rp=tr0.8473×Cb=300×1090.8473×200×10121.77kΩR_p = \frac{t_r}{0.8473 \times C_b} = \frac{300 \times 10^{-9}}{0.8473 \times 200 \times 10^{-12}} \approx 1.77 k\Omega

考虑到余量,应选取比此值更小的电阻,例如 1.5 kΩ。

二、快速选型速查表

对于大多数应用,可以基于以下经验表格快速选择:

通信模式 速率 典型 Rp 值 (3.3V 系统) 典型 Rp 值 (5V 系统) 备注
标准模式 (Standard-mode) 100 kbps 4.7 kΩ - 10 kΩ 2.2 kΩ - 4.7 kΩ 最常用,兼顾速度与功耗。
快速模式 (Fast-mode) 400 kbps 1.5 kΩ - 3.3 kΩ 1.0 kΩ - 2.2 kΩ 需减小电阻以保证上升沿速度。
快速模式+ (Fast-mode Plus) 1 Mbps 680 Ω - 1.5 kΩ 470 Ω - 1.0 kΩ 功耗较大,需确认主从设备支持。

核心原因

  • 在相同速率下,5V 系统可以使用更小的 Rp,因为在相同电流下,5V 系统产生的电压变化(dV/dt)更快,更容易满足上升时间要求。
  • 高速模式必须用更小的 Rp 来对抗总线电容的影响,加速 RC 充电。

:实际取值应比计算值略小(留 20%-30% 裕量),以应对 PCB 寄生参数和温度漂移。

三、总结与决策路径

  1. 常规情况:3.3V 系统选用 4.7 kΩ,5V 系统选用 2.2 kΩ。这是最稳妥的起点。
  2. 高速/多负载情况:如果通信距离长、挂载设备多(总线电容 Cb 大),或使用快速模式(400k/1M),应选用更小的电阻(如 1.5kΩ 或 1kΩ)。
  3. 低功耗场景:如果对速度不敏感,可选用更大的电阻(如 10kΩ)以降低静态电流。
  4. 最终验证最可靠的方法是使用示波器观察 SCL 信号,确保上升沿陡峭、无过冲。如果上升沿圆滑,说明 Rp 太大或 Cb 太大,需要减小 Rp 或优化布线。

补充说明: 0.8473 的数学推导(RC 充电方程)

I²C 总线的上升沿被建模为一个一阶 RC 充电电路。其电压随时间变化的公式为:

V(t)=VDD(1et/τ)V(t) = V_{DD} \cdot (1 - e^{-t/\tau})

其中 τ=RpCb\tau = R_p \cdot C_bRC 时间常数

1. 定义工程阈值
在数字电路中,我们并不关心信号从 0% 充到 100% 的完整过程,而是关心它何时进入“有效逻辑区间”。标准定义如下:

  • V_IL(输入低电平阈值):0.3VDD0.3 \cdot V_{DD}
  • V_IH(输入高电平阈值):0.7VDD0.7 \cdot V_{DD}

2. 求解时间点
我们需要计算电压到达这两个阈值的时间差,即上升时间 trt_r

  • 到达 30% 的时间 t1t_1

    0.3VDD=VDD(1et1/τ)0.3V_{DD} = V_{DD}(1 - e^{-t_1/\tau})

    et1/τ=0.7e^{-t_1/\tau} = 0.7

    t1=ln(0.7)τ0.3567τt_1 = -\ln(0.7) \cdot \tau \approx 0.3567 \cdot \tau

  • 到达 70% 的时间 t2t_2

    0.7VDD=VDD(1et2/τ)0.7V_{DD} = V_{DD}(1 - e^{-t_2/\tau})

    et2/τ=0.3e^{-t_2/\tau} = 0.3

    t2=ln(0.3)τ1.2040τt_2 = -\ln(0.3) \cdot \tau \approx 1.2040 \cdot \tau

3. 得出系数

tr=t2t1=[ln(0.3)+ln(0.7)]τ=ln(0.70.3)τt_r = t_2 - t_1 = [-\ln(0.3) + \ln(0.7)] \cdot \tau = \ln\left(\frac{0.7}{0.3}\right) \cdot \tau

tr0.8473RpCb\boxed{t_r \approx 0.8473 \cdot R_p \cdot C_b}

结论:0.8473 是计算 ln(0.7/0.3)\ln(0.7/0.3) 得到的纯数学常数,它精确描述了在 30%-70% 区间内的 RC 充电速度。


在工程中,时间常数 τ=R×C\tau = R \times C 是一个基准单位,它衡量了电容充电/放电的“惯性”。

为什么 I²C 不直接用 τ\tau 而用 0.8473τ\tau

  • τ\tau (63%):是物理学的通用度量,用于描述“变化快慢”的基准。
  • 0.8473τ\tau (30%-70%):是数字逻辑的特定定义。因为芯片的输入引脚只有在电压超过 V_IH (70%) 时才确认为高电平,低于 V_IL (30%) 确认为低电平。0.8473τ\tau 直接决定了信号能否被正确采样,是时序约束的直接体现。


I2C_pull_up_reg
https://blog.zimablue.fun/Hardware/I2C-pull-up-reg/
作者
zimablue1996
发布于
2026年4月2日
许可协议