📄 iis.c
字号:
int i;
pISR_DMA1= (unsigned)Play_Rec_Simul;
ClearPending(BIT_DMA1);
// this setting for TX RX Simulateously
rIISCON = (0<<5) + (0<<4) +(1<<2) + (1<<1)+0;
// using pclk, TX/RX Silmulateously , left for channel,iis format ,384fs , 32fs ,16bit
rIISMOD = rIISMOD & ~(0xfff) | (0<<10)|(2<<8)|(0<<7)|(0<<5)|(2<<3)|(0<<1)|(0<<0);
// Fifo Fulsh
rIISFIC = 0+(1<<15);
rIISFIC = 0+(0<<15);
printf("\nIISLRCK = %d Hz", (int) IIS_Codec_CLK/384);
rINTMSK = ~(BIT_DMA1);
printf("\nConnect head-phone plug into speaker-out socket on SMDK2460 and Press any key.\n");
getchar();
printf("If you want to exit, Press the 'x' key.\n");
printf("Now Play...\n");
//DMA2 Register Setting
rDISRC2 = (int)(start_addr);
rDISRCC2 = (0<<1) + (0<<0);
rDIDST2 = ((unsigned int)0x55000010);
rDIDSTC2 = (0<<2) + (1<<1) + (1<<0);
rDCON2 = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(0<<22)+(2<<20)+(play_size/4);
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(1)
{
Delay(10000);
IIS_RecSound_DMA1_Repeat(rec_buf1, REC_LEN_IIS);
if( Rec_Done==1)
break;
}
Rec_Done=0;
//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_DMA1);
rINTMSK |=(BIT_DMA1);
printf("\nEnd of Play!\n");
}
void IIS_PlayWave_EREFCLK_1(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 = (1<<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");
//DMA2 Register Setting
rDISRC2 = (int)(start_addr);
rDISRCC2 = (0<<1) + (0<<0);
rDIDST2 = ((unsigned int)0x55000010);
rDIDSTC2 = (0<<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 IIS_PlayWave_EREFCLK_2(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 ,256fs , 32fs ,16bit
rIISMOD = (1<<10)+(0<<8) + (0<<7)+ (0<<5) + (0<<3)+ (0<<1) + (0<<0);
rIISFIC = 0+(1<<15) ;
rIISFIC = 0+(0<<15) ;
printf("\nIISLRCK = %d Hz", (int) IIS_Codec_CLK/256);
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");
//DMA2 Register Setting
rDISRC2 = (int)(start_addr);
rDISRCC2 = (0<<1) + (0<<0);
rDIDST2 = ((unsigned int)0x55000010);
rDIDSTC2 = (0<<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 IIS_RecSound_DMA1_FSCHANGE(int mode, unsigned int rec_size)
{
int Exit_Key;
int iIndex, iFault=0, iGood=0, iLoop=0;
U32 iLRCLK, iBCLK, iBLC;
pISR_DMA2 = (unsigned)DMA1_Rec_Done;
ClearPending(BIT_DMA2);
printf ("Check CodecCLK : 256fs = 0 , 512fs = 1 , 384fs = 2, 768fs = 3 --> " );
iLRCLK = GetIntNum();
printf("\n");
printf ("Check BCLK : 32fs = 0 , 48fs = 1 , 16fs = 2, 24fs = 3 --> " );
iBCLK = GetIntNum();
printf("\n");
printf ("Check BLC : 16bit = 0 , 8bit = 1 ");
iBLC = GetIntNum();
printf("\n");
rIISCON = (0<<5) + (1<<4) + (0<<3) +(0<<2) + (1<<1) + 0;
// using pclk, rx only , left for channel,iis format
rIISMOD = (0<<10)+(1<<8) + (0<<7)+ (0<<5) + (iLRCLK<<3)+ (iBCLK<<1) + (iBLC<<0);
rIISFIC = rIISFIC | (1<<7);
rIISFIC = rIISFIC & (0<<7);
rINTMSK = ~(BIT_DMA2);
printf("\nIISLRCK = %d Hz", (int) IIS_Codec_CLK/384);
for(iIndex=0;iIndex<500000;iIndex+=1)
{
*((unsigned int*)(0x31000028)+iIndex)=0x0;
}
printf("\n Check 0x31000028 Memory Init \n");
printf("\nPress any key to start record!\n");
getchar();
//--- 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);
rDMAREQSEL2 = (5<<1) + (1<<0);
rDMASKTRIG2 = (0<<2) + (1<<1) + (0<<0); //No-stop[2], DMA1 channel On[1], No-sw trigger[0]
rIISCON |= 0x1;
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;
}
}
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);
rINTMSK |= (BIT_DMA2);
printf("\nEnd of Record!\n");
}
void IIS_PlayWave_DMA2_FSCHANGE(unsigned char *start_addr, unsigned int play_size)
{
unsigned char Exit_Key;
U32 iLRCLK, iBCLK, iBLC;
pISR_DMA2 = (unsigned)DMA2_Done;
ClearPending(BIT_DMA2);
printf ("Check CodecCLK : 256fs = 0 , 512fs = 1 , 384fs = 2, 768fs = 3 --> " );
iLRCLK = GetIntNum();
printf("\n");
printf ("Check BCLK : 32fs = 0 , 48fs = 1 , 16fs = 2, 24fs = 3 --> " );
iBCLK = GetIntNum();
printf("\n");
printf ("Check BLC : 16bit = 0 , 8bit = 1 ");
iBLC = GetIntNum();
printf("\n");
// 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 = (0<<10)+(0<<8) + (0<<7)+ (0<<5) + (iLRCLK<<3)+ (iBCLK<<1) + (iBLC<<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");
//DMA2 Register Setting
rDISRC2 = (int)(start_addr);
rDISRCC2 = (0<<1) + (0<<0);
rDIDST2 = ((unsigned int)0x55000010);
rDIDSTC2 = (0<<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();
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 IIS_PlayWave_DMA2_MASTER_SlaveTest(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 = (0<<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");
//DMA2 Register Setting
rDISRC2 = (int)(start_addr);
rDISRCC2 = (0<<1) + (0<<0);
rDIDST2 = ((unsigned int)0x55000010);
rDIDSTC2 = (0<<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)+(262144);
// 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();
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");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -