推挽输出和开漏输出有什么区别?为什么 I²C 必须使用开漏输出?
发布时间:2026/9/10 23:29:37 作者:尧图编辑部 阅读量:1,286

推挽输出和开漏输出有什么区别为什么 I²C 必须使用开漏输出在嵌入式开发中我们经常会遇到 GPIO 输出模式的选择推挽输出Push-Pull开漏输出Open-Drain / Open-Collector很多初学者知道GPIO 可以配置成推挽或者开漏但是不知道为什么 I²C 总线一定要求开漏输出。为什么普通 GPIO 控制 LED、电机喜欢使用推挽为什么 I²C、SMBus 等通信协议却必须采用开漏这篇文章从 MOS 管结构开始详细分析两者区别以及 I²C 使用开漏输出背后的设计思想。一、GPIO 输出本质是什么MCU 的 GPIO 输出本质上是控制内部 MOS 管的导通状态。一个数字输出需要实现两个状态逻辑电压0接近 GND1接近 VCC例如3.3V MCU逻辑1 ≈ 3.3V 逻辑0 ≈ 0V那么问题来了一个芯片如何让一个引脚输出高电平或者低电平答案通过控制内部晶体管。常见有两种结构推挽输出开漏输出二、推挽输出Push-Pull工作原理1. 推挽结构推挽输出内部由两个 MOS 管组成PMOSNMOS结构如下VCC | PMOS | -------- OUT | NMOS | GND两个 MOS 管像一个推拉组合PMOS负责拉高NMOS负责拉低所以叫Push推高 Pull拉低2. 输出高电平当 MCU 输出GPIO 1内部PMOS 导通 NMOS 截止电流路径VCC | PMOS | OUT结果OUT ≈ VCC输出高电平。3. 输出低电平当 MCU 输出GPIO 0内部PMOS 截止 NMOS 导通电流路径OUT | NMOS | GND结果OUT ≈ 0V输出低电平。三、推挽输出特点优点1. 驱动能力强因为高低电平都有 MOS 管主动驱动。例如控制 LEDGPIO ---- LED ---- GNDGPIO 可以直接提供电流。2. 速度快因为拉高由 PMOS 完成拉低由 NMOS 完成不存在等待过程。适合SPIPWM普通GPIO电机控制缺点多个设备不能直接连接例如两个芯片连接MCU_A GPIO1 MCU_B GPIO0结果3.3V | PMOS | | ------ | GND | NMOS一个芯片想输出高另一个芯片想输出低。这叫输出冲突产生巨大电流VCC → GND可能导致总线损坏芯片发热通信异常所以推挽适合单点驱动不适合多设备共享总线。四、开漏输出Open Drain工作原理1. 开漏结构开漏输出只有一个 NMOSVCC | 上拉电阻 | ------- OUT | NMOS | GND注意没有 PMOS。所以开漏只能主动拉低不能主动输出高。2. 输出低电平GPIO输出0NMOS导通电流OUT | NMOS | GND结果OUT0V3. 输出高电平GPIO输出1NMOS关闭此时没有任何器件主动输出高。怎么办依靠外部上拉电阻例如3.3V | 10KΩ | OUT电阻把电压慢慢拉到OUT≈3.3V所以开漏输出低电平自己拉低高电平靠外部拉高五、推挽 vs 开漏区别总结对比推挽输出开漏输出内部结构PMOSNMOSNMOS输出高主动输出依靠上拉输出低主动输出主动拉低速度快较慢驱动能力强弱是否允许多个设备连接否可以是否支持线与否支持典型应用GPIO、SPII²C、SMBus六、为什么 I²C 必须使用开漏输出I²C 最大特点多个设备共享同一组线路。I²C只有两根线SDA 数据线 SCL 时钟线例如SDA ---------------------- | 主设备 | 从设备1 | 从设备2多个设备挂在同一根线上。那么问题来了如果使用推挽设备ASDA1设备BSDA0马上发生高电平对抗低电平导致短路风险。七、开漏如何解决这个问题开漏采用线与逻辑规则所有设备释放 高 任意设备拉低 低例如三个设备设备1 释放 设备2 释放 设备3 拉低 结果 SDA0因为只要一个设备打开 NMOS总线就是低电平。八、I²C为什么叫“线与”数字逻辑传统1 1 1I²C1 AND 1 1 1 AND 0 0 0 AND 1 0也就是所有设备都是1 总线才是1 任何设备是0 总线就是0这就是Wired-AND线与九、开漏还能实现电平转换另一个重要原因I²C支持不同电压设备通信。例如MCU3.3V传感器5V连接5V | 10K | ------- SDA | 10K | 3.3V通过不同电压上拉可以实现3.3V MCU ↓ 5V设备无需额外转换芯片。推挽无法做到。十、为什么 I²C速度没有SPI快原因之一开漏需要上拉电阻。拉高过程不是MOS主动拉高。而是VCC | R | C | SDA形成RC充电。所以上升时间tr ≈ 0.847 × R × C速度越高要求更小电阻更小电容因此I²C100kHz400kHz高速1MHz而 SPI几十MHz。十一、实际开发中的应用选择使用推挽例如LED控制GPIO → LEDSPIMOSI SCK CSPWM定时器输出使用开漏例如I²CSDA SCLSMBus服务器电源管理中断共享例如多个设备INT | MCU十二、总结一句话推挽输出既能主动拉高也能主动拉低速度快、驱动力强但是多个设备连接容易冲突。开漏输出只能主动拉低高电平依靠上拉电阻实现多个设备安全共享同一条总线。I²C必须使用开漏输出是因为它需要实现多设备共享总线线与逻辑避免输出冲突支持不同电压通信所以GPIO控制 → 推挽总线通信 → 开漏这就是为什么SPI喜欢推挽而I²C选择开漏。