本帖最后由 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,怎么让它速度快。为什么复位后直接读DP是IDCODE,读IR没有被旁路的器件是1000格式,被旁路的器件是1111格式,有相关规定么,读过JTAG正规文档的高手们,给说下呗。
|