2025-09-14 6:22 PM
Hello,
I'm trying to implement USB communication with a PC using USB1 (USB-C port) on an STM32N6570-DK with CubeMX. Most tutorials I've found on USBX are for older CubeMX versions and boards, so I'm a bit stuck.
When I connect the board to my PC, I only get Error Code 43 in Device Manager. Here's what I've done so far:
Enabled PA4 as shown in this diagram:
void MX_USB1_OTG_HS_PCD_Init(void)
{
/* USER CODE BEGIN USB1_OTG_HS_Init 0 */
/* USER CODE END USB1_OTG_HS_Init 0 */
/* USER CODE BEGIN USB1_OTG_HS_Init 1 */
memset(&hpcd_USB_OTG_HS1, 0x0, sizeof(PCD_HandleTypeDef));
/* USER CODE END USB1_OTG_HS_Init 1 */
hpcd_USB_OTG_HS1.Instance = USB1_OTG_HS;
hpcd_USB_OTG_HS1.Init.dev_endpoints = 9;
hpcd_USB_OTG_HS1.Init.speed = PCD_SPEED_HIGH;
hpcd_USB_OTG_HS1.Init.phy_itface = USB_OTG_HS_EMBEDDED_PHY;
hpcd_USB_OTG_HS1.Init.Sof_enable = DISABLE;
hpcd_USB_OTG_HS1.Init.low_power_enable = DISABLE;
hpcd_USB_OTG_HS1.Init.lpm_enable = DISABLE;
hpcd_USB_OTG_HS1.Init.use_dedicated_ep1 = DISABLE;
hpcd_USB_OTG_HS1.Init.vbus_sensing_enable = DISABLE;
hpcd_USB_OTG_HS1.Init.dma_enable = DISABLE;
if (HAL_PCD_Init(&hpcd_USB_OTG_HS1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USB1_OTG_HS_Init 2 */
/* USER CODE END USB1_OTG_HS_Init 2 */
}
UINT MX_USBX_Device_Init(VOID *memory_ptr)
{
UINT ret = UX_SUCCESS;
UCHAR *pointer;
TX_BYTE_POOL *byte_pool = (TX_BYTE_POOL*)memory_ptr;
/* USER CODE BEGIN MX_USBX_Device_Init 0 */
/* USER CODE END MX_USBX_Device_Init 0 */
/* Initialize the Stack USB Device*/
if (MX_USBX_Device_Stack_Init() != UX_SUCCESS)
{
/* USER CODE BEGIN MAIN_INITIALIZE_STACK_ERROR */
return UX_ERROR;
/* USER CODE END MAIN_INITIALIZE_STACK_ERROR */
}
/* USER CODE BEGIN MX_USBX_Device_Init 1 */
/* USER CODE END MX_USBX_Device_Init 1 */
/* Allocate the stack for device application main thread */
if (tx_byte_allocate(byte_pool, (VOID **) &pointer, UX_DEVICE_APP_THREAD_STACK_SIZE,
TX_NO_WAIT) != TX_SUCCESS)
{
/* USER CODE BEGIN MAIN_THREAD_ALLOCATE_STACK_ERROR */
return TX_POOL_ERROR;
/* USER CODE END MAIN_THREAD_ALLOCATE_STACK_ERROR */
}
/* Create the device application main thread */
if (tx_thread_create(&ux_device_app_thread, UX_DEVICE_APP_THREAD_NAME, app_ux_device_thread_entry,
0, pointer, UX_DEVICE_APP_THREAD_STACK_SIZE, UX_DEVICE_APP_THREAD_PRIO,
UX_DEVICE_APP_THREAD_PREEMPTION_THRESHOLD, UX_DEVICE_APP_THREAD_TIME_SLICE,
UX_DEVICE_APP_THREAD_START_OPTION) != TX_SUCCESS)
{
/* USER CODE BEGIN MAIN_THREAD_CREATE_ERROR */
return TX_THREAD_ERROR;
/* USER CODE END MAIN_THREAD_CREATE_ERROR */
}
/* USER CODE BEGIN MX_USBX_Device_Init 2 */
/* USER CODE END MX_USBX_Device_Init 2 */
return ret;
}
/**
* @brief Application USBX Device Initialization.
* @PAram None
* @retval ret
*/
UINT MX_USBX_Device_Stack_Init(void)
{
UINT ret = UX_SUCCESS;
UCHAR *device_framework_high_speed;
UCHAR *device_framework_full_speed;
ULONG device_framework_hs_length;
ULONG device_framework_fs_length;
ULONG string_framework_length;
ULONG language_id_framework_length;
UCHAR *string_framework;
UCHAR *language_id_framework;
/* USER CODE BEGIN MX_USBX_Device_Stack_Init 0 */
HAL_PWREx_EnableVddUSB();
/* USER CODE END MX_USBX_Device_Stack_Init 0 */
/* Get Device Framework High Speed and get the length */
device_framework_high_speed = USBD_Get_Device_Framework_Speed(USBD_HIGH_SPEED,
&device_framework_hs_length);
/* Get Device Framework Full Speed and get the length */
device_framework_full_speed = USBD_Get_Device_Framework_Speed(USBD_FULL_SPEED,
&device_framework_fs_length);
/* Get String Framework and get the length */
string_framework = USBD_Get_String_Framework(&string_framework_length);
/* Get Language Id Framework and get the length */
language_id_framework = USBD_Get_Language_Id_Framework(&language_id_framework_length);
/* Install the device portion of USBX */
if (ux_device_stack_initialize(device_framework_high_speed,
device_framework_hs_length,
device_framework_full_speed,
device_framework_fs_length,
string_framework,
string_framework_length,
language_id_framework,
language_id_framework_length,
USBD_ChangeFunction) != UX_SUCCESS)
{
/* USER CODE BEGIN USBX_DEVICE_INITIALIZE_ERROR */
return UX_ERROR;
/* USER CODE END USBX_DEVICE_INITIALIZE_ERROR */
}
/* Initialize the cdc acm class parameters for the device */
cdc_acm_parameter.ux_slave_class_cdc_acm_instance_activate = USBD_CDC_ACM_Activate;
cdc_acm_parameter.ux_slave_class_cdc_acm_instance_deactivate = USBD_CDC_ACM_Deactivate;
cdc_acm_parameter.ux_slave_class_cdc_acm_parameter_change = USBD_CDC_ACM_ParameterChange;
/* USER CODE BEGIN CDC_ACM_PARAMETER */
/* USER CODE END CDC_ACM_PARAMETER */
/* Get cdc acm configuration number */
cdc_acm_configuration_number = USBD_Get_Configuration_Number(CLASS_TYPE_CDC_ACM, 0);
/* Find cdc acm interface number */
cdc_acm_interface_number = USBD_Get_Interface_Number(CLASS_TYPE_CDC_ACM, 0);
/* Initialize the device cdc acm class */
if (ux_device_stack_class_register(_ux_system_slave_class_cdc_acm_name,
ux_device_class_cdc_acm_entry,
cdc_acm_configuration_number,
cdc_acm_interface_number,
&cdc_acm_parameter) != UX_SUCCESS)
{
/* USER CODE BEGIN USBX_DEVICE_CDC_ACM_REGISTER_ERROR */
return UX_ERROR;
/* USER CODE END USBX_DEVICE_CDC_ACM_REGISTER_ERROR */
}
/* Initialize and link controller HAL driver */
ux_dcd_stm32_initialize((ULONG)USB1_OTG_HS, (ULONG)&hpcd_USB_OTG_HS1);
/* USER CODE BEGIN MX_USBX_Device_Stack_Init_PostTreatment */
/* Set Rx FIFO */
HAL_PCDEx_SetRxFiFo(&hpcd_USB_OTG_HS1, 0x200);
/* Set Tx FIFO 0 */
HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_HS1, 0, 0x40);
/* Set Tx FIFO 1 */
HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_HS1, 1, 0x100);
/* USER CODE END MX_USBX_Device_Stack_Init_PostTreatment */
/* USER CODE BEGIN MX_USBX_Device_Stack_Init 1 */
HAL_PCD_Start(&hpcd_USB_OTG_HS1);
/* USER CODE END MX_USBX_Device_Stack_Init 1 */
return ret;
}
Device should show up in Windows Device Manager as:
Instead, I get this:
Changed clock configuration to 48 MHz.:
2025-09-14 7:20 PM
The status in Device Manager says "Device descriptor request failed".
VID 0000 and PID 0002 are not related to your device descriptors, this just means that the host cannot read the descriptors. A hardware USB sniffer would be helpful to understand why.
2025-09-14 7:59 PM
Incomplete configuration.