Debido a los problemas que surgen a la hora de programar dispositivos de lógica programable como las FPGA y los CPLD, he estado estudiando una forma de poder programarles el firmware de los proyectos del foro sin prácticamente complicaciones para aquellos dispositivos que disponen de interfaz JTAG.
Para ello solo es necesario un clon (R3) de Nano o de UNO, seis cables DuPont hembra-hembra y el programa
xsvfupld (que requiere instalar JRE (Java Run Time Enviroment)
(*)).
En la siguiente fotografía se puede observar la
Amstrad CPC 1MB RAM Expansion 0.00 conectada a un Nano mediante un
JTAG VaDeRetror! Programmer 1.01 (no es imprescindible bastarían los cables DuPont) con una CPLD XC9572XL nueva.
El programa
xsvfupld está escrito en Java y para ejecutarlo se requiere teclear en la línea de comandos (terminal):
donde
CPC1MBRAM.xsvf es el nombre del fichero (XSVF) a programar.
El interfaz del programa primero ofrece la posibilidad de escoger el puerto serie al que está conectado el módulo microcontrolador (Nano ó UNO), en mi caso es
/dev/ttyUSB0 que es el que aparece por defecto. A continuación al pulsar el botón "Program", el programa pasa por las siguientes etapas:
- Detección: Detecta que módulo microcontrolador está conectado (<20s),
- Validación: Verifica que hay comunicación con él, que la firma del microcontrolador (ATmega328P) es válida y comprueba si está instalado el firmware adecuado, (<10s)
- Programación del microcontrolador: Programa el módulo microcontrolador si éste es nuevo, no está programado o si no tiene el firmware apropiado, y por último (<20s),
- Actualización de la FPGA/CPLD (<50s según el tamaño del fichero XSVF).
En la ventana de comandos (terminal) se puede comprobar el registro de la ejecución de todas las operaciones anteriores.
Código: Seleccionar todo
May 04, 2024 4:06:35 PM com.sun.javafx.application.PlatformImpl startup
906 [DEBUG] Serial - Serial Port Names are [/dev/ttyS0, /dev/ttyS1, /dev/ttyUSB0]
3089 [DEBUG] DeviceProgrammerController - Uploading CPC1MBRAM.xsvf (53289 bytes)
3089 [DEBUG] DeviceProgrammerController - Starting arduino detection
3157 [DEBUG] stk500v2 - SERIAL PORT. Flushing
3413 [DEBUG] stk500v2 - SERIAL PORT. Flushing
3667 [DEBUG] stk500v2 - SERIAL PORT. Flushing
3919 [DEBUG] stk500v2 - SERIAL PORT. Flushing
4171 [DEBUG] stk500v2 - SERIAL PORT. Flushing
4422 [DEBUG] stk500v2 - SERIAL PORT. Flushing
4673 [DEBUG] stk500v2 - SERIAL PORT. Flushing
5010 [DEBUG] DeviceProgrammerController - Trying to sync with serial configuration SerialPortConfiguration{baudrate=115200, dataBits=8, stopBits=1, parity=0}
5011 [DEBUG] stk500v2 - DTR/RTS set low
5261 [DEBUG] stk500v2 - DTR/RTS set high
5311 [DEBUG] stk500v2 - SERIAL PORT. Flushing
5562 [DEBUG] stk500v2 - Starting SYNC attempt
5562 [DEBUG] stk500v2 - SERIAL PORT. Sending [0x30 0x20 ]
5562 [DEBUG] stk500v2 - SERIAL PORT. Flushing
6067 [DEBUG] stk500v2 - SERIAL PORT. Sending [0x30 0x20 ]
6067 [DEBUG] stk500v2 - SERIAL PORT. Flushing
6419 [DEBUG] stk500v2 - SERIAL PORT. Sending [0x30 0x20 ]
6421 [DEBUG] stk500v2 - SERIAL PORT. Received [0x14 ]
6421 [DEBUG] stk500v2 - SERIAL PORT. Received [0x10 ]
6422 [DEBUG] DeviceProgrammerController - Starting DEVICE update
8052 [DEBUG] XsvfUploader - [ 0%] Command{command='R', argument='XSVF'}
8052 [DEBUG] XsvfUploader - Got R command. Programming started
10755 [DEBUG] XsvfUploader - [ 1%] Command{command='S', argument='39'}
11379 [DEBUG] XsvfUploader - [ 2%] Command{command='S', argument='39'}
12019 [DEBUG] XsvfUploader - [ 3%] Command{command='S', argument='39'}
12658 [DEBUG] XsvfUploader - [ 4%] Command{command='S', argument='39'}
13282 [DEBUG] XsvfUploader - [ 5%] Command{command='S', argument='39'}
13922 [DEBUG] XsvfUploader - [ 6%] Command{command='S', argument='39'}
14562 [DEBUG] XsvfUploader - [ 7%] Command{command='S', argument='39'}
15186 [DEBUG] XsvfUploader - [ 8%] Command{command='S', argument='39'}
15825 [DEBUG] XsvfUploader - [ 9%] Command{command='S', argument='39'}
16465 [DEBUG] XsvfUploader - [ 10%] Command{command='S', argument='39'}
17089 [DEBUG] XsvfUploader - [ 11%] Command{command='S', argument='39'}
17729 [DEBUG] XsvfUploader - [ 12%] Command{command='S', argument='39'}
18368 [DEBUG] XsvfUploader - [ 13%] Command{command='S', argument='39'}
18992 [DEBUG] XsvfUploader - [ 14%] Command{command='S', argument='39'}
19632 [DEBUG] XsvfUploader - [ 15%] Command{command='S', argument='39'}
20272 [DEBUG] XsvfUploader - [ 16%] Command{command='S', argument='39'}
20895 [DEBUG] XsvfUploader - [ 17%] Command{command='S', argument='39'}
21535 [DEBUG] XsvfUploader - [ 18%] Command{command='S', argument='39'}
22159 [DEBUG] XsvfUploader - [ 19%] Command{command='S', argument='39'}
22799 [DEBUG] XsvfUploader - [ 20%] Command{command='S', argument='39'}
23439 [DEBUG] XsvfUploader - [ 21%] Command{command='S', argument='39'}
24062 [DEBUG] XsvfUploader - [ 22%] Command{command='S', argument='39'}
24702 [DEBUG] XsvfUploader - [ 23%] Command{command='S', argument='39'}
25342 [DEBUG] XsvfUploader - [ 24%] Command{command='S', argument='39'}
25966 [DEBUG] XsvfUploader - [ 25%] Command{command='S', argument='39'}
26605 [DEBUG] XsvfUploader - [ 26%] Command{command='S', argument='39'}
27245 [DEBUG] XsvfUploader - [ 27%] Command{command='S', argument='39'}
27869 [DEBUG] XsvfUploader - [ 28%] Command{command='S', argument='39'}
28509 [DEBUG] XsvfUploader - [ 29%] Command{command='S', argument='39'}
29149 [DEBUG] XsvfUploader - [ 30%] Command{command='S', argument='39'}
29772 [DEBUG] XsvfUploader - [ 31%] Command{command='S', argument='39'}
30412 [DEBUG] XsvfUploader - [ 32%] Command{command='S', argument='39'}
31052 [DEBUG] XsvfUploader - [ 33%] Command{command='S', argument='39'}
31676 [DEBUG] XsvfUploader - [ 34%] Command{command='S', argument='39'}
32315 [DEBUG] XsvfUploader - [ 35%] Command{command='S', argument='39'}
32955 [DEBUG] XsvfUploader - [ 36%] Command{command='S', argument='39'}
33579 [DEBUG] XsvfUploader - [ 37%] Command{command='S', argument='39'}
34219 [DEBUG] XsvfUploader - [ 38%] Command{command='S', argument='39'}
34858 [DEBUG] XsvfUploader - [ 39%] Command{command='S', argument='39'}
35482 [DEBUG] XsvfUploader - [ 40%] Command{command='S', argument='39'}
36122 [DEBUG] XsvfUploader - [ 41%] Command{command='S', argument='39'}
36762 [DEBUG] XsvfUploader - [ 42%] Command{command='S', argument='39'}
37386 [DEBUG] XsvfUploader - [ 43%] Command{command='S', argument='39'}
38025 [DEBUG] XsvfUploader - [ 44%] Command{command='S', argument='39'}
38665 [DEBUG] XsvfUploader - [ 45%] Command{command='S', argument='39'}
39289 [DEBUG] XsvfUploader - [ 46%] Command{command='S', argument='39'}
39929 [DEBUG] XsvfUploader - [ 47%] Command{command='S', argument='39'}
40569 [DEBUG] XsvfUploader - [ 48%] Command{command='S', argument='39'}
41192 [DEBUG] XsvfUploader - [ 49%] Command{command='S', argument='39'}
41832 [DEBUG] XsvfUploader - [ 50%] Command{command='S', argument='39'}
42472 [DEBUG] XsvfUploader - [ 51%] Command{command='S', argument='39'}
43096 [DEBUG] XsvfUploader - [ 52%] Command{command='S', argument='39'}
43735 [DEBUG] XsvfUploader - [ 53%] Command{command='S', argument='39'}
44375 [DEBUG] XsvfUploader - [ 54%] Command{command='S', argument='39'}
44791 [DEBUG] XsvfUploader - [ 55%] Command{command='S', argument='39'}
45015 [DEBUG] XsvfUploader - [ 56%] Command{command='S', argument='39'}
45239 [DEBUG] XsvfUploader - [ 57%] Command{command='S', argument='39'}
45447 [DEBUG] XsvfUploader - [ 58%] Command{command='S', argument='39'}
45671 [DEBUG] XsvfUploader - [ 59%] Command{command='S', argument='39'}
45895 [DEBUG] XsvfUploader - [ 60%] Command{command='S', argument='39'}
46103 [DEBUG] XsvfUploader - [ 61%] Command{command='S', argument='39'}
46326 [DEBUG] XsvfUploader - [ 62%] Command{command='S', argument='39'}
46550 [DEBUG] XsvfUploader - [ 63%] Command{command='S', argument='39'}
46758 [DEBUG] XsvfUploader - [ 64%] Command{command='S', argument='39'}
46982 [DEBUG] XsvfUploader - [ 65%] Command{command='S', argument='39'}
47206 [DEBUG] XsvfUploader - [ 66%] Command{command='S', argument='39'}
47414 [DEBUG] XsvfUploader - [ 67%] Command{command='S', argument='39'}
47638 [DEBUG] XsvfUploader - [ 68%] Command{command='S', argument='39'}
47862 [DEBUG] XsvfUploader - [ 69%] Command{command='S', argument='39'}
48070 [DEBUG] XsvfUploader - [ 70%] Command{command='S', argument='39'}
48294 [DEBUG] XsvfUploader - [ 71%] Command{command='S', argument='39'}
48518 [DEBUG] XsvfUploader - [ 72%] Command{command='S', argument='39'}
48726 [DEBUG] XsvfUploader - [ 73%] Command{command='S', argument='39'}
48950 [DEBUG] XsvfUploader - [ 74%] Command{command='S', argument='39'}
49174 [DEBUG] XsvfUploader - [ 75%] Command{command='S', argument='39'}
49382 [DEBUG] XsvfUploader - [ 76%] Command{command='S', argument='39'}
49605 [DEBUG] XsvfUploader - [ 77%] Command{command='S', argument='39'}
49829 [DEBUG] XsvfUploader - [ 78%] Command{command='S', argument='39'}
50037 [DEBUG] XsvfUploader - [ 79%] Command{command='S', argument='39'}
50261 [DEBUG] XsvfUploader - [ 80%] Command{command='S', argument='39'}
50485 [DEBUG] XsvfUploader - [ 81%] Command{command='S', argument='39'}
50693 [DEBUG] XsvfUploader - [ 82%] Command{command='S', argument='39'}
50917 [DEBUG] XsvfUploader - [ 83%] Command{command='S', argument='39'}
51141 [DEBUG] XsvfUploader - [ 84%] Command{command='S', argument='39'}
51349 [DEBUG] XsvfUploader - [ 85%] Command{command='S', argument='39'}
51573 [DEBUG] XsvfUploader - [ 86%] Command{command='S', argument='39'}
51797 [DEBUG] XsvfUploader - [ 87%] Command{command='S', argument='39'}
52005 [DEBUG] XsvfUploader - [ 88%] Command{command='S', argument='39'}
52229 [DEBUG] XsvfUploader - [ 89%] Command{command='S', argument='39'}
52453 [DEBUG] XsvfUploader - [ 90%] Command{command='S', argument='39'}
52660 [DEBUG] XsvfUploader - [ 91%] Command{command='S', argument='39'}
52884 [DEBUG] XsvfUploader - [ 92%] Command{command='S', argument='39'}
53108 [DEBUG] XsvfUploader - [ 93%] Command{command='S', argument='39'}
53316 [DEBUG] XsvfUploader - [ 94%] Command{command='S', argument='39'}
53540 [DEBUG] XsvfUploader - [ 95%] Command{command='S', argument='39'}
53764 [DEBUG] XsvfUploader - [ 96%] Command{command='S', argument='39'}
53972 [DEBUG] XsvfUploader - [ 97%] Command{command='S', argument='39'}
54196 [DEBUG] XsvfUploader - [ 98%] Command{command='S', argument='39'}
54420 [DEBUG] XsvfUploader - [ 99%] Command{command='S', argument='39'}
54654 [DEBUG] XsvfUploader - [100%] Command{command='S', argument='39'}
54654 [INFO] XsvfUploader - Important: ********
54654 [INFO] XsvfUploader - Important: Success!
54654 [INFO] XsvfUploader - Important: ********
54654 [INFO] XsvfUploader - Important: Last TDO: 00/1 bits
54654 [INFO] XsvfUploader - Important: Processed 3843 instructions.
54654 [INFO] XsvfUploader - Important: Checksum: 0xF2/53289.
54654 [INFO] XsvfUploader - Important: Sum: 0x000C2F0E/53289.
54654 [ERROR] XsvfUploader - Got error 0, No error
El firmware para el microcontrolador usa la librería JTAG de Marcelo Jiménez y la aplicación Java está basada en el código del generador de ROM de @overCLK del que toma prestado el interfaz y el controlador del puerto serie.
Aplicación
Descargar
(*) Si en un sistema Windows encontráis que aparece un error "fatal" de JavaFX, intentad instalar la versión de 32bits de Java.