s3c2440的IIS应用——放音与录音(二)

2014-11-24 09:15:12 · 作者: · 浏览: 1
{


rGPBDAT &= ~L3C; //L3C=L


rGPBDAT &= ~L3D; //L3D=L


for(j=0;j<5;j++)


; //等待一段时间


rGPBDAT |= L3C; //L3C=H


rGPBDAT &= ~L3D; //L3D=L


for(j=0;j<5;j++)


; //等待一段时间


}


data >>= 1;


}


rGPBDAT = rGPBDAT & ~(L3D | L3M | L3C) | (L3C | L3M); //L3M=H,L3C=H


}



//放音


void playsound(unsigned char *buffer, int length)


{


int count,i;


char flag;



rGPBDAT = rGPBDAT & ~(L3M|L3C|L3D) |(L3M|L3C); //L3开始传输:L3M=H, L3C=H



//配置UDA1341


WriteL3(0x14 + 2,1); //状态模式(000101xx+10)


WriteL3(0x60,0); //0,1,10, 000,0 : 状态0,复位



WriteL3(0x14 + 2,1); //状态模式 (000101xx+10)


WriteL3(0x10,0); //0,0,01, 000,0 : 状态0, 384fs,IIS,no DC-filtering



WriteL3(0x14 + 2,1); //状态模式 (000101xx+10)


WriteL3(0xc1,0); //1,0,0,0, 0,0,01:状态1,


//Gain of DAC 6 dB,Gain of ADC 0dB,ADC non-inverting,


//DAC non-inverting,Single speed playback,ADC-Off DAC-On



//配置s3c2440的IIS寄存器


//预分频器为3,所以CDCLK=PCLK/(3+1)=16.928kHz


rIISPSR = 3<<5|3;


//无效DMA,输入空闲,预分频器有效


rIISCON = (0<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1);


//PCLK为时钟源,输出模式,IIS模式,每个声道16位,CODECLK=384fs,SCLK=32fs


rIISMOD = (0<<9)|(0<<8)|(2<<6)|(0<<5)|(0<<4)|(1<<3)|(1<<2)|(1<<0);


rIISFCON = (0<<15)|(1<<13); //输出FIFO正常模式,输出FIFO使能



flag=1;


count=0;


//开启IIS


rIISCON |= 0x1;


while(flag)


{



if((rIISCON & (1<<7))==0) //检查输出FIFO是否为空


{


//FIFO中的数据为16位,深度为32


//当输出FIFO为空时,一次性向FIFO写入32个16位数据


for(i=0;i<32;i++)


{


rIISFIFO=(buffer[2*i+count])+(buffer[2*i+1+count]<<8);


}


count+=64;


if(count>length)


flag=0; //音频数据传输完,则退出


}


}


rIISCON = 0x0; //关闭IIS


}



void Main(void)


{



//配置MPLL


//fs=44.1kHz,CODECLK=384fs=16.9344MHz


//不改变CLKDIVN,所以PCLK=FCLK/8


//MPLLCON:MDIV=150,PDIV=5,SDIV=0,所以FCLK=541.7143MHz,PCLK=67.714MHz


rMPLLCON = (150<<12) | (5<<4) | 0;



//配置L3接口总线,GPB2:L3MODE, GPB3:L3DATA, GPB4:L3CLOCK


rGPBCON = 0x015550; //输出


rGPBUP = 0x7ff; //上拉无效


rGPBDAT = 0x1e4;



//配置IIS接口


rGPEUP = rGPEUP & ~(0x1f) | 0x1f; //上拉无效,GPE[4:0] 1 1111


rGPECON = rGPECON & ~(0x3ff) | 0x2aa;



playsound(music,sizeof(music));



while(1)


{


;


}


}