|
最近做一个项目需要USB进行非常大的数据量传输,选用方案是F407+USB PHY(外置的PHY芯片,厂家CH132A),
USB枚举了COM+Keyboard+Custom HID的复合设备,在枚举过程中在请求报告描述符时失败,仿真发现程序已经发
送给PC端,但是PC端没有收到,下图是Bus软件捕获到的数据:

if(req->wIndex == 2) { /* 键盘HID */
switch (req->bmRequest & USB_REQ_TYPE_MASK)
{
case USB_REQ_TYPE_CLASS :
switch (req->bRequest)
{
case HID_REQ_SET_PROTOCOL:
USBD_Keyboard_Protocol = (uint8_t)(req->wValue);
break;
case HID_REQ_GET_PROTOCOL:
USBD_CtlSendData (pdev,(uint8_t *)&USBD_Keyboard_Protocol,1);
break;
case HID_REQ_SET_IDLE:
USBD_Keyboard_IdleState = (uint8_t)(req->wValue >> 8);
break;
case HID_REQ_GET_IDLE:
USBD_CtlSendData (pdev,(uint8_t *)&USBD_Keyboard_IdleState,1);
break;
default:
USBD_CtlError (pdev, req);
return USBD_FAIL;
}
break;
case USB_REQ_TYPE_STANDARD:
switch (req->bRequest)
{
case USB_REQ_GET_DESCRIPTOR:
if( req->wValue >> 8 == HID_REPORT_DESC)
{
len = MIN(KEYBOARD_DESC_LEN_REPORT , req->wLength);
USBD_CtlSendData (pdev,(uint8_t *)keyboard_report_desc,len);
}
else if( req->wValue >> 8 == HID_DESCRIPTOR_TYPE)
{
//#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
// pbuf = USBD_HID_Desc;
//#else
// pbuf = USBD_HID_CfgDesc + 0x12;
//#endif
pbuf = USBD_Composite_CfgDesc + 92;
len = MIN(USB_HID_DESC_SIZ , req->wLength);
USBD_CtlSendData (pdev,pbuf,len);
}
break;
case USB_REQ_GET_INTERFACE :
USBD_CtlSendData (pdev,(uint8_t *)&USBD_Keyboard_AltSet,1);
break;
case USB_REQ_SET_INTERFACE :
USBD_Keyboard_AltSet = (uint8_t)(req->wValue);
break;
}
}
}
代码仿真调试USBD_CtlSendData (pdev,(uint8_t *)keyboard_report_desc,len);时已经被执行了的,但是PC收不到这就非常的不解,
刚刚开始请求CDC是没有问题的,进行第二次请求Keyboard的报告描述符时PC收不到。软件带着FreeRTOS操作系统,下面是硬件中
断的配置参考的是ST官方的。
* @brief USB_OTG_BSP_EnableInterrupt
* Enabele USB Global interrupt
* @param None
* @retval None
*/
void USB_OTG_BSP_EnableInterrupt(USB_OTG_CORE_HANDLE *pdev)
{
#ifdef USE_USB_OTG_HS
HAL_NVIC_SetPriority(OTG_HS_IRQn, 3, 0);
HAL_NVIC_EnableIRQ(OTG_HS_IRQn);
#else
HAL_NVIC_SetPriority(OTG_FS_IRQn, 3, 0);
HAL_NVIC_EnableIRQ(OTG_HS_IRQn);
#endif
#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED
HAL_NVIC_SetPriority(OTG_HS_EP1_OUT_IRQn, 4, 0);
HAL_NVIC_EnableIRQ(OTG_HS_EP1_OUT_IRQn);
HAL_NVIC_SetPriority(OTG_HS_EP1_IN_IRQn, 4, 0);
HAL_NVIC_EnableIRQ(OTG_HS_EP1_IN_IRQn);
#endif
}
|
|