我在哪里可以找到 Cortex-M3 的设备特定 JTAG 指令?

Where can I find the device specific JTAG instructions for Cortex-M3?

我正在尝试通过 JTAG 与基于 Cortex-M3 的微控制器 (LPC1769) 通信。我已经拥有所需的硬件,并且已经设法让示例程序运行,但为了进一步推进,我需要知道在这种情况下可用的特定于设备的 JTAG 指令。我已经阅读了 Cortex-M3 技术参考手册的相应部分 (link),所有内容告诉我的是该设备使用标准的 CoreSight 调试端口。特别是,我想用 IDCODE 指令读取设备 ID。一些网站建议,该设备的 IDCODE 可能是 b0001 或 b1110,但它们似乎都不起作用。 b0001 对我来说似乎更有可能,因为这是我在重置 TAP 后从 IR 读取的值。

我还考虑了这样一种可能性,即我使用的指令是正确的,只是我没有正确读取设备 ID 寄存器。我正在使用带有 FT232H 芯片的 FTDI 电缆,我正在使用的应用程序基于 FTDI 的 AN129 示例代码 (link),使用 MPSSE 命令。我使用 0x2A 命令将数据从 TAP 同步输入,使用 0x1B 命令将数据同步输出到 TAP,并使用 0x3B 命令同时执行这两项操作。如果有人可以就我做错了什么(或者我是否使用了正确的 IDCODE 指令)提供一些见解,我们将不胜感激。

*编辑: 我取得了一些进展,但 IDCODE 指令仍然让我望而却步。在将 TAP 控制器设置为测试逻辑重置状态(在 IR 中加载 IDCODE 指令)后,我设法读取了设备 ID。但是,我尝试了所有可能的 (16) 条指令,虽然其中一些导致了从 DR 的不同读取,none 加载了设备 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 的所有可能值,均未成功)

我设法让它工作了。问题是,当我向 IR 发送 4 位时,它实际上收到了 5 位。传输完成后,TCK 的下一个上升沿本应更改 TAP 控制器的状态,但由于它仍处于Shift-IR 状态,它不仅改变了状态,而且还对 TDI 进行了采样,并进行了另一个(第五次)移位。为了取消这个,我只移动了指令的低 3 位,然后使用 0x4B MPSSE 命令,同时输出 TMS 信号(改变状态),并发出命令的 MSB。