最近一直在弄个DIY的下载器,就是用几个普通的IO口(可以是其他的单片机,如51,AVR等)来模拟JTAG 的时序,给STM32的FLASH烧写程序。 遇到好多问题啊,头疼!!呵呵
下面跟大家分享一下关于JTAG的一些东西!也想请教一些问题!
1.首先要了解的是 JTAG 的TAP状态机!
A、JTAG协议的本质与SPI协议并没有什么不同,它等于一个复杂的SS状态机+变长的MOSI和MISO数据移位
操作。不过所谓的变长,都是事先约定好的。
B、JTAG协议是一个同步通讯协议,它是全双工的。它的通讯原则是“以物易物”——即你如果想得到某
些东西,你必须先给与相同长度的内容;你如果只是想发送一些数据,也会自动获取相同长度的内容,
至于交换的内容是否有意义,这是另外一回事了。
C、JTAG协议无论多么复杂,实际上只有4根线起作用(有时候还有两根鸡肋的nSRST和TRST),他们分别
是TMS、TCK、TDI和TDO,他们分别对应SPI协议里面的SS、SCK、MOSI和MISO。在本质上,他们并没有
什么不同。即便是ARM的JTAG那么多的引脚,实际上起作用JTAG的也就这4根线而已。
D、JTAG的数据操作都是基于移位寄存器的。
2. TAP状态机的工作原理
JTAG寄存器被分为两大类:数据寄存器(DR-Data Register)和指令寄存器(IR-Instruction
Register)。
TAP是一个通用的端口,通过TAP可以访问芯片提供的所有数据寄存器(DR)和指令寄存器(IR)。对整个TAP的控制是通过TAP
Controller来完成的。事实上,通过TAP接口,对数据寄存器(DR)进行访问的一般过程是:
1) 通过指令寄存器(IR),选定一个需要访问的数据寄存器;(所谓指令就是规定选择哪个数据寄存器)
2) 把选定的数据寄存器连接到TDI和TDO之间;
3) 由TCK驱动,通过TDI,把需要的数据输入到选定的数据寄存器当中去;同时把选定的数据寄存器中的数据通过TDO读出来。
以上关于JTAG协议的讲解是度娘告诉的。更多资料请百度。
3.有关STM32 的JTAG TAP!
以上截图来自《STM32中文参考手册》第29章!
4.JTAG的接线
JTAG的硬件接口包括四条信号线:
-- Test Clock Input (TCK)
TCK为TAP的操作提供了一个独立的、基本的时钟信号,TAP的所有操作都是通过这个时钟信号来驱动的。
-- Test Mode Selection Input (TMS)
TMS信号用来控制TAP状态机的转换。通过TMS信号,可以控制TAP在不同的状态间相互转换。TMS信号在TCK的上升沿有效。
-- Test Data Input (TDI)
TDI是数据输入的接口。所有要输入到特定寄存器的数据都是通过TDI接口一位一位串行输入的(由TCK驱动)。
-- Test Data Output (TDO)
TDO是数据输出的接口。所有要从特定的寄存器中输出的数据都是通过TDO接口一位一位串行输出的(由TCK驱动)。
在这里我用的两片STM32F103ZET6 的芯片。 用一片芯片的四个IO口连接到另外一篇芯片的JTAG接口上,如下图:
这四根线随便接到下载器一段的四个普通IO口,另外一段就要接到目标芯片的JTAG接口上。
5.相关的代码
我的代码只写了一部分,读出目标芯片的设备类型,和IDCODE等:
下面是读设备类型,和IDCODE的(JTAG IDCODE 在复位的时候可以读出!):
下面是串口发送回来的结果:
前面两行就是ID编号和设备类型信息:
和手册对比了一下是正确的!
后面的程序稍后在贴上。。。。。。
楼主我想问一下我用写IR来读IDCODE时读出来的值为0,这是为什么,那个旁路TAP我写了0b01111表示不用,设置IR时还要弄什么吗?
一周热门 更多>