1. 从一次IIC总线“假死”说起
几年前调一块传感器板子,主控是3.3V的MCU,挂了一颗5V供电的EEPROM,IIC总线上拉了4.7k电阻到3.3V。单独读EEPROM没问题,可一旦和另一颗3.3V的传感器同时挂在总线上,EEPROM就频繁丢数据,示波器抓波形发现SDA的高电平只有3.3V,而EEPROM的VIH门槛在0.7×VDD=3.5V左右,等于它根本没识别到“高”。这就是典型的IIC电平转换没做,3.3V和5V设备直接硬连导致的通信问题。
很多人第一反应是加一颗专用的电平转换芯片,比如TXS0102、PCA9306之类。能用,但成本、封装、供货都是问题,尤其是小批量或者维修场景。其实用一颗N沟道MOS管加两个上拉电阻就能解决,成本几毛钱,电路简单到可以飞线。这篇就围绕“MOS管做IIC电平转换”这件事,把原理、选型、参数计算、实测波形、踩坑经验一次讲透。不管你是刚接触IIC的新手,还是被双向电平转换坑过的老手,都能直接抄作业。
需要先明确一点:IIC是双向总线,SDA要双向传,SCL虽然通常单向但为了兼容多主也多按双向处理。所以电平转换电路必须支持双向,这也是为什么不能简单用三极管单向转换的原因。MOS管方案的精髓就在于利用其体二极管和导通沟道实现双向自动切换,下面拆开讲。
2. MOS管双向电平转换的底层逻辑
2.1 为什么普通三极管方案在IIC上会翻车
先说说常见的三极管电平转换电路,很多教程里用它做单向信号转换:低压侧信号驱动三极管基极,集电极通过上拉电阻拉到高压侧。这个电路做单向没问题,但用在IIC的SDA上就出事了。因为IIC的SDA是双向的,主机拉低、从机也要能拉低,三极管的单向导通特性会导致反向传输时信号被“卡住”,或者出现电平竞争。更麻烦的是三极管有饱和压降,低压侧拉低时高压侧可能拉不到足够低的电平,导致从机识别不到“低”。
我实测过一个3.3V转5V的三极管电路,低压侧拉低时高压侧最低只能到0.4V左右,而5V器件的VIL门槛通常在0.3×VDD=1.5V以下,勉强能用,但余量很小,温度一变或者器件批次不同就容易出问题。所以三极管方案在IIC上不是不能用,而是不稳,尤其是总线挂多个器件、走线较长的时候。
2.2 MOS管方案的核心:体二极管先导通,沟道后导通
MOS管方案的关键在于利用N沟道MOS管的体二极管(Body Diode)和导通沟道的配合。电路结构是这样的:MOS管的源极(S)接低压侧(3.3V),漏极(D)接高压侧(5V),栅极(G)接低压侧电源(3.3V)。低压侧和高压侧各自有上拉电阻,分别拉到3.3V和5V。
工作过程分两种情况:
情况一:低压侧拉低。当3.3V侧的主机把SDA拉低到0V,MOS管的源极变成0V,栅极还是3.3V,Vgs=3.3V,大于阈值电压Vth,MOS管导通。此时漏极和源极之间通过沟道连通,高压侧也被拉低到接近0V。注意此时体二极管的方向是从源极到漏极(对于N沟道,体二极管阳极在源极,阴极在漏极),但沟道导通后体二极管被短路,压降就是Rds(on)带来的,通常几十毫欧,压降可以忽略。
情况二:高压侧拉低。当5V侧的从机把SDA拉低到0V,MOS管的漏极变成0V,源极还是3.3V(因为上拉电阻),此时Vgs=3.3V-3.3V=0V?不对,源极电压是3.3V,栅极也是3.3V,Vgs=0,MOS管不导通。但此时体二极管导通了!体二极管阳极在源极(3.3V),阴极在漏极(0V),正向偏置,电流从源极流向漏极,把源极也拉低到约0.7V(体二极管正向压降)。源极被拉低后,Vgs=3.3V-0.7V=2.6V,仍然大于Vth,MOS管沟道也导通,进一步把源极拉低到接近0V。最终两侧都被拉低,实现双向传输。
这个“体二极管先导通,沟道后导通”的机制是MOS管方案能双向工作的核心。很多人看电路图时疑惑“栅极接3.3V,高压侧拉低时Vgs不是0吗,怎么导通”,答案就在体二极管上。
2.3 栅极为什么必须接低压侧电源
栅极接低压侧电源(3.3V)而不是高压侧(5V),这是有讲究的。如果栅极接5V,那么当低压侧拉低时,Vgs=5V-0V=5V,MOS管导通没问题;但当高压侧拉低时,源极还是3.3V,Vgs=5V-3.3V=1.7V,可能仍然大于Vth,MOS管会一直导通,导致两侧电平被强制拉在一起,失去转换意义。更严重的是,如果栅极接5V,低压侧的3.3V信号可能无法有效控制MOS管关断,出现逻辑混乱。
所以栅极必须接低压侧电源,这样MOS管的开关状态由低压侧控制,高压侧只通过体二极管被动拉低。这个细节很多参考设计里没写清楚,但实际调试时如果接错,波形会完全不对。
3. 关键参数计算与MOS管选型
3.1 上拉电阻取多大:4.7k不是万能答案
IIC上拉电阻的取值直接影响上升沿时间和功耗。标准模式100kHz下,4.7k是常见值;快速模式400kHz下,通常用2.2k到4.7k;高速模式1MHz以上,可能要用1k甚至更小。但电平转换电路里,两侧上拉电阻的取值还要考虑MOS管的输入电容和体二极管的反向恢复。
上升沿时间估算公式:t_r ≈ 2.2 × R_pullup × C_bus。C_bus包括PCB走线电容、器件引脚电容和MOS管的Ciss。假设C_bus=100pF,R_pullup=4.7k,t_r≈1μs,对于100kHz(周期10μs)够用;对于400kHz(周期2.5μs),1μs的上升沿占40%,余量偏小,建议降到2.2k,t_r≈0.5μs。
但上拉电阻也不能太小,否则低电平时灌电流太大。5V侧拉低时,电流=5V/2.2k≈2.3mA,加上3.3V侧的1.5mA,总灌电流接近4mA,一般IIC器件的灌电流能力在3mA到20mA之间,多数能承受,但低功耗场景要权衡。
我个人的经验取值:3.3V侧用4.7k,5V侧用4.7k,这是最稳妥的起步值。如果波形上升沿太缓,先降到3.3k,再不行降到2.2k。不要一上来就用1k,功耗和灌电流都会成问题。
3.2 MOS管选型:Vth、Rds(on)、Ciss三个参数最关键
选N沟道MOS管做电平转换,重点看三个参数:
| 参数 | 要求 | 原因 |
|---|---|---|
| Vth(阈值电压) | 1V~2V,且Vgs=3.3V时能充分导通 | Vth太高,3.3V驱动不够;Vth太低,抗干扰差 |
| Rds(on) | 越小越好,通常<100mΩ | 影响低电平压降和信号完整性 |
| Ciss(输入电容) | 越小越好,通常<100pF | 影响上升沿时间,Ciss大则边沿变缓 |
常用的型号有2N7002(Vth约2.1V,Rds(on)约1.2Ω@4.5V,Ciss约50pF)、BSS138(Vth约1.3V,Rds(on)约3.5Ω@4.5V,Ciss约27pF)、AO3400(Vth约1.4V,Rds(on)约28mΩ@4.5V,Ciss约630pF)。2N7002和BSS138是IIC电平转换的经典选择,AO3400的Ciss偏大,高速时可能影响边沿,但低速下没问题。
注意Vth的测试条件:很多datasheet标Vth是在Vds=Vgs、Id=250μA条件下测的,实际使用时Vgs=3.3V,Vth会略有不同。选型时留足余量,Vth最好在1V到2V之间。
3.3 体二极管的反向恢复会不会影响信号
体二极管的反向恢复时间通常在几十纳秒量级,对于100kHz到400kHz的IIC信号,周期是微秒级,反向恢复的影响可以忽略。但在1MHz以上的高速模式下,体二极管的反向恢复可能导致信号振铃或延迟,这时候建议选反向恢复时间更短的MOS管,或者改用专用电平转换芯片。
我实测过BSS138在400kHz下的波形,上升沿约300ns,下降沿约100ns,体二极管的反向恢复没有明显影响。但换成AO3400后,由于Ciss大,上升沿变成约800ns,400kHz下勉强能用,1MHz就不行了。
4. 完整电路搭建与实测波形分析
4.1 电路连接:别把源极和漏极接反
电路连接看起来简单,但源极和漏极接反是新手最容易犯的错。正确接法:源极接低压侧(3.3V),漏极接高压侧(5V),栅极接低压侧电源(3.3V)。如果接反了,体二极管的方向也反了,高压侧拉低时体二极管反向偏置,无法导通,双向传输失效。
具体连接步骤:
- 3.3V侧SDA线接MOS管源极(S),同时通过4.7k电阻上拉到3.3V。
- 5V侧SDA线接MOS管漏极(D),同时通过4.7k电阻上拉到5V。
- MOS管栅极(G)直接接3.3V电源。
- SCL线同样处理,用另一颗MOS管。
- 两侧的地必须共地,否则电平没有参考点。
注意:如果两侧设备已经共地,直接连;如果不共地,需要先解决共地问题,电平转换电路不能替代隔离。
4.2 实测波形:低电平压降和上升沿时间
我用BSS138搭了一路SDA转换,3.3V侧和5V侧各4.7k上拉,示波器双通道抓波形。测试条件:3.3V侧主机发送数据,5V侧从机接收。
实测结果:
- 3.3V侧拉低时,5V侧低电平约0.05V,压降来自Rds(on)×灌电流,BSS138的Rds(on)约3.5Ω,灌电流约1mA,压降3.5mV,加上体二极管不导通,实际压降很小。
- 5V侧拉低时,3.3V侧低电平约0.6V,这是体二极管的正向压降。注意这个0.6V对于3.3V器件的VIL门槛(通常0.3×3.3=0.99V)来说仍然算低电平,能识别。但如果3.3V器件的VIL门槛更低,比如0.8V,0.6V就有点悬了。
- 上升沿时间:3.3V侧约250ns,5V侧约300ns,400kHz下够用。
- 下降沿时间:两侧都在100ns以内,很快。
这里有个细节:5V侧拉低时,3.3V侧的低电平是体二极管压降,不是0V。如果3.3V器件的VIL门槛特别低,可能需要选体二极管压降更小的MOS管,或者改用专用芯片。但大多数3.3V器件的VIL在0.8V到1V之间,0.6V能过。
4.3 多器件挂载时的总线电容影响
总线上挂的器件越多,总线电容越大,上升沿越缓。假设每个器件引脚电容5pF,走线电容1pF/cm,10个器件加20cm走线,总电容约70pF。加上MOS管的Ciss,BSS138约27pF,总电容接近100pF。4.7k上拉下,上升沿约1μs,400kHz下占40%,余量偏小。
这时候有两个选择:一是降低上拉电阻到2.2k,上升沿降到约0.5μs;二是减少挂载器件或缩短走线。我一般建议先降上拉电阻,2.2k在大多数场景下够用,灌电流也在安全范围内。
如果还不行,就要考虑用IIC缓冲器或中继器,比如PCA9515之类,但那又是另一个话题了。
5. 踩过的坑与排查思路
5.1 波形看着正常但通信失败:VIL门槛的隐形陷阱
有一次调一个5V的OLED模块,波形抓出来高低电平都正常,5V侧低电平0.6V,高电平5V,但就是通信失败。查了半天,发现OLED的VIL门槛是0.2×VDD=1V,0.6V能过;但VIH门槛是0.8×VDD=4V,而5V侧高电平只有4.8V(上拉电阻分压),勉强能过。问题出在3.3V侧:3.3V器件的VIH门槛是0.7×3.3=2.31V,高电平3.3V能过;但VIL门槛是0.3×3.3=0.99V,而5V侧拉低时3.3V侧低电平是0.6V,能过。
那问题在哪?后来发现是时序问题。MOS管的体二极管导通有延迟,5V侧拉低到3.3侧响应之间有约100ns的延迟,导致3.3V侧采样时信号还没完全拉低。把上拉电阻从4.7k降到2.2k后,延迟减小,通信恢复正常。
这个坑的教训:波形正常不代表时序满足,尤其是双向转换时,两个方向的延迟不一样,要留足时序余量。
5.2 栅极接错电源导致总线锁死
另一个坑是栅极接5V。当时想的是“栅极电压高一点,MOS管导通更充分”,结果3.3V侧拉低时,Vgs=5V,MOS管导通,5V侧被拉低;但5V侧拉低时,源极3.3V,Vgs=5V-3.3V=1.7V,仍然大于Vth,MOS管一直导通,两侧电平被强制拉在一起。结果就是3.3V侧的高电平被5V侧拉高到5V,超过3.3V器件的耐压,差点烧片。
栅极必须接低压侧电源,这是铁律。如果低压侧是1.8V,栅极就接1.8V;如果是2.5V,就接2.5V。不要图省事接高压侧。
5.3 两侧上拉电阻不对称导致占空比失真
IIC的SCL时钟信号对占空比有要求,通常高电平时间和低电平时间有最小限制。如果两侧上拉电阻不对称,比如3.3V侧用4.7k,5V侧用10k,那么5V侧的上升沿会明显变缓,导致SCL高电平时间被压缩,占空比失真。严重时从机可能采样不到时钟。
我的做法是两侧用相同阻值,或者5V侧略小一点(因为5V侧电压高,同样阻值下上升沿更快)。但不要差太多,最好在1.5倍以内。
5.4 排查清单:从波形到协议的完整链路
遇到IIC电平转换通信失败,按这个顺序排查:
- 共地检查:两侧地是否连通,用万用表测电阻。
- 电源检查:3.3V和5V是否正常,纹波是否过大。
- MOS管方向:源极接低压侧,漏极接高压侧,栅极接低压侧电源。
- 上拉电阻:两侧是否都有上拉,阻值是否合适。
- 波形检查:用示波器看两侧高低电平,低电平是否低于VIL,高电平是否高于VIH。
- 时序检查:上升沿、下降沿时间是否满足IIC时序要求。
- 总线电容:挂载器件数量、走线长度是否导致边沿过缓。
- 协议层:用逻辑分析仪抓IIC协议,看ACK/NACK是否正常。
这个清单我用了很多次,基本能覆盖90%的问题。
6. 什么时候该放弃MOS管方案
MOS管方案成本低、电路简单,但不是万能的。以下几种情况建议直接上专用电平转换芯片:
- 高速模式(1MHz以上):MOS管的Ciss和体二极管反向恢复会影响边沿,专用芯片如TXS0102支持24Mbps,更适合。
- 多电压域(1.8V/3.3V/5V混合):MOS管方案每路都要单独搭,专用芯片一颗搞定多路。
- 自动方向识别:有些专用芯片支持自动方向识别,不需要额外控制信号,MOS管方案虽然也自动,但延迟和驱动能力有限。
- 总线挂载超过10个器件:总线电容太大,MOS管方案边沿太缓,需要缓冲器。
但如果是小批量、维修、成本敏感的场景,MOS管方案仍然是首选。我自己的项目里,3.3V转5V的IIC基本都用BSS138,稳定可靠,成本不到一毛钱。
最后分享一个实测技巧:搭好电路后,先用**低速(10kHz)**跑通,确认双向通信正常,再逐步提高速率到100kHz、400kHz。如果高速下失败,先降上拉电阻,再查总线电容,最后考虑换MOS管型号。这个渐进式调试方法能帮你快速定位问题,避免一上来就高速导致波形混乱无从下手。