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

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

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

¿Cuál es el error? Busque la instrucción IDCODE para MachXO2, transfiérala al IR y luego haga un cambio DR de 32 bits para leerla.

Respuestas (1)

No estoy seguro de qué dispositivo MachXO2 está utilizando, pero saqué 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á usando, pero supondré que está usando 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): pueden ser 5 TCK con TMS en alto
  2. Cargar IR 0xE0 (desplazamiento IR de 8 bits)
  3. Realice un cambio DR de 32 bits para leer el IDCODE.

Eso es todo: no creo que la pieza deba estar en ningún estado en particular para admitir la instrucción IDCODE. Una instrucción ISC (IEEE 1532) para leer el CÓDIGO DE USUARIO, posiblemente, 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 estar escribiendo en un registro de datos. Creo 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 tamaño 1 byte, y m_DRbuffer es de tamaño 4 bytes (32 bits), y m_numBytes puede ser un carácter 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.

Aparte, si tiene problemas con esta cantidad de trabajo de bajo nivel, le sugiero que use urjtag o una biblioteca de software similar para leer la información que necesita.

Gracias por su valiosa respuesta... ahora puedo obtener la identificación del dispositivo... Gracias una vez más... soy nuevo en esta comunicación JTAG... ahora para borrar Flash UFM y SRAM... tengo que enviar Habilitar configuración Offline Opcode [0xC6] seguido de operandos de 3 bytes [08 00 00].... El comando de código de operación necesita enviar un registro IR y, por favor, dígame qué registro enviar Operandos... De manera similar para Borrar, también el código de operación [0x0E] podría enviarse al registro IR y Operandos[0E 00 00] mientras trato de enviar tanto DR como IR... no funciona... proporcione un código de fragmento de cómo enviar operandos para borrar... Gracias de antemano.