为单片机 USB HS 接口编写 WINUSB MS OS 2.0 例程,,当 wMaxPacketSize 设置为 128 或 256 时,,Windows 报错“无法识别的 USB 设备”。。
使用 usbpv 抓包结果如下,,可以看到系统获取设备描述符成功、设置地址成功、然后从新地址获取设备描述符和配置描述符也成功。。
但之后系统就不再继续后续步骤了,,而是从头重新上述步骤,,重复 4 次上述流程后,,彻底停止枚举。。

将 wMaxPacketSize 修改为 512 后,,可以正确枚举,,抓取结果如下:

我问 deepseek 为什么会这样,,它说 USB HS 下 Bulk 端点的 wMaxPacketSize 必须是 512,,我查了下 USB spec,,发现 spec 上确实是这样规定的:

但是之前编写 USB HS 接口的 U 盘例程时,,wMaxPacketSize 设置成了 128 却是可以正常枚举、正常工作的。。
所以 Windows 对不同类型的设备,,对 wMaxPacketSize 的约束有差异??
离线
USB HS 下 Bulk 端点的 wMaxPacketSize 按规范确实必须是 512,不是 128/256/512 可选。
FS Bulk 才允许 8/16/32/64;HS Bulk 是固定 512。
所以 WinUSB 这里不是因为 MS OS 2.0 特殊,而是配置描述符里 HS Bulk endpoint 的 wMaxPacketSize=128/256 本身就是不合规的。Windows 在拿到配置描述符后停止继续枚举,反复重试几次,这个现象也符合“描述符校验失败/配置不可用”的表现。
之前 U 盘例程里 wMaxPacketSize=128 还能工作,建议确认几件事:
当时设备是否真的跑在 High-Speed,而不是 Full-Speed;
抓包看到的 endpoint descriptor 是不是当前实际使用的 HS config;
是否存在 Device Qualifier / Other-Speed Configuration 描述符混淆;
Windows 的 Mass Storage 栈可能容忍了某些不规范描述符,但这不代表规范允许。
结论:HS Bulk endpoint 建议老老实实填 512。WinUSB 下更应该按规范来,否则 Windows 很可能直接拒绝配置。
离线