榨干STM32的USB - HS和FS同时使用

在之前免驱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

  • 0
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值