联合测试行为组织
JTAG
是英文
“Joint Test Action Group
(
联合测试行为组织
)
”
的词头字母的简写,该组织成立于
1985
年,是由几家主要的电子制造商发起制订的
PCB
和
IC
测试标准。
JTAG
建议于
1990
年被
IEEE
批准为
IEEE1149.1-1990
测试访问端口和
边界扫描
结构标准。该标准规定了进行边界扫描所需要的硬件和软件。自从
1990
年批准后,
IEEE
分别于
1993
年和
1995
年对该标准作了补充,形成了现在使用的
IEEE1149.1a-1993
和
IEEE1149.1b-1994
。
JTAG
主要应用于:电路的边界扫描测试和可编程芯片的在线系统编程。
国际标准测试协议
JTAG
也是一种国际标准测试协议(
IEEE 1149.1
兼容),主要用于芯片内部测试。现在多数的高级器件都支持
JTAG
协议
,
如
DSP
、
FPGA
器件等。标准的
JTAG接口
是
4
线:
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
,
SBTDIO
,
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
、
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
(测试重置)是可选项。在
PCB
上可串行互连多个可兼容扫描功能的
IC
,形成一个或多个扫描链,每一个链都由其自己的
TAP
。每一个扫描链提供电气访问,从串行
TAP
接口到作为链的一部分的每一个
IC
上的每一个引线。在正常的操作过程中,
IC
执行其预定功能,就好像边界扫描电路不存在。但是,当为了进行测试或在系统编程而激活设备的扫描逻辑时,数据可以传送到
IC
中,并且使用串行接口从
IC
中读取出来。这样数据可以用来激活设备核心,将信号从设备引线发送到
PCB
上,读出
PCB
的输入引线并读出设备输出。
简单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
接口解读
通常所说的
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
,速度似乎要快一些。