USB en STM32F107RCT y Stm32CubeMX

2

Tengo MCU STM32f107 soldada 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 que conduce a la computadora. El dispositivo es autoalimentado, por lo tanto 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. Lamentablemente 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 función CDC_Transmit_FS , el procesador cae en la falla dura.

Lo más extraño es que cuando configuro la MCU STM32F429 en el kit Discovery de la misma manera, el USB funciona de manera inmediata. Intenté cambiar el código fuente, pero no he encontrado ninguna diferencia crucial (excepto que el MCU STMF4 usa USB de alta velocidad OTG 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 lleva a 3V3, por lo que creo que la MCU no necesita ningún pull-up externo (también lo dice la hoja de datos)

EDIT2: ¿Alguien sabe qué opción Activar VBUS en CubeMX hace exactamente? Puedo entenderlo en el modo Host, pero ¿qué hace en el modo solo dispositivo?

    
pregunta klasyc

3 respuestas

1

Gracias por las dos respuestas, tienes razón. Para resumir, haré otra respuesta. Espero que alguien encuentre esto útil.

  • La conexión USB requiere GND, D + y D- líneas. VBUS se usa solo para cable USB detección.
  • La detección VBUS se puede desactivar al menos en algunas MCU. En este caso, el cable VUSB. no es necesario.
  • Cuando habilitas el periférico USB OTG en CubeMX, no se enciende el VBUS incluso si es necesario (a menos que marque la casilla de verificación Activar VBUS ).
  • No puedo decir qué hace la opción Activar VBUS en el modo Dispositivo. Lo intenté Generar fuentes con y sin esta opción y ambos proyectos. se requiere la línea VBUS para que el USB funcione.
  • Cuando generas código desde CubeMX (estoy usando HAL versión 1.31) con USB CDC en el modo Dispositivo, el código generado realmente funciona tanto en stm32f1 como en stm32f4 núcleos fuera de la caja. Incluso si no implementas controladores de envío / recepción, el MCU aún se reconoce como VCP.
  • Quería deshabilitar la detección de VBUS en STM32F107 escribiendo cero en VBUSBSEN bit en el registro GCCFG, pero no tuve éxito o el valor se ha sobrescrito
    por la biblioteca usb (la biblioteca es bastante complicada, por lo que no sé dónde exactamente poner la asignación de registro). También es interesante que reference el manual en la página 926, sección 28.17.3 dice que en el modo Dispositivo, la detección VBUS debe estar activada.
  • El MCU STM32F107 no requiere ninguna resistencia de extracción para que el USB funcione.

Si he declarado algo incorrecto, corríjame en los comentarios.

Klasyc

    
respondido por el klasyc
3

Aunque el dispositivo es autoalimentado, aún necesita conectar el Vbus del USB (pin 1) al OTG_FS_VBUS (pin PA9) del microcontrolador

Esto no es para proporcionar energía, sino para permitir que el microcontrolador sepa cuándo iniciar el subsistema USB.

    
respondido por el bitsmack
0

Ese pull-up R en D + (o D-) se usa para indicar la velocidad USB del dispositivo. Mientras que el host puede detectar el dispositivo conectado con este pull-up, en su caso tiene un dispositivo USB (esclavo). Y dado que se autoalimenta, como @bitsmack respondió, detectará la conexión al monitorear VBUS e iniciará la operación del USB.

Si configuró el periférico USB como doble rol / OTG, también debe conectar el pin USB_OTG_xx_ID al pin ID / OTG en su conector micro-USB.

Para CDC, en CubeMX puede configurar su dispositivo como Device_Only, conecte VBUS (conector < - > MCU). Si usa un conector micro USB, también conecte los conectores ID / OTG < - > GND.

    
respondido por el Flanker

Lea otras preguntas en las etiquetas