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

📄 uda1341.c

📁 ARM7(S3C44B0)功能非常全的开发板的测试程序....rar
💻 C
字号:
#include "..\inc\option.h"
#include "..\inc\44b.h"
#include "..\inc\44blib.h"
#include "..\inc\def.h"
#include "..\inc\uda1341.h"

void _WrL3Addr(U8 data);
void _WrL3Data(U8 data,int halt);

static void __irq Timer2(void);
static void __irq SioLJF16Int(void);
static void __irq Uart0_RxInt(void);

#define L3M (0x20)
#define L3D (0x40)
#define L3C (0x80)
#define WS  (0x10)

volatile U16 *leftBufPt;
volatile U16 *leftBufPtStart;
volatile U16 *leftBufPtEnd;
volatile U16 *rightBufPt;
volatile U16 *rightBufPtStart;
volatile U16 *rightBufPtEnd;
volatile U32	sample;

volatile static char LEFT;
volatile unsigned char FLAG;

void Init1341(void)
{
	/*****Timer configuration*****/
    rTCFG=0x300000;
    //pres0,pres1=0, Timer0,1=1/4, Timer2=TCLK

	/*****Port A configuration*****/
    //RXD0 TXD0 SIOCK_O SIORXD PA5_O(WS) SIOTXD0 TCLK PA2_O PA1_O TOUT0
    //  10   10     011    011        01      10   10    01    01    10
    rPCONA=0x29b696;
    rPUPA=0x3ff;	

	/*****Port G configuration*****/
    //PG7_O PG6_O PG5_O PG4_O EINT3 EINT2 PG1_O EINT0
    //   01    01    01    01    10    10    01    10  
    rPCONG=0x55a6;
    rPDATG |= L3C|L3M;

	/*****ISR SIO & Timer2*****/
    pISR_SIO=(unsigned)SioLJF16Int;
	pISR_TIMER2=(unsigned)Timer2;

	/*****Enable Inerrupt source SIO & Timer2*****/
    rINTMSK=~(BIT_GLOBAL|BIT_SIO|BIT_TIMER2);

	/*****SIO configuration*****/
    rSBRDR=7; //50M/2/(P+1)=3.125M(Max value)
    rIVTCNT=0x1;

	/*****L3 Interface*****/
    _WrL3Addr(0x14+2); //status (000101xx+10)
#ifdef FS441KHZ
    _WrL3Data(0x62,0); //0,1,10,001,0 reset,256fs,no DCfilter,LJF16
#else
	_WrL3Data(0x42,0); //0,1,00,001,0 reset,512fs,no DCfilter,LJF16
#endif

    _WrL3Addr(0x14+2); //status (000101xx+10)
#ifdef FS441KHZ
	_WrL3Data(0x22,0); //0,0,10,001,0 no reset,256fs,no DCfilter,LJF16
#else
    _WrL3Data(0x02,0); //0,0,00,001,0 no reset,512fs,no DCfilter,LJF16
#endif
    
    _WrL3Addr(0x14+2); //status (000101xx+10)
    _WrL3Data(0x83,0);
    //1,0,0,0,0,0,11 OGS=0,IGS=0,ADC_NI,DAC_NI,sngl speed,AonDon
}

#define TESTSIZE 100000
void Test1341(void)
{
	int i;
    S16 lBuf[TESTSIZE],rBuf[TESTSIZE];

    for(i=0;i<TESTSIZE/2 ;i++)
    {
        lBuf[i]=i*(40000/(TESTSIZE/2))-20000;	//y=(4/5)*x-2000
        rBuf[i]=i*(40000/(TESTSIZE/2))-20000;
        lBuf[i+TESTSIZE/2]=(TESTSIZE/2-i)*(40000/(TESTSIZE/2))-20000;//y=(50000-x)4/5-2000
        rBuf[i+TESTSIZE/2]=(TESTSIZE/2-i)*(40000/(TESTSIZE/2))-20000;
    }

    leftBufPt=(U16 *)&lBuf[0];
    leftBufPtStart=(U16 *)&lBuf[0];
    leftBufPtEnd=(U16 *)&lBuf[TESTSIZE];
    rightBufPt=(U16 *)&rBuf[0];
    rightBufPtStart=(U16 *)&rBuf[0];


    Init1341();
    Play1341();
    while(1)
    {
    	//Uart_Printf("Ti=%d,Si=%d\n",dbg_ti,dbg_si);
    }
}
/*
void PlayWav(U32 sample,S16 *lBuf,S16 *rBuf,U32 freq)
{
    Uart_Printf("[]Play the decoded .WAV file\n");

    leftBufPt=(U16 *)lBuf;
    leftBufPtStart=(U16 *)lBuf;
    leftBufPtEnd=(U16 *)&lBuf[sample];
    rightBufPt=(U16 *)rBuf;
    rightBufPtStart=(U16 *)rBuf;

    Init1341();
    Play1341();
    while(1)
    {
    	//Uart_Printf("Ti=%d,Si=%d\n",dbg_ti,dbg_si);
    }
}*/
void PlayWav(void)
{
    int i;
	
	LEFT=0;
	FLAG=0;
    leftBufPt=(U16 *)0xc280000;
	leftBufPtEnd=(U16 *)0xc280000;
    rightBufPt=(U16 *)0xc500000;
	rightBufPtEnd=(U16 *)0xc500000;

	/*****START For Download*****/

	rINTCON=0x5;
	rINTMOD=0x0;
	rINTMSK=~(BIT_URXD0 | BIT_GLOBAL);
    pISR_URXD0=(unsigned)Uart0_RxInt;
    Uart_Init(0,115200);
	Uart_Printf("Now test UDA1341\n");
	Uart_Printf("Download the wave file via wkcom2 utility no header and no checksum!!\n");

	while(LEFT!=3)
    {
		Uart_Printf("%d,", LEFT);
		for(i=0;i<4;i++)
		{
			Led_Display(1<<i);
			Delay(500);
		}
		Delay(700);
		for(i=0;i<4;i++)
		{
			Led_Display(8>>i);
			Delay(500);
		}
		Delay(700);
    }

    sample=*leftBufPt | *rightBufPt<<16;
		
		
		
		//*((leftBufPt+0))|(*((leftBufPt+1))<<8)|(*((rightBufPt+0))<<16)|(*((rightBufPt+1))<<24);

	Uart_Printf("\nNow, Downloading... [SAMPLESIZE:%7d(      0)",sample);

    while(((int)rightBufPtEnd-(int)rightBufPt+(int)leftBufPtEnd-(int)leftBufPt)<sample)
    	Uart_Printf("\b\b\b\b\b\b\b\b%7d)",((int)rightBufPtEnd-(int)rightBufPt+(int)leftBufPtEnd-(int)leftBufPt));
    Uart_Printf("\b\b\b\b\b\b\b\b%7d)\n",((int)rightBufPtEnd-(int)rightBufPt+(int)leftBufPtEnd-(int)leftBufPt));
									
			/*****END For Download*****/

    Uart_Printf("\n[]Now play the wave file\n");	

    leftBufPtStart=(U16 *)0xc280002;
    leftBufPt=(U16 *)0xc280002;
    leftBufPtEnd=leftBufPtStart+sample/2;
	rightBufPt=(U16 *)0xc500002;
    rightBufPtStart=(U16 *)0xc500002;

    Init1341();
    Play1341();
    while(1)
    {
    	//Uart_Printf("Ti=%d,Si=%d\n",dbg_ti,dbg_si);
    }
}

void Play1341(void)
{

#ifdef FS441KHZ
    rTCNTB2=255;    // 11289600/44100=256-1;
#else
    rTCNTB2=511;    // 11289600/22050=512-1;
#endif

    rTCON=(0xa<<12)|0x9; //Timer2:interval,manual update
    rTCON=(0x9<<12)|0x9; //Timer2:interval,start
}

void Stop1341(void)
{
    rTCON=(0x8<<12); //Timer2:interval,stop
}

void _WrL3Addr(U8 data)
{
    U32 vPdatg = rPDATG & 0x1f;	//All(M/D/C)=L
    S32 i,j;
    rPDATG = vPdatg | L3C;	//L3C=H
    for(j=0;j<4;j++); //tsu(L3)=190ns
    //PG5:L3MODE PG6:L3DATA PG7:L3CLOCK
    for(i=0;i<8;i++)
    {
        if(data&0x1)
        {
            rPDATG=vPdatg|L3D;  //L3C=L
            for(j=0;j<3;j++); //tcy=300ns
            rPDATG=vPdatg|L3C|L3D;  //L3C=H
            for(j=0;j<3;j++); //tcy=300ns
        }
        else
        {
            rPDATG=vPdatg;  //L3C=L
            for(j=0;j<3;j++); //tcy=300ns
            rPDATG=vPdatg|L3C;  //L3C=H
            for(j=0;j<3;j++); //tcy=300ns
        }
        data >>= 1;
    }
    rPDATG=vPdatg|L3M|L3C;
}

void _WrL3Data(U8 data,int halt)
{
    U32 vPdatg=rPDATG & 0x1f;
    S32 i,j;
    if(halt)
    {
        rPDATG=vPdatg|L3C;
        for(j=0;j<4;j++); //tstp(L3)=190ns
    }
    rPDATG=vPdatg|L3M|L3C;
    for(j=0;j<4;j++); //tsu(L3)D=190ns

    //PA1:L3MODE PA2:L3DATA PA3:L3CLOCK
    for(i=0;i<8;i++)
    {
        if(data&0x1)
        {
            rPDATG=vPdatg|L3D|L3M;  //L3C=L
            for(j=0;j<3;j++); //tcy=300ns
            rPDATG=vPdatg|L3C|L3D|L3M;  //L3C=H
            for(j=0;j<3;j++); //tcy=300ns
        }
        else
        {
            rPDATG=vPdatg|L3M;  //L3C=L
            for(j=0;j<3;j++); //tcy=300ns
            rPDATG=vPdatg|L3C|L3M;  //L3C=H
            for(j=0;j<3;j++); //tcy=300ns
        }
        data>>=1;
    }
    rPDATG=vPdatg|L3M|L3C;
}

static U8 sioBuf[4];
static int bufPt=0;
void _WrSioLJF16(U16 left,U16 right)
{
    sioBuf[0]=(left>>8)&0xff;
    sioBuf[1]=left&0xff;
    sioBuf[2]=(right>>8)&0xff;
    sioBuf[3]=right&0xff;

    rPDATG|=WS;

    rSIOCON=1|(0<<2)|(0<<4)|(1<<5)|(0<<6);
            //interrupt mode,auto run,falling,tx/rx,MSB first,internal clk
    rSIODAT=sioBuf[0];
    bufPt=1;
    rSIOCON|=(1<<3);
}

static void __irq SioLJF16Int(void)
{
    rI_ISPC=BIT_SIO;
    //rI_ISPC; //is needed only when cache=on & wrbuf=on & BSFRD=0
    switch(bufPt)
    {
        case 1:
            rSIODAT=sioBuf[1];
            rSIOCON=1|(0<<2)|(0<<4)|(1<<5)|(0<<6) |(1<<3);
            bufPt=2;
            break;
        case 2:
            rPDATG&=~WS;
            rSIODAT=sioBuf[2];
            rSIOCON=1|(0<<2)|(0<<4)|(1<<5)|(0<<6) |(1<<3);
            bufPt=3;
            break;
        case 3:
            rSIODAT=sioBuf[3];
            rSIOCON=1|(0<<2)|(0<<4)|(1<<5)|(0<<6) |(1<<3);
            bufPt=4;
            break;
        case 4:
            rPDATG|=WS;
            break;
    }
}

static void __irq Timer2(void)
{
	rI_ISPC=BIT_TIMER2;
    //rI_ISPC; //is needed only when cache=on & wrbuf=on & BSFRD=0
    _WrSioLJF16(*leftBufPt++,*rightBufPt++);
    if(leftBufPt==leftBufPtEnd)
    {
        leftBufPt=leftBufPtStart;
        rightBufPt=rightBufPtStart;
    }
}

void __irq Uart0_RxInt(void)
{
    rI_ISPC=BIT_URXD0 ;   //clear pending bits,Default value=0x0000000
    //rI_ISPC;		  //is needed only when cache=on & wrbuf=on & BSFRD=0
	if(LEFT != 100)
	{
		if(LEFT<2)
		{
			*((U8 *)leftBufPtEnd++)=RdURXH0();
			LEFT++;
		}
		else
		{
			*((U8 *)rightBufPtEnd++)=RdURXH0();
			LEFT++;
			if(LEFT==3)
				LEFT=0;
			if(((int)rightBufPtEnd-(int)rightBufPt)==sample/4)
				LEFT=100;
		}
	}
}

⌨️ 快捷键说明

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