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 00 00 00 00 00 f9 ff ff Set_Report Set_Report success s:2a s:2a s:2a s:2a s:2a s:2a s:2a 以上是我串口的調試信息; 以下是我的代碼 請高人指點啊 HostSetBusFree( ); // 設定USB主機空閑 while ( 1 ) { if ( Query374Interrupt( ) ) HostDetectInterrupt( ); // 如果有USB主機中斷則處理 if ( Query374DeviceIn( ) ) break; // 有USB設備 } mDelaymS( 250 ); // 由于USB設備剛插入尚未穩(wěn)定,故等待USB設備數(shù)百毫秒,消除插拔抖動 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; // 設備已經斷開,繼續(xù)等待 } 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( 0x09 ); // 設置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設備拔出 }
// 分析配置描述符,獲取端點數(shù)據(jù)/各端點地址/各端點大小等,更新變量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類的協(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); // 獲取報表描述符描述符 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"); //對于鍵盤發(fā)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:
// 下面開始讀取數(shù)據(jù) ( 實際在讀取數(shù)據(jù)的時候,要先發(fā)送中斷端點的令牌來讀取數(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) // 這個是為了知道設備拔出產生的中斷狀態(tài) { 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 ); // 等待設備完全斷開,消除插拔抖動