CH132 + STM32F429,出现“未知USB设备(设备描述符请求失败)”的问题。

1. 本人公司项目中使用STM32F429 + CH132实现高速USB传输,代码使用CubeMX生成,相关设置如下图中的CubeMX配置1-4。

2. 代码正常运行,USB插入电脑后能检测到插入,但提示“未知USB设备(设备描述符请求失败)”,如图5。

3. 检查引脚对应没有问题,STM32的引脚配置和连接也都没有问题,原理图设计如图6。

4. 上电后CH132的ULPI_CLK输出有正常的60MHz,示波器测量如图7。

5. 因为STM32的USB配置没有具体的针对CH132内部寄存器的配置方法,仅有对STM32内部USB控制器寄存器的配置,可认为配置完STM32的寄存器后即可遵循ULPI协议自动配置CH132的内部寄存器。起初怀疑是库的问题,切换使用STM32的内部PHY是能正常识别的,是用同样的库文件,只是相关配置寄存器的宏定义不同。出现“未知USB设备(设备描述符请求失败)”的问题CH132实际是否已经正常工作了?

6. 沁恒官方是否有验证在STM32部分型号上可用的例程可以提供参考?


图1-4

微信截图_20230831160011.png微信截图_20230831160024.png微信截图_20230831155924.png微信截图_20230831155951.png


图5

微信截图_20230831163007.png


图6

微信截图_20230831163534.png


图7

微信截图_20230831163232.png



记录追踪,

CubeMX的USB库初始化函数

/**
  * Init USB device Library, add supported class and start the library
  * @retval None
  */
void MX_USB_DEVICE_Init(void)
{
  /* USER CODE BEGIN USB_DEVICE_Init_PreTreatment */

  /* USER CODE END USB_DEVICE_Init_PreTreatment */

  /* Init Device Library, add supported class and start the library. */
  if (USBD_Init(&hUsbDeviceHS, &HS_Desc, DEVICE_HS) != USBD_OK)
  {
    Error_Handler();
  }
  if (USBD_RegisterClass(&hUsbDeviceHS, &USBD_CDC) != USBD_OK)
  {
    Error_Handler();
  }
  if (USBD_CDC_RegisterInterface(&hUsbDeviceHS, &USBD_Interface_fops_HS) != USBD_OK)
  {
    Error_Handler();
  }
  if (USBD_Start(&hUsbDeviceHS) != USBD_OK)
  {
    Error_Handler();
  }

  /* USER CODE BEGIN USB_DEVICE_Init_PostTreatment */

  /* USER CODE END USB_DEVICE_Init_PostTreatment */
}

在USB初始化完成并启动USB后,USB尚未连接主机,USB立即进入了一个全局中断(使用内部的PHY是没有的),进入中断处理函数。

/**
  * @brief This function handles USB On The Go HS global interrupt.
  */
void OTG_HS_IRQHandler(void)
{
  /* USER CODE BEGIN OTG_HS_IRQn 0 */

  /* USER CODE END OTG_HS_IRQn 0 */
  HAL_PCD_IRQHandler(&hpcd_USB_OTG_HS);
  /* USER CODE BEGIN OTG_HS_IRQn 1 */

  /* USER CODE END OTG_HS_IRQn 1 */
}

在中断处理函数中获取中断寄存器记录查找中断来源

/**
  * @brief  Handles PCD interrupt request.
  * @param  hpcd PCD handle
  * @retval HAL status
  */
void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd)
{
  USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
  uint32_t USBx_BASE = (uint32_t)USBx;
  USB_OTG_EPTypeDef *ep;
  uint32_t i;
  uint32_t ep_intr;
  uint32_t epint;
  uint32_t epnum;
  uint32_t fifoemptymsk;
  uint32_t RegVal;

  /* ensure that we are in device mode */
  if (USB_GetMode(hpcd->Instance) == USB_OTG_MODE_DEVICE)
  {
		
    /* avoid spurious interrupt */
    if (__HAL_PCD_IS_INVALID_INTERRUPT(hpcd))
    {
      return;
    }

    /* store current frame number */
    hpcd->FrameNumber = (USBx_DEVICE->DSTS & USB_OTG_DSTS_FNSOF_Msk) >> USB_OTG_DSTS_FNSOF_Pos;

		/*读取中断标记*/
		uint32_t it;
		it = (USB_ReadInterrupts(USBx));
		TRACE_DEBUG("IT FLAG = %08X\r\n",it);
		
    if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_MMIS))
    {
      /* incorrect mode, acknowledge the interrupt */
      __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_MMIS);
    }
    //........以下省略
}

发现it值为 IT FLAG = 00000800,bit11被置位,查找STM32的参考手册OTG_HS_GINTSTS中的描述,发现USB总线被挂起,原因不明,进入该中断后,无论如何插拔USB也不会再进入中断。

微信截图_20230831204700.png微信截图_20230831204836.png

请问出现这种问题是何种原因呢?







纠正:使用内部PHY也会进入USB被挂起的中断,但是插拔USB是能够进入新的中断并处理的。使用CH132怎么插拔都没有任何中断响应了。看来是芯片和STM32间通讯的原因?


您好,132的CLK如有60MHz波形输出,那么表示132A已经在正常工作了。因为ST的代码,您只能看到对USB控制器的操作,无法看到控制器对phy的操作,所以代码追查比较麻烦。您可以发送邮件到mj@wch.cn,这边提供给您STM32F4系列MCU控制CH132的完整工程代码,提供参考。


已发送邮件,请查收并提供STM32F4系列工程代码,谢谢!


您好,我也遇到同样的问题,请问您解决了么?


只有登录才能回复,可以选择微信账号登录