做硬件的人大概都有过这种体验:方案评审的时候谁都不觉得电平转换是个事,等到板子回来联调,主控 3.3V 的 UART 死活读不到 1.8V 模组回的包,或者 5V 的驱动板把 3.3V 的 MCU 引脚烧掉了,才发现通信电平转换(1.8V、2.8V、3.3V、5V 这几个电压域之间的互转)根本没人在设计阶段认真算过裕量。它本身不难,难的是它散落在每一根信号线上——I2C、SPI、UART、SDIO、PWM、中断脚、使能脚,任何一根漏掉都可能变成偶发故障,而且这类故障往往不是"完全不通",而是"跑十分钟掉一次包",排查成本极高。
这篇内容我打算把这件事从头到尾捋一遍:四个常用电压域的门限到底差多少、哪些组合可以偷懒直连、哪些必须上转换器件、双向总线和单向信号分别怎么处理、外围的 24V/12V 降压链路怎么和电平转换配合、5V 输出端要不要加 TVS 管、以及我在实测里踩过的坑。不管你是刚画第一块板子的学生,还是做了几年消费电子想补一下基础的老工程师,应该都能拿走点能用得上的东西。整篇内容偏向工程实操,参数都给了计算过程,你可以直接抄作业。
1. 先把四个电压域的门限算清楚,别凭感觉接
1.1 1.8V、2.8V、3.3V、5V 的判决门限到底差在哪
电平转换出问题,九成以上是因为没人认真去看数据手册里的 VIH 和 VIL。大家脑子里只有一个模糊印象:"3.3V 不算高也不算低,应该都能兼容吧。"这个印象对 TTL 成立,对 CMOS 不成立,混着用就出事。
先给一张常用电平标准的门限对照表。这里要说明的是,不同厂商、不同系列(LVCMOS、LVTTL、SSTL 等)会略有差别,下表是工业界最通用的典型值,实际设计请以具体器件手册为准。
| 电平类型 | 供电 VDD | 输入高门限 VIH(min) | 输入低门限 VIL(max) | 输出高 VOH(min) | 输出低 VOL(max) |
|---|---|---|---|---|---|
| 1.8V LVCMOS | 1.8V | 1.17V(0.65×VDD) | 0.63V | 1.44V(0.8×VDD) | 0.36V |
| 2.8V LVCMOS | 2.8V | 1.82V | 0.98V | 2.24V | 0.56V |
| 3.3V LVCMOS | 3.3V | 2.0V | 0.8V | 2.4V(负载下) | 0.4V |
| 5V TTL | 5V | 2.0V | 0.8V | 2.4V | 0.4V |
| 5V CMOS | 5V | 3.5V(0.7×VDD) | 1.5V | 4.4V | 0.5V |
看这张表最重要的是看"VOH(min) 减 VIH(min)"这个差值,它才是你真正的噪声裕量。举几个典型组合算一下:
- 3.3V 输出驱动 5V TTL 输入:VOH 最低 2.4V,VIH 是 2.0V,裕量只有 0.4V。能通,但如果你用的是长排线、又赶上旁边有个继电器在开关,这 0.4V 很容易被吃掉。
- 3.3V 输出驱动 5V CMOS 输入:VOH 2.4V 对 VIH 3.5V,直接差 1.1V,根本不通。这是新手最常见的翻车点——"不是说 3.3V 能直接驱 5V 吗",能驱的是 TTL,不是 CMOS。
- 1.8V 输出驱动 3.3V 输入:VOH 最高也就 1.8V(空载),对 3.3V LVCMOS 的 VIH 2.0V,连门限都够不到,必挂。
- 2.8V 输出驱动 3.3V 输入:VOH 2.24V 对 VIH 2.0V,裕量 0.24V。理论上通,实测经常玄学,尤其是 SPI 时钟这类边沿陡的信号,反射一叠加就开始丢位。
注意:SPI 的时钟线(SCLK)和片选(CS)对门限特别敏感,因为时钟是连续翻转的,任何一个周期被误判一次,整帧数据就废了。做 SPI 跨电压域时,门限裕量建议至少留到 0.5V 以上。
1.2 两种可以"偷懒直连"的例外,以及为什么不要滥用
有两个场景确实可以不转换,但我建议你在原理图上明确标注出来,不要让别人以为你忘了。
第一种是 3.3V 驱动 5V TTL 输入,前提是对端芯片手册明确写了输入结构是 TTL 兼容(VIH=2.0V),而且走线不长。这种情况下不加任何器件也能跑,省一颗芯片、省一个布线通道。典型例子是很多 5V 的单片机、74HCT 系列逻辑门、老式 LCD1602 模块的控制脚。
第二种是 5V 驱动带 5V 容忍(5V tolerant)输入的 3.3V 器件。像 STM32 的 FT 类型引脚、部分 NXP 的 I2C 引脚,标注了"输入可承受 5.5V"这类描述。这时候你可以直接接过去,器件内部是靠额外的钳位结构抗住的。有一个坑要特别注意:5V 容忍通常只针对数字输入,而且往往要求该引脚配置为输入或开漏输出模式。如果你把它配成推挽输出,同时又从外部灌 5V 进来,那这个"容忍"是不成立的,会通过 ESD 二极管倒灌进 3.3V 电源轨,把整条 3.3V 电源顶上去。我见过因为这种情况把整板 3.3V 器件全带走的事故。
- 直连前必须做的两件事:一是在原理图上用醒目的备注写清"此处依赖 5V 容忍特性";二是留一个 0 欧姆电阻或一个电阻焊盘的位置,方便出问题时改成加转换器件。
剩下所有组合——包括 1.8V 到 2.8V、2.8V 到 5V、5V 到 3.3V 的推挽双向——都老老实实上转换电路,不要赌。
2. 四类转换方案的横向选型:从分压电阻到专用芯片
2.1 分压、二极管、MOS 管、专用芯片的适用边界
方案选型的核心判断维度只有四个:信号是单向还是双向、速率有多高、驱动电流要多少、成本能接受多少。我把这四类方案的边界整理成一张表,你在画原理图的时候直接对号入座。
| 方案 | 方向 | 典型速率上限 | 成本 | 主要缺点 |
|---|---|---|---|---|
| 电阻分压 | 单向 | 100kHz 以下 | 极低 | 输出阻抗高、驱动弱、反向不通 |
| 二极管+上拉 | 单向 | 100kHz 以下 | 极低 | 低电平被抬高 0.3~0.7V |
| MOS 管+双上拉 | 双向 | 1~2MHz | 低 | 上拉电阻限制速率、占板面积 |
| 专用电平转换芯片 | 双向或方向控制 | 24Mbps~420Mbps | 中 | 成本、部分型号怕强上拉 |
电阻分压只适合"低速、单向、后级输入阻抗很高"的场合,比如某个 5V 的使能信号送给 3.3V 的 EN 脚。选值公式很直白:Vout = Vin × R2/(R1+R2)。5V 转 3.3V 时,R1:R2 大概是 1.7k:3.3k,静态电流约 1mA。这个 1mA 在电池设备里是要算进功耗预算的,所以别到处乱用。
分压方案最大的陷阱是忽略了后级输入阻抗的并联效应。假设你算好 1.7k/3.3k,结果后级输入阻抗只有 10k,那实际分压比就被拉偏了,输出只有 2.75V 左右。我的做法是让分压支路的等效阻抗至少比后级输入阻抗低一个数量级,同时把静态电流控制在 0.5~1mA。如果后级输入是高阻(>1MΩ),那分压值可以取得更大一些,比如 17k/33k,静态电流降到 100μA。
二极管方案(上拉到 3.3V,二极管阳极接 3.3V 侧、阴极接 5V 侧)现在基本可以淘汰了,因为它把低电平抬高了 0.3~0.7V,如果对端 VIL 只有 0.8V,再叠加地弹和线阻,很容易踩线。只有在"极其低速、极其省钱"的场合才考虑。
真正的主力方案是后两种。MOS 管方案用在 I2C、1-Wire、SMBus 这类开漏总线上非常合适;专用芯片用在 SPI、SDIO、并口这类高速推挽信号上。下面分开细讲。
2.2 上拉电阻和速率的定量关系,别拍脑袋选 10k
很多人的习惯是"上拉电阻一律 10k",这个习惯在 I2C 上经常出事。上拉电阻的选择本质是在"上升时间"和"灌电流"之间做取舍。
总线从 0.3×VDD 充到 0.7×VDD 的时间可以用 RC 充电公式推导:
t = R × C × ln[(VDD - 0.3VDD) / (VDD - 0.7VDD)] = R × C × ln(0.7/0.3) ≈ 0.847 × R × C
I2C 标准模式要求上升时间 tr ≤ 1000ns,快速模式 400kHz 要求 ≤ 300ns,快速模式+ 1MHz 要求 ≤ 120ns。总线电容 Cb 包括走线、引脚、器件电容,一般 PCB 上每 10cm 走线约 1~2pF,加上每个器件的 5~10pF 引脚电容。一条挂 4 个器件的短总线算 100pF 很正常。
代入快速模式:
R_max = 300ns / (0.847 × 100pF) ≈ 3.5kΩ
如果总线电容涨到 200pF,R_max 就掉到 1.77kΩ。所以那些"10k 上拉跑 400kHz"的设计,在总线短、器件少的时候确实能跑,一旦多挂两个传感器或者排线拉长,就开始随机丢包,现象是"有时应答有时不应答"。
用一个小脚本把这件事算清楚,比翻手册快得多:
import math def max_pullup(tr_target_ns, c_bus_pf): k = math.log(0.7 / 0.3) # 0.3VDD -> 0.7VDD 的充电系数,约 0.847 tr = tr_target_ns * 1e-9 c = c_bus_pf * 1e-12 return tr / (k * c) def min_pullup(vdd, i_sink_ma): # 开漏器件能灌的电流决定了上拉下限,VOL 一般取 0.4V return 0.4 / (i_sink_ma * 1e-3) for c in (100, 200, 300): for tr in (1000, 300, 120): print(f"Cb={c}pF, tr<={tr}ns -> 上拉上限 {max_pullup(tr, c)/1000:.2f} kΩ") print(f"3.3V 总线、灌电流 3mA 时,上拉下限 {min_pullup(3.3, 3)/1000:.2f} kΩ")跑出来你会看到,Cb=200pF、tr≤300ns 时上限是 1.77kΩ,如果器件只能灌 3mA,下限是 133Ω,可选区间是 133Ω~1.77kΩ,取个中间值 1kΩ 就行。如果算出来的下限比上限还大,说明这条总线根本跑不了这个速率,得改成专用的 I2C 缓冲芯片,或者降低速率。
实操心得:上拉电阻的功耗也要算。1kΩ 上拉到 3.3V,总线常低时的静态电流是 3.3mA,四个通道就是 13mA,对电池设备来说不小。所以我一般先用脚本算出可用区间,再取靠上限的那个值,别一味求小。
3. 双向总线和高速信号的转换电路怎么落地
3.1 BSS138 双向方案:原理、选料和布板要点
先讲最经典的那一颗:双 N 沟道 MOS + 两侧各一个上拉电阻。这个电路的元件清单只有三个,但它为什么能双向工作,值得认真讲一遍,因为理解了它,你后面选专用芯片的时候就知道自己在买什么。
以 1.8V 侧和 3.3V 侧互转为例:MOS 的源极接 1.8V 侧信号线,栅极接 1.8V 电源,漏极接 3.3V 侧信号线,两侧各挂一个 10kΩ 上拉到各自的电源。
当 1.8V 侧被主控拉低时,源极电压下降到接近 0,此时栅源电压 Vgs 约为 1.8V,高于 MOS 的开启阈值(BSS138 典型 1.3V),MOS 完全导通,把漏极也拉到接近 0,3.3V 侧看到低电平。这是低侧拉低高侧的过程。
当 3.3V 侧被拉低时,MOS 的体二极管先导通(体二极管阳极在源、阴极在漏),把源极拉到约 0.7V,此时 Vgs = 1.8V - 0.7V = 1.1V,接近阈值,MOS 开始导通并把源极进一步拉低,形成正反馈,最终两侧都被拉到低电平。这就是它双向工作的关键机制,靠体二极管启动、靠栅源电压维持。
BSS138 的关键参数:Vgs(th) 0.8~1.5V,Vds 50V,Id 200mA,Ciss 约 27pF。用它做 1.8V/3.3V 转换没问题。但有几个坑:
- 如果低压侧是 1.2V,Vgs 只有 1.2V,减掉体二极管压降后只剩 0.5V,MOS 基本不导通,电路会失效。1.2V 及以下必须换低阈值器件(Vgs(th) 0.4V 级别的,如 FDV301N)或者直接用专用芯片。
- 上拉电阻同样受上升时间约束,别默认 10k。按 2.2 节的方法算一下,1MHz 以上的信号用 MOS 方案基本没戏。
- 栅极接低压侧电源,意味着低压侧掉电时 MOS 关断,不会倒灌,这个特性在做上下电顺序不确定的系统时反而是优点。
布板上有两点要强调:一是 MOS 尽量靠近连接器或芯片引脚,别让两侧走线长度差太多;二是两侧上拉电阻到电源的去耦电容要就近放,100nF 起步,否则总线翻转时电源上的抖动会耦合回信号。
3.2 专用芯片怎么挑:TXS、TXB、PCA9306 的区别
一旦信号速率超过 2Mbps,或者通道数多到懒得堆 MOS,就该上专用芯片了。市面上主流的几类,选型逻辑差别很大,很容易买错。
TXS 系列(如 TXS0108E、TXS0102):自动方向感应,内部集成了 10kΩ 量级的上拉电阻和一次性加速电路。它最大的特点是能用于开漏总线(I2C),也能用于推挽信号。推挽模式下速率约 24Mbps,开漏模式下约 2Mbps。VCCA 必须低于 VCCB。价格便宜、通道多,是我做 I2C 跨电压时的首选。
TXB 系列(如 TXB0108、TXB0104):也是自动方向,但用的是推挽输出结构,速率能跑到 100Mbps。它的致命限制是不能用于开漏总线。因为内部是推挽驱动,如果总线另一头有别的器件也在驱动同一个电平,两个推挽输出对顶,就是标准的短路工况。我见过有人拿 TXB0104 接 I2C,上电就发热,就是这个原因。
PCA9306:I2C 专用双向转换,本质是两个 MOS 通道加一个使能结构,需要外部上拉,1.0V~5.5V 覆盖,支持 400kHz 标准速率,是目前 I2C 场景里最稳妥的选择之一。它有一个 Vref2 引脚接高压侧电源、一个 Vref1 接低压侧,通过内部参考结构自动建立偏置。用的时候注意别在两边都挂强上拉,会干扰它的内部偏置。
SN74LVC1T45 / 2T45 / 8T245 系列:带 DIR 方向控制脚的单/双/八路转换器,两侧供电范围 1.65V~5.5V 任意组合,速率最高 420Mbps。它必须由你手动控制 DIR 引脚,所以适合方向固定的推挽信号,比如 SPI 的 MOSI 一路、MISO 另一路,各用一颗。这个系列有一个很棒的特性:它支持部分断电保护(Ioff),一侧掉电时输出呈高阻,不会倒灌。
选型口诀可以记成这样:
- 开漏总线(I2C、SMBus、1-Wire):TXS 或 PCA9306,别用 TXB。
- 高速推挽(SPI、SDIO、并口):TXB 或 74LVC1T45。
- 方向固定、通道少:74LVC1T45,便宜好焊。
- 通道多、方向固定、信号是 3.3V 到 5V:直接上 74HCT245,5V 供电、TTL 输入门限,3.3V 能直接驱进去,输出是标准 5V 电平。
74HCT245 这个方案特别值得单独提一句,它是"3.3V 输入、5V 输出"最便宜的实现,一颗芯片解决 8 路单向信号,电源只用 5V 一路,不需要额外的 3.3V 供电,做简单的控制电路时非常省事。唯一要注意的是方向控制脚 OE 和 DIR 的电平要接对。
3.3 3.3V 转 5V 的几种实现对比与接线示例
3.3V 转 5V 是热词里出现最多的需求之一,方向是"从 3.3V 逻辑升到 5V 逻辑",实现方式其实不止一种。
第一种,如果接收端是 5V TTL(VIH=2.0V),前面说过,直连就行,成本为零。第二种,如果接收端是 5V CMOS(VIH=3.5V),必须转换,用 74HCT245 是最优解,它的输入阈值就是按 TTL 设计的,3.3V 输入能保证被识别为高。第三种,如果只有一两路信号,用 TXB0101 或者 74LVC1T45(高压侧供 5V)。
用 74LVC1T45 的典型接线是这样:VCCA 接 3.3V,VCCB 接 5V,A 口接 3.3V 侧信号,B 口接 5V 侧,DIR 脚决定方向——DIR 接低时数据从 A 到 B,接高时从 B 到 A。这里有一个参数必须看:芯片的 VCCA 和 VCCB 分别在什么范围时可以工作,以及上电时哪一侧先上电是安全的。74LVC1T45 支持任意一侧先上电,这一点在系统里有多个电源域的时候很重要。
对于"3.3V 输入转 5V 输出的简易控制电路"这种需求,我一般推荐两种极简方案:
- 只做一路信号:一颗 74LVC1T45,SOT-23-6 封装,外围只需要两个 100nF 去耦电容。
- 做 4~8 路信号:一颗 74HCT245 或 74AHCT245,SOIC-20,同样只需要一个去耦电容。
不推荐用三极管做的所谓"简易升压电路",因为三极管反相、上升沿慢、静态功耗大,用在正经的通信信号上问题很多。
4. 电源域配合:从 24V/12V 一路降到 3.3V 再谈转换
4.1 前级降压链路的设计与芯片选型
电平转换解决的是"信号电平",但在真实项目里,你往往先在电源侧就要完成一次大跨度的降压,比如 24V 电瓶、28V 电源模块降到 5V,再降到 3.3V。电源做不干净,电平转换的裕量再大也没用,因为噪声会直接吃掉你的门限余量。
先说 24V 转 5V 这一级。常见方案有几类:
| 芯片 | 输入范围 | 输出电流 | 开关频率 | 特点 |
|---|---|---|---|---|
| LM2596S-5.0 | 4.5~40V | 3A | 150kHz | 经典、耐压高、外围元件大 |
| TPS5430 | 5.5~36V | 3A | 500kHz | 效率高、外围小、需注意散热 |
| XL4015 | 8~36V | 5A | 180kHz | 大电流便宜,效率一般 |
| MP1584EN | 4.5~28V | 3A | 1.5MHz | 体积小,28V 输入是极限 |
24V 输入的选型要点是耐压。24V 标称的系统,满载波动加上线缆电感引起的尖峰,实际可能冲到 30V 以上;如果是 24V 铅酸电瓶,充电时电压能到 27.6V,锂电组甚至到 29.4V。所以输入耐压至少要有 1.5 倍裕量,也就是选 40V 及以上耐压的芯片。MP1584EN 标称 28V,用在 24V 系统上就很危险,属于踩线设计。
28V 转 5V 的电源模块同理,模块选型时看一下输入范围是"28V 最大"还是"28V 标称",前者不能用在 28V 系统上。
再说 5V 转 3.3V 这一级。这里最常见的坑是直接用 AMS1117-3.3 从 5V 掉到 3.3V,压差 1.7V。看上去不大,但功耗必须算:
def ldo_check(vin, vout, iout, theta_ja, tamb=40): p = (vin - vout) * iout tj = tamb + p * theta_ja return p, tj # AMS1117-3.3 SOT-223,带 1 平方英寸铜箔时 θJA 约 61°C/W for i in (0.1, 0.3, 0.5, 0.8): p, tj = ldo_check(5.0, 3.3, i, 61) print(f"Iout={i}A -> 功耗 {p:.2f}W,结温约 {tj:.0f}°C")输出 0.5A 时功耗 0.85W,结温约 92°C,已经很烫了;0.8A 时结温超过 108°C,会触发过温保护,表现出来就是"用一会儿就掉电,凉了又能用"。所以 5V 转 3.3V 只要电流超过 300mA,就别用 LDO 了,换成同步整流的 DC-DC,比如 TPS62130、MP2145、SY8089 这类,效率能到 90% 以上,发热可以忽略。
如果系统里已经有 5V 轨,而 3.3V 只需要几十毫安,那 LDO 是最省事的选择,噪声低、不需要电感,还能顺便把 5V 上的纹波滤掉一些。
另一种常见做法是两级降压:24V 先降到 5V,再从 5V 降到 3.3V。为什么要分两级而不是一步到位?因为单级 24V 转 3.3V 的占空比只有约 14%,很多芯片在窄占空比下效率会掉,最小导通时间也可能不满足,容易出问题;分两级之后每一级的压比都温和,整体效率反而更高。代价是多一颗芯片和一个电感,占板面积大一点。
4.2 5V 输出端到底要不要加 TVS 管
这个问题问的人特别多,我的回答是:看 5V 这一路的负载从哪里来、走多长的线。
如果 5V 只是板内给几个芯片供电,走线在 10cm 以内,同板上的其他电路都很规矩,那 TVS 的收益不大,一个 100μF 电解加若干 100nF 陶瓷电容就够了。
如果 5V 要出板、走线缆、接外设、或者接到继电器、电机这类感性负载附近,那 TVS 强烈建议加。线缆越长,耦合进来的浪涌能量越大,尤其是插拔瞬间,几安培的浪涌电流是常规操作。TVS 的作用是把这类瞬态能量钳到一个安全水平,避免后级芯片被击穿。
选型上要注意三个参数:
| 参数 | 含义 | 5V 系统取值建议 |
|---|---|---|
| 反向工作电压 VRWM | 正常工作时不能导通的电压 | 5V 或 5.5V |
| 击穿电压 VBR | 开始导通的电压 | 6.4~7.0V(如 SMAJ5.0A) |
| 钳位电压 VC | 大电流下的最高电压 | 低于后级器件绝对最大额定 |
| 结电容 Cj | 影响高速信号 | 电源线无所谓,数据线要选低容型 |
具体型号上,SMAJ5.0A 是 5V 电源最常用的选择,击穿 6.4~7.0V,17A 时钳位 9.2V,SMA 封装,成本几毛钱。要注意它的结电容在几百皮法量级,放在 DC 电源线上完全没问题,但如果你把它放在 USB 数据线或者高速差分对上,那点电容就足以破坏信号完整性了——数据线要用 SRV05-4 这类低容 ESD 阵列,单通道电容只有几个皮法。
还有一个位置细节:TVS 要放在最靠近连接器或最靠近被保护器件的地方,不要放在电源模块的输出端和器件之间随便找个地方。它的工作逻辑是"在哪挨打就在哪泄放",位置错了效果大打折扣。TVS 的接地走线要短而粗,最好直接打孔到地平面,别绕。
注意:TVS 是"扛一次就少一次"的器件,经历大能量浪涌后参数会漂移。如果是长期暴露在户外的设备,建议在 TVS 前面再加一级保险丝或 PTC,让它在极端情况下先断开。
4.3 5V 转 3.3V 的稳压芯片与语音芯片场景的特殊处理
5V 转 3.3V 的稳压芯片按前面说的原则选:小电流用 LDO(AMS1117-3.3、TLV1117、RT9013),大电流用 DC-DC(SY8089、MP2145)。这里补充两个实际项目里的细节。
第一,LDO 的输入输出电容不是随便放的。大多数 LDO 要求输入侧至少 1μF,输出侧在 1~10μF 之间,具体看手册的稳定性要求。有些老型号 LDO(比如早期的一些 1117 变种)对输出电容的 ESR 有范围要求,用纯陶瓷电容反而会震荡,输出上出现几百毫伏的周期性纹波,示波器一看非常明显。如果你遇到 LDO 输出无缘无故抖动,先换一个钽电容或者串一个 0.1~0.5Ω 的电阻试试。
第二,也是热词里提到的——语音芯片的 3.3V 输出。语音芯片的输出一般有两种形式:PWM 输出和内置 DAC 的模拟输出。这两种都不能用前面讲的数字电平转换方案来处理。
如果是 PWM 输出,它本质是一串占空比随音频变化的方波,频率通常在几十 kHz 到几百 kHz。你要做的不是"电平转换",而是"滤波+衰减":先用 RC 低通把载波滤掉还原成模拟波形,再看后级功放的输入范围决定分压比。指望用 MOS 管双向转换电路去处理 PWM,会直接把波形整形成一堆畸变。
如果是 DAC 模拟输出,那就更简单,用 AC 耦合电容加电阻分压把幅度降到功放能接受的范围即可。这里要算的是"信号摆幅"而不是"逻辑门限",两回事。我见过有人拿 TXS0108E 去接音频信号,结果出来的声音全是噪声,就是因为把数字转换器当模拟通道用了。
还有一点:语音芯片和功放共地的时候,要注意 3.3V 数字电源和 5V 功放电源之间的地弹。功放大电流开关时,地平面上的压差可能到几十毫伏,如果语音芯片的模拟输出以这个地为参考,就会串进"咔咔"声。解决办法是在功放电源旁加大容量电解电容,同时让模拟地和数字地单点连接。
5. 调试实录:典型问题排查与踩坑经验
5.1 常见故障速查表
板子回来不通电、通信不稳,先用这张表过一遍,能省不少时间。
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 高电平始终只有 1.8V | 高压侧上拉电阻没装或虚焊 | 万用表测电阻两端电压 |
| 低电平抬到 0.7V 左右 | 用错了二极管方案或 MOS 体二极管压降 | 看原理图确认方案 |
| 上电后 I2C 一直拉低 | 总线被某个器件死锁,或 TXB 用在开漏总线上 | 断开器件逐个恢复 |
| 通信跑一阵就丢包 | 上拉电阻偏大、总线电容偏大 | 示波器看上升时间 |
| 芯片发烫 | 推挽输出对顶、或 TXB 接开漏总线 | 断开总线测电流 |
| 5V 器件把 3.3V 电源顶到 3.9V | 5V 信号灌进非容忍引脚,经 ESD 二极管倒灌 | 断电测 3.3V 对 5V 是否导通 |
| 只有高频信号丢数据 | 门限裕量不足、走线反射 | 用示波器看眼图或过冲 |
热词里提到的 "BP1 5V PG voltage is outside of range" 是主板上常见的电源就绪信号超范围告警。PG(Power Good)信号的检测原理,是主板用比较器监控 5V 通过电阻分压后的电压,判断电源是否稳定。这类告警的原因通常有三种:一是 5V 实际电压确实偏出范围,二是分压电阻或比较器参考电压出了问题,三是 PG 信号的电平门限和主板的输入门限不匹配——这就绕回本文的主题了。如果你在设计 PG 信号时把 3.3V 器件的输出直接送给 5V CMOS 门限的检测电路,那这个告警就会一直报。
5.2 示波器和逻辑分析仪的实测手法
排查电平问题,光看万用表是不够的,万用表读的是平均值,完全看不出边沿质量。必须要上示波器。
实测的步骤如下:第一步,把探头打到 10:1 档(1:1 档的输入电容有 100pF 以上,接上去本身就会把信号拖慢),地线用弹簧地针,不要用那根长的鳄鱼夹地线,否则你测到的振铃一半是探头引入的。第二步,把时基设到信号周期的 1/2 左右,先看整体波形。第三步,把时基放大到上升沿附近,测 10%~90% 的上升时间,和手册的最大值对比。第四步,把触发电平设在 VIH 和 VOH 的中间,观察是否有毛刺穿过门限。
看波形的时候重点看四个东西:上升时间是不是超了、过冲有没有到绝对最大额定以上、低电平有没有被抬高、高电平有没有塌陷。我遇到过一次 I2C 偶发不通,示波器一看,高电平只有 2.4V——按说 3.3V 上拉应该到 3.3V,结果查出来是总线上一颗器件的 ESD 结构漏电,把高电平拉下来了一截。这种问题用逻辑分析仪是看不出来的,逻辑分析仪只告诉你 0 和 1,不告诉你电平质量。
逻辑分析仪的正确用法是抓协议,比如 I2C 抓出 NAK 出现在哪一帧、SPI 抓出哪一位错位。两者配合着用,效率最高。
5.3 我踩过的几个坑
第一个坑是上拉电阻拉到错误的电源。有一次做 1.8V 和 3.3V 互转,低压侧的信号线我顺手拉到 3.3V 上,结果 1.8V 的器件引脚长期承受 3.3V,用了两周就挂了。原理图上两个网络标号离得近,很容易看错,我的做法是让低压网络和高压网络在原理图上用不同的颜色区分,并且把"上拉到哪个电源"写在网络标号旁边。
第二个坑是忽略了上电顺序。系统里有 3.3V 和 5V 两路电源,5V 先上电、3.3V 后上电。如果 5V 器件的输出脚已经输出高电平,而 3.3V 器件还没上电,那这个 5V 就会通过 3.3V 器件的输入 ESD 二极管倒灌进去,把 3.3V 电源轨抬起来,严重的会锁死整个芯片。解决办法是选带部分断电保护(Ioff)的转换器件,或者在上电顺序上做保证,再或者串限流电阻。
第三个坑是拿同一颗芯片做双向,但方向控制脚接错了。74LVC1T45 的 DIR 脚决定方向,我在 SPI 的 MISO 上接反了,结果数据永远是 0。这个错误在原理图上很难看出来,因为 DIR 脚就是一个网络标号。我的做法是在原理图上给每个 DIR 脚写一句注释,说明这个方向是"主到从"还是"从到主"。
第四个坑是忽略了容性负载。有一次在一个 I2C 总线上挂了 6 个器件,走线又长,用 4.7k 上拉怎么都跑不稳。后来按 2.2 节的公式一算,总线电容接近 250pF,4.7k 的上升时间要到 1μs 以上,远远超了 400kHz 模式的 300ns 要求。换成 1.5k 上拉之后立刻稳定。代价是电流从 0.7mA 涨到 2.2mA,但在那个市电供电的场合无所谓。
还有一个教训是别迷信"理论上够用"。2.8V 驱 3.3V 那 0.24V 的裕量,在实验室常温下确实能跑,装到外壳里、夏天环境温度 50°C、旁边还有个 DC-DC 在开关,就开始随机出错。所以我现在做设计,凡是裕量小于 0.5V 的组合,一律加转换器件,不管预算多紧张。多花的那几毛钱,比后面改板便宜太多了。
最后分享一个我觉得很实用的习惯:在原理图上专门开一页"电平域检查表",把所有跨电压域的信号按起点电平、终点电平、方向、速率列出来,逐个标注处理方式。这张表在评审的时候能救命,因为信号一多,总有人会漏掉一两根——往往就是漏掉的那一根,在量产阶段给你添了大麻烦。