想要通过 DMA 通过 USB OTG HS 接收数据

问题描述 投票:0回答:1

我正在尝试在 STM32F4 Discovery 板上通过 DMA 通过 USB OTG HS 接收数据。我已经启用了内部 IP DMA,但我不知道如何用它接收数据。我曾尝试修改

usbd_conf.h
里面的代码,但到目前为止证明不成功。任何建议或指导将不胜感激。谢谢!

这是我的代码:

/**
  * @brief  Data In stage callback.
  * @param  hpcd: PCD handle
  * @param  epnum: Endpoint number
  * @retval None
  */
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
static void PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
#else
void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
{
   if (hpcd->Instance == USB_OTG_HS && epnum == 0)
   {
       /* Process received data here */
       uint32_t received_length = sizeof(rx_buffer) - HAL_PCD_EP_GetRxCount(hpcd, 0);
       if (received_length > 0) {
           // Toggle the LED
           HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12);

           // Copy received data to the buffer for debugging
           memcpy(&received_data_buffer[received_data_length], rx_buffer, received_length);
           received_data_length += received_length;

           // Restart the reception
           HAL_PCD_EP_Receive(hpcd, 0, rx_buffer, sizeof(rx_buffer));
       }
   }
   USBD_LL_DataInStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->IN_ep[epnum].xfer_buff);
}

/*******************************************************************************
                       LL Driver Interface (USB Device Library --> PCD)
*******************************************************************************/

/**
  * @brief  Initializes the low level portion of the device driver.
  * @param  pdev: Device handle
  * @retval USBD status
  */
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 = 6;
      hpcd_USB_OTG_HS.Init.speed = PCD_SPEED_HIGH;
      hpcd_USB_OTG_HS.Init.dma_enable = ENABLE;
      hpcd_USB_OTG_HS.Init.phy_itface = USB_OTG_ULPI_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;
}
stm32 stm32f4discovery usb-otg
1个回答
0
投票

我推荐这个链接:

I-CUBE-USBD-复合

© www.soinside.com 2019 - 2024. All rights reserved.