什么是JTAG标准?

 

联合测试行为组织
   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 ,速度似乎要快一些。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值