用了http://m.findthetime.net/bbs/View.asp?T=1&S=101&I=2938這個(gè)鏈接里的程序,但是接上電腦后無(wú)法識(shí)別設(shè)備。不知道什么原因,求指點(diǎn)。
電腦無(wú)法識(shí)別的設(shè)備,說(shuō)明你枚舉沒(méi)有成功,你得抓一下數(shù)據(jù)看看那一條命令沒(méi)有正確響應(yīng)?
怎樣抓數(shù)據(jù)?是用軟件監(jiān)控USB傳輸?shù)臄?shù)據(jù)嗎?
可以使用USB分析儀或者BusHound軟件監(jiān)控一下。
之前的問(wèn)題已經(jīng)解決,但是又有奇怪的情況!就是連接后,可以使用了,但是過(guò)了20秒就又無(wú)法使用了,請(qǐng)問(wèn)這是什么問(wèn)題呢?
你看一下你的程序里怎么處理的,是不是過(guò)了20s就超時(shí)退出了。
程序初始化ch375后,就進(jìn)行鼠標(biāo)枚舉,成功后進(jìn)入一個(gè)無(wú)限循環(huán),檢測(cè)單片機(jī)按鍵,用按鍵控制鼠標(biāo)移動(dòng)。
void main(void) { unsigned char i; unsigned char dir=0; unsigned char steps=0;
delay1s(); /* 延時(shí)等待CH375初始化完成,如果單片機(jī)由CH375提供復(fù)位信號(hào)則不必延時(shí) */ CH375_Init( ); /* 初始化CH375 */
SCON = 0x50; PCON = 0x80; TMOD = 0x20; TH1 = 0xfd; /* 11.0592MHz晶振, 9600bps */ TR1 = 1; TI = 1;
IT0=1; EX0=1; EA=1;
printf("系統(tǒng)啟動(dòng)\r\n");
enu_success=0; //枚舉成功標(biāo)志清零
while ( 1 ) { // delay50ms(); mDelaymS( 1 );
if(UP1==0)dir=0; else if(DOWN1==0)dir=1; else if(LEFT1==0)dir=2; else if(RIGHT1==0)dir=3; else if(BUTTON1==0)dir=4; else dir=5; switch(dir) { case 0: //向上 request.buffer[0]=0x00; request.buffer[1]=0x00; request.buffer[2]=0xfd; break; case 2: //向下 request.buffer[0]=0x00; request.buffer[1]=0x00; request.buffer[2]=0x03; break; case 1: //向左 request.buffer[0]=0x00; request.buffer[1]=0xfd; request.buffer[2]=0x00; break; case 3: //向右 request.buffer[0]=0x00; request.buffer[1]=0x03; request.buffer[2]=0x00; break; case 4: //左鍵 request.buffer[0]=0x01; request.buffer[1]=0x00; request.buffer[2]=0x00; break; case 5: request.buffer[0]=0x00; request.buffer[1]=0x00; request.buffer[2]=0x00; break; }
/// CH375_WR_CMD_PORT( CMD_WR_USB_DATA5 ); CH375_WR_DAT_PORT( 3 ); //寫(xiě)入長(zhǎng)度 for( i=0;i!=3;i++ ) CH375_WR_DAT_PORT( request.buffer[i] ); //循環(huán)寫(xiě)入數(shù)據(jù) } }
如果枚舉正常的話(huà),主機(jī)會(huì)不斷地發(fā)送IN包,那么你按鍵數(shù)據(jù)就會(huì)上傳上去,除非你數(shù)據(jù)上傳不正確,否則不會(huì)導(dǎo)致無(wú)法使用。
我用bus hound監(jiān)控USB口傳輸?shù)臄?shù)據(jù),沒(méi)發(fā)現(xiàn)有錯(cuò)誤,就是過(guò)了一段時(shí)間就突然停止工作了,ch375數(shù)據(jù)就發(fā)不出去了。
可以確定的是單片機(jī)還是在正常運(yùn)行的,就是USB那邊用bus hound監(jiān)控接收不到數(shù)據(jù),是電腦斷開(kāi)了USB連接嗎?
下位機(jī)上傳數(shù)據(jù),需要上位機(jī)(電腦)發(fā)送IN包下來(lái),你看看你的IN包有沒(méi)有發(fā)下來(lái)?
會(huì)不會(huì)是枚舉失敗,識(shí)別ch375B為鼠標(biāo)后,可以移動(dòng)了,但是過(guò)了十幾秒始終無(wú)法得到完整的枚舉數(shù)據(jù),電腦又自動(dòng)斷開(kāi)連接了?
有這種可能性,過(guò)一段時(shí)間就復(fù)位了,又重新枚舉了。這種情況你可以對(duì)比電腦的枚舉過(guò)程。
用bus hound監(jiān)控不到電腦發(fā)出的數(shù)據(jù),只能看到鼠標(biāo)發(fā)出的數(shù)據(jù),顯示的數(shù)據(jù)如下。這些是移動(dòng)鼠標(biāo)的數(shù)據(jù)。 9 DI 00 ff ff 00 .... 0us 1.1.0 16 DI 00 ff ff 00 .... 2us 2.1.0 9 DI 00 fe ff 00 .... 377us 3.1.0 16 DI 00 fe ff 00 .... 2us 4.1.0 9 DI 00 fe ff 00 .... 15ms 5.1.0 16 DI 00 fe ff 00 .... 2us 6.1.0 9 DI 00 ff 00 00 .... 252us 7.1.0 16 DI 00 ff 00 00 .... 2us 8.1.0 9 DI 00 fe fe 00 .... 15ms 9.1.0 16 DI 00 fe fe 00 .... 2us 10.1.0 9 DI 00 fd ff 00 .... 252us 11.1.0 16 DI 00 fd ff 00 .... 1us 12.1.0 9 DI 00 fd fe 00 .... 15ms 13.1.0 16 DI 00 fd fe 00 .... 2us 14.1.0 9 DI 00 fe fe 00 .... 245us 15.1.0 16 DI 00 fe fe 00 .... 2us 16.1.0 9 DI 00 fd ff 00 .... 15ms 17.1.0 16 DI 00 fd ff 00 .... 33us 18.1.0 9 DI 00 fc fe 00 .... 347us 19.1.0 16 DI 00 fc fe 00 .... 3us 20.1.0 9 DI 00 fe ff 00 .... 15ms 21.1.0 16 DI 00 fe ff 00 .... 2us 22.1.0 9 DI 00 fe ff 00 .... 380us 23.1.0 16 DI 00 fe ff 00 .... 3us 24.1.0 9 DI 00 ff ff 00 .... 15ms
普通鼠標(biāo)發(fā)送的都是四字節(jié)數(shù)據(jù),而你只上傳了三字節(jié)數(shù)據(jù),這個(gè)會(huì)不會(huì)有問(wèn)題?
修改成發(fā)送4個(gè)字節(jié)數(shù)據(jù)之后電腦就無(wú)法識(shí)別ch375了,完全不工作。用bus hound監(jiān)控會(huì)出現(xiàn)error提示。這個(gè)循環(huán)不是應(yīng)該在聯(lián)機(jī)成功后才開(kāi)始運(yùn)行的嗎?怎么會(huì)使枚舉都失敗了?