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

📄 d12ci.asm

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

.global ByteCntRxedFromUsbEP;

.section SECTION_Data;  //8bit width, total size: 16K Byte
.align 4;
.byte2 ByteCntRxedFromUsbEP;

.section SECTION_Code2;

/************************************************************
** 函数名称: ReadChipID()
** 功能描述: 读取芯片ID
** 输   入: 无
** 输   出: 芯片的ID号,存于D12Data内
************************************************************/
.global ReadChipID;
ReadChipID:
	[ --SP ] = RETS;
	[ --SP ]=p0;		//push p0
	[ --SP ]=r0;		//push r0
	[ --SP ]=r1;		//push r1
	
	//read Chip ID
	////write command byte
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	r0.l=0xFD;
	w[p0]=r0.l;
	call CmdOutPortB;
			
	////read data byte 1
	call InPortD;			//Chip ID LOW byte
	r0=[p0];
	
	////read data byte 2
	call InPortD;			//Chip ID HIGH byte	
	r1=[p0];
	
	//combine LOW & HIGH byte together
	r1=r1<<8;
	r0=r1|r0;
	[p0]=r0;				//Write it back to D12Data
			
	r1=[ SP++ ];		//pop r1
	r0=[ SP++ ];		//pop r0
	p0=[ SP++ ];		//pop p0
	RETS = [ SP++ ];
	rts;
ReadChipID.end:


/************************************************************
** 函数名称: SetAddressEnable()
** 功能描述: 设置地址/使能
** 输   入: INT8U bAddress:  地址
	     	 INT8U bEnable :  0 --- 禁止
	     		     		  1 --- 使能
** 输   出: 无
************************************************************/
.global SetAddressEnable;
SetAddressEnable:
	[ --SP ] = RETS;
	[ --SP ]=p0;		//push p0
	[ --SP ]=r0;		//push r0
	[ --SP ]=r1;		//push r1
	
	p0.l=lo(bAddress);
	p0.h=hi(bAddress);
	r1=[p0];
	
	p0.l=lo(bEnable);
	p0.h=hi(bEnable);
	r0=[p0];
	cc=r0==1;
	if !cc jump AddressDisable;
	
	r0=0x80;
	r1=r1|r0;
	
AddressDisable:	
	//read interrupt register
	////write command byte
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	r0.l=0xD0;
	w[p0]=r0.l;
	call CmdOutPortB;
	
	////write data byte 1
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	w[p0]=r1.l;
	call DataOutPortB;
			
	r1=[ SP++ ];		//pop r1
	r0=[ SP++ ];		//pop r0
	p0=[ SP++ ];		//pop p0
	RETS = [ SP++ ];
	rts;
SetAddressEnable.end:


/************************************************************
** 函数名称: SetEndpointEnable()
** 功能描述: 设置端点使能
** 输   入: bEnable :    0 --- 禁止
	     	        	  1 --- 允许
** 输   出: 无
************************************************************/
.global SetEndpointEnable;
SetEndpointEnable:
	[ --SP ] = RETS;
	[ --SP ]=p0;		//push p0
	[ --SP ]=r0;		//push r0
		
	///write command byte
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	r0.l=0xD8;
	w[p0]=r0.l;
	call CmdOutPortB;
	
	//read variable bEnable
	p0.l=lo(bEnable);
	p0.h=hi(bEnable);
	r0=[p0];
	cc=r0==1;
	if cc jump EndpointEnable;
	r0=0;
		
EndpointEnable:
	////write data byte 1
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	w[p0]=r0.l;
	call DataOutPortB;
		
	r0=[ SP++ ];		//pop r0
	p0=[ SP++ ];		//pop p0
	RETS = [ SP++ ];
	rts;
SetEndpointEnable.end:


/************************************************************
** 函数名称: ReadIntReg
** 功能描述: 读取中断寄存器值
** 输   入: 无
** 输   出: 中断寄存器值,存于D12Data
************************************************************/
.global ReadIntReg;
ReadIntReg:
	[ --SP ] = RETS;
	[ --SP ]=p0;		//push p0
	[ --SP ]=r0;		//push r0
	[ --SP ]=r1;		//push r1
	
	//read interrupt register
	////write command byte
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	r0.l=0xF4;
	w[p0]=r0.l;
	call CmdOutPortB;
	
	////read data byte 1
	call InPortD;			//Chip ID LOW byte
	r0=[p0];
	
	////read data byte 2
	call InPortD;			//Chip ID HIGH byte	
	r1=[p0];
	
	//combine LOW & HIGH byte together
	r1=r1<<8;
	r0=r1|r0;
	[p0]=r0;				//Write it back to D12Data
	
	r1=[ SP++ ];		//pop r1
	r0=[ SP++ ];		//pop r0
	p0=[ SP++ ];		//pop p0
	RETS = [ SP++ ];
	rts;
ReadIntReg.end:



/************************************************************
** 函数名称: SelectEndpoint()
** 功能描述: 端点选择,将内部指针初始化到选择的缓冲区起始位置
** 输   入: bEndp:   端点索引号,取值0 ~ 5
** 输   出: 读出的1个字节,存于D12Data
************************************************************/
.global SelectEndpoint;
SelectEndpoint:
	[ --SP ] = RETS;
	
	[ --SP ]=p0;		//push p0
	[ --SP ]=r0;		//push r0
		
	p0.l=lo(bEndp);
	p0.h=hi(bEndp);
	r0=[p0];
	
	////write command byte
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	w[p0]=r0.l;
	call CmdOutPortB;
		
	////read 1 data byte
	call InPortD;	
		
	r0=[ SP++ ];		//pop r0
	p0=[ SP++ ];		//pop p0
	RETS = [ SP++ ];
	rts;
SelectEndpoint.end:


/************************************************************
** 函数名称: ReadEndpointStatus()
** 功能描述: 读取端点状态
** 输   入: bEndp:   端点索引号,取值0 ~ 5
** 输   出: 端点状态, 存于D12Data
************************************************************/
.global ReadEndpointStatus;
ReadEndpointStatus:
	[ --SP ] = RETS;
	[ --SP ]=p0;		//push p0
	[ --SP ]=r0;		//push r0
	[ --SP ]=r1;		//push r1
		
	p0.l=lo(bEndp);
	p0.h=hi(bEndp);
	r0=[p0];
	r1=0x80;
	r0=r0+r1;
	
	////write command byte
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	w[p0]=r0.l;
	call CmdOutPortB;
		
	////read 1 data byte
	call InPortD;
		
	r1=[ SP++ ];		//pop r1
	r0=[ SP++ ];		//pop r0
	p0=[ SP++ ];		//pop p0
	RETS = [ SP++ ];
	rts;
ReadEndpointStatus.end:


/************************************************************
** 函数名称: ReadLastTransactionStatus()
** 功能描述: 读取最后处理状态寄存器
** 输   入: bEndp:   端点索引号,取值0 ~ 5
** 输   出: 端点最后处理的状态,存于D12Data
************************************************************/
.global ReadLastTransactionStatus;
ReadLastTransactionStatus:
	[ --SP ] = RETS;
	[ --SP ]=p0;		//push p0
	[ --SP ]=r0;		//push r0
	[ --SP ]=r1;		//push r1
	
	p0.l=lo(bEndp);
	p0.h=hi(bEndp);
	r0=[p0];
	r1=0x40;
	r0=r0+r1;
	
	////write command byte
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	w[p0]=r0.l;
	call CmdOutPortB;
		
	////read 1 data byte
	call InPortD;
		
	r1=[ SP++ ];		//pop r1
	r0=[ SP++ ];		//pop r0
	p0=[ SP++ ];		//pop p0
	RETS = [ SP++ ];
	rts;
ReadLastTransactionStatus.end:


/************************************************************
** 函数名称: SetEndpointStatus()
** 功能描述: 设置端点状态
** 输   入: bEndp:   端点索引号,取值0 ~ 5
	         bStalled: 状态值,0/1
** 输   出: 端点状态
************************************************************/
.global SetEndpointStatus;
SetEndpointStatus:
	[ --SP ] = RETS;
	[ --SP ]=p0;		//push p0
	[ --SP ]=r0;		//push r0
	[ --SP ]=r1;		//push r1
	
	p0.l=lo(bEndp);
	p0.h=hi(bEndp);
	r0=[p0];
	r1=0x40;
	r0=r0+r1;
	
	p0.l=lo(bStalled);
	p0.h=hi(bStalled);
	r1=[p0];
		
	////write command byte
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	w[p0]=r0.l;
	call CmdOutPortB;
		
	////write 1 data byte
	w[p0]=r1.l;
	call DataOutPortB;
	
	r1=[ SP++ ];		//pop r1
	r0=[ SP++ ];		//pop r0
	p0=[ SP++ ];		//pop p0
	RETS = [ SP++ ];
	rts;
SetEndpointStatus.end:


/************************************************************
** 函数名称: SendResume()
** 功能描述: 传输恢复
** 输   入: 无
** 输   出: 无
************************************************************/
.global SendResume;
SendResume:
	[ --SP ] = RETS;
	[ --SP ]=p0;		//push p0
	[ --SP ]=r0;		//push r0
	
	////write command byte
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	r0.l=0xF6;
	w[p0]=r0.l;
	call CmdOutPortB;
	
	r0=[ SP++ ];		//pop r0
	p0=[ SP++ ];		//pop p0
	RETS = [ SP++ ];
	rts;
SendResume.end:


/************************************************************
** 函数名称: ReadCurrentFrameNumber()
** 功能描述: 读取当前帧号
** 输   入: 无
** 输   出: 当前帧号,存于D12Data
************************************************************/
.global ReadCurrentFrameNumber;
ReadCurrentFrameNumber:
	[ --SP ] = RETS;
	[ --SP ]=p0;		//push p0
	[ --SP ]=r0;		//push r0
	[ --SP ]=r1;		//push r1
	
	////write command byte
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	r0.l=0xF5;
	w[p0]=r0.l;
	call CmdOutPortB;
	
	call InPortD;
	r0=[p0];
	
	call InPortD;
	r1=[p0];
	
	r1=r1<<8;
	r0=r0|r1;
	[p0]=r0;
	
	r1=[ SP++ ];		//pop r1
	r0=[ SP++ ];		//pop r0
	p0=[ SP++ ];		//pop p0
	RETS = [ SP++ ];
	rts;
ReadCurrentFrameNumber.end:


/************************************************************
** 函数名称: ReadEndpoint()
** 功能描述: 读取端点数据
** 输   入: bEndp:      端点索引号,取值 0 ~ 5 
	    	 bLen:	     要读取的数据长度
	     	 * pBuf:     接收数据指针
** 输   出: 实际读得的字节数,存放于D12Data
************************************************************/
.global ReadEndpoint;
ReadEndpoint:
	[ --SP ] = RETS;
	[ --SP ]=p0;		//push p0
	[ --SP ]=p1;		//push p1
	[ --SP ]=p2;		//push p2
	[ --SP ]=r0;		//push r0
	[ --SP ]=r1;		//push r1
	[ --SP ]=r2;		//push r2
		
	p2=0;
	call SelectEndpoint;
	
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	r0=[p0];
	r1=D12_FULLEMPTY;
	r0=r0&r1;
	cc = r0 ==1;
	if !cc jump ReadEndpoit_Exit;
	
	////write command byte
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	r0.l=0xF0;
	w[p0]=r0.l;
	call CmdOutPortB;
	
	////read data byte 1
	call InPortD;
	
	////read data byte 2
	call InPortD;
	r1.l=w[ p0 ];
	
	//save actual length of the data packet into ByteCntRxedFromUsbEP
	r0=0xff;
	r1=r1&r0;			//actual length of the data packet
	p1.l=lo(ByteCntRxedFromUsbEP);
	p1.h=hi(ByteCntRxedFromUsbEP);
	w[p1]=r1;
	
	p1.l=lo(bLen);
	p1.h=hi(bLen);
	r0=[p1];			//length the user want to read
	
	r2=r1-r0;
	cc=r2<0;
	if cc jump RxData;
	r1=r0;
		
RxData:
	//load the buf pointer you want to store the rx data to
	p1.l=lo(pBuf);
	p1.h=hi(pBuf);
	r0=[p1];
	p1=r0;
		
	p2 = r1;nop;nop;nop;nop;
	lsetup(Loop_start1, Loop_end1) lc0=p2;
	Loop_start1:
		
		call InPortD;
		r1.l=w[ p0 ];
		
		w[ p1 ] = r1.l;
		p1+=2;
		
	Loop_end1:
		nop;
	
ReadEndpoit_Exit:
	[p0]=p2;
	
	r2=[ SP++ ];		//pop r2
	r1=[ SP++ ];		//pop r1
	r0=[ SP++ ];		//pop r0
	p2=[ SP++ ];		//pop p2
	p1=[ SP++ ];		//pop p1
	p0=[ SP++ ];		//pop p0
	RETS = [ SP++ ];
	rts;
ReadEndpoint.end:


/************************************************************
** 函数名称: WriteEndpoint()
** 功能描述: 把数据写入端点
** 输   入: bEndp:     端点索引号,取值 0 ~ 5 
	     	 bLen:	    要写入的数据长度
	     	 * pBuf:    发送数据指针
** 输   出: 实际写入的字节数
************************************************************/
.global WriteEndpoint;
WriteEndpoint:
	[ --SP ] = RETS;
	[ --SP ]=p0;		//push p0
	[ --SP ]=p1;		//push p1
	[ --SP ]=p2;		//push p2
	[ --SP ]=r0;		//push r0
	[ --SP ]=r1;		//push r1
	[ --SP ]=r2;		//push r2
		
	p2=0;
	call SelectEndpoint;
	
	/*
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	r0=[p0];
	r1=D12_FULLEMPTY;
	r0=r0&r1;
	cc = r0 ==1;
	if !cc jump ReadEndpoit_Exit;
	*/
	
	////write command byte
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	r0.l=0xF0;
	w[p0]=r0.l;
	call CmdOutPortB;
	
	////write data byte 1,always 0
	r0=0;
	[p0]=r0;
	call DataOutPortB;
	
	////write data byte 2, length of data u want to write
	p1.l=lo(bLen);
	p1.h=hi(bLen);
	r1=[p1];			//length the user want to read
	[p0]=r1;
	call DataOutPortB;
		
	//load the buf pointer you want to read the tx data from
	p1.l=lo(pBuf);
	p1.h=hi(pBuf);
	r0=[p1];
	p1=r0;
		
	p2 = r1;nop;nop;nop;nop;
	lsetup(Loop_start2, Loop_end2) lc0=p2;
	Loop_start2:
		
		r1.l=w[p1];
		p1+=2;
		
		w[p0]=r1.l;
		call DataOutPortB;
				
	Loop_end2:
		nop;
	
	//Validate IN buffer
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	r0=0xFA;
	[p0]=r0;
	call CmdOutPortB;
		
	[p0]=p2;
	r2=[ SP++ ];		//pop r2
	r1=[ SP++ ];		//pop r1
	r0=[ SP++ ];		//pop r0
	p2=[ SP++ ];		//pop p2
	p1=[ SP++ ];		//pop p1
	p0=[ SP++ ];		//pop p0
	RETS = [ SP++ ];
	rts;
WriteEndpoint.end:


/************************************************************
** 函数名称: AcknowledgeEndpoint()
** 功能描述: 应答Setup
** 输   入: bEndp:     端点索引号,取值 0 ~ 5 
** 输   出: 无
************************************************************/
.global AcknowledgeEndpoint;
AcknowledgeEndpoint:
	[ --SP ] = RETS;
	[ --SP ]=p0;		//push p0
	[ --SP ]=r0;		//push r0
			
	call SelectEndpoint;
	
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	r0=0xF1;
	[p0]=r0;
	call CmdOutPortB;
		
	p0.l=lo(bEndp);
	p0.h=hi(bEndp);
	r0=[p0];
	
	cc=r0==0;
	if !cc jump AcknowledgeEndpoint_Exit;
	
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	r0=0xF2;
	[p0]=r0;
	call CmdOutPortB;

AcknowledgeEndpoint_Exit:
	r0=[ SP++ ];		//pop r0
	p0=[ SP++ ];		//pop p0
	RETS = [ SP++ ];
	rts;
AcknowledgeEndpoint.end:



/************************************************************
** 函数名称: ClearBuf()
** 功能描述: 清指定端点的缓冲区(包括双缓冲区)
** 输   入: bEndp:     端点索引号,取值 0 ~ 5 
** 输   出: 无
************************************************************/
.global ClearBuf;
ClearBuf:
	[ --SP ] = RETS;
	[ --SP ]=p0;		//push p0
	[ --SP ]=r0;		//push r0
			
	call SelectEndpoint;
	
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	r0=0xF2;
	[p0]=r0;
	call CmdOutPortB;
		
	p0.l=lo(bEndp);
	p0.h=hi(bEndp);
	r0=[p0];
	r1=3;
	r0=r1-r0;
	cc=r0<0;
	if !cc jump Clear_Exit;
	
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	r0=0xF2;
	[p0]=r0;
	call CmdOutPortB;

Clear_Exit:
	r0=[ SP++ ];		//pop r0
	p0=[ SP++ ];		//pop p0
	RETS = [ SP++ ];
	rts;
ClearBuf.end:

⌨️ 快捷键说明

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