第一次用CH375 求助[原創(chuàng)]

謝謝ZBin的指點,果然是NAK重試的問題,改為#89H后能跟鼠標通信了。

要在這個軟件的基礎上,改成與鍵盤通信,要作如何改動?

鍵盤讀出來的描述符如下樓所示。


鍵盤讀出來的描述符: 12 01 10 01 00 00 00 08 0B 04 00 20 05 02 01 02 00 01 09 02 3B 00 02 01 00 A0 32 09 04 00 00 01 03 01 01 00 09 21 10 01 00 01 22 41 00 07 05 81 03 08 00 0A 09 04 01 00 01 03 01 02 00 09 21 10 01 00 01 22 87 00 07 05 82 03 08 00 30 05 01 09 06 A1 01 05 07 19 E0 29 E7 15 00 25 01 95 08 75 01 81 02 95 08 75 01 81 01 05 08 19 01 29 03 95 03 75 01 91 02 95 01 75 05 91 01 05 07 19 00 2A FF 00 15 00 26 FF 00 95 06 75 08 81 00 C0


你的鍵盤是一個復合鍵盤,復合了兩個接口,端點分別為81和82。這樣你就要分析是那個端點傳輸鍵盤數(shù)據(jù)。你也可以用非復合的鍵盤試一下,應該是可以獲取鍵盤數(shù)據(jù)的。 另外,鍵盤相比較鼠標需要增加設置報表的命令。


從描術符看,這個鍵盤是整合了鼠標功能的鍵盤,81H為鍵盤端口,82H為鼠標端口,我只要跟81H通信就可以了。因此我設置了CH375端口為81H。 然后我要用“Set_Report_Cms: DB 21H,09H,00H,02H,00H,00H,01H,00H”做一個設置報表的子程序嗎?這個子程序可以參照“Set_Idle”來做嗎?


這樣的子程序對嗎?

;/******************************************************************************************** ; ;Set_Report_Cms: DB 21H,09H,00H,02H,00H,00H,01H,00H ; 輸入?yún)?shù):無 ; 輸出參數(shù):無 ;********************************************************************************************/ Set_Report: MOV RAM_DATA,#21H ;;這里是直接往內(nèi)部RAM送數(shù)據(jù) MOV RAM_DATA+1,#09H MOV RAM_DATA+2,#00H MOV RAM_DATA+3,#02H MOV RAM_DATA+4,#00H MOV RAM_DATA+5,#00H MOV RAM_DATA+6,#01H MOV RAM_DATA+7,#00H MOV endp7_mode,#80H LCALL Toggle_Send MOV R7,#08H MOV R0,#RAM_DATA LCALL Wr_Usb_Data MOV R7,#00H MOV R6,#DEF_USB_PID_SETUP LCALL Issue_Token LCALL Wait_Interrupt CJNE R7,#14H,END_8a MOV endp6_mode,#0C0H LCALL Toggle_Recv MOV R7,#00H MOV R6,#DEF_USB_PID_IN LCALL Issue_Token LCALL Wait_Interrupt CJNE R7,#14H,END_8a MOV R7,#00H SJMP END_9a END_8a: MOV R7,#01H END_9a: RET


你可以用BUSHOUND軟件抓一下電腦對這個鍵盤枚舉的過程,查看一下鍵盤的傳輸端口set_idle和get_report配置是否正確??匆幌骆I盤數(shù)據(jù)是否只是81端點來實現(xiàn)。如果這些都正確,應該可以獲取到數(shù)據(jù)的。 其實,點燈操作你不做也是可以獲取到數(shù)據(jù)的,但是標準的過程都有這一步。


改了下點燈操作的子程序,能正確點燈了。 82口是鍵盤上的音量鍵,幾個控制音量的鍵盤都有數(shù)據(jù)傳上來。 數(shù)據(jù)處理傳輸應該是81口,但只能響應一次按鍵,就是說,每次上電后只能響應一次按鍵。 換別一款鍵盤,上電復位后鍵盤不停的送出數(shù)據(jù),不管用81口或82口都是一樣。 由此看來可能是程序的問題,鍵盤跟鼠標的操作還是不一樣的。但不知道是哪一部分的問題。

用BUSHOUND軟件抓電腦對鍵盤枚舉的過程,我研究了兩天,還不知道如何操作,網(wǎng)上也找不到相關的文檔,望指點。


前面枚舉正確的話,后面數(shù)據(jù)傳輸鼠標鍵盤應該是一樣的,都是主機從對應端點下發(fā)IN包,設備沒有響應返回NAK,設備響應返回ACK。 我們的程序只是針對普通鍵盤,你的鍵盤可能比較特殊,用BUSHOUND軟件抓電腦對鍵盤枚舉的過程主要是了解主機發(fā)送IN包的流程,然后程序模擬這個流程來操作。


MOV R7,#0BH LCALL CH375_WR_CMD_PORT MOV R7,#17H LCALL CH375_WR_DAT_PORT MOV R7,#0D8H LCALL CH375_WR_DAT_PORT

命令0BH后面跟數(shù)據(jù)17H和0D8H代表什么意義?程序里面沒有作注解,INC文件里面也沒有.


這是我們以前設置低速模式的命令,可以正常使用。 你也可以使用SET_USB_SPEED(04H)來設置總線速度,見CH375DS2.PDF。


兩款不同品牌的鍵盤,一個數(shù)據(jù)輸入正常,另一個鍵盤輸入數(shù)據(jù)時,按下按鍵時要大約1秒鐘才有數(shù)據(jù)傳上來,是什么原因?還要作什么配置才行?


初始化的時候需要根據(jù)鍵盤速度設置總線速度,單片機端對對應端點一直發(fā)IN包,按鍵之后單片機端會檢測到中斷。 另外,你最好按照之前跟你說的用BUSHOUND軟件抓一下電腦操作的數(shù)據(jù)。


;/******************************************************************************************** ; Set_PROTOCOL ; 打印機進紙一行:命令0AH ;

;********************************************************************************************/ Set_PROTOCOL_s: MOV RAM_DATA,#0AH ;;這里是直接往內(nèi)部RAM送數(shù)據(jù) MOV RAM_DATA+1,#0aH MOV RAM_DATA+2,#0aH MOV RAM_DATA+3,#0aH MOV RAM_DATA+4,#0aH MOV RAM_DATA+5,#0aH MOV RAM_DATA+6,#0aH MOV RAM_DATA+7,#0aH MOV endp7_mode,#80H LCALL Toggle_Send MOV R7,#08H MOV R0,#RAM_DATA LCALL Wr_Usb_Data

MOV R7,#01H ;端點1 MOV R6,DEF_USB_PID_OUT LCALL Issue_Token LCALL Wait_Interrupt CJNE R7,#14H,END_8_PROTOCOL_s MOV R7,#00H SJMP END_9_PROTOCOL_s END_8_PROTOCOL_s: MOV R7,#01H END_9_PROTOCOL_s: RET


上面這段子程序的目的是打印機進紙。操作不成功。CH375返回錯誤代碼為20H.代表什么意思呢?


返回0x20說明打印機應答超時,也就是說打印機沒響應。檢查命令發(fā)送是否正確,前面枚舉是否正確通過。


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

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