用普通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条回答
murphy0623
1楼-- · 2019-07-21 02:26
能实现烧写了么
正点原子
2楼-- · 2019-07-21 07:15
 精彩回答 2  元偷偷看……
shibusha
3楼-- · 2019-07-21 12:15
 精彩回答 2  元偷偷看……
圈圈点点
4楼-- · 2019-07-21 14:16
楼主后面的程序能贴上来吗?最近也想做这个
cookles
5楼-- · 2019-07-21 18:14
程序已经完成并应用。
b阿门d
6楼-- · 2019-07-21 20:16
cookles 发表于 2016-6-23 16:19
程序已经完成并应用。

楼主我想问一下我用写IR来读IDCODE时读出来的值为0,这是为什么,那个旁路TAP我写了0b01111表示不用,设置IR时还要弄什么吗?

一周热门 更多>