我对嵌入式系统很陌生,我一直看到这个术语一直在使用,但我不太明白它是什么。在线快速搜索会产生此 Wikipedia 页面:https ://en.wikipedia.org/wiki/Joint_Test_Action_Group将其描述为某种用于调试的协议。但在其他情况下,它可以像程序员一样对芯片的内存进行编程。它是什么?
什么是 JTAG?
它与 USB、SPI、I2C 和其他“总线”一样,具有多种流行用途,不仅限于:
特别是在对每个部件进行过多投资之前对硅进行测试,例如,当芯片仍在晶圆上时,您可以检查大部分部件。当然,切割晶圆可能会造成损坏,因此您想再次测试,但也许您在包装之前或之后这样做。
您可以使用它在板上进行边界扫描。您可以在生产线上使用一块电路板(假设电路板必须设计正确,并且一定比例的芯片必须支持这一点),但您可以进行低速连接测试,刺激走线一端的引脚并扫描另一端根据电路板的设计,查看它们是否连接。
由于芯片已经有这些专用引脚,为什么不使用相同的接口作为与片上调试器 (OCD) 通信的方式,在处理器中设计一些东西并允许通过 jtag 与之通信。
这是一种通用的方式,可让您隔离链上您想要发送一系列比特或从中获取一系列比特的事物,您想要与之交谈的每个事物都可以针对不同的数字进行设计位数从小数到大数。对于调试器,您自然会让它写入或读取芯片中的寄存器大小的东西——可能是 16 位寄存器或 32 位。但是对于硅或电路板测试,您的扫描链可能是几十位。如果您愿意,您处理的每个单独事物的大小都可以与任何其他事物不同,这使其成为一种非常通用的总线,其引脚数量相对较少,对这些类型的用例具有吸引力。
也许是因为软件调试的普及,他们现在有一些两个引脚的解决方案来节省微控制器的引脚数,也许其他人会采用,也许不会。
JTAG 最初是用于组装后测试 PCB 的接口。可以通过 JTAG 端口控制和读取芯片上的 IO 线,从而执行电路板测试序列。后来它也开始用作编程和调试接口。JTAG 上可用的功能取决于您正在处理的特定 IC。
与大多数其他编程接口相比,JTAG 的一个优势是设备可以菊花链式连接。因此,一个 JTAG 端口可以用于编程/调试/测试多个设备(尽管我建议设计您的系统,以便可以将不同品牌的芯片拆分到不同的链上,而低级 JTAG 协议非常标准化,不幸的是您需要的工具编程/调试芯片不是)。
JTAG 是一个有点奇怪的术语。首先,该术语可以指定特定的连接器和协议,由时钟信号 (TCK)、模式选择 (TMS) 和数据输入/输出 (TDI/TDO) 组成。这包括一个设备网络,其中每个设备的 TDO 在所谓的扫描链中连接到下一个设备的 TDI。TMS 用于将所有设备同时置于各种模式。
扫描链上的设备通常连接为一个大型移位寄存器,由每个单独设备中的寄存器组成。当设备处于 SHIFT_IR 或 SHIFT_DR 状态时,它们连接到两个临时寄存器之一的扫描链:指令寄存器和数据寄存器。
一旦移入一个值,可以通过在切换 TCK 时适当设置 TMS 来激活 UPDATE_IR 或 UPDATE_DR 模式。此时,移入寄存器的值“生效”。例如,将各种序列转移到 FPGA 的 IR 并转换到 UPDATE_IR 将导致 FPGA 进入各种模式,例如配置、回读、正常运行时,或访问设计中实例化的特定用户寄存器和 JTAG 特定原语。
同样,捕获状态可用于从设备“读取”一个值并将其放入 IR 或 DR,然后通过 TDO 移出并最终由 JTAG 编程器读取。
JTAG 定义了一个串行协议和一些命令,以允许访问复杂 IC 中的内部寄存器。这允许测试人员使用少量引脚以标准方式获得可观察性和可控性。
最初的用途是“边界扫描”,所有的 I/O 引脚都可以被一个环绕芯片的大型移位寄存器读取和驱动。然而,它很快被扩展为添加更多的移位寄存器来访问芯片的内部,包括存储器。
您很少对 JTAG 进行 bit-bang,访问通常是通过库,也就是驱动程序,由 IC 制造商提供,并由测试系统和测试访问适配器使用。