這是兩種方式,第一種是采用CH375內(nèi)置固件模式,第二種是外置固件模式,功能是一樣的,返回0x2e說明命令錯誤,或者端點(diǎn)地址錯誤。
第一種是外部固件方式,也可以用這種方式,因?yàn)楹竺嬉@取HID報表描述符,長度比較大。 內(nèi)部固件模式只能獲取不超過64字節(jié)的描述符。超過64字節(jié)則返回緩沖區(qū)溢出,需要用外部固件模式來做。
謝謝樓上各位的解答,但是我還是不明白為什么會出現(xiàn)返回錯誤!得到外設(shè)描述符的子程序如下: /************************************* //函數(shù)名稱:Get_Descr_Ex //函數(shù)功能:得到外設(shè)描述符 //入口:無 //出口:0 or 1 //備注: ***************************************/ INT8U Get_Descr_Ex(void) { INT8U descr_len; INT8U *p=Data_Buf; Endp7_Mode=0x80; Toggle_Send(); Wr_Usb_Data(8,Request.Req_buf); Issue_Token(( 0 << 4 ) | DEF_USB_PID_SETUP); Status=Wait_Interrupt(); if(Status==USB_INT_SUCCESS)// SETUP階段操作成功 { Endp6_Mode=0xc0; Toggle_Recv(); } else return(0); Issue_Token(( 0 << 4 ) | DEF_USB_PID_IN); Status=Wait_Interrupt(); if(Status==USB_INT_SUCCESS)// DATA階段操作成功 { if(Flag_Config_2) descr_len=Data_Buf[2]-Rd_Usb_Data(Data_Buf); else descr_len=Data_Buf[0]-Rd_Usb_Data(Data_Buf); while(descr_len>0) { Toggle_Recv(); p+=0x08; Issue_Token(( 0 << 4 ) | DEF_USB_PID_IN); Status=Wait_Interrupt(); if(Status==USB_INT_SUCCESS) // DATA階段操作成功 descr_len-=Rd_Usb_Data(p); else return(0); } } else return(0); Endp7_Mode=0xc0; Toggle_Send(); Wr_Usb_Data(0,Request.Req_buf); Issue_Token(( 0 << 4 ) | DEF_USB_PID_OUT); Status=Wait_Interrupt(); if(Status==USB_INT_SUCCESS)// 狀態(tài)階段操作成功 return(1); else return(0); }
其中請求包在開始調(diào)用此函數(shù)前被設(shè)為: Request.Req.bmRequestType=0x80; //獲取設(shè)備描述符 Request.Req.bRequest=0x06; Request.Req.wValue=0x0001; Request.Req.wIndex=0x0000; Request.Req.wLength=0x1200; 我在實(shí)驗(yàn)的的時候,第一次發(fā)出SETUP令牌返回的是正確的,即0x14,但是接下來的數(shù)據(jù)階段,發(fā)出IN令牌后,返回就不正確了,返回始終是0x2E,不知道這是什么原因!還望會的給予解答,先行謝過了!
你用的是什么單片機(jī)?注意大小端的問題改用下面的方式試試 GetDevDescr[8] = { 0X80,0X06,0X00,0X01,0X00,0X00,0X12,0X00 };
TO:_study_ { M } 我用的是MSP430,這個問題我考慮過,Request.Req.wLength=0x1200;我改為了Request.Req.wLength=0x0012后錯誤依舊!您幫我看看18樓的程序是否正確吧,其實(shí)大部分都是貴公司例程里的,我只是稍作了修改,一些基本的讀寫函數(shù)是沒問題的,就是控制傳輸?shù)臄?shù)據(jù)階段總是失敗!您能幫我分析分析是什么么原因嗎?另外程序中有將CH375B設(shè)為低速模式的子程序,具體如下: void Set_Freq(void) { Ch375_Wr_Cmd_Port(0x0b); // 切換使375B進(jìn)入低速模式 Ch375_Wr_Dat_Port(0x17); Ch375_Wr_Dat_Port(0xd8); } 這里的幾個命令和數(shù)據(jù)為什么要這樣寫?
操作鼠標(biāo)鍵盤之前把CH375設(shè)置成低速模式,按照這樣寫就可以了,設(shè)備連接之后測試一下D+,D-上面的電壓
七畫 { M } 等級:3 發(fā)表:1 回復(fù):13 注冊時間:2010-4-2 發(fā)表于:2010-5-12 5:24:00,來源于:58.19.57.210 ,發(fā)貼心情: ----------------------------------------------------------------------------------------------------- TO:_study_ { M } 如果正常,電壓應(yīng)該是多少呢?我芯片是3.3V供電的,另外D+、D-需要反接嗎?我用CH375B,謝謝
我也碰到各樓主同樣的問題,D7始終都是為1,一直沒找到原因,請問樓主是怎么樣解決的。
如果采用的芯片是CH375B的話,只需要設(shè)置成低速模式就可以了。而對于全速設(shè)備是不需要設(shè)置低速模式的,至于怎么確認(rèn)是全速設(shè)備還是低速設(shè)備,建議你把USB設(shè)備插到USB口上面去,用萬用表測試下,UD+為3.3V左右,UD-在0V左右,是全速設(shè)備,反之則為低速設(shè)備。
那你看一下在讀取數(shù)據(jù)的時候A0是不是為0,如果為A0為1則會出現(xiàn)你說的情況
謝謝!是全速設(shè)備,讀數(shù)據(jù)時測得A0是為高電平
這樣就不對了,讀數(shù)據(jù)的時候A0一定要為0
在獲取芯片及固件版本的值是為B7 發(fā)測試數(shù)據(jù)55,返回的值是AA, FF時則返回80,在設(shè)置USB模式時返回的值又是正確的0x51,為什么會這樣呢?
麻煩大家看看, unsigned char CH375_Read() //讀數(shù)據(jù) { unsigned char Temp; DATA_PORT = 0xFF; //51單片機(jī)IO作輸入,先置高 CH375_CS = 0; //打開片選 CH375_A0 = 0; //數(shù)據(jù)模式 CH375_RD = 0; //打開讀使能 Delay(3); //稍作延時 Temp = DATA_PORT; //讀取端口上的數(shù)據(jù) CH375_RD = 1; //關(guān)閉讀使能 CH375_CS = 1; //關(guān)閉片選 CH375_A0 = 1; //恢復(fù)A0為高電平 return Temp; //返回讀到的值 }
unsigned char CH375_Wait_Int() //等待中斷信號,即INT引腳上產(chǎn)生低電平,并獲取中斷狀態(tài)碼,獲取后INT恢復(fù)高電平,以產(chǎn)生下一次中斷信號 { unsigned char Temp; CH375_INT = 1; //IO作輸入先置高 while(CH375_INT); //等待中斷 CH375_Write_Cmd(CMD_GET_STATUS); //產(chǎn)生操作完成中斷,獲取中斷狀態(tài) Temp = CH375_Read_Dat(); CH375_INT = 1; return (Temp); }
unsigned char CH375_Init() { unsigned char i=0,Test; CH375_Write_Cmd(CMD_GET_IC_VER); // 獲取芯片及固件版本 正常為0xB7 UART_SendStr("CH375固件版本:"); i = CH375_Read_Dat(); // 版本 UART_SendHex(i); UART_SendEnter();
CH375_Write_Cmd(CMD_CHECK_EXIST); CH375_Write_Dat(0x55); Test = CH375_Read_Dat(); UART_SendHex(Test); UART_SendEnter();
CH375_Write_Cmd(CMD_CHECK_EXIST); CH375_Write_Dat(0xFF); Test = CH375_Read_Dat(); UART_SendHex(Test); UART_SendEnter();
CH375_Write_Cmd(CMD_SET_USB_MODE); // 設(shè)置USB工作模式 CH375_Write_Dat(6);
for(i=0;i<250;i++) { Delay(10); if(CH375_Read_Dat()==CMD_RET_SUCCESS ) { UART_SendStr("操作成功...\r\n"); return 0; // 操作成功 } }
return 1; }
unsigned char CH375_InitDisk() { unsigned char status,i,j=0; status = CH375_Wait_Int(); UART_SendStr("Wait_Int...\r\n"); UART_SendHex(status); if(status==USB_INT_DISCONNECT) return 1; // USB設(shè)備斷開
while(1) { CH375_Write_Cmd(CMD_DISK_INIT); // 初始化USB存儲器 status = CH375_Wait_Int(); // 等待中斷并獲取狀態(tài) UART_SendStr("Debug...1\r\n"); UART_SendHex(status); if(status==USB_INT_SUCCESS) break; } UART_SendStr("Debug...\r\n"); while(1) { j++; CH375_Write_Cmd(CMD_DISK_SIZE); // 獲取USB存儲器的容量 status=CH375_Wait_Int(); // 等待中斷并獲取狀態(tài) if(status==USB_INT_SUCCESS) break; else { Delay(1000); CH375_Write_Cmd(CMD_DISK_R_SENSE); // 獲取USB存儲器的容量 status=CH375_Wait_Int(); // 等待中斷并獲取狀態(tài) if(status==USB_INT_SUCCESS) // 出現(xiàn)錯誤 continue; else return 1; } if(j==5) return 1; } for(i=0;i!=5;i++) { CH375_Write_Cmd( CMD_DISK_READY ); status=CH375_Wait_Int(); if(status==USB_INT_SUCCESS) return 0; } return 1; }
還有一種可能行,就是D7數(shù)據(jù)線虛焊了。仔細(xì)檢查一下。