OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 16848|回复: 25

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

[复制链接]

9

主题

108

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1136
金钱
1136
注册时间
2013-7-16
在线时间
80 小时
发表于 2014-4-28 13:53: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编号和设备类型信息:




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


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

108

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1136
金钱
1136
注册时间
2013-7-16
在线时间
80 小时
 楼主| 发表于 2016-9-9 14:46:56 | 显示全部楼层
rhettstream 发表于 2016-9-9 10:25
但是状态机里数据移位和指令移位,在哪里指定地址呢?这里不是太懂,能否指导一下呢?或者能看一下你的程 ...

IR 寄存器发指令,DR寄存器发地址和数据。 由于公司的规定, 代码是不能上传的, 见谅。

不过我可以分享个文档给你看看。 应该对你有些帮助


C8051 JTAG编程.PDF

897.58 KB, 下载次数: 1010

回复 支持 1 反对 0

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-1-16
在线时间
0 小时
发表于 2015-11-19 14:42:41 | 显示全部楼层
能实现烧写了么
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-4-28 19:11:33 | 显示全部楼层
回复【楼主位】cookles:
---------------------------------
不错,其实楼主可以只用SWDIO就可以了,另外速度要快点才好。
期待楼主早日做出来,呵呵。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
发表于 2014-4-28 21:53:19 | 显示全部楼层
fun
回复 支持 反对

使用道具 举报

10

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2012-7-8
在线时间
45 小时
发表于 2016-4-18 16:19:10 | 显示全部楼层
楼主后面的程序能贴上来吗?最近也想做这个
回复 支持 反对

使用道具 举报

9

主题

108

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1136
金钱
1136
注册时间
2013-7-16
在线时间
80 小时
 楼主| 发表于 2016-6-23 16:19:28 | 显示全部楼层
程序已经完成并应用。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2016-7-10
在线时间
1 小时
发表于 2016-7-10 17:38:57 | 显示全部楼层
cookles 发表于 2016-6-23 16:19
程序已经完成并应用。

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

使用道具 举报

9

主题

108

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1136
金钱
1136
注册时间
2013-7-16
在线时间
80 小时
 楼主| 发表于 2016-8-24 09:06:58 | 显示全部楼层
b阿门d 发表于 2016-7-10 17:38
楼主我想问一下我用写IR来读IDCODE时读出来的值为0,这是为什么,那个旁路TAP我写了0b01111表示不用,设 ...

[mw_shl_code=applescript,true]        STM32_JTAG_Init();   //JTAG 引脚初始化
        JTAG_Reset();        //复位JTAG状态机
       
        printf("\r\n目标芯片信息: \r\n");
        JTAG_ID_Scan();      //读JTAG ID编号
        printf("JTAG_ID:0x%.8x \r\n",JTAG_ID);
        printf("DEV_Type:0x%.8x \r\n",DEV_ID);
        [/mw_shl_code]
回复 支持 反对

使用道具 举报

9

主题

108

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1136
金钱
1136
注册时间
2013-7-16
在线时间
80 小时
 楼主| 发表于 2016-8-24 09:07:38 | 显示全部楼层
cookles 发表于 2016-8-24 09:06
[mw_shl_code=applescript,true]        STM32_JTAG_Init();   //JTAG 引脚初始化
        JTAG_Reset();        //复 ...

ID 号,上电复位后就可以读出。 并不需要设置什么。
回复 支持 反对

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11547
金钱
11547
注册时间
2014-4-1
在线时间
1316 小时
发表于 2016-8-24 11:12:28 | 显示全部楼层

关键就是协议了。

回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-5-19
在线时间
15 小时
发表于 2016-9-7 17:34:36 | 显示全部楼层
cookles 发表于 2016-6-23 16:19
程序已经完成并应用。

楼主,我想问一下,烧写程序要指定地址吗?还是只要把所有程序一字节一字节写进去就可以??
回复 支持 反对

使用道具 举报

9

主题

108

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1136
金钱
1136
注册时间
2013-7-16
在线时间
80 小时
 楼主| 发表于 2016-9-8 15:00:09 | 显示全部楼层
rhettstream 发表于 2016-9-7 17:34
楼主,我想问一下,烧写程序要指定地址吗?还是只要把所有程序一字节一字节写进去就可以??

这是必须的, 地址和数据。

回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-5-19
在线时间
15 小时
发表于 2016-9-9 10:25:00 | 显示全部楼层
cookles 发表于 2016-9-8 15:00
这是必须的, 地址和数据。

但是状态机里数据移位和指令移位,在哪里指定地址呢?这里不是太懂,能否指导一下呢?或者能看一下你的程序吗?
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-5-19
在线时间
15 小时
发表于 2016-9-9 19:03:33 | 显示全部楼层
cookles 发表于 2016-9-9 14:46
IR 寄存器发指令,DR寄存器发地址和数据。 由于公司的规定, 代码是不能上传的, 见谅。

不过我可以分 ...

好的,谢谢
回复 支持 反对

使用道具 举报

7

主题

57

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2015-12-11
在线时间
42 小时
发表于 2016-9-9 20:23:31 | 显示全部楼层
楼主溜溜溜呀
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-11-9
在线时间
0 小时
发表于 2016-11-9 10:26:46 | 显示全部楼层
楼主,请问这段程序是写入到io口的芯片内,还是jtag口的芯片内(因为你用的两个芯片,所以我不清楚这个程序是写入到那个芯片?)。麻烦了哦。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-11-23
在线时间
0 小时
发表于 2016-11-23 13:00:47 | 显示全部楼层
非常感谢楼主提供的参考文档,我也在用模拟jtag给一个FPGA的芯片的内置flash下程序,目前能读出IDCODE了,后面还有不少的工作要做,要继续努力了
回复 支持 反对

使用道具 举报

9

主题

108

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1136
金钱
1136
注册时间
2013-7-16
在线时间
80 小时
 楼主| 发表于 2016-11-28 14:17:47 | 显示全部楼层
大牙兔 发表于 2016-11-9 10:26
楼主,请问这段程序是写入到io口的芯片内,还是jtag口的芯片内(因为你用的两个芯片,所以我不清楚这个程序 ...

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

使用道具 举报

9

主题

108

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1136
金钱
1136
注册时间
2013-7-16
在线时间
80 小时
 楼主| 发表于 2017-2-17 15:21:07 | 显示全部楼层
wtliu 发表于 2017-2-10 08:51
楼主威武,可不可以告诉一下“3.有关STM32 的JTAG TAP!”后面贴的来自哪个资料?要能共享一下全本就更好了 ...

《STM32中文参考手册》  第29章。
回复 支持 反对

使用道具 举报

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2016-1-22
在线时间
21 小时
发表于 2017-2-19 17:21:04 | 显示全部楼层
楼主的JTAG可以实现断点仿真,查看flash和ram的任意地址吗
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2017-6-17
在线时间
1 小时
发表于 2017-6-17 10:43:03 | 显示全部楼层
正在学习这方面的知识,很有用
回复 支持 反对

使用道具 举报

4

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2011-10-12
在线时间
9 小时
发表于 2018-11-2 10:41:58 | 显示全部楼层
挺有意思的.下次用SPI模拟一下看看
回复 支持 反对

使用道具 举报

357

主题

447

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1939
金钱
1939
注册时间
2016-12-13
在线时间
175 小时
发表于 2019-6-4 13:17:59 | 显示全部楼层
cookles 发表于 2017-2-17 15:21
《STM32中文参考手册》  第29章。

楼主,模拟ST-link是不是会比jtag好弄一点?一直对stlink的固件很好奇。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2019-6-14
在线时间
2 小时
发表于 2019-6-17 17:59:04 | 显示全部楼层
楼主的DEV_ID 和JTAG ID 如何定义的?我用的8051的例子,STM32跑的一直是FFFFFFFF
回复 支持 反对

使用道具 举报

74

主题

334

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-5-28
在线时间
144 小时
发表于 2020-7-12 10:56:58 | 显示全部楼层
cookles 发表于 2016-9-9 14:46
IR 寄存器发指令,DR寄存器发地址和数据。 由于公司的规定, 代码是不能上传的, 见谅。

不过我可以分 ...

好东西!!!谢谢楼主
最近爱上了stm32
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-11 13:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表