CH376操作鍵盤問題

初始化完成后,鍵盤LED也點(diǎn)亮了,獲取報告一直獲取不了。 下面是獲取子程序: u8 get_int_in(u8 tog,u8 endp_int) { UINT8 s,t,j; tog = tog ? 0x80 : 0x00; issue_token(tog,( endp_int << 4 ) | DEF_USB_PID_IN); s = wait_interrupt( ); if(s == USB_INT_SUCCESS) { t = RD_USB_DATA(data_buf); //鍵盤中斷端點(diǎn)數(shù)據(jù)長度一般為8字節(jié),鼠標(biāo)為4字節(jié) for(j=0;j!=t;j++) printf("%02x ",(unsigned short)data_buf[j]); if( endp_int == 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; } 很是郁悶,求高人指點(diǎn)??!

調(diào)用時,是跟例程差不多的。 第1次調(diào)用參數(shù)是(0,端點(diǎn)地址) 第2次調(diào)用參數(shù)是(1,端點(diǎn)地址) 第3次調(diào)用參數(shù)是(0,端點(diǎn)地址) 第4次調(diào)用參數(shù)是(1,端點(diǎn)地址) . . . .


您把端點(diǎn)地址打印出來看下,與您操作的鍵盤端點(diǎn)地址是否對應(yīng)的。


接口描述符:09,04,00,00,01,03,01,01,00, 群組描述符:09,21,10,01,00,01,22,36,00, 端點(diǎn)描述符:07,05,81,03,08,00,0A, /*第3個字節(jié)為端點(diǎn)號*/

報告描述符:(長度:54) 05,01,09,06,A1,01,05,08,19,01,29,03,15,00,25,01,75,01,95,03,91,02,95,05,91,01,05 ,07,19,E0,29,E7,95,08,81,02,75,08,95,01,81,01,19,00,29,91,26,FF,00,95,06,81,00,C 0, set idle success 此USB設(shè)備為復(fù)合設(shè)備! 接口描述符2:09,04,01,00,01,03,01,02,00, 群組描述符2:09,21,10,01,00,01,22,6C,00, 端點(diǎn)描述符2:07,05,82,03,05,00,0A, /*第3個字節(jié)為端點(diǎn)號*/

報告描述符2:(長度:108) 05,01,09,02,A1,01,85,03,09,01,A1,00,05,09,19,01,29,03,15,00,25,01,95,03,75,01,81 ,02,95,01,75,05,81,01,05,01,09,30,09,31,09,38,15,81,25,7F,75,08,95,03,81,06,C0,C 0,05,01,09,80,A1,01,85,02,19,81,29,83,15,00,25,01,75,01,95,03,81,02,75,01,95,05, 81,01,C0,05,0C,09,01,A1,01,85,01,19,00,2A,3C,02,15,00,26,3C,02,95,01,75,10,81,00 ,C0, 初始化成功!

端點(diǎn)號:81 <-----第一次調(diào)用打印出來的端點(diǎn)號,正確 端點(diǎn)號:82 <-----第二次調(diào)用打印出來的端點(diǎn)號,正確


在獲取數(shù)據(jù)的時候,您看這個位置的的端點(diǎn)地址是多少,是不是 1? 【第1次調(diào)用參數(shù)是(0,端點(diǎn)地址) 第2次調(diào)用參數(shù)是(1,端點(diǎn)地址)】

另外,這個鍵盤是個復(fù)合的設(shè)備,同步標(biāo)志位應(yīng)該是兩個獨(dú)立的。并且是在獲取到數(shù)據(jù)之后進(jìn)行切換。


UploadImages/201322811274173.rar 您試下這個程序。


端點(diǎn)地址是0x81 ----------<問題會不會出在這兒>

同步標(biāo)志是跟您說的一樣的。


5樓的那個代碼試過沒?端點(diǎn)地址是0x81是對的。


我用的是STM32處理器,不過就是根據(jù)那個例程一步步來的。


如果您用的是論壇上的那個例程的話, UINT8 data_buf[90],這個地方的緩沖區(qū)小了,在您獲取報表的時候會溢出。 您把這個緩沖區(qū)定義大點(diǎn)。超過【報告描述符2:(長度:108)】108就可以了。 獲取鍵值數(shù)據(jù)跟幾個因素有關(guān),端點(diǎn)地址、同步標(biāo)志位、設(shè)備速度類型。 或者您換個鼠標(biāo)試試,看能不能獲取到數(shù)據(jù)。


************************************************** 主程序開始… CH376版本號:3

s=15H,USB設(shè)備以插入! 98H,1.5Mbps低速USB設(shè)備,,設(shè)置完畢! Len=34 ---<鼠標(biāo)> set USB config error

設(shè)備描述符:12,01,00,02,00,00,00,08,6D,04,5A,C0,00,54,01,02,00,01, 配置描述符:09,02,22,00,01,01,00,A0,31, 接口描述符:09,04,00,00,01,03,01,02,00, 群組描述符:09,21,11,01,00,01,22,43,00, 端點(diǎn)描述符:07,05,81,03,06,00,0A,

報告描述符:(長度:67) 05,01,09,02,A1,01,09,01,A1,00,05,09,19,01,29,08,15,00,25,01,75,01,95,08,81,02,05 ,01,16,01,F8,26,FF,07,75,0C,95,02,09,30,09,31,81,06,15,81,25,7F,75,08,95,01,09,3 8,81,06,05,0C,0A,38,02,95,01,81,06,C0,C0, 初始化成功!

插上鼠標(biāo)是這個樣子的,不過還是讀不出報告來。。。很是郁悶! 還有就是接受報告難道不用發(fā)接受報告命令嗎?按照例程中的思想,好像是直接接受的。[Emot]1[/Emot] 單步走的話調(diào)用u8 get_int_in(u8 tog,u8 endp_int)中的 issue_token(tog,( endp_int << 4 ) | DEF_USB_PID_IN); s = Wait376Interrupt();---------->0x2A(應(yīng)該是0x14才對,0x2A是超時響應(yīng)嗎?) if(s==0x14)....


1)set USB config error是設(shè)置配置錯誤?前面初始化就出問題了。 s = set_config( Device_Atti.Cfg_value ); 您看下設(shè)置配置返回值是多少 【s】 2)98H,1.5Mbps低速USB設(shè)備,,設(shè)置完畢! 如果您按例程來寫的,那么程序默認(rèn)的是設(shè)備是低速設(shè)備,您用萬用表量下UD+ UD-上的電壓。檢測下是不是低速設(shè)備。 3)如果您有usb分析儀,可以抓取整個過程的數(shù)據(jù)看看問題出在哪。 4)接收報告是主機(jī)不斷向設(shè)備發(fā)送命令的, void issue_token(UINT8 endptog, UINT8 endp_and_pid ) { CH376_WR_CMD_PORT( CMD2H_ISSUE_TKN_X ); CH376_WR_DAT_PORT( endptog ); CH376_WR_DAT_PORT( endp_and_pid ); mDelay2uS(); }


1)上面是鼠標(biāo)才配置錯誤的,插鍵盤就沒錯誤的。錯誤時【S】= 2E 2)速度是對的,如果把設(shè)置低速模式的那條代碼注釋掉,是不可以通訊的,設(shè)備描述符也讀不出來。D+低、D-高 3)我沒有USB分析儀呢 4)執(zhí)行 IN 事務(wù),是接收數(shù)據(jù)啊

小弟不才,多謝大哥相助!


1)s = Wait376Interrupt();---------->0x2A(應(yīng)該是0x14才對,0x2A是超時響應(yīng)嗎?) 返回2a是對的,在沒有數(shù)據(jù)的時候設(shè)備給一個NAK信號。只有當(dāng)鍵盤有按鍵,或者鼠標(biāo)移動的時候,主機(jī)才能獲取到數(shù)據(jù),此時返回的才是0x14.

2)上面是鼠標(biāo)才配置錯誤的,插鍵盤就沒錯誤的。錯誤時【S】= 2E 返回0x2e 說明設(shè)備給您返回了一個stall信號??赡苁悄l(fā)的命令有問題。設(shè)備不識別。

3)您把代碼發(fā)至我郵箱吧,我給您看下 zfl@wch.cn


這是問題困惑我的第11天了,郁悶……

首先感謝大哥相助!

看了你給的資料,發(fā)現(xiàn)我的初始化程序好像有問題。 按下鍵盤按鍵不產(chǎn)生中斷,我把前面的

set_addr(5);//設(shè)置地址

/* 設(shè)置USB配置 */ s = set_config( ((PUSB_ITF_DESCR)Interface_desc)->bInterfaceClass ); if(s != 0x14)printf("\n\r set USB config error -->S=%02X\n",s); /* 設(shè)置HID類設(shè)備的IDLE*/ s = set_idle(0); if(s != 0)printf("\n\r set idle error \n"); --------<這些設(shè)置注釋掉,使用了下面一句>

s = Wait376InterruptCMD(CMD0H_AUTO_SETUP);//自動配置USB設(shè)備 if(s!=USB_INT_SUCCESS)return; 結(jié)果按下按鍵可以正常中斷,但是中斷的狀態(tài)是S=0x16,意思是設(shè)備以斷開!(不按按鍵不會中斷)


1)如果前面初始化就出問題了,那么您先做下測試命令(往下發(fā)0x06的命令);如果不正確檢查下您的硬件以及接口程序。如果是對的,那么檢查初始化過程在那出現(xiàn)了問題,返回錯誤是什么。 2)如果前面的初始化不過的話,后面按下按鍵是獲取不到數(shù)據(jù)的。先把前面的初始化調(diào)好了再去檢查后面的問題。


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

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