2. 调试接口基础

好,咱们正式开始聊 JTAG 的硬件接口。很多初学者拿到开发板,看到那排密密麻麻的针脚就头大。其实没那么复杂。JTAG 的核心,说白了就是 5 根信号线。你把这 5 根线搞明白了,剩下的电源和地都是陪衬。

五大核心信号,逐个拆解

JTAG 接口标准定义了 5 个主要信号。我习惯把它们分成两组:一组是控制线,一组是数据线。

信号名 全称 方向(对调试器而言) 核心作用
TCK Test Clock 输出 → 目标板 提供同步时钟,所有操作都跟着它走
TMS Test Mode Select 输出 → 目标板 控制 TAP 状态机的状态跳转
TDI Test Data In 输出 → 目标板 把数据或指令串行移入芯片
TDO Test Data Out 输入 ← 目标板 从芯片串行读出数据
TRST Test Reset 输出 → 目标板 (可选)异步复位 TAP 控制器

记住这个口诀:TCK 是心跳,TMS 是方向盘,TDI 是入口,TDO 是出口,TRST 是急刹车。

1. TCK —— 调试总线的“心跳”

TCK 是 JTAG 的时钟信号。所有操作——移数据、跳状态——都在 TCK 的上升沿或下降沿发生。我个人习惯在画原理图时,给 TCK 串一个 22Ω 或 33Ω 的小电阻,靠近调试接口放。为什么?为了抑制过冲。我在一个高速 DSP 项目上吃过亏,TCK 走线太长,波形振铃严重,导致调试器偶尔连不上。加了个小电阻,问题就解决了。

2. TMS —— 状态机的“方向盘”

TMS 信号在 TCK 的上升沿被采样。高电平还是低电平,决定了 TAP 状态机下一步往哪走。你想想看,整个 JTAG 协议的核心就是那个 16 状态的状态机。TMS 就是控制它跳转的唯一手段。调试器通过连续在 TCK 边沿改变 TMS 电平,就能把状态机引导到“移指令”或“移数据”的状态。

3. TDI —— 数据“入口”

所有要送给芯片的指令和数据,都从 TDI 脚串行移入。数据在 TCK 的下降沿变化,在上升沿被芯片捕获。这里有个细节:TDI 在芯片内部通常有上拉电阻。所以如果你把 TDI 浮空,它默认是高电平。嗯,这在某些情况下会引发意想不到的指令操作,后面讲边界扫描时再细说。

4. TDO —— 数据“出口”

芯片的响应数据从 TDO 脚串行送出。TDO 在 TCK 的下降沿更新数据,调试器在上升沿读取。TDO 通常是三态输出——只有在“移数据”状态下才有效,其他时候是高阻。这样多个 JTAG 器件才能菊花链级联。

5. TRST —— 可选的“急刹车”

TRST 是异步复位信号,低电平有效。拉低它,TAP 控制器立刻回到复位状态。这个信号是可选的——很多芯片只用 TMS 连续拉高 5 个 TCK 周期也能实现复位。但我建议:如果目标芯片有 TRST 引脚,尽量接上。我曾经在一个多核处理器项目上,因为 TRST 没接,上电后 TAP 状态机进入未知状态,折腾了两天才找到原因。从那以后,只要芯片有 TRST,我必接。

常见的 JTAG 连接器:20 针、14 针、10 针

搞清楚了信号,接下来就是物理连接器了。市面上最常见的 JTAG 接口有三种:20 针的 ARM 标准、14 针的 JTAG 标准、10 针的 SWD 简化版。我画了一张对比图,你看看就明白了。

常见 JTAG 连接器引脚对比 20-pin ARM JTAG ● 2 ● 1 ● 4 ● 3 ● 6 ● 5 ● 8 ● 7 ● 10 ● 9 ● 12 ● 11 ● 14 ● 13 ● 16 ● 15 ● 18 ● 17 ● 20 ● 19 2.54mm 间距,带防反插缺口 14-pin JTAG ● 2 ● 1 ● 4 ● 3 ● 6 ● 5 ● 8 ● 7 ● 10 ● 9 ● 12 ● 11 ● 14 ● 13 2.54mm 间距,较老的标准 10-pin SWD/JTAG ● 2 ● 1 ● 4 ● 3 ● 6 ● 5 ● 8 ● 7 ● 10 ● 9 1.27mm 间距,紧凑设计 引脚分配要点: • 所有接口的 1 脚都有特殊标记(方焊盘或三角箭头),用于防反插 • 20-pin 和 14-pin 的 TMS、TCK、TDI、TDO 位置基本固定 • 10-pin 接口常复用 SWD 信号(SWDIO/SWCLK),与 JTAG 兼容 • 所有接口都包含 Vref(参考电压)和 GND,用于电平匹配

20 针 ARM JTAG 连接器

这是目前 ARM 内核芯片最主流的调试接口。2.54mm 间距,双排 2×10。1 脚是方焊盘,用来防反插。我列一下常用的引脚定义:

引脚 信号 说明 引脚 信号 说明
1 VTref 目标板参考电压 2 VCC 调试器供电(可选)
3 nTRST 测试复位 4 GND 地
5 TDI 数据输入 6 GND 地
7 TMS 模式选择 8 GND 地
9 TCK 时钟 10 GND 地
11 RTCK 返回时钟(可选) 12 GND 地
13 TDO 数据输出 14 GND 地
15 nSRST 系统复位 16 GND 地
17 DBGRQ 调试请求(可选) 18 GND 地
19 DBGACK 调试应答(可选) 20 GND 地

我的习惯:画原理图时,把 20 针接口的偶数脚全部接 GND。这样信号线和地线交替排列,能有效降低信号串扰。尤其是 TCK 和 TDO 之间,隔一个地脚,波形干净很多。

14 针 JTAG 连接器

这个接口在早期的 ARM7/ARM9 和部分 DSP 上很常见。2.54mm 间距,2×7。它比 20 针少了 RTCK、DBGRQ、DBGACK 这些可选信号,以及部分 GND 脚。核心的 5 根信号都在。如果你手头的调试器是 20 针的,买个转接板就能用。

10 针 SWD/JTAG 连接器

这是目前 Cortex-M 系列最流行的接口。1.27mm 间距,2×5,非常紧凑。它既可以工作在 SWD 模式(只用 SWDIO 和 SWCLK 两根线),也可以工作在 JTAG 模式。很多开发板为了省空间,都采用这种接口。

引脚 JTAG 模式 SWD 模式 说明
1 VTref VTref 目标板参考电压
2 SWDIO SWDIO 数据 I/O(JTAG 模式下为 TMS)
3 GND GND 地
4 SWCLK SWCLK 时钟(JTAG 模式下为 TCK)
5 GND GND 地
6 SWO SWO 串行输出(可选,用于 ITM 调试)
7 NC NC 保留
8 TDO NC JTAG 数据输出
9 GND GND 地
10 nRESET nRESET 系统复位

避坑指南:我曾经在一个量产项目上,发现 10 针接口的 6 脚(SWO)没接,导致 ITM 调试数据死活出不来。查了两天原理图,最后发现是 PCB 封装库的引脚编号搞反了。所以画板子时,一定要核对连接器的 1 脚位置和 PCB 封装。别问我怎么知道的。

硬件设计上的几个关键点

聊完了信号和连接器,我再补充几个硬件设计时容易忽略的地方。

  • 上拉/下拉电阻:TMS、TDI、TCK 在目标板上最好加上拉(10kΩ 到 VCC),确保调试器没接时这些引脚处于已知状态。TDO 可以悬空或加弱下拉。
  • 串联电阻:TCK 和 TMS 走线建议串 22Ω~47Ω 电阻,靠近调试接口放置。这能抑制反射和过冲,提高信号完整性。
  • ESD 保护:调试接口是裸露在外的,容易被静电打到。我习惯在每个信号线上加一个 TVS 管(比如 PESD5V0S1UB),或者用集成 ESD 保护的电阻排。
  • 参考电压 VTref:这个脚用来检测目标板的工作电压,调试器据此调整 IO 电平。如果 VTref 没接或电压不对,调试器可能无法识别目标芯片。

一句话总结:JTAG 硬件接口,核心就是 5 根信号线 + 3 种常见连接器。搞懂信号功能,选对连接器类型,加上必要的保护电阻,你的调试接口就稳了。