1 问题现象4 n1 J7 h7 ^. z K 有一客户使用 STM32F405 参照 USB 标准库下的 HID+CDC 的示例代码做产品,发现在 WIN7 上使用得好好的,可放到WIN10 上,CDC 第一次能够识别,再次拔插后就不能再识别,且此后无论插拔多少次都无法再识别,除非再次上电,又会重复上述现象,只有板子上电后第一次才能正确被识别,后续均不行。1 M/ O- J! z& b- L. h, C9 I9 @/ o, h% A9 | 2 问题 分析) u* b6 E5 n% w3 s 客户使用 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 枚举异常的数据通讯:5 Q! t# b& w- f' W. m7 I! B% z 0 v! R9 u" } c6 M( O 上图是客户代码第一次正常枚举的通讯数据,从中可以看出,WIN10 USB 主机在正常获取 HID 报告描述符后,紧接着会获取 虚拟串口状态和设置波特率,这样就正常枚举结束了。接着继续采集异常 USB 枚举过程进行对比:. m/ @9 G$ A: b6 ?" z# e& | 4 ~5 L A1 `: R% [; z5 o# { 上图是 WIN10 下异常枚举过程。由上图可以看出,WIN10 系统上 USB 主机在获取到设备描述符和配置描述符后直接将设备挂起了。很明显,WIN10 操作系统的 USB 主机驱动实现对设备描述符或者配置描述符的内容并不认可,才会导致无法识别HID+CDC 复合设备。8 N, q/ B& s% B 于是,我们首先检查客户代码的设备描述符:' Q8 r/ d& c' Y& ~) D1 y9 L 复合设备的 class,subclass,protocol 必须为 0xef,0x02,0x01,这里 VID=0x0483,PID=0x3256(Cube 库下为 0x5740,但这个不重要),接下来看配置描述符: 由此可见,客户的描述符是 HID interface + IAD + CDC interfaces 结构。对于 WIN7,这种结构可以识别,但对于 WIN10,这种结构 WIN10 未必能够兼容,我们尝试在 HID interface 外部加上一层 IAD 结构,使其成为 IAD1 + HID interface + IAD2 +CDC interfaces 结构,此时客户的问题得以解决,在 WIN10 也可以正确识别了。 Y8 [ K5 `/ P" A & C2 o; D$ g+ Y. d4 h& K ...8 ^, e5 ?; M* o N# [4 V- g- O! _2 j - l1 n5 [! P$ m' L 了解更多,请下载后阅读 下载地址1>> 下载地址2>> 更多实战经验>> : b7 D7 b6 H. h) x9 N$ f . F% H" V/ t" ^9 [2 C4 y# Z |
大神,这么牛逼,能否方便参考下
我比他还早发现,算小神一个吧