2024年4月24日发(作者:)

[ 准备知识 ]

A、基本的状态机知识

B、基本的C语言能力,包括位操作、常用宏定义、数组、指针等常见内容

C、会使用一种单片机

D、熟悉SPI协议的物理原理

E、对JTAG的好奇和兴趣

JTAG协议是目前应用最广泛的下载和仿真协议,对协议的最初缔造者来说,这也许

有点无心插柳柳成荫的感觉——最初的JTAG协议只是用来辅助专门的硬件质检部门对印

刷电路进行检测的。这些老账现不再提了

我们现在看到的各种JTAG下载和仿真协议都是各生产厂商在原有JTAG协议的思想上进

行扩充的,并不具有通用性,甚至连最基本的电路检测部分功能也被加以改造——比如,

一个JTAG指令可能在大部分的版本中是4 位长度的,而对于AVR32来说,一个JTAG指

令却是5位。总之,现在大行其道的JTAG协议,不变的部分就只有其核心TAP状态机了。

ARM有ARM的JTAG,AVR有AVR的JTAG,51有51的JTAG……

在这样一个缺乏统一标准的“街头”JTAG时代,如果你想学好JTAG下载仿真协议的破

解,就必须从TAP

状态机开始。

[原理解析]

在你被复杂的时序图弄得眼花缭乱之前,你应该首先记住以下的断言:

A、JTAG协议的本质与SPI协议并没有什么不同,它等于一个复杂的SS状态机+变长

的MOSI和MISO数据移位操作。不过所谓的变长,都是事先约定好的。

B、JTAG协议是一个同步通讯协议,它是全双工的。它的通讯原则是“以物易物”——

即你如果想得到某些东西,你必须先给与相同长度的内容;你如果只是想发送一些数据,

也会自动获取相同长度的内容,

至于交换的内容是否有意义,这是另外一回事了。

C、JTAG协议无论多么复杂,实际上只有4根线起作用(有时候还有两根鸡肋的nSRST

和TRST),他们分别是TMS、TCK、TDI和TDO,他们分别对应SPI协议里面的SS、SCK、

MOSI和MISO。在本质上,他们并没有什么不同。即便是ARM的JTAG那么多的引脚,

实际上起作用JTAG的也就这4根线而已。

D、JTAG的数据操作都是基于移位寄存器的。

E、如果JTAG协议在某个下载仿真协议中只是用来发送控制信息和少量的数据,而大

量的数据传输是通过额外的其它引脚进行的,即便这个协议被称为JTAG仿真其本质也早

已超过JTAG了,严格来说,不应该称之为JTAG。因为JTAG协议中就只有4根线(有时

候也算上nSRST和TRST)而已。典型的如NEXUS协议。

说了这么多,我们终于可以开始正式的讲解了。

一、从SPI到JTAG

如果熟悉SPI,你会发现SPI是如此的简单、和谐——一根用于二进制位同步的时钟

线SCK,一根用于主机发送到从机的数据线MOSI(Master Out Slave In),一根用于从机

发送到主机的数据线MISO(MasterIn Slave Out),外加一根用于复位SPI从机控制器以达

到通讯同步的控制信号SS(不妨理解为Slave Synchronization)。如果乐意,你很容易就

通过消减MOSI和MISO的方法获得精简的单向通讯。

前面我们提到,JTAG的数据操作都是基于移位寄存器的,这一点和SPI是相同的。

JTAG协议的核心在于能够有效地传输指令和数据,并且传输指令和数据的过程是能够明

确的加以区别对待而不会造成歧义的。

如何实现这一功能呢?JTAG协议只是将原本用来复位从机的SS信号扩展为一个状态

机。而该状态机每一个状态都有两个状态触发——在TCK(也就是SCK)的上升沿,TMS

(也就是SS)的电平决定了跳转的分支。

下图就是一个典型的TAP状态机,值得庆幸的是,该状态机所有JTAG协议中都会遵

守的部分。

如果这是你第一次研究TAP状态机,首先你不必去追究TAP究竟是哪些英文单词的

缩写,因为Test Access Port已经是过去很久的事情了,现在的JTAG状态机虽然功能没