Hay dos formas de añadir USB a un diseño: utilizando un circuito integrado de aplicación específica (ASIC) o seleccionando un microcontrolador con soporte de hardware USB. Cada enfoque tiene sus pros y sus contras.
Implementación de USB con un ASIC
Una forma sencilla de añadir USB a un diseño es utilizar un ASIC que gestione la comunicación USB internamente y emita los datos y señales deseados necesarios. Uno de los ASIC USB más comunes es un puente USB-UART, que es una interfaz (relativamente) transparente para mover datos desde un host USB a un sistema embebido. Con frecuencia, esto toma la forma de un puerto COM virtual en el host, que puede ser abierto por una aplicación de terminal serie para la comunicación bidireccional. A menudo, estos ASIC también incluyen otras funcionalidades, como USB-I2C, control de línea de E/S, muestreo analógico, etc. Estos dispositivos están listos para ser incorporados en un diseño, por lo que requieren un esfuerzo mínimo de implementación, lo que los hace perfectos para añadirlos en el último momento.

Sin embargo, existen algunas limitaciones en el uso de estos ASIC. Un defecto es que se trata de un enfoque único para todos. Si hay alguna funcionalidad que no se puede lograr con el ASIC, entonces este enfoque es inviable. Otro inconveniente son los componentes adicionales añadidos a la lista de materiales (BOM). Estas piezas requieren área de PCB y aumentan el coste del diseño.

Implementación de USB con un microcontrolador
Si se sabe que se necesitará comunicación USB antes de seleccionar un microcontrolador, una buena opción es considerar un dispositivo con periféricos de hardware USB abordo. Esto se puede encontrar en una amplia variedad de microcontroladores, desde dispositivos de 8 bits de alta eficiencia hasta dispositivos de 32 bits de alto rendimiento. La selección del microcontrolador adecuado depende de la aplicación.
Para aplicaciones sencillas, como teclados, ratones y convertidores USB-UART, los MCUs de 8 bits son una buena opción. Estos dispositivos ofrecen una combinación de tamaño pequeño, consumo de energía reducido, bajo coste y funcionamiento nativo de +5 V.
Para aplicaciones de cálculo intensivo se deben considerar los MCUs de 32 bits, que son más potentes y contienen más memoria disponible. Sin embargo, los MCUs de 32 bits pueden ser caros, grandes y tener un rango de voltaje operativo limitado. A continuación, se muestra una tabla comparativa de los pros y los contras de los diferentes enfoques.below.

implementacion usb sistemas embebidos 1
Figura 1: Tabla comparativa de los diferentes enfoques de implementación

Construyendo aplicaciones USB en AVR DU

Existe una gran variedad de microcontroladores con periféricos USB. Esta sección se centrará en la familia de microcontroladores AVR® DU, sucesora espiritual de la familia de microcontroladores XMEGA® D.
La familia AVR DU introduce varias mejoras con respecto a los dispositivos más antiguos. Por un lado, ya no necesita un cristal externo, lo que reduce el coste de la lista de materiales. La familia DU también contiene un regulador lineal de caída de tensión (LDO) integrado para los circuitos USB si el microcontrolador se alimenta a partir de 3,9 V o más. Por último, la familia AVR DU contiene la función de desactivación de la interfaz de programación y depuración (PDID), que bloquea permanentemente el dispositivo, evitando que el microcontrolador se lea, borre o programe de nuevo.
Los siguientes ejemplos son aplicaciones sencillas desarrolladas en la familia AVR DU. Estos ejemplos utilizan MPLAB® Code Configurator (MCC), una herramienta gratuita que configura y genera una API para los periféricos de hardware abordo con la biblioteca de pila USB incluida. La biblioteca es compatible de forma nativa con la clase de dispositivos de comunicaciones (CDC) y los dispositivos de interfaz humana (HID), como teclados y ratones.

 

implementacion usb sistemas embebidos
Figura 2: apertura del proyecto USB-SPI/I2C en MCC

Aplicación CDC: USB a SPI/I2C
Este ejemplo implementa un convertidor de USB a SPI/I2C que funciona sin un controlador personalizado. Esto se logra identificando el microcontrolador como un dispositivo de clase CDC genérico. La mayoría de los sistemas operativos tienen un controlador genérico para este tipo de comunicación, que permite al usuario enviar y recibir datos sin necesidad de instalar un controlador especial.
Para iniciar una operación en serie, el usuario envía una «frase» con un formato especial al microcontrolador. Los datos recibidos por el microcontrolador se analizan y se convierten (si es posible) en una operación de bus SPI o I2C. A continuación, el microcontrolador informa de los errores de comando, los errores de comunicación (solo I2C) o los datos leídos durante el intercambio. Para SPI, las «frases» tienen el siguiente formato:
spi eeprom/dac/usd <byte de datos a enviar>
Donde «eeprom», «dac» y «usd» se refieren a los componentes del Curiosity Nano Explorer utilizados en esta aplicación. El siguiente fragmento es un ejemplo de una «sentencia» del usuario para comunicarse con un dispositivo EEPROM (25CSM04) en la placa Explorer. Este comando lee el registro de identificación del chip de memoria.


spi eeprom 9F 00 00 00 00 00
> FF 29 CC 00 01 00

I2C tiene tres formatos similares, pero diferentes, para las «frases», ya que el bus I2C se comparte entre todos los dispositivos conectados.

i2c <address> r <número de bytes a leer>
i2c <address> w <bytes a escribir>
i2c <address> wr <register address byte> <número de bytes a leer>


Al igual que el SPI, una prueba rápida de esto es leer el ID del fabricante de un sensor, en este caso un sensor de temperatura MCP9808.


i2c 1c wr 06 02
> 00 54

Este ejemplo está disponible en Github.

Aplicación HID: teclado USB
Un ejemplo sencillo, pero fácilmente adaptable, de comunicación USB es implementar un teclado. Normalmente, cuando un teclado detecta que se pulsa una tecla, se envía un informe al host indicando la tecla o teclas que el usuario está pulsando. Cuando se suelta la tecla, se envía otro informe para indicar que el usuario ha soltado la tecla.
Este ejemplo se implementa de manera diferente. En lugar de informar de una sola tecla o botón como un teclado estándar, este ejemplo informa de entradas de varias teclas para una sola pulsación de botón para crear macros de funciones. Por ejemplo, al pulsar SW0 en el AVR64DU32 Curiosity Nano se envía un informe con las teclas «AVR DU» al ordenador principal. El LED del Curiosity Nano indica el estado de Bloq Mayús en el sistema principal.
Además del Curiosity Nano, también se conecta un 2x2 Click a través de la placa adaptadora Curiosity. Los botones se asignan a las macros: CTRL + C (copiar), CTRL + V (pegar), CTRL + Z (deshacer) y CTRL + X (cortar). También se puede conectar un botón externo opcional para enviar ALT + F4 al host. Este ejemplo está disponible en Github.

Conclusión
Aunque el USB es uno de los tipos de comunicación serie más complejos que se encuentran en los sistemas embebidos, su ubicuidad es un valor añadido significativo para los diseños. El USB puede añadirse fácilmente a un diseño utilizando un ASIC a costa de una lista de materiales más grande o, alternativamente, se podría seleccionar un microcontrolador con hardware USB abordo. A partir de ahí, tendrá que decidir si su diseño basado en microcontroladores requiere la potencia de un dispositivo de 32 bits o si un dispositivo de 8 bits más sencillo, pero más rentable, como la familia AVR DU, será suficiente para el diseño.

Sobre el autor:
Robert Perkel es ingeniero de aplicaciones de Microchip Technology. En este puesto, desarrolla contenido técnico como notas de aplicación, artículos y vídeos. También es responsable de analizar casos de uso de periféricos y del desarrollo de ejemplos de código y demostraciones. Perkel se graduó en Virginia Tech, donde obtuvo una licenciatura en ingeniería informática.

Más información