[求助]ch372做HID问题

下面是改写的汇编,前面的测试可以通过.但是程序不能进入MA02: SETB RED,而且CH372的INT#引脚一直为高电平,

;用CH372操作HID设备,比如键盘,鼠标 ;89C51,11.0592MHz晶振,CH372 CMD1 EQU 0BDF1H ;写命令口 CMD2 EQU 0BDF0H ;写数据口 RED EQU P1.7 ;红色指示灯 GED EQU P1.6 ;绿色指示灯 ENDP6 EQU 30H ENDP7 EQU 31H ORG 00H MAIN0: MOV P1,#0FFH MOV P2,#0FFH MOV R7,#05H ;执行硬件复位 ACALL CH372_WR_CMD_PORT ACALL DELAY40ms CPL GED ;执行硬件复位完绿灯指示 MOV R7,#06H ;测试工作状态 ACALL CH372_WR_CMD_PORT MOV R7,#55H ACALL CH372_WR_DATA_PORT ACALL CH372_RD_DATA_PORT CJNE A,#0AAH,MAIN0 CLR RED ;测试成功红绿指示 MOV R7,#06H ACALL set_usb_mode ;设置USB主机模式, 如果设备端是CH37X, 那么5和6均可 CJNE R7,#01H,MAIN0 ;操作不成功返回MAIN0 ACALL set_freq_void ;使375B进入低速模式

MA01: JNB P3.2,MA02 ; ACALL CH372_RD_DATA_PORT ; MOV A,R7 AJMP MA01 MA02: SETB RED ; AJMP $ set_usb_mode: MOV R6,07H MOV R7,#15H ;模式代码 ACALL CH372_WR_CMD_PORT_mod MOV R7,06H MOV ENDP7,#80H MOV ENDP6,#80H CLR A MOV R6,A set_usb_mode1: ACALL CH372_RD_DATA_PORT CJNE R7,#51H,set_usb_mode2 ;判断操作成功没有 MOV R7,#01H RET set_usb_mode2: INC R6 CJNE R6,#64H,set_usb_mode1 ;读100次 MOV R7,#00H RET CH372_WR_CMD_PORT_mod: ; ACALL CH372_WR_CMD_PORT MOV R7,06H CH372_WR_DATA_PORT: ;向CH372写入数据 MOV DPTR,#CMD2 MOV A,R7 MOVX @DPTR,A RET CH372_WR_CMD_PORT: ;向CH372写命令 MOV DPTR,#CMD1 MOV A,R7 MOVX @DPTR,A RET CH372_RD_DATA_PORT: ;读CH372的数据 MOV DPTR,#CMD2 MOVX A,@DPTR MOV R7,A RET set_freq_void: ;切换使372进入低速模式 MOV R7,#0BH ACALL CH372_WR_CMD_PORT MOV R7,#17H ACALL CH372_WR_DATA_PORT MOV R7,#0D8H ACALL CH372_WR_DATA_PORT RET DELAY40ms: MOV R7,#28H DELAY40ms1: ACALL DELAY_MS DJNZ R7,DELAY40MS1 RET DELAY_MS: MOV A,#0E6H DELAY_1MS: NOP NOP DJNZ ACC,DELAY_1MS ;每周期延时1毫秒 RET END

在你设置好模式之后,是不需要set_freq_void 这个函数的,也就是372不需要降主频的。


我试了把 set_freq_void 这个函数去掉了,也没有中断产生,CH372的INT#引脚一直为高电平.

下面这个函数说的 "/* 主机端等待操作完成, 返回操作状态 */" 是不是指PC操作系统 ?

unsigned char wait_interrupt() { /* 主机端等待操作完成, 返回操作状态 */ while( CH375_INT_WIRE ); /* 查询等待CH375操作完成中断(INT#低电平) */ CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 产生操作完成中断, 获取中断状态 */ return( CH375_RD_DAT_PORT() ); }


不是这个意思,在你设置好模式1之后,计算机就应该发送复位的命令给你的,实在你没处理的话,那么,计算机上面也应该出现无法识别的设备的。


只有登录才能回复,可以选择微信账号登录