谢谢ZBin的指点,果然是NAK重试的问题,改为#89H后能跟鼠标通信了。
要在这个软件的基础上,改成与键盘通信,要作如何改动?
键盘读出来的描述符如下楼所示。
谢谢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。这样你就要分析是那个端点传输键盘数据。你也可以用非复合的键盘试一下,应该是可以获取键盘数据的。 另外,键盘相比较鼠标需要增加设置报表的命令。
从描术符看,这个键盘是整合了鼠标功能的键盘,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 ; 输入参数:无 ; 输出参数:无 ;********************************************************************************************/ Set_Report: MOV RAM_DATA,#21H ;;这里是直接往内部RAM送数据 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配置是否正确。看一下键盘数据是否只是81端点来实现。如果这些都正确,应该可以获取到数据的。 其实,点灯操作你不做也是可以获取到数据的,但是标准的过程都有这一步。
改了下点灯操作的子程序,能正确点灯了。 82口是键盘上的音量键,几个控制音量的键盘都有数据传上来。 数据处理传输应该是81口,但只能响应一次按键,就是说,每次上电后只能响应一次按键。 换别一款键盘,上电复位后键盘不停的送出数据,不管用81口或82口都是一样。 由此看来可能是程序的问题,键盘跟鼠标的操作还是不一样的。但不知道是哪一部分的问题。
用BUSHOUND软件抓电脑对键盘枚举的过程,我研究了两天,还不知道如何操作,网上也找不到相关的文档,望指点。
前面枚举正确的话,后面数据传输鼠标键盘应该是一样的,都是主机从对应端点下发IN包,设备没有响应返回NAK,设备响应返回ACK。 我们的程序只是针对普通键盘,你的键盘可能比较特殊,用BUSHOUND软件抓电脑对键盘枚举的过程主要是了解主机发送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后面跟数据17H和0D8H代表什么意义?程序里面没有作注解,INC文件里面也没有.
这是我们以前设置低速模式的命令,可以正常使用。 你也可以使用SET_USB_SPEED(04H)来设置总线速度,见CH375DS2.PDF。
两款不同品牌的键盘,一个数据输入正常,另一个键盘输入数据时,按下按键时要大约1秒钟才有数据传上来,是什么原因?还要作什么配置才行?
初始化的时候需要根据键盘速度设置总线速度,单片机端对对应端点一直发IN包,按键之后单片机端会检测到中断。 另外,你最好按照之前跟你说的用BUSHOUND软件抓一下电脑操作的数据。
;/******************************************************************************************** ; Set_PROTOCOL ; 打印机进纸一行:命令0AH ;
;********************************************************************************************/ Set_PROTOCOL_s: MOV RAM_DATA,#0AH ;;这里是直接往内部RAM送数据 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说明打印机应答超时,也就是说打印机没响应。检查命令发送是否正确,前面枚举是否正确通过。