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

📄 usbjk.asm

📁 51系列的USB固件程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:

PD12_COMMAND			EQU 0401H
PD12_DATA				EQU 0400H
B8530_CONTROL			EQU 0200H
B8530_DATA				EQU 0201H
A8530_CONTROL			EQU 0202H
A8530_DATA				EQU 0203H
;===============常数定义======================
USB_IDLE				EQU 00H
USB_RECEIVE				EQU 01H
USB_TRANSMIT			EQU 02H
MAX_CONTROLDATA_SIZE	EQU 10H		;定义控制数据包为16字节
D12_FULLEMPTY			EQU 01H
EP0_MAXPACKET_SIZE		EQU 10H
EP2_MAXPACKET_SIZE		EQU 40H
EP1_MAXPACKET_SIZE		EQU 04H
MAX_RXBUFFER_SIZE		EQU 10H
RXDATA_BUF				EQU 0C0H
TXDATA_BUF				EQU 80H
USB_RECIPIENT_MASK		EQU 1FH
USB_RECIPIENT_DEVICE	EQU 00H
USB_RECIPIENT_INTERFACE	EQU 01H
USB_RECIPIENT_ENDPOINT	EQU 02H	
FEATURE_REMOTE_WAKEUP	EQU 01H
FEATURE_TEST_MODE		EQU 02H
MAX_EP_MASK				EQU 07H
D12_STALL				EQU	02h
SETUP_PACKETLEN			EQU 08H
USB_REQUEST_TYPE_MASK	EQU 60H
NUMBER_STD_REQ			EQU 0BH
USB_STANDARD_REQUEST	EQU 00H
USB_VENDOR_REQUEST		EQU 20H
USB_CLASS_REQUEST		EQU 40H
ALL_CONFIG_LEN			EQU 20H
;==========================================================
STACK					EQU 60H
wTransmitCount			EQU 30H		;USB EP0发送数据时,已发送数据的字节数
wTransmitLength			EQU 31H		;USB EP0发送数据时,需要发送的数据长度
TransmitBufAddrL		EQU 32H		;USB EP0发送数据时,发送数据区首址L
TransmitBufAddrH		EQU 33H		;USB EP0发送数据时,发送数据区首址H(D7=0,缓冲区为RAM,否则为ROM)
Delay_50ms				EQU 34H
CONTROL_STATE			EQU 35H
wReceiveLength			EQU 36H
wReceiveCount			EQU 37H
Dev_Configured			EQU 38H
LASTERROR				EQU 39H
bmRequestType			EQU	40H		;1Byte USB协议SETUP通信包定义
bRequest				EQU 41H		;1Byte
wValue					EQU 42H		;2Byte
wIndex					EQU 44H		;2Byte
wLength					EQU 46H		;2Byte
;======================================================
;USBFlags位定义

Bus_Reset				BIT	02H
Suspend					BIT 03H
Remote_Wakeup			BIT 09H
Dma_Eot					BIT 04H
Delay_50ms_Flag			BIT 01H
EP1TXREADY				BIT 06H		;该标志为“0”表示,主程序可以通过EP2向主机发数据
USB_BULKINREADY			BIT 05H		;该标志为“0”表示,主程序可以通过EP4向主机发数据
RXNEWDATA_FLAG2			BIT 07H		;该标志为“1”表示RXDATA_BUF+20H缓冲区有新数据
RXNEWDATA_FLAG1			BIT 08H		;该标志为“1”表示RXDATA_BUF缓冲区有新数据
;========================================================

					
					ORG 0000H
START:				LJMP MAIN_PROC

					ORG 0003H
					LJMP USB_INT0_PROC
					
					ORG 000BH
					LJMP TIME0_PROC

;================================================================
MAIN_PROC:				MOV SP,#STACK
						MOV PSW,#00H
						MOV  P1,#0FFh
						MOV PSW,#00H
                		MOV R0,#7FH
                		CLR A
CSH00:          		MOV @R0,A
                		DJNZ R0,CSH00           ;清洗00H~7FH块
						MOV TMOD,#11H			;定时器0,1设为16位定时模式
                		MOV SCON,#00H
                		MOV TCON,#00H			;外部中断0,设为低电平触发
                		MOV TH0,#4CH			;50毫秒定时
                		MOV TL0,#00H			;
                		MOV IE,#02H				;允许定时器0及外部中断0中断
                		MOV IP,#01H
                		MOV P3,#0FFH
CSH02:					MOV R0,#80H
						MOV B,#7FH
CSHN1:					MOV @R0,A
						INC R0
						DJNZ B,CSHN1
						MOV R0,#00H
						SETB EA
						SETB TR0
						LCALL USB_INITR
						MOV Delay_50ms,#40H				;延时1秒
						SETB Delay_50ms_Flag
						JB Delay_50ms_Flag,$
						LCALL CONNECT_USB
						SETB EX0
						;MOV Delay_50ms,#0A0H				;延时4秒
						;SETB Delay_50ms_Flag
						;JB Delay_50ms_Flag,$
						
						;SETB EX0
MAINLOOP:				JNB Bus_Reset,MAIN_COMMUTE			;响应总线复位请求
						;CLR EX0
						CLR Bus_Reset
						;LCALL USB_INITR
						;MOV Delay_50ms,#4AH				;延时1秒
						;SETB Delay_50ms_Flag
						;JB Delay_50ms_Flag,$
						;LCALL CONNECT_USB
						;MOV Delay_50ms,#0A0H				;延时4秒
						;SETB Delay_50ms_Flag
						;JB Delay_50ms_Flag,$
						;SETB EX0
MAIN_COMMUTE:			JNB Suspend,MAINLOOP
						CLR Suspend
						;MOV DPTR,#PD12_COMMAND
						;MOV A,#0F6H
						;MOVX @DPTR,A
						LJMP MAINLOOP
;=================================================================================						
USB_INITR:				MOV DPTR,#PD12_COMMAND				;读中断寄存器
						MOV A,#0F4H
						MOVX @DPTR,A
						MOV DPTR,#PD12_DATA
						MOVX A,@DPTR
						MOVX A,@DPTR
						MOV DPTR,#PD12_COMMAND				;设置DMA为off
						MOV A,#0FBH
						MOVX @DPTR,A
						MOV DPTR,#PD12_DATA
						MOV A,#00H
						MOVX @DPTR,A
						
						
						MOV DPTR,#PD12_COMMAND				;设置地址使能
						MOV A,#0D0H
						MOVX @DPTR,A
						MOV DPTR,#PD12_DATA
						MOV A,#80H
						MOVX @DPTR,A

						MOV DPTR,#PD12_COMMAND				;设置端点使能
						MOV A,#0D8H
						MOVX @DPTR,A
						MOV DPTR,#PD12_DATA
						MOV A,#01H
						MOVX @DPTR,A
						
						MOV DPTR,#PD12_COMMAND
						MOV A,#0F3H
						MOVX @DPTR,A
						MOV DPTR,#PD12_DATA					;设置模式
						MOV A,#06H
						MOVX @DPTR,A
						MOV A,#4BH
						MOVX @DPTR,A						
						RET
						
CONNECT_USB:			MOV DPTR,#PD12_COMMAND
						MOV A,#0F3H
						MOVX @DPTR,A
						MOV DPTR,#PD12_DATA
						MOV A,#16H
						MOVX @DPTR,A
						MOV A,#4BH
						MOVX @DPTR,A
						MOV DPTR,#PD12_COMMAND
						MOV A,#0FBH
						MOVX @DPTR,A
						MOV DPTR,#PD12_DATA
						MOV A,#0C0H						;使能EP4,EP5
						MOVX @DPTR,A
						
						MOV DPTR,#PD12_COMMAND				;设置地址使能
						MOV A,#0D0H
						MOVX @DPTR,A
						MOV DPTR,#PD12_DATA
						MOV A,#80H
						MOVX @DPTR,A

						MOV DPTR,#PD12_COMMAND				;设置端点使能
						MOV A,#0D8H
						MOVX @DPTR,A
						MOV DPTR,#PD12_DATA
						MOV A,#01H
						MOVX @DPTR,A
						RET

TIME0_PROC:				PUSH ACC
						PUSH B
						PUSH DPL
						PUSH DPH
						PUSH PSW
                		MOV TH0,#0BEH			;50毫秒定时
                		MOV TL0,#0E5H			;
						JNB Delay_50ms_Flag,T0_END
						DJNZ Delay_50ms,T0_END
						CLR Delay_50ms_Flag
T0_END:					POP PSW
						POP DPH
						POP DPL
						POP B
						POP ACC
						RETI
					
;*************************************************************
;底层驱动处理
;*************************************************************
;入口:B=地址
;============================================================
D12_SetAddressEnable:	MOV DPTR,#PD12_COMMAND
						MOV A,#0D0H
						MOVX @DPTR,A
						MOV A,B
						ORL A,#80H
						MOV DPTR,#PD12_DATA
						MOVX @DPTR,A
						RET
;=============================================================
;入口:PSW.5=1,设置普通/同步端点使能
;=============================================================
D12_SetEndpointEnable:	MOV DPTR,#PD12_COMMAND
						MOV A,#0D8H
						MOVX @DPTR,A
						JB PSW.5,D12_EnableEndpoint
						CLR A
						SJMP D12_TranCommandPort
D12_EnableEndpoint:		MOV A,#01H
D12_TranCommandPort:	MOV DPTR,#PD12_DATA
						MOVX @DPTR,A
						RET
;=============================================================
;入口:
;=============================================================
;D12_SetMode:			MOV DPTR,#PD12_COMMAND
;						MOV A,#0F3H
;						MOVX @DPTR,A
;						MOV DPTR,PD12_DATA
;						MOV A,B
;						MOVX @DPTR,A
;						MOV A,bClkDiv
;						MOVX @DPTR,A
;						RET

;D12_SetDMA:				MOV DPTR,#PD12_COMMAND
;						MOV A,#0FBH
;						MOVX @DPTR,A
;						MOV DPTR,#PD12_DATA
;						MOV A,B
;						MOVX DPTR,A
;						RET
;=============================================================						
;读中断寄存器,入口:无,出口:B=寄存器1,A=寄存器2
;=============================================================
D12_RdInterruptReg:		MOV DPTR,#PD12_COMMAND
						MOV A,#0F4H
						MOVX @DPTR,A
						MOV DPTR,#PD12_DATA
						MOVX A,@DPTR
						MOV B,A
						MOVX A,@DPTR
						RET
						
D12_SelectEndpoint:		MOV DPTR,#PD12_COMMAND
						MOVX @DPTR,A
						MOV DPTR,#PD12_DATA
						MOVX A,@DPTR
						RET

D12_RdLastTransStatus:	ADD A,#40H
						MOV DPTR,#PD12_COMMAND
						MOVX @DPTR,A
						MOV DPTR,#PD12_DATA
						MOVX A,@DPTR
						RET

D12_RdEndpointStatus:	ADD A,#80H
						MOV DPTR,#PD12_COMMAND
						MOVX @DPTR,A
						MOV DPTR,#PD12_DATA
						MOVX A,@DPTR
						RET
;============================================================
;入口:A=端点号,B=状态
;============================================================
D12_SetEndpointStatus:	ADD A,#40H
						MOV DPTR,#PD12_COMMAND
						MOVX @DPTR,A
						MOV A,B
						MOV DPTR,#PD12_DATA
						MOVX @DPTR,A
						RET

D12_SendResume:			MOV DPTR,#PD12_COMMAND
						MOV A,#0F6H
						MOVX @DPTR,A
						RET

D12_RdCurFrameNumber:	MOV DPTR,#PD12_COMMAND
						MOV A,#0F5H
						MOVX @DPTR,A
						MOV DPTR,#PD12_DATA
						MOVX A,@DPTR
						MOV B,A
						MOVX A,@DPTR			;低8位放B,高八位在A
						RET

D12_ReadChipID:			MOV DPTR,#PD12_COMMAND
						MOV A,#0FDH
						MOVX @DPTR,A
						MOV DPTR,#PD12_DATA
						MOVX A,@DPTR
						MOV B,A
						MOVX A,@DPTR			;低8位放B,高八位在A
						RET
;============================================================
;入口:R1=保存接收数据的地址,A=端点号,B=应读的字节数
;R1=接收缓冲区首地址
;出口:B=本次接收的字节数
;============================================================
D12_ReadEndpoint:		MOV DPTR,#PD12_COMMAND
						MOVX @DPTR,A
						MOV DPTR,#PD12_DATA
						MOVX A,@DPTR
						ANL A,#D12_FULLEMPTY				;D0=0缓冲区空
						JNZ D12_ReadEndpoint1
						RET
D12_ReadEndpoint1:		MOV DPTR,#PD12_COMMAND
						MOV A,#0F0H
						MOVX @DPTR,A
						MOV DPTR,#PD12_DATA
						MOVX A,@DPTR
						MOVX A,@DPTR
						PUSH ACC
						CLR C
						SUBB A,B
						JC D12_RdEndpoint2
						POP ACC
						PUSH B
D12_RdEndpoint2:		POP B
						PUSH B
						MOV DPTR,#PD12_DATA
RdEndpoint3:			MOVX A,@DPTR
						MOV @R1,A
						INC R1
						DJNZ B,RdEndpoint3
						MOV DPTR,#PD12_COMMAND
						MOV A,#0F2H
						MOVX @DPTR,A
						POP B
						MOV A,B
						RET
;============================================================
;入口:R1=保存接收数据的地址,B=缓冲区最大长度
;出口:B=本次接收的字节数
;============================================================
RD_BULK_DATA:			MOV A,#04H
						MOV DPTR,#PD12_COMMAND
						MOVX @DPTR,A
						MOV DPTR,#PD12_DATA
						MOVX A,@DPTR
						ANL A,#D12_FULLEMPTY
						JNZ RD_BULK_DATA2
						CLR A
						RET
RD_BULK_DATA2:			MOV DPTR,#PD12_COMMAND
						MOV A,#0F0H
						MOVX @DPTR,A
						MOV DPTR,#PD12_DATA
						MOVX A,@DPTR
						MOVX A,@DPTR
						MOV R3,A
						CLR C
						SUBB A,B
						JC RD_BULK_DATA3
						MOV A,B
						MOV R3,A
RD_BULK_DATA3:			MOV DPTR,#PD12_DATA
						MOVX A,@DPTR
						MOV @R1,A
						INC R1
						DJNZ R3,RD_BULK_DATA3
						MOV DPTR,#PD12_COMMAND
						MOV A,#0F2H
						MOVX @DPTR,A
						MOV A,B
						RET
;===============================================================
;A=选择的端点号,B=本次发送的数据字节数,R0=发送缓冲区首地址
;===============================================================
D12_WriteEndpoint:		MOV DPTR,#PD12_COMMAND
						MOVX @DPTR,A
						MOV DPTR,#PD12_DATA
						MOVX A,@DPTR
						MOV A,#0F0H
						MOV DPTR,#PD12_COMMAND
						MOVX @DPTR,A
						MOV A,#00H
						MOV DPTR,#PD12_DATA
						MOVX @DPTR,A
						MOV A,B
						MOVX @DPTR,A
						JNZ D12_writeEndpoint1
						MOV A,#0FAH
						MOV DPTR,#PD12_COMMAND
						MOVX @DPTR,A
						RET
D12_writeEndpoint1:		MOV A,@R0
						MOVX @DPTR,A
						INC R0
						DJNZ B,D12_WriteEndpoint1
						MOV A,#0FAH
						MOV DPTR,#PD12_COMMAND
						MOVX @DPTR,A
						RET
;===============================================================
;A=选择的端点号,B=本次发送的数据字节数,R6,R7=发送ROM区首地址
;===============================================================
D12_TransmitRom:		MOV A,#01H
						MOV DPTR,#PD12_COMMAND
						MOVX @DPTR,A
						MOV DPTR,#PD12_DATA
						MOVX A,@DPTR
						MOV DPTR,#PD12_COMMAND

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -