社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
所谓菊花链就是收尾相连,在菊花链中,所有设备共用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.
在菊花链中,除需要编程的设备外的其他设备都需要配置到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的延迟。总结如下:
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整个链路上的寄存器内容全部读出。
寄存器状态类似于:
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!