我现在用的是ch374T的主机模式来操作USB鼠标,通过和arm9单片机spi接口和374进行通信来和鼠标通信。程序用的是贵司提供的ch374_hid.c
现在MCU和ch374之间可以进行正常的通信。上电之后,24MHz的晶体能够正常其振,spi读取ch374内部寄存器0~64的内容和datasheet中规定默认值想吻合。设备描述,配制等到hid描述符都可以正常枚举,但是没有到了获得鼠标数据 next_operate2: // 下面开始读取数据 ( 实际在读取数据的时候,要先发送中断端点的令牌来读取数据,接着才能获取到数据 ) tog1=0; //开始取DATA0 while(1) { s=Interrupt_Data_Trans(buf); if(s==USB_INT_SUCCESS) { for(i=0;i!=8;i++) printf("%02x ",(unsigned short)buf[i]); printf("\n"); } else if(s==USB_INT_DISCONNECT) // 这个是为了知道设备拔出产生的中断状态 { close_bit_flag=1; break; } } 时候就不能获得鼠标的数据.程序一直在上面的while(1)中循环,接收不到鼠标的任何数据,即使换了几个鼠标也是如此(鼠标有移动). //串口输出的信息如下: Wait Device In Reset Device Start Low-Speed Device GetDeviceDescr: 12 01 10 01 00 00 00 08 d9 15 37 0a 00 01 00 01 00 01 address_status=14 09 02 22 00 09 02 22 00 01 01 00 a0 32 09 04 00 00 01 03 01 02 00 09 21 10 01 00 01 22 34 00 07 05 81 03 04 00 0a hid_des_leng=34 endp_in_addr=08 endp_out_addr=00 config_status=14 SetUsbConfig_success Set_Idle Set_idle success Get_Hid_Des HID_Desc: 05 01 09 02 a1 01 09 01 a1 00 05 09 19 01 29 03 15 00 25 01 95 03 75 01 81 02 95 01 75 05 81 01 05 01 09 30 09 31 09 38 15 80 25 7f 75 08 95 03 81 06 c0 c0
后来我为了验证PID_IN令牌,endp_in_addr端点地址等是否发送成功,就在HostTransact374中加了两个语句: ..... s = Read374Byte( REG_INTER_FLAG ); // 获取中断状态 printf("sa=%02x \n",(T_U16)s);//自己添加的 ...... Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_TRANSFER );//清中断标志 s = Read374Byte( REG_USB_STATUS ); // USB状态 r = s & BIT_STAT_DEV_RESP; // USB设备应答状态 printf("sb=%02x \n",(T_U16)s);//自己添加的
我主要在上述两处加了两个printf调试信息,其他的地方都没有改动.打印REG_INTER_FLAG和REG_USB_STATUS的寄存器的值.
//串口信息如下 HID_Desc: 05 01 09 02 a1 01 09 01 a1 00 05 09 19 01 29 03 15 00 25 01 95 03 75 01 81 02 95 01 75 05 81 01 05 01 09 30 09 31 09 38 15 80 25 7f 75 08 95 03 81 06 c0 c0 sa=f5 sb=80 sa=f5 sb=80 sa=f5 在枚举成功后HID_Desc,就无法收到鼠标的数据,REG_USB_STATUS=0x80,低四位为0.
后来出现了一个更奇怪的现象,我将鼠标拔出去,然后再插上,居然出现了下面的数据, sa=f5 sb=88 sa=f5 sb=93 d9 15 37 0a 05 01 09 02 sa=f5 sb=80 sa=f5 sb=9b a1 01 09 01 a1 00 05 09 sa=f5 sb=88 sa=f5 sb=93 19 01 29 03 15 00 25 01 sa=f5 sb=80 sa=f5 sb=9b 95 03 75 01 81 02 95 01 sa=f5 sb=88 sa=f5 sb=93 75 05 81 01 05 01 09 30 sa=f5 sb=80 sa=f5 sb=9b 09 31 09 38 15 80 25 7f sa=f5 sb=88 sa=f5 sb=93 75 08 95 03 81 06 c0 c0 sa=f5 sb=80 sa=f5 sb=9b 12 01 10 01 00 00 00 08 sa=f5 sb=88 sa=f5 sb=93 d9 15 37 0a 05 01 09 02 sa=f5 sb=80 sa=f5 sb=9b
仔细分析这些数据,他们是HID_Desc的内容,现在非常疑惑不知道哪里出了问题,请贵司的技术人员帮我分析一下,万分感激.