标题：JTAG
国际协议
JTAG也是一种国际标准测试协议（IEEE 1149.1兼容），主要用于芯片内部测试。现在多数的高级器件都支持JTAG协议,如DSP、FPGA器件等。标准的JTAG接口是4线：  JTAG[1]TMS、TCK、TDI、TDO,分别为模式选择、时钟、数据输入和数据输出线。 相关JTAG引脚的定义为：TCK为测试时钟输入；TDI为测试数据输入，数据通过TDI引脚输入JTAG接口；TDO为测试数据输出，数据通过TDO引脚从JTAG接口输出；TMS为测试模式选择，TMS用来设置JTAG接口处于某种特定的测试模式；TRST为测试复位，输入引脚，低电平有效。GND
TI还定义了一种叫SBW-JTAG的接口，用来在引脚较少的芯片上通过最少的利用引脚实现JTAG接口，它只有两条线，SBWTCK，SBWTDIO。实际使用时一般通过四条线连接，VCC，SBWTCK，SBWTDIO，GND，这样就可以很方便的实现连接，又不会占用大量引脚。
JTAG最初是用来对芯片进行测试的,基本原理是在器件内部定义一个TAP（Test Access Port测试访问口）通过专用的JTAG测试工具对内部节点进行测试。JTAG测试允许多个器件通过JTAG接口串联在一起，形成一个JTAG链，能实现对各个器件分别测试。现在，JTAG接口还常用于实现ISP（In-System Programmable;在线编程），对FLASH等器件进行编程。
JTAG编程方式是在线编程，传统生产流程中先对芯片进行预编程后再装到板上因此而改变，简化的流程为先固定器件到电路板上，再用JTAG编程，从而大大加快工程进度。JTAG接口可对PSD芯片内部的所有部件进行编程。
在硬件结构上，JTAG 接口包括两部分：JTAG 端口和控制器。与JTAG 接口兼容的器件可以是微处理器（MPU）、微控制器（MCU）、PLD、CPL、FPGA、DSP、ASIC 或其它符合IEEE1149.1 规范的芯片。IEEE1149.1 标准中规定对应于数字集成电路芯片的每个引脚都设有一个移位寄存单元，称为边界扫描单元BSC。它将JTAG 电路与内核逻辑电路联系起来，同时隔离内核逻辑电路和芯片引脚。由集成电路的所有边界扫描单元构成边界扫描寄存器BSR。边界扫描寄存器电路仅在进行JTAG 测试时有效，在集成电路正常工作时无效，不影响集成电路的功能。
扫描技术
JTAG是一种所谓的边界扫描技术。
边扫描测试是在20世纪80年代中期作为解决PCB物理访问问题的JTAG接口发展起来的，这样的问题是新的封装技术导致电路板装配日益拥挤所产生的。边界扫描在芯片级层次上嵌入测试电路，以形成全面的电路板级测试协议。利用边界扫描－－自1990年以来的行业标准IEEE 1149.1－－您甚至能够对最复杂的装配进行测试、调试和在系统设备编程，并且诊断出硬件问题。
边界扫描的优点：
通过提供对扫描链的IO的访问，可以消除或极大地减少对电路板上物理测试点的需要，这就会显著节约成本，因为电路板布局更简单、测试夹具更廉价、电路中的测试系统耗时更少、标准接口的使用增加、上市时间更快。除了可以进行电路板测试之外，边界扫描允许在PCB贴片之后，在电路板上对几乎所有类型的CPLD和闪存进行编程，无论尺寸或封装类型如何。在系统编程可通过降低设备处理、简化库存管理和在电路板生产线上集成编程步骤来节约成本并提高产量。
边界扫描原理：
IEEE 1149.1 标准规定了一个四线串行接口（第五条线是可选的），该接口称作测试访问端口（TAP），用于访问复杂的集成电路（IC），例如微处理器、DSP、ASIC和CPLD。除了TAP之外，混合IC也包含移位寄存器和状态机，以执行边界扫描功能。在TDI（测试数据输入）引线上输入到芯片中的数据存储在指令寄存器中或一个数据寄存器中。串行数据从TDO（测试数据输出）引线上离开芯片。边界扫描逻辑由TCK（测试时钟）上的信号计时，而且TMS（测试模式选择）信号驱动TAP控制器的状态。TRST（测试重置）是可选项。根据相关数据手册中的说明，TRST、TDI、TMS引脚上需要接一个10KΩ的上拉电阻，而TCK需要接一个10KΩ的下拉电阻。
在PCB上可串行互连多个可兼容扫描功能的IC，形成一个或多个扫描链，每一个链都由其自己的TAP。每一个扫描链提供电气访问，从串行TAP接口到作为链的一部分的每一个IC上的每一个引线。在正常的操作过程中，IC执行其预定功能，就好像边界扫描电路不存在。但是，当为了进行测试或在系统编程而激活设备的扫描逻辑时，数据可以传送到IC中，并且使用串行接口从IC中读取出来。这样数据可以用来激活设备核心，将信号从设备引线发送到PCB上，读出PCB的输入引线并读出设备输出。
在嵌入式系统设计中，一些高档的微处理器都带有JTAG接口，方便多目标系统进行测试，同时还可以实现flash编程。
JTAG电缆
关于简单JTAG电缆
目前有各种各样简单JTAG电缆，其实只是一个电平转换电路，同时还起到保护作用。JTAG的逻辑则由运行在PC上的软件实现，所以在理论上，任何一个简单JTAG电缆，都可以支持各种应用软件，如Debug等。可以使用同一个JTAG电缆写Xilinx CPLD，AXD/ADW调试程序。关键在于软件的支持，大多数软件都不提供设定功能，因而只能支持某种JTAG电缆。 
关于简单JTAG电缆的速度
JTAG 是串行接口，使用打印口的简单JTAG电缆，利用的是打印口的输出带锁存的特点，使用软件通过I/O产生JTAG时序。由JTAG标准决定，通过JTAG 写/读一个字节要一系列的操作，根据我的分析，使用简单JTAG电缆，利用打印口，通过JTAG输出一个字节到目标板，平均需要43个打印口I/O, 在我机器上（P4 1.7G)，每秒大约可进行660K次 I/O 操作，所以下载速度大约在660K/43, 约等于15K Byte/S. 对于其他机器，I/O速度大致相同，一般在600K ~ 800K. 
关于如何提高JTAG下载速度。
很明显，使用简单JTAG电缆无法提高速度。要提高速度，大致有两种办法，
1。使用嵌入式系统提供JTAG接口，嵌入式系统和微机之间通过USB/Ethernet相连，这要求使用MCU。
2。使用CPLD/FPGA提供JTAG接口，CPLD/FPGA和微机之间使用EPP接口（一般微机打印口都支持EPP模式），EPP接口完成微机和CPLD/FPGA之间的数据传输，CPLD/FPGA完成JTAG时序。
这两种方法本人都实现过。第一个方法可以达到比较高的速度，实测超过了200KByte/S(注意：是Byte，不是Bit）；但是相对来说，硬件复杂，制造相对复杂。第二种相对来说，下载速度要慢一些，最快时达到96KByte/S，但电路简单，制造方便，而且速度可以满足需要。第二种方案还有一个缺点，由于进行I/O操作时，CPU不会被释放，因此在下载程序时，微机CPU显得很繁忙。
总的来说，本人认为，对于个人爱好者来说，第二种方法更可取。
接口解读
JTAG接口解读
通常所说的JTAG大致分两类，一类用于测试芯片的电气特性，检测芯片是否有问题；一类用于Debug；一般支持JTAG的CPU内都包含了这两个模块。
一个含有JTAG Debug接口模块的CPU，只要时钟正常，就可以通过JTAG接口访问CPU的内部寄存器和挂在CPU总线上的设备，如FLASH，RAM，SOC（比如4510B，44Box，AT91M系列）内置模块的寄存器，象UART，Timers，GPIO等等的寄存器。
上面说的只是JTAG接口所具备的能力，要使用这些功能，还需要软件的配合，具体实现的功能则由具体的软件决定。
例如下载程序到RAM功能。了解SOC的都知道，要使用外接的RAM，需要参照SOC DataSheet的寄存器说明，设置RAM的基地址，总线宽度，访问速度等等。有的SOC则还需要Remap，才能正常工作。运行Firmware时，这些设置由Firmware的初始化程序完成。但如果使用JTAG接口，相关的寄存器可能还处在上电值，甚至时错误值，RAM不能正常工作，所以下载必然要失败。要正常使用，先要想办法设置RAM。在ADW中，可以在Console窗口通过Let 命令设置，在AXD中可以在Console窗口通过Set命令设置。
下面是一个设置AT91M40800的命令序列，关闭中断，设置CS0-CS3, 并进行Remap，适用于AXD(ADS带的Debug)
setmem 0xfffff124,0xFFFFFFFF,32 －－－关闭所有中断
setmem 0xffe00000,0x0100253d,32 －－－设置CS0
setmem 0xffe00004,0x02002021,32 －－－设置CS1
setmem 0xffe00008,0x0300253d,32 －－－设置CS2
setmem 0xffe0000C,0x0400253d,32 －－－设置CS3
setmem 0xffe00020,1,32 －－－Remap
如果要在ADW（SDT带的DEBUG）中使用，则要改为：
let 0xfffff124=0xFFFFFFFF －－－关闭所有中断
let 0xffe00000=0x0100253d －－－设置CS0
let 0xffe00004=0x02002021 －－－设置CS1
let 0xffe00008=0x0300253d －－－设置CS2
let 0xffe0000C=0x0400253d －－－设置CS3
let 0xffe00020=1 －－－Remap
为了方便使用，可以将上述命令保存为一个文件config.ini, 在Console窗口输入 ob config.ini 即可执行。
使用其他debug，大体类似，只是命令和命令的格式不同。
设置RAM时，设置的寄存器以及寄存器的值必须和要运行程序的设置一致。一般编译生成的目标文件是ELF格式，或类似的格式，包含有目标码运行地址，运行地址在Link时候确定。Debug下载程序时根据ELF文件中的地址信息下载程序到指定的地址。如果在把RAM的基地址设置为0x10000000, 而在编译的时候指定Firmware的开始地址在0x02000000, 下载的时候，目标码将被下载到0x02000000，显然下载会失败。
通过JTAG下载程序前应关闭所有中断，这一点和Firmware初始化时关闭中断的原因相同。在使用JTAG接口的时候，各中断的使能未知，尤其是FLASH里有可执行码的情况，可能会有一些中断被使能。使用JTAG下载完代码，要执行时，有可能因为未完成初始化就产生了中断，导致程序异常。所以，需要先关闭中断，一般通过设置SOC的中断控制寄存器完成。
使用JTAG写Flash。在理论上，通过JTAG可以访问CPU总线上的所有设备，所以应该可以写FLASH，但是FLASH写入方式和RAM大不相同，需要特殊的命令，而且不同的FLASH擦除，编程命令不同，而且块的大小，数量也不同，很难提供这一项功能。所以一般Debug不提供写Flash功能，或者仅支持少量几种Flash。
目前就我知道的，针对ARM，只有FlashPGM这个软件提供写FLASH功能，但使用也非常麻烦。AXD，ADW都不提供写FLASH功能。写Flash的方法可以是，自己写一个简单的程序，专门用于写目标板的FLASH，利用JTAG接口，下载到目标板，再把要烧写的目标码装成BIN格式，也下到目标板（地址和烧FLASH的程序的地址不同），然后运行已经下载的烧FLASH的程序。使用这种方式，比起FlashPGM的写Flash，速度似乎要快一些。
上面说的是以前的情形，现在情况有变——哲远科技已经开发出成熟JTAG烧写软件，并且经过多家公司的验证，产品主要特点：
不需要借助仿真器、调试器，不需要原厂软件，大大降低成本、提供生产灵活性。
不需要使用带插座的FLASH，提高可靠性。
与CPU架构无关，支持PowerPC/ARM/MIPS等架构的CPU或SoC。
使用CPU 的JTAG 接口，无需增加任何额外电路。
支持numonyx, Spansion, Intel, AMD, ST, SST, EON,等厂家的NOR FLASH。且提供后续新FLASH型号的全程支持。
不需要CPU任何启动代码即可完成烧写。
即使CPU死机或者因Flash数据损坏导致板卡不能启动时，同样可以回读Flash内容，为维修调试提供依据。
支持块操作（擦除、加锁、解锁）。
除了编程功能以外，还可以通过点灯等操作验证JTAG 器件的基本功能。
使用WH-USB-JTAG电缆，加载FLASH速度比并口电缆快10倍左右。
可以读写其他芯片
通过程序可以读写与JTAG器件(通常是CPU)相连的其他芯片(如CPLD, ASIC等)，这样在CPU没有跑起来或没有软件的情况下甚至都可以去对单板做一些调试，从而提高效率，缩短开发周期。
JTAG专业术语:[2]
1.
Group, Joint Test Action (JTAG)
测试行动联合组织
2.
Joint Test Action Group (JTAG)
测试行动联合组织