JTAG 详解
第10章 自制简易JTAG下载烧写工具对于普通嵌入式系统爱好者来说,不太可能花太多的钱去买比较高档的调试仿真工具来调试我们自己的目标板,最经济的做法就是自己制作一个简单JTAG 线缆用来烧写flash,先将bootloader固化到flash中,因为bootloader编译出来都很小,一般几十KB,最多几百KB,用简易 JTAG烧写不需要多少时间,如果顺利,bootloader能够正常工作,那么就可以在bootloader菜单中通过串口或者TFTP下载其他程序到 目标板的DRAM中进行运行调试或者烧写最后定型的软件,因为通过串口或者TFTP下载的速度比简易JTAG线缆下载烧写速度快。当然也可以从网上搜索购 买一个简易JTAG线缆(很便宜,最多不超过50RMB),不管是什么版本都行,然后用我们下面介绍的简易JTAG烧写软件来烧写目标板的flash,使 用烧写软件之前只需先根据所购买JTAG线缆的具体连线图中并口与JTAG口的对应关系适当修改源代码中的管脚变量定义,然后重新编译链接就可以了。
这一章我们就介绍简易JTAG线缆硬件原理,烧写软件流程,并说明使用简易JTAG线缆烧写flash的方法。
10.1 JTAG简介
JTAG接口的基本工作原理是:在芯片内部定义一个TAP(Test Access Port,测试访问端口),开发人员使用连接到芯片的JTAG外部接口上的JTAG调试器,通过访问芯片内部的TAP端口来扫描芯片内部各个扫描单元以写 入或读取扫描寄存器的状态,从而对芯片进行测试和调试。一个扫描单元对应一个外部管脚,每个外部管脚有一个扫描寄存器BSR单元,所有这些管脚的扫描寄存 器连在一起就形成了扫描链。简单地说,PC通过JTAG调试器对目标板的调试就是通过TAP端口完成对扫描寄存器BSR和指令寄存器IR的读写访问。要了 解关于JTAG 更全面的知识,请参阅 IEEE1149.1标准。
10.1.1 一些基本概念
JTAG
是Joint Test Action Group(联合测试行动组)的缩写,是一种国际标准测试协议,它遵守IEEE 1149.1标准。一个含有JTAG接口的处理器,只要时钟正常,就可以通过JTAG接口访问处理器的内部寄存器、挂在处理器总线上的设备以及内置模块的 寄存器。
TAP
是Test Access Port(测试访问端口)的缩写,是芯片内部一个通用的端口,通过TAP可以访问芯片提供的所有数据寄存器(DR)和指令寄存器(IR),对整个TAP的控制是通过TAP控制器(TAP Controller)完成的。
边界扫描
英文叫Boundary Scan,边界扫描的基本思想是在靠近芯片的输入输出管脚(PIN)上设置一个移位寄存器单元,也就是边界扫描寄存器(Boundary-Scan Register)。当芯片处于调试状态时,边界扫描寄存器可以将芯片和外部输入输出管脚隔离开来,通过边界扫描寄存器单元,可以实现对芯片外部输入输出 管脚的观察和控制。对于芯片的输出管脚可以通过与之相连的边界扫描寄存器单元把信号(数据)加载到该引脚中去,对于芯片的输入管脚,也可以通过与之相连的 边界扫描寄存器"捕获"该管脚上的输出信号。在正常的运行状态下,边界扫描寄存器对芯片来说是透明的,所以正常的运行不会受到任何影响,这样,边界扫描寄 存器提供了一种便捷的途径用于观测和控制所需调试的芯片。另外,芯片管脚上的边界扫描(移位)寄存器单元可以相互连接起来,使芯片的周围形成一个边界扫描 链(Boundary-Scan Chain),边界扫描链可以串行地输入和输出,通过相应的时钟信号和控制信号,就可以方便地观察和控制处在调试状态下的芯片。
10.1.2 JTAG接口信号
标准的JTAG接口定义了以下一些信号管脚:
TMS:测试模式选择信号,输入,IEEE 1149.1标准强制要求。
TCK:测试时钟信号,输入,IEEE 1149.1标准强制要求。
TDI:测试数据输入信号,输入,IEEE 1149.1标准强制要求。
TDO:测试数据输出信号,输出,IEEE 1149.1标准强制要求。
TRST:内部TAP控制器复位信号,输入,IEEE 1149.1标准不强制要求,因为通过TMS也可以对TAP Controller进行复位。
STCK:时钟返回信号,IEEE 1149.1标准不强制要求。
DBGRQ:目标板上工作状态的控制信号,IEEE 1149.1标准不强制要求
10.1.3 TAP控制器的状态机
TAP控制器有16个同步状态,控制器的下一个状态TMS信号决定,TMS信号在TCK的上升沿被采样生效。
图10-1列出了TAP控制器的16个同步状态转换机制。(点击查看大图)图10-1 TAP(Test Access Port)控制器状态机Test-Logic-Reset测试逻辑复位状态
处于这种状态下,测试逻辑被禁止以允许芯片正常操作,读IDCODE寄存器将禁止测试逻辑。
无论TAP控制器处于何种状态,只要将TMS信号在5个连续的TCK信号的上升沿保持高电平,TAP就将进入Test-Logic-Reset状 态,如果TMS信号一直为高电平,那么TAP将保持在Test-Logic-Reset状态,另外TRST信号也可以强迫TAP进入Test- Logic-Reset状态。
处于Test-Logic-Reset状态的TAP,如果下一个TCK的上升沿时TMS信号处于低电平,那么TAP将被切换到Run-Test-Idle状态。
Run-Test-Idle运行测试空闲状态
Run-Test-Idle是TAP控制器扫描操作空闲状态,如果TMS信号一直处于低电平,那么TAP将保持在TRun-Test-Idle状态。当TMS信号在TCK上升沿处于高电平,TAP控制器将进入Select-DR-Scan状态。
Select-DR-Scan选择数据寄存器扫描状态
Select-DR-Scan是TAP控制器的一个临时状态,边界扫描寄存器BSR保持它们先前的状态。
当TMS信号在下一个TCK上升沿处于低电平,TAP控制器进入Capture-DR状态,一个边界扫描寄存器的扫描操作同时被初始化。
如果TMS信号在下一个TCK上升沿处于高电平,TAP控制器将进入Select-IR-Scan状态。
Capture-DR捕获数据寄存器状态
如果TAP控制器处于Capture-DR状态,且当前指令是SAMPLE/PRELOAD指令,那么边界扫描寄存器BSR在TCK信号的上升沿捕 获输入管脚的数据。如果此时不是SAMPLE/PRELOAD指令,那么BSR保持它们先前的值,另外BSR的值被放入连接在TDI和TDO管脚之间的移 位寄存器中。
处于Capture-DR状态时,指令不会被改变。
如果TMS信号在下一个TCK上升沿处于高电平,TAP进入Exit1-DR状态。如果TMS信号在下一个TCK上升沿处于低电平,则TAP进入Shift-DR状态。
Shift-DR移位数据寄存器状态
在Shift-DR状态下,在每个TCK的上升沿,TDI-移位寄存器-TDO串行通道向右移一位,TDI的数据移入移位寄存器,移位寄存器最靠近TDO的位移到TDO管脚上。
处于Shift-DR状态时,指令不会被改变。
如果TMS信号在下一个TCK上升沿处于高电平,TAP进入Exit1-DR状态。如果TMS信号处于低电平,则TAP一直进行移位操作。
Exit1-DR退出数据寄存器状态1
Exit1-DR是TAP控制器的一个临时状态,如果TMS信号在下一个TCK上升沿处于高电平,TAP进入Update-DR状态;如果TMS信号在下一个TCK上升沿处于低电平,则TAP进入Pause-DR状态。
处于Exit1-DR状态时,指令不会被改变。
Pause-DR暂停数据寄存器状态
Pause-DR状态允许TAP控制器暂时停止TDI-移位寄存器-TDO串行通道的移位操作。
处于Pause-DR状态时,指令不会被改变。
如果TMS信号在下一个TCK上升沿处于高电平,TAP进入Exit2-DR状态;如果TMS信号处于低电平,则TAP一直保持暂停状态。
Exit2-DR退出数据寄存器状态2
Exit2-DR也是TAP控制器的临时状态,如果TMS信号在下一个TCK上升沿处于高电平,TAP进入Update-DR状态,结束扫描操作;如果TMS信号在下一个TCK上升沿处于低电平,则TAP重新进入Shift-DR状态。
处于Exit2-D状态时,指令不会被改变。
Update-DR更新数据寄存器状态
在正常情况下,边界扫描寄存器BSR的值是被锁存在并行输出管脚中,以免在EXTEST或SAMPLE/PRELOAD命令下执行移位操作时改变 BSR的值。当处于Update-DR状态时选择的是BSR寄存器,那么移位寄存器中的值将在TCK的下降沿被锁存到BSR寄存器的并行输出管脚中去。
处于Update-DR状态时,指令不会被改变。
如果TMS信号在下一个TCK上升沿处于高电平,TAP进入Select-DR-Scan状态;如果TMS信号在下一个TCK上升沿处于低电平,则TAP进入Run-Test-Idle状态。
Select-IR-Scan选择指令寄存器扫描状态
Select-IR-Scan是TAP控制器的一个临时状态。
如果TMS信号在下一个TCK上升沿处于低电平,TAP控制器进入Capture-IR状态,一个对指令寄存器的扫描操作同时被初始化。
如果TMS信号在下一个TCK上升沿处于高电平,TAP控制器将进入Test-Logic-Reset状态。
处于Select-IR-Scan状态时,指令不会被改变。
Capture-IR捕获指令寄存器状态
处于Capture-IR状态时,指令寄存器中的值被固定设置成0b0000001,并将它放入连接在TDI与TDO之间的移位寄存器中。
处于Capture-DR状态时,指令不会被改变。
如果TMS信号在下一个TCK上升沿处于高电平,TAP进入Exit1-IR状态;如果TMS信号在下一个TCK上升沿处于低电平,则TAP进入Shift-IR状态。
Shift-IR移位指令寄存器状态
在Shift-IR状态下,在每个TCK的上升沿,TDI-移位寄存器-TDO串行通道向右移一位,JTAG指令从TDI管脚上被逐位移入移位寄存器,而移位寄存器中的0b0000001则被逐位从TDO管脚移出。
处于Shift-IR状态时,指令不会被改变。
如果TMS信号在下一个TCK上升沿处于高电平,TAP进入Exit1-IR状态;如果TMS信号处于低电平,则TAP一直进行移位操作。
Exit1-IR退出指令寄存器状态1
Exit1-IR是TAP控制器的一个临时状态,如果TMS信号在下一个TCK上升沿处于高电平,TAP进入Update-IR状态;如果TMS信号在下一个TCK上升沿处于低电平,则TAP进入Pause-IR状态。
处于Exit1-IR状态时,指令不会被改变。
Pause-IR暂停指令寄存器状态
Pause-IR状态允许TAP控制器暂时停止TDI-移位寄存器-TDO串行通道的移位操作。
处于Pause-IR状态时,指令不会被改变。
如果TMS信号在下一个TCK上升沿处于高电平,TAP进入Exit2-IR状态;如果TMS信号处于低电平,则TAP一直处于暂停状态。
Exit2-IR退出指令寄存器状态2
Exit2-IR也是TAP控制器的临时状态,如果TMS信号在下一个TCK上升沿处于高电平,TAP进入Update-IR状态,结束扫描操作;如果TMS信号在下一个TCK上升沿处于低电平,则TAP重新进入Shift-IR状态。
处于Exit2-D状态时,指令不会被改变。
Update-IR更新指令寄存器状态
处于Update-IR状态时,移位寄存器中的值将在TCK的下降沿被锁存到指令寄存器中,一旦锁存成功,新的指令将成为当前的指令。
如果TMS信号在下一个TCK上升沿处于高电平,TAP进入Select-DR-Scan状态;如果TMS信号在下一个TCK上升沿处于电平,则TAP进入Run-Test-Idle状态。
10.1.4 JTAG接口指令集
JTAG接口指令集包含以下常用指令:
EXTEST指令
外部测试指令,必须全为0,TAP强制定义。该指令初始化外部电路测试,主要用于板级互连以及片外电路测试。
EXTEST指令在Shift-DR状态时将扫描寄存器BSR寄存器连接到TDI与TDO之间。在Capture-DR状态时,EXTEST指令将 输入管脚的状态在TCK的上升沿装入BSR中。EXTEST指令从不使用移入BSR中的输入锁存器中的数据,而是直接从管脚上捕获数据。在Update- DR状态时,EXTEST指令将锁存在并行输出寄存器单元中的数据在TCK的下降沿驱动到对应的输出管脚上去。
SAMPLE/PRELOAD指令
采样/预装载指令,TAP强制定义。在Capture-DR状态下,SAMPLE/PRELOAD指令提供一个从管脚到片上系统逻辑的数据流快照, 快照在TCK的上升沿提取。在Update-DR状态时,SAMPLE/PRELOAD指令将BSR寄存器单元中的数据锁存到并行输出寄存器单元中,然后 由EXTEST指令将锁存在并行输出寄存器单元中的数据在TCK的下降沿驱动到对应的输出管脚上去。
BYPASS指令
旁路指令,必须全为1,TAP强制定义。BYPASS指令通过在TDI和TDO之间放置一个1位的旁通寄存器,这样移位操作时只经过1位的旁通寄存 器而不是很多位(与管脚数量相当)的边界扫描寄存器BSR,从而使得对连接在同一JTAG链上主CPU之外的其他芯片进行测试时提高效率。
IDCODE指令
读取CPU ID号指令,TAP强制定义。该指令将处理器的ID号寄存器连接到TDI和TDO之间。
10.2 简易JTAG线缆原理
简易JTAG线缆一端连接到PC的并口,另一端连接到目标板的JTAG接口,PC并口中的数据、I/O管脚通过一个74XX244单向驱动芯片与目 标板JTAG口的TMS、TCK、TDI、TDO、TRST信号线相连,然后用PC上的软件来模拟JTAG所遵守的IEEE 1149.1标准协议,从而访问、控制目标板上处理器的I/O管脚状态,也就能访问、控制挂接在处理器总线上的flash芯片的I/O管脚,实现将数据写 入flash芯片中的功能。
10.2.1 PC并口定义
PC并口管脚线序如图10-1所示:图10-2 PC并口管脚线序PC并口管脚定义如表10-1所示:
表10-1 PC并口管脚定义续表
10.2.2 PC并口的寄存器
PC上的程序通过访问并口的I/O端口寄存器来访问、控制并口的管脚信号,这些端口包括数据端口、状态端口和控制端口,其中每个端口都有自己的端口号,相当于它们的地址。程序通过端口号来访问端口寄存器。
PC并口1的数据端口号为3BCH,状态端口号为3BDH,控制端口号为3BEH;
PC并口2的数据端口号为378H,状态端口号为379H,控制端口号为37AH;
PC并口3的数据端口号为278H,状态端口号为279H,控制端口号为37AH;
1)数据寄存器
数据寄存器(D0~D7)也叫数据端口,它保存了写到数据端口管脚的一字节数据。数据端口可以写入数据(输出),也可以读出数据(输入)。写入的数 据是从数据端口管脚输出的数据,读出来的数据是我们上次写入数据端口的数据或者原来保留在里面的数据,并不是从端口管脚输入PC的数据。数据端口对应的管 脚是PIN2~PIN9,数据寄存器定义如表10-2所示。
表10-2 PC并口数据寄存器定义
bit
对应并口管脚
信号名
信号源
是否倒相
Pin2
D0
PC
否
1
Pin3
D1
PC
否
2
Pin4
D2
PC
否
3
Pin5
D3
PC
否
4
Pin6
D4
PC
否
5
Pin7
D5
PC
否
6
Pin8
D6
PC
否
7
Pin9
D7
PC
否
2)状态寄存器
状态寄存器(S0~S7)又叫状态端口,它保存的是5个输入(S3~S7)管脚的逻辑状态,S0~S2位不与管脚对应。除了S0以外,状态寄存器是 只读的,读出数据信息是状态端口管脚上的逻辑状态。S0是支持EPP传输并口的超时标志信息,可以用软件方法清零。在许多并口中,状态输入接有上拉电阻。 状态端口对应的管脚是Pin10~Pin13、Pin15。状态寄存器定义如表10-3所示。
表10-3 PC并口状态寄存器定义
bit
对应并口管脚
信号名
信号源
是否倒相
Time-Out
1
未使用
2
未使用
3
Pin15
nError(nFault)
外设
否
4
Pin13
Select
外设
否
5
Pin12
PaperEnd
外设
否
6
Pin10
nAck
外设
否
7
Pin11
Busy
外设
是
3)控制寄存器
控制寄存器(C0~C8)又叫控制端口,它保存了C0~C3的4位的控制信息,C4~C7不与管脚对应,这些位一般被用来输出;但在大多数SPP并 口中,控制位为集电极开路/漏极开路模式,也就是说,它们同样可以用作输入。要从控制位上读取外部逻辑信号,首先将相应的输出写入"1",然后读取控制寄 存器的值即可。但是,为了提高交换速度,大多数支持EPP和ECP模式的并口,控制位工作在不能用作输入的推拉模式下。在一些多模式接口中,控制位采用的 是改进型的推拉模式,可以用作输入。控制端口对应的管脚是Pin1、Pin14、Pin16和Pin17。控制寄存器定义如表10-4所示。
表10-4 PC并口控制寄存器定义
bit
对应并口管脚
信号名
信号源
是否倒相
Pin1
nStrobe
PC
是
1
Pin14
nAutoLF
PC
是
2
Pin16
nInit
PC
否
3
Pin17
nSelectIn
PC
是
4
IRQ
5
未使用
6
未使用
7
未使用
10.2.3 简易JTAG线缆原理图
图10-3及图10-4分别是我自己制作的简易JTAG线缆的原理图和外观图。(点击查看大图)图10-3 自制简易JTAG线缆原理图图10-4 自制简易JTAG线缆外观图10.2.4 简易JTAG线缆烧写连接图(见图10-5)
自制简易JTAG线缆连接方式如图10-5所示。(点击查看大图)图10-5 自制简易JTAG线缆连接图10.3 简易JTAG烧写代码分析
10.3.1 简易JTAG烧写程序(flashp)使用说明
1)需要用到的文件说明
文件
说明
porttalk.sys
PC的I/O端口驱动程序,使用flashp前必须将该文件复制到Windows所安装硬盘分区的WINDOWS/system32/drivers目录下
AllowIo.exe
PC的I/O端口使能程序,在Windows XP和Windows 2000下必须与flashp.exe联合使用,在Windows 98下无须用此文件
flashp.exe
简易JTAG烧写flash程序已编译好的可执行文件
mycpu.bsd
目标板上CPU芯片的边界扫描描述文件,由CPU芯片生产厂家提供
myflash.fcd
目标板上CPU与flash芯片管脚连接以及flash芯片属性描述文件
myprj.bin
要被烧写到flash中的二进制工程文件
erase.bat
擦除flash芯片批处理文件
read.bat
读flash芯片中数据批处理文件
write.bat
写数据到flash芯片批处理文件
2)flashp.exe命令格式说明
/>(allowio)flashpcmd[options](/a);如果在Windows98系统下使用,则不用allowio和/a命令格式
说明
cmd
操作命令标识字符,不区分大小写
R从flash中读数据到指定文件
W将指定二进制文件写入flash
E擦除flash整个芯片
V校验flash中的数据
T测试JTAG线缆连接情况,检查PC哪个并口连接了JTAG线缆
options
选项标识字符,不区分大小写
-V指示操作后进行校验,默认不校验
-D运行过程中打印调试信息
-C指定flash连接描述文件,默认为default.fcd
-F指定要写入的二进制文件工程文件名
-S指定烧写flash的起始地址,十进制,默认为0
-L指定烧写flash的数据长度,字节数,十进制,默认为256
3)flashp.exe命令举例
/>allowioflashpr-fread.bin-s0-l10000/a该命令行从flash芯片的0地址开始读10000个字节数据保存到read.bin文件中;
/>allowioflashpe/a该命令将整个flash芯片擦除,擦除后的flash全为0xff;
/>allowioflashpw-fmyprj.bin/a该命令将myprj.bin文件烧写到flash芯片的0位置;
如果上述命令在Windows 98系统中使用,那么对应命令格式如下所示:
/>flashpr-fread.bin-s0-l10000/>flashpe/>flashpw-fmyprj.bin10.3.2 flash与CPU连接及flash属性描述文件
这里以我自己制作的S3C4510开发板上用的fcd文件来说明:
[Chain];JTAG扫描链区段
Device=s3c4510b.bsd;CPU的边界扫描文件,由S3C4510处理器的生产商三星公司提供[Read];程序中未用
BeginByte=0
EndByte=0x10000[Flash] ; SST39VF160;flash芯片描述区段。SST39VF160是注释,指明flash芯片的型号
WriteCmd=0x5555, 0xaa, 0x2aaa, 0x55, 0x5555, 0xa0 ;
写flash芯片的命令字序列,可查阅flash芯片手册获得
EraseCmd=0x5555, 0xaa, 0x2aaa, 0x55, 0x5555, 0x80,
0x5555, 0xaa, 0x2aaa, 0x55, 0x0, 0x30 ;擦除flash芯
片的命令字序列,可查阅flash芯片手册获得
EraseDelay=25;擦除芯片所需要的等待时间,单位为ms
Block=0x800, 512;flash芯片中一个sector的大小,如果
有多种sector,应该设置成最小的sector大小。这里表示flash芯片最小sector的大小为512字节
AddrWidth=20;flash连到系统中的数据宽度,即数据线位数,这里表示数据线宽为20位;
DataWidth=2;flash连到系统中的地址宽度,即地址的字节数,这里表示地址为2字节宽度;
BigEndian=0;字节序模式,0表示LittleEndian,小端,一个
字中低地址字节为低位字节;1表示BigEndian,大端,一个字中的低地址字节为高位字节;
A0=110;flash芯片的地址位0管脚A0连到了S3C4510芯片的第110管脚,以下类推
A1=111
A2=112
A3=113
A4=114
A5=115
A6=116
A7=117
A8=120
A9=121
A10=122
A11=123
A12=124
A13=125
A14=126
A15=127
A16=128
A17=129
A18=132
A19=133
D0=136 ;flash芯片的数据位0管脚D0连到了S3C4510芯片的第136管脚,以下类推
D1=137
D2=138
D3=139
D4=140
D5=141
D6=144
D7=145
D8=146
D9=147
D10=148
D11=149
D12=150
D13=151
D14=152
D15=153
WR=100;flash芯片的写信号管脚WR连到了S3C4510芯片的第100管脚
RD=72;flash芯片的读信号管脚RD连到了S3C4510芯片的第72管脚
CS=75;flash芯片的片选管脚CS连到了S3C4510芯片的第75管脚
ResetCtrl=0x00;flash芯片的复位控制管脚未连接
High=
Low=
SafeMode=1;安全模式设置,程序中未使用
10.3.3 简易JTAG烧写程序的执行逻辑和流程
网上有很多种简易JTAG烧写程序,有用标准C写的,有用VC写的,有Windows系统下使用的版本,也有Linux系统下使用的版本,读者可以自行下载后作适当修改重新编译就可使用了。
不管什么版本的程序,其基本原理和执行逻辑应该是差不多的,本书附带光盘中有我所下载、修改、使用的JTAG烧写程序完整源代码,读者可以参考阅读。如图10-6所示是该程序的总体流程。
烧写程序维护两个扫描链表缓冲区,一个对应输入,一个对应输出。一个扫描链缓冲区就是一个int型整数数组,数组的长度为CPU的管脚(PIN) 数,数组中的每个元素对应一个管脚的状态,一个管脚的状态只有两种:0或者1,事实上用1位就可以描述这两种状态,而程序中用一个int整数来描述是很浪 费的,感兴趣的读者可以对程序进行修改优化。输入扫描链表数组用来保存刚从CPU扫描出来的每个管脚的状态,而输出扫描链表数组用来保存将扫描到CPU的 管脚中的状态。
对flash芯片编成首先必须将flash芯片擦除,然后再对其进行写操作,擦除flash芯片可以逐个扇区擦除,也可以一次擦除整个芯片,对flash芯片进行擦写的时序和命令请查看具体flash芯片型号的datasheet。
通过简易JTAG线缆读写flash芯片数据必须逐个字节进行读写,操作过程都很类似,以读flash为例,操作过程如下:
1)把CPU各管脚的安全状态写入到输出扫描链表数组中;
2)将"SAMPLE"命令扫描到CPU的TAP控制器中;
3)将输出扫描链表数组中的状态扫描到CPU的TAP控制器中;
4)再次将"SAMPLE"命令扫描到CPU的TAP控制器中;
5)将"EXTEST"命令扫描到CPU的TAP控制器中;
6)执行for循环逐个字节读取数据,循环次数等于要读取的数据长度:先将要读取的flash的地址的地址管脚状态写入输出扫描链表数组对应的元素 中,然后将输出扫描链表数组中的状态扫描到CPU的TAP控制器中,与此同时将CPU管脚的状态同步输入到输入扫描链表数组中,然后从输入链表数组中提取 flash数据。图10-6 简易JTAG线缆烧写flash芯片程序流程JTAG基础知识本知识翻译收集来自http://www.fpga4fun.com,版权归原网站所有。
1.什么是JTAG:Joint Test Action Group;联合测试工作组
JTAG是一种IEEE标准用来解决板级问题,开发于上个世纪80年代。今天JTAG被用来烧录、debug、探查端口。当然,最原始的使用是边界测试。
边界测试:
举个栗子你有两个芯片,这两个芯片之间连接了很多很多的线,怎么确保这些线之间的连接是OK的呢,用JTAG,它可以控制所有IC的引脚。这叫做芯片边界测试。(没用过)
2.JTAG引脚:
JTAG发展到现在已经有脚了,通常四个脚:TDI,TDO,TMS,TCK,当然还有个复位脚TRST。对于芯片上的JTAG的脚实际上是专用的。
TDI:测试数据输入,数据通过TDI输入JTAG口;
TDO:测试数据输出,数据通过TDO从JTAG口输出;
TMS:测试模式选择,用来设置JTAG口处于某种特定的测试模式;
TCK:测试时钟输入;
TRST:测试复位;
更多吊炸天的用法:
CPU和FPGA制造商允许JTAG用来端口debug;FPGA厂商允许通过JTAG配置FPGA,使用JTAG信号通入FPGA核。
3.JTAG怎么工作:
PC控制JTAG:用JTAG电缆连接PC的打印端口或者USB或者网口。最简单的是连接打印端口。
TMS:在每个含有JTAG的芯片内部,会有个JTAG TAP控制器。TAP控制器是一个有16个状态的状态机,而TMS就是这玩意的控制信号。当TMS把各个芯片都连接在一起的时候,所有的芯片的TAP状态跳转是一致的。下面是TAP控制器的示意图:
改变TMS的值,状态就会发生跳转。如果保持5个周期的高电平,就会跳回test-logic-rest,通常用来同步TAP控制器;
通常使用两个最重要的状态是Shift-DR和Shift-IR,两者连接TDI和TDO使用。
IR:命令寄存器,你可以写值到这个寄存器中通知JTAG干某件事。每个TAP只有一个IR寄存器而且长度是一定的。
DR:TAP可以有多个DR寄存器,与IR寄存器相似,每个IR值会选择不同的DR寄存器。(很迷)
4.JTAG链相关疑问:
计算JTAG链中的IC数目:
一个重要的应用是IR值是全一值,表示BYPASS命令,在BYPASS模式中,TAP控制器中的DR寄存器总是单bit的,从输入TDI到输出TDO,通常一个周期,啥也不干。
可用BYPASS模式计算IC数目。如果每个IC的TDI-TDO链的延迟是一个时钟,我们可以发送一些数据并检测它延迟了多久,那么久可以推算出JTAG链中的IC数目。
得到JTAG链中的器件ID:
大多数的JTAG IC都支持IDCODE命令。在IDCODE命令中,DR寄存器会装载一个32bit的代表器件ID的值。不同于BYPASS指令,在IDCODE模式下IR的值没有标准。不过每次TAP控制器跳转到Test-Logic-Reset态,它会进入IDCODE模式,并装载IDCODE到DR。
5.边界扫描:
TAP控制器进入边界扫描模式时,DR链可以遍历每个IO块或者读或拦截每个引脚。
在FPGA上使用JTAG,你可以知晓每个引脚的状态当FPGA在运行的时候。
可以使用JTAG命令SAMPLE,当然不同IC可能是不同的。