cancel
Showing results for 
Search instead for 
Did you mean: 

[STM32F407-Discovery] Sometimes music is not played through USB Audio.

SJoo.1
Associate II

Hi.

I used USB_OTG_FS as Audio Device Class on STM32F407-discovery.

I connected PC and STM32F407-discovery with USB device.

When I played music, sometimes sound is not occurred on STM32F407-discovery.

I found that epnum in USBD_LL_DataOutStage is always 0 if sound is not occurred. (It is not 0 if sound is occurred.)

But I don't know what epnum is and how it is changed.

Could somebody help me how to fix this issue?

Firmware : STM32Cube_FW_F4_V1.27.0

===================================================================

USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev,

                    uint8_t epnum, uint8_t *pdata)

{

 USBD_EndpointTypeDef *pep;

 USBD_StatusTypeDef ret = USBD_OK;

 uint8_t idx;

 printf("USBD_LL_DataOutStage %d\r\n",epnum);

 if (epnum == 0U)

 {

  pep = &pdev->ep_out[0];

  if (pdev->ep0_state == USBD_EP0_DATA_OUT)

  {

   if (pep->rem_length > pep->maxpacket)

   {

    pep->rem_length -= pep->maxpacket;

    (void)USBD_CtlContinueRx(pdev, pdata, MIN(pep->rem_length, pep->maxpacket));

   }

   else

   {

    /* Find the class ID relative to the current request */

    switch (pdev->request.bmRequest & 0x1FU)

    {

     case USB_REQ_RECIPIENT_DEVICE:

      /* Device requests must be managed by the first instantiated class

        (or duplicated by all classes for simplicity) */

      idx = 0U;

      break;

     case USB_REQ_RECIPIENT_INTERFACE:

      idx = USBD_CoreFindIF(pdev, LOBYTE(pdev->request.wIndex));

      break;

     case USB_REQ_RECIPIENT_ENDPOINT:

      idx = USBD_CoreFindEP(pdev, LOBYTE(pdev->request.wIndex));

      break;

     default:

      /* Back to the first class in case of doubt */

      idx = 0U;

      break;

    }

    if (idx < USBD_MAX_SUPPORTED_CLASS)

    {

     /* Setup the class ID and route the request to the relative class function */

     if (pdev->dev_state == USBD_STATE_CONFIGURED)

     {

      if (pdev->pClass[idx]->EP0_RxReady != NULL)

      {

       pdev->classId = idx;

       pdev->pClass[idx]->EP0_RxReady(pdev);

      }

     }

    }

    (void)USBD_CtlSendStatus(pdev);

   }

  }

  else

  {

#if 0

   if (pdev->ep0_state == USBD_EP0_STATUS_OUT)

   {

    /*

     * STATUS PHASE completed, update ep0_state to idle

     */

    pdev->ep0_state = USBD_EP0_IDLE;

    (void)USBD_LL_StallEP(pdev, 0U);

   }

#endif

  }

 }

 else

 {

  /* Get the class index relative to this interface */

  idx = USBD_CoreFindEP(pdev, (epnum & 0x7FU));

  if (((uint16_t)idx != 0xFFU) && (idx < USBD_MAX_SUPPORTED_CLASS))

  {

   /* Call the class data out function to manage the request */

   if (pdev->dev_state == USBD_STATE_CONFIGURED)

   {

    if (pdev->pClass[idx]->DataOut != NULL)

    {

     pdev->classId = idx;

     ret = (USBD_StatusTypeDef)pdev->pClass[idx]->DataOut(pdev, epnum);

    }

   }

   if (ret != USBD_OK)

   {

    return ret;

   }

  }

 }

 return USBD_OK;

}

===================================================================

0 REPLIES 0