I2C 开漏输出与上拉电阻

本文介绍了I2C总线的工作原理,重点讲解了开漏输出与上拉电阻的作用。开漏输出允许设备通过拉低总线电平来实现线与功能,而上拉电阻则确保总线在未被占用时保持高电平。此外还讨论了上拉电阻对通信速率和功耗的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开漏输出与上拉电阻

关于总线连接的物理特性,官方文档中还有这样的介绍:

SDA 和 SCL 都是双向线路都通过一个电流源或上拉电阻连接到正的电源电压。当总线空闲时,这两条线路都是高电平 连接到总线的器件输出级必须是漏极开路或集电极开路才能执行线与的功能 。

注意到这样一句话:「连接到总线的器件输出级必须是漏极开路或集电极开路才能执行线与的功能 」,这里就涉及到「漏极/集电极开路」、「上拉电阻」和「线与」两个概念,而这绝对可以算得上是实现 I2C 总线协议的关键所在

在芯片中,当一个输出级为漏极/集电极开路时(开漏输出),它只能输出低电平和高阻态,低电平我们了解,那「高阻态」又是个什么东西?高阻态可理解为通过很大的电阻把输出引脚与 MCU 芯片内部隔开,近似开路的状态(电阻非常大)。这时芯片无法控制输出的电平,引脚的电平不确定,可被外部电平轻松改变。开漏输出可以简单理解为输出处接一个开关,闭合时接低电平,断开时悬空(啥也不接)。下图的中间部分电路就很好地说明这种状态。


资料来源:单片机I/O口推挽输出与开漏输出的区别(转) - xiaoweiboy的专栏 - 博客频道 - youkuaiyun.com

正是由于开漏输出的「要么拉低要么放手」的特性,使得总线只受输出端低电平的影响(同样,设备也只能通过输出低电平来使用总线),从而实现了「线与」的功能。和「逻辑与」一样,「线与」所表达的意思是 —— 当总线上只要有一个设备输出低电平,整条总线便处于低电平状态,这时候的总线被称为占用状态。

然而 I2C 总线电路的真正主角,是连接总线到 VCC 的两个上拉电阻。根据前面的分析我们知道,输出端只能输出低电平或高阻态,是不能把总线拉高的,自然而然就需要通过其他方式为总线提供高电平,上拉电阻就担负了这个重任 —— 当输出端输出高阻态时且没有其他设备拉低总线(占用总线)时,总线被外部的上拉电阻拉高、呈现出高电平状态,这不正是我们的「线与」功能么。

不仅如此,利用「线与」特性还可以实现总线的仲裁、时钟的同步,更牛逼的是,在整个过程中数据完全不会丢失。我甚至觉得 I2C 协议相对于其他串行通信协议最大的优势就是通过「开漏输出」和「上拉电阻」两个物理特性大大简化了协议整体的设计和实现


上拉电阻阻值对 I2C 协议的影响

需要补充说明的一点是,两个上拉电阻的大小并不是随便用的,涉及到通信速率与功耗的取舍。协议层对电平的变化时间有着严格的要求与限制,而电平的变化受总线电气特性的影响。

对总线而言,上拉电阻越大,信号的上升时间就越长,通信速率就越低,反之亦然。但电阻也并不是越小越好,阻值过小的话,总线低电平时电阻上的大电流会增加电路的功耗。此外,电容也会影响信号的上升时间,于是就有了 I2C 总线总电容 400 pf 的限制,这直接关系到总线上可挂载设备的数目。

<think>好的,我现在需要帮用户计算输出电路中上拉电阻的阻值。根据之前的引用内容,用户提到了上拉电阻的选择需要考虑功耗、速度、电压水平和驱动能力等因素。首先,我得整理这些因素之间的关系。 首先,用户的问题是如何计算这个电阻值。根据引用[2],上拉电阻R和负载的关系会影响输出电压,公式是5*r/(r+1000),这里的1000可能是指内部电阻。不过可能更一般的情况是,上拉电阻R需要确保在输出高电平时,电压达到逻辑高电平的最小值。比如,如果电源是Vcc,逻辑高要求至少Vih,那么根据分压公式,R的最大值由负载决定。 然后,引用[3]提到上升时间受R和寄生电容C影响,时间常数是R*C。所以需要平衡速度和功耗。电阻越大,上升时间越长,但功耗低;反之,电阻小,速度快,但功耗高。 另外,当输出低电平时,晶体管导通,电流从Vcc通过上拉电阻和晶体管到地,这时候电流I = Vcc/R。这个电流不能超过晶体管的最大灌电流能力,否则会损坏器件。所以R的最小值由I_max决定,即R ≥ Vcc/I_max。 还有,当多个输出连接在一起时,比如I2C总线,需要考虑总线上所有设备的电流总和,这时候上拉电阻需要足够小,以确保在总电流下电压不会降到Vih以下。这可能涉及到更复杂的计算,但用户可能只是问单个情况。 所以综合起来,计算步骤应该是: 1. 确定电源电压Vcc和逻辑高电平的最低要求Vih。 2. 确定负载电流和电流,计算最大允许电阻以确保Voh ≥ Vih。 3. 确定最大允许电流(由器件规格决定),计算最小电阻R_min = Vcc / I_max。 4. 考虑上升时间需求,根据t = 0.35/(频率)或时间常数RC,选择R ≤ t/(C)。 5. 在R_min和R_max之间选择合适值,通常取中间值或根据优先级(速度或功耗)调整。 可能还需要考虑温度等因素,但用户可能只需要基本计算。要检查是否有遗的引用内容,比如引用[1]提到下降沿由内部驱动,上升沿由外部电阻,所以上升时间更重要。因此,电阻的选择要在速度和功耗之间权衡。 总结:给出计算公式,考虑高低电平时的电流和电压,以及时间常数,然后步骤说明如何选择。</think>### 分步解答:输出上拉电阻计算 输出电路中上拉电阻的阻值需通过**电压需求**、**电流限制**和**信号速度**三方面综合计算,具体步骤如下: --- #### 一、电压需求计算(确保高电平达标) 当输出高电平时,电流通过上拉电阻流向负载,需满足: $$V_{OH} = V_{CC} \cdot \frac{R_{load}}{R_{pullup} + R_{load}}} \geq V_{IH(min)}$$ 其中: - $V_{CC}$:电源电压(例如5V) - $R_{load}$:负载等效阻抗 - $V_{IH(min)}$:逻辑高电平最小识别电压(例如3.5V) 若负载阻抗$R_{load}$远大于$R_{pullup}$,可简化为: $$R_{pullup} \leq \frac{V_{CC} - V_{IH(min)}}{I_{leakage}}$$ 其中$I_{leakage}$为总电流(来自所有并联负载)[^2]。 --- #### 二、电流限制计算(防止器件过载) 当输出低电平时,晶体管需承受电流: $$I_{OL} = \frac{V_{CC}}{R_{pullup}} \leq I_{OL(max)}$$ 其中$I_{OL(max)}$为晶体管最大灌电流(见器件手册)。 由此得**最小电阻值**: $$R_{pullup(min)} = \frac{V_{CC}}{I_{OL(max)}}$$ 例如,若$V_{CC}=5V$,$I_{OL(max)}=20mA$,则$R_{pullup(min)}=250Ω$[^3]。 --- #### 三、信号速度计算(控制上升时间) 上升时间由$R_{pullup}$寄生电容$C$(含线路电容和负载电容)决定: $$t_r = 2.2 \cdot R_{pullup} \cdot C$$ 若系统要求最大上升时间$t_{r(max)}$,则: $$R_{pullup} \leq \frac{t_{r(max)}}{2.2 \cdot C}$$ 典型应用中,$C$取50~200pF,高速信号需选择较小电阻[^3]。 --- #### 四、综合取值原则 1. **满足不等式**:$R_{pullup(min)} \leq R_{pullup} \leq R_{pullup(max)}$ 2. **优先方向**: - 高速场景:取接近$R_{pullup(min)}$ - 低功耗场景:取接近$R_{pullup(max)}$ 3. **典型值参考**: - I²C总线:1kΩ~10kΩ(5V系统常用4.7kΩ) - GPIO低速信号:10kΩ~100kΩ --- ### 示例计算 假设:$V_{CC}=3.3V$,$I_{OL(max)}=8mA$,$C=100pF$,$t_{r(max)}=1μs$ 1. **电流限制**:$R_{pullup(min)} = 3.3V / 8mA = 412.5Ω$ 2. **速度限制**:$R_{pullup} \leq 1μs / (2.2 \cdot 100pF) ≈ 4.5kΩ$ 3. **综合选择**:在412Ω~4.5kΩ间选取,若侧重速度可选1kΩ,侧重功耗可选4.7kΩ。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值