你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
zero99 发布时间:2018-3-27 11:57
1  问题现象3 X" C: t* L2 q4 L1 M9 s
有一客户使用 STM32F405 参照 USB 标准库下的 HID+CDC 的示例代码做产品,发现在 WIN7 上使用得好好的,可放到WIN10 上,CDC 第一次能够识别,再次拔插后就不能再识别,且此后无论插拔多少次都无法再识别,除非再次上电,又会重复上述现象,只有板子上电后第一次才能正确被识别,后续均不行。
% z. z. J6 @1 [2 \: t8 Y7 Y+ s: _. ]1 J/ @/ Y" A/ a+ E4 M: {
2  问题 分析  J  d; F! n6 j7 V3 B
客户使用 ST 官方示例代码 STM32_USB-Host-Device_Lib_V2.2.0\Project\USB_Device_Examples\Composite_Examples\CDC_HID_Composite 。当我尝试使用此示例代码重现客户所遇到的问题时,发现此代码在 WIN7 运行 OK,但与客户不同的是,我测试到的情况是在 WIN10 下 CDC 一次都无法识
" {4 J/ j4 g, R别,HID 却一直可以识别。
* j* D1 z. n- {1 B: {下面来分析下问题,既然 WIN7 下 HID 和 CDC 都能正常识别,放在 WIN10 上才不正常,那么初步可以判断,此问题应该与 WIN10 操作系统的 USB 主机驱动实现有关。通过 USB 分析仪分析客户代码在 WIN10 下 USB 枚举异常的数据通讯:
$ N( W, I, ~+ Y* o0 v- f1 j8 Q, `0 h0 z 41.png : |% }1 x5 s7 M0 l3 @* f: y

# i4 {  \+ ?% Q2 ~: x上图是客户代码第一次正常枚举的通讯数据,从中可以看出,WIN10 USB 主机在正常获取 HID 报告描述符后,紧接着会获取
1 l1 T: t: [  m) |: w# }/ E虚拟串口状态和设置波特率,这样就正常枚举结束了。接着继续采集异常 USB 枚举过程进行对比:# e1 b, N2 K2 A. G  O% c7 U
42.png 5 ]9 q. \7 ~5 t0 I8 Y1 X
" W# h8 C7 _) S+ _* i4 B
上图是 WIN10 下异常枚举过程。由上图可以看出,WIN10 系统上 USB 主机在获取到设备描述符和配置描述符后直接将设备挂起了。很明显,WIN10 操作系统的 USB 主机驱动实现对设备描述符或者配置描述符的内容并不认可,才会导致无法识别HID+CDC 复合设备。
- e+ t5 ^% W8 R于是,我们首先检查客户代码的设备描述符:, I4 `6 ^( T* R; i( f- Q
43.png
5 n+ @* m9 w( Y  g4 g6 L% C
5 U3 s% j6 @* c复合设备的 class,subclass,protocol 必须为 0xef,0x02,0x01,这里 VID=0x0483,PID=0x3256(Cube 库下为 0x5740,但这个不重要),接下来看配置描述符:
$ W# G. j! R8 W! b; v 44.png ; P1 L% g. Q. b+ s# d$ `% l
, S8 h  u: {! L
由此可见,客户的描述符是 HID interface + IAD + CDC interfaces 结构。对于 WIN7,这种结构可以识别,但对于 WIN10,这种结构 WIN10 未必能够兼容,我们尝试在 HID interface 外部加上一层 IAD 结构,使其成为 IAD1 + HID interface + IAD2 +CDC interfaces 结构,此时客户的问题得以解决,在 WIN10 也可以正确识别了。
7 S7 [( p' y" r/ z& r
/ P1 _( b; H; p...# N0 [1 ^% O! ?' y: F$ }6 W
8 O3 D) u$ y3 e* t
了解更多,请下载后阅读6 R3 t  Q' I: p- ]
下载地址1>>         下载地址2>>       更多实战经验>>
0 Q# m2 T8 m5 k1 a$ a2 u. D0 z1 n! u/ v+ R" g( l+ x& A* _* I. {9 g; C8 c

' A& Y/ n0 O0 A
收藏 评论4 发布时间:2018-3-27 11:57

举报

4个回答
maxtch 回答时间:2018-3-28 01:07:53
这个问题我倒是早就发现了。参考我的 DAP42 源代码,现在是 CDC+HID,后面只要空间允许(不用 Cube 空出不少 Flash)还打算加入 MSC。
群星闪烁 回答时间:2018-3-28 19:14:01
maxtch 发表于 2018-3-28 01:07
! c: o$ @0 S# L4 w. |' Q0 ~这个问题我倒是早就发现了。参考我的 DAP42 源代码,现在是 CDC+HID,后面只要空间允许(不用 Cube 空出不 ...
3 H# c% d% h1 n
大神,这么牛逼,能否方便参考下
lanmanck 回答时间:2019-1-8 15:14:59
15616384352 发表于 2018-3-28 19:14
6 o3 k# _# A& f3 S大神,这么牛逼,能否方便参考下

* ^  Z- _- t4 r) `我比他还早发现,算小神一个吧
zgr110064 回答时间:2019-1-10 10:40:23
看看

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版