6 votos

STM32 USB: detección de conexión y desconexión

Utilizando el ejemplo del controlador de almacenamiento masivo USB STM32F4 en modo dispositivo, ¿cómo se detectan las conexiones y desconexiones con un controlador host?

Traté de sondear el estado del pin VBUS sin embargo, podría ser alta de un adaptador de pared o de alta sin ningún tipo de comunicación con el host.

¿Hay algún registro para comprobarlo? Me fijé en DSTS (status supongo) en los structs de la librería USB pero no pude encontrar su documentación ni ningún comentario útil en el código.

0 votos

Lleve esta pregunta al foro de STM, envíe un correo electrónico a su servicio técnico. ¿Se trata de un PCB personalizado con STM32 en él, o un descubrimiento / otra tarjeta de desarrollo?

0 votos

Ver la actividad del bus USB sería una pista fuerte.

5voto

Tim Puntos 209

A partir de este archivo se puede detectar la conexión y desconexión:

usbd_core.c

y su API es la siguiente

USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef  *pdev)
USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef  *pdev)

No estoy seguro de la clase de almacenamiento masivo USB, pero en la clase CDC, las 2 API anteriores detectan la conexión y desconexión USB, tal vez esto ayude

Cosas a tener en cuenta:

  • Conexión > cuando el físico El cable USB está tapado en el puerto USB
  • Desconexión > cuando el físico El cable USB está desenchufado desde el puerto USB

Utilicé STMCubeMX para generar la clase USB CDC.

0 votos

usbd_core.c tiene USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev) { return USBD_OK; } ...¿Cómo funciona esto?

0 votos

OP está preguntando cómo detectar la conexión, no qué hacer después de detectarla.

0 votos

Esta parece la respuesta correcta, pero AFAICS ese código sólo está activo si USB es OTG.

1voto

Иван Puntos 1
void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)
{
  /* Inform USB library that core enters in suspend Mode. */
  USBD_LL_Suspend((USBD_HandleTypeDef*)hpcd->pData);
......

en usbd_conf.c

Llamadas de función al desconectar el cable usb

(probado en un dispositivo de almacenamiento masivo, CubeMX)

1voto

Work Puntos 43

Para la gente que quiere usar las partes de "Código de Usuario" hechas por CubeMX, Este callback es llamado cuando el USB es conectado al sistema.

void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd)

Y ésta se llama cuando se desconecta el USB del sistema.

void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)

Ambas funciones están dentro de usbd_conf.c

0voto

dennisobrien Puntos 151

La mejor manera de que encaje en la pila de software de ST es implementar estas funciones:

void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd);
void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd);

Se declaran con un enlace débil en la pila de la HAL, por lo que sus implementaciones anularán los stubs de no hacer nada de la HAL.

Sin embargo, si utiliza Cube, encontrará estos elementos ya implementados en usbd_conf.c y por razones desconocidas no hay /* USER CODE BEGIN */ en estas funciones para que el cubo sobrescriba tu código la próxima vez que lo guardes. Hasta que ST arregle esto usted tiene que no usar Cube (yo lo uso para arrancar un proyecto y luego dejar de usarlo y tomar el control) o puede modificar la plantilla de Cube para este archivo.

En el [CUBE-INSTALL-DIR]/db/templates localice el directorio usbdconf_XX.ftl para su MCU. Por ejemplo, para el f4 será usbdconf_f4_c.ftl . Ahora edite ese archivo para incluir USER CODE BEGIN y USER CODE END bloques de comentarios. La próxima vez que generes código fuente tendrás una sección donde colocar tu código.

0voto

NocTurn Puntos 111

Estoy usando STM32F767ZI y se enfrentan a la misma cuestión de no detectar USB como puerto virtual com así que he añadido pila Heap mínimo 2000 y el tamaño máximo de 4000 heap y ¡boom! Empezó a trabajar.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X