本应用笔记讨论了串行转JTAG板接受的命令。该板用于与MAXQ微控制器连接。这里描述的命令允许开发人员读写MAXQ的存储器(代码和数据),读写寄存器,并利用在线调试器。
介绍
MAXQ微控制器集成了一个测试访问端口(TAP),用于通过4线同步串行接口与主机设备通信。该TAP用于支持在系统编程和在线调试。TAP与JTAG IEEE标准1149兼容。为了连接到TAP,达拉斯半导体公司开发了一种串行到JTAG板和固件,通过标准RS-232串行端口接受命令,并将这些命令与适当的JTAG信号协调。本应用笔记描述了固件实现的命令协议。
注意:本应用笔记假定熟悉MAXQ微控制器的TAP和基本的JTAG通信。有关这些主题的详细信息,请参阅MAXQ系列用户指南。
与固件接口
要与串行转JTAG板建立通信,请使用115200个数据位、无奇偶校验和8个停止位以1波特率连接到该板的串行端口。连接后,您可以通过以下两种模式之一与固件接口:ASCII 或二进制。固件默认为 ASCII 模式,在该模式下,人类可读的文本命令被发送到电路板,结果以文本字符串的形式返回。在二进制模式下,所有传输都是一系列 8 位字节。有一些命令允许随时在两种模式之间切换。在 ASCII 模式下,表 1 中列出的命令始终可用。所有命令都区分大小写。可以在一行中输入命令组,也可以一次输入一个命令。
Command | 描述 |
h | 通过保持MAXQ复位来停止MAXQ。 |
H | 释放复位,允许MAXQ运行。 |
I | 将系统置于旁路模式并重置 TAP,使其返回到运行-测试-空闲状态。 |
JB | 指示固件开始接受后台模式命令。该命令不会切换目标MAXQ上的模式,也不会向目标器件发送任何JTAG命令。它只是为了指示固件MAXQ已经通过其他方式改变了模式。 |
JD | 指示固件开始接受调试模式命令。该命令不会切换目标MAXQ上的模式,也不会向目标器件发送任何JTAG命令。它只是为了指示固件MAXQ已经通过其他方式改变了模式。 |
JL | 指示固件开始接受引导加载程序命令。该命令不会切换目标MAXQ上的模式,也不会向目标器件发送任何JTAG命令。它只是为了指示固件MAXQ已经通过其他方式改变了模式。 |
JX | 指示固件开始接受旁路模式命令。该命令不会切换目标MAXQ上的模式,也不会向目标器件发送任何JTAG命令。它只是为了指示固件MAXQ已经通过其他方式改变了模式。 |
Q | 查询 JTAG 板的接口版本号。版本号将输出为两个十六进制字符。只要任何命令的格式或其输出发生变化,此版本就会更改。编写本文档时的界面版本为 01。 |
q | 查询 JTAG 板的固件版本号。版本号将输出为两个十六进制字符。此版本将在固件更改时随时更改。编写本文档时的固件版本为 02。 |
Vtxxyy | 设置 JTAG 板的 Timer0。由于JTAG时钟必须小于目标时钟的1/8,固件使用Timer0来控制JTAG时钟的速度。固件等待定时器溢出,然后再生成JTAG时钟的每个边沿。将“t”替换为用于计时器 T0M 位的值,将“xx”替换为用于 TH0 的值,将“yy”替换为用于 TL0 的值。所有值都应以十六进制格式输入。有关这些值用途的详细信息,请参阅《超高速闪存微控制器用户指南》。 |
Yrbbdd | 将值直接发送到 TAP。将“r”替换为要写入的 TAP 寄存器:0 表示 DR,1 表示 IR。“bb”是要写入的位数(不包括状态位),“dd”是要发送的数据。所有值都应以十六进制格式输入。 |
Z | 将固件切换到二进制传输。 |
z | 执行JTAG时钟的单个脉冲。 |
+ | 对JTAG板执行简单的硬件测试。CLK、TMS 和 TDI 引脚均被置位,TDO的状态被读取并输出为“0”或“1”。然后可以测量引脚上的电压,以确保它们正常工作。 |
对JTAG板执行简单的硬件测试。CLK、TMS 和 TDI 引脚均设置为逻辑低电平,TDO的状态被读取并输出为“0”或“1”。然后可以测量引脚上的电压,以确保它们正常工作。 |
如上述命令所示,MAXQ JTAG引擎有几种不同的模式:旁路模式、自举加载器模式、后台模式和调试模式。JTAG引擎在每种模式下的功能都不同。因此,除了上面列出的命令之外,当JTAG引擎进入这些不同的模式时,其他命令变得可用。
旁路模式
TAP在上电复位期间初始化为旁路模式。在这种模式下,TAP被禁用,并且不与MAXQ微控制器的其余部分交互。要激活 TAP,请输入此模式下可用的两个附加命令之一:“D”和“L”。“D”命令激活在线调试器,“L”命令激活引导加载程序。
引导加载程序模式
当使用“L”命令激活自举加载程序后,可以将字节直接发送到MAXQ的实用程序ROM。 以两个十六进制字符的形式输入每个值。(有关实用程序 ROM 接受的字节数的详细信息,请联系技术支持。)对于输入的每个字节,固件输出加载程序返回的字节和从TAP接收的状态位。输出的格式将为“00xx:ss”,其中“xx”是输出字节,“ss”是状态位。输入“退出加载器”命令(0x01)后,必须使用表1中列出的“J”命令之一来指示JTAG板,MAXQ不再处于自举加载器模式。
后台模式
在JTAG引擎的后台模式下,可以读写JTAG断点寄存器(BP0-BP5),读写在线调试寄存器(ICDC、ICDF、ICDA和ICDD),确定断点匹配何时发生,并手动调用调试模式。表 2 中列出了支持这些操作的命令。对于此模式下具有输出的所有命令,格式将为“xxyy:ss”,其中“xx”是输出数据的MSB,“yy”是LSB,“ss”是TAP返回的状态位。
Command | 描述 |
A | 阅读ICDA寄存器。 |
axxyy | 写入 ICDA 寄存器,其中“xx”是新值的 MSB,“yy”是新 LSB。值应以两个十六进制字符的形式输入。 |
Bi | 读取 6 个断点寄存器中的任何一个,其中“i”是要读取的断点寄存器的索引(0 到 5)。 |
bixxyy | 写入 6 个断点寄存器中的任何一个,其中“i”是要写入的断点寄存器的索引(0 到 5),“xx”是新值的 MSB,“yy”是 LSB。MSB 和 LSB 值应以两个十六进制字符的形式输入。 |
C | 阅读 ICDC 寄存器。 |
CXX | 写入 ICDC 寄存器,其中“xx”是新值。值应以两个十六进制字符的形式输入。 |
D | 阅读ICDD寄存器。 |
dxxyy | 写入 ICDD 寄存器,其中“xx”是新值的 MSB,“yy”是新 LSB。值应以两个十六进制字符的形式输入。 |
E | 进入调试模式。 |
F | 阅读ICDF寄存器。 |
N | 无操作。 |
调试模式
JTAG引擎可以通过两种方式进入调试模式。第一种方法是在后台模式下输入“进入调试模式”命令(“E”)。激活调试的第二种方式发生在断点匹配发生时。在这种情况下,您应该输入“JD”命令以通知固件模式已更改。一旦进入调试模式,就可以读写MAXQ寄存器,读取程序栈,读写数据存储器,单步操作MAXQ CPU,返回后台模式,并执行密码匹配以解锁某些命令。表 3 列出了支持此功能的命令。
Command | 描述 |
E | 退出调试模式,返回后台模式。 |
G | 获取所有寄存器。寄存器的顺序取决于MAXQ器件的类型。 |
Mxxyyiijj | 读取数据存储器,其中“xx”是要读取的单词地址的MSB,“yy”是地址的LSB,“ii”是要读取的字数的MSB,“jj”是长度的LSB。所有值都应输入为两个十六进制字符。 |
MXXYYIIJJ | 将一个单词写入数据存储器,其中“xx”是单词地址的MSB,“yy”是地址的LSB,“ii”是要写入的单词的MSB,“jj”是要写入的单词的LSB。所有值都应输入为两个十六进制字符。 |
n | 无操作。 |
Pxx1...xx32 | 尝试与给定数据进行密码匹配。所有 32 个值都应输入为两个十六进制字符。 |
R0iim | 读取寄存器,其中“ii”是寄存器的索引,“m”是寄存器的模块。索引应作为两个十六进制字符输入,模块应作为单个十六进制字符输入。 |
r0iimxxyy | 写一个寄存器,其中“ii”是寄存器的索引,“m”是寄存器的模块,“xx”是新值的MSB,“yy”是LSB。新值的索引和每个字节应输入为两个十六进制字符。模块应作为单个十六进制字符输入。 |
Sxxyyiijj | 读取程序栈,其中“xx”是要读取的单词地址的MSB,“yy”是地址的LSB,“ii”是要读取的字数的MSB,“jj”是长度的LSB。所有值都应输入为两个十六进制字符。 |
T | 在当前指令指针处执行指令。 |
注意:表 2 中列出的所有后台模式命令(“E”除外)也可以在调试模式下使用。 |
二进制传输
表 1、2 和 3 中描述的所有命令都易于手动输入,其输出也易于理解。然而,在许多情况下,会有软件控制JTAG板。由于ASCII命令不便于软件使用,并且在将结果转换回二进制数据时需要进行不必要的处理,因此JTAG固件还支持二进制传输。在二进制传输模式下,通过首先发送指示要发送的字节数的字节将数据发送到 TAP。然后,数据应随之而来。对于发送的每个数据字节,固件输出两个字节。返回的第一个字节是在传输过程中读取的状态位。第二个字节将保存传输过程中从TAP读取的值。在二进制模式下还可以发送特殊命令。表 4 中描述了这些命令。要发送这些特殊命令之一,请发送 0 作为长度字节。这将指示固件将收到的下一个字节视为特殊命令。对于这些特殊命令,将返回单个字节。通常,这只是命令的回显。
Command | 描述 |
0x00 | 退出二进制模式传输并返回到接受 ASCII 命令。 |
0x01 | 将 TAP 的 IR 寄存器设置为数据传输的目标。 |
0x02 | 将 TAP 的 DR 寄存器设置为数据传输的目标。 |
0x03 | 传输数据时仅发送每个字节的最低 3 位。 |
0x04 | 将RESET引脚设置为逻辑高电平。 |
0x05 | 将RESET引脚清除至逻辑低电平。 |
0x06 | 执行JTAG时钟的单个脉冲。 |
0x07 | 读取 TDO 引脚的状态。 |
0x08 | 传输数据时发送每个字节的所有 8 位。 |
0x09 | 将TMS引脚设置为逻辑高电平。 |
0x0A | 将TMS引脚清除至逻辑低电平。 |
0x0B | 将TDI引脚设置为逻辑高电平。 |
0x0C | 将TDI引脚清除至逻辑低电平。 |
0x0D | 设置 T0M 位。有关此位的详细信息,请参阅表 1 中描述的“V”命令。 |
0x0E | 清除 T0M 位。有关此位的详细信息,请参阅表 1 中描述的“V”命令。 |
0x11 | 使用收到的下一个字节作为 TL0 的值。此“下一个”字节不需要长度字节或用作特殊命令转义字符的“0”。有关TL0寄存器的更多信息,请参阅表1中描述的“V”命令。 |
0x12 | 使用收到的下一个字节作为 TH0 的值。此“下一个”字节不需要长度字节或用作特殊命令转义字符的“0”。有关 TH0 寄存器的更多信息,请参阅表 1 中描述的“V”命令。 |
检测错误
在 ASCII 传输模式和二进制传输模式下,发生的任何错误都由命令的输出指示。在 ASCII 模式下,错误将输出为“*ERR=xx*”,其中 xx 表示发生的错误类型。在二进制模式下,输出错误代码而不是命令 echo。有关可能的错误代码的说明,请参阅表 5。
错误代码 | 描述 |
0x80 | 命令无法识别或命令无效。 |
0x90 | 收到无效的十六进制字符。 |
0xA0 | 收到的输入不足。 |
0xB0 | 断点寄存器索引错误。 |
0xC? | 收到意外状态,在哪里?表示接收的状态位。 |
结论
使用本文所述的命令,串行转JTAG板可用于将代码加载到MAXQ处理器中,读写系统寄存器,读写存储器,以及利用在线调试器。此过程既可以通过使用二进制协议的主机软件自动执行,也可以与终端程序交互输入。为完全控制MAXQ系统所需的所有命令提供了构建模块。
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !