JTAG を介して Cortex-M3 ベースのマイクロコントローラー (LPC1769) と通信しようとしています。必要なハードウェアは既に用意されており、サンプル プログラムを動作させることができましたが、さらに先に進むには、この場合に使用できるデバイス固有の JTAG 命令を知る必要があります。Cortex-M3 テクニカル リファレンス マニュアル (リンク)の対応するセクションを読んだところ、デバイスが標準の CoreSight デバッグ ポートを使用していることがわかりました。特に、IDCODE命令でデバイスIDを読みたいです。一部のサイトでは、このデバイスの IDCODE は b0001 または b1110 であると示唆されていますが、どちらも機能していないようです。b0001 は、TAP がリセットされた後に IR から読み取った値であるため、私には可能性が高いようです。
また、使用している命令が正しく、デバイス ID レジスタを正しく読み取っていない可能性も考えました。FT232H チップを搭載した FTDI ケーブルを使用しています。使用しているアプリケーションは、MPSSE コマンドを使用した FTDI の AN129 サンプル コード (リンク) に基づいています。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 のすべての可能な値を試しましたが、どちらも成功しませんでした)。