打印
[STM32L1]

stm32 虚拟串口 无法识别的 usb设备求助

[复制链接]
2230|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
最近要用到USB CDC驱动,用的芯片是STM32l151rct6,程序时cube直接生成的,接入电脑显示位置设备(设备描述符其请求失败)在F207同样用cube生成的代码可以说使用。使用BusHound抓取的数据显示如下
Device  Phase  Data                                                                                                    Description                       Cmd.Phase.Ofs(rep)
------  -----  ------------------------------------------------------------------------------------------------------  --------------------------------  ------------------
   7    OUT    20 00 00                                                                                                 ..                                      1.1.0        
   7.0  CTL    a3 00 00 00  05 00 04 00                                                                                CLASS                                    2.1.0        
   7.0  IN     01 01 01 00                                                                                             ....                                     2.2.0        
   7.0  CTL    23 01 10 00  05 00 00 00                                                                                CLASS                                    3.1.0        
   7.0  CTL    a3 00 00 00  05 00 04 00                                                                                CLASS                                    4.1.0        
   7.0  IN     01 01 00 00                                                                                             ....                                     4.2.0        
   7    OUT    00 00 00                                                                                                ...                                      5.1.0        
   7    CMD    80 e0 19 ea  89 c1 ff ff  60 c9 02 ea  89 c1 ff ff  6d 00 5c 00  00 00 65 00  d0 95 7f f0  89 c1 ff ff  XDWRITE EXTENDED                         6.1.0        
   7    SSTS   00                                                                                                      pending                                  6.2.0        
   7.0  CTL    23 03 04 00  05 00 00 00                                                                                CLASS                                    7.1.0        
   7    OUT    20 00 00                                                                                                 ..                                      8.1.0        
   7.0  CTL    a3 00 00 00  05 00 04 00                                                                                CLASS                                    9.1.0        
   7.0  IN     03 01 10 00                                                                                             ....                                     9.2.0        
   7.0  CTL    23 01 14 00  05 00 00 00                                                                                CLASS                                   10.1.0        
   7.0  CTL    a3 00 00 00  05 00 04 00                                                                                CLASS                                   11.1.0        
   7.0  IN     03 01 00 00                                                                                             ....                                    11.2.0        
   7    OUT    00 00 00                                                                                                ...                                     12.1.0        
   7    CMD    80 e0 19 ea  89 c1 ff ff  60 c9 02 ea  89 c1 ff ff  6d 00 5c 00  00 00 65 00  d0 95 7f f0  89 c1 ff ff  XDWRITE EXTENDED                        13.1.0        
   7    SSTS   00                                                                                                      pending                                 13.2.0        
   7.0  CTL    80 06 00 01  00 00 40 00                                                                                GET DESCRIPTOR                          14.1.0        
   7.0  USTS   c0000011                                                                                                xact error                              14.2.0        
   7    CMD    80 e0 19 ea  89 c1 ff ff  60 c9 02 ea  89 c1 ff ff  6d 00 5c 00  00 00 65 00  d0 95 7f f0  89 c1 ff ff  XDWRITE EXTENDED                        15.1.0        
   7    SSTS   00                                                                                                      pending                                 15.2.0        
   7.0  CTL    23 03 04 00  05 00 00 00                                                                                CLASS                                   16.1.0        
   7    OUT    20 00 00                                                                                                 ..                                     17.1.0        
   7.0  CTL    a3 00 00 00  05 00 04 00                                                                                CLASS                                   18.1.0        
   7.0  IN     03 01 10 00                                                                                             ....                                    18.2.0        
   7.0  CTL    23 01 14 00  05 00 00 00                                                                                CLASS                                   19.1.0        
   7.0  CTL    a3 00 00 00  05 00 04 00                                                                                CLASS                                   20.1.0        
   7.0  IN     03 01 00 00                                                                                             ....                                    20.2.0        
   7    OUT    00 00 00                                                                                                ...                                     21.1.0        
   7    CMD    80 e0 19 ea  89 c1 ff ff  60 c9 02 ea  89 c1 ff ff  6d 00 5c 00  00 00 65 00  d0 95 7f f0  89 c1 ff ff  XDWRITE EXTENDED                        22.1.0        
   7    SSTS   00                                                                                                      pending                                 22.2.0        
   7.0  CTL    80 06 00 01  00 00 40 00                                                                                GET DESCRIPTOR                          23.1.0        
   7.0  USTS   c0000011                                                                                                xact error                              23.2.0        
   7    CMD    80 e0 19 ea  89 c1 ff ff  60 c9 02 ea  89 c1 ff ff  6d 00 5c 00  00 00 65 00  d0 95 7f f0  89 c1 ff ff  XDWRITE EXTENDED                        24.1.0        
   7    SSTS   00                                                                                                      pending                                 24.2.0        
   7.0  CTL    23 03 04 00  05 00 00 00                                                                                CLASS                                   25.1.0        
   7    OUT    20 00 00                                                                                                 ..                                     26.1.0        
   7.0  CTL    a3 00 00 00  05 00 04 00                                                                                CLASS                                   27.1.0        
   7.0  IN     03 01 10 00                                                                                             ....                                    27.2.0        
   7.0  CTL    23 01 14 00  05 00 00 00                                                                                CLASS                                   28.1.0        
   7.0  CTL    a3 00 00 00  05 00 04 00                                                                                CLASS                                   29.1.0        
   7.0  IN     03 01 00 00                                                                                             ....                                    29.2.0        
   7    OUT    00 00 00                                                                                                ...                                     30.1.0        
   7    CMD    80 e0 19 ea  89 c1 ff ff  60 c9 02 ea  89 c1 ff ff  6d 00 5c 00  00 00 65 00  d0 95 7f f0  89 c1 ff ff  XDWRITE EXTENDED                        31.1.0        
   7    SSTS   00                                                                                                      pending                                 31.2.0        
   7.0  CTL    80 06 00 01  00 00 40 00                                                                                GET DESCRIPTOR                          32.1.0        
   7.0  USTS   c0000011                                                                                                xact error                              32.2.0        
   7    CMD    80 e0 19 ea  89 c1 ff ff  60 c9 02 ea  89 c1 ff ff  6d 00 5c 00  00 00 65 00  d0 95 7f f0  89 c1 ff ff  XDWRITE EXTENDED                        33.1.0        
   7    SSTS   00                                                                                                      pending                                 33.2.0        
   7.0  CTL    23 03 04 00  05 00 00 00                                                                                CLASS                                   34.1.0        
   7    OUT    20 00 00                                                                                                 ..                                     35.1.0        
   7.0  CTL    a3 00 00 00  05 00 04 00                                                                                CLASS                                   36.1.0        
   7.0  IN     03 01 10 00                                                                                             ....                                    36.2.0        
   7.0  CTL    23 01 14 00  05 00 00 00                                                                                CLASS                                   37.1.0        
   7.0  CTL    a3 00 00 00  05 00 04 00                                                                                CLASS                                   38.1.0        
   7.0  IN     03 01 00 00                                                                                             ....                                    38.2.0        
   7    OUT    00 00 00                                                                                                ...                                     39.1.0        
   7    CMD    80 e0 19 ea  89 c1 ff ff  60 c9 02 ea  89 c1 ff ff  6d 00 5c 00  00 00 65 00  d0 95 7f f0  89 c1 ff ff  XDWRITE EXTENDED                        40.1.0        
   7    SSTS   00                                                                                                      pending                                 40.2.0        
   7.0  CTL    80 06 00 01  00 00 40 00                                                                                GET DESCRIPTOR                          41.1.0        
   7    OUT    20 00 00                                                                                                 ..                                     42.1.0        
   7.0  CTL    a3 00 00 00  05 00 04 00                                                                                CLASS                                   43.1.0        
   7.0  IN     01 01 02 00                                                                                             ....                                    43.2.0        
   7.0  CTL    23 01 11 00  05 00 00 00                                                                                CLASS                                   44.1.0        
   7.0  CTL    a3 00 00 00  05 00 04 00                                                                                CLASS                                   45.1.0        
   7.0  IN     01 01 00 00                                                                                             ....                                    45.2.0        
   7    OUT    00 00 00                                                                                                ...                                     46.1.0        
   7.0  USTS   c0000011                                                                                                xact error                              41.2.0        
   7    CMD    80 e0 19 ea  89 c1 ff ff  60 c9 02 ea  89 c1 ff ff  6d 00 5c 00  00 00 65 00  d0 95 7f f0  89 c1 ff ff  XDWRITE EXTENDED                        47.1.0        
   7    SSTS   00                                                                                                      pending                                 47.2.0        
   7.0  CTL    23 01 01 00  05 00 00 00                                                                                CLASS                                   48.1.0        
   7.0  CTL    23 01 02 00  02 00 00 00                                                                                CLASS                                   49.1.0        
   7    OUT    04 00 00                                                                                                ...                                     50.1.0        
   7.0  CTL    a3 00 00 00  02 00 04 00                                                                                CLASS                                   51.1.0        
   7.0  IN     03 05 04 00                                                                                             ....                                    51.2.0        
   7.0  CTL    23 01 12 00  02 00 00 00                                                                                CLASS                                   52.1.0        
   7.0  CTL    a3 00 00 00  02 00 04 00                                                                                CLASS                                   53.1.0        
   7.0  IN     03 05 00 00                                                                                             ....                                    53.2.0        
   7    OUT    00 00 00                                                                                                ...                                     54.1.0        
   7    CMD    00 00 00 00  00 00 00 00  01 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  10 ab 09 e4  89 c1 ff ff  TEST UNIT READY                         55.1.0(2)     
   7    SSTS   00                                                                                                      pending                                 55.2.0        
   7.0  CTL    23 03 02 00  02 00 00 00                                                                                CLASS                                   57.1.0        

使用特权

评论回复
沙发
东风十二|  楼主 | 2020-6-15 19:21 | 只看该作者
截图如下

Snipaste_2020-06-15_19-20-01.png (66.05 KB )

Snipaste_2020-06-15_19-20-01.png

Snipaste_2020-06-15_19-20-29.png (308.03 KB )

Snipaste_2020-06-15_19-20-29.png

使用特权

评论回复
板凳
东风十二|  楼主 | 2020-6-15 20:02 | 只看该作者
打断点,USBD_CDC_Init,和USBD_LL_DataInStage都没有进入。

USB——cdc——init.png (54.66 KB )

USB——cdc——init.png

USB_DATAINSTAGE.png (326.9 KB )

USB_DATAINSTAGE.png

使用特权

评论回复
地板
东风十二|  楼主 | 2020-6-16 14:18 | 只看该作者
整体流程应为先进入
void USB_LP_IRQHandler(void)
{
  HAL_PCD_IRQHandler(&hpcd_USB_FS);
}
转到
void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd)
{
  if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_CTR))
  {
    /* servicing of the endpoint correct transfer interrupt */
    /* clear of the CTR flag into the sub */
    (void)PCD_EP_ISR_Handler(hpcd);
  }

  if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_RESET))
  {
    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_RESET);

#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
    hpcd->ResetCallback(hpcd);
#else
    HAL_PCD_ResetCallback(hpcd);
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

    (void)HAL_PCD_SetAddress(hpcd, 0U);
  }

  if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_PMAOVR))
  {
    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_PMAOVR);
  }

  if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_ERR))
  {
    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_ERR);
  }

  if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_WKUP))
  {
    hpcd->Instance->CNTR &= (uint16_t) ~(USB_CNTR_LPMODE);
    hpcd->Instance->CNTR &= (uint16_t) ~(USB_CNTR_FSUSP);

#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
    hpcd->ResumeCallback(hpcd);
#else
    HAL_PCD_ResumeCallback(hpcd);
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_WKUP);
  }

  if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_SUSP))
  {
    /* Force low-power mode in the macrocell */
    hpcd->Instance->CNTR |= USB_CNTR_FSUSP;

    /* clear of the ISTR bit must be done after setting of CNTR_FSUSP */
    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_SUSP);

    hpcd->Instance->CNTR |= USB_CNTR_LPMODE;

    if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_WKUP) == 0U)
    {
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
      hpcd->SuspendCallback(hpcd);
#else
      HAL_PCD_SuspendCallback(hpcd);
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
    }
  }

  if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_SOF))
  {
    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_SOF);

#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
    hpcd->SOFCallback(hpcd);
#else
    HAL_PCD_SOFCallback(hpcd);
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
  }

  if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_ESOF))
  {
    /* clear ESOF flag in ISTR */
    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_ESOF);
  }
}

再到ep的中断
static HAL_StatusTypeDef PCD_EP_ISR_Handler(PCD_HandleTypeDef *hpcd)
{
  PCD_EPTypeDef *ep;
  uint16_t count;
  uint16_t wIstr;
  uint16_t wEPVal;
  uint8_t epindex;

  /* stay in loop while pending interrupts */
  while ((hpcd->Instance->ISTR & USB_ISTR_CTR) != 0U)
  {
    wIstr = hpcd->Instance->ISTR;
    /* extract highest priority endpoint number */
    epindex = (uint8_t)(wIstr & USB_ISTR_EP_ID);

    if (epindex == 0U)
    {
      /* Decode and service control endpoint interrupt */

      /* DIR bit = origin of the interrupt */
      if ((wIstr & USB_ISTR_DIR) == 0U)
      {
        /* DIR = 0 */

        /* DIR = 0      => IN  int */
        /* DIR = 0 implies that (EP_CTR_TX = 1) always  */
        PCD_CLEAR_TX_EP_CTR(hpcd->Instance, PCD_ENDP0);
        ep = &hpcd->IN_ep[0];

        ep->xfer_count = PCD_GET_EP_TX_CNT(hpcd->Instance, ep->num);
        ep->xfer_buff += ep->xfer_count;

        /* TX COMPLETE */
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
        hpcd->DataInStageCallback(hpcd, 0U);
#else
        HAL_PCD_DataInStageCallback(hpcd, 0U);
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

        if ((hpcd->USB_Address > 0U) && (ep->xfer_len == 0U))
        {
          hpcd->Instance->DADDR = ((uint16_t)hpcd->USB_Address | USB_DADDR_EF);
          hpcd->USB_Address = 0U;
        }
      }
      else
      {
        /* DIR = 1 */

        /* DIR = 1 & CTR_RX       => SETUP or OUT int */
        /* DIR = 1 & (CTR_TX | CTR_RX) => 2 int pending */
        ep = &hpcd->OUT_ep[0];
        wEPVal = PCD_GET_ENDPOINT(hpcd->Instance, PCD_ENDP0);

        if ((wEPVal & USB_EP_SETUP) != 0U)
        {
          /* Get SETUP Packet*/
          ep->xfer_count = PCD_GET_EP_RX_CNT(hpcd->Instance, ep->num);
          USB_ReadPMA(hpcd->Instance, (uint8_t *)hpcd->Setup, ep->pmaadress, (uint16_t)ep->xfer_count);
          /* SETUP bit kept frozen while CTR_RX = 1*/
          PCD_CLEAR_RX_EP_CTR(hpcd->Instance, PCD_ENDP0);

          /* Process SETUP Packet*/
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
          hpcd->SetupStageCallback(hpcd);
#else
          HAL_PCD_SetupStageCallback(hpcd);
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
        }

        else if ((wEPVal & USB_EP_CTR_RX) != 0U)
        {
          PCD_CLEAR_RX_EP_CTR(hpcd->Instance, PCD_ENDP0);
          /* Get Control Data OUT Packet*/
          ep->xfer_count = PCD_GET_EP_RX_CNT(hpcd->Instance, ep->num);

          if (ep->xfer_count != 0U)
          {
            USB_ReadPMA(hpcd->Instance, ep->xfer_buff, ep->pmaadress, (uint16_t)ep->xfer_count);
            ep->xfer_buff += ep->xfer_count;
          }

          /* Process Control Data OUT Packet*/
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
          hpcd->DataOutStageCallback(hpcd, 0U);
#else
          HAL_PCD_DataOutStageCallback(hpcd, 0U);
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

          PCD_SET_EP_RX_CNT(hpcd->Instance, PCD_ENDP0, ep->maxpacket);
          PCD_SET_EP_RX_STATUS(hpcd->Instance, PCD_ENDP0, USB_EP_RX_VALID);
        }
      }
    }
    else
    {
      /* Decode and service non control endpoints interrupt  */

      /* process related endpoint register */
      wEPVal = PCD_GET_ENDPOINT(hpcd->Instance, epindex);
      if ((wEPVal & USB_EP_CTR_RX) != 0U)
      {
        /* clear int flag */
        PCD_CLEAR_RX_EP_CTR(hpcd->Instance, epindex);
        ep = &hpcd->OUT_ep[epindex];

        /* OUT double Buffering*/
        if (ep->doublebuffer == 0U)
        {
          count = (uint16_t)PCD_GET_EP_RX_CNT(hpcd->Instance, ep->num);
          if (count != 0U)
          {
            USB_ReadPMA(hpcd->Instance, ep->xfer_buff, ep->pmaadress, count);
          }
        }
        else
        {
          if ((PCD_GET_ENDPOINT(hpcd->Instance, ep->num) & USB_EP_DTOG_RX) != 0U)
          {
            /*read from endpoint BUF0Addr buffer*/
            count = (uint16_t)PCD_GET_EP_DBUF0_CNT(hpcd->Instance, ep->num);
            if (count != 0U)
            {
              USB_ReadPMA(hpcd->Instance, ep->xfer_buff, ep->pmaaddr0, count);
            }
          }
          else
          {
            /*read from endpoint BUF1Addr buffer*/
            count = (uint16_t)PCD_GET_EP_DBUF1_CNT(hpcd->Instance, ep->num);
            if (count != 0U)
            {
              USB_ReadPMA(hpcd->Instance, ep->xfer_buff, ep->pmaaddr1, count);
            }
          }
          /* free EP OUT Buffer */
          PCD_FreeUserBuffer(hpcd->Instance, ep->num, 0U);
        }
        /*multi-packet on the NON control OUT endpoint*/
        ep->xfer_count += count;
        ep->xfer_buff += count;

        if ((ep->xfer_len == 0U) || (count < ep->maxpacket))
        {
          /* RX COMPLETE */
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
          hpcd->DataOutStageCallback(hpcd, ep->num);
#else
          HAL_PCD_DataOutStageCallback(hpcd, ep->num);
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
        }
        else
        {
          (void)HAL_PCD_EP_Receive(hpcd, ep->num, ep->xfer_buff, ep->xfer_len);
        }

      } /* if((wEPVal & EP_CTR_RX) */

      if ((wEPVal & USB_EP_CTR_TX) != 0U)
      {
        ep = &hpcd->IN_ep[epindex];

        /* clear int flag */
        PCD_CLEAR_TX_EP_CTR(hpcd->Instance, epindex);

        /*multi-packet on the NON control IN endpoint*/
        ep->xfer_count = PCD_GET_EP_TX_CNT(hpcd->Instance, ep->num);
        ep->xfer_buff += ep->xfer_count;

        /* Zero Length Packet? */
        if (ep->xfer_len == 0U)
        {
          /* TX COMPLETE */
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
          hpcd->DataInStageCallback(hpcd, ep->num);
#else
          HAL_PCD_DataInStageCallback(hpcd, ep->num);
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
        }
        else
        {
          (void)HAL_PCD_EP_Transmit(hpcd, ep->num, ep->xfer_buff, ep->xfer_len);
        }
      }
    }
  }
  return HAL_OK;
}


在中断里调用
void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd)
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
{
  USBD_LL_SetupStage((USBD_HandleTypeDef*)hpcd->pData, (uint8_t *)hpcd->Setup);
}

PCD_EP_ISR_Handler

来进行USB的枚举或者配置
USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup)
{
  USBD_ParseSetupRequest(&pdev->request, psetup);

  pdev->ep0_state = USBD_EP0_SETUP;

  pdev->ep0_data_len = pdev->request.wLength;

  switch (pdev->request.bmRequest & 0x1FU)
  {
  case USB_REQ_RECIPIENT_DEVICE:
    USBD_StdDevReq (pdev, &pdev->request);
    break;

  case USB_REQ_RECIPIENT_INTERFACE:
    USBD_StdItfReq(pdev, &pdev->request);
    break;

  case USB_REQ_RECIPIENT_ENDPOINT:
    USBD_StdEPReq(pdev, &pdev->request);
    break;

  default:
    USBD_LL_StallEP(pdev, (pdev->request.bmRequest & 0x80U));
    break;
  }

  return USBD_OK;
}

第一步应该是get USB_REQ_GET_DESCRIPTOR
USBD_StatusTypeDef  USBD_StdDevReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef  *req)
{
  USBD_StatusTypeDef ret = USBD_OK;

  switch (req->bmRequest & USB_REQ_TYPE_MASK)
  {
  case USB_REQ_TYPE_CLASS:
  case USB_REQ_TYPE_VENDOR:
    pdev->pClass->Setup(pdev, req);
    break;

  case USB_REQ_TYPE_STANDARD:

    switch (req->bRequest)
    {
    case USB_REQ_GET_DESCRIPTOR:
      USBD_GetDescriptor (pdev, req);
      break;

    case USB_REQ_SET_ADDRESS:
      USBD_SetAddress (pdev, req);
      break;

    case USB_REQ_SET_CONFIGURATION:
      USBD_SetConfig (pdev, req);
      break;

    case USB_REQ_GET_CONFIGURATION:
      USBD_GetConfig (pdev, req);
      break;

    case USB_REQ_GET_STATUS:
      USBD_GetStatus (pdev, req);
      break;


    case USB_REQ_SET_FEATURE:
      USBD_SetFeature (pdev, req);
      break;

    case USB_REQ_CLEAR_FEATURE:
      USBD_ClrFeature (pdev, req);
      break;

    default:
      USBD_CtlError(pdev, req);
      break;
    }
    break;

  default:
    USBD_CtlError(pdev, req);
    break;
  }

  return ret;
}








  获取描述符
  pbuf = pdev->pDesc->GetProductStrDescriptor(pdev->dev_speed, &len);

  static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev ,
                               USBD_SetupReqTypedef *req)
{
  uint16_t len;
  uint8_t *pbuf;


  switch (req->wValue >> 8)
  {
#if (USBD_LPM_ENABLED == 1U)
  case USB_DESC_TYPE_BOS:
    pbuf = pdev->pDesc->GetBOSDescriptor(pdev->dev_speed, &len);
    break;
#endif
  case USB_DESC_TYPE_DEVICE:
    pbuf = pdev->pDesc->GetDeviceDescriptor(pdev->dev_speed, &len);
    break;

  case USB_DESC_TYPE_CONFIGURATION:
    if(pdev->dev_speed == USBD_SPEED_HIGH )
    {
      pbuf   = (uint8_t *)pdev->pClass->GetHSConfigDescriptor(&len);
      pbuf[1] = USB_DESC_TYPE_CONFIGURATION;
    }
    else
    {
      pbuf   = (uint8_t *)pdev->pClass->GetFSConfigDescriptor(&len);
      pbuf[1] = USB_DESC_TYPE_CONFIGURATION;
    }
    break;

  case USB_DESC_TYPE_STRING:
    switch ((uint8_t)(req->wValue))
    {
    case USBD_IDX_LANGID_STR:
     pbuf = pdev->pDesc->GetLangIDStrDescriptor(pdev->dev_speed, &len);
      break;

    case USBD_IDX_MFC_STR:
      pbuf = pdev->pDesc->GetManufacturerStrDescriptor(pdev->dev_speed, &len);
      break;

    case USBD_IDX_PRODUCT_STR:
      pbuf = pdev->pDesc->GetProductStrDescriptor(pdev->dev_speed, &len);
      break;

    case USBD_IDX_SERIAL_STR:
      pbuf = pdev->pDesc->GetSerialStrDescriptor(pdev->dev_speed, &len);
      break;

    case USBD_IDX_CONFIG_STR:
      pbuf = pdev->pDesc->GetConfigurationStrDescriptor(pdev->dev_speed, &len);
      break;

    case USBD_IDX_INTERFACE_STR:
      pbuf = pdev->pDesc->GetInterfaceStrDescriptor(pdev->dev_speed, &len);
      break;

    default:
#if (USBD_SUPPORT_USER_STRING == 1U)
      pbuf = pdev->pClass->GetUsrStrDescriptor(pdev, (req->wValue) , &len);
      break;
#else
       USBD_CtlError(pdev , req);
      return;
#endif
    }
    break;
  case USB_DESC_TYPE_DEVICE_QUALIFIER:

    if(pdev->dev_speed == USBD_SPEED_HIGH)
    {
      pbuf = (uint8_t *)pdev->pClass->GetDeviceQualifierDescriptor(&len);
      break;
    }
    else
    {
      USBD_CtlError(pdev , req);
      return;
    }

  case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION:
    if(pdev->dev_speed == USBD_SPEED_HIGH  )
    {
      pbuf   = (uint8_t *)pdev->pClass->GetOtherSpeedConfigDescriptor(&len);
      pbuf[1] = USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION;
      break;
    }
    else
    {
      USBD_CtlError(pdev , req);
      return;
    }

  default:
     USBD_CtlError(pdev , req);
    return;
  }

  if((len != 0U) && (req->wLength != 0U))
  {

    len = MIN(len, req->wLength);

    USBD_CtlSendData (pdev, pbuf, len);
  }

  if(req->wLength == 0U)
  {
   USBD_CtlSendStatus(pdev);
  }
}

最后转到
  USBD_FS_ProductStrDescriptor
  uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
{
  if(speed == 0)
  {
    USBD_GetString((uint8_t *)USBD_PRODUCT_STRING_FS, USBD_StrDesc, length);
  }
  else
  {
    USBD_GetString((uint8_t *)USBD_PRODUCT_STRING_FS, USBD_StrDesc, length);
  }
  return USBD_StrDesc;
}

从而获得描述符
但是现在的现象时进入了大中断,但是没有进入获取描述符的中断。
从网上找了一个基于标准库的HID,是可以正常使用的。但是st官方的damo也不能用。
有没有大佬可以指点一下。

使用特权

评论回复
5
香水城| | 2020-6-16 16:36 | 只看该作者
本帖最后由 香水城 于 2020-6-16 16:37 编辑

如果基于Cubemx进行配置的话,稍作配置就应该可以识别的了。

你适当注意下时钟,时钟要是基于HSE的。 再就是堆栈的配置。

使用特权

评论回复
评论
东风十二 2020-6-17 09:05 回复TA
时钟时hse的8m的这个已经确认了,堆栈分别为ox1500,0x1000,已经开的很大了。 
6
wahahaheihei| | 2020-6-16 23:44 | 只看该作者
还没玩过USB,跟楼主学习学习。

使用特权

评论回复
7
sonicll| | 2020-6-17 09:00 | 只看该作者
如果能进USB的复位中断,但是进不了收发完成中断,一般都是USB时钟配置问题

使用特权

评论回复
8
东风十二|  楼主 | 2020-6-17 09:06 | 只看该作者
sonicll 发表于 2020-6-17 09:00
如果能进USB的复位中断,但是进不了收发完成中断,一般都是USB时钟配置问题 ...

我用mco把时钟导出来试一下。

使用特权

评论回复
9
东风十二|  楼主 | 2020-6-17 09:18 | 只看该作者
昨晚把寄存器dump出来了,和网上可用的工程对比了一下,控制寄存器配置是一样的。但是在USB接入后可用的HID工程USB_FNR会有计数和D+,D-状态变化,但cube导出的工程全为0,并且接入电脑无任何变化,但当我在USB初始化完成后将PA12上拉(DP)后,电脑会显示USB插入,但无法识别,也就是最初的现象。目前怀疑方向为USB初始化或时钟有问题。今天具体排查。


希望遇到过的类似问题,或者用过这个片子的大佬指点下。

USBDUMP.png (327.96 KB )

对比如下

对比如下

使用特权

评论回复
10
东风十二|  楼主 | 2020-6-17 09:22 | 只看该作者
这是时钟树的配置

clock.png (262.09 KB )

时钟配置如下

时钟配置如下

使用特权

评论回复
11
东风十二|  楼主 | 2020-6-17 19:04 | 只看该作者
问题已经解决。
装了个虚拟机,下了个cube的4.27版本,然后元步骤导出工程,直接就可以了。
具体什么原因,等我分析完,过段时间发过来。

使用特权

评论回复
12
东风十二|  楼主 | 2020-6-18 19:19 | 只看该作者

最后定位如下1.STM32L151没有VBUS。
2.STM32L151内部集成DP上拉电阻。
HAL_StatusTypeDef HAL_PCD_Start(PCD_HandleTypeDef *hpcd)
{
  __HAL_LOCK(hpcd);

  HAL_PCDEx_SetConnectionState(hpcd, 1U);//需要设置USB的状态但cube导出的工程没有定义这个函数。

  (void)USB_DevConnect(hpcd->Instance);
  __HAL_PCD_ENABLE(hpcd);
  __HAL_UNLOCK(hpcd);
  return HAL_OK;
}





/**
  * @brief  Software Device Connection,
  *         this function is not required by USB OTG FS peripheral, it is used
  *         only by USB Device FS peripheral.
  * @param  hpcd: PCD handle
  * @param  state: connection state (0 : disconnected / 1: connected)
  * @retval None
  */
__weak void HAL_PCDEx_SetConnectionState(PCD_HandleTypeDef *hpcd, uint8_t state)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(hpcd);
  UNUSED(state);
  /* NOTE : This function Should not be modified, when the callback is needed,
            the HAL_PCDEx_SetConnectionState could be implemented in the user file
   */
}

void HAL_PCDEx_SetConnectionState(PCD_HandleTypeDef *hpcd, uint8_t state)
{
  /* USER CODE BEGIN 6 */
  if (state == 1)
  {
    /* Configure Low connection state. */
    __HAL_SYSCFG_USBPULLUP_ENABLE();
  }
  else
  {
    /* Configure High connection state. */
    __HAL_SYSCFG_USBPULLUP_DISABLE();
  }
  /* USER CODE END 6 */
}

定义一下就好了。

SYSCFG_PMC.png (95.12 KB )

SYSCFG_PMC.png

USB_DP_PROGRAMMING.png (103.99 KB )

USB_DP_PROGRAMMING.png

使用特权

评论回复
13
xiaoqizi| | 2020-7-8 16:29 | 只看该作者
请问为什么叫虚拟串口呢

使用特权

评论回复
14
木木guainv| | 2020-7-8 16:29 | 只看该作者
看的我好头晕啊

使用特权

评论回复
15
磨砂| | 2020-7-8 16:30 | 只看该作者
城主的建议可行吗

使用特权

评论回复
16
晓伍| | 2020-7-8 16:30 | 只看该作者
不知楼主解决问题否?

使用特权

评论回复
17
八层楼| | 2020-7-8 16:30 | 只看该作者
帮楼主顶一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

10

帖子

0

粉丝