📄 usbjk.asm
字号:
MOV A,#0F2H
MOVX @DPTR,A
MOV A,#0F0H
MOV DPTR,#PD12_COMMAND
MOVX @DPTR,A
MOV DPTR,#PD12_DATA
MOV A,#00H
MOVX @DPTR,A
MOV A,B
MOVX @DPTR,A
JNZ D12_TransmitRom1
MOV DPTR,#PD12_COMMAND
MOV A,#0FAH
MOVX @DPTR,A
RET
D12_TransmitRom1: MOV R5,#00H
D12_TransmitRom3: MOV A,R6
MOV DPL,A
MOV A,R7
ANL A,#7FH
MOV DPH,A
MOV A,R5
MOVC A,@A+DPTR
MOV DPTR,#PD12_DATA
MOVX @DPTR,A
INC R5
DJNZ B,D12_TransmitRom3
MOV DPTR,#PD12_COMMAND
MOV A,#0FAH
MOVX @DPTR,A
RET
;===============================================================
;应答HOST,入口:R6,R7为应答数据,B=发送长度
;===============================================================
D12_AckHost: MOV A,#01H
MOV DPTR,#PD12_COMMAND
MOVX @DPTR,A
MOV DPTR,#PD12_DATA
MOVX A,@DPTR
MOV DPTR,#PD12_COMMAND
MOV A,#0F2H
MOVX @DPTR,A
MOV DPTR,#PD12_COMMAND
MOV A,#0F0H
MOVX @DPTR,A
MOV DPTR,#PD12_DATA
MOV A,#00H
MOVX @DPTR,A
MOV A,B
MOVX @DPTR,A ;数据长度为02H
ORL A,#00H
JZ D12_Ack3
D12_Ack1: CJNE A,#01H,D12_Ack2
MOV A,R6
MOVX @DPTR,A
SJMP D12_Ack3
D12_Ack2: MOV A,R6
MOVX @DPTR,A
MOV A,R7
MOVX @DPTR,A
D12_Ack3: MOV A,#0FAH
MOV DPTR,#PD12_COMMAND
MOVX @DPTR,A
RET
Stall_EP0: MOV A,#40H
MOV DPTR,#PD12_COMMAND
MOVX @DPTR,A
MOV A,#01H
MOV DPTR,#PD12_DATA
MOVX @DPTR,A
MOV A,#41H
MOV DPTR,#PD12_COMMAND
MOVX @DPTR,A
MOV A,#01H
MOV DPTR,#PD12_DATA
MOVX @DPTR,A
RET
;==========================================================
;A=端点号,应答SETUP包
;==========================================================
D12_AcknowledgeEndpoint:PUSH ACC
MOV DPTR,#PD12_COMMAND
MOVX @DPTR,A
MOV DPTR,#PD12_DATA
MOVX A,@DPTR
MOV DPTR,#PD12_COMMAND
MOV A,#0F1H
MOVX @DPTR,A
POP ACC
ORL A,#00H
JNZ D12_AckEndpoint1
MOV DPTR,#PD12_COMMAND
MOV A,#0F2H
MOVX @DPTR,A
D12_AckEndpoint1: RET
;=================================================================================
;====================================================================================
;USB中断服务程序
;D0:控制输出端点,D1控制输入端点D2:EP1 Out,D3:EP1 In
;D4:主输出端点,D5:主输入端点,D6:总线复位,D7挂起改变
;D8:DMA EOT
;=============================================================
USB_INT0_PROC: CLR EX0
PUSH ACC
PUSH PSW
PUSH B
PUSH DPL
PUSH DPH
SETB PSW.3
SETB PSW.4
LCALL D12_RdInterruptReg ;读中断寄存器,入口:无,出口:B=寄存器1,A=寄存器2
MOV R2,A
ORL A,B
JZ END_INT_ISR
USB_INT_PROC1: MOV A,R2
JNB ACC.0,USB_INT_PROC2 ;DMA EOT
SETB DMA_Eot
USB_INT_PROC2: MOV A,B
JNB ACC.7,USB_INT_PROC3 ;挂起改变
SETB Suspend
USB_INT_PROC3: JNB ACC.6,USB_INT_PROC4 ;总线复位
SETB Bus_Reset
USB_INT_PROC4: JNB ACC.5,USB_INT_PROC5 ;主输入端点
LCALL EP2_IN_HANDLER
USB_INT_PROC5: JNB ACC.4,USB_INT_PROC6 ;主输出端点
LCALL EP2_OUT_HANDLER
USB_INT_PROC6: JNB ACC.3,USB_INT_PROC7 ;端点1输入
LCALL EP1_IN_HANDLER
USB_INT_PROC7: JNB ACC.2,USB_INT_PROC8 ;端点1输出
LCALL EP1_OUT_HANDLER
USB_INT_PROC8: JNB ACC.1,USB_INT_PROC9 ;控制输入端点
LCALL EP0_IN_HANDLER
USB_INT_PROC9: JNB ACC.0,END_INT_ISR ;控制输出端点
LCALL EP0_OUT_HANDLER
END_INT_ISR: POP DPH
POP DPL
POP B
POP PSW
POP ACC
SETB EX0
RETI
;==========================================================================================
EP2_IN_HANDLER: MOV A,#05H
LCALL D12_RdLastTransStatus
MOV R2,A
ANL A,#1EH ;00011110B
JZ EP2IN_NO_ERROR1 ;错误代码
MOV B,#05H ;端点号
MOV A,R2
LCALL SAVE_ERROR ;保存最后状态错误标志
EP2IN_NO_ERROR1: CLR USB_BULKINREADY ;该标志为“0”表示,主程序可以向主机发数据
RET
EP2_OUT_HANDLER: MOV A,#04H
LCALL D12_RdLastTransStatus
MOV R2,A
ANL A,#1EH ;00011110B
JZ EP2OUT_NO_ERROR1 ;错误代码
MOV B,#04H ;端点号
MOV A,R2
LCALL SAVE_ERROR ;保存最后状态错误标志
EP2OUT_NO_ERROR1: MOV A,#04H
LCALL D12_RdEndpointStatus
MOV B,A
ANL A,#60H
CJNE A,#60H,RDEP2OUT1
MOV R1,#RXDATA_BUF+20H
MOV B,#20H ;最大接收32个字节
LCALL RD_BULK_DATA ;R1=保存接收数据的地址,B=缓冲区最大长度
SETB RXNEWDATA_FLAG2
RDEP2OUT1: MOV R1,#RXDATA_BUF
MOV B,#20H ;最大接收32个字节
LCALL RD_BULK_DATA
SETB RXNEWDATA_FLAG1
RET
EP1_IN_HANDLER: MOV A,#03H
LCALL D12_RdLastTransStatus
MOV R2,A
ANL A,#1EH ;00011110B
JZ EP1IN_NO_ERROR1 ;错误代码
MOV B,#03H ;端点号
MOV A,R2
LCALL SAVE_ERROR
EP1IN_NO_ERROR1: SETB EP1TXREADY
RET
EP1_OUT_HANDLER: MOV A,#02H
LCALL D12_RdLastTransStatus
MOV R2,A
ANL A,#1EH ;00011110B
JNZ EP1OUT_NO_ERROR1 ;错误代码
RET
EP1OUT_NO_ERROR1: MOV B,#02H ;端点号
MOV A,R2
LCALL SAVE_ERROR
RET
;=============================================================================
EP0_IN_HANDLER: MOV A,#01H ;读端点0最后状态寄存器
MOV DPTR,#PD12_COMMAND
MOVX @DPTR,A
MOV DPTR,#PD12_DATA
MOVX A,@DPTR
MOV DPTR,#PD12_COMMAND
MOV A,#0F2H
MOVX @DPTR,A
MOV A,#01H
LCALL D12_RdLastTransStatus
MOV R2,A
ANL A,#1EH ;00011110B
JZ EP0IN_NO_ERROR1 ;错误代码
MOV B,#00H ;端点号
LCALL SAVE_ERROR ;保存最后状态错误标志
EP0IN_NO_ERROR1: MOV A,R2
MOV A,CONTROL_STATE
CJNE A,#USB_TRANSMIT,EP0_IN_END
MOV A,TransmitBufAddrH
JB ACC.7,TRANSMIT_ROMDATA ;D7=1时发送ROM内的数据
CLR C
MOV A,wTransmitLength ;发送数据的长度
SUBB A,wTransmitCount ;未发送数据字节数=发送长度-已发送的字节数
MOV R3,A
CLR C
SUBB A,#EP0_MAXPACKET_SIZE
JNC EP0IN_SENDDATA
MOV A,R3
JNZ EP0IN_SENDDATA2
MOV B,#00H
LCALL D12_WriteEndpoint
MOV CONTROL_STATE,#USB_IDLE
EP0_IN_END: RET
EP0IN_SENDDATA2: MOV A,R3
MOV B,A
SJMP EP0_SENDDATA3
EP0IN_SENDDATA: MOV B,#EP0_MAXPACKET_SIZE
MOV R3,#EP0_MAXPACKET_SIZE
EP0_SENDDATA3: MOV A,TransmitBufAddrL
MOV R0,A
MOV A,#01H ;发送端点号
LCALL D12_WriteEndpoint
MOV A,wTransmitCount
ADD A,R3
MOV wTransmitCount,A
CLR C
SUBB A,wTransmitLength
JNC EP0_TRANSMIT_OVER
RET
EP0_TRANSMIT_OVER: CLR A
MOV wTransmitCount,A
MOV wTransmitLength,A
MOV TransmitBufAddrL,A
MOV TransmitBufAddrH,A
MOV CONTROL_STATE,#USB_IDLE
RET
TRANSMIT_ROMDATA: MOV A,TransmitBufAddrH
ANL A,#7FH
MOV R7,A
MOV A,TransmitBufAddrL
MOV R6,A
CLR C
MOV A,wTransmitLength ;发送数据的长度
SUBB A,wTransmitCount ;未发送数据字节数=发送长度-已发送的字节数
MOV R3,A
CLR C
SUBB A,#EP0_MAXPACKET_SIZE
JNC TRANSMIT_ROMDATA1
MOV A,R3
JNZ TRANSMIT_ROMDATA3
MOV B,#00H
MOV A,#01H
LCALL D12_WriteEndpoint
MOV CONTROL_STATE,#USB_IDLE
RET
TRANSMIT_ROMDATA1: MOV R3,#EP0_MAXPACKET_SIZE
LCALL TRANSROMR
MOV CONTROL_STATE,#USB_TRANSMIT
RET
TRANSMIT_ROMDATA3: LCALL TRANSROMR
CLR C
MOV A,wTransmitCount
SUBB A,wTransmitLength
JNC TRANSMIT_ROMOVER
MOV CONTROL_STATE,#USB_TRANSMIT
RET
TRANSMIT_ROMOVER: CLR A
MOV wTransmitCount,A
MOV wTransmitLength,A
MOV TransmitBufAddrL,A
MOV TransmitBufAddrH,A
MOV CONTROL_STATE,#USB_IDLE
RET
;======================================================================================
TRANSROMR: MOV A,#01H ;发送端点号
MOV DPTR,#PD12_COMMAND
MOVX @DPTR,A
MOV DPTR,#PD12_DATA
MOVX A,@DPTR
MOV DPTR,#PD12_COMMAND
MOV A,#0F0H
MOVX @DPTR,A
MOV DPTR,#PD12_DATA
MOV A,#00H
MOVX @DPTR,A
MOV A,R3
MOVX @DPTR,A
MOV B,A
MOV R5,wTransmitCount
TRANSMIT_ROMDATA4: MOV A,R6
MOV DPL,A
MOV A,R7
ANL A,#7FH
MOV DPH,A
MOV A,R5
MOVC A,@A+DPTR
MOV DPTR,#PD12_DATA
MOVX @DPTR,A
INC R5
DJNZ B,TRANSMIT_ROMDATA4
MOV DPTR,#PD12_COMMAND
MOV A,#0FAH
MOVX @DPTR,A
MOV A,wTransmitCount
ADD A,R3
MOV wTransmitCount,A
RET
EP0_OUT_HANDLER: MOV A,#00H ;读端点0最后状态寄存器
LCALL D12_RdLastTransStatus
MOV R2,A
ANL A,#1EH ;00011110B
JZ EP0OUT_NO_ERROR1 ;错误代码
MOV B,#00H ;端点号
MOV A,R2
LCALL SAVE_ERROR ;保存最后状态错误标志
EP0OUT_NO_ERROR1: MOV A,R2
ANL A,#00100000B ;是SETUP包吗?
JZ EP0_IS_RECEIVE ;不是SETUP信息包,转
MOV R1,#bmRequestType
MOV B,#SETUP_PACKETLEN ;读数据长度,即SETUP包长
MOV A,#00H ;端点0
LCALL D12_ReadEndpoint ;读端点0的SETUP包
CJNE A,#SETUP_PACKETLEN,USB_RDERROR ;读到的长度不对,转
MOV A,#00H
LCALL D12_AcknowledgeEndpoint ;应答SETUP包
MOV A,#01H
LCALL D12_AcknowledgeEndpoint
MOV DPTR,#PD12_COMMAND ;设置端点使能
MOV A,#0D8H
MOVX @DPTR,A
MOV DPTR,#PD12_DATA
MOV A,#01H
MOVX @DPTR,A
MOV A,bmRequestType
; JNB ACC.7,HOST_TO_DEVICE
MOV CONTROL_STATE,#USB_IDLE
; SETB Setup_Packet ;置收到SETUP包标志
LCALL Control_Dispatcher
MOV A,#00H
MOV R0,#bmRequestType
MOV B,#08H
CLSSETUP1: MOV @R0,A
INC R0
DJNZ B,CLSSETUP1
RET
USB_RDERROR: MOV A,#00H
MOV B,#01H
LCALL D12_SetEndpointStatus
MOV A,#01H
MOV B,#01H
LCALL D12_SetEndpointStatus
MOV CONTROL_STATE,#USB_IDLE ;EP0_STATE=0时,状态空闲
RET
HOST_TO_DEVICE: MOV A,wLength
CLR C
SUBB A,#MAX_RXBUFFER_SIZE ;接收缓冲区的大小
JC OUT_DIRECTION2
MOV A,#00H
MOV B,#01H
LCALL D12_SetEndpointStatus
MOV A,#01H
MOV B,#01H
LCALL D12_SetEndpointStatus
MOV CONTROL_STATE,#USB_IDLE ;EP0_STATE=0时,状态空闲
RET
OUT_DIRECTION2: MOV A,wLength
MOV wReceiveLength,A
MOV wReceiveCount,#00H
MOV CONTROL_STATE,#USB_RECEIVE ;置EP0接收状态
RET
EP0_IS_RECEIVE: MOV A,CONTROL_STATE
CJNE A,#USB_RECEIVE,EP0_NORECEIVE
MOV B,#EP0_MAXPACKET_SIZE ;读数据长度
MOV A,#00H ;端点0
LCALL D12_ReadEndpoint ;读端点0
MOV A,B
ADD A,wReceiveCount
MOV wReceiveCount,A ;接收的字节数
MOV A,B
CJNE A,#EP0_MAXPACKET_SIZE,EP0_RECEIVE1
RET
EP0_NORECEIVE: MOV CONTROL_STATE,#USB_IDLE
RET
EP0_RECEIVE1: CLR C
MOV A,wReceiveCount
SUBB A,wReceiveLength
JNC EP0_RECEIVE2 ;数据接收完毕?
RET
EP0_RECEIVE2: MOV CONTROL_STATE,#USB_IDLE
; SETB Setup_Packet
LCALL Control_Dispatcher
MOV A,#00H
MOV R0,#bmRequestType
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -