CH374做HOST連接鼠標(biāo)的問(wèn)題,請(qǐng)高手指點(diǎn)。

硬件環(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)象。 2008103010484426.jpg 2008103010491322.jpg 根據(jù)沁恒技術(shù)支持人員的建議,檢查線路、電源,均正常,調(diào)整延時(shí)長(zhǎng)短也沒(méi)有改善。哪位高手做過(guò)CH374連接鼠標(biāo)的,請(qǐng)指點(diǎn)一二,謝謝。


熱門(mén)產(chǎn)品 : CH390:以太網(wǎng)控制器芯片

昨天我們的技術(shù)人員應(yīng)該給你發(fā)了程序,如果您確認(rèn)硬件是好的,那主要就是延時(shí)調(diào)整的不好造成的,游戲手柄一般自帶電源,鼠標(biāo)需要USB供電,所以要確保電源的穩(wěn)定.另外程序中給你修改了好幾處在程序中都注明了. 你在獲取數(shù)據(jù)的時(shí)候請(qǐng)不要用PRINTF語(yǔ)句,自己寫(xiě)一個(gè)發(fā)送函數(shù),而且做好的方式是取完之后在去發(fā)送出來(lái),不要取一個(gè)發(fā)一個(gè). 延時(shí)主要是這個(gè)函數(shù)中的延時(shí)UINT8 HostTransact374( UINT8 endp_addr, UINT8 pid, BOOL tog ) 在發(fā)給你的郵件里有調(diào)整,您可以看一下 CH374連接鼠標(biāo)基本都是按照我們提供的程序來(lái)做的.


程序收到了,仍然無(wú)法接收數(shù)據(jù),電源我也考慮過(guò),USB的電源端是4.99V,D-的電壓鼠標(biāo)為2.95V,手柄為3.3V,D+都在0.05V左右,你們的客服說(shuō)這樣的電壓應(yīng)該沒(méi)問(wèn)題,手柄也是從USB取電的。我試驗(yàn)時(shí)是一直插在插座上試的,應(yīng)該不存在上電電壓跌落的問(wèn)題。而且如果電壓跌落也不可能枚舉成功了,整個(gè)枚舉過(guò)程都正常,我決定與時(shí)序關(guān)系不大。 關(guān)于程序中串口發(fā)送數(shù)據(jù)的問(wèn)題,原來(lái)的顯示我沒(méi)有改動(dòng),自己添加的就兩處,上面已經(jīng)說(shuō)清楚了,Write374Block程序中添加的部分,由于沒(méi)有啟動(dòng)發(fā)送,而且枚舉過(guò)程也能正常完成,應(yīng)該沒(méi)造成什么影響。而顯示USB狀態(tài)寄存器,我是定義了一個(gè)全局變量,在 Interrupt_Data_Trans 完成后,在主程序中顯示的,并沒(méi)有影響整個(gè)傳輸流程。 不知道CH374的傳輸流程對(duì)時(shí)間的要求有多高,手冊(cè)上并沒(méi)有介紹,只有一個(gè)讀寫(xiě)時(shí)序的要求,程序里很多地方都有延時(shí),一個(gè)個(gè)調(diào)整顯然是不可能的。 關(guān)鍵是通過(guò)波形看到似乎鼠標(biāo)并沒(méi)有相應(yīng)令牌,這樣調(diào)整延時(shí)似乎沒(méi)有什么作用,是不是控制命令上還有什么不妥之處。 有沒(méi)有哪位做成功的把程序貼出來(lái)看一下,謝謝。


我們是建議你這樣做去,因?yàn)槲覀兣龅綄?duì)部分的USB鼠標(biāo)如果IN令牌間隔時(shí)間稍微長(zhǎng)一點(diǎn)就無(wú)法去獲取數(shù)據(jù),這并不是CH374的原因,USB設(shè)備本身有離散性,必須去調(diào)整一個(gè)適合大多數(shù)設(shè)備的時(shí)序.枚舉正常不代表能夠取的數(shù)據(jù),按照我們的建議去調(diào)整延時(shí),應(yīng)該能解決問(wèn)題.


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

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