我试图通过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的所有可能值,但都没有导致成功)
答案 0 :(得分:0)
我设法让它发挥作用。问题是,当我向IR发送4位时,它实际上收到了5.完成传输后,TCK的下一个上升沿应该改变TAP控制器的状态,但因为它仍然在Shift-IR状态,它不仅改变了状态,还对TDI进行了采样,并进行了另一次(第五次)移位。为了解决这个问题,我只移动了指令的低3位,然后使用0x4B MPSSE命令同时输出TMS信号(改变状态),然后发出命令的MSB。