不过还有一个问题,为什么设置Set_Report()键盘数字灯只是亮一下 就熄灭了 请问什么原因, buf[0]=LED_SCRL*4+LED_CAPS*2+LED_NUM; s=Set_Report(buf); //设置报表 if(s==USB_INT_SUCCESS) { printf("Set_Report success\n"); } else { printf("Set_Report Err=%02x\n",(unsigned short)s); //设置报告出错 //if(s&0x0f==USB_INT_RET_STALL) goto next_operate2; //返回STALL可能本身不支持 }
Set_Report命令紧接着得发个OUT命令,此时OUT对应的endp in addr=0,而不是endp in addr=1,点灯是对端点0操作的
怎么发送out命令,
HostCtrlTransfer374()这个函数仔细看
----------------------------------------------------------------------------------------------------- 我 按照你的代码修改的,可是 NUMlock 灯 还是亮一下就熄灭了了 我新建立一个HostCtrlTransfer374 函数 UINT8 HostCtrlTransfer374_1( PUINT8 ReqBuf, PUINT8 DatBuf, PUINT8 RetLen ) // 如果需要接收和发送数据,那么DatBuf需指向有效缓冲区用于存放后续数据,实际成功收发的总长度保存在ReqLen指向的字节变量中 { UINT8 s, len, count, total; BOOL tog; Write374Block( RAM_HOST_TRAN, 8, ReqBuf ); Write374Byte( REG_USB_LENGTH, 8 ); mDelayuS( 100 ); s = WaitHostTransact374( 0, DEF_USB_PID_SETUP, FALSE, 200 ); // SETUP阶段,200mS超时 if ( s == USB_INT_SUCCESS ) // SETUP成功 { tog = TRUE; // 默认DATA1,默认无数据故状态阶段为IN if((*(ReqBuf+3))==0x22) { total=*( ReqBuf + 6 )-0x40; } else total = *( ReqBuf + 6 ); if ( total && DatBuf ) // 需要收数据 { len = total; if ( *ReqBuf & 0x80 ) // 收 { while ( len ) { mDelayuS( 100 ); s = WaitHostTransact374( 0, DEF_USB_PID_OUT, tog, 200 ); // IN数据 if ( s != USB_INT_SUCCESS ) break; count = Read374Byte( REG_USB_LENGTH ); Read374Block( RAM_HOST_RECV, count, DatBuf ); DatBuf += count; if ( count <= len ) len -= count; else len = 0; if ( count & ( UsbDevEndpSize - 1 ) ) break; // 短包 tog = tog ? FALSE : TRUE; } tog = FALSE; // 状态阶段为OUT } else { // 发 while ( len ) { mDelayuS( 100 ); count = len >= UsbDevEndpSize ? UsbDevEndpSize : len; Write374Block( RAM_HOST_TRAN, count, DatBuf ); Write374Byte( REG_USB_H_PID, count ); s = WaitHostTransact374( 0, DEF_USB_PID_OUT, tog, 200 ); // OUT数据 if ( s != USB_INT_SUCCESS ) break; DatBuf += count; len -= count; tog = tog ? FALSE : TRUE; } tog = TRUE; // 状态阶段为IN } total -= len; // 减去剩余长度得实际传输长度 } // if ( s == USB_INT_SUCCESS ) // 数据阶段成功 // { // Write374Byte( REG_USB_LENGTH, 0 ); // mDelayuS( 100 ); // s = WaitHostTransact374( 0, ( tog ? DEF_USB_PID_IN : DEF_USB_PID_OUT ), TRUE, 200 ); // STATUS阶段 // if ( tog && s == USB_INT_SUCCESS ) // 检查IN状态返回数据长度 // { // if ( Read374Byte( REG_USB_LENGTH ) ) s = USB_INT_BUF_OVER; // 状态阶段错误 // } // } }
我每条语句都仔细看了 看不出什么不对
这个是让你看OUT在发set-report后怎么发OUT命令
我现在也遇到这样的问题了,CH374枚举USB键盘成功,但是获取按键值失败,键盘灯一直在闪。我接的是数字小键盘
这是串口接收到的数据
设备描述符:12 01 10 01 00 00 00 08 D5 05 89 06 03 01 00 01 00 01
设置USB设备地址0X02成功
获取配置描述符:
09 02 3B 00 02 01 00 A0 32 09 04 00 00 01 03 01 01 00 09 21 10 01 00 01 22 41 00 07 05 81 03 08 00 0A 09 04 01 00 01 03 00 00 00 09 21 10 01 00 01 22 32 00 07 05 82 03 05 00 0A
hid_des_leng=41
endp_in_addr=01
endp_out_addr=00
HID_Desc: 05 01 09 06 a1 01 05 07 19 e0 29 e7 15 00 25 01 95 08 75 01 81 02 95 08 75 01 81 01 05 08 19 01 29 03 95 03 75 01 91 02 95 01 75 05 91 01 05 07 19 00 2a ff 00 15 00 26 ff 00 95 06 75 08 81 00 c0
Set_Report success
这种小键盘
现在不知道问题出在那了,麻烦大神指点一下了,谢谢
HID设备一般还要发set_idle命令。数据包翻转是否出错,有的键盘在获取键值数据前会先发一个0包。可以用BUSHOUND抓一下包看看电脑是怎么完成的,模仿这个过程。
set_idle有设置,你有BUS HOUND吗?可以发一个给我吗个人信息保护,已隐藏,谢谢了