📄 iis.c
字号:
break;
}
}
void Select_PCLK(void)
{
rCLKCON |= (1<<26)+(1<<13); // Enable IIS block , IIS audio clk block
rCLKSRC |= (1<<9);
rCLKDIVN &=~(0xf<<12); //12/1=12 MHz
printf("Enalbe PCLK for IIS Block!\n");
printf("Enter Prescaller value : 7 or 3 (7:22.1khz using 3:44.1khz using @ PCLK 66.5Mhz) = ");
iPdf = GetIntNum();
printf("\n");
//IIS Pre-scaler Setting
rIISPSR &= 0;
rIISPSR |= (1<<15) + (iPdf<<8);
//In case PCLK = 50 MHz, IIS Codec CLK = 50/(5+1) = 8.34MHz-->22KHz
//In case PCLK = 66.5 MHz, IIS Codec CLK = 66.5/(7+1) = 8.31MHz-->22KHz
printf("\nIIS Master CLK(PCLK) = %4.2f MHz", (float)PCLK/1000000);
IIS_Codec_CLK = (float)PCLK/(iPdf+1);
printf("\nIIS Codec CLK = %4.2f MHz", IIS_Codec_CLK/1000000);
IIS_MasterClk_Sel = 0;
}
void Select_EXTCLK(void) // I2S Clock source is I2SSYSCLK(MPLL_Out=266Mhz)
{
unsigned short Sampling_Rate;
printf("\nI2S Source Clock is I2SSYSCLK(MPLL_Out=266Mhz)\n");
iFS = 0;
Sampling_Rate = IIS_Select_SamplingRate();
rCLKCON |= (1<<26)+(1<<13); // Enable IIS block , IIS audio clk block
rCLKSRC |= (1<<9); //IIS Clock Source Selection: MPLL Out
rCLKDIVN &=~(0xf<<12); //I2S clock Divider is Zero.
rIISMOD |= (1<<10);
if(Sampling_Rate==44100)
{
rIISPSR |= (1<<15) + (15<<8);
IIS_Codec_CLK = (float)266000000/16;
}
else if(Sampling_Rate==22050)
{
rIISPSR |= (1<<15) + (31<<8);
IIS_Codec_CLK = (float)266000000/32;
}
printf("\nIIS Codec CLK = %4.4f MHz", IIS_Codec_CLK/1000000);
IIS_MasterClk_Sel == 1;
}
void Select_UPLL_Ref_CLK(void) // I2S Clock source is I2SSYSCLK(EREFCLK=12Mhz)
{
printf("\nI2S Source Clock is I2SSYSCLK(EREFCLK=12Mhz)\n");
printf("Using 12Mhz I2S Clock source and then you Setting FS = 256fs\n" );
printf("Play Example LRCLK = 22.05kHz, FS = 256fs, BFS =32\n" );
iFS = 1;
iCODECCLK = 256;
rCLKCON |= (1<<26)+(1<<13); // Enable IIS block , IIS audio clk block
rCLKSRC &= ~(1<<9); //IIS Clock Source Selection: EREFCLK
rCLKDIVN &=~(0xf<<12); //I2S clock Divider is Zero.
rIISMOD |= (1<<10);
rIISPSR |= (1<<15) + (1<<8);
IIS_Codec_CLK = (float)12000000/2;
printf("\nIIS Codec CLK = %4.4f MHz", IIS_Codec_CLK/1000000);
IIS_MasterClk_Sel == 1;
}
void down_wav(void)
{
//Non-cacheable area = 0x11000000 ~ 0x13cf0000
Buf = (unsigned char *)IIS_BUFFER;
_temp = Buf;
printf("Download the PCM(no ADPCM) file by DNW serial port(With header)!!\n");
printf("Download address is %xh\n", Buf);
while(((unsigned int)_temp - (unsigned int)Buf) < 4)
{
//Uart_Printf("\ndata=%d",size);
Led_Display(0);
Delay(1500);
Led_Display(15);
Delay(1500);
}
printf("\ndata=%x",size);
//Uart_Getch();
size = *(Buf) | *(Buf + 1)<<8 | *(Buf + 2)<<16 | *(Buf + 3)<<24;
printf("\ndata=%x",size);
//Uart_Getch();
printf("\nNow, Downloading... [ File Size : %8d( 0)]",size);
while(((unsigned int)_temp - (unsigned int)Buf) < (size)){
printf("\b\b\b\b\b\b\b\b\b%8d)",(unsigned int)_temp - (unsigned int)Buf);
Delay(5000);
}
printf("\b\b\b\b\b\b\b\b\b%8d)]\n",(unsigned int)_temp - (unsigned int)Buf);
rINTSUBMSK |= BIT_SUB_RXD1;
rINTMSK |= BIT_UART1;
size = *(Buf + 0x2c) | *(Buf + 0x2d)<<8 | *(Buf + 0x2e)<<16 | *(Buf + 0x2f)<<24;
size = (size>>1)<<1; //for 44B0X
fs = *(Buf + 0x1c) | *(Buf + 0x1d)<<8 | *(Buf + 0x1e)<<16 | *(Buf + 0x1f)<<24;
printf("Sample Size = %d\n",size/2);
printf("Sampling Frequency = %d Hz\n",fs);
printf("\n[ Now play the wave file .....]\n");
printf("If you want to mute or no mute push the 'EIN0' key repeatedly\n");
}
unsigned short IIS_Select_SamplingRate(void)
{
int i;
printf("\nSelect ADC/DAC Rate\n");
printf(" 1:22.05kHz, 2:44.1kHz\n");
i = GetIntNum();
switch(i)
{
case 0:
return 11025;
break;
case 1:
return 22050;
break;
case 2:
return 44100;
break;
default:
return 44100;
break;
}
}
//Initialization of UDA1341 Audio Codec using L3 Interface
/*
void IIS_RecSound_DMA1(int mode, unsigned int rec_size)
{
int Exit_Key;
pISR_DMA2 = (unsigned)DMA1_Rec_Done;
ClearPending(BIT_DMA2);
rIISCON = (0<<5) + (1<<4) + (0<<3) +(0<<2) + (1<<1) + 0;
rIISMOD = (IMS<<10)+(1<<8) + (0<<7) + (0<<5) + (2<<3) + (1<<1) + (0<<0);
//rIISFIC = (1<<7) + 0;
//rIISFIC = (0<<7) + 0;
printf("\nIISLRCK = %d Hz", (int) IIS_Codec_CLK/384);
Data_init_2(); // Jungil
printf("\n Check 0x31000028 Memory Init \n");
getchar();
printf("\nPress any key to start record!\n");
getchar();
rIISCON |= 0x1;
//--- DMA1 Initialize
rDISRCC2 = (1<<1) + (1<<0);
rDISRC2 = ((unsigned int)0x55000014);
rDIDSTC2 = (0<<1) + (0<<0);
rDIDST2 = (int)rec_buf;
// rDCON2 = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(0<<22)+(2<<20)+(rec_size/4);
rDCON2 = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(0<<22)+(2<<20)+(464000);
rDMAREQSEL2 = (5<<1) + (1<<0);
rDMASKTRIG2 = (0<<2) + (1<<1) + (0<<0); //No-stop[2], DMA1 channel On[1], No-sw trigger[0]
rINTMSK = ~(BIT_DMA2);
if(mode ==1)
printf("\n\nAre you ready to record sound via MIC-In on SMDK2411/2413?");
if(mode ==2)
printf("\n\nAre you ready to record sound via Line-In on SMDK2411/2413?");
printf("Recording...\n");
//IIS Rx start
while(!Uart_GetKey())
{
Exit_Key=getchar();
if( (Exit_Key == 'x') | (Exit_Key == 'X'))
{
Rec_Done=1;
break;
}
}
while(!Rec_Done)
{
printf("STAT1: 0x%x CURR_TC: 0x%x DCDST1: 0x%x\n", rDSTAT1&0x300000, rDSTAT1&0xfffff, rDCDST1);
printf(".");
Delay(2000);
}
Rec_Done = 0;
//IIS Rx stop
Delay(10); //For end of H/W Rx
rIISCON = 0x0; //IIS stop
rDMASKTRIG2 = (1<<2); //DMA1 stop
rIISFIC = 0x0; //For FIFO flush
ClearPending(BIT_DMA2);
// rSUBSRCPND=(BIT_SUB_DMA1);
rINTMSK |= (BIT_DMA2);
printf("\nEnd of Record!\n");
}
*/
void IIS_RecSound_DMA1_Repeat(unsigned char *start_addr, unsigned int rec_size)
{
unsigned char Exit_Key;
printf("\nIISLRCK = %d Hz", (int) IIS_Codec_CLK/384);
//--- DMA1 Initialize
rDISRCC1 = (1<<1) + (1<<0);
rDISRC1 = ((unsigned int)0x55000014);
rDIDSTC1 = (0<<1) + (0<<0);
rDIDST1 = (int)rec_buf1;
rDCON1 = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(0<<22)+(2<<20)+(rec_size/4);
rDMAREQSEL1 = (5<<1) + (1<<0);
rDMASKTRIG1 = (0<<2) + (1<<1) + (0<<0); //No-stop[2], DMA1 channel On[1], No-sw trigger[0]
printf("\nRecording...\n");
//IIS Rx start
//rIISCON |= 0x1;
while(!Uart_GetKey())
{
Exit_Key=getchar();
if( (Exit_Key == 'x') | (Exit_Key == 'X'))
{
Rec_Done=1;
break;
}
}
//IIS Rx stop
Delay(10); //For end of H/W Rx
rIISCON = 0x0; //IIS stop
rDMASKTRIG1 = (1<<2); //DMA1 stop
rIISFIC = 0x0; //For FIFO flush
printf("\n\nEnd of Record!");
}
void __irq Rx_IIS_Int(void)
{
rSUBSRCPND = BIT_SUB_RXD1; //Clear pending bit (Requested)
rSUBSRCPND;
ClearPending(BIT_UART1);
*_temp ++= RdURXH1();
}
void IIS_PlayWave_DMA2(unsigned char *start_addr, unsigned int play_size)
{
unsigned char Exit_Key;
pISR_DMA2 = (unsigned)DMA2_Done;
ClearPending(BIT_DMA2);
// this setting for only TX
rIISCON = (0<<5) + (0<<4) +(1<<2) + (0<<1)+0;
// using pclk, tx only , left for channel,iis format ,384fs , 32fs ,16bit
rIISMOD = (IMS<<10)+(0<<8) + (0<<7)+ (0<<5) + (2<<3)+ (0<<1) + (0<<0);
rIISFIC = 0+(1<<15) ;
rIISFIC = 0+(0<<15) ;
printf("\nIISLRCK = %d Hz", (int) IIS_Codec_CLK/384);
rINTMSK = ~(BIT_DMA2);
printf("\nConnect head-phone plug into speaker-out socket on SMDK2411 and Press any key.\n");
getchar();
printf("If you want to exit, Press the 'x' key.\n");
printf("Now Play...\n");
printf("If you want to disable IIS tx(PAUSE), Press '0' key\n");
printf("If you want to enable IIS tx, Press '1' key\n");
printf("If you want to stop DMA channel(STOP), Press '2' key\n");
printf("If you want to start DMA channel, Press '3' key\n");
//DMA2 Register Setting
rDISRC2 = (int)(start_addr);
rDISRCC2 = (0<<1) + (0<<0);
rDIDST2 = ((unsigned int)0x55000010);
rDIDSTC2 = (1<<2)+ (1<<1) + (1<<0);
// 31: ACK 30: sync pclk 29:curr_tc int setting 28:unit transfer 27:single service 22: reload 20:half word
rDCON2 = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(0<<22)+(2<<20)+(play_size/4);
// 5:1= 4th bit is the tx iis 0:set = hw zero = sw
rDMAREQSEL2 = (4<<1)+(1<<0);
rDMASKTRIG2 = (0<<2) + (1<<1) + (0<<0); //No-stop, DMA2 channel On, and No-sw trigger
//IIS Tx Start
rIISCON |= 0x1; //IIS Interface start
while(!Uart_GetKey())
{
Exit_Key=getchar();
//->
//khs.050510
// added for I2S bug test
if(Exit_Key == '0'){
rIISCON |= (1<<4);
printf("\nPAUSE...\n");
}
if(Exit_Key == '1'){
rIISCON &= ~(1<<3);
}
if(Exit_Key == '2'){
rDMASKTRIG2 |= (1<<2);
rIISFIC &= ~(1<<13); //* tx fifo disable
while((rIISFIC & 0x0FC0)!=0); //* wait until tx fifo gets empty
printf("\nSTOP...\n");
}
if(Exit_Key == '3'){
rIISFIC |= (1<<13); //* tx fifo enable
rDISRC2 = (int)(start_addr);
rDMASKTRIG2 &= ~(1<<2);
rDMASKTRIG2 |= (1<<1);
}
//<-
if( (Exit_Key == 'x') | (Exit_Key == 'X'))
break;
printf("STAT2: 0x%x CURR_TC: 0x%x DCDST2: 0x%x\n", rDSTAT2&0x300000, rDSTAT2&0xfffff, rDCDST2);
}
//IIS Tx Stop
Delay(10); //For end of H/W Tx
rIISCON &= ~(1<<0); //IIS Interface stop
rDMASKTRIG2 = (1<<2); //DMA2 stop
rIISFIC = 0x0; //For FIFO flush
ClearPending(BIT_DMA2);
rINTMSK |= (BIT_DMA2);
printf("\nEnd of Play!\n");
}
void __irq DMA2_Done(void)
{
rINTMSK |= (BIT_DMA2);
ClearPending(BIT_DMA2);
rIISCON &= ~(1<<2)|(0<<0);
rIISCON |= (1<<2)|(1<<0);
printf("\nTX DMA Done~~~");
rINTMSK = ~(BIT_DMA2);
}
void __irq DMA1_Rec_Done(void)
{
rINTMSK |= (BIT_DMA2);
ClearPending(BIT_DMA2);
rIISCON &= ~(1<<1)|(0<<0);
rIISCON |= (1<<1)|(1<<0);
printf("\nDMA Record Done..");
rINTMSK = ~(BIT_DMA2);
Rec_Done = 1;
}
void __irq Play_Rec_Simul(void)
{
rINTMSK |= (BIT_DMA1);
ClearPending(BIT_DMA1);
rIISCON &= ~(1<<0);
rIISCON |= 0x1;
printf("\nR~~~");
rINTMSK = ~(BIT_DMA1);
}
////////////////////////////////////////////////////////////////////////////////////
void Data_init(void)
{
int i;
for(i=0;i<50000;i+=4)
{
*(rec_buf+i)=0xaaaa5555 ;
}
}
void Data_init_Master(void)
{
int i;
unsigned int *rec_buf = (unsigned int *)0x31000028;
for(i=0;i<500000;i++)
{
*(rec_buf+i)=i;
}
// *(rec_buf+0)=0xa5a5a5a5;
// *(rec_buf+1)=0x5a5a5a5a;
// *(rec_buf+2)=0xffff0000;
// *(rec_buf+3)=0xffffffff;
// *(rec_buf+4)=0x0000ffff;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -