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

📄 main.asm

📁 dsp转换USB通讯程序样例
💻 ASM
字号:

#include "defBF531.h"
#include "BF531_USB_Head.h"
#include "\d12\PDIUSBD12.h"

.global Rx0BufStartAddr,Tx0BufStartAddr;
//.global UsbRxBuf,UsbTxBuf;
.GLOBAL USBFrameIndex;
.global UsbAudioBuffer;
.global Ch1Vol,Ch2Vol,Ch3Vol,Ch4Vol;

.global	Rx0_BufA,Rx0_BufB;
.global	Tx0_BufA,Tx0_BufB;
.global	OutPutGainTableForAllCh;

.global AudioFrameCnt;

.global BlinkCnt;

.global	UsbABuf_RPtr,UsbABuf_RPtrPre,UsbABuf_RPtrPst;
.global	UsbABuf_WPtr,UsbABuf_WPtrPre,UsbABuf_WPtrPst;
.global	UsbABuf_RWPtrSamePage;
.global	UsbABuf_WBeyondR_Distance;
.global _28ReservedByteBuffer;

///////////////////////////////
//D12
///////////////////////////////
.global UsbCtrlBuf;


.extern _SPORT0_RX_ISR;
.extern Init_Interrupts,AllPfLedBlink,Enable_DMA_Sport0;
.extern Init_Sport0,Init_FLG,MsDelay,Init_DMA_Sport0,Init_EBIU;

.extern Led0Tgl,Led0Off,Led0On;
.extern Led1Tgl,Led1Off,Led1On;
.extern Led2Tgl,Led2Off,Led2On;
.extern Led3Tgl,Led3Off,Led3On;

.extern CheckFx2Fifo;
.extern Get512BytesFromFx2;
.extern Write64BytesToFx2;
.extern  _512USBByteStreamProcess;
.extern UsbOperationVarInit;

.extern InitD12;

.section SECTION_Data;  //8bit width, total size: 16K Byte
//SPort DMA buffer
.align 4;
.byte2	Rx0_BufA[FrameLength*2*2];	//in sequence of PriL,SecL,PriR,SecR
.byte2	Rx0_BufB[FrameLength*2*2];	//in sequence of PriL,SecL,PriR,SecR
.byte2	Tx0_BufA[FrameLength*2*2];	//in sequence of PriL,SecL,PriR,SecR
.byte2	Tx0_BufB[FrameLength*2*2];	//in sequence of PriL,SecL,PriR,SecR

.align 4;
.byte4	Rx0BufStartAddr;
.byte4	Tx0BufStartAddr;

.byte4	AudioFrameCnt;		//for SportDMA intr count, and LED blink
.byte4	USBFrameIndex;		//to trace USB frame received

.byte4	UsbABuf_RPtr;
.byte4	UsbABuf_RPtrPre;
.byte4	UsbABuf_RPtrPst;
.byte4	UsbABuf_WPtr;
.byte4	UsbABuf_WPtrPre;
.byte4	UsbABuf_WPtrPst;
.byte4	UsbABuf_RWPtrSamePage=1;
.byte4	UsbABuf_WBeyondR_Distance;

.byte4 BlinkCnt;

.byte2	OutPutGainTableForAllCh[21]="outputgaintable.dat";

.byte2	Ch1Vol=0.1;
.byte2	Ch2Vol=0.2;
.byte2	Ch3Vol=0.3;
.byte2	Ch4Vol=0.4;


//.byte2	UsbRxBuf[512];
//.byte2	UsbTxBuf[64];

.align 4;
.byte2	UsbAudioBuffer[240*UsbAudioBufferSlotSize];
.byte2	_28ReservedByteBuffer[28];

.byte4	VarEndDataMem=0xffffffff;

///////////////////////////////
//D12
///////////////////////////////
.align 2;
.byte2 UsbCtrlBuf[64];
.byte2 IsBulkEPRxedData;
								
.section SECTION_Code1;
.global _main;
_main:

#ifdef SoftSimu

	call UsbOperationVarInit;
	call CheckFx2Fifo;
	
	r0=1;			//ZZZZZZZZZZZZZZZZZZZ
	call Get512BytesFromFx2;
	call _SPORT0_RX_ISR;
	
	r0=1;			//ZZZZZZZZZZZZZZZZZZZ
	call Get512BytesFromFx2;
	call _SPORT0_RX_ISR;
	
	
	call _SPORT0_RX_ISR;
	call _SPORT0_RX_ISR;
	call _SPORT0_RX_ISR;
#endif	
	
	call Init_EBIU;
	call Init_FLG;
		
	//call AllPfLedBlink;
	//call AllPfLedBlink;
	call UsbOperationVarInit;
	
	//all PF up
    p0.l = lo(FIO_FLAG_D);
	p0.h = hi(FIO_FLAG_D);
	r1.l = 0xffff;
	w[p0] = r1.l;
	ssync;

	//call ResetD12;
	call InitD12;
	call ReadChipID;
	
	//call Init_Sport0;
	//call Init_DMA_Sport0;
	//call Init_Interrupts;
	//call Enable_DMA_Sport0;

    
Mainloop:
	
	//idle;  
	
	//call CheckFx2Fifo;
	//call Get512BytesFromFx2;
	call CheckD12Status;
	CALL UsbServe;
	
	p0.l=lo(IsBulkEPRxedData);
	p0.h=hi(IsBulkEPRxedData);
	r0.l=w[p0];
	r0.h=0;
	cc=r0==0;
	if cc jump RxNoUsbBulkData;
	
	//set IsBulkEPRxedData=0;
	r0.l=0;
	w[p0]=r0;
	
	//WriteEndpoint(5,ByteCntRxedFromUsbEP,&UsbCtrlBuf);
	p0.l=lo(bEndp);
	p0.h=hi(bEndp);
	r0=0x5;
	[p0]=r0;
		
	p0.l=lo(ByteCntRxedFromUsbEP);
	p0.h=hi(ByteCntRxedFromUsbEP);
	r0.l=w[p0];
	r0.h=0;
	p0.l=lo(bLen);
	p0.h=hi(bLen);
	[p0]=r0;
	
	p0.l=lo(pBuf);
	p0.h=hi(pBuf);
	r0.l=lo(UsbCtrlBuf);
	r0.h=hi(UsbCtrlBuf);
	[p0]=r0;
			
	call WriteEndpoint;
	
RxNoUsbBulkData:
/*	p0.l=lo(UsbCtrlBuf);
	p0.h=hi(UsbCtrlBuf);
	r0=[p0];
	cc=r0==0;
	if !cc jump TurnOnLedD1;
	
	p0.l=lo(FIO_FLAG_D);
	p0.h=hi(FIO_FLAG_D);
	r0.l=0xBF54;
	w[p0]=r0;
	jump LedOperationFinished;
	
TurnOnLedD1:
	p0.l=lo(FIO_FLAG_D);
	p0.h=hi(FIO_FLAG_D);
	r0.l=0xAF54;
	w[p0]=r0;*/

LedOperationFinished:
	nop;nop;nop;nop;nop;
	
	jump Mainloop;
	
_main.END:
	




CheckD12Status:
	[ --SP ]=RETS;
	[ --SP ]=p0;		//push p0
	[ --SP ]=r0;		//push r0
	
	//Check D12 INT_N pin status
	p0.l=lo(FIO_FLAG_D);
	p0.h=hi(FIO_FLAG_D);
	r0.l=w[ p0 ];
	r0.h=0;
	r1.l=0xbfff;
	r1.h=0;
	r0=r0 | r1;
	cc=r0==r1;
	if !cc jump NoUsbTransfer;
	
	/*
	//delay for a while
	[ --SP ]=lc0;
	[ --SP ]=lt0;
	[ --SP ]=lb0;
	
	r0.l=20;
	call MsDelay;
	
	nop;nop;nop;
	lb0=[ SP++ ];
	lt0=[ SP++ ];
	lc0=[ SP++ ];
	
	//Check D12 INT_N pin status again
	p0.l=lo(FIO_FLAG_D);
	p0.h=hi(FIO_FLAG_D);
	r0.l=w[ p0 ];
	r0.h=0;
	r1.l=0xBFFF;
	r1.h=0;
	r0=r0 | r1;
	cc=r0==r1;
	if !cc jump NoUsbTransfer;
	*/
		
	call UsbInterrupt;
	
NoUsbTransfer:
	
	r0=[ SP++ ];		//pop r0
	p0=[ SP++ ];		//pop p0
	RETS=[ SP++ ];
	rts;
CheckD12Status.end:



UsbInterrupt:
	[ --SP ]=RETS;
	[ --SP ]=p0;		//push p0
	[ --SP ]=r0;		//push r0
	[ --SP ]=r1;		//push r1
	
	call ReadIntReg;
	p0.l=lo(D12Data);
	p0.h=hi(D12Data);
	r0=[p0];
	cc=r0==0;
	if cc jump UsbInterrupt_Exit;
	
	r1=D12_INT_BUSRESET;
	r1=r0&r1;
	cc=r1==0;
	if cc jump Not_INT_BUSRESET;
	//code for handling busreset
		
Not_INT_BUSRESET:
	r1=D12_INT_EOT;
	r1=r0&r1;
	cc=r1==0;
	if cc jump Not_INT_EOT;
	
	//code for handling DMA end of transfer
	
Not_INT_EOT:
	r1=D12_INT_SUSPENDCHANGE;
	r1=r0&r1;
	cc=r1==0;
	if cc jump Not_INT_SUSPENDCHANGE;
	
	//code for handling suspend status changed
	
Not_INT_SUSPENDCHANGE:
	r1=D12_INT_ENDP0IN;
	r1=r0&r1;
	cc=r1==0;
	if cc jump Not_D12_INT_ENDP0IN;
	
	//code for handling endpoint0 In
	call Ep0_TxDone;
	
Not_D12_INT_ENDP0IN:
	r1=D12_INT_ENDP0OUT;
	r1=r0&r1;
	cc=r1==0;
	if cc jump Not_D12_INT_ENDP0OUT;
	
	//code for handling endpoint0 Out
	call Ep0_RxDone;
	
Not_D12_INT_ENDP0OUT:
	r1=D12_INT_ENDP1IN;
	r1=r0&r1;
	cc=r1==0;
	if cc jump Not_D12_INT_ENDP1IN;
	
	//code for handling endpoint1 In
	call Ep1_TxDone;
	
Not_D12_INT_ENDP1IN:
	r1=D12_INT_ENDP1OUT;
	r1=r0&r1;
	cc=r1==0;
	if cc jump Not_D12_INT_ENDP1OUT;
	
	//code for handling endpoint1 Out
	call Ep1_RxDone;
	
	//WriteEndpoint(3,ByteCntRxedFromUsbEP,&UsbCtrlBuf);
	p0.l=lo(bEndp);
	p0.h=hi(bEndp);
	r0=0x3;
	[p0]=r0;
		
	p0.l=lo(ByteCntRxedFromUsbEP);
	p0.h=hi(ByteCntRxedFromUsbEP);
	r0.l=w[p0];
	r0.h=0;
	p0.l=lo(bLen);
	p0.h=hi(bLen);
	[p0]=r0;
	
	p0.l=lo(pBuf);
	p0.h=hi(pBuf);
	r0.l=lo(UsbCtrlBuf);
	r0.h=hi(UsbCtrlBuf);
	[p0]=r0;
	
	call WriteEndpoint;
	
Not_D12_INT_ENDP1OUT:
	r1=D12_INT_ENDP2IN;
	r1=r0&r1;
	cc=r1==0;
	if cc jump Not_D12_INT_ENDP2IN;
	
	//code for handling endpoint2 In
	call Ep2_TxDone;
	
Not_D12_INT_ENDP2IN:
	r1=D12_INT_ENDP2OUT;
	r1=r0&r1;
	cc=r1==0;
	if cc jump UsbInterrupt_Exit;
	
	//code for handling endpoint2 Out
	call Ep2_RxDone;
	p0.l=lo(IsBulkEPRxedData);
	p0.h=hi(IsBulkEPRxedData);
	r0.l=1;
	w[p0]=r0;
	
	p0.l=lo(FIO_FLAG_T);
	p0.h=hi(FIO_FLAG_T);
	r0.l=0x1000;
	w[p0]=r0.l;
	
UsbInterrupt_Exit:
	r1=[ SP++ ];		//pop r1
	r0=[ SP++ ];		//pop r0
	p0=[ SP++ ];		//pop p0
	RETS=[ SP++ ];
	rts;
UsbInterrupt.end:



UsbServe:
	[ --SP ]=RETS;
	[ --SP ]=p0;		//push p0
	[ --SP ]=r0;		//push r0
	[ --SP ]=r1;		//push r1
	
	p0.l=lo(SetupPacket);
	p0.h=hi(SetupPacket);
	r0=[p0];
	cc=r0==1;
	if !cc jump UsbServe_Exit;
	
	r0=0;
	[p0]=r0;
	call Control_Handler;

UsbServe_Exit:
	r1=[ SP++ ];		//pop r1
	r0=[ SP++ ];		//pop r0
	p0=[ SP++ ];		//pop p0
	RETS=[ SP++ ];
	rts;
UsbServe.end:

⌨️ 快捷键说明

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