Tengo un MCU STM32f107 soldado en una placa personalizada. Me gustaría usar un periférico USB en modo CDC. Conecté los pines PA11 (D-), PA12 (D+) y GND directamente a un cable USB CDC que conduce a la computadora. El dispositivo es autoalimentado, por lo que no uso el pin VDD.
En STM32Cube creé un nuevo proyecto, configuré solo el dispositivo USB_OTG_FS y USB_DEVICE en la sección de middleware. También configuré el reloj de alta velocidad en la sección RCC para que el periférico USB tenga un reloj de 48 MHz.
Luego generé el esqueleto del programa y lo subí a la MCU. Desafortunadamente no funciona. Creo que el principal problema es que no hay voltaje en el pin D +, por lo que la computadora no puede reconocer un nuevo dispositivo. Cuando ejecuto la CDC_Transmit_FS
función, el procesador cae en falla Hard.
Lo más extraño es que cuando configuro la MCU STM32F429 en el kit Discovery de manera similar, el USB funciona de manera inmediata. Traté de diferenciar el código fuente, pero no encontré ninguna diferencia crucial (excepto que la MCU STMF4 usa USB OTG de alta velocidad en modo de velocidad máxima).
¿Alguien tiene alguna experiencia en el uso de USB con el esqueleto del programa STM32F107 y STM32CubeMX?
EDITAR: cuando ejecuto la MCU en el modo de cargador de arranque, la línea D + se tira a 3V3; por lo tanto, creo que la MCU realmente no necesita ningún pull-up externo (también la hoja de datos dice esto).
EDIT2: ¿Alguien sabe qué hace exactamente la opción Activar VBUS en CubeMX? Puedo entenderlo en el modo Host, pero ¿qué hace en el modo Solo dispositivo?
Aunque el dispositivo es autoalimentado, aún necesita conectar el Vbus del USB (pin 1) al OTG_FS_VBUS del microcontrolador (pin PA9).
Esto no es para proporcionar energía, sino para permitir que el microcontrolador sepa cuándo iniciar el subsistema USB.
Gracias por ambas respuestas, tienes razón. Para resumir, haré otra respuesta. Espero que alguien encuentre esto útil.
Si he dicho algo incorrecto, corrígeme en los comentarios.
Klasyc
Ese pull-up R en D+ (o D-) se usa para indicar la velocidad USB del dispositivo. Si bien el host puede detectar el dispositivo conectado mediante este pull-up, en su caso tiene un dispositivo USB (esclavo). Y dado que es autoalimentado, como respondió @bitsmack, detectará la conexión al monitorear VBUS e iniciará la operación USB.
Si configuró el periférico USB como función dual/OTG, también debe conectar el pin USB_OTG_xx_ID al pin ID/OTG en su conector micro-USB.
Para CDC, en CubeMX puedes configurar tu dispositivo como Device_Only, conecta VBUS (conector <-> MCU). Si utiliza un conector micro USB, conecte también los conectores ID/OTG <-> GND.
Una forma de registrar un nivel alto en el pin VBUS (PA9) en el software (o sin una conexión física), es desmarcar la casilla de verificación "Activar_VBUS" en CubeMx y hacer que PA9 sea una salida GPIO, con el nivel predeterminado alto. Esto funcionó para mí con un STM32F105 que tiene la misma pila USB_OTG_FS que el F107. CubeMx resaltará una advertencia, pero esto puede ignorarse. El dispositivo enumera como debería.
La detección VBUS es obligatoria para los dispositivos autoalimentados (esclavos). La especificación USB exige que un dispositivo no pueda suministrar energía a las líneas D en ausencia de VBUS. Un dispositivo autoalimentado debe desconectar la resistencia pull-up tan pronto como desaparezca VBUS.
Por ejemplo, un dispositivo autoalimentado puede estar conectado físicamente a una PC que está apagada. Como el dispositivo todavía tiene energía, envía energía a la línea D a menos que pueda detectar la ausencia de VBUS.
No estoy seguro de qué sucede si no cumple con este requisito. Supongo que su dispositivo puede funcionar bien con algunos hosts pero no con otros. O funciona la mayor parte del tiempo, pero a veces puede causar un comportamiento extraño del host. Lo mejor es seguir la especificación USB y no correr riesgos.
La detección de VBUS no es necesaria para los dispositivos alimentados por bus, ya que no hay riesgo de conducir líneas D cuando el VBUS no está. Cuando VBUS se haya ido, el dispositivo también estará apagado, obviamente.
El hardware OTG_FS de STM32 administra su resistencia pull-up interna automáticamente, si la detección VBUS está activada. El otro hardware USB_Device, que está presente en algunos otros microcontroladores STM32, no tiene esta función y necesita software adicional y pull-up externo.
chris stratton
bitsmack