?? uda1341.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(L3C) PG6_O(L3D) PG5_O(L3M) 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 + -