cancel
Showing results for 
Search instead for 
Did you mean: 

STM32F767 USB HS with internal phy and internal USB DMA not working

AGoro.2
Associate

I'm using STM32F767ZI MCU.

I'm trying to use the USB HS device with internal phy (in FS mode), while using the dedicated USB DMA, and it is not working.

I'm using CDC (VCP) device class, and the MCU only sends data over the VCP Tx (no data received over VCP).

It seems that with USB DMA enabled, the USB device is stuck in BUSY state.

The moment I disable the DMA, everything works OK.

should the USB DMA work with the internal phy in FS mode?

should I call anything else except CDC_Transmit_HS() to clear the DMA state?

is there any reference example of such a use case?

The USBD configuration (auto-generated by Cube):

USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev)
 
{
 
 /* Init USB Ip. */
 
 if (pdev->id == DEVICE_HS) {
 
 /* Link the driver to the stack. */
 
 hpcd_USB_OTG_HS.pData = pdev;
 
 pdev->pData = &hpcd_USB_OTG_HS;
 
 
 
 hpcd_USB_OTG_HS.Instance = USB_OTG_HS;
 
 hpcd_USB_OTG_HS.Init.dev_endpoints = 9;
 
 hpcd_USB_OTG_HS.Init.speed = PCD_SPEED_FULL;
 
 hpcd_USB_OTG_HS.Init.dma_enable = ENABLE;
 
 hpcd_USB_OTG_HS.Init.phy_itface = USB_OTG_EMBEDDED_PHY;
 
 hpcd_USB_OTG_HS.Init.Sof_enable = DISABLE;
 
 hpcd_USB_OTG_HS.Init.low_power_enable = DISABLE;
 
 hpcd_USB_OTG_HS.Init.lpm_enable = DISABLE;
 
 hpcd_USB_OTG_HS.Init.vbus_sensing_enable = DISABLE;
 
 hpcd_USB_OTG_HS.Init.use_dedicated_ep1 = DISABLE;
 
 hpcd_USB_OTG_HS.Init.use_external_vbus = DISABLE;
 
 if (HAL_PCD_Init(&hpcd_USB_OTG_HS) != HAL_OK)
 
 {
 
  Error_Handler( );
 
 }
 
 
 
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
 
 /* Register USB PCD CallBacks */
 
 HAL_PCD_RegisterCallback(&hpcd_USB_OTG_HS, HAL_PCD_SOF_CB_ID, PCD_SOFCallback);
 
 HAL_PCD_RegisterCallback(&hpcd_USB_OTG_HS, HAL_PCD_SETUPSTAGE_CB_ID, PCD_SetupStageCallback);
 
 HAL_PCD_RegisterCallback(&hpcd_USB_OTG_HS, HAL_PCD_RESET_CB_ID, PCD_ResetCallback);
 
 HAL_PCD_RegisterCallback(&hpcd_USB_OTG_HS, HAL_PCD_SUSPEND_CB_ID, PCD_SuspendCallback);
 
 HAL_PCD_RegisterCallback(&hpcd_USB_OTG_HS, HAL_PCD_RESUME_CB_ID, PCD_ResumeCallback);
 
 HAL_PCD_RegisterCallback(&hpcd_USB_OTG_HS, HAL_PCD_CONNECT_CB_ID, PCD_ConnectCallback);
 
 HAL_PCD_RegisterCallback(&hpcd_USB_OTG_HS, HAL_PCD_DISCONNECT_CB_ID, PCD_DisconnectCallback);
 
 
 
 HAL_PCD_RegisterDataOutStageCallback(&hpcd_USB_OTG_HS, PCD_DataOutStageCallback);
 
 HAL_PCD_RegisterDataInStageCallback(&hpcd_USB_OTG_HS, PCD_DataInStageCallback);
 
 HAL_PCD_RegisterIsoOutIncpltCallback(&hpcd_USB_OTG_HS, PCD_ISOOUTIncompleteCallback);
 
 HAL_PCD_RegisterIsoInIncpltCallback(&hpcd_USB_OTG_HS, PCD_ISOINIncompleteCallback);
 
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
 
 HAL_PCDEx_SetRxFiFo(&hpcd_USB_OTG_HS, 0x200);
 
 HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_HS, 0, 0x80);
 
 HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_HS, 1, 0x174);
 
 }
 
 return USBD_OK;
 
}

3 REPLIES 3
AKozl.2
Associate

Have the same problem, any solutions or official answer?

AGoro.2
Associate

Did not receive any official answer, I assumed that it might be an issue with the fact I'm using the FS mode (and internal phy), although there is no comment/errata about that situation anywhere in the documentation.

AKozl.2
Associate

Same problem with HS mode. After sending about 1500 bytes (depends on the size of requests) transfer stuck in BUSY state. Disabling DMA fixed it