問題描述:按照CH375的控制打印機(jī)歷程,進(jìn)行CH376(使用的是CH376芯片)初始化,連接一個(gè)USB設(shè)備。進(jìn)入枚舉階段,手動(dòng)模擬事務(wù)處理,獲取設(shè)備描述符,但始終返回0長(zhǎng)度,且狀態(tài)階段的發(fā)送失敗。
定義:unsigned char buffer[64]; 初始化函數(shù)中的init_print()里面就直接調(diào)用cmd1();
unsigned char cmd1(void) { unsigned char len,total_len = 0,status = 0xff; unsigned char *p; buffer[0]=0x80; buffer[1]=0x06; buffer[2]=0x00; buffer[3]=0x01; buffer[4]=0x00; buffer[5]=0x00; buffer[6]=0x12; buffer[7]=0x00;/*設(shè)備描述符*/ wr_usb_data( 8, buffer ); /* SETUP數(shù)據(jù)總是8字節(jié) */ //toggle_send(0); if ( issue_token_X( ( 0 << 4 ) | DEF_USB_PID_SETUP, 0x00 )==USB_INT_SUCCESS ) { /* SETUP階段DATA0操作成功 */ //p = buffer; //toggle_recv(1); if( (status = issue_token_X( ( 0 << 4 ) | DEF_USB_PID_IN, 0x80 ))==USB_INT_SUCCESS ) { /* DATA階段DATA1接收操作成功 */ len = rd_usb_data( buffer ); /* 讀出接收到的數(shù)據(jù) */ wr_usb_data( 0, buffer ); /* 發(fā)送0長(zhǎng)度的數(shù)據(jù)DATA1說明控制傳輸成功 */ //toggle_send(1); if ( issue_token_X( ( 0 << 4 ) | DEF_USB_PID_OUT, 0x40 )==USB_INT_SUCCESS ) return( buffer[0] ); } } return 0xff;/*錯(cuò)誤返回*/ }
void test_barcodescanner(void) { unsigned char xdata data_to_send[200]; /* 緩沖區(qū) */ unsigned char str_to_print[]="OK, support text print\n"; unsigned char s; mDelaymS( 200 ); set_usb_mode( 6 ); /* 設(shè)置USB主機(jī)模式 */
s = CH376DiskConnect(); if(s != USB_INT_SUCCESS) return; /* 等待USB打印機(jī)連接上來 */
/* 如果設(shè)備端是CH341轉(zhuǎn)打印口或者是CH37X,那么以下步驟是可選的,如果是其它USB芯片,那么可能需要執(zhí)行以下步驟 */ #define USB_RESET_FIRST 1 /* USB規(guī)范中未要求在USB設(shè)備插入后必須復(fù)位該設(shè)備,但是計(jì)算機(jī)的WINDOWS總是這樣做, 所以有些USB設(shè)備也要求在插入后必須先復(fù)位才能工作 */ #ifdef USB_RESET_FIRST set_usb_mode( 7 ); /* 復(fù)位USB設(shè)備,CH375向USB信號(hào)線的D+和D-輸出低電平 */ /* 如果單片機(jī)對(duì)CH375的INT#引腳采用中斷方式而不是查詢方式,那么應(yīng)該在復(fù)制USB設(shè)備期間禁止CH375中斷,在USB設(shè)備 復(fù)位完成后清除CH375中斷標(biāo)志再允許中斷 */ mDelaymS( 10 ); /* 復(fù)位時(shí)間不少于1mS,建議為10mS */ set_usb_mode( 6 ); /* 結(jié)束復(fù)位 */ mDelaymS( 100 ); while ( wait_interrupt()!=USB_INT_CONNECT ); /* 等待復(fù)位之后的設(shè)備端再次連接上來 */ #endif
mDelaymS( 200 ); /* 有些USB設(shè)備要等待數(shù)百毫秒才能正常工作 */ if ( init_print()!=USB_INT_SUCCESS ) ;//while(1); // 錯(cuò)誤 // mDelaymS(200);//延時(shí)測(cè)試用 mDelaymS(200); mDelaymS(200); mDelaymS(200); mDelaymS(200); }