現(xiàn)在我的usb設(shè)備是包括鍵盤和鼠標(biāo)一體的,鍵盤的端點(diǎn)號(hào)是01,鼠標(biāo)的端點(diǎn)號(hào)是02,現(xiàn)在只能單獨(dú)讀取鍵盤和鼠標(biāo),問題是 1怎么判斷是端點(diǎn)1還是端點(diǎn)2發(fā)起的中斷啊2怎么完成對(duì)2個(gè)端點(diǎn)號(hào)的同步讀取呢
對(duì)于復(fù)合設(shè)備操作與單個(gè)設(shè)備類似,只是需要配置兩個(gè)接口,因?yàn)槟闶亲鲋鳈C(jī)端點(diǎn)1還是端點(diǎn)2的中斷是有你發(fā)起的,具體你可以參考一下CH376操作鍵盤鼠標(biāo)的例子,里面又如何操作復(fù)合設(shè)備的例子:http://www.findthetime.net/bbs/View.asp?S=101&I=19463
看過了,但是上面程序里沒有使用中斷,是嗎,有點(diǎn)不太明白
完全照抄參考例程, 并把這3句話 Device_Atti.Device[1].Device_report_len = (HID_Dev1->hid_class_descr2.wDescriptorLength>>8)|(HID_Dev1->hid_class_descr2.wDescriptorLength<<8); 改成了小端格式 Device_Atti.Device[1].Device_report_len = HID_Dev1->hid_class_descr2.wDescriptorLength; 結(jié)果不知道為什么在set idle success之后就狂發(fā)數(shù)據(jù),我沒招了,照著參考程序改,什么同步標(biāo)志,端點(diǎn)號(hào)都分開,鍵盤反應(yīng)一次就都沒反應(yīng)了;照著參考程序抄,又老是狂發(fā)數(shù)據(jù)。
而且1.ch376的參考程序的獲取設(shè)備描述符等等程序名和程序內(nèi)容與ch375中對(duì)應(yīng)的也不很匹配,2.ch376的參考程序中用很多結(jié)構(gòu)體,而ch375又很少用,貌似只有1個(gè)。 不明白為什么芯片型號(hào)差不多,程序要寫的這么不兼容,不方面修改呢?
首先,我們的例程是針對(duì)51單片機(jī)的,你STM32肯定得修改。set idle之后應(yīng)該是獲取報(bào)表描述符,你狂發(fā)數(shù)據(jù)是什么數(shù)據(jù)?其次,CH375和CH376雖然都是USB接口芯片,但是還是有很大差別的。另外,你調(diào)試的話最好是使用USB分析儀來監(jiān)控?cái)?shù)據(jù),這樣可以知道問題出在那個(gè)地方!
謝謝您周六仍回答我,真不好意思。 1.不知道是什么數(shù)據(jù),就是串口接收數(shù)字一直在加,數(shù)據(jù)太多了串口調(diào)試助手看不過來 2.好的 3.沒有啊,實(shí)習(xí)的公司讓我自己做,我只能自己做,不能說做不出來還申請(qǐng)買個(gè)東西啊,也許等我做出來了公司才會(huì)考慮買芯片做板子,而且前面我做的實(shí)驗(yàn)板子也是自己買的。關(guān)鍵是公司不關(guān)心我做的這個(gè)東西,我只是自己想要做出來,早結(jié)束,早畢業(yè)。 另外,我想請(qǐng)教幾個(gè)問題, 1.主機(jī)端點(diǎn)是一個(gè),復(fù)合設(shè)備的端點(diǎn)是2個(gè),端點(diǎn)1是鍵盤,端點(diǎn)2是鼠標(biāo),我想問下端點(diǎn)的同步標(biāo)志位、主機(jī)端點(diǎn)的同步觸發(fā)標(biāo)志是什么意思,是什么關(guān)系呢, 2.比如我設(shè)endp6_mode=0x80;就是我想接收端點(diǎn)0的DATA0放棄DATA1,那么下一步是不是不管端點(diǎn)是1還是2,我都該設(shè)endp6_mode=0xC0;接收DATA1,還是各自端點(diǎn)有各自的順序,就是如果下一步是端點(diǎn)1,就設(shè)endp6_mode=0xC0;如果是端點(diǎn)2,就還是設(shè)endp6_mode=0x80;不知道我有沒有表達(dá)清楚, 3.如果是問題2中的各自端點(diǎn)有各自的順序,那我今天又試了下直接抄ch376的參考程序里的這段話,不用中斷了,直接輪詢 while(1) { //獲取設(shè)備1的數(shù)據(jù) s = get_int_in( Device_Atti.Device[0].tog,Device_Atti.Device[0].Device_endp);
//如果該設(shè)備是符合設(shè)備,則需要獲取設(shè)備2的數(shù)據(jù) if( Device_Atti.Device_compat ) { s = get_int_in( Device_Atti.Device[1].tog,Device_Atti.Device[1].Device_endp); } } get_int_in()和issue_token()也是照著改 結(jié)果卻是串口一會(huì)有鍵盤值,一會(huì)沒有,一會(huì)有鼠標(biāo)值,一會(huì)沒有,這會(huì)是什么原因呢
我感覺問題還是出在同步標(biāo)志那一塊,但是我get_int_in()和issue_token()也這兩個(gè)函數(shù)都是照著參考程序改的,不明白還有什么不一樣,還是ch375和ch376的關(guān)于同步標(biāo)志的部分又不一樣? 附上我改過的這兩個(gè)函數(shù) UINT8 get_int_in(UINT8 endptog,UINT8 endpint) { UINT8 s,t,j; endtog = endptog ? 0x80 : 0x00; issue_token(endptog,( endpint << 4 ) | DEF_USB_PID_IN); s = wait_interrupt( ); if(s == USB_INT_SUCCESS) { t = RD_USB_DATA(data_buf); for(j=0;j!=t;j++) printf("%02x ",(unsigned short)data_buf[j]); if( endpint == Device_Atti.Device[0].Device_endp ) Device_Atti.Device[0].tog = Device_Atti.Device[0].tog ? FALSE : TRUE; else Device_Atti.Device[1].tog = Device_Atti.Device[1].tog ? FALSE : TRUE; } return s; } void issue_token1(UINT8 endptog, UINT8 endp_and_pid ) { CH376_WR_CMD_PORT( CMD_ISSUE_TKN_X ); CH376_WR_DAT_PORT( endptog ); CH376_WR_DAT_PORT( endp_and_pid ); mDelay2uS(); } 現(xiàn)象挺詭異的,不知道怎么表達(dá),就是按一下鍵盤,有反應(yīng),但是反應(yīng)不對(duì),按一下鼠標(biāo),沒反應(yīng),再按一下鍵盤有反應(yīng),再按一下鼠標(biāo),有反應(yīng)。郁悶+郁悶
根據(jù)你的現(xiàn)象有可能是同步標(biāo)志的問題,同步標(biāo)志是各自端點(diǎn)有各自的順序,DATA0和DATA1來回切換,你看你調(diào)用get_int_in,endptog的賦值是兩個(gè)不同的變量。你的函數(shù)就是我們的例程,你先不要看其他的,把CH376的例程看懂。
前幾天仔細(xì)看了usb描述符,把ch376移植到ch375上的程序試了下,就是還是上次的問題,在set idle之后就狂發(fā)數(shù)據(jù),將配置描述符打印出來了 Device_Atti.Device[0].Device_type=01 //01 Device_Atti.Device[0].Device_inf=00 //00 Device_Atti.Device[0].Device_endp=03 //81 Device_Atti.Device[0].Device_size=00 //08 Device_Atti.Device[0].Device_report_len=07 //3e
Device_Atti.Device[1].Device_type=00 //02 Device_Atti.Device[1].Device_inf=00 //01 Device_Atti.Device[1].Device_endp=08 //82 Device_Atti.Device[1].Device_size=0a //08 Device_Atti.Device[1].Device_report_len=705 //f1 左邊是獲得的值,右邊是實(shí)際正確的值,就是說配置獲取的不對(duì)。 我想問2個(gè)問題, 1.在ch376的參考程序中,配置獲取的不對(duì),是否影響后面的輪詢?如果我直接賦正確的值給上面,是否可以不影響下面的輪詢?今天這樣試了下,完全沒反應(yīng),誒 2.這個(gè)復(fù)合設(shè)備的端點(diǎn)描述符是這樣的 typedef struct _USB_ENDPOINT_DESCRIPTOR_ { BYTE bLength, 07 07 BYTE bDescriptorType, 05 05 BYTE bEndpointAddress, 81 82 BYTE bmAttributes, 03 03 WORD wMaxPacketSize, 0008 0008 BYTE bInterval 0a 0a }USB_ENDPOINT_DESCRIPTOR; 左邊的一組是鍵盤,右邊的一組是鼠標(biāo),我先問下網(wǎng)上說bmAttributes=03;代表端點(diǎn)屬性是中斷,是否可以直接輪詢這個(gè)端點(diǎn),是沒有影響的嗎,因?yàn)槲铱碿h376的參考程序是輪詢的,而ch375的參考程序是用中斷的?不明白為什么要不一樣
首先,你獲取的配置值不對(duì),那說明你分析配置描述符的程序出了問題,這部分需要你在仔細(xì)的看下你的軟件。 其次,端點(diǎn)屬性為0X03僅僅表示是中斷端點(diǎn),并不能說明一定是某個(gè)鍵盤或則鼠標(biāo)的端點(diǎn)。有很多鍵盤或者鼠標(biāo)就復(fù)合了另外一個(gè)端點(diǎn),但是這個(gè)端點(diǎn)并不是用于傳輸數(shù)據(jù)的。 再次,無論采用中斷還是查詢,都是去輪訓(xùn)的取數(shù)據(jù),作為USB主機(jī),針對(duì)中斷端點(diǎn)都需要主機(jī)主動(dòng)發(fā)送IN包來取數(shù)據(jù)。至于軟件怎么實(shí)現(xiàn)無所謂。
1.分析配置描述符的程序出了問題,但是這部分是復(fù)制的ch376中的參考程序,就是用了很多結(jié)構(gòu)體的,仔細(xì)看了,沒看懂,我能看出程序正確讀出了描述符,但是parse_config_descr()這個(gè)程序沒有正確的分析和保存。 2.今天又試了下,直接在parse_config_descr()賦值,set idle第一個(gè)端點(diǎn)鍵盤可以,Device_report_len是59個(gè),獲取報(bào)表描述符也正確,第二個(gè)端點(diǎn)set idle可以,Device_report_len是241個(gè),get_report_descr_ex就不正確了,那應(yīng)該是get_report_descr_ex()有問題,不知道是否是241個(gè)太多了,只讀了49個(gè),后面就不對(duì)了。 但是get_int_in()能夠獲取鍵盤和鼠標(biāo)值了。 3.我想問個(gè)一直很想問的問題,在get_int_in()獲取設(shè)備數(shù)據(jù)之前的各種配置的目的是什么?因?yàn)槲铱磄et_int_in()僅僅使用了端點(diǎn)號(hào)Device_endp,那之前各種配置的意義是什么呢,剛剛試了下,把各種讀取配置去掉,僅僅parse_config_descr()賦值,沒反應(yīng),難道是因?yàn)閡sb都需要這樣配置一下? 4.下面就想改成中斷獲取試試,不知怎樣呢。
算了,不用中斷了,因?yàn)橹暗挠弥袛嘧x取數(shù)據(jù)的,經(jīng)常插了一段時(shí)間后沒反應(yīng)了,不知道為什么。
我現(xiàn)在也在調(diào)試這個(gè),哪個(gè)大神可以提供一下參考,謝謝。