请教各位使用CH374与IBM的USB鼠标连接为什么无法识别?

我使用厂家提供的示例代码,拿了一个三星USB鼠标、一个IBM USB鼠标进行测试。三星的鼠标完全可以通过枚举、进行正常中断传输。 只是IBM的鼠标如果调用Set_Report过程就根本无法进行中断传输。看CH374的REG_USB_STATUS寄存器低四位一直是0000。 如果根本不调用Set_Report则可以进行一次中断传输,然后就一直错误。看CH374的REG_USB_STATUS寄存器低四位一直是1000。 请教各位大哥指点一下!!!

你看下你的IBM的鼠标在计算机里面操作的时候,描述符帖出来看下,可能IBM的鼠标或者键盘是复合设备,我们这边测试的IBM的键盘就是复合设备,导致最后操作不正常


下面是我用bushound抓的: Bus Hound 5.00 capture. Complements of www.perisoft.net

IBM

Device - Device ID (followed by the endpoint for USB devices) (19) USB 人体学输入设备 (20) HID-compliant mouse (21) USB Composite Device (22) USB 人体学输入设备 (23) USB 人体学输入设备 (24) HID Keyboard Device (25) HID-compliant mouse Phase - Phase Type CTL USB control transfer DI Data in Data - Hex dump of the data transferred Descr - Description of the phase Cmd... - Position in the captured data Time - Time the phase occurred in hour:minute:second.millisec form

Device Phase Data Description Cmd.Phase.Ofs(rep) Time ------ ----- -------------------------------------------------- ---------------- ------------------ ------------ 19.0 CTL 80 06 00 01 00 00 12 00 GET DESCRIPTOR 1.1.0 02:45:53.230 19.0 DI 12 01 10 01 00 00 00 08 d9 15 37 0a 00 01 00 01 ..........7..... 1.2.0 02:45:53.236 00 01 .. 1.2.16 19.0 CTL 80 06 00 02 00 00 09 00 GET DESCRIPTOR 2.1.0 02:45:53.236 19.0 DI 09 02 22 00 01 01 00 a0 32 ..".....2 2.2.0 02:45:53.241 19.0 CTL 80 06 00 02 00 00 22 00 GET DESCRIPTOR 3.1.0 02:45:53.241 19.0 DI 09 02 22 00 01 01 00 a0 32 09 04 00 00 01 03 01 ..".....2....... 3.2.0 02:45:53.249 02 00 09 21 10 01 00 01 22 34 00 07 05 81 03 04 ...!...."4...... 3.2.16 00 0a .. 3.2.32 19.0 CTL 00 09 01 00 00 00 00 00 SET CONFIG 4.1.0 02:45:53.249 19.0 CTL 21 0a 00 00 00 00 00 00 SET IDLE 5.1.0 02:45:53.269 19.0 CTL 81 06 00 22 00 00 74 00 GET DESCRIPTOR 6.1.0 02:45:53.272 19.0 DI 05 01 09 02 a1 01 09 01 a1 00 05 09 19 01 29 03 ..............). 6.2.0 02:45:53.283 15 00 25 01 95 03 75 01 81 02 95 01 75 05 81 01 ..%...u.....u... 6.2.16 05 01 09 30 09 31 09 38 15 80 25 7f 75 08 95 03 ...0.1.8..%.u... 6.2.32 81 06 c0 c0 .... 6.2.48 19.1 DI 00 00 00 00 .... 7.1.0 02:45:53.305 19.1 DI 00 01 01 00 .... 8.1.0 02:45:53.313


我什么动作也不做,它会发送两次数据00 00 00 00和 00 01 01 00。 我的鼠标可以正确读取一次数据,然后就出错,我怀疑是下面的问题。 我看了下USB中断传输的协议,在中断传输的时候要经历这样的状态: (USB1.1 Figure 8-13. Interrupt Transaction Format) IDLE→IN TOKEN→DATA0/1→HAND SHAKE(ACK) 我在示例代码中没有看到成功读数后发送hand shake,会不会因为鼠标没有收到主机回复的ACK所以以后的传输都出错???


实际在374收到中断之后,已经给设备返回ACK了


只有登录才能回复,可以选择微信账号登录