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.
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:
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.
Krunal Desai