0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

HID+CDC复合设备在WIN10的识别问题

STM32单片机 来源:未知 作者:胡薇 2018-05-30 17:49 次阅读

1 问题现象

有客户使用STM32F405并参照ST官方USB标准库下的HID+CDC的示例代码做产品,发现在WIN7上使用得好好的,可放到WIN10上,CDC第一次能够识别,再次拔插后就不能再识别,且此后无论插拔多少次都无法再识别,除非再次上电,又会重复上述现象,只有板子上电后第一次才能正确被识别,后续均不行。

2 问题分析

客户使用 ST官方示例代码STM32_USB-Host-Device_Lib_V2.2.0\Project\USB_Device_Examples\Composite_Examples\CDC_HID_Composite当我尝试使用此示例代码重现客户所遇到的问题时,发现此代码在WIN7运行OK,但与客户不同的是,我测试到的情况是在WIN10下CDC一次都无法识别,HID却一直可以识别。

下面来分析下问题,既然WIN7下HID和CDC都能正常识别,放在WIN10上才不正常,那么初步可以判断,此问题可能与WIN10操作系统的USB主机驱动实现有关。

通过USB分析仪分析客户代码在WIN10下USB枚举异常的数据通讯:

Figure 1 第一次USB枚举过程

上图是客户代码第一次正常枚举的通讯数据,从图中可以看出,WIN10 USB主机在正常获取HID报告描述符后,紧接着会获取虚拟串口状态和设置波特率,这样就正常枚举结束了。我们再来看看采集到的异常USB枚举过程:

Figure 2 异常枚举过程

上图是WIN10下异常枚举过程。从图中可以看出,WIN10系统上USB主机在获取到设备描述符和配置描述符后直接将设备挂起了。很明显,WIN10系统的USB主机驱动实现对设备描述符或者配置描述符的内容并不认可,才会导致无法识别HID+CDC复合设备。

我们不妨检查下客户代码中的设备描述符:

Figure 3 获取的设备描述符

复合设备的class,subclass,protocol

必须为0xef,0x02,0x01,这里

VID=0x0483,PID=0x3256(Cube库下为0x5740,但这个不重要),接下来看配置描述符:

Figure 4 win10不能识别的配置描述符

由此可见,客户的描述符是HID interface + IAD + CDC interfaces结构。对于WIN7,这种结构可以识别,但对于WIN10,这种结构WIN10未必能够兼容,我们尝试在HID interface外部加上一层IAD结构,使其成为IAD1 + HID interface + IAD2 + CDC interfaces结构,此时客户的问题得以解决,在WIN10也可以正确识别了,修改后的描述符结构如下:

Figure 5 win10能够正确识别的配置描述符

结束本篇实战经验之前,让我们再次回顾IAD的概念:

IAD(Interface Association Descriptor),为USB设备定义了一个标准来表述捆绑在一个逻辑功能(比如这里的CDC虚拟串口)上的多个接口聚合的方法。USB协会分配了一个设备级别的类编码(即图3中0xEF),使用IAD的设备必须使用它(如图3的设备描述符);这样可以很容易在设备枚举时就能识别出采用了IAD的设备。IAD描述符通常放在它所要捆绑的多个接口的接口描述符之前。

3 结论

在WIN10系统中,建议复合设备每个逻辑功能的接口描述符前都搭载一个IAD描述符,不论这个逻辑功能是单个接口描述符完成(比如这里的HID功能)还是要由多个接口描述符完成(比如这里的CDC功能)。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • HID
    HID
    +关注

    关注

    2

    文章

    123

    浏览量

    46284
  • CDC
    CDC
    +关注

    关注

    0

    文章

    55

    浏览量

    17667
  • Win10
    +关注

    关注

    1

    文章

    709

    浏览量

    39428

原文标题:HID+CDC复合设备在WIN10的识别问题

文章出处:【微信号:STM32_STM8_MCU,微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    求助,关于USB复合设备HID+CDC串口问题求解

    分别写了CustomHID的键鼠代码、CDC代码测试均无问题,整合到一起后,插上电脑有时识别串口,有时识别HID,最终过不了几秒HID
    发表于 03-07 06:11

    基于win10系统的HID I2C设备开发

    基于win10系统的HID I2C设备开发,目前在网上很难找到实例,想做一个设备,类似鼠标可以win1
    发表于 10-23 15:50

    USB HID示例适用于WIN10

    我试着UVC上添加HID作为一个联机设备,但是Wi10USB 3.0接口上,HID
    发表于 01-04 14:24

    win10使用技巧有哪些 win10使用技巧分享

    win10常用技巧使用方法。一、我们升级win10系统后可能桌面只有垃圾站。1、右击桌面空白处,个性化2、点击主题,点击桌面图标设置,勾选系统图标就可以将其全部显示桌面啦二、想要切换输入法
    发表于 09-05 08:53

    Win10系统为什么会无法识别USB设备呢?如何去解决?

    Win10系统为什么会无法识别USB设备呢?怎样去处理这种情况?有什么方法吗?
    发表于 07-08 06:12

    基于stm32f107+CubeMx+Keil如何去实现HID+CDC组合设备

    ruhe使用stm32 cubemx配置生成CDCHID工程呢?基于stm32f107+CubeMx+Keil如何去实现HID+CDC组合设备呢?
    发表于 10-28 08:51

    怎么解决Win10系统无法识别USB设备的问题?

    怎么解决Win10系统无法识别USB设备的问题?
    发表于 11-01 07:42

    STM32F4使用USB复合设备HID+BULK+MSC无法启动是什么问题

    rtthread使用usb复合设备生成HID+BULK+MSC后,win10电脑端MSC无法启动,且根据MCU端点池分析端点也是够用的,想知道这个是RTT代码框架问题还是什么问题。
    发表于 10-27 10:59

    HIDCDC项目并到复合USB设备上时无法正常工作咋办

    我有两个独立的项目 HIDCDC 可以正常工作。但是当我想将两个项目合并到复合 USB 设备上时,HID 无法正常工作,卡住。只有
    发表于 12-28 10:19

    USB设备同时用作CDCHID时无法正常枚举怎么解决?

    使用RT thread stdio的时候,USB配置成了复合设备CDCHID设备)无法正常枚举设备
    发表于 08-20 16:41

    M480内核USB2.0 HID+CDC+MSC复用的case吗?

    请问各位大佬,M480内核,有USB2.0 HID+CDC+MSC复用的case吗,或者HID+CDC的case,谢谢了?
    发表于 08-25 07:25

    Win10 激活工具

    win10/win8激活工具
    发表于 02-07 16:14 50次下载

    win10电脑无法识别U盘应该如何解决

    解决win10电脑无法识别U盘的方法我们需要对症下药,导致win10无法识别U盘的原因有很多,U盘本身问题,电脑设置问题,BIOS设置问题,系统问题等等。下面,我就告诉大家
    的头像 发表于 12-07 11:55 1.4w次阅读

    HID_CDC复合设备WIN10识别问

    HID_CDC复合设备WIN10识别问题(电源技术发展综述)-本文以STM32F405为例,详细说明上
    发表于 08-04 18:23 20次下载
    <b class='flag-5'>HID_CDC</b><b class='flag-5'>复合</b><b class='flag-5'>设备</b>在<b class='flag-5'>WIN10</b>的<b class='flag-5'>识别问</b>题

    PICKIT3 WIN10无法识别问

    通过网上修改注册表的方式没有一点效果,后来发现跟系统可能有关系,换了一个新的WIN10系统就解决了解决方法:换新的win10操作系统,测试版本:win10专业版64位(10.0 19042),在运行输入dxdiag可以查看版本.
    发表于 11-16 20:36 4次下载
    PICKIT3 <b class='flag-5'>WIN10</b>无法<b class='flag-5'>识别问</b>题