2 puntos por GN⁺ 2024-06-04 | 1 comentarios | Compartir por WhatsApp

Guía de desarrollo de dispositivos USB

Índice

  • Antecedentes
  • ¿Qué es USB?
  • Cables USB
    • Consideraciones sobre USB-C
    • Transmisión de datos mediante pares diferenciales
  • USB en la PCB
  • Las distintas velocidades de USB
    • Nota breve sobre la velocidad en la PCB
  • Capas de protocolo y software
    • Clases de dispositivos USB y cómo las usa el host
  • Crear un dispositivo de puerto serial
    • Microcontrolador STM32 y placa Nucleo
    • Configuración del puerto USB real
    • Escritura del software
    • Flasheo y ejecución
  • Conclusión

Antecedentes

  • Los dispositivos USB son útiles para ampliar las capacidades de una computadora.
  • El objetivo de este artículo es guiar el proceso de crear un dispositivo USB de principio a fin.

¿Qué es USB?

  • USB es un estándar industrial para el intercambio de datos y el suministro de energía.
  • USB es un bus serial, por lo que los bits se transmiten uno por uno.
  • USB va más allá de una simple especificación de conexión e incluye también un protocolo de comunicación.

Cables USB

  • Una conexión USB 2.0 tiene 4 cables principales:
    • Cable de +5V: suministra energía del host al dispositivo.
    • Cables D- y D+: transmiten 1 bit como un par diferencial.
    • Cable GND: actúa como tierra.

Consideraciones sobre USB-C

  • USB-C puede conectarse en ambos sentidos.
  • USB-C no indica la velocidad ni la versión.

Transmisión de datos mediante pares diferenciales

  • Un par diferencial usa dos cables para transmitir un bit.
  • Los pares diferenciales son ventajosos para eliminar el ruido de voltaje.

USB en la PCB

  • Al añadir un conector USB a la PCB, hay que mantener la misma longitud en el par diferencial.
  • Las pistas del par diferencial deben estar cerca entre sí.
  • Se debe mantener una impedancia específica.

Las distintas velocidades de USB

  • USB 2.0 puede funcionar en full speed (12 Mbit/s) y high speed (480 Mbit/s).
  • El host y el dispositivo negocian la velocidad al conectarse.

Nota breve sobre la velocidad en la PCB

  • En full speed, los requisitos de impedancia y longitud de pistas pueden ser menos estrictos.

Capas de protocolo y software

  • USB funciona como una red y tiene varios endpoints y configuraciones.
  • El host reconoce y usa los dispositivos USB mediante controladores.

Clases de dispositivos USB y cómo las usa el host

  • El sistema operativo reconoce varias clases de dispositivos USB.
  • Por ejemplo, dispositivos de almacenamiento masivo o dispositivos seriales.

Crear un dispositivo de puerto serial

  • Se crea un dispositivo USB simple de puerto serial.
  • Se usan un microcontrolador STM32 y una placa Nucleo.

Microcontrolador STM32 y placa Nucleo

  • Se usa la placa NUCLEO-F103RB.
  • La placa está compuesta por un programador y un microcontrolador.

Configuración del puerto USB real

  • Se configura el puerto USB y se ajusta el jumper para usar una fuente externa de 5V.
  • Los pines PA12 y PA11 se configuran como USB_DP y USB_DM.
  • Se conecta una resistencia pull-up de 1.5 kΩ al pin PA12.

Escritura del software

  • En STM32CubeIDE se configura el modo de dispositivo USB.
  • Se configura como dispositivo de puerto serial para que el host lo reconozca.
  • Se escribe código en la rutina CDC_Receive_FS para encender el LED.

Flasheo y ejecución

  • Se compila el código y se flashea la placa usando STM32CubeProgrammer.
  • Se conecta la placa a una fuente externa de 5V y se controla el LED mediante el puerto serial.

Conclusión

  • Se crea un dispositivo USB de puerto serial de principio a fin.
  • La gran cantidad de código boilerplate y la configuración basada en UI de STM32CubeIDE pueden resultar incómodas.
  • Usar un SoC basado en Linux puede ser un enfoque más limpio.

Opinión de GN⁺

  • Código boilerplate de STM32CubeIDE: se puede generar mucho código boilerplate, lo que puede dificultar la revisión del código.
  • Enfoque basado en Linux: usar un SoC con Linux permite APIs más estandarizadas y una separación de código más limpia.
  • Impedancia y longitud de pistas: para conexiones USB de alta velocidad, hay que prestar atención a la impedancia y la longitud de las pistas.
  • Ventajas del par diferencial: los pares diferenciales ayudan a eliminar el ruido de voltaje, lo que permite una transmisión de datos más estable.
  • Selección del microcontrolador: según el proyecto, es importante elegir el microcontrolador adecuado. Además de STM32, hay varias opciones disponibles.

1 comentarios

 
GN⁺ 2024-06-04
Comentarios de Hacker News
  • Opinión sobre el uso de microcontroladores ST: Es un buen artículo sobre el uso de USB, pero está muy enfocado en los microcontroladores ST. Últimamente, el ecosistema de ESP32 ofrece un enfoque de plug and play más sencillo. Para principiantes, usar ICs controladores USB básicos puede ser más adecuado que trabajar a alta velocidad.

  • Experiencia con pruebas de cumplimiento de USB: Hace mucho tiempo, cuando hice pruebas de cumplimiento de USB, hubo muchos problemas con la prueba de corriente de irrupción. Es fácil concentrarse en el diseño digital de alta velocidad, pero en las pruebas de cumplimiento los detalles pequeños importan.

  • Consejos sobre USB-C: Hay que conectar el pin CC a la resistencia adecuada. En USB 2.0, el enrutamiento diferencial y la impedancia no son un problema tan grande. Basta con hacer conexiones directas con longitudes similares.

  • Sugerencia de alternativas a STM32: Si soldar un procesador ARM resulta difícil, también vale la pena considerar usar un controlador pequeño o la biblioteca VUSB. Si prefieres la programación estilo Arduino, muchas placas pueden usarse fácilmente como dispositivos USB.

  • ESP32 y métodos baratos para hackear: Uso principalmente ESP32, pero también se puede reutilizar la placa controladora de un teclado USB desechado para crear un controlador personalizado barato y resistente.

  • Soporte para recepción de más de 64 bytes en STM32: Pregunta sobre cómo recibir tramas de más de 64 bytes. Hay dificultades porque la configuración que aparece en el manual de referencia no corresponde a registros generales.

  • Experiencia escribiendo código USB bare metal: Escribir código USB bare metal en un MCU es más complicado que SPI o I2C. Conviene aprovechar al máximo el software proporcionado por el proveedor. Para transferencias de alta velocidad, hay que usar transferencias bulk y revisar también los problemas del lado del host.

  • Creación de dispositivos USB virtuales: Se usa una Raspberry Pi para crear un dispositivo USB virtual y conectarlo a una PC. Se está usando para emular una cámara MTP y engañar al software.

  • Pregunta sobre placas de desarrollo con soporte para USB 3: Se busca prototipar un sink de monitor USB C, pero es difícil encontrar una placa con suficiente capacidad para recibir DisplayPort.

  • Costo de usar USB: USB no es gratis. Hay que pagar una tarifa única de $6,000 para obtener un Vendor ID.