Código de ejemplo para leer la ID del dispositivo de MachXo2 con FTDI -JTAG

2

En mi proyecto, estoy trabajando en la programación de MachX02 con el maestro FTDI utilizando la funcionalidad JTAG. Estoy intentando leer el ID de dispositivo de MachX02, pero no funciona, aquí está mi código de ejemplo para leer el ID de dispositivo de 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);

Cuando me equivoqué no pude identificar, para MachX02 antes de enviar el código de operación del ID del dispositivo, ¿necesito enviar otro código de operación? Por favor ayude a superar este problema, gracias de antemano.

    
pregunta Maggyrock

1 respuesta

1

No estoy seguro de qué dispositivo MachXO2 está utilizando, pero extraje los archivos BSDL de un par de ellos al azar. El código de operación IDCODE parece ser '11100000', o 0xE0.

Tampoco estoy seguro de qué biblioteca FTDI está utilizando, pero supongo que está utilizando un FTDI FT2232H o similar que es capaz de actuar como un maestro JTAG a través de la funcionalidad MPSSE o similar.

Para leer el IDCODE, básicamente tienes que hacer lo siguiente:

  1. Restablecimiento de JTAG (poner la cadena en un estado conocido) - puede tener 5 TCK con TMS en alto
  2. Cargar IR 0xE0 (desplazamiento de IR de 8 bits)
  3. Realice un desplazamiento DR de 32 bits para leer el IDCODE.

Eso es todo lo que hay que hacer, no creo que la parte deba estar en ningún estado en particular para admitir la instrucción IDCODE. Posiblemente, una instrucción ISC (IEEE 1532) para leer el código de usuario de EE. UU., Pero también es poco probable: debería poder leer ambos con facilidad.

Busqué en Google la función que está utilizando (agregue más detalles a sus preguntas en el futuro) y creo que la está llamando incorrectamente, ya que parece que está escribiendo en un registro de datos. Yo pienso que quieres:

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);

Donde m_IRbuffer es un búfer de 1 byte de tamaño, y m_DRbuffer es de 4 bytes (32 bits), y m_numBytes puede ser un char de 1 byte de algún tipo. El primer comando debe cargar 0xE0 en el IR. El segundo debe cambiar en 32 bits de 0 al registro IDCODE DR, y debe recuperar el IDCODE en m_DRbuffer.

Como nota aparte, si tiene problemas con esta cantidad de trabajo de bajo nivel, sugeriría utilizar urjtag o una biblioteca de software similar para leer la información que necesita.

    
respondido por el Krunal Desai

Lea otras preguntas en las etiquetas