第4篇:《面试题:推挽输出和开漏输出有什么区别?为什么两个推挽接一起会烧IO?》
大家好,我是老张。
上一篇文章讲了I2C的上拉电阻,里面反复提到一个概念:I2C用开漏输出,不能用推挽。有兄弟曾经这么问我:“开漏和推挽到底有什么区别?为什么推挽接一起会烧?”
这个问题问得好。面试中这几乎是必考题,而且大部分人只答得出皮毛——推挽能推能拉,开漏只能拉低——再往下追问就卡住了。今天老张就把这两种输出模式从内部电路讲到实战应用,让你面试时有底气一口气说到面试官喊停。
目录
一、面试官问这道题,到底在考什么?
二、第一层:基本定义——两种输出模式到底差在哪?
2.1 推挽输出——能推能拉,力大砖飞
2.2 开漏输出——只能拉低,不能拉高
2.3 一张表记住核心区别
三、第二层:从内部电路结构理解——为什么推挽能拉高,开漏不行?
3.1 推挽输出的内部结构
3.2 开漏输出的内部结构
3.3 追问:“为什么开漏输出不能直接改成推挽?加个P管不就行了?”
四、第三层:为什么推挽不能并接,开漏可以?——总线冲突的原理
4.1 两个推挽输出接在一起会怎样?
4.2 开漏输出为什么可以并接?
4.3 追问:“如果我把两个推挽输出设为开漏模式,是不是也能并接了?”
五、实战应用——哪些场景用推挽,哪些用开漏?
5.1 必须用推挽的场景
5.2 必须用开漏的场景
5.3 电平转换——开漏输出的独特优势
六、翻车实录——我亲历的推挽并接事故
七、满分回答模板
八、总结
一、面试官问这道题,到底在考什么?
表面上是考两个名词解释,实际上有三个考察层次:
第一层:知不知道两种模式的基本定义和区别?能说出“推挽高低都能驱动,开漏只能拉低需要上拉”。60分。
第二层:能不能从内部电路结构解释为什么?能画出PMOS和NMOS的组合方式,说清楚电流流向。80分。
第三层:知不知道为什么推挽不能并接、开漏可以?能不能举出实际应用场景?从总线冲突的原理讲到I2C和SPI的选型理由。95分。
到第三层还能主动说出“开漏能实现电平转换”和“线与逻辑”,那面试官基本就没什么好追问的了。
二、第一层:基本定义——两种输出模式到底差在哪?
2.1 推挽输出——能推能拉,力大砖飞
推挽输出的内部结构是一对互补的MOS管:上面一个P沟道MOS管接VDD,下面一个N沟道MOS管接GND。
输出高电平:P管导通,N管截止。输出通过P管直接连到VDD,驱动电流从VDD经P管流向负载。驱动能力强,能把电压拉到接近VDD。
输出低电平:N管导通,P管截止。输出通过N管直接连到GND,电流从负载经N管流向地。同样驱动能力强,能把电压拉到接近0V。
一句话:推挽输出自己就能输出强高电平和强低电平,不需要外部帮助。
2.2 开漏输出——只能拉低,不能拉高
开漏输出的内部结构只有下面那个N沟道MOS管,上面那个P管不存在。
输出低电平:N管导通,输出接地,电流从外部上拉电阻经N管流向地。低电平驱动能力取决于N管的导通电阻。
输出“高电平”:N管截止,输出端什么都不接,处于高阻状态。高电平从哪来?只能靠外部上拉电阻把输出拉到VDD。
一句话:开漏输出只能主动输出低电平,高电平靠外部电阻“拽”上去。
2.3 一张表记住核心区别
| 维度 | 推挽输出 | 开漏输出 |
|---|---|---|
| 内部结构 | PMOS+NOMS,一对互补管 | 只有NOMS,上面悬空 |
| 输出高 | P管导通,主动拉高到VDD | 外部上拉电阻拉到VDD |
| 输出低 | N管导通,主动拉低到GND | N管导通,拉低到GND |
| 驱动能力 | 高低电平都强 | 低电平强,高电平取决于上拉电阻 |
| 速度 | 快,边沿陡 | 受上拉电阻和寄生电容限制 |
| 多路并联 | 不行,会烧 | 可以,线与逻辑 |
| 电平转换 | 不支持 | 支持,上拉电阻接目标电压即可 |
三、第二层:从内部电路结构理解——为什么推挽能拉高,开漏不行?
这一层是面试时的分水岭。能背定义的人很多,能画出内部电路解释原理的人很少。
3.1 推挽输出的内部结构
推挽输出的输出级有两个MOS管串联在VDD和GND之间:
VDD │ ├── P-MOS(上管) │ ├── 输出引脚 │ ├── N-MOS(下管) │ GND
输出高电平时:P-MOS导通,N-MOS截止。电流从VDD→P管→输出引脚→负载→地。P管导通电阻很小(几Ω到几十Ω),能提供几十mA的驱动电流,引脚电压接近VDD。
输出低电平时:N-MOS导通,P-MOS截止。电流从负载→输出引脚→N管→GND。N管导通电阻同样很小,能把引脚电压拉到接近0V。
关键点:两个MOS管永远不会同时导通(芯片内部有死区控制),否则VDD和GND之间直接短路,芯片瞬间烧毁。
3.2 开漏输出的内部结构
开漏输出只有下面那个N-MOS,上面的P-MOS不存在:
输出引脚 │ ├── N-MOS(下管) │ GND 上管位置是空的,输出引脚对外呈现高阻
输出低电平:N-MOS导通,引脚拉到GND。
输出高电平:N-MOS截止,引脚什么都不接,对外呈现高阻态。如果没有外部上拉电阻,引脚就悬空。
关键点:开漏输出的“高电平”不是芯片主动输出的,是靠外部上拉电阻从VDD“借”来的。
3.3 追问:“为什么开漏输出不能直接改成推挽?加个P管不就行了?”
这个问题考的是“为什么要发明两种输出模式”,能答出来说明你理解了设计意图。
加个P管技术上当然能做到,但加了之后:
多个设备的输出就不能并接在一起了(原因下一节详细说)
不能通过外接不同电压的上拉电阻实现电平转换
不能实现“线与”逻辑
所以开漏输出不是推挽输出的“低配版”,而是一种有独特应用场景的独立设计。I2C、1-Wire这些总线,必须用开漏。
四、第三层:为什么推挽不能并接,开漏可以?——总线冲突的原理
4.1 两个推挽输出接在一起会怎样?
假设两个MCU的推挽输出都接到同一根信号线上:
MCU_A输出高电平:上管P-MOS导通,输出连到VDD
MCU_B输出低电平:下管N-MOS导通,输出连到GND
此时,VDD经过MCU_A的P管→信号线→MCU_B的N管→GND,形成直接短路。两个MOS管的导通电阻都很小(几Ω到十几Ω),短路电流可能达到几百mA甚至更高。
结果就是:轻则IO口烧毁,重则整个芯片报废。这就是总线冲突。
4.2 开漏输出为什么可以并接?
多个开漏输出并接在同一根线上:
所有设备都输出高:所有N管都截止,总线上只有上拉电阻提供的高电平
任意一个设备输出低:该设备的N管导通,总线被拉到低电平
多个设备同时输出低:各自N管导通,都拉低,没有冲突
开漏输出只能拉低不能拉高,所以永远不会出现“一个拉高、一个拉低”的打架场景。这种特性叫“线与”逻辑——只要有一个设备拉低,总线就是低;所有设备都释放,总线才是高。
4.3 追问:“如果我把两个推挽输出设为开漏模式,是不是也能并接了?”
这个问题非常刁钻,很少有人能答上来。
部分MCU的GPIO支持在开漏模式下同时关闭上下两个MOS管,此时的确定全等效于纯开漏输出,可以并接。但有一个容易被忽视的坑:上电复位期间和程序初始化完成之前,所有IO默认都是高阻输入或推挽输出。如果复位期间两个IO短暂进入推挽模式,哪怕只有几微秒,也可能产生一次瞬间短路。单次瞬间短路可能不会立刻烧毁引脚,但长期累积会加速氧化甚至热损坏。
所以如果真要多个MCU共享一根线,最稳妥的方案是:
用硬件固定为开漏的I2C引脚(不是所有MCU都有)
或者每个MCU输出串一个几百Ω的保护电阻,限制万一冲突时的短路电流
或者用真正的开漏输出器件(如I2C专用的电平转换芯片)
能答到这一层,面试官会觉得你是一个真的在工程细节上较真的人。
五、实战应用——哪些场景用推挽,哪些用开漏?
5.1 必须用推挽的场景
SPI的SCK、MOSI:单主多从,单向高速,需要强驱动和陡峭边沿
UART的TX:点对点单向输出,需要快速边沿
普通GPIO驱动LED、蜂鸣器、继电器:需要强驱动能力
5.2 必须用开漏的场景
I2C的SCL和SDA:多设备共享总线,需要线与逻辑
1-Wire单总线:单线双向通信,多个设备挂在同一根线上
多设备共享中断线:任一设备拉低都能触发中断
需要电平转换:MCU是3.3V供电,通过开漏+外部上拉到5V,实现5V电平输出
5.3 电平转换——开漏输出的独特优势
这是面试中能让你脱颖而出的知识点。
MCU是3.3V供电,但我需要输出5V的电平给某个外设。如果用推挽,输出高电平最大就是3.3V,够不着5V。但用开漏输出,外部上拉电阻接到5V,当N管截止时,总线上就是5V。开漏输出的高电平不由芯片供电电压决定,而由外部上拉电阻接的电压决定。
当然前提是引脚的耐压必须支持5V(比如STM32的FT引脚)。能说出这个应用场景,说明你不仅懂原理,还会用。
六、翻车实录——我亲历的推挽并接事故
早年画一块板子,用STM32的两个SPI外设,各挂一个从设备。为了省引脚,我把两个SPI的MISO都接到同一个GPIO上——两个从设备通过不同的CS片选控制,我心想“不同时选中就行了”。
但我忘了MISO在空闲时也是推挽输出(部分SPI从设备在CS未选中时MISO为高阻态,但不是全部)。有一次代码Bug导致两个CS同时拉低,两个从设备的MISO同时输出——一个输出高,一个输出低,瞬间短路。幸好只是轻微发热,被我闻到了焦味及时断电。后来查数据手册才发现,这款从设备的MISO在CS未选中时不是高阻态。
教训:不确定器件输出行为的时候,MISO线上各串一个100Ω保护电阻,或者用模拟开关隔离。
七、满分回答模板
面试官问“推挽和开漏有什么区别”,按这个逻辑答:
第一段(基本定义):推挽输出内部有一对互补MOS管,P管负责拉高、N管负责拉低,高低电平都能主动驱动,速度快驱动强。开漏输出只有N管,只能主动拉低,高电平必须靠外部上拉电阻提供。
第二段(深入原理):从电路角度看,推挽是两个管子在VDD和GND之间,通过交替导通输出高低电平,两个管子永远不会同时导通。开漏只有一个管子接地,截止时输出高阻,必须有外接上拉电阻才能产生高电平。
第三段(总线冲突):推挽输出不能并接——如果一个输出高一个输出低,VDD经过两个导通管直接短路到GND,瞬间大电流烧IO。开漏可以并接——因为任何设备只能拉低不能拉高,永远不会出现一个拉高一个拉低的冲突,这就是“线与”逻辑。I2C用开漏就是这个原因。
第四段(实战应用):推挽适用于SPI、UART、GPIO驱动等单向高速场景。开漏适用于I2C、1-Wire、共享中断线等多设备共享总线的场景。另外开漏还有一个独特优势——通过接不同电压的上拉电阻可以实现电平转换。部分MCU的推挽IO在开漏模式下也能并接,但要注意上电复位期间IO默认状态的风险,建议串保护电阻。
四个层次全覆盖,面试官会认为你对GPIO输出结构的理解已经超过大多数候选人。
八、总结
| 要点 | 说明 |
|---|---|
| 推挽结构 | PMOS+NOMS,高低都能主动驱动 |
| 开漏结构 | 只有NMOS,只能拉低,高电平靠外部上拉 |
| 推挽优点 | 速度快,驱动强,外围简单 |
| 开漏优点 | 可并接(线与),可电平转换 |
| 推挽并接 | 一个拉高一个拉低→短路烧IO |
| 开漏并接 | 大家只能拉低→安全 |
| 典型应用 | SPI用推挽,I2C用开漏 |
下篇预告:《面试题:3.3V和5V器件怎么互连?说出三种方案》——我会把电平转换的四种方案从原理到成本到适用场景逐一拆解,还会说到为什么电阻分压不能用在I2C上。
有用的话,收藏一下。下次面试被问到推挽和开漏,你就按这个结构从头到尾讲一遍。评论区说说你在输出模式上踩过什么坑,老张帮你分析。
