用普通IO口模拟JTAG时序 给STM32的FLASH 写程序!!

2019-07-20 23:44发布

    最近一直在弄个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编号和设备类型信息:



和手册对比了一下是正确的!
后面的程序稍后在贴上。。。。。。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
24条回答
cookles
1楼-- · 2019-07-22 17:45
 精彩回答 2  元偷偷看……
rhettstream
2楼-- · 2019-07-22 18:01
cookles 发表于 2016-9-9 14:46
IR 寄存器发指令,DR寄存器发地址和数据。 由于公司的规定, 代码是不能上传的, 见谅。

不过我可以分 ...

好的,谢谢
爱吃排骨的蛋炒饭
3楼-- · 2019-07-22 20:33
楼主溜溜溜呀
大牙兔
4楼-- · 2019-07-22 23:17
 精彩回答 2  元偷偷看……
yuhaojin321
5楼-- · 2019-07-23 04:07
非常感谢楼主提供的参考文档,我也在用模拟jtag给一个FPGA的芯片的内置flash下程序,目前能读出IDCODE了,后面还有不少的工作要做,要继续努力了
cookles
6楼-- · 2019-07-23 06:13
大牙兔 发表于 2016-11-9 10:26
楼主,请问这段程序是写入到io口的芯片内,还是jtag口的芯片内(因为你用的两个芯片,所以我不清楚这个程序 ...

用一个芯片的普通IO口来模拟JTAG 的时序 给另外一片有JTAG接口的芯片写程序。

一周热门 更多>