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 這是我的串口信息??偸墙邮躶:2a 按鍵盤無反應(yīng) ,請(qǐng)問各位 我應(yīng)該怎么樣處理,現(xiàn)在腦袋有點(diǎn)亂 我使用的是 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
不發(fā)Set_Report,試試
樓上的 問題依然存在
有人么
有沒有發(fā)IN令牌,IN令牌所指向的端點(diǎn)號(hào)對(duì)不?把程序貼出來吧
UINT8 i, s,close_bit_flag=0; UINT8 buf[200]; //由于報(bào)告描述符大小不定,緩沖區(qū)的大小最好定義大些 // P1&=0xF8; // 如果在U盤文件讀寫模塊上試用本程序必須加上本行 // AUXR |= 0x02; mDelaymS( 50 ); // 等待CH374復(fù)位完成 CH374_PORT_INIT( ); // CH374接口初始化 // mInitSTDIO( ); // 為了讓計(jì)算機(jī)通過串口監(jiān)控演示過程 for(i=0;i!=64;i++) { s=Read374Byte(i); printf("%02x ",(unsigned short)s); } printf("\n"); printf( "Start CH374 Host\n" ); Init374Host( ); // 初始化USB主機(jī) while ( 1 ) { HostSetBusFree( ); // 設(shè)定USB主機(jī)空閑 while ( 1 ) { if ( Query374Interrupt( ) ) HostDetectInterrupt( ); // 如果有USB主機(jī)中斷則處理 if ( Query374DeviceIn( ) ) break; // 有USB設(shè)備 } mDelaymS( 250 ); // 由于USB設(shè)備剛插入尚未穩(wěn)定,故等待USB設(shè)備數(shù)百毫秒,消除插拔抖動(dòng) if ( Query374Interrupt( ) ) HostDetectInterrupt( ); // 如果有USB主機(jī)中斷則處理
printf( "Reset Device\n" ); HostSetBusReset( ); // USB總線復(fù)位 for ( i = 0; i < 100; i ++ ) // 等待USB設(shè)備復(fù)位后重新連接 { if ( Query374DeviceIn( ) ) break; // 有USB設(shè)備 mDelaymS( 1 ); } if ( Query374Interrupt( ) ) HostDetectInterrupt( ); // 如果有USB主機(jī)中斷則處理 if ( Query374DeviceIn( ) ) // 有USB設(shè)備 { if ( Query374DevFullSpeed( ) ) { printf( "Start Full-Speed Device\n" ); HostSetFullSpeed( ); // 檢測(cè)到全速USB設(shè)備 } else { printf( "Start Low-Speed Device\n" ); HostSetLowSpeed( ); // 檢測(cè)到低速USB設(shè)備 LOW_SPEED_BIT=1; } } else { continue; // 設(shè)備已經(jīng)斷開,繼續(xù)等待 } mDelaymS( 50 ); close_bit_flag=0; printf( "GetDeviceDescr: " ); s = GetDeviceDescr( buf ); // 獲取設(shè)備描述符 printf("device_status=%02x \n",(unsigned short)s); if ( s != USB_INT_SUCCESS ) { goto WaitDeviceOut; // 終止操作,等待USB設(shè)備拔出 } for ( i = 0; i < ( (PUSB_SETUP_REQ)SetupGetDevDescr ) -> wLengthL; i ++ ) printf( "%02X ", (UINT16)( buf[i] ) ); printf( "\n" ); s = SetUsbAddress( 0x02 ); // 設(shè)置USB設(shè)備地址 printf("address_status=%02x\n",(unsigned short)s); if ( s != USB_INT_SUCCESS ) { goto WaitDeviceOut; // 終止操作,等待USB設(shè)備拔出 } s = GetConfigDescr( buf ); // 獲取配置描述符 printf("config_status=%02x\n",(unsigned short)s); if ( s != USB_INT_SUCCESS ) { goto WaitDeviceOut; // 終止操作,等待USB設(shè)備拔出 }
// 分析配置描述符,獲取端點(diǎn)數(shù)據(jù)/各端點(diǎn)地址/各端點(diǎn)大小等,更新變量endp_addr和endp_size等 s = SetUsbConfig( ( (PUSB_CFG_DESCR)buf ) -> bConfigurationValue ); // 設(shè)置USB設(shè)備配置 if ( s != USB_INT_SUCCESS ) { // printf( "ERROR = %02X\n", (UINT16)s ); goto WaitDeviceOut; // 終止操作,等待USB設(shè)備拔出 } else printf( "SetUsbConfig_success\n" );
//-------------------------以下進(jìn)行HID類的簡(jiǎn)單操作----------------------------------------------------------- printf("Set_Idle\n"); s=Set_Idle( ); //設(shè)置IDLE,這個(gè)步驟是按照HID類的協(xié)議來做的 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); // 獲取報(bào)表描述符描述符 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; //出錯(cuò)退出 }
printf("Set_Report \n"); //對(duì)于鍵盤發(fā)Set_Report來點(diǎn)亮燈,對(duì)于鼠標(biāo)則不需要這一步 buf[0]=0x01; //buf[0]=LED_SCRL*4+LED_CAPS*2+LED_NUM; s=Set_Report(buf); //設(shè)置報(bào)表 if(s==USB_INT_SUCCESS) { printf("Set_Report success\n"); } else { printf("Set_Report Err=%02x\n",(unsigned short)s); //設(shè)置報(bào)告出錯(cuò) if(s&0x0f==USB_INT_RET_STALL) goto next_operate2; //返回STALL可能本身不支持 } next_operate2:
// 下面開始讀取數(shù)據(jù) ( 實(shí)際在讀取數(shù)據(jù)的時(shí)候,要先發(fā)送中斷端點(diǎn)的令牌來讀取數(shù)據(jù),接著才能獲取到數(shù)據(jù) ) 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) // 這個(gè)是為了知道設(shè)備拔出產(chǎn)生的中斷狀態(tài) { close_bit_flag=1; break; } } WaitDeviceOut: // 等待USB設(shè)備拔出 printf( "Wait Device Out\n" ); if(close_bit_flag==0){ while ( 1 ) { if ( Query374Interrupt( ) ) HostDetectInterrupt( ); // 如果有USB主機(jī)中斷則處理 if ( Query374DeviceIn( ) == FALSE ) break; // 沒有USB設(shè)備 } } mDelaymS( 100 ); // 等待設(shè)備完全斷開,消除插拔抖動(dòng) }
這個(gè)問題之前出現(xiàn)過,可以參考http://wch.cn/bbs/View.asp?S=101&I=33394
endp_in_addr值為什么?你這個(gè)是個(gè)符合設(shè)備,接口0中斷點(diǎn)1為鍵盤上傳端點(diǎn),接口1中斷點(diǎn)2上鼠標(biāo)上傳端點(diǎn)
UINT8 endp_out_addr; // out端點(diǎn)地址,由于一般鼠標(biāo)鍵盤不支持out端點(diǎn),一般用不到 UINT8 endp_in_addr; // in 端點(diǎn)地址 UINT8 hid_des_leng; // HID類報(bào)告描述符的長(zhǎng)度 UINT8 endp_num; // 數(shù)據(jù) hid 類鍵盤、鼠標(biāo)的端點(diǎn)數(shù)目 UINT8 UsbDevEndpSize = DEFAULT_ENDP0_SIZE; // USB設(shè)備的端點(diǎn)0的最大包尺寸 UINT8 FlagDeviceStatus; // 當(dāng)前USB設(shè)備狀態(tài),通常用于中斷方式的全局變量,本程序中未使用
這是程序中的 endp_in_addr這個(gè)變量是自己設(shè)置,還是hid設(shè)備描述的值
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配置描述的值而確定,在你的這個(gè)設(shè)備中的要想讀取鍵盤的值必須把endp_in_addr修改為1.還有您發(fā)IN令牌速度太快,大概每8毫秒發(fā)一次IN(Interrupt_Data_Trans)令牌包
感謝 WanJ,問題解決。 問題的主要原因就是 endp in addr 的地址不對(duì) 我一個(gè)建議 wch.cn 以后應(yīng)該在在手冊(cè)上 把大綱寫明白,
不用謝, endp in addr 的值是根據(jù)配置描述的值而確定