一颗 3.3V 供电的 STM32 或 ESP32,要读一片 5V 供电的传感器模块;或者反过来,5V 的 Arduino 要挂 3.3V 的 OLED。很多工程师的第一反应是"电平不一样,加两个电阻分压不就行了"——然后总线要么一通信就乱码,要么干脆无应答,运气差的还把低压侧芯片的 I/O 口烧出闩锁。I²C 是双向开漏总线,它的电平转换有自己的一套规矩。本文从 I²C 的总线本质讲起,拆解一颗小信号 N-MOS(以华轩阳电子 HXY Electronics 的 BSS138 为例,SOT-23/50V/0.2A/1.1Ω)完成双向电平转换的原理与工程细节,并给出可直接照抄的避坑清单。
I²C 只有两根线(SDA 数据、SCL 时钟),却能挂几十个设备,靠的是两个设计:开漏输出与双向半双工。任何设备都不主动把线拉高,只做两件事——把线拉低,或者松开;线上的高电平由上拉电阻接到电源轨来提供。而"从机应答 ACK"恰恰要求从机在第九个时钟把 SDA 主动拉低,总线天生双向。
这个本质带来三个连锁问题,正是 3.3V 与 5V 混接时乱码的根源:
第一,高电平没有中间态。把 3.3V 设备直接挂到 5V 上拉的线路上,总线空闲时高电平被 5V 上拉拖向 5V,超出 3.3V 器件 I/O 的绝对最大额定——若 I/O 内部 ESD 二极管先导通,会向 3.3V 电源轨漏电,轻则误判逻辑、重则形成闩锁;若模块板上自带 5V 上拉,又与主控内部几十千欧的弱上拉形成分压,高电平停在 3.6V 以上的"灰区"(具体由两侧阻值比例决定),时序与电平同时失效。
第二,分压电阻只能单向降压。电阻分压把 5V 侧的高电平降到 3.3V 可读,看似解决了"主控读从机",但从机应答时要反向把 SDA 拉低——分压网络同样把从机拉低的能力衰减了,低压侧主控根本检测不到有效的低电平,通信表现为"发指令正常、读数据超时"。
第三,单向缓冲芯片的方向脚与总线冲突。方向固定的电平转换芯片需要一根方向控制信号,而 I²C 的每一根线每一拍都在换方向(主发从收、从发主收、应答位反向),硬件上无法预先固定;自动方向感应的缓冲芯片(如 TXB 系列)又依赖检测沿来切换,开漏总线的上拉电阻会干扰其方向判定,多家厂商的数据手册明确不建议用于开漏信号。
结论:I²C 电平转换必须是无方向控制、纯被动、双向的。这正是当年 Philips(现 NXP)应用笔记 AN97055/AN10441 提出分立 MOS 方案的原因,也是它在数十年后仍是各类电平转换模块板上默认电路的底气。
NXP AN10441《Level shifting techniques in I²C-bus design》给出的电路极简:SDA 与 SCL 各用一颗 N 沟道增强型 MOSFET,每根线两侧各有一只上拉电阻。接线方向是硬规矩,不能接反:
• 栅极(G)接低压侧电源(本例 3.3V);
• 源极(S)接低压侧总线(3.3V 域的 SDA/SCL);
• 漏极(D)接高压侧总线(5V 域的 SDA/SCL);
• 两侧总线各自经上拉电阻接到自己那一侧的电源,两侧共地。
三个工作状态对应一次完整通信:
状态一:总线空闲。 没有任何设备拉低,3.3V 侧被自己的上拉拉高到 3.3V。此时栅极与源极同电位(都在 3.3V),栅源电压 VGS 为零,低于阈值电压,MOSFET 关断——5V 侧被自己的上拉独立拉高到 5V。两侧都呈高电平,但各回各家,互不干扰。
状态二:低压侧(3.3V)设备拉低。 源极电位掉到 0V,而栅极仍固定在 3.3V,VGS 一下抬到 3.3V,远超阈值电压,沟道导通,漏极(5V 侧)被沟道拉低。低电平从 3.3V 侧传到 5V 侧。
状态三:高压侧(5V)设备先拉低。 漏极电位掉到 0V,低于源极(3.3V),此时 MOS 的寄生体二极管(电流方向为源极流向漏极)先导通,把 3.3V 侧拖低约一个二极管压降;源极一降,VGS 随之升高并越过阈值,沟道接管导通,把 3.3V 侧彻底拉低。体二极管只"带个头",导通后由沟道承担电流——这段体二极管导通是双向工作的有意设计,不是缺陷。
三个状态走完,规则只有一条:无论哪一侧先拉低,低电平都能传到另一侧;高电平由各侧自己的上拉恢复。方向感自动完成,不需要任何控制信号。松开后的上升沿由"上拉电阻 × 总线电容"的 RC 决定,MOSFET 对拉高毫无贡献——这一点决定了它的速率边界,后文会讲。
这个电路对 MOS 的要求其实很宽松,但有几个参数是硬门槛,BSS138 恰好全部满足,这也是它成为该电路"事实标准"的原因(多数开源电平转换模块、传感器评估板用的都是它)。以华轩阳清单参数为例:
| 电路要求 | BSS138 参数(清单值) | 为什么够用 |
|---|---|---|
| 栅极只接 3.3V,需要低压导通 | N 沟道增强型,VGS(th) 低(典型 1V 上下,具体以数据手册为准) | VGS=3.3V 时过驱动充足,沟道充分导通;这是"逻辑电平 MOS"的核心指标 |
| 线上只有毫安级电流 | 连续漏极电流 ID=0.2A | 上拉电流典型 1-3mA,余量约百倍,导通电流完全不是瓶颈 |
| 拉低后低电平要够低 | RDS(on)=1.1Ω(测试条件以规格书为准) | 即使按 3.3V 栅压下导通电阻升到数欧姆估算,3mA 电流压降也仅毫伏级,远低于 I²C 低电平上限(0.4V) |
| 电平域怎么折腾都不击穿 | 漏源耐压 VDS=50V | 对 1.8V 至 5V 电平域都有充足裕量(对 5V 仍有约十倍);栅源额定 ±20V,栅极固定接 3.3V 完全安全 |
| 占板小、能贴片 | SOT-23 三脚封装 | 每根线一颗,两颗即可搭完整 I²C 转换,适合传感器板等紧凑空间 |
值得单独说的一点是导通电阻在这个电路里"不敏感"。多数工程师查 RDS(on) 时习惯按功率管思维找毫欧级器件,但电平转换场景电流只有毫安级,导通压降 = 电流 × 电阻,毫安乘欧姆仍是毫伏,远够不着 I²C 的低电平规格。所以 BSS138 这类"毫欧时代的老实管"反而更合适:栅极电容小、开关快、价格低,而非追求更小的 RDS(on)。上一篇文章《读懂 MOSFET 数据手册》里强调"RDS(on) 必须带测试条件看",在这里同样适用——清单标称值通常对应 VGS=10V 测试,而本电路栅极只有 3.3V,导通电阻会高于标称,但如上所算完全不影响功能。
若希望一颗料件完成两根线,华轩阳还有双通道版本 BSS138DW(SOT-363,内含两颗独立 N-MOS):SDA、SCL 各用一半,比两颗 SOT-23 更省面积、料号管理也更简单。小信号 MOS 产品线的这两个料号,覆盖了电平转换从 DIY 到量产两条路线。
这里还要回答一个常见疑问:既然只走毫安级电流,能不能随便抓一颗功率 MOS 来用?能工作,但不是好选择。功率 MOS 的 VGS(th) 通常按 10V 级驱动设计(典型 2-4V),3.3V 栅压下导通不充分、导通电阻离标称值很远;同时大管芯的栅极电容、封装体积与成本对一根信号线全是浪费。电平转换场景要的是为低压逻辑驱动而生的小信号管:VGS(th) 低、栅荷小、SOT-23 级封装,BSS138 这类器件正是为此设计的。
把电路放进真实系统里,信号链是这样的:3.3V 主控的 I²C 外设(开漏输出)→ 3.3V 侧上拉电阻 → BSS138DW 的两个通道(SDA/SCL 各一)→ 5V 侧上拉电阻 → 5V 从机模块(如带 5V 板载上拉的传感器)。主控侧无需任何方向控制引脚或额外驱动,I²C 外设直接工作;从机侧感知到的仍是标准 I²C 时序。
三个设计参数需要现场定:
上拉电阻取值。 两个原则夹出可行区间:下限由器件的灌电流能力决定(I²C Fast-mode 器件需保证 3mA 级灌流,电阻太小会把低电平抬高甚至超流,工程上不低于约 1kΩ);上限由上升时间预算决定(按 tr ≈ 0.85 × Rp × Cb 估算,对照标准模式上升时间上限 1000ns、Fast-mode 300ns)。举一个数值例子:总线跑 400kbit/s、测得总线电容约 150pF,则上升时间预算 300ns 反推 Rp 上限约 2.4kΩ,取标称值 2.2kΩ——核算灌电流,5V 侧(5-0.4)/2.2k≈2.1mA、3.3V 侧(3.3-0.4)/2.2k≈1.3mA,都在器件 3mA 级 IOL 之内。总线轻载(总电容几十 pF)、只跑 100kbit/s 时,10kΩ 通用且省电;重载或高速再按上述方法收窄,不必一刀切。不要依赖 MCU 内部几十千欧的弱上拉,边沿会慢到温度一升就超时。
速率边界。 NXP 官方文档明确该方案覆盖 Standard-mode(100kbit/s)与 Fast-mode(400kbit/s),不适用于 3.4Mbit/s 的 Hs-mode;Fast-mode Plus(1MHz)实务中在轻载下可以跑通,但上升时间余量很小,总线稍长或设备一多就暴露。1MHz 及以上、总线很长、或从机数量多时,建议改用专用转换器件(如 PCA9306 类无源开关型、TXS 类开漏兼容型)。
适用的信号类型。 该电路的设计定位是开漏/开集总线:I²C、SMBus、1-Wire 都适用。推挽输出信号(如 SPI、UART 的发送脚)不在此列——MOS 只帮忙拉低、不参与拉高,推挽源会与电路打架造成波形畸变,这类信号应选方向明确的推挽缓冲芯片。
① 高低压两侧接反,电路永远不工作。 栅极必须接低压电源、源极接低压总线、漏极接高压总线。接反后无论哪侧拉低,VGS 都无法正确建立,且可能经体二极管向电源反灌。这是该电路排障第一顺位检查项。
② 上拉电阻必须两侧都有。 只在一侧上拉,另一侧总线浮空,靠 MOS 无法把高电平"搬"过去——MOS 在空闲时是关断的,高电平只能由各侧自己的上拉产生。
③ 别让弱上拉"背锅"。 MCU 内部上拉通常几十千欧,单独使用会拖慢上升沿;若与外部上拉并联,等效阻值被拉低、灌电流被抬高,可能超出器件 IOL。方案:禁用内部上拉,统一用外部电阻。
④ 栅极只接低压电源轨,不接别处。 若把栅极接到其他电位(如悬空、接到 5V),VGS 会失去参考,空闲时管子可能误导通,把两侧总线"焊"在一起。
⑤ 1.8V 低压域慎用。 栅极电压降到 1.8V 时,若器件 VGS(th) 上限接近甚至超过 1.8V,部分批次无法保证导通。低压侧低于 2.5V 时请核对手册 VGS(th) 上限,必要时改选专用转换 IC。这也是选型时要向供应商确认"逻辑电平档"的原因。
⑥ 别拿它转推挽信号。 再次强调:该电路是开漏总线的专属方案。SPI、UART 发送脚等推挽信号请用带方向控制的缓冲器(如 74LVC 系列)或推挽兼容的自动方向芯片,不要复用 I²C 电平转换板。
I²C 电平转换的"正确打开方式",一句话:用一颗低阈值 N-MOS 做无方向的双向开关,让开漏逻辑自己完成电平对接。BSS138 之所以成为这个电路的行业默认件,不是因为参数堆得多高,而是因为每一个参数都恰好落在电路要求上——低压导通、毫安级电流、毫伏级压降、SOT-23 贴片、成本极低;需要双线一体化时,BSS138DW 一颗料件即可覆盖 SDA 与 SCL。
华轩阳电子(HXY Electronics)提供 BSS138(SOT-23)与 BSS138DW(SOT-363)小信号 N-MOS,现货供应、参数一致性稳定,适用于 I²C/SMBus/1-Wire 电平转换、小负载开关等信号级应用。如需具体型号的 VGS(th) 分档、温度曲线或详细数据手册,欢迎联系 sales@hxymos.com,我们的 FAE 可协助您完成上拉计算与电路评审。本文内容基于公开应用笔记与工程经验整理,具体器件参数与降额数据请以官方数据手册为准。
声明 / Disclaimer
本文部分参数引自华轩阳产品手册或第三方规格书,数据有更新可能,仅供选型参考,最终设计请以最新版规格书与实测为准。
联系 Contact:sales@hxymos.com