Beispielcode zum Lesen der Geräte-ID von MachXo2 mit FTDI -JTAG

In meinem Projekt arbeite ich an der MachX02-Programmierung mit FTDI-Master unter Verwendung der JTAG-Funktionalität. Ich versuche, die Geräte-ID von MachX02 zu lesen, funktioniert aber nicht. Hier ist mein Beispielcode zum Lesen der Geräte-ID von MachX02:

cmd_buffer[0] = 0xE0;
cmd_buffer[1] = (byte)((operand & 0xFF0000) >> 16);
cmd_buffer[2] = (byte)((operand & 0x00FF00) >> 8);
cmd_buffer[3] = (byte)(operand & 0x0000FF);

JTAG_WriteRead(fthandle, false, 32, cmd_buffer, 4, m_readbuffer, ref operand, RUN_TEST_IDLE_STATE);

Wo ich einen Fehler gemacht habe, konnte ich nicht identifizieren, für MachX02 muss ich vor dem Senden des Geräte-ID-Opcodes einen anderen Opcode senden? Bitte helfen Sie mit, dieses Problem zu lösen. Vielen Dank im Voraus.

Was ist der Fehler? Suchen Sie den IDCODE-Befehl für den MachXO2, verschieben Sie ihn in das IR und führen Sie dann eine 32-Bit-DR-Verschiebung durch, um ihn zu lesen.

Antworten (1)

Ich bin mir nicht sicher, welches MachXO2-Gerät Sie verwenden, aber ich habe die BSDL-Dateien von einigen von ihnen nach dem Zufallsprinzip gezogen. Der IDCODE-Opcode scheint „11100000“ oder 0xE0 zu sein.

Ich bin mir auch nicht sicher, welche FTDI-Bibliothek Sie verwenden, aber ich gehe davon aus, dass Sie einen FTDI FT2232H oder ähnliches verwenden, das über MPSSE-Funktionalität oder ähnliches als JTAG-Master fungieren kann.

Um den IDCODE auszulesen, müssen Sie grundsätzlich folgendes tun:

  1. JTAG Reset (Kette in bekannten Zustand bringen) – kann 5 TCKs sein, wobei TMS hoch gehalten wird
  2. Laden Sie IR 0xE0 (8-Bit-IR-Verschiebung)
  3. Führen Sie eine 32-Bit-DR-Verschiebung durch, um den IDCODE auszulesen.

Das ist alles, was dazu gehört - ich glaube nicht, dass das Teil in einem bestimmten Zustand sein muss, um die IDCODE-Anweisung zu unterstützen. Eine ISC (IEEE 1532)-Anweisung zum Lesen des USERCODE, möglicherweise, aber auch das ist unwahrscheinlich - Sie sollten in der Lage sein, beide mit Leichtigkeit zu lesen.

Ich habe die Funktion, die Sie verwenden, gegoogelt (bitte fügen Sie Ihren Fragen in Zukunft weitere Details hinzu), und ich denke, Sie rufen sie falsch auf, da Sie anscheinend in ein Datenregister schreiben. Ich denke du willst:

JTAG_WriteRead(fthandle, true, 8, 0xE0, 1, m_IRbuffer, m_numBytes, RUN_TEST_IDLE_STATE);
JTAG_WriteRead(fthandle, false, 32, 0x00000000, 4, m_DRbuffer, m_numBytes, RUN_TEST_IDLE_STATE);

Wobei m_IRbuffer ein Puffer der Größe 1 Byte ist und m_DRbuffer eine Größe von 4 Bytes (32 Bits) hat und m_numBytes ein 1-Byte-Zeichen eines beliebigen Typs sein kann. Der erste Befehl sollte 0xE0 in die IR laden. Der zweite sollte in 32 Bits von 0 in das IDCODE DR-Register verschoben werden, und Sie sollten den IDCODE in m_DRbuffer zurückerhalten.

Abgesehen davon, wenn Sie Probleme mit dieser Menge an Low-Level-Arbeit haben, würde ich vorschlagen, urjtag oder eine ähnliche Softwarebibliothek zu verwenden, um die benötigten Informationen zu lesen.

Vielen Dank für Ihre wertvolle Antwort ... jetzt kann ich die Geräte-ID abrufen [0xC6] gefolgt von 3 Bytes Operanden [08 00 00] .... Der Opcode-Befehl muss das IR-Register senden und bitte sagen Sie mir, welches Register gesendet werden soll Operanden [0E 00 00], während ich versuche, sowohl DR als auch IR zu senden. funktioniert nicht.