Programación de microcontroladores: JTAG, SPI, USB ¡Dios mío!?

He notado que, con respecto a los microcontroladores, hay varias formas de programarlos. Estoy algo familiarizado con USB ya que mi Arduino se puede programar a través de USB.

¿Qué es una interfaz JTAG o SPI?

En última instancia, sé que estas interfaces proporcionan un medio para actualizar el chip con nuevas instrucciones, pero ¿en qué se diferencian? ¿Hay alguna ventaja de uno sobre otro?

Respuestas (5)

Los microcontroladores ATMEGA como el del arduino que vienen directamente de fábrica solo se pueden programar usando la interfaz SPI o JTAG.

SPI son las siglas de Serial Peripheral Interface y es una forma en que los microcontroladores se comunican entre sí o con el mundo exterior. A veces también se le llama 3 hilos porque utiliza tres hilos para comunicarse. Para programar un chip, necesitará un programador especial que lea los comandos del USB para controlar las líneas SPI para programar el chip. Uno popular parece ser el USBTinyISP de Adafruit . Una muy buena introducción a la programación SPI está en SparkFun. Las aplicaciones más populares para programar chips Atmel AVR son avrdude (línea cmd), ponyprog (no funciona con los programadores más nuevos) y, en algunos casos, AVR Studio (si su programador lo admite). La ventaja de la programación SPI es que puede programar cualquier chip Atmel directamente de fábrica, por lo que no siempre necesitará un Arduino en sus proyectos.

Donde SPI es "solo otro" protocolo serial, JTAG es un protocolo que está especialmente diseñado para programar y depurar microcontroladores. No todos los micro Atmel son compatibles con JTAG, pero los que se utilizan en Arduino sí. El protocolo JTAG se puede usar para cosas geniales como "emulación en circuito" y depuración, lo que significa que le permite ver el estado del programa en su microcontrolador mientras se está ejecutando. Para hacer esto necesitarás un programador especial. Visto mi respuesta para otra pregunta .

Para programar un chip usando USB, primero deberá programarlo con un "cargador de arranque" usando SPI o JTAG. Una vez cargado con el cargador de arranque, el sistema será programable desde cualquier PC usando un convertidor USB-Serie. La desventaja es que el cargador de arranque ocupa algo de espacio en la memoria y este método no le permite ver el estado del chip mientras se está ejecutando.

Si bien es cierto que la idea de que un cargador de arranque en serie no está disponible en un ATMEGA nuevo (aunque sí lo está en muchos otros microcontroladores), la afirmación de que se debe usar SPI o JTAG es incorrecta. Los ATMEGA también admiten un modo de programación en paralelo de alto voltaje, que tiene la capacidad de anular algunas configuraciones de fusibles que harían inviables los métodos de programación en circuito más populares. JTAG no fue diseñado para programar micros sino para probar placas de PC ingresando y sacando valores de registros de pines IO. Extenderlo para programar o depurar funciones principales fue un truco posterior.
SPI y Programación en el sistema / Programación en serie son diferentes. Yo también estaba acostumbrado al hecho de que muchos de los MCU Atmega más pequeños tenían pines de programación en serie en la interfaz SPI, pero me molestó el hecho de que en algunos de los MCU Atmega más grandes, los pines de programación en serie no estaban en la interfaz SPI.

Si bien me encantaría sumergirme en los diversos métodos de programación disponibles, alguien más ya lo ha hecho. Aquí está el tutorial de Dean Camera sobre AVRFreaks, métodos de programación AVR :

Hay muchas formas de programar microcontroladores AVR. Dado que muchas personas preguntan sobre diferentes en un momento u otro, pensé en resumirlas aquí para que sus preguntas puedan responderse de manera rápida y eficiente. Por favor, perdóname si pierdo un método o cometo un error.

MÉTODO 1: En Programación del Sistema (ISP)

Compatible con: la gran mayoría de los AVR (consulte las publicaciones a continuación)
Programadores compatibles: AVRISP MKI/II, JTAG MKII, STK500, STK600, Dragon, clones de AVRISP, programadores AVR910, AVRONE

En la Programación del Sistema es quizás el método más común de programación del flash, EEPROM, fusible y lockbytes de toda la línea AVR. El ISP puede programar AVR a frecuencias de reloj extremadamente altas (suponiendo que el AVR de destino esté funcionando a una frecuencia alta y el programador lo admita) y es el método elegido por casi todos los aficionados a AVR. Hay muchos, muchos clones de AVRISP y programadores AVR910 en el mercado, además de simples dongles de bricolaje que se conectan al puerto paralelo de su computadora.

Los nuevos diseños de dongles recientes pueden usar el puerto serie de la computadora, sin embargo, la evidencia anecdótica ha dicho que este método es extremadamente lento debido a limitaciones técnicas.

El ISP requiere que el AVR de destino esté funcionando a una velocidad de reloj de al menos cuatro veces la del reloj del ISP. Esta es una trampa común y una fuente de confusión para muchos nuevos en AVR.

MÉTODO 2: JTAG

Compatible con: Consulte la ayuda de AVRStudio Tools para compatibilidad con dispositivos MKI y MKII
Programadores compatibles: JTAG-ICE, JTAG-ICE MKII, Dragon, JTAG-ICE clones, AVRONE, STK600 (solo programación)

Técnicamente, JTAG es un sistema de depuración, no un método de programación. Aún así, la interfaz JTAG permite la programación de un AVR que lo admita.

JTAG es una herramienta de depuración en el sistema que le permite manipular y examinar el estado de un AVR compatible mientras se ejecuta en un circuito. JTAG permite al usuario detener la ejecución en cualquier momento, la manipulación de los registros internos del AVR y mucho más.

Las unidades JTAG-ICE oficiales de ATMEL han sido reemplazadas por JTAG-ICE MKII, que es compatible con el protocolo de depuración DebugWire más nuevo y más ampliamente compatible en toda la gama AVR, así como con la programación a través del método ISP (ver arriba).

Los clones de JTAG-ICE están disponibles a bajo precio, sin embargo, su compatibilidad limitada con solo un puñado de AVR limita su utilidad. Independientemente de esto, si su AVR es compatible con la interfaz JTAG, JTAG-ICE sigue siendo un programador y un método de depuración muy bueno y efectivo.

MÉTODO 3: DebugWire

Compatible con: Muchos AVR más pequeños
Programadores compatibles: JTAG-ICE MKII, Dragon, AVRONE

Nuevamente, DebugWire es una interfaz de depuración en lugar de programación, pero se puede usar para cargar programas en AVR compatibles. La interfaz dW utiliza un solo pin AVR (la línea /RESET) para todas las comunicaciones, lo que la hace ideal para los dispositivos AVR de bajo número de pines.

MÉTODO 4: Cargador de arranque

Compatible con: la mayoría de los AVR más nuevos
Programadores compatibles: N/D

Nuevamente, técnicamente no es un método de programación. Un cargador de arranque es un pequeño programa AVR que se encuentra en una sección reservada configurable por el usuario del flash normal. Los cargadores de arranque hacen uso de las funciones de automodificación flash disponibles en los AVR más nuevos para permitir que el AVR se programe a sí mismo a través de los datos del programa cargados desde una fuente externa. Los cargadores de arranque pueden obtener sus datos desde cualquier ubicación (p. ej., memoria flash de datos externa o tarjeta SD); sin embargo, el tipo más común de cargador de arranque se comunica con una PC a través del puerto RS-232 (serie) del AVR.

Los cargadores de arranque están limitados porque consumen espacio flash (lo que limita el tamaño del flash disponible para la aplicación del AVR) y no pueden cambiar los fusebits del AVR.

Los cargadores de arranque están ampliamente disponibles en Internet para su descarga, pero sufren un problema de "huevo y gallina"; necesita otro tipo de programador enumerado aquí para programar en el gestor de arranque en primer lugar. Esto generalmente se soluciona con la construcción de un dongle de puerto paralelo simple (consulte la sección ISP) o con la compra de un AVR que ya tiene un cargador de arranque precargado (por ejemplo, la placa AVRButterfly).

MÉTODO 5: Programación en paralelo de alto voltaje (HVPP)

Compatible con: la mayoría de los AVR que no son TINY (con excepciones)
Programadores compatibles: STK500, STK600, Dragon, Homebrew Dongles, AVRONE

La Programación en Paralelo de Alto Voltaje es un método de programación que rara vez se usa, debido a la molestia que requiere configurarlo. A pesar de esto, la programación HVPP se usa comúnmente para "resucitar" AVR cuyos fusibles se han configurado incorrectamente a través de otro método de programación.

Tanto el STK500 como el Dragon son compatibles con HVPP. Durante HVPP, el pin /RESET del objetivo se eleva al valor inusualmente alto de 12V, lo que activa el circuito de programación paralelo interno. El pin /RESET es el único pin del AVR (en AVR compatibles con HVPP) que se puede elevar de forma segura a este nivel.

Puede crear su propio dongle HVPP utilizando planes en línea como este.

MÉTODO 6: Programación en serie de alto voltaje (HVSP)

Compatible con: Muchos TINY AVR (con excepciones)
Programadores compatibles: STK500, STK600, Dragon, Homebrew Dongles, AVRONE

HVSP es similar a HVPP, excepto que la transferencia de datos se realiza en serie en lugar de en paralelo. Este es el método de programación alternativo utilizado en muchos AVR de la serie TINY que carecen de suficientes pines para HVPP.

MÉTODO 7: PDI

Compatible con: XMEGA AVR
Programadores compatibles: STK600, AVRONE, JTAG MKII, Dragon, AVRISP MKII

PDI es la nueva interfaz de programación basada en el protocolo debugWire, para la línea XMEGA de AVR. Actualmente no se usa en ningún otro microcontrolador AVR de 8 bits.

MÉTODO 8: TPI

Compatible con: TINY AVR de 6 pines (ATTINY10, etc.)
Programadores compatibles: STK600, Dragon, AVRISP MKII

TPI es una interfaz de programación muy pequeña para la nueva línea TINY de AVR con pines limitados, como el ATTINY10 de 6 pines. Al igual que dW, TPI usa la línea /RESET del dispositivo como parte de la interfaz de comunicación, pero ahí termina la similitud. Dado que los TINY AVR del tamaño de una pinta carecen de un circuito de depuración en el chip, el protocolo TPI utiliza una nueva interfaz de programación de tres pines, en un protocolo semidúplex. Debido a que la línea /RESET debe elevarse a +12 V para la programación cuando se establece el pin RSTDSB del dispositivo, actualmente solo es compatible con la placa de programación STK600 más nueva.

¡Sección de preguntas frecuentes adicional!

  1. ¿Cuál es el mejor método?
    No existe un "mejor" método universal. La programación de ISP es simple y extremadamente popular, sin embargo, todos los métodos anteriores funcionarán. Los dos modos de programación de alto voltaje (cualquiera que sea aplicable a su dispositivo) son los más ricos en funciones, ya que permiten reparar un AVR al que se le han desconfigurado los fusibles. Sin embargo, esos métodos son difíciles de configurar, por lo que la mayoría de los usuarios optan por el ISP.

  2. He hecho un dongle de puerto paralelo. ¿Puedo usarlo con AVRStudio?
    Me temo que no. AVRStudio no puede interactuar con ningún dongle "tonto"; requiere un dispositivo de programación inteligente, que contiene un microcontrolador, para descifrar el protocolo de comunicación que envía. Los dongles simples sin un microcontrolador deben ser "bit-banged" (es decir, las señales apropiadas simuladas a través del dongle a través de la computadora) en sí mismos.

  3. ¿Entonces mi dongle es inútil?
    No. Todavía puede programar a través de un dongle hecho en casa con una herramienta de software de programación de terceros. AVRDude es una utilidad de línea de comandos buena, conocida y gratuita, y viene incluida con el paquete WinAVR.

  4. ¿Cuáles son mis opciones si quiero que mi programador trabaje con AVRStudio?
    Elija un programador que utilice un protocolo compatible con AVRStudio. Puede ser el protocolo simple "AVR910" (obsoleto) o una implementación personalizada del protocolo utilizado por STK500/AVRISP. Tenga en cuenta que estos programadores requieren un microcontrolador en ellos, lo que lleva a una situación catch-22. Esto puede solucionarse preprogramando el AVR del programador en el momento de la compra con el firmware apropiado, o preprogramando el AVR con un gestor de arranque.

  5. Ok, quiero usar un gestor de arranque. ¡¿Cómo lo consigo allí en primer lugar?!
    Para usar un cargador de arranque en un AVR, primero debe tener el cargador de arranque programado. Si no tiene un programador existente (incluso un simple dongle tonto será suficiente para la programación inicial), alternativamente puede comprar AVR preprogramados con un gestor de arranque de varios proveedores.
    Atmel también fabrica la placa de demostración Butterfly, cuyo MEGA169 AVR viene precargado con un gestor de arranque compatible con AVR-Studio.

  6. ¡Ayudar! ¡Me metí con los fusibles y destrocé mi AVR mientras usaba el ISP! El error más común es cambiar los fusibles de selección de reloj a una configuración no válida. Intente poner un reloj externo en el pin XTAL1 del AVR y vea si eso ayuda.
    De lo contrario, si es posible, utilice uno de los métodos de alto voltaje. Estos solucionarán cualquier error de configuración, incluidos los relacionados con la fuente del reloj, ya que los métodos de alto voltaje proporcionan su propio reloj al AVR para la programación.

  7. ¿Cómo interactúo con mi programador?
    El software que utilice para interactuar con su programador depende del tipo de programador que esté utilizando.
    Los dongles "tontos" simples requieren software de terceros, como PonyProg o AVRDude. Estas pueden ser herramientas de línea de comandos o GUI: busque en la web y encontrará una que se ajuste a sus necesidades.
    Los programadores y cargadores de arranque basados ​​en el protocolo AVR910 se pueden usar dentro de AVRStudio. En el menú Herramientas, seleccione la opción "AVRProg" para abrir una pantalla GUI para interactuar con su programador. Como alternativa, las herramientas de terceros como AVRDude también son compatibles con AVR910.
    Las herramientas oficiales están estrechamente integradas en AVRStudio, especialmente en el caso de las variantes de depuración (JTAG/Dragon/etc). En el menú Herramientas de AVRStudio, seleccione el submenú "Programa AVR..." y haga clic en el elemento "Conectar". Desde la nueva ventana, seleccione su herramienta y su interfaz de conexión y haga clic en Aceptar.
    Como es el caso de los dongles tontos y los programadores AVR910, las herramientas oficiales también se pueden usar con software de programación de terceros.

(C) Dean Camera, 2009. Todos los derechos reservados. No para la reproducción en ningún sitio web que no sea AVRFreaks.net sin permiso explícito previo.

Reproducido con permiso explícito previo, ¡por supuesto!

Me gustaría agregar una cosa más a la discusión.

SPI es una interfaz muy común para chips. La alusión a 3 hilos es el modo de SPI en el que no utiliza el pin de selección del chip.

I2C es el principal concurso para la interfaz, ya que solo usa 2 cables sin importar la cantidad de chips, mientras que SPI requiere otro cable por interfaz, pero es más lento.

Cuando enseño, considero que enseñar sobre interfaces es una de las tareas más importantes.

Wiki de la comunidad disponible para aquellos que quieran ampliar mi información.

Nunca escuché que I2C se use como una interfaz de programación flash nativa en un microcontrolador, aunque supongo que no hay razón para que no pueda ser el punto de entrada a un cargador de arranque ...
@vicatcu, solo lo estaba agregando como una interfaz muy común.

Desde un punto de vista general, estas interfaces solo difieren en qué programadores y qué microcontroladores las soportan. Siempre que tenga una coincidencia entre el programador y el microcontrolador, no me preocuparía.

A medida que profundice más, descubrirá que son los pines que usa la interfaz en el microcontrolador los que importan más: si está usando estos pines para sensores, las señales pueden interferir cuando está programando el dispositivo. La solución más sencilla en caso de que esto suponga un problema es desconectar los sensores durante la programación.

Algunas interfaces (incluida JTAG) permiten depurar el dispositivo, pero luego necesita un programador (y software para controlarlo) que también admita esto. En una pregunta anterior, me señalaron el Dragon para depurar dispositivos AVR: tengo la intención de obtener uno y jugar cuando mi ronda actual de proyectos esté cerca de completarse.

Como mencionas, se utilizan serial, spi (¿2 cables, 3 cables?), USB, jtag, swd, etc.

Sí, hay pros y contras. Jtag, por ejemplo, es para todos los casos que conozco integrados en el hardware, original y principalmente utilizado para algo más que la depuración del procesador, pero también lo usan para eso. si jtag está disponible, generalmente es la mejor interfaz por ese motivo, pero hay excepciones. Por ejemplo, si los pines no están dedicados a jtag, podría tener un error en el código y/o usar intencionalmente uno de esos pines para otra cosa, haciendo que no sea posible acceder al chip usando jtag (si arranca el software en flash que reutiliza esos pines). Otra excepción es si el núcleo del procesador se puede bloquear debido a un error en el software en la memoria flash y un núcleo bloqueado no se puede depurar a través de jtag. Yo llamaría a eso un error en el diseño del hardware, pero recientemente he tratado esto en una parte comercial.

En el AVR, por ejemplo, el PDI, que creo que la gente podría estar llamando spi aquí, tal vez no. parece al menos en el xmega que el pdi y el jtag externo se alimentan internamente a una interfaz pdi común. Entonces, los pines pdi le brindan acceso directo a esto en lugar de la sobrecarga jtag. siempre que esta interfaz funcione cuando el software en flash haya colgado el núcleo, entonces esta sería la interfaz ideal para esta familia. El protocolo está publicado y es relativamente simple, y está integrado en el hardware. tiene la desventaja de un bus de datos bidireccional, como i2c.

Arm tiene un jtag con menos cables llamado swd que no necesariamente quieren publicar abiertamente. Sin embargo, las herramientas de código abierto lo están implementando. esto es, en teoría, un jtag en serie, las diferentes señales jtag se envían secuencialmente en un cable de alguna manera en lugar de en paralelo en muchos cables. dentro de la parte, supongo que se vuelve a paralelizar y alimenta la lógica jtag normal. Esto tiene la desventaja de que ARM quiere mantenerlo en un semisecreto, y los depuradores jtag de ARM son un dolor real para usar de todos modos. Así que esto es mucho trabajo. Si/cuando openocd lo hace funcionar, entonces puede ser una historia diferente. También debe preocuparse por los pines reutilizados y lo que sucede con un núcleo colgado.

Varios proveedores usan una solución en la que tienen una o más áreas flash de arranque, dependiendo de la forma en que se extraiga un pin o dos o tres, depende de qué flash arranque. Entonces, puede iniciar desde el flash del usuario, o puede iniciar desde un flash que al menos de fábrica tiene un cargador de arranque basado en puerto serie, o uno que tiene un cargador de arranque basado en usb. Para cada proveedor, estas soluciones de software pueden variar y varían, el protocolo serial cambia de manera sutil o más que sutil, la solución usb puede cambiar bastante. Lo bueno y lo malo es que puede obtener algunos de estos flashes, por lo que puede elegir cambiar el cargador de arranque en serie, esto es bueno y malo, bueno porque puede elegir personalizarlo para su producto, malo que es posible para borrarlo accidentalmente y bloquear la parte, al menos bloquearla para esa interfaz.

Las herramientas Jtag solían costar miles de dólares, ahora no, por alrededor de $15 puede obtener una placa de conexión ftdi y reutilizarla con openocd. Por $ 50 más o menos, puede obtener una solución usb basada en ftdi que funciona de manera inmediata con openocd. Puede obtener un j-link no comercial por $ 75- $ 80. Y luego están los multimillonarios que son rápidos, seguros pero que no valen la pena en general. Los compras cuando eres una gran corporación con mucho dinero para gastar y quieres pagar por el soporte. Cuando paga esos precios, obtiene el producto que desea y obtiene respuestas a las preguntas de soporte técnico de inmediato. Al igual que Linux gratuito frente a Windows o RHEL, por ejemplo, el soporte de Linux es gratuito, pero obtienes lo que obtienes. De todos modos, esto hace que jtag sea mucho más atractivo,

Debe tener en su arsenal de depuración y desarrollo herramientas jtag cuando y donde sea asequible. sparkfun tiene usb basado en ftdi a placas seriales y las partes de ftdi se pueden reutilizar en big bangers, puede usarlas para spi o i2c o pdi o jtag u otras interfaces. Idealmente, obtenga tableros que estén hechos para el bus/parte que le interesa y use el software gratuito/de código abierto que lo acompaña. También usando estas placas seriales, idealmente con un suministro de 3.3V y 5V (alrededor de $ 15 cada uno que usa para lillypads y arduino minis, etc.) para conectarse a puertos seriales para los diversos micros que tienen algún tipo de protocolo serial. Me resulta más fácil escribir mi propio cargador basado en esos protocolos, especialmente como la gente de arduino/avr donde se publica la fuente del cargador de arranque y es un subconjunto considerable del supuesto estándar que admiten. YMMV.

En resumen, no hay una buena solución, todas tienen pros y contras. Esté preparado para apoyar al menos a dos de ellos. usb y serie o usb y jtag o jtag y serie, etc. Simplemente coloque las almohadillas o los orificios para alfileres en el tablero y no necesariamente llene. Para su desarrollo personal o de laboratorio, tenga un conjunto completo de herramientas y prepárese para cambiar de una a otra a medida que construye chips y tiene que recuperar placas o mientras desarrolla su propio gestor de arranque, firmware USB, etc.