endp6_mode EQU 0F8H endp7_mode EQU 0F9H
SEND_ADDR EQU 070H RECV_ADDR EQU 030H
TOGGLE_FLAG EQU 0FAH ;数据缓冲区,用于保存接收到的下传数据,长度为0到64字节 VENDOR_CNT EQU 0FBH ;获得VENDOR的执行次数 ;************************************************************************* ORG 0000H LJMP MAIN ; 主程序入口 ;*************************************************************************
;********************************************************* ; 主程序 ;**********************************************************
设备已经插入。。。。。。
获得设备的设备描述符。。。。。。
设置USB设备端的USB地址。。。。。。。
获得设备的配置描述符。。。。。。
SET_CONFIG设置USB设备。。。。。。
DATA_TRANS: NOP ;************************ 数据传输打开
MOV R0,#endp7_mode MOV @R0,#080H MOV R0,#endp6_mode MOV @R0,#080H
MOV R1,#TOGGLE_FLAG MOV @R1,#01H
;*******************************
SET_INTF: MOV DPTR,#SET_INTERFACE ; 发送缓存地址 CLR A MOVC A,@A+DPTR MOV R7,A INC DPTR MOV R6,#00DH LCALL SEND_DATA ; 发送1字节数据 NOP
MOV R1,#TOGGLE_FLAG MOV @R1,#00H
CALL TOGGLE_RECV CALL TOGGLE_RECV MOV R6,#009H LCALL RECV_DATA ; 由设备读入64字节的数据
MOV DPTR,#CLT_STRUT3 ; 发送缓存地址 CLR A MOVC A,@A+DPTR MOV R7,A INC DPTR MOV R6,#00DH LCALL SEND_DATA ; 发送1字节数据 NOP
MOV DPTR,#CLT_DATA1 ; 发送缓存地址 CLR A MOVC A,@A+DPTR MOV R7,A INC DPTR MOV R6,#001H LCALL SEND_DATA ; 发送1字节数据 NOP
MOV DPTR,#CLT_DATA2 ; 发送缓存地址 CLR A MOVC A,@A+DPTR MOV R7,A INC DPTR MOV R6,#001H LCALL SEND_DATA ; 发送1字节数据 NOP
CALL TOGGLE_RECV CALL TOGGLE_RECV MOV R6,#009H LCALL RECV_DATA ; 由设备读入64字节的数据
MOV DPTR,#CLT_STRUT4 ; 发送缓存地址 CLR A MOVC A,@A+DPTR MOV R7,A INC DPTR MOV R6,#00DH LCALL SEND_DATA ; 发送1字节数据 NOP
CALL TOGGLE_RECV CALL TOGGLE_RECV MOV R6,#009H LCALL RECV_DATA ; 由设备读入64字节的数据
MOV DPTR,#CLT_STRUT9 ; 发送缓存地址 CLR A MOVC A,@A+DPTR MOV R7,A INC DPTR MOV R6,#00DH LCALL SEND_DATA ; 发送1字节数据 NOP
MOV DPTR,#CLT_DATA3 ; 发送缓存地址 CLR A MOVC A,@A+DPTR MOV R7,A INC DPTR MOV R6,#001H LCALL SEND_DATA ; 发送1字节数据 NOP
CALL TOGGLE_RECV CALL TOGGLE_RECV MOV R6,#009H LCALL RECV_DATA ; 由设备读入64字节的数据
GET_VENDOR: MOV R1,#VENDOR_CNT MOV @R1,#0BH
GET_VENDOR0: MOV R1,#VENDOR_CNT DEC @R1 MOV A,@R1 JNZ GET_VENDOR0
;******************************* GET: MOV R1,#TOGGLE_FLAG MOV @R1,#00H
CALL CLR_SEND_STALL CALL CLR_RECV_STALL MOV DPTR,#SOURCE_PRI ; 发送缓存地址 CLR A MOVC A,@A+DPTR MOV R7,A INC DPTR MOV R6,#031H CALL TOGGLE_SEND LCALL SEND_DATA ; 发送1字节数据
MOV DPTR,#SOURCE_PRI ; 发送缓存地址 CLR A MOVC A,@A+DPTR MOV R7,A INC DPTR MOV R6,#031H ;CALL TOGGLE_SEND LCALL SEND_DATA ; 发送1字节数据
ISSUE_REQ_SUCCESS: CALL TOGGLE_RECV CALL TOGGLE_RECV MOV R6,#039H LCALL RECV_DATA ; 由设备读入64字节的数据 NOP
SUCCESS_READ: MOV R1,#TOGGLE_FLAG MOV @R1,#00H
JMP GET_VENDOR ; 可以再次继续发送数据或者接收数据
;********************************************************* ; 子程序
;*********向从设备发送数据子程序*********
SEND_DATA: MOV DATAIN_OUT,#CMD_WR_USB_DATA7 CALL WRITEADDRESS ; 向从设备发送数据 MOV DATAIN_OUT,R7 ; 发送1个字节,要多发可以循还设置 CALL WRITEDATA MOV A,R7 JZ WR_NONE MOV R4,A WR_A_BYTE: CLR A MOVC A,@A+DPTR MOV DATAIN_OUT,A CALL WRITEDATA INC DPTR NOP DJNZ R4,WR_A_BYTE NOP
MOV R1,#TOGGLE_FLAG MOV A,@R1 JZ ISSUE_TOKEN_OUT WR_NONE: CALL TOGGLE_SEND NOP ISSUE_TOKEN_OUT: MOV DATAIN_OUT,#CMD_ISSUE_TOKEN CALL WRITEADDRESS MOV DATAIN_OUT,R6 ; 高4位目的端点号, 低4位令牌PID: DEF_USB_PID_OUT CALL WRITEDATA JB CH375_INT_WIRE,$