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 + -
显示快捷键?