我正在尝试通过 JTAG 与基于 Cortex-M3 的微控制器 (LPC1769) 进行通信。我已经拥有所需的硬件,并且已经设法让示例程序工作,但要进一步发展,我需要知道在这种情况下可用的特定于设备的 JTAG 指令。我已阅读 Cortex-M3 技术参考手册的相应部分(链接,告诉我的只是该设备使用标准的 CoreSight 调试端口。特别是,我想用 IDCODE 指令读取设备 ID。一些网站建议,该设备的 IDCODE 可能是 b0001 或 b1110,但它们似乎都不起作用。b0001 对我来说似乎更有可能,因为这是我在 TAP 重置后从 IR 读取的值。
我还考虑了这种可能性,即我使用的指令是正确的,而我只是没有正确读取设备 ID 寄存器。我正在使用带有 FT232H 芯片的 FTDI 电缆,我使用的应用程序基于 FTDI 的 AN129 示例代码(链接),使用 MPSSE 命令。我使用 0x2A 命令从 TAP 输入数据,使用 0x1B 命令将数据输出到 TAP,并使用 0x3B 命令同时执行这两项操作。如果有人可以提供一些见解,关于我做错了什么(或者我是否使用了正确的 IDCODE 指令),那将不胜感激。
*编辑:我取得了一些进展,但我仍然无法找到 IDCODE 指令。在将 TAP 控制器设置为 Test-Logic-Reset 状态(在 IR 中加载 IDCODE 指令)后,我设法读取了设备 ID。然而,我尝试了所有可能的 (16) 指令,虽然其中一些导致从 DR 读取不同,但没有一个加载设备 ID 寄存器。
这是我用来插入指令的函数,一旦 TAP 控制器处于 Shift-IR 状态:
int clockOut(FT_HANDLE* ftHandle, BYTE data, BYTE length)
{
FT_STATUS ftStatus = FT_OK;
BYTE byOutputBuffer[1024]; // Buffer to hold MPSSE commands and data to be sent to the FT232H
DWORD dwNumBytesToSend = 0; // Index to the output buffer
DWORD dwNumBytesSent = 0; // Count of actual bytes sent - used with FT_Write
byOutputBuffer[dwNumBytesToSend++] = 0x1B;
// Clock data out through Shift-DR
byOutputBuffer[dwNumBytesToSend++] = length - 1;
// Number of clock pulses = (length - 1) + 1; This way, the length given as the parameter of the function is the actual number of clock pulses.
byOutputBuffer[dwNumBytesToSend++] = data;
// Shift out data
ftStatus = FT_Write(*ftHandle, byOutputBuffer, dwNumBytesToSend, &dwNumBytesSent);
// Send off the TMS command
return ftStatus;
}
长度参数设置为4,数据参数设置为0x0X(我尝试了X的所有可能值,都没有成功)