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

📄 d12driver.asm

📁 dsp转换USB通讯程序样例
💻 ASM
字号:
#include "PDIUSBD12.h"
#include "defBF531.h"

.global bEnable,bAddress,bEndp,bStalled,bLen,pBuf;

.section SECTION_Data;  //8bit width, total size: 16K Byte
.align 4;
.byte4 bAddress;
.byte4 bEnable;
.byte4 bEndp;
.byte4 bStalled;
.byte4 bLen;
.byte4 pBuf;

.section SECTION_Code2;

/*********************************************************************
** 函数名称: InitD12()
** 功能描述: 设置D12与硬件的连接, 初始化D12, 复位D12
** 输   入: 无
** 输   出: 0: 初始化成功    1: 初始化失败  ,存于D12Data
**********************************************************************/
.global InitD12;
InitD12:
	[ --SP ] = RETS;
	[ --SP ]=p0;		//push p0
	[ --SP ]=r0;		//push r0
	[ --SP ]=r1;		//push r1
	
	call ReConnectD12;
	
	call ReadChipID;
	
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	r0=[p0];
	r1=0x1012;
	cc=r0==r1;
	if !cc jump InitFail;

	r0=1;
	jump InitD12_Exit;
	
InitFail:
	r0=0;
			
InitD12_Exit:
	[p0]=r0;
	
	r1=[ SP++ ];		//pop r1
	r0=[ SP++ ];		//pop r0
	p0=[ SP++ ];		//pop p0
	RETS = [ SP++ ];
	rts;
InitD12.end:


/*******************************************************************
** 函数名称: UsbServe()
** 功能描述: USB事件处理函数
** 输	 入: 无
** 输	 出: 无
********************************************************************/
.global UsbServe;
UsbServe:
	[ --SP ] = RETS;
	[ --SP ]=p0;		//push p0
	[ --SP ]=r0;		//push r0
	
	
	
	r0=[ SP++ ];		//pop r0
	p0=[ SP++ ];		//pop p0
	RETS = [ SP++ ];
	rts;
UsbServe.end:


/*******************************************************************
** 函数名称: Ep1_TxDone()
** 功能描述: 端点1 IN(发送)处理处理函数
** 输	 入: 无
** 输	 出: 无
********************************************************************/
.global Ep1_TxDone;
Ep1_TxDone:
	[ --SP ] = RETS;
	[ --SP ]=p0;		//push p0
	[ --SP ]=r0;		//push r0
	
	p0.l=lo(bEndp);
	p0.h=hi(bEndp);
	r0=0x3;
	[p0]=r0;
	call ReadLastTransactionStatus;
	
	r0=[ SP++ ];		//pop r0
	p0=[ SP++ ];		//pop p0
	RETS = [ SP++ ];
	rts;
Ep1_TxDone.end:


/*******************************************************************
** 函数名称: Ep1_RxDone()
** 功能描述: 端点1 OUT(接收)处理处理函数
** 输	 入: 无
** 输	 出: 无
********************************************************************/
.global Ep1_RxDone;
Ep1_RxDone:
	[ --SP ] = RETS;
	[ --SP ]=p0;		//push p0
	[ --SP ]=r0;		//push r0
	
	p0.l=lo(bEndp);
	p0.h=hi(bEndp);
	r0=0x2;
	[p0]=r0;
	call ReadLastTransactionStatus;
			
	p0.l=lo(bLen);
	p0.h=hi(bLen);
	r0=D12_MAX_PACKET_SIZE;
	[p0]=r0;
	
	p0.l=lo(pBuf);
	p0.h=hi(pBuf);
	r0.l=lo(UsbCtrlBuf);
	r0.h=hi(UsbCtrlBuf);
	[p0]=r0;
	call ReadEndpoint;

	//add by wayman@2005-11-29
	p0.l=lo(bEndp);
	p0.h=hi(bEndp);
	r0=0x2;
	[p0]=r0;
	call ClearBuf;
			
	r0=[ SP++ ];		//pop r0
	p0=[ SP++ ];		//pop p0
	RETS = [ SP++ ];
	rts;
Ep1_RxDone.end:



/*******************************************************************
** 函数名称: Ep2_TxDone()
** 功能描述: 端点2 IN(发送)处理处理函数
** 输	 入: 无
** 输	 出: 无
********************************************************************/
.global Ep2_TxDone;
Ep2_TxDone:
	[ --SP ] = RETS;
	[ --SP ]=p0;		//push p0
	[ --SP ]=r0;		//push r0
	
	p0.l=lo(bEndp);
	p0.h=hi(bEndp);
	r0=0x5;
	[p0]=r0;
	call ReadLastTransactionStatus;
	
	r0=[ SP++ ];		//pop r0
	p0=[ SP++ ];		//pop p0
	RETS = [ SP++ ];
	rts;
Ep2_TxDone.end:



/*******************************************************************
** 函数名称: Ep2_RxDone()
** 功能描述: 端点2 OUT(接收)处理处理函数
** 输	 入: 无
** 输	 出: 无
********************************************************************/
.global Ep2_RxDone;
Ep2_RxDone:
	[ --SP ] = RETS;
	[ --SP ]=p0;		//push p0
	[ --SP ]=r0;		//push r0
	
	p0.l=lo(bEndp);
	p0.h=hi(bEndp);
	r0=0x4;
	[p0]=r0;
	call ReadLastTransactionStatus;
			
	p0.l=lo(bLen);
	p0.h=hi(bLen);
	r0=D12_MAX_PACKET_SIZE;
	[p0]=r0;
	
	p0.l=lo(pBuf);
	p0.h=hi(pBuf);
	r0.l=lo(UsbCtrlBuf);
	r0.h=hi(UsbCtrlBuf);
	[p0]=r0;
	call ReadEndpoint;
	
	//add by wayman@2005-11-29
	p0.l=lo(bEndp);
	p0.h=hi(bEndp);
	r0=0x4;
	[p0]=r0;
	call ClearBuf;
		
	r0=[ SP++ ];		//pop r0
	p0=[ SP++ ];		//pop p0
	RETS = [ SP++ ];
	rts;
Ep2_RxDone.end:



/************************************************************
** 函数名称: reconnect_USB()
** 功能描述: 重新连接USB总线
************************************************************/
.global ReConnectD12;
ReConnectD12:
	[ --SP ] = RETS;
	[ --SP ] = r0;
			
	//disconnect D12 from the host
	call DisconnectD12;
		
	//delay for a while
	r0.l=1000;
	call MsDelay;
		
	//connect D12 to the host
	call ConnectD12;
		
	r0   = [ SP++ ];
	RETS = [ SP++ ];
	rts;
ReConnectD12.END:	



/************************************************************
** 函数名称: disconnect_USB() 
** 功能描述: 断开USB总线
************************************************************/
DisconnectD12:
	[ --SP ] = RETS;
	
	[ --SP ]=p0;		//push p0
	[ --SP ]=r0;		//push r0
	
	////write command byte
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	r0.l=0xF3;
	w[p0]=r0.l;
	call CmdOutPortB;
	
	////write data byte 1
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	r0.l=D12_NOLAZYCLOCK;
	w[p0]=r0.l;
	call DataOutPortB;
	
	////write data byte 2
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	r0.l=D12_SETTOONE | D12_CLOCK_12M;
	w[p0]=r0.l;
	call DataOutPortB;
	
	r0=[ SP++ ];		//pop r0
	p0=[ SP++ ];		//pop p0
	
	RETS = [ SP++ ];
	rts;
DisconnectD12.end:



/************************************************************
** 函数名称: connect_USB()
** 功能描述: 连接USB总线
************************************************************/
ConnectD12:
	[ --SP ] = RETS;
	
	[ --SP ]=p0;		//push p0
	[ --SP ]=r0;		//push r0
	
	//connect D12 to the host
	////write command byte
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	r0.l=0xF3;
	w[p0]=r0.l;
	call CmdOutPortB;
		
	////write data byte 1
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	r0.l=D12_NOLAZYCLOCK|D12_SOFTCONNECT;
	w[p0]=r0.l;
	call DataOutPortB;
	
	////write data byte 2
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	r0.l=D12_SETTOONE | D12_CLOCK_12M;
	w[p0]=r0.l;
	call DataOutPortB;
	
	r0=[ SP++ ];		//pop r0
	p0=[ SP++ ];		//pop p0
	
	RETS = [ SP++ ];
	rts;
ConnectD12.end:


/************************************************************
** 函数名称: Get_D12_FirmwareVer()
** 功能描述: 获取firmware的版本号
** 输	 入: 无
** 输	 出: 16bit整数,如0x0100表示D12固件软件版本号为1.00,存于D12Data
************************************************************/
.global Get_D12_FirmwareVer;
Get_D12_FirmwareVer:
	[ --SP ] = RETS;
	
	[ --SP ]=p0;		//push p0
	[ --SP ]=r0;		//push r0
	
	r0=D12_FIRMWARE_VER;
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	[p0]=r0;
	
	r0=[ SP++ ];		//pop r0
	p0=[ SP++ ];		//pop p0
	
	RETS = [ SP++ ];
	rts;
Get_D12_FirmwareVer.end:



//the code below is for test purpose
abc:
	call SendResume;
			
	p0.l=lo(bAddress);
	p0.h=hi(bAddress);
	r0=0x1;
	[p0]=r0;
	
	p0.l=lo(bEnable);
	p0.h=hi(bEnable);
	r0=0x1;
	[p0]=r0;
	call SetAddressEnable;
	call SetEndpointEnable;
				
	//delay for a while
	r0.l=1000;
	call MsDelay;
	
	call ReadIntReg;
	
	p0.l=lo(bEndp);
	p0.h=hi(bEndp);
	r0=0x0;
	[p0]=r0;
	call ReadLastTransactionStatus;
	call SelectEndpoint;
	
	call ReadEndpointStatus;
	
	p0.l=lo(bLen);
	p0.h=hi(bLen);
	r0=8;
	[p0]=r0;
	
	p0.l=lo(pBuf);
	p0.h=hi(pBuf);
	r0.l=lo(UsbCtrlBuf);
	r0.h=hi(UsbCtrlBuf);
	[p0]=r0;
	call ReadEndpoint;
		
	call WriteEndpoint;
	call ReadIntReg;

abc.end:

⌨️ 快捷键说明

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