2006年11月7日

到底什么是JTAG呢?
JTAG
(Joint Test Action Group)联合测试行动小组)是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试。现在多数的高级器件都支持JTAG协议,如DSP、FPGA器件等。标准的JTAG接口是4线:TMS、 TCK、TDI、TDO,分别为模式选择、时钟、数据输入和数据输出线。
JTAG最初是用来对芯片进行测试的,基本原理是在器件内部定义一个TAP(Test Access Port�测试访问口)通过专用的JTAG测试工具对进行内部节点进行测试。JTAG测试允许多个器件通过JTAG接口串联在一起,形成一个JTAG链,能实现对各个器件分别测试。现在,JTAG接口还常用于实现ISP(In-System rogrammable�在线编程),对FLASH等器件进行编程。
JTAG编程方式是在线编程,传统生产流程中先对芯片进行预编程现再装到板上因此而改变,简化的流程为先固定器件到电路板上,再用JTAG编程,从而大大加快工程进度。JTAG接口可对PSD芯片内部的所有部件进行编程
 
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电缆。
目前有各种各样简单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时序。 

posted @ 1:28 | Feedback (2)
 

1. 简介

 

 

JTAG(Joint Test Action Group联合测试行动小组)1985年制定的检测PCBIC芯片的一个标准,1990年被修改后成为IEEE的一个标准,即IEEE1149.1-1990IEEE 1149.1标准就是由JTAG这个组织最初提出的,最终由IEEE批准并且标准化的。所以,这个IEEE 1149.1这个标准一般也俗称JTAG调试标准。

 

JTAG最初是用来对芯片进行测试的,基本原理是在器件内部定义一个TAPTest Access Port 测试访问口)通过专用的JTAG测试工具对进行内部节点进行测试。JTAG测试允许多个器件通过JTAG接口串联在一起,形成一个JTAG链,能实现对各个器件分别测试。现在,JTAG接口还常用于实现ISPIn-System Programmable 在线编程),对FLASH等器件进行编程。

具有JTAG接口的芯片,相关JTAG引脚的定义为:

 

TCK为测试时钟输入;

 

TDI为测试数据输入,数据通过TDI引脚输入JTAG接口;

 

TDO为测试数据输出,数据通过TDO引脚从JTAG接口输出;

 

TMS为测试模式选择,TMS用来设置JTAG接口处于某种特定的测试模式;

 

TRST为测试复位,输入引脚,低电平有效。

 

 

2. Boundary-Scan 边界扫描

 

 

边界扫描技术的基本思想是在靠近芯片的输入输出管脚上增加一个移位寄存器单元。因为这些移位寄存器单元都分布在芯片的边界上(周围),所以被称为边界扫描寄存器(Boundary-Scan Register Cell)。当芯片处于调试状态的时候,这些边界扫描寄存器可以将芯片和外围的输入输出隔离开来。通过这些边界扫描寄存器单元,可以实现对芯片输入输出信号的观察和控制。对于芯片的输入管脚,可以通过与之相连的边界扫描寄存器单元把信号(数据)加载倒该管脚中去;对于芯片的输出管脚,也可以通过与之相连的边界扫描寄存器捕获CAPTURE)该管脚上的输出信号。在正常的运行状态下,这些边界扫描寄存器对芯片来说是透明的,所以正常的运行不会受到任何影响。这样,边界扫描寄存器提供了一个便捷的方式用以观测和控制所需要调试的芯片。另外,芯片输入输出管脚上的边界扫描(移位)寄存器单元可以相互连接起来,在芯片的周围形成一个边界扫描链(Boundary-Scan Chain)。一般的芯片都会提供几条独立的边界扫描链,用来实现完整的测试功能。边界扫描链可以串行的输入和输出,通过相应的时钟信号和控制信号,就可以方便的观察和控制处在调试状态下的芯片。

 

利用边界扫描链可以实现对芯片的输入输出进行观察和控制。下一个问题是:如何来管理和使用这些边界扫描链?对边界扫描链的控制主要是通过TAP Test Access PortController来完成的。在下一个小节,我们一起来看看TAP是如何工作的。

 

 

3. TAPTEST ACCESS PORT

 

 

在上一节,我们已经简单介绍了边界扫描链,而且也了解了一般的芯片都会提供几条边界扫描链,用来实现完整的测试功能。下面,我将逐步介绍如何实现扫描链的控制和访问。

 

IEEE 1149.1标准里面,寄存器被分为两大类:数据寄存器(DRData Register)和指令寄存器(IRInstruction Register)。边界扫描链属于数据寄存器中很重要的一种。边界扫描链用来实现对芯片的输入输出的观察和控制。而指令寄存器用来实现对数据寄存器的控制,例如:在芯片提供的所有边界扫描链中,选择一条指定的边界扫描链作为当前的目标扫描链,并作为访问对象。下面,让我们从TAP(Test Access Port)开始。

 

TAP是一个通用的端口,通过TAP可以访问芯片提供的所有数据寄存器(DR)和指令寄存器(IR)。对整个TAP的控制是通过TAP Controller来完成的。TAP总共包括5个信号接口TCKTMSTDITDOTRST :其中4个是输入信号接口和另外1个是输出信号接口。一般,我们见到的开发板上都有一个JTAG接口,该JTAG接口的主要信号接口就是这5个。下面,我先分别介绍这个5个接口信号及其作用。

 

 

l Test Clock Input (TCK)

 

TCKTAP的操作提供了一个独立的、基本的时钟信号,TAP的所有操作都是通过这个时钟信号来驱动的。TCKIEEE 1149.1标准里是强制要求的。

 

l Test Mode Selection Input (TMS)

 

TMS信号用来控制TAP状态机的转换。通过TMS信号,可以控制TAP在不同的状态间相互转换。TMS信号在TCK的上升沿有效。TMSIEEE 1149.1标准里是强制要求的。

 

l Test Data Input (TDI)

 

TDI是数据输入的接口。所有要输入到特定寄存器的数据都是通过TDI接口一位一位串行输入的(由TCK驱动)。TDIIEEE 1149.1标准里是强制要求的。

 

l Test Data Output (TDO)

 

TDO是数据输出的接口。所有要从特定的寄存器中输出的数据都是通过TDO接口一位一位串行输出的(由TCK驱动)。TDOIEEE 1149.1标准里是强制要求的。

 

l Test Reset Input (TRST)

 

TRST可以用来对TAP Controller进行复位(初始化)。不过这个信号接口在IEEE 1149.1标准里是可选的,并不是强制要求的。因为通过TMS也可以对TAP Controller进行复位(初始化)。

 

 

事实上,通过TAP接口,对数据寄存器(DR)进行访问的一般过程是:

 

1) 通过指令寄存器(IR),选定一个需要访问的数据寄存器;

 

2) 把选定的数据寄存器连接到TDITDO之间;

 

3) TCK驱动,通过TDI,把需要的数据输入到选定的数据寄存器当中去;同时把选定的数据寄存器中的数据通过TDO读出来。

 

 

接下来,让我们一起来了解一下TAP的状态机。TAP的状态机如图1所示,总共有16个状态。在图中,每个六边形表示一个状态,六边形中标有该状态的名称和标识代码。图中的箭头表示了TAP Controller内部所有可能的状态转换流程。状态的转换是由TMS控制的,所以在每个箭头上有标有tms = 0 或者 tms = 1。在TCK的驱动下,从当前状态到下一个状态的转换是由TMS信号决定。假设TAP Controller的当前状态为Select-DR-Scan,在TCK的驱动下,如果TMS 0TAP Controller进入Capture-DR状态;如果TMS = 1TAP Controller进入Select-IR-Scan状态。

 

 

1. TAP Controller State Transitions

 

 

这个状态机看似很复杂,其实理解以后会发现这个状态机其实很直接、很简单。观察图1,我们可以发现,除了Test-Logic ResetTest-Run/Idle状态外,其他的状态有些类似。例如Select-DR-ScanSelect-IR-Scan对应,Capture-DRCapture-IR对应,Shift-DRShift-IR对应,等等。在这些对应的状态中,DR表示Data RegisterIR表示Instruction Register。记得我们前面说过吗,寄存器分为两大类,数据寄存器和指令寄存器。其实标识有DR的这些状态是用来访问数据寄存器的,而标识有IR的这些状态是用来访问指令寄存器的。

 

在详细描述整个状态机中的每一个状态之前,首先让我们来想一想:要通过边界扫描链来观察和控制芯片的输入和输出,需要做些什么?如果需要捕获芯片某个管脚上的输出,首先需要把该管脚上的输出装载到边界扫描链的寄存器单元里去,然后通过TDO输出,这样我们就可以从TDO上得到相应管脚上的输出信号。如果要在芯片的某个管脚上加载一个特定的信号,则首先需要通过TDI把期望的信号移位到与相应管脚相连的边界扫描链的寄存器单元里去,然后把该寄存器单元的值加载到相应的芯片管脚。下面,让我们一起来看看每个状态具体表示什么意思?完成什么功能?

 

 

Test-Logic Reset

 

系统上电后,TAP Controller自动进入该状态。在该状态下,测试部分的逻辑电路全部被禁用,以保证芯片核心逻辑电路的正常工作。通过TRST信号也可以对测试逻辑电路进行复位,使得TAP Controller进入Test-Logic Reset状态。前面我们说过TRST是可选的一个信号接口,这是因为在TMS上连续加5TCK脉冲宽度的1信号也可以对测试逻辑电路进行复位,使得TAP Controller进入Test-Logic Reset状态。所以,在不提供TRST信号的情况下,也不会产生影响。在该状态下,如果TMS一直保持为1TAP Controller将保持在Test-Logic Reset状态下;如果TMS1变为0(在TCK的上升沿触发),将使TAP Controller进入Run-Test/Idle状态。

 

Run-Test/Idle

 

这个是TAP Controller在不同操作间的一个中间状态。这个状态下的动作取决于当前指令寄存器中的指令。有些指令会在该状态下执行一定的操作,而有些指令在该状态下不需要执行任何操作。在该状态下,如果TMS一直保持为0TAP Controller将一直保持在Run-Test/Idle状态下;如果TMS0变为1(在TCK的上升沿触发),将使TAP Controller进入Select-DR-Scan状态。

 

Select-DR-Scan

 

这是一个临时的中间状态。如果TMS0 (在TCK的上升沿触发),TAP Controller进入Capture-DR状态,后续的系列动作都将以数据寄存器作为操作对象;如果TMS1 (在TCK的上升沿触发),TAP Controller进入Select-IR-Scan状态。

 

Capture-DR

 

TAP Controller在这个状态中,在TCK的上升沿,芯片输出管脚上的信号将被捕获到与之对应的数据寄存器的各个单元中去。如果TMS0 (在TCK的上升沿触发),TAP Controller进入Shift-DR状态;如果TMS1 (在TCK的上升沿触发),TAP Controller进入Exit1-DR状态。

 

Shift-DR

 

在这个状态中,由TCK驱动,每一个时钟周期,被连接在TDITDO之间的数据寄存器将从TDI接收一位数据,同时通过TDO输出一位数据。如果TMS0 (在TCK的上升沿触发),TAP Controller保持在Shift-DR状态; 如果TMS1 (在TCK的上升沿触发),TAP Controller进入到Exit1-DR状态。假设当前的数据寄存器的长度为4。如果TMS保持为0,那在4TCK时钟周期后,该数据寄存器中原来的4位数据(一般是在Capture-DR状态中捕获的数据)将从TDO输出来;同时该数据寄存器中的每个寄存器单元中将分别获得从TDI输入的4位新数据。

 

Update-DR

 

Update-DR状态下,由TCK上升沿驱动,数据寄存器当中的数据将被加载到相应的芯片管脚上去,用以驱动芯片。在该状态下,如果TMS0TAP Controller将回到Run-Test/Idle状态;如果TMS1TAP Controller将进入Select-DR-Scan状态。

 

Select-IR-Scan

 

这是一个临时的中间状态。如果TMS0 (在TCK的上升沿触发),TAP Controller进入Capture-IR状态,后续的系列动作都将以指令寄存器作为操作对象;如果TMS1 (在TCK的上升沿触发),TAP Controller进入Test-Logic Reset状态。

 

Capture-IR

 

TAP Controller在这个状态中,在TCK的上升沿,一个特定的逻辑序列将被装载到指令寄存器中去。如果TMS0 (在TCK的上升沿触发),TAP Controller进入Shift-IR状态;如果TMS1 (在TCK的上升沿触发),TAP Controller进入Exit1-IR状态。

 

Shift-IR

 

在这个状态中,由TCK驱动,每一个时钟周期,被连接在TDITDO之间的指令寄存器将从TDI接收一位数据,同时通过TDO输出一位数据。如果TMS0 (在TCK的上升沿触发),TAP Controller保持在Shift-IR状态; 如果TMS1 (在TCK的上升沿触发),TAP Controller进入到Exit1-IR状态。假设指令寄存器的长度为4。如果TMS保持为0,那在4TCK时钟周期后,指令寄存器中原来的4bit长的特定逻辑序列(在Capture-IR状态中捕获的特定逻辑序列)将从TDO输出来,该特定的逻辑序列可以用来判断操作是否正确;同时指令寄存器将获得从TDI输入的一个4bit长的新指令。

 

Update-IR

 

在这个状态中,在Shift-IR状态下输入的新指令将被用来更新指令寄存器。

 

 

说了那么多,下面,让我们先看看指令寄存器和数据寄存器访问的一般过程,以便建立一个直观的概念。

 

1. 系统上电,TAP Controller进入Test-Logic Reset状态,然后依次进入:Run-Test/Idle ---> Select-DR-Scan ---> Select-IR-Scan ---> Capture-IR ---> Shift-IR ---> Exit1-IR ---> Update-IR,最后回到Run-Test/Idle状态。在Capture-IR状态中,一个特定的逻辑序列被加载到指令寄存器当中;然后进入到Shift-IR状态。在Shift-IR状态下,通过TCK的驱动,可以将一条特定的指令送到指令寄存器当中去。每条指令都将确定一条相关的数据寄存器。然后从Shift-IR ---> Exit1-IR ---> Update-IR。在Update-IR状态,刚才输入到指令寄存器中的指令将用来更新指令寄存器。最后,进入到Run-Test/Idle状态,指令生效,完成对指令寄存器的访问。

 

2. 当前可以访问的数据寄存器由指令寄存器中的当前指令决定。要访问由刚才的指令选定的数据寄存器,需要以Run-Test/Idle为起点,依次进入Select-DR-Scan ---> Capture-DR ---> Shift-DR ---> Exit1-DR ---> Update-DR,最后回到Run-Test/Idle状态。在这个过程当中,被当前指令选定的数据寄存器会被连接在TDITDO之间。通过TDITDO,就可以将新的数据加载到数据寄存器当中去,同时,也可以捕获数据寄存器中的数据。具体过程如下。在Capture-DR状态中,由TCK的驱动,芯片管脚上的输出信号会被捕获到相应的边界扫描寄存器单元中去。这样,当前的数据寄存器当中就记录了芯片相应管脚上的输出信号。接下来从Capture-DR进入到Shift-DR状态中去。在Shift-DR状态中,由TCK驱动,在每一个时钟周期内,一位新的数据可以通过TDI串行输入到数据寄存器当中去,同时,数据寄存器可以通过TDO串行输出一位先前捕获的数据。在经过与数据寄存器长度相同的时钟周期后,就可以完成新信号的输入和捕获数据的输出。接下来通过Exit1-DR状态进入到Update-DR状态。在Update-DR状态中,数据寄存器中的新数据被加载到与数据寄存器的每个寄存器单元相连的芯片管脚上去。最后,回到Run-Test/Idle状态,完成对数据寄存器的访问。

 

 

上面描述的就是通过TAP对数据寄存器进行访问的一般流程。会不会还是觉得很抽象?让我们来看一个更直观的例子。现在假设,TAP Controller现在处在Run-Test/Idle状态,指令寄存器当中已经成功的写入了一条新的指令,该指令选定的是一条长度为6的边界扫描链。下面让我们来看看实际如何来访问这条边界扫描链。图2所示的是测试芯片及其被当前指令选定的长度为6的边界扫描链。由图2可以看出,当前选择的边界扫描链由6个边界扫描移位寄存器单元组成,并且被连接在TDITDO之间。TCK时钟信号与每个边界扫描移位寄存器单元相连。每个时钟周期可以驱动边界扫描链的数据由TDITDO的方向移动一位,这样,新的数据可以通过TDI输入一位,边界扫描链的数据可以通过TDO输出一位。经过6个时钟周期,就可以完全更新边界扫描链里的数据,而且可以将边界扫描链里捕获的6位数据通过TDO全部移出来。

 

 

2. 测试芯片及其当前选定的边界扫描链

 

 

3表示了边界扫描链的访问过程。图3.1 表示了芯片和边界扫描链的初始化状态,在测试状态下,芯片的外部输入和输出被隔离开了,芯片的输入和输出可以通过相应的边界扫描链来观察和控制。在图3.1中,扫描链里的每个移位寄存器单元的数据是不确定的,所以在图中用X表示,整个扫描链里的数据序列是XXXXXX。要从TDI输入到测试芯片上的数据序列是:101010. 同时要从TDO得到芯片相应管脚上的状态。现在TAP ControllerRun-Test/Idle状态经过Select-DR-Scan状态进入到Capture-DR状态,在Capture-DR状态当中,在一个TCK时钟的驱动下,芯片管脚上的信号状态全部被捕获到相应的边界扫描移位寄存器单元当中去,如图3.2所示。从图3.2中我们可以看出,在进入Capture-DR状态后,经过一个TCK时钟周期,现在扫描链中的数据序列变成了:111000. 在数据捕获完成以后,从Capture-DR状态进入到Shift-DR状态。在Shift-DR状态中,我们将通过6TCK时钟周期来把新的数据序列(101010)通过TDI输入到边界扫描链当中去;同时,将边界扫描链中捕获的数据序列(111000)通过TDO输出来。在进入到Shift-DR状态后,每经过一个TCK时钟驱动,边界扫描链从TDO输出一位数据;同时,从TDI接收一位新的数据。图3.3所示的是在Shift-DR状态下,1TCK时钟周期后的扫描链的变化。图3.4所示的是在Shift-DR状态下,2TCK时钟周期后的扫描链的变化。此时,扫描链已经从TDI串行得到了两位新数据,从TDO也串行输出了两位数据。在TCK时钟的驱动下,这个过程一直继续下去。图3.5所示的是在经过6TCK时钟周期以后扫描链的情况。从图3.5中我们可以看到:边界扫描链当中已经包含了新的数据序列:101010. TDO端,经过6TCK时钟驱动以后,也接收到了在Capture-DR状态下捕获到的数据序列:111000. 到目前为止,虽然扫描链当中包含了新的数据序列:101010,但测试芯片的管脚上的状态还是保持为:111000. 下一步,需要更新测试芯片相应管脚上的信号状态。要实现更新,TAP ControllerShift-DR状态,经过Exit1-DR状态,进入到Update-DR状态。在Update-DR状态中,经过一个周期的TCK时钟驱动,边界扫描链中的新数据序列将被加载到测试芯片的相应管脚上去,如图3.6所示。从图3.6可以看出,测试芯片的状态已经被更新,相应管脚上的状态序列已经从111000变为101010. 最后从Update-DR状态回到Run-Test/Idle状态,完成对选定的边界扫描链的访问。

3. 边界扫描链的访问过程

 

 

在看完上面这个例子以后,对TAP Controller的状态机应该大概了解了吧?对如何访问边界扫描链应该也有个直观的概念了吧?虽然上面的这个例子只是说明了如何访问边界扫描链,对其它的数据寄存器、指令寄存器的访问过程也是类似的。要实现对指令寄存器的访问,不同的是TAP Controller必须经过不同的状态序列:Run-Test/Idle ---> Select-DR-Scan ---> Select-IR-Scan ---> Capture-IR ---> Shift-IR ---> Exit1-IR ---> Update-IR ---> Run-Test/Idle.

 

 

3指令寄存器、公共指令以及数据寄存器

 

IEEE 1149.1标准当中,规定了一些指令寄存器、公共指令和相关的一些数据寄存器。对于特定的芯片而言,芯片厂商都一般都会在IEEE 1149.1标准的基础上,扩充一些私有的指令和数据寄存器,以帮助在开发过程中进行进行方便的测试和调试。在这一部分,我将简单介绍IEEE 1149.1规定的一些常用的指令及其相关的寄存器。与ARM7TDMI相关的私有指令和寄存器将在后面的部分专门介绍。

 

 

指令寄存器

 

指令寄存器允许特定的指令被装载到指令寄存器当中,用来选择需要执行的测试,或者选择需要访问的测试数据寄存器。每个支持JTAG调试的芯片必须包含一个指令寄存器。

 

BYPASS指令和Bypass寄存器:

 

Bypass寄存器是一个一位的移位寄存器,通过BYPASS指令,可以将bypass寄存器连接到TDITDO之间。在不需要进行任何测试的时候,将bypass寄存器连接在TDITDO之间,在TDITDO之间提供一条长度最短的串行路径。这样允许测试数据可以快速的通过当前的芯片送到开发板上别的芯片上去。

 

IDCODE指令和Device Identification 寄存器:

 

Device identification寄存器中可以包括生产厂商的信息,部件号码,和器件的版本信息等。使用IDCODE指令,就可以通过TAP来确定器件的这些相关信息。例如,ARM MULTI-ICE可以自动识别当前调试的是什么片子,其实就是通过IDCODE指令访问Device Identification寄存器来获取的。

 

INTEST指令和Boundary-Scan 寄存器:

 

Boundary-Scan寄存器就是我们前面例子中说到的边界扫描链。通过边界扫描链,可以进行部件间的连通性测试。当然,更重要的是可以对测试器件的输入输出进行观测和控制,以达到测试器件的内部逻辑的目的。INTEST指令是在IEEE 1149.1标准里面定义的一条很重要的指令:结合边界扫描链,该指令允许对开发板上器件的系统逻辑进行内部测试。在ARM JTAG调试当中,这是一条频繁使用的测试指令。

 

 

我们前面说过,寄存器分为两大类:指令寄存器和数据寄存器。在上面提到的Bypass寄存器、Device Identification寄存器和Boundary-scan寄存器(边界扫描链),都属于数据寄存器。在调试当中,边界扫描寄存器(边界扫描链)最重要,使用的也最为频繁。

posted @ 1:20 | Feedback (1)
 

3.3V和5.0V电平信号的转换

在混合电压系统中,不同电源电压的逻辑器件互相接口时存在以下几个问题:

第一,加到输入和输出引脚上允许的最大电压限制问题。器件对加到输入或者输出脚上的电压通常是有限制的。这些引脚有二极管或者分离元件接到Vcc。如果接入的电压过高,则电流将会通过二极管或者分离元件流向电源。例如在3.3V器件的输入端加上5V的信号,则5V电源会向3.3V电源充电。持续的电流将会损坏二极管和其它电路元件。

第二,两个电源间电流的互串问题。在等待或者掉电方式时,3.3V电源降落到0V,大电流将流通到地,这使得总线上的高电压被下拉到地,这些情况将引起数据丢失和元件损坏。必须注意的是:不管在3.3V的工作状态还是在0V的等待状态都不允许电流流向Vcc。

第三,接口输入转换门限问题。5V器件和3.3V器件的接口有很多情况,同样TTL和CMOS间的电平转换也存在着不同情况。驱动器必须满足接收器的输入转换电平,并且要有足够的容限以保证不损坏电路元件。

基于上述情况,5V器件和3.3V器件是不能直接接口的。有些半导体器件制造厂家就推出了具有5V输入容限的3.3V器件,这种器件输入端具有ESD保护电路。实际上数字电路的所有输入端都有一个ESD保护电路,传统的CMOS电路通过接地二极管对负向高电压限幅,正向高电压则由二极管钳位。这种电路的缺点是最大的输入电压被限制在3.3V+0.5V(二极管压降)以内(否则电流将流向3.3V电源)。而大多数5V系统输出端的电压可达3.6V以上,因此采用了这种电路结构的3.3V器件是不能与5V器件输出端直接接口的。如果采用相当于快速齐纳二极管的MOS场效应管代替上述钳位二极管,实现对高电压限幅,并且去掉接到Vcc(3.3V)的二极管,那么最大输入电压不受Vcc(3.3V)的限制。典型情况下,这种电路的击穿电压在7V~10V之间。因此,这种改进后具有ESD保护电路的3.3V系统的输入端可以承受5V的输入电压。为了防止在3.3V器件的输出端可能存在电流倒灌问题,还需要在输出端加保护电路,当加到输出端电压高于Vcc(3.3V)时,保护电路的比较器会断开电流倒灌通路,这样在三态方式时就能与5V器件相连。

分析各种逻辑电平信号的电特性(见表1),会发现有以下五种接口情况:

第一,相同供电电压的TTL器件驱动CMOS器件时,TTL器件的输出高电平可能达不到CMOS器件的输入高电平的最小值。3.3V TTL器件的VOH是2.4V,3.3V CMOS器件的VIH是0.8VCC(3.3V×0.8=2.64V);5.0V TTL器件的VOH是2.4V,5.0V CMOS器件的VIH是0.7VCC(3.5V)。为了可靠地传输数据,可以将TTL器件的输出端上拉。有些CMOS工艺制造的器件兼容 TTL电平,这样就可以与相同供电电压的TTL器件直接接口,不需要上拉。

第二,相同供电电压的CMOS器件驱动TTL器件,电平匹配,数据能可靠地传输。

第三,不同供电电压的TTL器件驱动CMOS器件时,TTL器件的输出高电平也可能达不到CMOS器件的输入高电平的最小值。3.3V TTL器件的VOH是2.4V,5.0V CMOS器件的VIH是0.7VCC(3.5V),电平不匹配;5.0V TTL器件的VOH是2.4V,3.3V CMOS器件的VIH是0.8VCC(2.64V),可以将5.0V TTL器件的输出端上拉,达到电平匹配的目的。

第四,不同供电电压的CMOS器件驱动TTL器件时,在输入端具有5V容限的情况下,电平匹配,数据能可靠地传输。

第五,不同供电电压的TTL器件在输入端具有5V容限的情况下可以直接接口;不同供电电压的CMOS器件由于电平不匹配不能直接接口。

由以上分析可知,不同逻辑标准的电平信号一般是不能直接接口的。在只有少量信号需要电平转换的情况下,可以考虑上拉电阻或选择具有5V输入容限的器件,甚至可以考虑电阻分压降低输入电压的办法。对于大量信号需要电平转换的情况,为了可靠传输数据,可以采用双电压(一边是3.3V,另一边是5V)供电的双向驱动器来实现电平转换。如仙童半导体公司的74LVX4245、TI公司的SN74ALVC164245、SN74ALVC4245

等芯片,可以较好地解决3.3V与5V电平的转换问题。

4 3.3V、5.0V电平信号与RS-232电平信号的转换

在TFT彩色液晶网络终端系统中,Intel PXA255微处理器有3个与16550标准兼容的UART端口,3.3V CMOS逻辑结构。终端外围设备一般都遵守RS-232C标准的串口,因此必须进行EIA-RS-232C与Intel PXA255电平和逻辑关系的转换。实现这种变换的方法很多,可用分离元件,也可用集成电路。目前较为广泛地使用集成电路转换器件,如MC1488、SN75150等芯片可完成TTL电平到串口电平的转换。MC1489、SN75154可实现串口电平到TTL电平的转换。MAX232/MAX232A、MAX3221/MAX3223 等芯片可完成多路3V~5V电平与串口电平的双向转换。在TFT彩色液晶网络终端系统中,串口多达8路,从价格和电路的复杂性等方面考虑,选用Intelsil公司的HIN232。HIN232的供电电压是5.0V,它的接收模块的输出管脚、发送模块的输入管脚的逻辑电平与TTL/CMOS兼容。

5 3.3V电平信号与LVDS信号的转换

Intel PXA255微处理器的LCD控制模块提供16位显示数据,行、场同步信号,象素时钟,输出使能信号。在TFT显示模式下,红色5位,绿色6位,蓝色5位。这些信号都是3.3V CMOS电平。国家半导体公司推出的DS90C385发送器,专用于将LVTTL和LVCMOS信号转换为LVDS数据流。在选用转换芯片时,一定要注意转换速率是否满足系统需要。

在今后的数字逻辑系统的设计中,会经常遇到混合逻辑电平的接口问题。只要深入理解各种逻辑电平的电特性,同时注意一些具体问题,例如转换速率等,就能设计出正确的接口电路,保证数据可靠传输。

posted @ 1:15 | Feedback (1)