先把结论放在前面:ST-Link/V2 的 nRST 信号线经过 TXB0108 电平转换器之后被拉到 0V,这不是 ST-Link 坏了,也不是目标板短路,而是 TXB0108 的推挽输出架构和复位线的开漏双向特性根本不匹配。标题里的现象我上周刚完整踩了一遍,这块板子的逻辑电平是 1.8V,ST-Link/V2 虽然是电平自适应,但手头这根转接线的 VCC 检测不太靠谱,信号畸变得厉害,于是我在中间串了一片 TXB0108,结果刚上电,万用表就显示 nRST 被死死摁在 0V,SWD 完全连不上。
这篇文章把整个排查过程、根因分析和三套可行改法完整写下来。如果你正打算给调试器配 TXB0108 系列做电平转换,建议先把复位线这个坑看完再动手。
1. 故障现象:一插转换器,nRST 就被摁死在 0V
先说硬件连接,方便你对号入座。目标板是 STM32L4 系列,核心逻辑 1.8V,NRST 引脚上有一个 100nF 对地电容,这是 STM32 复位电路的常规配置。调试器是原装 ST-Link/V2,20pin 座子的 VCC 脚接目标板的 1.8V,ST-Link 自动输出 1.8V 电平的 SWDIO/SWCLK。理论上这样也能直连,但实测波形边沿过冲和振铃都比较明显,我就加了一片 TXB0108,把它接在 ST-Link 和目标板之间:A 侧接 ST-Link 的 3.3V 域,B 侧接目标板 1.8V 域,三根线 SWDIO、SWCLK、nRST 全部走转换器。
上电之后故障非常稳定:ST-Link 的 nRST 输出端直接 0V,目标板的 NRST 也是 0V,整个 MCU 被强制复位,SWD 连接时提示 target not found。有意思的是,把目标板复位键按下去再松开,nRST 依然是 0V,不会恢复。把 TXB0108 从链路上拆掉,三根线全部直连,SWD 立即可用。这说明问题一定出在转换器这一环。
接着我做了两步定位。第一步,把 nRST 从 TXB0108 上摘掉,改成直通,只保留 SWDIO 和 SWCLK 走转换器,SWD 连接恢复正常,程序能烧录、能调试。第二步,再把 nRST 接回转换器,故障立即复现。到这里,范围已经缩得很小:TXB0108 的 nRST 通道就是那个把复位线摁在 0V 的元凶。
当时的测量数据也记录一下:ST-Link 侧 VCCA 为 3.3V,目标侧 VCCB 为 1.8V,TXB0108 的 OE 引脚接 VCCA 高电平,各供电脚的 0.1uF 去耦电容都有。nRST 通道 A 端输入在 ST-Link 空载时应该为高,但实际 A 端和 B 端都是 0V,而且 A 端对 VCCA 的电阻只有几十欧,这个静态电阻远低于正常高电平输入应有的阻抗。
2. TXB0108 的工作原理,以及它跟双向复位线打架的根源
要理解这个问题,得先把 TXB0108 的内部逻辑搞明白。它不是普通的三态缓冲器,而是一款端口自动方向感应的双向电平转换器,内部每个通道由一对推挽输出驱动器配合边沿加速器组成。芯片通过监测端口输入电平的变化来判断数据方向,谁先产生边沿,谁就当输入端,另一端就复制输出。这个设计在 GPIO、UART 这类单向或半双工信号上表现很好,但它有一个前提假设:信号在任何时刻都是由某一端主动强驱动的,另一端要么高阻输入,要么也能接受推挽驱动。
TXB0108 的推挽输出结构意味着,它无论输出高还是输出低,都是通过低阻抗通路主动驱动的,不是像开漏输出那样靠上拉电阻弱驱动。也正是这个推挽结构,让它在遇到开漏信号时会出问题。
再看复位线。STM32 的 NRST 引脚本质上是双向开漏信号,芯片内部只有一个约 40kΩ 的上拉电阻把复位线拉高,外部再接 100nF 电容到地。正常工作时,NRST 是高电平;当外部复位键按下或内部复位事件发生时,引脚内部的开漏 MOS 管导通,把复位线拉到地。复位完成后,MOS 管关断,依靠上拉电阻把电平拉回来。ST-Link 的 nRST 引脚也类似,调试器需要同时具备两种能力:一是主动拉低目标板复位引脚,二是检测目标板是否处于复位状态。所以它同样是一根开漏双向信号线,而不是单纯的推挽输出。
把这两样东西接在一起,问题就清晰了。TXB0108 在 nRST 通道上扮演的是一个推挽驱动源,它会把 A 端检测到的电平状态强制复制到 B 端。假设上电瞬间 ST-Link 的 nRST 引脚处于高阻输入状态,A 端电平应该是被上拉为高,TXB0108 的 B 端也应该跟着输出高。但注意,B 端连的是 STM32 的 NRST,引脚上有 100nF 电容,而 TXB0108 的推挽输出在静态时维持高电平的能力非常有限,它更多依赖边沿加速器在翻转瞬间提供大电流,之后很快就进入弱保持状态。100nF 电容对这种弱保持来说不是负载,而是敌人,它会吸收掉输出驱动器的电荷,让 B 端电平撑不住高,逐渐往下掉。
一旦 B 端电平掉到 TXB0108 输入阈值以下,芯片就会认为方向发生了反转,把 B 端当作输入端,转而把 A 端拉低。这时 A 端的 ST-Link 本来是高阻输入,被拉低后 ST-Link 也可能认为目标板处于复位状态,开始对复位线做拉低操作。两个方向判断互相锁定,结果就是 A、B 两端全部稳定在 0V。这就是为什么你拔掉转换器就正常,插上就 0V,而且永远不会自动恢复。
这个机制可以类比成两个人都以为对方在喊"让开",结果两个人都往同一个方向侧身,反而永远堵在一起。TXB0108 的自动方向判断面对双向开漏信号时,特别容易陷入这种逻辑锁死状态。
3. 完整排查链路:从换 ST-Link 到锁定 TXB0108 的过程
这个故障最坑的地方在于,现象看起来太像硬件短路了。nRST 对地只有几十欧,第一反应就是某个地方焊连了、线皮破了、或者 STM32 内部损坏。我一开始也走了弯路,怀疑过 ST-Link 本身有问题,甚至换过另一片目标板。下面把排查顺序完整列出来,你以后再遇到类似问题可以直接照着走。
第一步,去掉 TXB0108,ST-Link 三根线全部直连目标板,VCC 接 1.8V,SWDIO、SWCLK、nRST 直接飞线。此时 SWD 正常,说明 ST-Link 和被调试板都是好的。这一步的意义是建立基准,把"调试链路"和"转换器"两个环节分开。
第二步,只保留 SWDIO 和 SWCLK 走 TXB0108,nRST 仍然直通。连接正常。这排除了 TXB0108 的供电、OE、SWD 通道配置等问题,说明转换器本身在 SWDIO/SWCLK 上工作没问题。
第三步,把 nRST 也接回 TXB0108。故障复现。此时用万用表测 A 端和 B 端电压,都是 0V。用示波器看 A 端电平,除了 0V 没有任何活动;把 ST-Link 侧 nRST 断开,也就是让 TXB0108 的 A 端只接上拉电阻,B 端仍接目标板,故障依旧存在。这说明目标板的 100nF 电容和上拉网络已经被 TXB0108 的 B 端输出拉死了。
第四步,把 TXB0108 的 nRST 通道 B 端与目标板断开,只保留 A 端接 ST-Link,此时 A 端电平恢复正常高电平。这个测试很有价值,它说明 TXB0108 本身没有损坏,是 B 端负载导致整个通道被锁死。
排查到这里,基本可以确定是 TXB0108 驱动不了带 100nF 电容的开漏复位线。你可能会问,为什么 SWDIO 也有电容和双向特性,它却正常?因为 SWDIO 在调试协议里每个 bit 都由主从双方强推挽驱动,无论哪个方向,都有明确的驱动源在拉高拉低,不会出现"没人驱动、靠上拉保持"的窗口。而复位线恰恰长期处于"没人驱动、靠上拉保持"的状态,这正是 TXB0108 最不适用的场景。
4. 三套可行的改造方案与实测对比
我试过三套方案,各有优劣,直接说结论和实测结果。
方案 A,也是最省事的:nRST 不走转换器,单独绕行。SWDIO 和 SWCLK 继续走 TXB0108,nRST 用一根导线直连 ST-Link 和目标板。这个方案的前提是目标板 NRST 电平能被 ST-Link 接受。我的目标板是 1.8V 逻辑,ST-Link 的 VCC 也接 1.8V,所以 nRST 直连完全没风险。如果你的 ST-Link VCC 固定在 3.3V 而目标板是 1.8V,就不能直接这么干,需要在 nRST 上串一个 1kΩ 电阻分压,或者更稳妥地用一只 2N7002 MOS 管做单向电平转换。这套方案的可靠性最高,因为复位线完全绕开了 TXB0108 的推挽陷阱;缺点是如果你的板子上复位线也需要电气隔离,它不适用。
方案 B,换用 TI 的 TXS0108 或 TXS0102。TXS 系列和 TXB 系列的核心区别在于,TXS 输出端内置了上拉电阻,且允许开漏信号工作。TXS0108 的每个通道内部有一个约 10kΩ 的上拉,信号为高时靠上拉维持,拉低时由任意一端开漏驱动,这跟复位线的电气特性天然匹配。我拿了一片 TXS0108,把 SWDIO、SWCLK、nRST 都接到上面,实测 nRST 能正常保持高电平,复位功能也正常,SWD 连接稳定,烧录速度在 4MHz 时钟下没有丢包。这套方案的缺点是 TXS0108 是 8 通道,体积大、价格偏高,只为了三根线有点浪费;更经济的替代是 TXS0102 双通道版本,不过 nRST 需要另想办法,或者用两片 TXS0102 分别处理 SWDIO/SWCLK 和 nRST。
方案 C,自制一个开漏缓冲电平转换电路。原理很简单:用一只开漏输出的缓冲器,例如 SN74LVC1G07,把 ST-Link 侧 3.3V 的 nRST 信号接入缓冲器输入,缓冲器输出侧通过一个 4.7kΩ 上拉电阻连接到目标板 1.8V,输出再接到 STM32 的 NRST。这样 ST-Link 拉低复位线时,缓冲器输出拉低;ST-Link 释放时,上拉电阻把目标侧复位线拉高。反向方向不必要,因为调试器只需要主动控制目标复位,不需要反向检测目标复位状态。这块电路我用洞洞板搭过,三根线 10 分钟能焊好,实测效果与方案 B 一致,成本几乎可以忽略。缺点是需要动手,且占用一个缓冲器芯片。
三套方案实测对比可以看下面这个表。我个人的推荐顺序是:能直连 nRST 就选方案 A,电气条件不允许就选方案 C,方案 B 适合手头正好有 TXS 系列芯片的人。
| 方案 | nRST 静态电平 | 复位操作 | SWD 4MHz 稳定性 | 成本 | 硬件改动 |
|---|---|---|---|---|---|
| A. nRST 绕行 | 正常 1.8V | 正常 | 稳定 | 无 | 最小 |
| B. TXS0108 替代 | 正常 1.8V | 正常 | 稳定 | 中 | 换芯片 |
| C. 开漏缓冲 | 正常 1.8V | 正常 | 稳定 | 低 | 加小电路 |
5. 排查中的意外发现:OE 引脚、去耦电容和上电时序
既然已经在 TXB0108 上花了时间,顺便把这次排查中发现的三个容易忽略的坑也一起整理出来,它们不一定每个人都有,但遇到了都很浪费排查时间。
第一个坑是 OE 引脚悬空。TXB0108 的 OE 是输出使能引脚,低电平有效,内部没有默认上拉或下拉,悬空状态下芯片输出行为不确定。我第一次搭电路时为了省事,OE 直接悬空,结果上电后不仅是 nRST,连 SWDIO 都出现过随机锁低的现象。后来把 OE 接 VCCA,问题立刻消失。所有用 TXB 系列芯片的场景,OE 都必须明确接高或接低,绝不能悬空。
第二个坑是去耦电容位置和容量。TXB0108 的边沿加速器在信号翻转时需要从电源抽取很大的瞬态电流,如果 VCCA 和 VCCB 引脚旁没有足够近的去耦电容,电源纹波会直接耦合到信号上,表现为高电平跌落、门限误触发。数据手册要求每组电源至少一个 0.1uF 电容,且必须放在芯片电源脚附近 2mm 以内。我实际测试中发现,把 0.1uF 换成 1uF 之后,信号边沿的振铃明显变小。如果条件允许,每个电源脚都放 1uF 加 0.1uF 的组合是最稳的。
第三个坑是 VCCA/VCCB 的上电顺序。TXB 系列内部存在 ESD 保护二极管,从 I/O 脚到电源脚都有寄生通路。如果 VCCA 先上电而 VCCB 悬空,A 侧信号高电平会通过内部二极管给 VCCB 反向供电,导致 VCCB 升高到 1V 左右,芯片工作状态完全不可预期。正确做法是让两路电源基本同时上电,或者至少保证 VCCB 不悬空。在调试器链路里,最简单的方式是让 VCCA 和 VCCB 都从目标板同一路电源引出,经过两个 LDO 分别稳压,这样上电顺序就天然可控。
这三条虽然不是 nRST 掉零的直接原因,但如果你把 TXB0108 用在其它项目里,它们可能让你的调试体验变成玄学。我这次排查到后期,一度以为是 OE 悬空问题,把它接好之后 nRST 还是 0V,才最终确认根因在复位线的开漏特性上。
6. 附:ST-Link/V2 20pin 座子引脚定义速查
这个问题太常见了,顺手一起说掉。ST-Link/V2 上那个 2x10 的 20pin 座子,很多第一次用的人会被它搞晕,尤其是想自己飞线接 SWDIO、SWCLK、VCC、GND 时,不知道从哪数起。常见定义如下,供多数 ST-Link/V2 及克隆版参考:
| Pin | 名称 | 说明 |
|---|---|---|
| 1 | VCC | 目标板参考电压检测,也可在部分版本对外供电 |
| 2 | SWCLK | SWD 时钟 |
| 3 | GND | 地 |
| 4 | SWDIO | SWD 数据 |
| 5 | GND | 地 |
| 6 | NRST | 目标板复位 |
| 7 | GND | 地 |
| 8 | TDI | JTAG 用,SWD 可不接 |
| 9 | GND | 地 |
| 10 | TDO/SWO | JTAG TDO,SWD 下可作 SWO 串口输出 |
| 11 | GND | 地 |
| 12 | NC | 不用 |
| 13 | GND | 地 |
| 14 | NC | 不用 |
| 15 | GND | 地 |
| 16 | NC | 不用 |
| 17 | GND | 地 |
| 18 | NC | 不用 |
| 19 | GND | 地 |
| 20 | NC | 不用 |
接线时注意几个关键点。第一,Pin1 的 VCC 不是固定的 3.3V 电源输出,它是参考电压检测脚,标准用法是接到目标板的电源上,让 ST-Link 知道目标板的逻辑电平是多少。如果你的克隆 ST-Link 上这个脚直接输出 3.3V,也先确认一下再连,别默认它就是输入。第二,最低限度的 SWD 接线只需要三根:SWCLK、SWDIO、GND,不需要 VCC,也不需要 NRST。很多板子只接这三根也能烧录,但复位引脚不接的话,某些情况下调试器无法在连接时复位目标芯片,可能出现烧录后需要手动复位才能运行的现象。第三,20pin 座子的引脚顺序是奇数 1-19 在一排、偶数 2-20 在另一排,1 脚通常在座子角落有三角或方点标记,接杜邦线前最好先拿万用表确认一下 2 脚和 4 脚的位置。
回到 ST-Link 与电平转换器搭配这个话题。经过这一轮排查和改造,我个人的习惯是:除非只是把 SWDIO 和 SWCLK 这样的推挽信号做电平搬迁,否则不会把 TXB0108 用进调试链路。复位线、电源控制脚这类带双向开漏性质的信号,宁可单独用一个开漏缓冲器或者直接飞线绕行,也别硬塞进自动方向的推挽转换器里。最后再提醒一句,拿到 ST-Link 先量一下 20pin 座子的 1 脚和 2 脚,确认 VCC 和 SWCLK 的位置再接线,能省掉不少排查时间。