最近手里有一块六层板,量产前做板级测试时卡住了:板子功能逻辑已经调通,但用了三片BGA封装的FPGA、两片LPDDR,还有几组高速差分对。飞针测试根本够不到BGA底下的引脚,示波器探头也没有那么细,常规的ICT治具又贵得离谱。同事说,这要是放在十多年前,老师傅直接拿万用表挨个点测试点就行,可现在引脚间距已经压到0.5mm以下,BGA焊盘扇出后内部网络根本看不见。这时候我才真正意识到,2021年了,JTAG边界扫描(Boundary Scan)不仅没被淘汰,反而是板级测试里最可靠、性价比最高的一种手段。
JTAG边界扫描的核心价值就是把芯片每一只管脚的状态"拉出来"变成一串可移位的数字,从而在不直接接触引脚的情况下做互连测试、故障诊断,甚至在线配置FPGA。它适合硬件工程师在PCB调测阶段排除短路虚焊,也适合工厂端的治具测试,还能帮嵌入式工程师在芯片被完全锁死之前想办法恢复调试口。这篇文章就把我从原理到实操踩过的坑完整梳理一遍。
1. 边界扫描为什么在2021年依然值得翻出来重讲
1.1 从一块塞满BGA的板子说起
现代板卡的趋势就是把越来越多的功能塞进高密度封装里。BGA引脚间距从1.27mm到0.8mm再到0.5mm甚至0.4mm,一颗芯片几百个引脚,其中还有大量电源地引脚在网络上是直接并联的。你根本没法靠肉眼或者万用表判断相邻两个引脚之间有没有焊桥。
这种情况下,传统做法的成本让人头疼:
- 飞针测试:精确,但慢。单板测试时间动辄几十秒到几分钟,量一大就扛不住。
- ICT治具:速度快,但针床治具昂贵,改板一次就要跟着改治具,重做周期长。
- 人工目检加万用表:只能照顾到顶层的、引脚稀疏的器件,对BGA无能为力。
边界扫描从另一个角度绕开了物理接触问题。它不需要探针接触到目标引脚,只要芯片支持IEEE 1149.1,并且PCB上把JTAG链路布通,工具就能通过TAP口把每一只管脚的输入输出状态读回来、写出去。这就等于给每颗芯片的每个引脚装了一个虚拟探针。
所以到了2021年,这个技术不但没有老去,反而因为高速接口和BGA器件的普及,成为量产测试里不可缺少的兜底手段。特别在通信板卡、工控主板、汽车电子ECU这些高可靠性产品上,JTAG边界扫描往往是ICT和飞针之外唯一能覆盖到BGA引脚的测试途径。
1.2 同一套引脚,两种完全不同的"JTAG"
很多新手会把"JTAG下载调试"和"JTAG边界扫描"当成一回事,其实它们共用物理接口,但工作内容完全不同。
- 调试下载JTAG:通过内核的Debug Access Port访问CPU寄存器、内存,用于烧录程序、断点调试。
- 边界扫描JTAG:通过IEEE 1149.1定义的TAP控制器访问芯片边界扫描寄存器,用来测试引脚互连、采样输入状态、输出特定电平。
同一个J-Link、ST-Link能对STM32烧录,靠的是前者;而XJTAG、JTAG Technologies这类测试工具能扫描整块PCB上的互连,靠的是后者。很多芯片同时支持两种模式,但进入哪个模式由TAP状态机和指令寄存器决定。
我在实际项目中经常遇到这种情况:软件工程师以为边界扫描工具也能像调试器一样读出内存,硬件工程师以为调试器可以帮他做引脚短路测试。这俩虽然有重叠,但选型时必须搞清楚目标。边界扫描工具不负责调试程序,它只负责"看"和"控制"芯片引脚级状态,所以排查板级硬件故障它的效率远高于调试器;反过来,要trace一段内核代码,调试器的功能是边界扫描工具替代不了的。
2. 引脚定义与电气设计:边界扫描的物理底座
2.1 TCK、TMS、TDI、TDO各自干什么
IEEE 1149.1标准定义的JTAG口最少需要四根信号线加一根地线,有些还会加一根可选的TRST复位线。它们的职责很简单:
- TCK:测试时钟,由主机产生,所有的TAP状态变化都发生在TCK上升沿。
- TMS:测试模式选择,在TCK上升沿被采样,用来驱动TAP状态机在不同状态之间跳转。
- TDI:测试数据输入,串行数据从这根线进入指令寄存器或数据寄存器。
- TDO:测试数据输出,数据从这里串行送出,回传给主机。
- TRST:可选,用来异步复位TAP状态机,不是所有芯片都有。
为什么TMS和TDI通常要上拉、TCK通常要下拉?这跟TAP状态机复位有关。TAP的Test-Logic-Reset状态要求TMS连续五个TCK周期保持高电平。如果TMS悬空,谁也保证不了它是个确定电平,系统一上电TAP可能跑进未知状态。上拉到高电平之后,只要主机不发时钟,TAP就容易落到复位状态。TDI上拉同理,防止数据在空闲时乱飘。TCK下拉则是保证静态电平时钟线处于低电平,避免因为噪声误触发。
实际Layout时,这几个电阻的位置也很有讲究。应该放在JTAG连接器或者调试端口附近,尽量靠近主控一侧。串阻可以加在主机与目标板之间,常见33欧姆到100欧姆,用来抑制反射。我的习惯是TCK、TMS、TDI各串33欧姆,TDO不串或者串小阻值,保证回传信号完整度。
2.2 边界扫描单元、BSDL与TAP状态机如何协同
边界扫描的本质是芯片内部有一串边界扫描单元(BSC),它们串联成一个边界扫描寄存器(BSR),每个BSC对应一个引脚。你可以把这个寄存器想象成一排可以串行进出的锁存器:
- 驱动模式:把某个BSC写入1或0,芯片对应引脚就会输出高或低电平。
- 采样模式:对某个BSC做捕获,就能读到该引脚当前的输入逻辑。
TAP状态机则是这串寄存器的调度中枢。标准的1149.1状态机有16个状态,包括Test-Logic-Reset、Run-Test/Idle、Select-DR-Scan、Capture-DR、Shift-DR、Exit1-DR、Pause-DR、Exit2-DR、Update-DR、Select-IR-Scan,以及对应IR侧的Capture、Shift、Exit1、Exit2、Update。整个过程像流水线:先通过TMS切到IR扫描,把一条指令写进指令寄存器,比如EXTEST;再切到DR扫描,把测试向量通过TDI串行移入BSR,然后执行;最后把响应通过TDO移出来和期望值比对。
BSDL文件(Boundary Scan Description Language)是这一切的说明书。芯片厂商会发布对应的.bsd文件,里面定义了芯片每个封装的引脚名、边界扫描单元顺序、支持的指令、IDCODE值。工具软件拿到BSDL才能知道第几个BSC对应PB5、第几个BSC是控制引脚方向。没有BSDL,边界扫描就等于闭着眼睛瞎抓。
我见过不少团队在项目立项时根本不找芯片厂商要BSDL,等到板子做出来想跑边界扫描,才发现手里的芯片是早期工程样片,厂商还没有正式发布BSDL文件。这个问题在大厂FPGA上还好,一些小众MCU和SoC上特别容易踩。所以选型阶段就应该把BSDL文件纳入可交付资料清单,让芯片代理确认支持边界扫描并提供对应型号的BSDL。
2.3 多电压域和JTAG连接器设计
JTAG的物理接口设计往往决定测试的成败。现代主板上同时存在3.3V、1.8V、甚至0.9V的IO电压,而JTAG主机可能是5V或3.3V逻辑。电平不匹配轻则采集不到数据,重则烧坏芯片引脚。
推荐的做法是优先选择支持电压可调的JTAG测试器,或者在板子上专门为边界扫描留一个电平转换区域。量产测试夹具上,我习惯使用带缓冲的JTAG驱动板,而不是直接把主机的杜邦线怼到板子上。缓冲芯片选74LVC1T45或者SN74AVC4T245这类可用的电平转换器件,能同时解决驱动能力和电平匹配问题。
连接器方面,不同厂商偏爱不同的插座:
- ARM标准的20针或10针JTAG(常见于Cortex-M开发板)
- Xilinx的14针JTAG
- Silicon Labs、NXP等厂商自己的调试接口定义
设计时可以在板卡上放一个2x5或者2x7的通用JTAG排针,把TCK、TMS、TDI、TDO、GND按照固定顺序引出来,再留一个或者几个备用引脚。这样无论是工厂测试、FPGA在线升级,还是售后排查,都不用再飞线。
3. 实操:用边界扫描做一次板级互连测试
3.1 工具链选型:商业软件、OpenOCD/UrJTAG以及其他开源方案
做边界扫描测试,工具链分为两层:底层是JTAG控制器硬件,上层是运行在PC上的测试软件。
商业方案有JTAG Technologies(现在归Keysight)、XJTAG、Asset InterTech,功能很全,支持自动生成互联测试向量、自动诊断开路短路,但价格不便宜,License和测试器硬件加一起是一笔不小的开销。
如果预算有限,开源方案也不是完全不能用。UrJTAG是老牌的开源JTAG工具,支持BSDLLattice、Xilinx、Altera等一大批器件,配合FT2232H或者FT232H这类便宜的USB转JTAG适配器就能跑起来。OpenOCD虽然主要面向调试下载,但也支持部分边界扫描操作,尤其适合在Linux环境下做自动化测试。
我的体会是:
- 如果是研发阶段做故障定位,UrJTAG+FT2232H足够用,成本几百块。
- 如果是工厂量产,需要自动化测试、日志追溯、测试项管理,还是要用商业方案,它的测试向量生成质量和对复杂板卡的诊断能力确实更强。
开源和商业的差距主要体现在两大块:一是互联测试向量生成的智能程度,商业软件能从网表+BSDL自动算出哪根线断了、哪里短路;开源工具往往要你自己在脚本里描述网络期望值。二是对复杂扫描链拓扑的支持,商业软件对菊花链、多电压域、时钟域异步的处理更成熟。
3.2 从IDCODE到EXTEST:扫描链完整性验证
拿到一块板子,第一步不是直接跑EXTEST,而是先做扫描链完整性检查。
所谓扫描链,就是把板上所有支持JTAG的芯片按TDI->TDO首尾串起来,形成一条链。测试器只需要一个JTAG口,就能通过这条链访问所有器件。但链路中任何一颗芯片虚焊、电源没起来、或者TDI/TDO连线断开,整条链都可能瘫痪。
常见流程:
- 识别所有被测芯片的IDCODE。主机发送IDCODE指令,然后串行移位读取每个器件的IDCODE。一个正常的链,读到的IDCODE数量和顺序应该跟设计文件一致。
- 用BYPASS指令验证。BYPASS让每颗芯片只延迟一个比特,从TDI到TDO形成一条最短路径。如果这个环节能通过,说明链路的基本电气连接是好的。
- 检查TRST和TCK时序。TCK频率刚开始要压低,比如1MHz,等确认稳定再逐步提升,避免高速反射导致采样错误。
IDCODE阶段最有信息量的不是"能不能读到",而是"读到的值是不是预期值"。一次我测一块板子,预期三颗器件的IDCODE分别是A、B、C,结果读出来是A、B、C的反码。查了半天发现是TMS时序问题,TAP状态机停留在Shift-DR状态之前,导致移位错位。换了一根质量好一点的扁平线就好了。这个案例说明,IDCODE不对别急着怀疑器件,先检查电平、线序和时钟。
3.3 生成测试向量并定位断线/短路
当扫描链验证通过,才好进入真正的互连测试。核心思路:
- 对发送端引脚,通过BSR写入确定电平(比如全0或全1)。
- 对接收端引脚,通过BSR采样。
- 如果采样值和期望值不一致,说明发送端与接收端之间存在开路、短路或者电阻异常。
控制BSR时,方向控制位特别关键。很多芯片的BSR里,每个IO引脚有输入采样单元、输出驱动单元和输出使能单元三个BSC。方向位没设对,会导致输出端实际是高阻,采样结果完全不可信。
实测中一个常见的误判是"短路"其实来自芯片内部电源地的多引脚并联。比如一块PCB上所有GND引脚本来就是同一个网络,你用边界扫描工具把相邻两个GND引脚驱动成不同电平,自然会出现冲突。所以测试向量生成时要排除电源地和固定电平引脚,让工具把这类引脚当成常量处理。
一次在实际板上发现信号线A和信号线B之间报短路,但万用表量度明明是断开的。后来用边界扫描工具逐段缩小范围,定位到是BGA芯片内部的die bonding问题——引脚在封装内部短路了,PCB本身是完美的。这个案例充分说明边界扫描的价值:它测的是芯片管脚级的实际状态,能把问题缩小到"板内走线"还是"封装内部"。
4. 安全与可用性的平衡:JTAG保护、禁用与恢复
4.1 STM32禁用JTAG后,边界扫描和调试分别会发生什么
热词里有个高频问题:"STM32禁用JTAG如何恢复",说明很多人对JTAG引脚复用有切肤之痛。STM32的PA13/PA14/PA15、PB3/PB4默认是JTAG/SWD复用功能,但在实际项目中,为了省引脚,开发者经常通过代码把PA15(JTDI)、PB3(JTDO)、PB4(JTRST)配置成普通GPIO,甚至把PA13/PA14(SWDIO/SWCLK)也释放掉。
这里要分清楚:
- 只禁用JTAG但保留SWD:PA13/PA14还可以用来下载调试,边界扫描的JTAG口则没法用了。
- 完全禁用调试端口:所有调试相关引脚都变成GPIO,无论是J-Link还是ST-Link都无法通过SWD接口连接。
一旦完全禁用,最直接的恢复手段是拉高BOOT0进入系统存储器Bootloader,通过串口ISP擦除或修改选项字节,把调试功能重新打开。STM32的选项字节里关于调试端口的配置,可以通过ISP编程改写。不同系列细节有差异,但思路一致:不是物理烧死,而是固件层面的锁定。
注意,关闭了JTAG调试口,同时也意味着放弃了边界扫描能力。如果你所在的产品有量产板级测试需求,JTAG引脚被复用成GPIO之前,最好确认测试策略已经覆盖到对应引脚。我看到过硬件工程师为了省两个引脚把JTAG全部关掉,结果量产测试时只能靠飞针慢慢量,成本高了一截。省引脚还是保可测试性,这是一个需要权衡的决定。
4.2 汽车级芯片的调试端口安全策略
S32K这类车规MCU的JTAG保护比STM32更严格,因为安全生命周期管理是汽车电子认证的一部分。常见的做法是在芯片内部加入调试端口权限管理,只有在芯片处于"Open"生命周期时,调试器才能完全访问;一旦进入"Closed"或"Locked"状态,JTAG端口只提供极有限的访问权限,甚至完全关闭。
这带来的实际影响是:研发阶段用的调试板可以放开所有调试能力;但在正式产品或量产固件中,往往会在安全策略里禁用或限制调试端口,防止固件被读取和逆向。
处理这类芯片的JTAG保护时,强烈建议在硬件上保留一个独立的串行调试接口或编程接口作为备份,这样即使JTAG被锁也能通过ISP或者其他方式恢复。同时要在固件版本管理和安全密钥管理上做配套,避免开发板和生产板用了同一套安全状态配置,导致产线测试时无法进入边界扫描模式。
4.3 给硬件工程师的JTAG引脚分配建议
结合我踩过的坑,给准备在新项目里预留JTAG边界扫描能力的硬件工程师几条具体建议:
- 不要把带JTAG功能的引脚全部分配给低速GPIO。至少保留一个完整的JTAG口,方便研发、量产和售后。
- 在电路原理图里单独建一个"Debug/Test"页,把JTAG连接器、电平转换、上下拉电阻、串阻集中放,方便审查。
- 扫描链顺序要清晰。如果板上有多个可测试器件,优先按信号流向排链,避免绕来绕去导致布线困难。
- 给JTAG口加ESD保护。量产测试时经常热插拔,一不留神就可能打坏TAP控制器或者芯片引脚。
5. 避坑记录:从扫描链不通到识别不到的排查链路
5.1 "高云JTAG识别不到"这类问题的排查顺序
很多人在FPGA开发板上遇到过"下载器识别不到芯片"。如果用的是高云GW1N系列,这个问题尤其常见。不要急着怀疑芯片坏了,先按这个顺序一层层查:
- 供电。JTAG需要芯片正常上电,一些FPGA还有多组电源,任何一组没起来都会导致IO不工作。用万用表量每个电源轨的电压,看是否在规格范围内。
- 配置引脚。高云FPGA的JTAG引脚和配置引脚经常是复用的。如果外部电路把模式选择引脚拉到了某种配置模式,或者配置文件里禁用了JTAG,识别不到就是必然结果。
- TCK/TMS/TDI/TDO线序。JTAG连接器种类繁多,同样的2x5座子在不同板卡上引脚顺序可能完全不同。先找到丝印和原理图,确认线序,别上来就插。
- 电平。调试器输出是3.3V还是1.8V,目标板IO电压是多少。电压差太大时,TDO回传可能读不到。
- 链路后面的器件影响。如果扫描链上还有别的芯片,且后面芯片TDI悬空或TDO短路,可能导致整条链数据异常。
这个排查链路其实适用于绝大多数"JTAG识别不到"问题:先电源,再线序,再电平,再链路,最后才怀疑芯片本身。我见过最离谱的一次,是下载线内部断了芯但表皮完好,换了根线就好了。所以排查时备用线材一定要备齐。
5.2 边界扫描测试过程中容易忽略的时序细节
边界扫描的时序细节比很多人想象的更敏感。以下几点是我在实际项目里反复确认过的:
- TCK频率不是越高越好。一些国产FPGA在4MHz以上时,TDO建立时间可能不够,导致主机采到错误数据。稳定起见,先跑1MHz。
- TMS信号在TCK上升沿必须已经稳定。如果布线太长导致反射,TMS的建立时间被压缩,状态机会跳出正常工作区间。
- TDO是三态输出。多个器件共用TDO线时,需要设计成菊花链的首尾串接,而不是并行接在一起。并行接TDO意味着多个器件同时驱动一条线,轻则信号打架,重则烧器件。
- IDCODE寄存器长度不是固定的。不同器件可能返回32位、64位甚至更长,工具软件会根据BSDL自动处理。如果你手动写脚本做扫描链访问,千万不要硬编码长度。
5.3 一些值得记住的排查顺序
在做板级故障定位时,我习惯遵循这样的优先级:
- 先跑IDCODE,确认扫描链完整。
- 再跑BYPASS,隔离出是链路本身问题还是某颗芯片的问题。
- 然后跑SAMPLE/PRELOAD,在不影响运行的情况下采样引脚状态,判断外围电路基本逻辑。
- 最后才跑EXTEST,强制输出电平做互连测试。
这样一层层缩小范围,比上来就跑EXTEST然后被一大堆错误淹没要高效得多。边界扫描工具报告的故障点只是一个"疑似"区域,还要结合原理图、PCB网表和实际万用表测量来综合判断。
最后再分享一个在实际项目里很管用的小技巧:在做量产测试时,把每一块板的JTAG测试结果保存成带序列号的日志,并关联到产品SN。这样一旦售后出现批次性问题,可以反查是哪一批板子在哪一道测试环节开始出现异常。边界扫描不只是一种测试手段,更是一条能贯穿产品全生命周期的可追溯数据链。