📄 uda1431.c
字号:
#include "def.h"
#include "44b.h"
#include "44blib.h"
#include "uda1431.h"
void L3AddMode(U8 data)
{
U32 vPdat_D = 0x0; //L3D=L
U32 vPdat_MC= 0x0; //L3M=L & L3C=L
int i,j;
//enter the AddMode
rPDATB =vPdat_MC; //L3M=L
rPDATB |= L3C; //L3C=H
for(j=0;j<4;j++); //tsu(L3) > 190ns
//next send 8 bits data
for(i=0;i<8;i++)
{
if(data&0x01) //data bit is H
{
rPDATB=vPdat_MC;
rPDATA = L3D; //L3D=H
for(j=0;j<4;j++); //tcy(L3) > 300ns
rPDATB = L3C; //L3C=H
rPDATA = L3D; //L3D=H
for(j=0;j<4;j++); //tcy(L3) > 300ns
}
/*
控制信息的传入可以分为两个步骤:
L3C-->Low L3D-->Input
L3C-->High L3D-->ReInput
*/
else //data bit is L
{
rPDATB=vPdat_MC;
rPDATA =vPdat_D; //L3D=L
for(j=0;j<4;j++); //tcy(L3) > 300ns
rPDATB = L3C; //L3C=H
rPDATA = vPdat_D; //L3D=H
for(j=0;j<4;j++); //tcy(L3) > 300ns
}
data>>=1;
}
//Address Mode is over
rPDATB=L3C|L3M; //L3M=H,L3C=H
}
void L3DataMode(U8 data)
{
U32 vPdata = 0x0; //L3D=L
int i,j;
//enter the DataMode
rPDATB=L3C|L3M;
for(j=0;j<4;j++);
//Begin transfer the data
for(i=0;i<8;i++)
{
if(data&0x1)
{
rPDATB=L3M; //L3C=L
rPDATA=L3D; //L3D=H
for(j=0;j<4;j++);
rPDATB=L3C|L3M; //L3C=H
rPDATA=L3D; //L3D=H
for(j=0;j<4;j++);
}
else
{
rPDATB=L3M; //L3C=L
rPDATA=vPdata; //L3D=L
for(j=0;j<4;j++);
rPDATB=L3C|L3M; //L3C=H
rPDATA=vPdata; //L3D=L
for(j=0;j<4;j++);
}
data>>=1;
}
//Ending the transfer
rPDATG=L3C|L3M; //L3M=H,L3C=H
}
void Init1341()
{
//1341's L3 interface L3DATA: GPA9 L3MODE: GPB4 L3CLOCK:GPB5
rPCONA = 0x1ff; //0-->OutPut
rPCONB = 0x7cf; //0-->OutPut
//L3 control 1341 Section Two
// in FS441KHZ condition
///In Statue Just to do RESET,256FS
L3AddMode(0x16); //UDA N0:000101 reg NO:10
L3DataMode(0x60); //1,10,0,000
/*Reset ,256fs ,No DC-filter,iis */
L3AddMode(0x16);
L3DataMode(0x20); //0,10,0,000
/*No Reset ,256fs ,No DC-filter,iis */
//In Data0
L3AddMode(0x14);
L3DataMode(0x18); //Setting the Volume
//In Statue
L3AddMode(0x14);
L3DataMode(0x83); //1,0,0,0 0,0,11
/*No OGS,No IGS,ADC_in,DAC_in,DS_in,PC_ON*/
}
void Play_Wave(U8 *Music_Buffer) //Get Point Music_Buffer and Play it
{
U32 save_B,save_C,save_E,save_A,save_PC,save_PE;
S16 *temp_pos; //Playing the milestone
int j;
U32 MusicSize;
S16 *pWav; //To get the WAV info
S16 *pWave; //To get the size of the Music
/*Show some INFO about this WAV*/
pWav=(S16*)Music_Buffer;
pWav=pWav+0x14/2; //实际地址 要求除以2,大概是由于一个单位 2个字节
//IF PCM WAV
if(*pWav==WAVE_FORMAT_PCM) {
Uart_Printf("You play PCM format!\n");
}
else return;
pWav=pWav+0x2/2;
//IF stereo mode
if(*pWav==WAVE_FORMAT_SE) {
Uart_Printf("You play stereo wave \n");
}
else return;
//Get music size
pWave=(S16*)Music_Buffer;
pWave+=0x28/2;
MusicSize=*pWave; //0xaae0
pWave+=0x1; //0x0015
MusicSize=(MusicSize<<16)>>16; //ri !!!!! clear 0
MusicSize=*(pWave+0)<<16 | MusicSize;
Uart_Printf("The MusicSize is 0x%x\n",MusicSize);
//Get the Starting point(Setting the temp_pos to data starting)
pWave+=1;
temp_pos=pWave;
Uart_Printf("The data begin at 0x%x\n",temp_pos);
/*环境设置*/
//Saving old setting
save_A=rPCONA;//L3DATA
save_C=rPCONC;//IIS port
save_E=rPCONE;//CODEC clk GPE8
save_B=rPCONB;//L3CLK,L3MOD
save_PC=rPUPC;
save_PE=rPUPE;
//Setting new para
///Setting the MCLK
ChangePllValue(0x69,0x17,0x0);//MCLK=45.1584MHz <-- 5.6448MHz*8
/*Maybe : Setting the PLL is same as setting the MCLK by cazy*/
///UART show
Uart_Init(45200000,115200);
Uart_Printf("\nWAV playing programme.By cazy\n");
///PortC
rPCONC |=0xff; //enable the IIS begin
rPUPC |= 0xf;
///CODECLK
rPCONE=(rPCONE&0xffff)+(2<<16); //PE8:CODECLK
rNCACHBE0= ((int)Music_Buffer>>12) + ( (((int)Music_Buffer>>12) +0x100)<<16 );
//No-Cache Area Addtional
/*Setting the 1341*/
Init1341();
/****** IIS Initialize ******/
rIISCON=0x02; //disable all the DMA ,prescaler enable
rIISMOD=0x89; //Mode selecct,Tx,L-ch Low,IIS,16bit,CODECLOCK 256fs,32fs
rIISPSR=0x11; //Setting the prescale //New 0x33
rIISFCON=0x200; //Normal,Tx FIFO enable
//Begin playing INFO
Uart_Printf("\nNow play the wave file ...");
/****** IIS Tx Start ********/
rIISCON |=0x1; //Enable the IIS
for(j=0;j<MusicSize;j+=2) //16bit
{
while(!IIS_FIFOTxREADY); //wait until IIS_FIFTxReady
*rIISFIF = *temp_pos++;
}
/****** IIS Tx Stop ******/
rIISCON=0x0; //IIS stop
Cache_Flush(); //? cache funcation??
rNCACHBE0=0x0;
rPCONA=save_A;
rPCONB=save_B;
rPCONC=save_C;
rPCONE=save_E;
rPUPC=save_PC;
rPUPE=save_PE;
rINTMSK=BIT_GLOBAL;
ChangePllValue(0x38,0x8,0x0);
Uart_Init(0,115200);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -