现在的问题是单片机通过中断能接收到上位机传来的数据,但取反后送回给上位机,就看不到数据了,并且不能产生上传成功的中断了。我把主要的程序写出来(是用汇编编的),大部分都是参考沁恒的程序: CH375_CMD_PORT EQU 0100H ;CH375命令口的地址,地址译码后自动片选 CH375_DAT_PORT EQU 0000H ;CH375命令口的地址,地址译码后自动片选 ;中断服务子程序: CH375_INTER: PUSH PSW ;现场保护 PUSH ACC PUSH DPL PUSH DPH PUSH 01H ;R1 PUSH 02H ;R2 MOV DPTR,#CH375_CMD_PORT ;命令口地址 MOV A,#CMD_GET_STATUS MOVX @DPTR,A ;获取中断状态并取消中断请求 NOP ;如果时钟频率低于16MHz则无需该指令延时 MOV DPTR,#CH375_DAT_PORT ;数据口地址 MOVX A,@DPTR ;返回操作状态 CLR IE0 ;清中断标志,对应于INT0中断 CJNE A,#USB_INT_EP2_OUT,CH375_INT_1 ;批量端点下传成功 LJMP CH375_DOWN_OK ;USB批量数据接收成功,USB端点2的OUT CH375_INT_1: CJNE A,#USB_INT_EP2_IN,CH375_INT_2 ;批量端点上传成功 LJMP CH375_UP_OK ;USB批量数据发送成功,USB端点2的IN CH375_INT_2: CJNE A,#USB_INT_EP1_IN,CH375_INT_3 ;中断端点 LJMP CH375_UP_INT_OK ;USB中断数据发送成功,USB端点1的IN CH375_INT_3: SJMP CH375_INT_RET CH375_INT_RET: POP 02H ;R2 POP 01H ;R1 POP DPH POP DPL POP ACC POP PSW ;恢复寄存器 RETI ; USB批量数据接收成功 CH375_DOWN_OK: MOV DPTR,#CH375_CMD_PORT ;命令口地址 MOV A,#CMD_RD_USB_DATA MOVX @DPTR,A ;从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 NOP ;如果时钟频率低于16MHz则无需该指令延时 MOV DPTR,#CH375_DAT_PORT ;数据口地址 MOVX A,@DPTR ;首先读取后续数据长度 MOV R2,A JZ CH375_INT_RET ;长度为0,没有数据则直接退出 MOV RECV_LEN,A MOV R1,#RECV_BUFFER ;接收缓冲区 CH375_INT_RECV: MOVX A,@DPTR ;接收数据 MOV @R1,A INC R1 DJNZ R2,CH375_INT_RECV ;继续接收数据直至结束 CALL PROCESS LJMP CH375_INT_RET ; USB批量数据发送成功 CH375_UP_OK: NOP CH375_INT_UNLK: MOV DPTR,#CH375_CMD_PORT ;命令口地址 MOV A,#CMD_UNLOCK_USB MOVX @DPTR,A ;释放当前USB缓冲区 CLR FLAG_SEND_WAIT ;发送完成 LJMP CH375_INT_RET ; USB中断数据发送成功 CH375_UP_INT_OK: MOV DPTR,#CH375_CMD_PORT ;命令口地址 MOV A,#CMD_UNLOCK_USB MOVX @DPTR,A ;释放当前USB缓冲区 CLR FLAG_INT_WAIT ;中断数据已经被发送完成 LJMP CH375_INT_RET
;将从主机接收到的数据依次取反送回给主机 PROCESS: MOV R2,RECV_LEN MOV R1,#RECV_BUFFER QUFAN: MOV A,@R1 CPL A MOV @R1,A INC R1 DJNZ R2,QUFAN MOV R7,RECV_LEN MOV R0,#RECV_BUFFER CALL CH375_UPLOAD RET
; 上传数据块子程序(通过批量端点上传) ; ENTRY: R0 指向存放了准备上传数据的缓冲区, R7 准备上传的数据长度, 有效数值是0到64 ; USE: ACC, R0, R7, DPTR CH375_UPLOAD: JB FLAG_SEND_WAIT,CH375_UPLOAD ;如果正在等待发送(前次发送尚未完成)则继续等待 CLR EX0 ;为了防止中途被中断而乱了顺序,必须先禁止中断 MOV DPTR,#CH375_CMD_PORT ;命令口地址 MOV A,#CMD_WR_USB_DATA7 MOVX @DPTR,A ;向USB端点2的发送缓冲区写入数据块 NOP ;如果时钟频率低于16MHz则无需该指令延时 MOV DPTR,#CH375_DAT_PORT ;数据口地址 MOV A,R7 MOVX @DPTR,A ;首先写入后续数据长度 CH375_UPLOAD_1: MOV A,@R0 INC R0 MOVX @DPTR,A ;发送数据 DJNZ R7,CH375_UPLOAD_1 ;继续发送数据直至结束 SETB FLAG_SEND_WAIT ;置等待发送标志 SETB EX0 ;允许中断 RET
因为我没有用译码电路,所以直接用两个端口控制CH372,分别是A15接CS,A8接CH372的A0,所以数据地址和命令地址就是上面那样,应该没什么问题吧?