El host USB STM32 no regresará de la solicitud de restablecimiento

3

Nota: He editado esta pregunta de su contenido original desde que pude encontrar una causa / síntoma más profunda para el problema. Lo reescribí para centrarme en eso en su lugar.

Estoy usando una configuración bastante básica para el STM32F405 usando el sistema de configuración CubeMX.

Algo (un reloj, un ajuste ... algo) no está configurado correctamente, y no puedo decir cómo podría haberlo causado. Aunque podría ser un problema con el PCB que diseñé, parece poco probable que el código se ejecute y se corrija, y la interrupción de SysTick está avanzando el contador de tiempo muy bien.

He rastreado parte del problema hasta esta función

/* Reset after a PHY select and set Host mode */
USB_CoreReset(USBx)

Tiempo de espera, presumiblemente porque el núcleo nunca sale del restablecimiento (OTG_FS_GRSTCTL: CSRST == 1 siempre, después de configurarse en esa función. USB_CoreReset () intenta leer CSRST == 0 200,000 veces y, si falla, devuelve sin éxito).

  

Si desea generar este archivo y ver el resultado (o   adáptelo a su tablero), puede tomar este texto y pegarlo en   un archivo llamado "USB CSRST Problem.ioc". Nota: probablemente requerirá   Algunos ajustes para su tablero ya que tengo algunos pines asignados a   Salidas para una pantalla LCD.

He rastreado una discusión que describe síntomas similares , pero puedo confirmar que mi el código sí establece OTG_HS_GUSBCFG: PHYSEL correctamente (confirmó la configuración del bit 6 antes de que se realice el restablecimiento), y generalmente se adhiere al procedimiento de inicio recomendado como se describe en ese hilo.

Configuración de relojes:

    
pregunta Daniel

3 respuestas

5

Por lo tanto, aquí está la resolución.

@ElectronS era correcto, a veces debes asumir que no sabes nada con seguridad. Por ejemplo, sabía con certeza que mi oscilador externo de 24 MHz funcionaba bien porque todo el núcleo se estaba ejecutando, de acuerdo con el configurador de generación de códigos.

Bueno, al parecer, el STM32 no le permitirá seleccionar el oscilador externo si no se está ejecutando. O algo. No tengo una buena explicación.

Aquí está el núcleo del núcleo del problema: la hoja de datos ASDMB de Abracon.

Cuando dice

Loquesignificaes

Lo que podría escribirse con mayor precisión como \ $ \ overline {Standby} \ $ ...

tl; dr el oscilador Habilitar el pin fue bajado.

Gracias por todos los comentarios y por empujarme a desafiar mi pensamiento establecido que me atascó.

    
respondido por el Daniel
6

Dado que no cargó el cubemx completo y el código generado para el proyecto, no puedo intentar replicar por completo y encontrar el problema.

Pero intentaré señalarle algunas cosas que podrían no ayudar:

1- asegúrese de que las interrupciones globales que no se pueden enmascarar están habilitadas, además de la interrupción de USB OTG gloabl. En la ventana de configuración, ficha NVIC en proyecto cubemx.

2- asegúrese de estar usando el modo correcto, (usando RTOS o un proyecto independiente, porque el generador de código puede cambiar las cosas en el modo RTOS o usar DMA porque DMA generalmente considera la interrupción como un evento de solicitud). su problema podría estar en otro lugar que impida escribir en este registro, algo así como la secuencia de bloqueo utilizada para la asignación de E / S y periféricos.

3- Hay 2 cosas llamadas GINTMSK, un poco en el registro OTG_FS_GAHBCFG

yunregistrollamado:OTG_FS_GINTMSK

4-Seutilizalasecuenciadeprogramacióncorrecta:

5- Buscar en smt32cube directory / projects / stm32xx discovery / applications / En esta carpeta encontrará múltiples proyectos en aplicaciones USB dependiendo de su unidad, use estos códigos como iniciador y compare la inicialización con su código.

    
respondido por el ElectronS

Lea otras preguntas en las etiquetas