哪里可以找到Cortex-M3的器件专用JTAG指令?

时间:2017-03-29 12:20:15

标签: arm cortex-m3 ftdi jtag

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

我还考虑过我使用的指令是正确的可能性,而我只是没有正确读取设备ID寄存器。我使用FTDI电缆和FT232H芯片,我使用的应用程序基于FTDI的AN129示例代码(link),使用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;
}

length参数设置为4,data参数设置为0x0X(我尝试了X的所有可能值,但都没有导致成功)

1 个答案:

答案 0 :(得分:0)

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