Skip to main content
Associate
July 25, 2024
Solved

USBX, Detect cable disconnected.

  • July 25, 2024
  • 1 reply
  • 814 views

I am running the "Ux_Device_HID_CDC_ACM" example project on a NUCLEO-H563ZI board.

The example runs without issues, i can attach and remove the usb cable and the mouse connection appears and disappear.

The issue is that the USB-stack does not seem to detect that the usb-cable is removed. When I hit the button to move the mouse pointer when the cable is removed the mouse movements que up in the stack and when i attach the cable again the mouse pointer moves the queued movements. This also happen in VCP part of the example. Messages queue up and are transmitted when the cable is attached again.

This is not ok. My real system needs to know when the cable is removed so that actions do not queue up in the stack.

The actual cable disconnection is not the problem, i can think of several ways to detect this. 

 

The question:

How do I bring down the USB stack in a proper way so that messages are not queued up in the stack?

 

This topic has been closed for replies.
Best answer by FBL

Hi @Henrik76 

You can handle disconnection event in 

void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
{
 // Stop USB device
 USBD_Stop(&hUsbDeviceFS);
 // Deinitialize USB device
 USBD_DeInit(&hUsbDeviceFS);
}

Otherwise, you can use USBPD stack with no Power Delivery, under usbpd_dpm_core.c, callback reporting events on a specified port from CAD layer.

void USBPD_DPM_CADCallback(uint8_t PortNum, USBPD_CAD_EVENT State, CCxPin_TypeDef Cc)
{
#ifdef _TRACE
 USBPD_TRACE_Add(USBPD_TRACE_CADEVENT, PortNum, (uint8_t)State, NULL, 0);
#endif /* _TRACE */

 switch (State)
 {
#if defined(USBPDCORE_VPD)
 case USPPD_CAD_EVENT_VPD :
#endif /* USBPDCORE_VPD */
 case USBPD_CAD_EVENT_ATTEMC :
 case USBPD_CAD_EVENT_ATTACHED :
 {
 USBPD_DPM_UserCableDetection(PortNum, State);
 USBPD_DPM_Notification(PortNum, USBPD_NOTIFY_USBSTACK_START);
 break;
 }
 case USBPD_CAD_EVENT_DETACHED :
 case USBPD_CAD_EVENT_EMC :
 {
 USBPD_DPM_UserCableDetection(PortNum, State);
 USBPD_DPM_Notification(PortNum, USBPD_NOTIFY_USBSTACK_STOP);
 break;
 }
 default :
 /* nothing to do */
 break;
 }
}

 

1 reply

FBLBest answer
ST Technical Moderator
September 12, 2024

Hi @Henrik76 

You can handle disconnection event in 

void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
{
 // Stop USB device
 USBD_Stop(&hUsbDeviceFS);
 // Deinitialize USB device
 USBD_DeInit(&hUsbDeviceFS);
}

Otherwise, you can use USBPD stack with no Power Delivery, under usbpd_dpm_core.c, callback reporting events on a specified port from CAD layer.

void USBPD_DPM_CADCallback(uint8_t PortNum, USBPD_CAD_EVENT State, CCxPin_TypeDef Cc)
{
#ifdef _TRACE
 USBPD_TRACE_Add(USBPD_TRACE_CADEVENT, PortNum, (uint8_t)State, NULL, 0);
#endif /* _TRACE */

 switch (State)
 {
#if defined(USBPDCORE_VPD)
 case USPPD_CAD_EVENT_VPD :
#endif /* USBPDCORE_VPD */
 case USBPD_CAD_EVENT_ATTEMC :
 case USBPD_CAD_EVENT_ATTACHED :
 {
 USBPD_DPM_UserCableDetection(PortNum, State);
 USBPD_DPM_Notification(PortNum, USBPD_NOTIFY_USBSTACK_START);
 break;
 }
 case USBPD_CAD_EVENT_DETACHED :
 case USBPD_CAD_EVENT_EMC :
 {
 USBPD_DPM_UserCableDetection(PortNum, State);
 USBPD_DPM_Notification(PortNum, USBPD_NOTIFY_USBSTACK_STOP);
 break;
 }
 default :
 /* nothing to do */
 break;
 }
}

 

To give better visibility on the answered topics, please click on "Best answer" on the reply which solved your issue or answered your question.Best regards,FBL