CH374 USB键盘

Reset Device Start Low-Speed Device GetDeviceDescr: device_status=14 12 01 10 01 00 00 00 08 8F 0E 22 00 10 02 01 02 00 01 address_status=14 config_status=14 SetUsbConfig_success Set_Idle Set_idle success Get_Hid_Des HID_Desc: Set_Report Set_Report success s:2a s:042a s:2a s:042a 这是我的串口信息。总是接受s:2a 按键盘无反应 ,请问各位 我应该怎么样处理,现在脑袋有点乱 我使用的是 ch374t

难道 周六都去电影院看3d电源了么~!怎么没人理我


Reset Device Start Low-Speed Device GetDeviceDescr: device_status=14 12 01 10 01 00 00 00 08 8F 0E 22 00 10 02 01 02 00 01 address_status=14 09 02 3b 00 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 3E 00 07 05 81 03 08 00 0A 09 04 01 00 01 03 00 00 01 09 21 10 01 00 01 22 47 00 07 05 82 03 03 00 0A hid_des_leng=47 endp_in_addr=00 endp_out_addr=08 config_status=14 SetUsbConfig_success Set_Idle Set_idle success Get_Hid_Des HID_Desc: 05 01 09 06 a1 01 05 07 19 e0 29 e7 15 00 25 01 75 01 95 08 81 02 95 01 75 08 81 01 95 03 75 01 05 08 19 01 29 03 91 02 95 05 75 01 91 01 95 06 75 08 26 ff 00 05 07 19 00 29 91 81 00 c0 00 08 9a 10 00 08 00 00 00 Set_Report Set_Report success s:2a s:2a Reset Device Start Low-Speed Device GetDeviceDescr: device_status=14 12 01 10 01 00 00 00 08 3A 09 10 25 00 01 01 02 00 01 address_status=14 09 02 22 00 09 02 22 00 01 01 04 A0 32 09 04 00 00 01 03 01 02 00 09 21 11 01 00 01 22 3E 00 07 05 81 03 04 00 0A hid_des_leng=3e endp_in_addr=00 endp_out_addr=08 config_status=14 SetUsbConfig_success Set_Idle Set_Idle_Err=2e Get_Hid_Des HID_Desc: 05 01 09 02 a1 01 05 09 19 01 29 03 15 00 25 01 95 03 75 01 81 02 95 01 75 05 81 03 05 01 09 01 a1 00 09 30 09 31 15 81 25 7f 75 08 95 02 81 06 c0 09 38 15 81 25 7f 75 08 95 01 81 06 c0 Set_Report Set_Report Err=2e s:2e s:2e s:2e Reset Device Start Low-Speed Device GetDeviceDescr: device_status=14 12 01 10 01 00 00 00 08 8F 0E 22 00 10 02 01 02 00 01 address_status=14 09 02 3b 00 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 3E 00 07 05 81 03 08 00 0A 09 04 01 00 01 03 00 00 01 09 21 10 01 00 01 22 47 00 07 05 82 03 03 00 0A hid_des_leng=47 endp_in_addr=00 endp_out_addr=08 config_status=14 SetUsbConfig_success Set_Idle Set_idle success Get_Hid_Des HID_Desc: 05 01 09 06 a1 01 05 07 19 e0 29 e7 15 00 25 01 75 01 95 08 81 02 95 01 75 08 81 01 95 03 75 01 05 08 19 01 29 03 91 02 95 05 75 01 91 01 95 06 75 08 26 ff 00 05 07 19 00 29 91 81 00 c0 00 08 9a 10 00 08 00 00 00 Set_Report Set_Report success s:2a s:2a s:2a


不发Set_Report,试试


楼上的 问题依然存在


有人么


有没有发IN令牌,IN令牌所指向的端点号对不?把程序贴出来吧


UINT8 i, s,close_bit_flag=0; UINT8 buf[200]; //由于报告描述符大小不定,缓冲区的大小最好定义大些 // P1&=0xF8; // 如果在U盘文件读写模块上试用本程序必须加上本行 // AUXR |= 0x02; mDelaymS( 50 ); // 等待CH374复位完成 CH374_PORT_INIT( ); // CH374接口初始化 // mInitSTDIO( ); // 为了让计算机通过串口监控演示过程 for(i=0;i!=64;i++) { s=Read374Byte(i); printf("%02x ",(unsigned short)s); } printf("\n"); printf( "Start CH374 Host\n" ); Init374Host( ); // 初始化USB主机 while ( 1 ) { HostSetBusFree( ); // 设定USB主机空闲 while ( 1 ) { if ( Query374Interrupt( ) ) HostDetectInterrupt( ); // 如果有USB主机中断则处理 if ( Query374DeviceIn( ) ) break; // 有USB设备 } mDelaymS( 250 ); // 由于USB设备刚插入尚未稳定,故等待USB设备数百毫秒,消除插拔抖动 if ( Query374Interrupt( ) ) HostDetectInterrupt( ); // 如果有USB主机中断则处理

printf( "Reset Device\n" ); HostSetBusReset( ); // USB总线复位 for ( i = 0; i < 100; i ++ ) // 等待USB设备复位后重新连接 { if ( Query374DeviceIn( ) ) break; // 有USB设备 mDelaymS( 1 ); } if ( Query374Interrupt( ) ) HostDetectInterrupt( ); // 如果有USB主机中断则处理 if ( Query374DeviceIn( ) ) // 有USB设备 { if ( Query374DevFullSpeed( ) ) { printf( "Start Full-Speed Device\n" ); HostSetFullSpeed( ); // 检测到全速USB设备 } else { printf( "Start Low-Speed Device\n" ); HostSetLowSpeed( ); // 检测到低速USB设备 LOW_SPEED_BIT=1; } } else { continue; // 设备已经断开,继续等待 } mDelaymS( 50 ); close_bit_flag=0; printf( "GetDeviceDescr: " ); s = GetDeviceDescr( buf ); // 获取设备描述符 printf("device_status=%02x \n",(unsigned short)s); if ( s != USB_INT_SUCCESS ) { goto WaitDeviceOut; // 终止操作,等待USB设备拔出 } for ( i = 0; i < ( (PUSB_SETUP_REQ)SetupGetDevDescr ) -> wLengthL; i ++ ) printf( "%02X ", (UINT16)( buf[i] ) ); printf( "\n" ); s = SetUsbAddress( 0x02 ); // 设置USB设备地址 printf("address_status=%02x\n",(unsigned short)s); if ( s != USB_INT_SUCCESS ) { goto WaitDeviceOut; // 终止操作,等待USB设备拔出 } s = GetConfigDescr( buf ); // 获取配置描述符 printf("config_status=%02x\n",(unsigned short)s); if ( s != USB_INT_SUCCESS ) { goto WaitDeviceOut; // 终止操作,等待USB设备拔出 }

// 分析配置描述符,获取端点数据/各端点地址/各端点大小等,更新变量endp_addr和endp_size等 s = SetUsbConfig( ( (PUSB_CFG_DESCR)buf ) -> bConfigurationValue ); // 设置USB设备配置 if ( s != USB_INT_SUCCESS ) { // printf( "ERROR = %02X\n", (UINT16)s ); goto WaitDeviceOut; // 终止操作,等待USB设备拔出 } else printf( "SetUsbConfig_success\n" );

//-------------------------以下进行HID类的简单操作----------------------------------------------------------- printf("Set_Idle\n"); s=Set_Idle( ); //设置IDLE,这个步骤是按照HID类的协议来做的 if(s!=USB_INT_SUCCESS) { printf("Set_Idle_Err=%02x\n",(unsigned short)s); if(s&0x0f==USB_INT_RET_STALL) goto next_operate1; //返回STALL可能本身不支持 } else printf("Set_idle success\n"); next_operate1: printf("Get_Hid_Des\n"); s=Get_Hid_Des(buf); // 获取报表描述符描述符 if(s==USB_INT_SUCCESS) { printf("HID_Desc: "); for(i=0;i!=hid_des_leng;i++) printf("%02x ",(unsigned short)buf[i]); printf("\n"); } else { goto WaitDeviceOut; //出错退出 }

printf("Set_Report \n"); //对于键盘发Set_Report来点亮灯,对于鼠标则不需要这一步 buf[0]=0x01; //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可能本身不支持 } next_operate2:

// 下面开始读取数据 ( 实际在读取数据的时候,要先发送中断端点的令牌来读取数据,接着才能获取到数据 ) tog1=FALSE; //开始取DATA0 while(1) { s=Interrupt_Data_Trans(buf); printf("s:%x \n",(unsigned short)s); // for(i=0;i!=8;i++) printf("%02x ",(unsigned short)buf[i]); // printf("\n"); if(s==0x2a)//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; } } WaitDeviceOut: // 等待USB设备拔出 printf( "Wait Device Out\n" ); if(close_bit_flag==0){ while ( 1 ) { if ( Query374Interrupt( ) ) HostDetectInterrupt( ); // 如果有USB主机中断则处理 if ( Query374DeviceIn( ) == FALSE ) break; // 没有USB设备 } } mDelaymS( 100 ); // 等待设备完全断开,消除插拔抖动 }


这个问题之前出现过,可以参考http://wch.cn/bbs/View.asp?S=101&I=33394


endp_in_addr值为什么?你这个是个符合设备,接口0中断点1为键盘上传端点,接口1中断点2上鼠标上传端点


UINT8 endp_out_addr; // out端点地址,由于一般鼠标键盘不支持out端点,一般用不到 UINT8 endp_in_addr; // in 端点地址 UINT8 hid_des_leng; // HID类报告描述符的长度 UINT8 endp_num; // 数据 hid 类键盘、鼠标的端点数目 UINT8 UsbDevEndpSize = DEFAULT_ENDP0_SIZE; // USB设备的端点0的最大包尺寸 UINT8 FlagDeviceStatus; // 当前USB设备状态,通常用于中断方式的全局变量,本程序中未使用

这是程序中的 endp_in_addr这个变量是自己设置,还是hid设备描述的值


hid_des_leng=47 endp_in_addr=00 endp_out_addr=08 config_status=14


hid_des_leng=47 endp_in_addr=00 endp_out_addr=08 config_status=14 串口返回来的值


endp_in_addr是hid配置描述的值而确定,在你的这个设备中的要想读取键盘的值必须把endp_in_addr修改为1.还有您发IN令牌速度太快,大概每8毫秒发一次IN(Interrupt_Data_Trans)令牌包


感谢 WanJ,问题解决。 问题的主要原因就是 endp in addr 的地址不对 我一个建议 wch.cn 以后应该在在手册上 把大纲写明白,


不用谢, endp in addr 的值是根据配置描述的值而确定


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