📄 usbjk.asm
字号:
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 + -