關(guān)于CH375B做主機(jī)枚舉鍵盤鼠標(biāo)

首先,CH375B比CH375A兼容性是強(qiáng)了不少,在CH375A下枚舉不成功的設(shè)備,CH375B幾乎都枚舉成功了。但在枚舉一個(gè)SUN鍵盤時(shí),出現(xiàn)一些問題,需要請教兩個(gè)問題: 1 當(dāng)設(shè)置完地址后,究竟需不需要再重新復(fù)位設(shè)備?  1)重新復(fù)位設(shè)備:除SUN鍵盤外,均能枚舉成功,但所有設(shè)備在GET_INT_IN()中請求IN包時(shí),CH375B不產(chǎn)生中斷,所以操作設(shè)備時(shí)無數(shù)據(jù)送出。枚舉SUN鍵盤時(shí),在SET_IDLE()處CH375B不再產(chǎn)生中斷。  2)不重新復(fù)位設(shè)備:除SUN鍵盤,手頭所有設(shè)備均能正常工作,操作設(shè)備會(huì)產(chǎn)生相應(yīng)的數(shù)據(jù)。枚舉SUN鍵盤時(shí),有的時(shí)候獲取設(shè)備描述符會(huì)成功,大部分時(shí)候是在獲取設(shè)備描述符時(shí)CH375B不產(chǎn)生中斷,程序陷入死等狀態(tài)。 2 當(dāng)向設(shè)備發(fā)送完令牌后,CH375B為什么不產(chǎn)生中斷,而令程序陷入死等狀態(tài)?

1:設(shè)置地址后,不需要重新復(fù)位設(shè)備 2:把鍵盤插在計(jì)算機(jī)上,對比計(jì)算機(jī)的操作流程,看看你的程序中是否有缺少的步驟


不會(huì)有缺少的步驟,要是有,也不會(huì)有大多數(shù)設(shè)備能正常工作的情況了。 其實(shí)我現(xiàn)在只有一個(gè)問題了,就是那個(gè)SUN鍵盤的枚舉,其他的,可以說已經(jīng)成功了。 而這個(gè)SUN鍵盤,設(shè)置地址前的操作均是成功的,設(shè)置地址后,就很難說了,有的時(shí)候能往下進(jìn)行一步,有的時(shí)候一步也進(jìn)行不下去。 下面是設(shè)置地址后不復(fù)位的情況: get_device_descr 12 01 10 01 00 00 00 08 30 04 05 00 00 02 00 00 00 01 set_addr get_device_descr again

再下面的情況是設(shè)置地址后再復(fù)位的枚舉情況: get_device_descr 12 01 10 01 00 00 00 08 30 04 05 00 00 02 00 00 00 01 set_addr get_device_descr again 12 01 10 01 00 00 00 08 30 04 05 00 00 02 00 00 00 01 get_config_desc 09 02 22 00 01 01 00 a0 32 config 2 09 02 22 00 01 01 00 a0 32 09 04 00 00 01 03 01 01 00 09 21 00 01 21 01 22 40 00 07 05 81 03 08 00 0a set_config set idle


追蹤程序,這兩種現(xiàn)象最后都?xì)w結(jié)為status=wait_interrupt(),說明ch375沒有產(chǎn)生中斷。


設(shè)置完地址后,通常至少等待3mS才能繼續(xù)操作,看看計(jì)算機(jī)等了多長時(shí)間才去操作的


設(shè)置地址后我等待了100ms.


建議你用BUSHOUND軟件去抓取數(shù)據(jù)看有沒有特殊的操作步驟,不能因?yàn)榇蠖鄶?shù)的沒有問題就說沒問題,我們確實(shí)碰到過. 另外你在切換速度后等待50MS后獲取設(shè)備描述符看看是否可以. 按照標(biāo)準(zhǔn)流程來說設(shè)置完地址后是不需要復(fù)位的.


如1樓所說你可以將SUN鍵盤連接到電腦上,用BUSHOUND軟件來抓取PC和其通訊的數(shù)據(jù),看看對于該鍵盤是否有特殊的操作


我把延時(shí)程序放在了下面那個(gè)位置,運(yùn)行結(jié)果還是和以前一樣, void main() { unsigned char i; mInitSTDIO( ); delayms(250); set_usb_mode( 6 ); /* 設(shè)置USB主機(jī)模式, 如果設(shè)備端是CH37X, 那么5和6均可 */ #ifdef TEST_LOW_SPEED set_freq(0x01); //使375B進(jìn)入低速模式 #endif while(1) { while ( wait_interrupt()!=USB_INT_CONNECT ); /* 等待設(shè)備端連接上來 */ delayms(150); reset_device(); delayms(5);        set_freq(0x01); //使375B進(jìn)入低速模式 delayms(50);     //建議添加的延時(shí)程序

printf("get_device_descr\n"); // get_descr(0x01);//獲取設(shè)備描述符

Request.Req.bmRequestType=0x80; 運(yùn)行結(jié)果如下: get_device_descr 12 01 10 01 00 00 00 08 30 04 05 00 00 02 00 00 00 01 set_addr get_device_descr again   //程序陷入死等中斷出現(xiàn)的狀態(tài)


我這兒bushound看不到設(shè)置地址的操作(所有USB設(shè)備的枚舉過程都看不到),除此之外,SUN鍵盤與其他設(shè)備相比,枚舉過程沒有不一樣的地方。


把您的程序貼出來看看.


void main() { unsigned char i; mInitSTDIO( ); delayms(250); set_usb_mode( 6 ); /* 設(shè)置USB主機(jī)模式, 如果設(shè)備端是CH37X, 那么5和6均可 */ #ifdef TEST_LOW_SPEED set_freq(0x01); //使375B進(jìn)入低速模式 #endif while(1) { while ( wait_interrupt()!=USB_INT_CONNECT ); /* 等待設(shè)備端連接上來 */ delayms(150); reset_device(); delayms(5); set_freq(0x01); //使375B進(jìn)入低速模式 delayms(50);

printf("get_device_descr\n"); // get_descr(0x01);//獲取設(shè)備描述符

Request.Req.bmRequestType=0x80; Request.Req.bRequest=0x06; Request.Req.wValue=0x0001; Request.Req.wIndex=0x0000; Request.Req.wLength=0x1200; if(get_descr_ex()==1) { for(i=0;i!=data_buf[0];i++) printf("%02x ",(unsigned int)data_buf[i]); printf("\n"); } else printf("get device descr failed\n");

printf("set_addr\n"); set_addr(5);//設(shè)置地址 delayms(200);

// reset_device(); // set_freq(01); // delayms(50);

printf("get_device_descr again\n"); Request.Req.bmRequestType=0x80; Request.Req.bRequest=0x06; Request.Req.wValue=0x0001; Request.Req.wIndex=0x0000; Request.Req.wLength=0x1200; if(get_descr_ex()==1) { for(i=0;i!=data_buf[0];i++) printf("%02x ",(unsigned int)data_buf[i]); printf("\n"); } else printf("get device descr failed\n");

printf("get_config_desc\n"); // get_descr(0x02);//獲取配置描述符

Request.Req.bmRequestType=0x80; Request.Req.bRequest=0x06; Request.Req.wValue=0x0002; Request.Req.wIndex=0x0000; Request.Req.wLength=0x0900; if(get_descr_ex()==1) { for(i=0;i!=data_buf[0];i++) printf("%02x ",(unsigned int)data_buf[i]); printf("\n"); if(data_buf[4]!=0x01)flag_interface_2=1;//有多個(gè)接口 } else printf("get config descr failed\n"); printf("config 2\n"); if(data_buf[2]>0x09) { flag_config_2=1; Request.Req.bmRequestType=0x80; Request.Req.bRequest=0x06; Request.Req.wValue=0x0002; Request.Req.wIndex=0x0000; Request.Req.wLength=0x0000|((unsigned int)data_buf[2]<<8); if(get_descr_ex()==1) { for(i=0;i!=data_buf[2];i++) printf("%02x ",(unsigned int)data_buf[i]); printf("\n"); flag_config_2=0; } else printf("get device descr again failed\n"); }

parse_config_descr();//保存描述符中一些值 printf("set_config\n"); set_config(config_value);//設(shè)置配置 // if(set_config_ex()!=1)printf("set config failed\n"); printf("set idle\n"); if(set_idle()!=1)printf("set idle failed\n"); printf("get_report\n"); Request.Req.bmRequestType=0x81; Request.Req.bRequest=0x06; Request.Req.wValue=0x0022; Request.Req.wIndex=0x0000; Request.Req.wLength=0x0000|((unsigned int)(report_descr_len+0x40)<<8); if(get_report_descr_ex()==1) { for(i=0;i!=report_cou;i++) printf("%02x ",(unsigned int)data_buf[i]); printf("\n"); } else printf("get report descr failed\n"); // printf("set report\n"); //對于鍵盤這一步,是點(diǎn)亮指示燈 // if(set_report()!=1)printf("set report failed\n"); printf("OK!\n"); do { get_int_in(); //發(fā)送從中斷端點(diǎn)讀數(shù)據(jù)的令牌 if(flag_output) { for(i=0;i!=data_len;i++) printf("%02x ",(unsigned short)data_buf[i]); printf("\n"); flag_output=0; } else delayms(10); }while(1); while ( wait_interrupt()!=USB_INT_DISCONNECT ); /* 等待設(shè)備端連接上來 */ } }


這個(gè)程序是從你們網(wǎng)站上下載的


我所做的改動(dòng): 1把子程序void intt0()隱掉 2void set_freq(void)改用ch375a的操作方式 3串口初使化設(shè)置為12M,9600bps 4更改void get_int_in()函數(shù)的定義 5主程序更改比較大,再有硬件控制信號(hào)的更改。


發(fā)現(xiàn)一個(gè)問題,請教一下你們?nèi)绾谓忉專? 枚舉SUN鍵盤時(shí),設(shè)置地址后不復(fù)位,單片機(jī)會(huì)一直等ch375產(chǎn)生中斷,導(dǎo)致程序不能往下運(yùn)行,此時(shí),我若按一下鍵盤上的任一按鍵,得到設(shè)備描述符的命令就會(huì)成功,然后程序會(huì)在“得到配置描述符”時(shí)死等ch375中斷,我若再按一下按鍵,程序又會(huì)往下運(yùn)行,循環(huán)如此,程序會(huì)運(yùn)行到最后,鍵盤枚舉成功!請問,該如何解釋這種現(xiàn)象?


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频