Programación de microcontroladores: JTAG, SPI, USB, ¡oh!


52

He notado que, con respecto a los microcontroladores, hay varias formas de programarlos. Estoy 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:


39

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

SPI significa Interfaz periférica en serie y es una forma para que los microcontroladores se comuniquen entre sí o con el mundo exterior. También se le llama 3 hilos a veces porque usa tres hilos para comunicarse. Para programar un chip, necesitará un programador especial que lea los comandos de 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 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 para que no siempre necesite un Arduino en sus proyectos.

Cuando SPI es "solo otro" protocolo serie, JTAG es un protocolo especialmente diseñado para programar y depurar microcontroladores. No todos los Atmel micro admiten JTAG, pero sí los que se usan en Arduino. El protocolo JTAG se puede usar para cosas interesantes como "emulación de 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 "gestor de arranque" usando SPI o JTAG. Una vez cargado con el gestor de arranque, el sistema será programable desde cualquier PC usando un convertidor USB-Serie. La desventaja es que el gestor de arranque ocupa algo de espacio de memoria y este método no le permite ver el estado del chip mientras se está ejecutando.


10
Si bien es exacto la idea de que un cargador de arranque en serie no está disponible en un nuevo ATMEGA (aunque sí lo está en muchos otros microcontroladores), la afirmación de que SPI o JTAG deben usarse es incorrecta. ATMEGA también admite un modo de programación en paralelo de alto voltaje, que tiene la capacidad de anular algunos ajustes de fusibles que harían que los métodos de programación en circuito más populares no funcionen. JTAG no fue diseñado para programar micros sino para probar placas de PC marcando valores dentro y fuera de los registros de pines IO. Extenderlo para programar o depurar funciones básicas fue un truco posterior.
Chris Stratton

SPI y en la programación del 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 mordió 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.
fest

30

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 describirlas aquí para que sus preguntas puedan responderse de manera rápida y eficiente. Perdóname si pierdo un método o si cometo un error.

MÉTODO 1: Programación en sistema (ISP)

Soportado por: La gran mayoría de los AVR (ver las publicaciones a continuación)
Programadores compatibles: AVRISP MKI / II, JTAG MKII, STK500, STK600, Dragon, clones AVRISP, Programadores AVR910, AVRONE

En System Programming es quizás el método más común para programar el 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 objetivo se esté ejecutando a una frecuencia alta y el programador lo admita) y es el método de elección para casi todos los aficionados a AVR. Hay muchos, muchos clones 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 dongle 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 objetivo se ejecute 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 la compatibilidad con dispositivos MKI y MKII
Programadores compatibles: JTAG-ICE, JTAG-ICE MKII, Dragon, clones JTAG-ICE, 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 admite.

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 el JTAG-ICE MKII, que admite el protocolo de depuración DebugWire más nuevo y más ampliamente compatible en todo el rango AVR, así como la programación a través del método ISP (ver arriba).

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

MÉTODO 3: DebugWire

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

Una vez más, DebugWire es una interfaz de depuración en lugar de una interfaz 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, por lo que es ideal para los dispositivos AVR de bajo número de pines.

MÉTODO 4: gestor de arranque

Compatible con: AVR más recientes
Programadores compatibles: N / A

De nuevo técnicamente no es un método de programación. Un gestor de arranque es un pequeño programa AVR que se encuentra en una sección reservada configurable por el usuario del flash regular. Los cargadores de arranque hacen uso de las funciones de auto-modificación flash disponibles en los AVR más nuevos para permitir que el AVR se programe solo 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., Flash de datos externo o tarjeta SD), sin embargo, el tipo de cargador de arranque más común 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 fusibles de los AVR.

Los cargadores de arranque están ampliamente disponibles en Internet para descargar, pero sufren un problema de "huevo y gallina"; En primer lugar, necesita otro tipo de programador enumerado aquí para programar en el gestor de arranque. Esto generalmente se resuelve mediante la construcción de un dongle de puerto paralelo simple (consulte la sección ISP) o mediante la compra de un AVR ya precargado con un gestor de arranque (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 paralela de alto voltaje es un método de programación que rara vez se utiliza, debido a la molestia que requiere configurar. 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 del objetivo / RESET se eleva al valor inusualmente alto de 12V que conecta el circuito interno de programación en paralelo. El pin / RESET es el único pin del AVR (en AVR compatibles con HVPP) que puede elevarse de forma segura a este nivel.

Puede hacer 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 AVR TINY (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: AVR XMEGA
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: AVR TINY 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 utiliza la línea / RESET del dispositivo como parte de la interfaz de comunicación, pero ahí termina la similitud. Como los pequeños AVR TINY carecen de un circuito de depuración en 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 necesita elevarse a + 12V para la programación cuando se establece el pin RSTDSB del dispositivo, actualmente solo es compatible con la nueva placa de programación STK600.

Sección de preguntas frecuentes de bonificación!

  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 (el que sea aplicable a su dispositivo) son los más ricos en funciones, ya que permiten la reparación de un AVR que tiene sus fusibles mal configurados. Sin embargo, esos métodos son difíciles de configurar, de ahí la razón por la que la mayoría de los usuarios utilizan ISP.

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

  3. ¿Entonces mi dongle es inútil?
    No. Todavía puede programar a través de un dongle casero 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 use un protocolo compatible con AVRStudio. Puede ser el simple protocolo "AVR910" (en desuso) o una implementación personalizada del protocolo utilizado por el STK500 / AVRISP. Tenga en cuenta que estos programadores requieren un microcontrolador en ellos, lo que lleva a una situación de captura 22. Esto se puede resolver haciendo que el AVR del programador esté preprogramado al momento de la compra con el firmware apropiado, o haciendo que el AVR esté preprogramado con un gestor de arranque.

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

  6. ¡Ayuda! ¡He jugado con los fusibles y he quitado mi AVR mientras uso 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. Esto solucionará cualquier configuración incorrecta, incluidas las relacionadas 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: mire a su alrededor 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ú "Programar 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 con 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 debe reproducirse en ningún sitio web que no sea AVRFreaks.net sin permiso previo explícito.

Reproducido con permiso previo explícito, por supuesto!


5

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 utiliza 2 cables sin importar la cantidad de chips, mientras que el 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.


2
Nunca he oído hablar de I2C se utiliza como interfaz de programación nativo de Flash en un microcontrolador, aunque no hay ninguna razón que no podría ser el punto de entrada a un gestor de arranque supongo ...
vicatcu

@vicatcu, solo lo estaba agregando como una interfaz muy común.
Kortuk

3

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

A medida que ingrese más, descubrirá que son los pines que la interfaz usa 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 simple en caso de que esto sea un problema es desconectar los sensores durante la programación.

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


2

Como menciona serial, se utilizan spi (2 hilos, 3 hilos?), Usb, jtag, swd, etc.

Sí, hay pros y contras. Jtag, por ejemplo, es para todos los casos que conozco integrados en el hardware, utilizados originalmente y principalmente 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 que no permita acceder al chip usando jtag (si arranca el software en flash eso reutiliza esos pines). Otra excepción es si el núcleo del procesador puede colgarse por un error en el software en la memoria flash y un núcleo colgado 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. Al menos en xmega parece que el pdi y el jtag externo se alimentan internamente en una interfaz pdi común. Entonces, los pdi pdi le dan acceso directo a esto en lugar de la sobrecarga de jtag. siempre y cuando esta interfaz funcione cuando el software en flash haya colgado el núcleo, esta sería la interfaz ideal para esta familia. El protocolo es publicado y 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 llamados 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 poner en paralelo y alimenta la lógica jtag normal. Esto tiene la desventaja de que ARM quiere mantenerlo semisecreto, y los depuradores de jtag de ARM son un problema real para usar de todos modos. 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 de flash de arranque, dependiendo de la forma en que se extraiga un pin o dos o tres, depende de qué flash arranque. Por lo tanto, puede iniciar desde el flash del usuario, o puede iniciar desde un flash que al menos desde la fábrica tenga un cargador de arranque basado en puerto serie, o uno que tenga un cargador de arranque basado en usb. Para cada proveedor, estas soluciones de software pueden variar y varían, el protocolo serie 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, ya que puede elegir personalizarlo para su producto, malo que sea posible para borrarlo accidentalmente y bloquear la parte, al menos para esa interfaz.

Las herramientas Jtag solían costar miles de dólares, ahora no lo hacen, 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 fábrica con openocd. Puede obtener un enlace j no comercial por $ 75- $ 80. Y luego están los multimillonarios que son rápidos, seguros pero que no valen el dinero en general. Los compras cuando eres una gran corporación con mucho efectivo que gastar y quieres pagar por el apoyo. 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 gratis 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,

Debería tener en su arsenal de depuración y desarrollo herramientas jtag cuando y donde sea asequible. sparkfun tiene usb basado en ftdi para placas serie y las partes de ftdi se pueden reutilizar en big bangers, puede usarlas para spi o i2c o pdi o jtag u otras interfaces. Lo ideal es obtener tableros hechos para el bus / parte que le interesa y usar el software gratuito / de código abierto que lo acompaña. También utiliza estas placas serie, idealmente con un suministro de 3.3V y 5V (aproximadamente $ 15 cada uno que usa para lillypads y arduino minis, etc.) para conectarse a puertos serie para los diversos micros que tienen algún tipo de protocolo serie. Me resulta más fácil escribir mi propio cargador basado en esos protocolos, especialmente como la gente 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, todos tienen pros y contras. Esté preparado para apoyar al menos a dos de ellos. usb y serial o usb y jtag o jtag y serial, etc. Simplemente coloque almohadillas o agujeros en la placa y no necesariamente se llene. Para su desarrollo personal o de laboratorio, tenga un conjunto completo de herramientas y esté preparado para cambiar de una a otra a medida que construye chips y tiene que recuperar placas o mientras desarrolla su propio cargador de arranque, firmware usb, etc.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.