硬件環(huán)境C8051F020+CH374S,主頻22.1184M,CH374S批號(hào)203203033,程序基于CH374_HID.C,根據(jù)硬件環(huán)境
修正了端口配置及延時(shí)程序,在程序中做了如下修改: void Write374Block (UINT8 mAddr, UINT8 mLen, PUINT8 mBuf) /* 向指定起始地址寫(xiě)入數(shù)據(jù)塊 */ { printf (">>:"); //// Write374Index (mAddr); while (mLen --) { printf ("%02X ", (UINT16)*mBuf); //// Write374Data (*mBuf++); } printf ("\n"); //// } 由于該程序是往CH374S的發(fā)送緩沖區(qū)填充數(shù)據(jù),應(yīng)該不會(huì)影響通訊時(shí)序。 主程序中: ………… // 下面開(kāi)始讀取數(shù)據(jù) (實(shí)際在讀取數(shù)據(jù)的時(shí)候,要先發(fā)送中斷端點(diǎn)的令牌來(lái)讀取數(shù)據(jù),接著才能獲取到數(shù)據(jù)
) tog1 = FALSE; //開(kāi)始取DATA0 while (1) { Write374Byte ( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_TRANSFER ); // 清中斷
標(biāo)志 // Write374Block ( RAM_HOST_RECV, 20, INT ); // 清空緩沖區(qū) s = Interrupt_Data_Trans (buf); printf ("[%02X]", (UINT16) USBStatus); // 增加顯示USB狀態(tài)寄存器/////// if (s == USB_INT_SUCCESS) { ………… USBStatus在HostTransact374函數(shù)中保存REG_USB_STATUS寄存器的值,以便了解USB通訊狀態(tài)。
連接北通游戲手柄和普通搖桿通訊完全正常,數(shù)據(jù)可以正常接收; 連接IBM、聯(lián)想、羅技、雙飛燕鼠標(biāo),枚舉過(guò)程數(shù)據(jù)正常,但在收到HID報(bào)告描述符后,有時(shí)能收到1幀數(shù)據(jù),有時(shí)根本就接收不到。
串口接收如下:(方括號(hào)中數(shù)據(jù)為USB狀態(tài)寄存器) 00 00 00 00 C5 40 F0 03 02 E0 10 04 00 91 C0 00 // CH374寄存器0x00-0x0F Start CH374 Host Reset Device Start Low-Speed Device GetDeviceDescr: >>:80 06 00 01 00 00 12 00 device_status = 14 12 01 10 01 00 00 00 08 D9 15 37 0A 00 01 00 01 00 01 >>:00 05 02 00 00 00 00 00 address_status = 14 >>:80 06 00 02 00 00 04 00 09 02 22 00 >>:80 06 00 02 00 00 22 00 09 02 22 00 01 01 00 A0 32 09 04 00 00 01 03 01 02 00 09 21 10 01 00 01 22 34 00 07 05 81 03 04 00 0A hid_des_leng = 34 endp_in_addr = 01 endp_out_addr = 00 config_status = 14 >>:00 09 01 00 00 00 00 00 SetUsbConfig_success Set_Idle >>:21 0A 00 00 00 00 00 00 Set_idle success Get_Hid_Des >>:81 06 00 22 00 00 74 00 HID_Desc: 05 01 09 02 A1 01 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 80 25 7F 75 08 95 03 81 06 C0 C0 [93]00 00 00 FE [90][90][90][90][90][90][90][90][90]
BusHound抓包數(shù)據(jù)如下: Device Phase Data Description Cmd.Phase.Ofs(rep) ------ ----- ------------------------ ---------------- ------------------ 30.0 CTL 80 06 00 01 00 00 12 00 GET DESCRIPTOR 1.1.0 30.0 DI 12 01 10 01 00 00 00 08 ........ 1.2.0 d9 15 37 0a 00 01 00 01 ..7..... 1.2.8 00 01 .. 1.2.16 30.0 CTL 80 06 00 02 00 00 09 00 GET DESCRIPTOR 2.1.0 30.0 DI 09 02 22 00 01 01 00 a0 .."..... 2.2.0 32 2 2.2.8 30.0 CTL 80 06 00 02 00 00 22 00 GET DESCRIPTOR 3.1.0 30.0 DI 09 02 22 00 01 01 00 a0 .."..... 3.2.0 32 09 04 00 00 01 03 01 2....... 3.2.8 02 00 09 21 10 01 00 01 ...!.... 3.2.16 22 34 00 07 05 81 03 04 "4...... 3.2.24 00 0a .. 3.2.32 30.0 CTL 00 09 01 00 00 00 00 00 SET CONFIG 4.1.0 30.0 CTL 21 0a 00 00 00 00 00 00 SET IDLE 5.1.0 30.0 CTL 81 06 00 22 00 00 74 00 GET DESCRIPTOR 6.1.0 30.0 DI 05 01 09 02 a1 01 09 01 ........ 6.2.0 a1 00 05 09 19 01 29 03 ......). 6.2.8 15 00 25 01 95 03 75 01 ..%...u. 6.2.16 81 02 95 01 75 05 81 01 ....u... 6.2.24 05 01 09 30 09 31 09 38 ...0.1.8 6.2.32 15 80 25 7f 75 08 95 03 ..%.u... 6.2.40 81 06 c0 c0 .... 6.2.48 30.1 DI 00 00 00 01 .... 7.1.0 30.1 DI 00 01 01 00 .... 8.1.0 數(shù)據(jù)對(duì)比CH374多了設(shè)置USB地址的操作[00 05 02 00 00 00 00 00]。 在中斷傳輸時(shí),傳輸完成USB狀態(tài)寄存器的值應(yīng)該是0x93或0x9B,對(duì)應(yīng)DATA0和DATA1,但我的程序一直為0x90
,解釋為設(shè)備應(yīng)答錯(cuò)誤或超時(shí)無(wú)應(yīng)答。 跟蹤程序發(fā)現(xiàn)IN事務(wù)令牌輸入正確,即向0x0D寄存器寫(xiě)入0x91,表明端點(diǎn)1指定IN事務(wù),再向0x0E寄存器寫(xiě)入
0x08,啟動(dòng)發(fā)送,查詢(xún)到中斷后,讀取中斷寄存器值為0xF1,表明傳輸結(jié)束,此時(shí)取USB狀態(tài)寄存器始終為
0x90。 用示波器分別抓取了手柄及鼠標(biāo)的通訊波形,1通道為中斷信號(hào),2通道為D-信號(hào)。 上圖為手柄,根據(jù)電平高低可以推斷HOST發(fā)送令牌包,接著手柄回傳數(shù)據(jù)包,之后是HOST的握手包(ACK包),通訊結(jié)束中斷產(chǎn)生。感覺(jué)CH374是在接收到數(shù)據(jù)包就產(chǎn)生中斷了,所以ACK包和中斷有些重合,在實(shí)際接收時(shí)也發(fā)現(xiàn)USB狀態(tài)寄存器有時(shí)是0x13或0x1B,表明SIE忙,可以考慮增加25us延時(shí)來(lái)避開(kāi)。 下圖為鼠標(biāo),似乎只看到CH374發(fā)送了令牌包,然后就是超時(shí)產(chǎn)生的中斷,重試3次鼠標(biāo)沒(méi)有做任何反應(yīng),這也符合USB狀態(tài)寄存器為0x90的現(xiàn)象。 根據(jù)沁恒技術(shù)支持人員的建議,檢查線路、電源,均正常,調(diào)整延時(shí)長(zhǎng)短也沒(méi)有改善。哪位高手做過(guò)CH374連接鼠標(biāo)的,請(qǐng)指點(diǎn)一二,謝謝。