在之前免驱WinUSB的基础上,再次升级一下,让HS和FS同时工作。
两个接口同时使用的配置与修改方法与前面讲的方法一致,需要注意以下几点:
1)工程配置时HS、FS接口设置为不同的PID,目的是为了让上位机识别时能区分,GUID可以相同也可以不同,只要上位机能区分出HS和FS即可,如本示例所示的HS的PID为0xABCE,FS的PID为0xABCD,其他配置不变。
2)修改usbd_desc.c文件时,USB描述结构体HS和FS的 _Desc中都增加特征描述符、扩展属性描述符函数定义,因为都是WinUSB设备,所以描述是一样的:
USBD_DescriptorsTypeDef FS_Desc =
{
USBD_FS_DeviceDescriptor
, USBD_FS_LangIDStrDescriptor
, USBD_FS_ManufacturerStrDescriptor
, USBD_FS_ProductStrDescriptor
, USBD_FS_SerialStrDescriptor
, USBD_FS_ConfigStrDescriptor
, USBD_FS_InterfaceStrDescriptor
//--------ADD GUOXUAN-----------
, USBD_WinUSBOSFeatureDescriptor
, USBD_WinUSBOSPropertyDescriptor
//------------------------------
};
USBD_DescriptorsTypeDef HS_Desc =
{
USBD_HS_DeviceDescriptor
, USBD_HS_LangIDStrDescriptor
, USBD_HS_ManufacturerStrDescriptor
, USBD_HS_ProductStrDescriptor
, USBD_HS_SerialStrDescriptor
, USBD_HS_ConfigStrDescriptor
, USBD_HS_InterfaceStrDescriptor
#if (USBD_LPM_ENABLED == 1)
, USBD_HS_USR_BOSDescriptor
#endif /* (USBD_LPM_ENABLED == 1) */
//--------ADD GUOXUAN-----------
, USBD_WinUSBOSFeatureDescriptor
, USBD_WinUSBOSPropertyDescriptor
//------------------------------
};
3)USBD_FS_DeviceDesc、USBD_HS_DeviceDesc中的bDeviceClass、bDeviceSubClass值都改为0x00:
0x00, /*bDeviceClass*/ //----CHANGE GUOXUAN-----
0x00, /*bDeviceSubClass*/ //----CHANGE GUOXUAN-----
4)与上位机通信需要分别对接收函数数CDC_Receive_HS、CDC_Receive_FS进行处理,发送函数同理区别对待:
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
/* USER CODE BEGIN 6 */
//-------------ADD GUOXUAN--------------------
memcpy(usbfs_rx, Buf, *Len);
usbfs_rxne = SET;
//--------------------------------------------
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
return (USBD_OK);
/* USER CODE END 6 */
}
//...省略...
static int8_t CDC_Receive_HS(uint8_t* Buf, uint32_t *Len)
{
/* USER CODE BEGIN 11 */
//-------------ADD GUOXUAN--------------------
memcpy(usbhs_rx, Buf, *Len);
usbhs_rxne = SET;
//--------------------------------------------
USBD_CDC_SetRxBuffer(&hUsbDeviceHS, &Buf[0]);
USBD_CDC_ReceivePacket(&hUsbDeviceHS);
return (USBD_OK);
/* USER CODE END 11 */
}
5)最后数据收发也同样分别处理
//------------ADD GUOXUAN-------------------
void WinUSB_Receive()
{
uint16_t i = 0;
if (usbfs_rxne == SET)
{
i = usbfs_rx[0] + (usbfs_rx[1]<<8);
CDC_Transmit_FS(usbfs_tx, i);
usbfs_rxne = RESET;
}
if (usbhs_rxne == SET)
{
i = usbhs_rx[0] + (usbhs_rx[1]<<8);
CDC_Transmit_HS(usbhs_tx, i);
usbhs_rxne = RESET;
}
}
//------------------------------------------
改好后成功枚举出两个WinUSB免驱设备
6)测试
上位机启动会识别出两个USB:
运行两个上位机进行测试:
这里有bin文件和上位机:
链接:https://pan.baidu.com/s/1kmtxSDCCwQYoSbYO-BsW-w 提取码:e9rt