打印

SWD接口续:JTAG接口

[复制链接]
3331|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 huangqi412 于 2015-3-30 17:56 编辑

过年最后一天提早来长沙,花了一天研究了下JTAG接口,也码上来。

书接上回,说到SWD顺便七七八八已经说完了,这下JTAG就没多少东西了,只是简单记录一下过程。

说起JTAG,普通电工跟它的相遇基本都是大学上FPGA课发现下载那个并口线叫JTAG,或者买并口头子和牛角插头在松烟中DIY古老的并口单片机下载器。文艺电工有些可能没上大学就跟JTAG早恋了,有些毕业后才遇到JTAG。遗憾的是,认识这么多年我也从没深入了解JTAG,就知道是神马IEEE神马边界扫描标准神马测试集成电路的。好吧,现在开始了解也为时不晚。

不管最初设计者对JTAG的期望是神马,现实就是现在JTAG已经满大桌了,各种芯片的下载和仿真几乎清一色的JTAG,估计超出了设计者的期望。也不知道这些JTAG协议是不是已经衍生出很多不兼容的版本了,估计除了硬件接口,二进制流和基本状态定义,其他都改了。别的芯片先不管,反正我们现在只看ARM的JTAG接口。

依然是看STM32中文手册,已经看过SWD部分,剩下JTAG部分就那么两三页。硬件接口上,JTAG一般都不用那根JNTRST脚,庞大的20PIN只要看4根线了,TCK,TMS,TDI,TDO。I和O命名是站在从机角度说的,因为STM32是被调试者。需要注意的是调试器需要将TDO上拉,不然输出一直为零,开始就注意这个,用浮空输入折腾了2分钟一直没数据,改上拉就好了。JTAG跟SPI神似,移位结构,所以可以像595芯片一样级联串成一大串用。在STM32芯片的链路上就串了2个,一个是ARM的CM3,一个是ST公司的TMC,我们要用的就是ARM的CM3,另一个估计是ST公司做芯片质检的?发现一个名词TAP,百度了下叫测试访问接口,估计跟DP,AP差不多意思,一个芯片内有多个器件,这个TAP就是访问各器件的接口模块,每个器件一个TAP挂在JTAG串上。又有两个名词IR和DR。IR用来指定DR,通过DR对器件做读写。两个TAP的IR长度分别为5位和4位。手册提到输入IR时扫描链=5+4,不用的TAP必须输入旁路指令。输入DR时不用的TAP被旁路,需要额外增加一位。这两句话很有用。列出了ARM TAP的IR指令表(即DR地址表),五个指令分别是:旁路  IDCODE   DP访问   AP访问  中止  还给出了每个DR的数据位定义,不同的DR位数不同。再列了一张JTAG DP的寄存器表,比SW 的DP寄存器少了很多,但是地址和数据位定义是相同的。JTAG的AP与SW 的AP是共用的。 看到这里,STM32中文手册用3页纸完整的说清楚了JTAG调试接口的结构和使用:正确连线JTAG的四根线,用旁路指令屏蔽链上其他TAP,目标TAP用IR选择不同的DR寄存器,被屏蔽的TAP在链上只有一位数据,不同DR位数不同。通过DR寄存器访问AP和DP,如何使用AP和DP的介绍在SW部分。中文手册到此结束。

尽管ST说的很清楚,我们也看得很仔细,但是依然无从下手。因为:我们只知道在CLK节拍下将数据注入流出,不知道是上升沿还是下降沿。不知道如何区分IR链和DR链,估计TMS就是干这个事的。网上一搜,马上发现一张图叫做TAP状态机的,解了疑惑。每个圈圈都是一个状态,数字表示TMS电平,在时钟上升沿锁存,这么一想,数据估计就是下降沿移位了,因为锁存会引发状态改变,数据必须在状态跳变前送进去。每个状态跳变只有2个分支,清晰简洁,弯箭头处可以停留,也就是可能用来输入数据,直箭头是不上客的小火车站,不可能输入数据。RST和IDLE的弯箭头只是为了提供条件保持当前状态,也不会有数据。PAUSE_DR和PAUSE_IR看名字就不是输入数据地方。DR和IR数据就只能分别在SHIFT_DR和SHIFT_IR处输入了。如果当前忘了自己处于哪个圈了肿么办呢?TMS=1一路走,只要五步保证会到达并停留在RST状态。当然也可以把剪了的那根RST线用起来,直接复位简单粗暴。这下子知道怎么用了。照着这个线路图走,到达SHIFT送数据再返回就对了。


还是有疑问,对一片或一串已知芯片,链上有多少个器件,以及各自IR长度是知道的,如果是有未知芯片呢?都不知道挂了多少个,也不知道各自IR长度多少(DR只需要知道目标器件,其他器件可以旁路掉),没法用了。想了下所有器件RST后默认状态应该是一致的,旁路?IDCODE?这样可以通过判断注入=流出终止获得设备个数,IR也可以通过注入=流出终止获得IR总长度,各自IR长度依然无法知道,对照IR指令表,除非JTAG协议规定所有器件IDCODE地址必须都是1110格式即除了低位=0其他都为1,可以找零知道每个长度。还是用示波器抓仿真器波形来验证这个想法吧。发现是先在DR发送一长串读回ID,这一步知道了器件个数以及器件ID,然后发送IR,获得的是10001000011111这样格式,这一步知道了每个IR的长度。

可以动手测试了。就是将上次SWD的过程照搬了一遍,一切顺利。



JTAG
虽然对ARM下载已经不重要,有两线的SWD好用的很。但是在这个遍地JTAG接口的时代,不知道JTAG的电工还真不好意思,没准哪天调试别的东西遇到问题就要这个。问题来了,JTAG没法用硬件SPI,怎么让它速度快。为什么复位后直接读DPIDCODE,IR没有被旁路的器件是1000格式,被旁路的器件是1111格式,有相关规定么,读过JTAG正规文档的高手们,给说下呗。

相关帖子

沙发
b阿门d| | 2016-7-10 17:34 | 只看该作者
请问一下楼主,那个JTAG的边界扫描TAP不用的时候写入的是0b01111吗,我从手册中看到的Cortex-m4的TAP在不用时候是写入0b1111,但不知边界扫描TAP是不是也是这个值,我现在能够在test-logic-reset后直接读出ID,但写入相应的IR的ID指令0x0e后读取DR的值为0,不知是哪里的问题。

使用特权

评论回复
板凳
Simon21ic| | 2016-7-10 18:45 | 只看该作者
JTAG就是用硬件SPI实现,只是需要2路,怎么实现可以自己想想看

使用特权

评论回复
地板
Simon21ic| | 2016-7-10 18:49 | 只看该作者
b阿门d 发表于 2016-7-10 17:34
请问一下楼主,那个JTAG的边界扫描TAP不用的时候写入的是0b01111吗,我从手册中看到的Cortex-m4的TAP在不用 ...

TDR后可以直接读取ID是因为复位后,默认链接ID

使用特权

评论回复
5
huangqi412|  楼主 | 2016-7-10 22:14 | 只看该作者
Simon21ic 发表于 2016-7-10 18:45
JTAG就是用硬件SPI实现,只是需要2路,怎么实现可以自己想想看

两路spi. 是指那个tms也编码成字节用一路spi发送么  两个spi同频同发

使用特权

评论回复
6
huangqi412|  楼主 | 2016-7-10 22:15 | 只看该作者
b阿门d 发表于 2016-7-10 17:34
请问一下楼主,那个JTAG的边界扫描TAP不用的时候写入的是0b01111吗,我从手册中看到的Cortex-m4的TAP在不用 ...

惭愧啊  我现在都不懂自己以前写的贴了  当时研究了下 没实际用到过

使用特权

评论回复
7
huangqi412|  楼主 | 2016-7-10 22:18 | 只看该作者
b阿门d 发表于 2016-7-10 17:34
请问一下楼主,那个JTAG的边界扫描TAP不用的时候写入的是0b01111吗,我从手册中看到的Cortex-m4的TAP在不用 ...

有啥疑问和心得欢迎跟帖记录

使用特权

评论回复
8
huangqi412|  楼主 | 2016-7-10 22:20 | 只看该作者
Simon21ic 发表于 2016-7-10 18:45
JTAG就是用硬件SPI实现,只是需要2路,怎么实现可以自己想想看

大神  我当时还有些疑惑 能否指点我帖子尾疑问

使用特权

评论回复
9
b阿门d| | 2016-7-12 09:27 | 只看该作者
现在可以操作IR来读IDCODE了,我试过无论前面有多少个shift-IR,最终决定输入数据的是在随后一位的TDI输入要在将进入EXIT1的状态下写入,并且从这个位开始往上输入的九个位作为IR的TAP输入,当然这九个位包括不用的TAP的BYPASS位,但是现在操作想用DR来操作JTAG-DP出现问题,写入DP的CTRL/STAT寄存器后读出显示为0,表示没有写入,DR已经写入最后一位为0表示bypass位,难道DR还有什么设置?

使用特权

评论回复
评论
huangqi412 2016-7-12 10:21 回复TA
看了下,你似乎刚搞完SWD,又来搞JTAG了,是做烧写器产品?还是自己玩? 
10
b阿门d| | 2016-7-12 10:56 | 只看该作者
。。。原来IR的边界扫描BYPASS是0b11111的吧?

使用特权

评论回复
11
Simon21ic| | 2016-7-12 12:54 | 只看该作者
huangqi412 发表于 2016-7-10 22:20
大神  我当时还有些疑惑 能否指点我帖子尾疑问

SPI有很多种实现方式,有一种就是全用硬件SPI实现,一路主机一路从机,时钟和片选接一起
不过,这种方式是需要好好研究一下JTAG状态机的,因为SPI是8位的,而且,对于有一些芯片,兼容性并不好,因为那些芯片设计的时候,并没有完全参照状态机
不过对于stm32,这种方式可以突破stm32的JTAG频率限制,理解状态机的话,就可以理解原因了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:    好久不嚼槟榔

622

主题

24960

帖子

18

粉丝