在JTAG菊花链拓扑对设备编程 - Go语言中文社区

在JTAG菊花链拓扑对设备编程


JTAG菊花链拓扑

JTAG菊花链所谓菊花链就是收尾相连,在菊花链中,所有设备共用TCK和TMS,JTAG连接器的TDI从其中一个设备的TDI输入,然后该设备的TDO连接到下一个设备的TDI,依次往复,直到最后一个设备,该设备的TDO连接到JTAG连接器的TDO。

搜索未知菊花链

这一步的主要功能是收集菊花链链路中所连接设备的信息。本文假定所有的指令寄存器的LSB为1,其他位全部为0(这种假设只是针对特定厂商的设备,在此仅为了举例,具体设备请查看具体的参考手册,以官方提供的文档为主).

在设备复位后,默认选择的是32位的IDCODE寄存器,如果设备没有IDCODE寄存器,那么默认选定单比特的Bypass寄存器。

菊花链探索分为两部分:指令寄存器扫描用于决定拓扑中的设备数和每个设备指令寄存器的长度;数据寄存器扫描用于收集每个设备的ID号。如果设备不支持IDCODE指令,那么给该设备分配0x00000000的ID号。

指令寄存器探索过程开始于JTAG TAP复位操作,在随后的IR_Scan操作中,在最后一个设备(上图:JTAG Device #2)的TDI移入"1",直到在JTAG Device #0检测到“11”为止。从TDO获取的序列中每个"10"代表一个新设备,根据"10"出现的次数判断链路中设备数目。

在IR扫描完成后,JTAG状态机被复位,搜索过程发出一个DR扫描来读取和存在设备的ID以备后用。从JTAG规范看,如果设备支持IDCODE,那么在DR扫描返回的最低位必须是"1";否则,如果设备不支持IDCODE,那么设备处于Bypass状态,DR扫描返回的最低位为0.

菊花链IR和DR扫描

在菊花链中,除需要编程的设备外的其他设备都需要配置到Bypass模式。这可以通过在被隔离设备之前和之后移入"1"来实现。比如指令宽度为4bit,当前菊花链中有三个设备:A、B和C。复位后,设备默认为读IDCODE指令。

TDI   ->  Device A-> Device B ->  Device C -> TDO
Reset     xxxx       xxxx         xxxx
shift 1   1xxx       xxxx         xxxx
shift 1   11xx       xxxx         xxxx
shift 1   111x       xxxx         xxxx
shift 1   1111       xxxx         xxxx
shift 0   0111       1xxx         xxxx
shift 1   1011       11xx         xxxx
shift 1   1101       111x         xxxx
shift 0   0110       1111         xxxx
shift 1   1011       0111         1xxx
shift 1   1101       1011         11xx
shift 1   1110       1101         111x
shift 1   1111       0110         1111

从上面的推演可以看出,Device A和Device C处于Bypass模式,而Device B处于0110指令控制下,接下来DR扫描都是针对Device B进行的,而在Device A和Device C有一个TCK的延迟。总结如下:

  • IR扫描:IR扫描序列中前m个1表示目前设备前的指令寄存器总宽度,后n个1表示目前设备后的设备指令寄存器bit总宽度。以上述推导为例,IR扫描序列:1111_0110_1111,前4个"1"表示Device A的指令寄存器位宽,后4个“1”表示Device C的指令寄存器位宽。
  • DR扫描:DR扫描中前x个“0”表示目标设备前设备的数据寄存器总位宽,后y个“0”表示目标设备后设备的数据寄存器总位宽。

DR扫描举例:
假设Device A的IDCODE为00111,Device B的IDCODE为00011,Device C的IDCODE为00111.

TDI     ->     Device A  ->  Device B  ->  Device C -> TDO
Capture DR     00111         00011         00111
Shift 0        00011         10001         10011       1
shift 0        00001         11000         11001       11
shift 0        00000         11100         01100       111
shift 0        00000         01110         00110       1110
shift 0        00000         00111         00011       1110_0
shift 0        00000         00011         10001       1110_01
shift 0        00000         00001         11000       1110_011
shift 0        00000         00000         11100       1110_0110
shift 0        00000         00000         01110       1110_0110_0
shift 0        00000         00000         00111       1110_0110_00
shift 0        00000         00000         00011       1110_0110_001
shift 0        00000         00000         00001       1110_0110_0011
shift 0        00000         00000         00000       11100_11000_111
shift 0        00000         00000         00000       11100_11000_1110
shift 0        00000         00000         00000       11100_11000_11100

假设Device A和Device C处于Bypass模式,现在需要读取IDCODE信息:

TDI     ->     Device A  ->  Device B  ->  Device C -> TDO
Capture DR     0             00011         0
Shift 0        0             00001         1           0
shift 0        0             00000         1           01
shift 0        0             00000         0           011
shift 0        0             00000         0           0110
shift 0        0             00000         0           01100
shift 0        0             00000         0           011000
shift 0        0             00000         0           0110000

从上述推导可以看出,从TDI输入的序列为"000000"共7个"0",把从Device A到Device C整个链路上的寄存器内容全部读出。

寄存器状态类似于:
在这里插入图片描述

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/zdx19880830/article/details/105511026
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

推荐文章

猜你喜欢