STM32N6570-DK USBX (USB-C, USB1) Error Code 43 on PC
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.
* 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.:

