📄 usb_lib.asm
字号:
;;Established date: 2006/03/01
;;********************************************************************
SBR_FIFO0_RD_Check:
MOV A,0F8H
ANDM A,UCC ;select endpoint0 FIFO
MOV A,00000000B
JMP L_FIFO_Check
;;********************************************************************
SBR_FIFO0_WR_Check:
MOV A,0F8H
ANDM A,UCC ;select endpoint0 FIFO
MOV A,00000010B
JMP L_FIFO_Check
;;********************************************************************
SBR_FIFO1_WR_Check:
MOV A,0F8H
ANDM A,UCC
SET UCC.0 ;select endpoint1 FIFO
MOV A,00000010B ;0000 1010B
; JMP L_FIFO_Check
;;--------------------------------------------------------------------
L_FIFO_Check:
MOV M_temp1,A
MOV A,C_MISC
MOV MP1,A
MOV A,R1
AND A,11111000B ;1110 0000B
OR A,M_Temp1
MOV R1,A
SET R1.@USB_REQ
CALL SBR_Delay2us
SET Z
SNZ R1.@Ready
CLR Z ;Z=1 Ready
RET
;;********************************************************************
;;Read data from fifo to data buffer.
SBR_ReadFIFO0:
MOV A,C_FIFO0Address
JMP L_ReadFIFO
;;********************************************************************
;SBR_ReadFIFO1: ;;The endpoint 1 is interrupt in input, so no read operation.
; MOV A,C_FIFO1Address
; JMP L_ReadFIFO
;;--------------------------------------------------------------------
L_ReadFIFO:
MOV M_FIFOAddress,A ;save FIFO's address
CLR M_DataPacketLength ;clear Packet Length
MOV A,OFFSET M_FIFOBAK0 ;get address of FIFO memory
MOV MP0,A
L_ReadFIFOLoop:
MOV A,M_FIFOAddress ;load FIFO address
MOV MP1,A
MOV A,R1 ;load FIFO data
MOV R0,A ;save FIFO data
INC M_DataPacketLength ;count Packet length(<= 8 byte)
INC MP0 ;next save address
MOV A,C_FIFOSize ;load max length of one packet
XOR A,M_DataPacketLength ;data packet's length = max length?
SZ Z
JMP L_ExitprocessFIFO ;yes,exit read FIFO
MOV A,C_MISC
MOV MP1,A
CALL SBR_Delay2us
SZ R1.@Ready ;ready for next data?(if EOF then ready=0)
JMP L_ReadFIFOLoop
JMP L_ExitProcessFIFO
;;********************************************************************
;;Write data from data buffer to fifo.
SBR_WriteFIFO0:
MOV A,C_FIFO0Address
JMP L_WriteFIFO
;;********************************************************************
SBR_WriteFIFO1:
MOV A,C_FIFO1Address
; JMP L_WriteFIFO
;;--------------------------------------------------------------------
L_WriteFIFO:
MOV M_FIFOAddress,A
MOV A,OFFSET M_FIFOBAK0
MOV MP0,A
L_WriteFIFOLoop:
SZ M_DataPacketLength ;the data in buffer is Zero?
JMP L_WriteFIFOTag ;no,have data,next
JMP L_ExitProcessFIFO ;yes,no data,exit
L_WriteFIFOTag:
MOV A,M_FIFOAddress ;load FIFO address
MOV MP1,A
MOV A,R0 ;load buffer's data
MOV R1,A ;write FIFO
DEC M_DataPacketLength ;packet's length dec 1
INC MP0 ;next buffer data
MOV A,C_MISC
MOV MP1,A
CALL SBR_Delay2us
SZ R1.@Ready ;ready to write next data
JMP L_WriteFIFOLoop ;yes,continue write data to FIFO
JMP L_ExitProcessFIFO
;;--------------------------------------------------------------------
SBR_Write_0_Packet:
L_ExitProcessFIFO:
MOV A,C_MISC
MOV MP1,A
MOV A,00000010B
XORM A,R1 ;TX CPL
; CALL SBR_Delay2us
NOP
NOP
NOP
NOP
CLR R1.@USB_Req ;CLR REQ(MISC.0)
RET
;;********************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -