STM32F105 - USB OTG - BusFault en 0x1fff7a10

0

Intento implementar un VCP en un STM32F105RB con el STM32_USB-Host-Device_Lib_V2.2.0

Pude compilar el Código con éxito.

Mi configuración de Hardwar es la siguiente:

Mini USB directamente (sin resistencias en serie) a D + y D- del STM32. + 3.3V a PA9 (para BusSensing)

Después de iniciar la depuración en atollic, el host detecta un nuevo dispositivo pero no aparece en el administrador de dispositivos.

Después de unos segundos, obtengo un BusFault en el STM. El BFARVALID está configurado y el BFAR es 0x1FFF 7A10

Esto es interesante, ya que el espacio de direcciones entre 0x0804 0000 - 0x1FFF AFFF está reservado.

Si reinicio el firmware 2-3 veces (NO el proceso de depuración, solo hago un reinicio por software y no un reinicio por hardware) y hago clic en ejecutar nuevamente, luego se detecta el VCP correctamente después de algunos intentos. Muestra un COM9 que no funciona y un COM10 que funciona en el administrador de dispositivos. Y ya no termina en la falla del bus.

¿Puede alguien ayudarme a resolver este problema?

Gracias

Se adjuntan los registros en BusFault y el desmontaje.

MAPA de memoria

Registros en BusFault

Desmontaje de la dirección RAM

Desmontaje de la dirección del SP

Registro de CFSR en BusFault

Registro de MMFAR en BusFault

Actualización:

Diseño: Diseño del Breakoutboard

Esquema: Esquema

Documentación: Enlace

Para VBUS-Sensing, he conectado PA9 con + 3.3V. Mi tarjeta se alimenta a través de USB. Entonces, tan pronto como conecto el cable USB, la placa obtiene su alimentación y tan pronto como 3.3V se activa, VBUS-Sense (PA9) también es alta.

    
pregunta C. Hediger

1 respuesta

2

Encontré el problema.

Estaba en el archivo: usbd_desc.h

me faltó definir el tablero correcto. Así que trató de obtener el ID de dispositivo de una dirección incorrecta. - > FALLA DE AUTOBUS

¿Cómo encontré el problema?

Miré el apilador en 0x2000fedc y vi la dirección 0x8004196 que era la siguiente sección de código c:

static void Get_SerialNum(void)
{
  uint32_t deviceserial0, deviceserial1, deviceserial2;

  deviceserial0 = *(uint32_t*)DEVICE_ID1;
  deviceserial1 = *(uint32_t*)DEVICE_ID2;
  deviceserial2 = *(uint32_t*)DEVICE_ID3;
  ...

Ahora me sumergí más y vi que DEVICE_ID1,2,3 apuntaba a una dirección incorrecta. Lo arreglé y ahora funciona!

    
respondido por el C. Hediger

Lea otras preguntas en las etiquetas