⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbjk.asm

📁 51系列的USB固件程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
						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 + -