短文标题:开漏输出:只拉低不推高,靠上拉电阻“借”高电平

你有没有想过一个问题:I2C总线上多个设备的SDA引脚连在一起,为什么不会短路?因为它们用的是开漏输出,不是推挽。 谁都能拉低,但谁也不主动推高。大家都“放手”时,总线被上拉电阻拉到高电平。开漏输出的内部结构,开漏输出内部只有一个接地的NMOS管

  • 输出低电平(0):MOS管导通,引脚拉到0V
  • 输出高电平(1):MOS管关断,引脚悬空——必须靠外部上拉电阻提供高电平

开漏的“漏”是指MOS管的漏极开路(Open-Drain)。线与逻辑,多个开漏输出接在同一条线上:

任何一个设备拉低,总线就是低电平。全部“放手”,总线才被上拉至高电平。——这就是“线与”逻辑。上拉电阻阻值怎么选?上拉电阻是三要素的平衡:上升时间、功耗、总线电容。

I2C规范:400kHz用1.5~2kΩ,100kHz用4.7~10kΩ。开漏的三个应用场景

1. 线与逻辑(多设备共享总线)

I2C总线、1-Wire总线基于此原理。多个设备共享同一条数据线,不会短路。

2. 电平转换(3.3V ↔ 5V)

上拉电阻接5V,3.3V单片机开漏输出即可驱动5V设备。电平由上拉电压决定。

3. 双向通信

开漏引脚既可作为输出(MOS管拉低或放手),也可作为输入(读取引脚电平)。同一条线实现双向传输。

STM32内部上拉

内部上拉电阻约40kΩ,通过GPIOx_ODR寄存器控制:

GPIOA->CRL |= (0x08 << 0);   // 上拉/下拉输入模式

GPIOA->ODR |= (1 << 0);      // 使能内部上拉

内部上拉驱动弱(上升沿慢,适合几百kHz内),I2C高速仍需外部上拉。

这个故事的启示,开漏输出不强,但“合群”:不主动推高,才能协作共享。上拉电阻是开漏的灵魂,没它就“飘”了。写在最后,I2C总线用开漏,不是因为它强,是因为它“合群”。选好上拉电阻,速度和功耗兼得。开漏+上拉=共享总线的黄金搭档。


(本文灵感源于于振南《新概念ARM32单片机》教程第3.4节、第3.6节。)

觉得有用?点赞、转发,让更多人看懂开漏输出的总线共享智慧。

Logo

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

更多推荐