usb_asm.asm
来自「dsp芯片TMS320C5416实验程序」· 汇编 代码 · 共 371 行
ASM
371 行
.mmregs
.def _D12WrCmd
.def _D12WrDat
.def _D12RdDat
.def _D12RdChipId
.def _D12SetAddr
.def _D12SetEp
.def _D12SetDma
.def _D12SendResume
.def _D12AckEp
.def _D12GetDma
.def _D12RdInt
.def _D12SelEp
.def _D12RdLastTrStat
.def _D12RdEpStat
.def _D12RdFrameNumber
.def _D12RdBulkEp
.def _D12SetMode
.def _D12SetEpStat
.def _D12WrEp
.def _D12RdEp
.def _Dead
.def _Delay
CPU_FREQ .set 50
CNT_DLY_100US .set (CPU_FREQ*100)
.text
D12WaitT .set 0x20
*****************************************************************************
*
* USB 数据/命令读写函数
*
* 函数定义:
* void D12WrCmd( U8 cmd )
* void D12WrDat( U8 data )
* U8 D12RdDat( )
*
* 返回值:D12RdDat返回实际读取的数据
* 注:这三个函数不需要堆栈,也不会破坏任何寄存器
*
*****************************************************************************
_D12WrCmd:
PORTW *(8h), 2101h
RPT #D12WaitT
NOP
RET
_D12WrDat:
PORTW *(8h), 2100h
;RETD
RPT #D12WaitT
NOP
RET
_D12RdDat:
PORTR 02100h, *(8h)
;RETD
RPT #D12WaitT
NOP
RET
*****************************************************************************
*
* 软件非精确延时
*
* 函数定义:
* void _Delay( int msecs )
*
* 返回值:无
* 注:与处理器的速度有关,根据需要修改CPU_FREQ
*
*****************************************************************************
_Delay:
MPY *(8H), #10, A
_Delay_Again:
RPT #CNT_DLY_100US
NOP
ADD #0FFFFh, A
BC _Delay_Again, AGT
RET
_Dead:
SSBX SXM
CALLD _Delay
LD #1000, A
SSBX XF
CALLD _Delay
LD #1000, A
RSBX XF
RET
*****************************************************************************
*
*
*
*****************************************************************************
_D12RdChipId:
CALLD _D12WrCmd
LD #0FDh, A
NOP
CALL _D12RdDat
CALLD _D12RdDat
LD A, 0, B
NOP
SFTL A, 8, A
OR B, 0, A
RET
_D12SetAddr:
CALLD _D12WrCmd
LD A, B
LD #0d0h, A
LD B, A
CALLD _D12WrDat
OR #80h, 0, A, A
RET
_D12SetEp:
CALLD _D12WrCmd
LD A, B
LD #0d8h, A
LD B, A
CALL _D12WrDat
RET
_D12SetDma:
CALLD _D12WrCmd
LD A, B
LD #0fbh, A
LD B, A
CALL _D12WrDat
RET
_D12SendResume:
CALLD _D12WrCmd
NOP
LD #0f6h, A
RET
_D12AckEp:
CALLD _D12WrCmd
NOP
LD A, B
CALLD _D12WrCmd
NOP
LD #0f1h, A
LD B, A
BCD _ACK_EP0, ANEQ
LD #0f2h, A
NOP
CALL _D12WrCmd
_ACK_EP0:
RET
_D12GetDma:
CALLD _D12WrCmd
LD #0fbh, A
NOP
CALL _D12RdDat
RET
_D12RdInt:
CALLD _D12WrCmd
LD #0f4h, A
NOP
CALL _D12RdDat
RET
_D12SelEp:
CALL _D12WrCmd
CALL _D12RdDat
RET
_D12RdEpStat:
CALLD _D12WrCmd
OR #80h, 0, A, A
CALL _D12RdDat
RET
_D12RdLastTrStat:
CALLD _D12WrCmd
OR #40h, 0, A, A
CALL _D12RdDat
RET
_D12RdFrameNumber:
CALLD _D12WrCmd
LD #0f5h, A
NOP
CALL _D12RdDat
CALLD _D12RdDat
LD A, B
NOP
ADD A, 8, B
LD B, A
RET
_D12SetMode:
CALLD _D12WrCmd
LD A, B
LD #0f3h, A
CALLD _D12WrDat
NOP
LD B, A
CALLD _D12WrDat
NOP
LD 1h, A
RET
_D12SetEpStat:
CALLD _D12WrCmd
OR #40h, 0, A
CALL _D12RdDat
RET
_D12RdBulkEp:
CALLD _D12RdEpStat ; read end point stat
STLM A, AR1 ; save data buffer point
LD #4h, A
STM #0h, AR2 ; blk size
STM #0h, AR3 ; bytes size
AND #60h, A
XOR #60h, A
BC _D12BulkRd_BLK, ANEQ ;
STM #1h, AR2
_D12BulkRd_BLK:
CALLD _D12SelEp ; read end point stat
NOP
LD #4h, A
BCD _D12BulkRd_End, AEQ
AND #1, A
CALLD _D12WrCmd
LD #0f0h, A
NOP
CALL _D12RdDat
CALL _D12RdDat
ADD *(13h), A
STLM A, AR3
;STLM A, AR4
STLM A, BRC
RPTB _D12BulkRdBlk_End-1
CALL _D12RdDat
STL A, *AR1+ ;
_D12BulkRdBlk_End:
CALLD _D12WrCmd
LD #0f2h, A
NOP
BANZ _D12BulkRd_BLK, *AR2-
_D12BulkRd_End:
LD *(13h), A
RET
*****************************************************************************
*
* USB 数据/命令读写函数
*
* 函数定义:
* void D12WrEp(U8 Ep, U8 buf[], U8 cnt)
*
* 返回值:无
*
*****************************************************************************
_D12WrEp:
PSHM 11h
CALL _D12SelEp
CALLD _D12WrCmd
NOP
LD #0f0h, A
CALLD _D12WrDat
NOP
LD #00h, A
LD 3h, A
CALL _D12WrDat
LD 3h, A
BC _D12WrEp_End, AEQ
MVDK 2h, 11h
MVDK 3h, 1ah
RPTB _D12WrEp_End-1
LD *AR1+, A
CALL _D12WrDat
_D12WrEp_End:
CALLD _D12WrCmd
NOP
LD #0fah, A
POPM 11h
RET
_D12RdEp:
PSHM 11h
PSHM 12h
PSHM 13h
CALL _D12SelEp
BCD _D12RdEp_End, AEQ
AND #1, 0, A
CALLD _D12WrCmd
NOP
LD #0f0h, A
CALL _D12RdDat
CALL _D12RdDat
STLM A, AR2 ; cnt = A
STLM A, AR3 ; cnt = A
BC _D12RdEp_SendIt, AEQ
MVDK 4h, 11h ; Buffer
_D12RdEp_Bytes:
CALL _D12RdDat
STL A, *AR1+
BANZ _D12RdEp_Bytes, *AR2-
_D12RdEp_SendIt:
CALLD _D12WrCmd
NOP
LD #0F2h, A
LD *(13h), A
_D12RdEp_End:
POPM 13h
POPM 12h
POPM 11h
RET
.end
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?