1.I²C的输出模式

I²C 的 SDA、SCL 线都是 开漏/开集电极输出(open-drain/open-collector)

开漏输出 : MCU内部通常集成了MOSFET来控制IO口的开关,对于开漏输出,MOSFET可以开启,控制引脚接地,为低电平,但是如果关闭则会导致引脚悬空(此时引脚的电平进入不确定状态,很显然这样不可靠),此时内部又加上了一个几十K到几百K的上拉电阻,形成弱上拉(保证MOSFET关闭状态下默认高电平),此时电流很小,这只适合“保持默认高电平”,不能满足 I²C 高速通信对上升沿的要求。

如果需要外接上拉电阻,建议关闭MCU或者电子器件的内部上拉

2.电路图分析(非IIC标准电路)

在这里插入图片描述

  • 图片里面没有表示出MCU内部弱上拉的电路图,但是有外部上拉电路图,并且连接一个电子器件,器件内部的阻抗必须远大于外接的上拉电阻,这样能够极大的减小3.3V流到节点的电流,减小电流就能减小电压损耗,此时就可以保证节点的电压保持在接近3.3V,然后作为高阻输入,R2通常是远大于R1的,R2是让输入保持默认高阻状态,即芯片默认关闭,但是R1 才是保证 IO 能真正输出高电平的关键,所以外接一个上拉电阻用来保证能够上拉输出。

    • 上拉电阻越小 ,上升沿越快(好处),但功耗更大(坏处)。

    • 上拉电阻越大,上升沿越慢,功耗降低,但是如果是IIC快速通讯会导致上升沿速度太慢,信号畸形,通信错误

    • 当内部MOS管打开后,有一个导通电阻(图中未标出),这个导通电阻非常小,通常为几毫欧到几欧,远小于R2,节点通过低电阻直接接到地,此时电压输出为0,即没有电压经过R2,电子期间不会激活

      • R2就是为了维持输入的高阻态,保证在没有外部驱动的情况下关闭,保持引脚为低电平,即高电平输入来激活电子器件

2.1.MOS管断开的情况下的电路分析:

  • VCC — R1 — 节点 — R2 — GND(MOS 断开不参与)
  • 这就是一个电阻分压网络,电流为:
    I = V C C R 1 + R 2 I= \frac {V_ {CC}}{R_ {1}+R_ {2}} I=R1+R2VCC
  • 节点电压(EN脚电压)为:
    V E N = V C C ⋅ R 2 R 1 + R 2 V_{EN} = V_{CC} \cdot \frac{R_2}{R_1 + R_2} VEN=VCCR1+R2R2
  • 为了让 V_BE接近V_CC,需要 R2≫R1:
    例: 𝑉 𝐶 𝐶 = 3.3 V , 𝑅 1 = 10 𝑘 Ω , 𝑅 2 = 100 𝑘 Ω , V C C ​ = 3.3 V , R 1 ​ = 10 k Ω , R 2 ​ = 100 k Ω 例:𝑉𝐶𝐶=3.3V,𝑅1=10𝑘Ω,𝑅2=100𝑘Ω,VCC​=3.3V,R1​=10kΩ,R2​=100kΩ 例:VCC=3.3V,R1=10kΩ,R2=100kΩVCC=3.3V,R1​=10kΩ,R2​=100kΩ
    I = 3.3 110 k ≈ 30   μ A , V E N = 3.3 ⋅ 100 110 ≈ 3.0  V I = \frac{3.3}{110k} \approx 30\ \mu A,\quad V_{EN} = 3.3 \cdot \frac{100}{110} \approx 3.0\ \text{V} I=110k3.330 μA,VEN=3.31101003.0 V
  • 上拉还要“克服”EN脚的 输入漏电流(设为 I_leak),MOS 关断时,会有一股很小的直流电流从 VCC 经 R1 → 节点 → R2 → GND 流过,这股电流在节点上形成的分压把节点“抬高”,所以上拉电阻需要考虑到漏电流和抬升的电压
    V E N = V C C − I p u l l ⋅ R 1 , I p u l l = I l e a k + V E N R 2 V_{EN} = V_{CC} - I_{pull} \cdot R_1,\quad I_{pull} = I_{leak} + \frac{V_{EN}}{R_2} VEN=VCCIpullR1,Ipull=Ileak+R2VEN
  • 只要 I_leak 很小、R_2很大,I_pull 就很小,V_EN就会非常接近V_CC。

2.2.MOS管闭合的情况下的电路分析:

  • VCC — R1 — 节点 — MOS(on) — GND 电流几乎不流向R2,导致R2附近电压全为0
  • 大多数MOS闭环导通的电阻会远小于外接上拉电阻,节点电压结算:
    V E N = V C C ⋅ R D S ( o n ) R 1 + R D S ( o n ) ≈ 0 V_{EN} = V_{CC} \cdot \frac{R_{DS(on)}}{R_1 + R_{DS(on)}} \approx 0 VEN=VCCR1+RDS(on)RDS(on)0
  • 上拉电流:
    I = V C C R 1 + R D S ( o n ) ≈ V C C R 1 I = \frac{V_{CC}}{R_1 + R_{DS(on)}} \approx \frac{V_{CC}}{R_1} I=R1+RDS(on)VCCR1VCC
    R 1 = 10 k Ω , R D S ( o n ) = 50 Ω ⇒ V E N ≈ 16  mV ,   I ≈ 0.33  mA R_1 = 10k\Omega , R_{DS(on)} = 50\Omega \Rightarrow V_{EN} \approx 16\ \text{mV},\ I \approx 0.33\ \text{mA} R1=10kΩ,RDS(on)=50ΩVEN16 mV, I0.33 mA
  • 开漏只能“拉低”,不会主动拉高。没有 R1,MOS 关断时节点就是悬空(或只被 R2 往地拉)→ 得不到高电平。
  • R2 的作用是“默认下拉,防误使能”;R1 的作用是“当 MOS 关断时提供上拉电流,把节点电压抬到高电平”。两者分工不同。

3.如何选择上拉电阻的阻值

低电平到高电平的转化在细分的时间刻度下并不是瞬间完成的,它需要有一个爬升的过程,而上拉电阻越大,爬升的越慢,上拉电阻越小,驱动能力越强,爬升的越快,在IIC标准中,在400KHZ的快速模式下,上升时间 t_r <= 300ns
电平上升波形图:
电平上升波形图

  • I²C 总线的信号线(SDA 和 SCL)会受到寄生电容的影响,并且影响高电平的上升速度,高电阻会影响电容的充电速度,这些寄生电容主要来源于:

    • 引脚输入电容:每个设备的 I²C 引脚都会有一定的输入电容,通常为几 pF 到几十 pF。
    • PCB 走线电容:印刷电路板上的走线也会引入电容,通常每厘米约为 1~2 pF。
    • 杜邦线电容:杜邦线的长度和材质会影响电容,通常每厘米约为 50~100 pF/m。
  • 可以根据需要挂载的从机数量以及线束的长度,PCB走线的长度估算出总电容

    • 上拉电阻和寄生电容形成一个 RC 电路,所以可以通过RC电路来计算电平上升时间

    • t r ​ ≈ 2.2 ⋅ R p ​ ⋅ C t o t a l ​ t r ​ ≈2.2⋅R p ​ ⋅C total ​ tr2.2RpCtotal

      • R p ​是上拉电阻; C t o t a l ​是总线电容。 R p ​ 是上拉电阻; C total ​ 是总线电容。 Rp是上拉电阻;Ctotal是总线电容。
    • 根据公式来计算所需的上拉电阻

  • 一般建议2.7K到4.7k之间能满足20cm走线的400KHZ高速通信

示例电路:
在这里插入图片描述

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐