资讯动态

JTAG边界扫描实战:从原理到现代PCB板级测试排障指南

发布时间:2026/8/26 9:22:04 来源:尧图企业网站定制
前两天整理工作笔记翻到去年给一批新同事做内部培训时画的JTAG边界扫描拓扑图突然觉得这个技术被太多人当成老古董了。标题当时用的是Bringing JTAG Boundary Scan into 2021其实想表达的核心就一句话在BGA封装烂大街、PCB密度高到飞针都戳不中的年代JTAG边界扫描不但没有过时反而成了板级互连验证里最不可替代的手段之一。这篇就当一次偏实操的复盘吧把这几年我在产线测试、板级调试、还有MCU开发里碰到的边界扫描相关问题从原理到工具再到排障尽量讲透。适合刚接触边界扫描的硬件工程师、懂点FPGA/ARM的嵌入式开发以及所有被板子莫名连不上、偶尔能连上、换一块又连不上折磨过的人。1. 为什么到2021年我们反而更离不开边界扫描1.1 它不是老技术只是过去没被逼到这一步很多人一听到JTAG脑子里蹦出来的第一个画面就是给单片机下载程序、接上调试器打断点。这个印象没有错JTAG最初确实是用来做芯片级调试的但它真正的完全体是边界扫描Boundary Scan也就是IEEE 1149.1标准定义的那套东西。边界扫描的出发点非常朴素当PCB上的芯片封装越来越密BGA焊球藏在芯片肚子底下飞针测试扎不到、示波器探头伸不进去这时候如果芯片自己能把每一根引脚的状态给吐出来甚至主动控制每一根引脚的电平那么板级互连的开路、短路、错接问题就可以绕开物理接触来完成测试。这个事情在20世纪90年代是可选优化项因为当时电路板走线宽、封装脚步大万用表加飞针基本能覆盖90%的故障。但到了2021年一块核心板上是DDR、PCIe、SerDes、以太网PHY、FPGA动不动就是十层以上BGA引脚间距从0.8mm一路卷到0.4mm飞针测试成本直线上升物理探针接触可靠性也成问题。于是边界扫描从锦上添花变成了产线必须。1.2 2021年真正变了的三个地方第一芯片的BSDL文件Boundary Scan Description Language获取比从前容易太多。早年间问原厂要BSDL文件要走FAE、签NDA现在TI、Xilinx、Intel、Altera这些大厂基本都挂在官网上输入型号直接下载国产FPGA厂商也开始主动提供。这一步的门槛一旦降下来自测的门槛就跟着降。第二开源工具链成熟了。十年前想自己写脚本控制JTAG适配器抓IDCODE还得去啃晦涩的C库。现在靠Python、pyftdi、pyjtag这类库几十行代码就能把一条扫描链上的所有器件识别出来对做研发验证来说完全够用。第三产品的多板互连趋势越来越强。服务器、通信设备、汽车域控制器动不动就是背板加一堆子板板与板之间的连接器有几百个引脚。连接器虚焊、插针歪斜、接触不良这类问题物理上极难定位而边界扫描可以通过在A板上驱动某个引脚、在B板上读回状态直接把故障定位到具体某一根引脚上。所以Bringing JTAG Boundary Scan into 2021这个题目本质不是要给老技术贴金而是提醒做硬件的同行在测试手段的选择上边界扫描不该被排在最后实在没办法才用的位置它应该是DFTDesign for Test设计阶段就要规划好的基础设施。2. 核心机制引脚、状态机、指令和BSDL2.1 先把引脚定义记牢虽然JTAG的电气实现各家略有不同但IEEE 1149.1规定的四根必备信号和一根可选信号是通用的这是所有后续操作的地基。引脚名名称方向作用TCKTest Clock输入测试时钟所有的移位、状态跳变都在TCK上升沿或下降沿触发TMSTest Mode Select输入模式选择控制TAP状态机的跳转TDITest Data In输入测试数据输入在移位状态下进入指令寄存器或数据寄存器TDOTest Data Out输出测试数据输出在TCK驱动下把数据移出TRSTTest Reset输入可选异步复位TAP状态机一般低电平有效这里有个非常容易踩的坑TMS、TDI、TCK这些输入信号在目标板上一般需要接上拉电阻到VCCTDO是输出通常挂一个小下拉或者直接接控制器。但具体阻值要看芯片手册有些MCU把JTAG引脚和GPIO复用内部上下拉状态会影响外部电路设计。我见过不少扫描链时好时坏的案子最后查出来就是上拉电阻漏贴或者阻值选得太大导致边沿太缓。还有一个常见误区TCK的频率不是越高越好。TCK走线长、连接器接触电阻大、多板互联的时候高速TCK会带来严重的信号完整性问题。2021年做的那几块板子我的经验是研发调试阶段先锁在1MHz以下产线测试再根据实际情况慢慢往上提别一上来就追求几十兆赫兹。2.2 TAP状态机和指令寄存器JTAG的大脑是TAPTest Access Port状态机。简单理解它就是利用TMS的信号序列让芯片内部的逻辑在上电之后进入各种测试状态。常用状态包括Test-Logic-Reset复位状态TMS持续拉高至少5个TCK周期就能回到这里Run-Test/Idle空闲状态通常是执行指令时停留的地方Select-DR-Scan / Select-IR-Scan选择数据寄存器或指令寄存器通道Capture-DR / Shift-DR / Exit-DR / Update-DR数据寄存器移位操作的四步Capture-IR / Shift-IR / Exit-IR / Update-IR指令寄存器移位操作的四步之所以要花篇幅讲状态机是因为排查问题的时候经常要看波形确认TAP是否成功进入了Shift-DR状态。我自己用逻辑分析仪抓TDO数据的时候第一步永远是确认TMS的状态转换序列是不是符合预期而不是直接分析后面的数据。指令寄存器IR装载的指令决定了当前数据寄存器DR通道连接什么。最常用的三条指令BYPASS旁路指令让芯片在扫描链上只占用1个移位周期用于链上多器件时快速跳过某个芯片IDCODE读取芯片的ID代码寄存器32位包含厂商、器件编号、版本号EXTEST进入外部测试模式捕获引脚输入状态同时通过边界扫描单元驱动引脚输出这是互连测试的核心指令SAMPLE/PRELOAD采样引脚实时状态或者在不影响正常运行的情况下预装载边界扫描单元数据边界扫描单元BSC是挂在芯片每个数字引脚内部的一个移位寄存器单元。正常模式下它不干预引脚功能一旦进入EXTEST模式所有BSC串成了边界扫描寄存器BSR每个引脚的状态就能被抓出来或者写进去。这就是为什么BGA焊盘没法物理接触我们依然能测到每个球的开路短路。2.3 BSDL文件就是边界扫描的地图拿到一颗芯片怎么知道它的JTAG指令怎么编码、边界扫描单元按什么顺序排列、每个单元对应哪个引脚答案全在BSDL文件里。BSDL是VHDL的子集它是芯片厂商发布的描述文件里面包含了器件引脚名称、封装信息、TAP指令寄存器长度、每条操作码的编码、边界扫描寄存器的具体结构。测试工具读取BSDL之后才能自动生成正确的测试向量。这里给个实际体验工具报IDCODE mismatch或者BSDL不合规的时候不要急着怀疑硬件先把BSDL文件版本和芯片的silicon版本一一对上。芯片厂商修bug更新硅片后边界扫描寄存器顺序可能会微调而网上能下到的BSDL文件往往还是旧版。2021年我调一块SoC平台的板子连续报同一个引脚的测试错误折腾了三天最后发现就是BSDL版本比芯片实际版本低了一级。这件事之后我养成了一个习惯只要芯片批次有变化先重新核对BSDL。3. 实操搭建一套现代JTAG边界扫描测试环境3.1 硬件选型从几十块钱的调试器到几万块的工业控制器边界扫描测试的上手难点不在理论而在选对一套能让你跑起来的硬件工具。对研发验证来说我强烈建议用基于FT2232H这类USB转双通道UART/FIFO芯片的JTAG适配器。市面上很多开源调试器的核心就是FT2232H它的好处是同时提供两根高电平驱动能力够的IO通道可以灵活用MPSSE引擎模拟JTAG时序。价格不贵带宽对于扫描链识别、低速互连测试完全够用。如果是要上产线做批量测试那就绕不开工业级边界扫描控制器。这类设备比如JTAG Technologies、Corelis、XJTAG等厂家的产品贵有贵的道理通道数多、支持多TAP同时扫描、驱动能力强、软件生成测试向量自动化程度高。它们能处理的板级节点数量、故障覆盖率、日志追溯能力不是几百块钱的适配器能替代的。我个人对选型的建议是不要一上来就买最贵的工业控制器先用FT2232H加开源脚本把板子的扫描链结构摸清楚确认边界扫描方案在当前板子上跑得通再根据产线节拍决定要不要上工业设备。等踩完了链路、时序、BSDL这些坑再花大钱也不迟。3.2 软件工具链开源组合拳足够打天下软件这块商业软件不用说功能强大但授权费摆在那。如果你和我一样先在实验室里做验证可以走这条免费路线UrJTAG老牌开源JTAG工具支持BSDL解析和基本的BSDL测试操作适合学习OpenOCD虽然主要面向调试但它的JTAG底层接口成熟接上FT2232H后可以直接用telnet命令操作TAP查看IDCODE甚至执行一些简单的扫描操作pyftdiPython库直接控制FTDI设备的MPSSE可以让你从零开始手写JTAG时序这是理解和排查问题的最好方式pyjtagPython层的JTAG边界扫描库封装了很多底层的操作这里给一段用pyftdi读取链上IDCODE的最小示例方便大家先跑通硬件链路from pyftdi.jtag import JtagEngine, JtagTool from pyftdi.ftdi import Ftdi # 初始化FT2232H的通道A作为JTAG控制器 ftdi Ftdi() ftdi.open(ftdi://ftdi:2232h/1, frequency1_000_000) # 创建JTAG引擎 jtag JtagEngine(ftdi) # 复位状态机并读取IDCODE jtag.reset() idcode jtag.read_idcode() print(fDetected IDCODE: 0x{idcode:08X})需要注意不同版本的pyftdi接口可能会有细微差异但整体思路一致先复位TAP状态机然后让它进入移位状态把IDCODE寄存器的数据移出来。如果这一步都读不到合法IDCODE后面什么都别谈。3.3 最基础的扫描链验证步骤硬件和软件都准备好之后第一次跑通边界扫描测试我建议按下面这个顺序来全部器件上电确认扫描链上的每个芯片都有供电测量TDO引脚的静态电平是否正常。读取每个器件的IDCODE和BSDL文件里声明的一致。如果链上有4个器件理论上应该能依次读出4个不同的IDCODE。执行一条最简单的EXTEST把链上第一个芯片的某个引脚置为高电平在第二个芯片的对应接收引脚上读回高电平。这能验证最基本的互连通路。生成一个小的开路/短路测试向量集针对某一组关键互连跑一遍观察测试报告。跑通第2步说明JTAG链路物理上是通的跑通第3步说明边界扫描单元真的在起作用。从这以后你才算真正把边界扫描用起来了。4. 边界扫描在现代板卡上的应用场景4.1 PCB裸板互连测试飞针之外的另一个选择飞针测试是最经典的裸板测试方案但在高密度BGA板上飞针能覆盖的测试点非常有限。大芯片的关键信号全部从BGA肚子底下引出表面压根没有测试点可用。这时候边界扫描的价值就体现出来了测试机只需要物理接触到板上的JTAG接口剩下的引脚连接检查全部通过芯片内部的边界扫描单元完成。边界扫描能在不依赖测试点的情况下覆盖芯片互连引脚的开路、短路故障。对DDR总线这类并行信号还可以设定简单的约束检测两个数据线之间短路这类生产中最常见的缺陷。当然边界扫描不能覆盖所有故障比如纯模拟信号、电源网络、高速差分对的物理层问题它就管不了。所以边界扫描加飞针在产线上是配合关系不是替代关系。这个认知很重要省得你做完边界扫描后误以为整板互连都可以高枕无忧。4.2 在板调试把故障定位到具体引脚板子已经从贴片机出来、核心CPU也能跑系统了但某个外设功能时好时坏这种板级幺蛾子是最消耗工程师精力的。2019年我调过一块板FPGA与ADC之间的并行总线偶发数据错位示波器测波形看不出明显异常逻辑分析仪一接上系统就崩。后来冷静下来利用FPGA的边界扫描能力先把FPGA所有IO口切成输入并采样读取ADC那边的引脚状态发现有一组引脚在特定温度下读到了不定态。再配合定位最后查到是某个0.1mm间距连接器的一个虚焊引脚在冷热应力下接触电阻漂移。这种在板故障定位的能力常规工具很难企及。你把芯片的SAMPLE/PRELOAD指令用起来在系统运行状态下悄悄采集引脚状态不需要打断系统运行也不需要物理接触被测引脚。4.3 与调试功能共存关闭JTAG的那些常见场景边界扫描和调试器都走JTAG接口但实际工程里有个非常普遍的冲突MCU的JTAG引脚被复用作GPIO或者芯片为了安全禁用了JTAG导致调试器连接不上。STM32就非常典型。默认情况下STM32的PA13/PA14/PA15/PB3/PB4是JTAG/SWD调试引脚。如果软件里把这几个引脚配置成普通GPIOJTAG调试功能会被硬件自动关掉此时仿真器就再也连不上了。很多人第一次遇到这个问题第一反应就是芯片是不是烧了。恢复方法有好几种我用过比较稳的如果代码只禁用了JTAG但保留了SWD也就是只把PA13/PA14留作SWDIO/SWCLK那么直接用SWD模式连接还能连上。如果连SWD都关了把BOOT0拉高到1复位后进入系统存储器此时调试口是开放的可以用串口ISP把用户的选项字节或Flash里的代码擦掉再恢复BOOT0回0重新烧录。如果芯片支持全片擦除指令可以在上电瞬间按住复位在复位释放的第一时间尝试连接并执行擦除时序上需要多试几次。STM32之外恩智浦S32K系列有专门的调试安全保护机制需要通过DCFDevice Configuration File预先配置调试口权限。这类MCU如果开了JTAG保护解锁流程和普通芯片完全不一样必须在设计时就把调试/测试策略考虑进去否则后期解锁会非常痛苦。国产高云FPGA的JTAG识别不到也是工程师群里高频问题。排查顺序一般是先确认下载器驱动正常、USB识别到了再量目标板上的JTAG引脚上拉电阻和电平然后确认FPGA核心供电和配置引脚状态最后再检查下载器线序是不是被转接板搞反了。这类问题九成以上是供电或引脚接触真正芯片坏掉的情况反而少。4.4 大规模扫描链和多板互连的调试策略背板加多子板的系统扫描链往往不是一根线性链而是通过多个连接器跨板延伸。设计时要注意链的拓扑结构和信号回流路径。我常用的一个经验法则一条JTAG链上的器件不要超过8个不然TDI/TDO链路一路穿下来延迟累加会让低速工具链非常难受。如果器件多优先考虑并行多通道控制器或者把链拆成独立的两三路分别驱动。跨板连接器是另一个故障高发区。每经过一个连接器TDI/TDO/TCK/TMS信号就多一次接触电阻和寄生电容。2021年我测过一套12U机箱背板扫描链跨了三块子板首尾链路阻抗差异很大最后只能把TCK降到500kHz才稳定跑完整个链。这类系统的排查建议先分段验证每块子板单独上电读IDCODE确认本板链路正常后再互联。5. 常见问题与排查技巧实录5.1 扫描链完全识别不到这是所有接触边界扫描的人都会碰到的问题。我总结了一个排查优先级表现象可能原因排查动作TDO始终为高TAP状态机未正确进入移位状态检查TCK/TMS时序确认TMS是否有正确的跳变序列TDO始终为低TDI链路断开或目标芯片未上电测量芯片电压检查TDI到第一个芯片的连接读取IDCODE全是0xFFTDO线被上拉到高电平检查TDO到控制器之间是否有断开或对VCC短路读取IDCODE全是0x00TDO线对地短路或芯片JTAG被禁用断开TDO测静态电平检查芯片是否有JTAG保护读出的IDCODE不符合任何BSDL链序接错或某颗芯片BYPASS用单颗芯片单独上链测试排查这类问题我个人的工作习惯是先软件脚本不停地读IDCODE同时用示波器同时抓TDO和TCK的波形看TDO在TMS进入移位状态后是否跟着TCK翻转。因为软件层面的报错信息往往不直观而波形能直接告诉你芯片的TAP到底动没动。5.2 间歇性连接时好时坏最难搞比完全不通更折磨人的是第一次能识别跑一会儿就不行了或者换一块板就好上一块就不行。这类问题多半出现在高频或长链路场景。我遇到过的典型原因有三个一是TCK频率太高超过链路本身的承载能力下降沿和上升沿的延时导致TMS在采样点附近不稳定二是TDO链路受到相邻信号串扰尤其当TDO布线经过高速信号区时误码率会明显上升三是供电纹波太大某些芯片在电源电压临界状态时IDCODE读到一半就丢掉时序同步。解决办法对应着来降频到1MHz以下先确认稳定再把TDO布线单独远离高速区最后给JTAG接口加一个104去耦电容或者用独立电源隔离。还有一个特别容易被忽略的点扫描链末端不要忘了加终结电阻。链上最后一个芯片的TDO输出如果不做阻抗匹配反射信号会在上升沿形成振铃严重时直接导致误码。很多工业级控制器手册都要求末端挂电阻但自制的适配器往往会漏掉这个细节。5.3 互连测试误报明明焊得很好测试却报错误报和漏报都会让人抓狂。误报指的是实际连接正常但边界扫描测试报开路或短路。出现这种情况先别怀疑焊接八成是边界扫描单元本身的电源问题。边界扫描单元的I/O逻辑是需要电源域供电的。如果被测芯片有多个电源域而某个电源域没有上电那么对应引脚的边界扫描单元就处于不确定状态测试结果自然不稳定。这种情况下需要检查哪些IO域被内建在扫描链中并确保测试时所有相关的电源域都已经按照BSDL中的要求上电。另一个误报来源是芯片进入了低功耗状态。我在调试一块车规级SoC时芯片默认在空闲一段时间后自动休眠导致边界扫描测试时芯片IO状态不确定。解决办法是在测试前通过TAP向芯片发送一条唤醒指令或者禁止测试模式下的休眠功能。关于漏报实际有开路但测试没发现最常见的原因是测试向量覆盖率不够。如果你的互连测试只覆盖了数据线没有覆盖片选、时钟、复位这些控制信号那么控制信号开路时其他逻辑可能仍然表现出正常状态。所以生成测试向量时尽量手动补充关键控制信号的测试项不要完全依赖工具自动生成的向量。5.4 调试口被关闭和JTAG保护的具体恢复操作给几个容易上手的具体操作步骤以STM32为例把BOOT0接高电平BOOT1接低电平复位进入系统存储器。通过UART1PA9/PA10连接STM32CubeProgrammer的串口ISP模式。读取Flash和选项字节。如果只是禁用JTAG但Flash里还有用户程序那么直接全片擦除或者修改选项字节中的Debugging选项把调试口重新打开。擦除完成后再把BOOT0拉回低电平重新上电此时JTAG口恢复默认开放状态。对S32K这类带DFC保护的芯片思路是类似的但关键在于DCF配置是写在eFuse或Flash中的一次性配置一旦使能了调试保护不借助特殊解锁流程很难恢复。所以这类芯片我强烈建议在打板之初就评估调试策略别指望后期能强行绕过。6. 我这些年用JTAG边界扫描攒下的几条经验第一边界扫描必须从设计阶段就开始规划。画PCB的时候把JTAG链的走向当成一条正经信号链路来布线给TDI/TDO/TCK/TMS留好完整的地回流路径别图省事随手拉线。我见过太多板子原理图阶段忘了留JTAG测试点回来补的时候只能在连接器上飞线费时费力还不可靠。第二BSDL文件的版本管理要做到项目里。每一版芯片换料、升版本都要核对BSDL是否仍然匹配。我自己的习惯是建一个和BOM走同一套审核流程的BSDL登记表换芯片批次就触发一次复核。第三工具链的自动化脚本值得投入。跑通一次手动测试不算什么真正解决问题的是把IDCODE核对、向量生成、测试报告解析全部脚本化。有了这套脚本每次来新板子先跑一遍基线测试十分钟就知道这批板子的互连健康状况。第四也是最想提醒的一句话别在把边界扫描当作调试器的附属功能。它是独立的测试基础设施在产线、售后、研发调试三个阶段都能发挥作用。很多问题你在实验室用示波器抓半天不如在产线用边界扫描跑一轮全链路互连测试来得直接。把JTAG边界扫描带进2021年不是告诉大家用什么新芯片、新协议而是希望做硬件的同行重新认识这个低成本、高价值的测试手段。很多时候电路板故障判断慢不是因为工具不够贵而是因为手里明明握着边界扫描这把好用的钥匙却一直没想起来去开门。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价