📄 iis.c
字号:
I2S_DMA_finishTX();
if(port == I2S_PORT0) rIISFIC = 0x0; //For FIFO flush
else rIISFIC1 = 0x0; //For FIFO flush
printf("\nEnd of Play!\n");
}
//mode 1 : mic rec
//mode 2 : line rec
void IIS_RecSound_Polling(int mode, unsigned int uBufferAddr, unsigned int uPcmByteSize)
{
unsigned int inc=0;
unsigned int sizeWord = uPcmByteSize/4;
unsigned int breakpoint = sizeWord/2+1;
unsigned int* ptemp;
int i;
g_oI2Splaybuffer[1].uCurrAddr = (unsigned int *)uBufferAddr;
printf("Press any key to record.\n");
getchar();
printf("\n Recording............\n");
//IIS Rx start
if(g_oI2SState.Port == I2S_PORT0) rIISCON |= 0x1;
else rIISCON1 |= 0x1;
if(g_oI2SState.Port == I2S_PORT0)
{
while(1)
{
//while( (rIISCON & 0x80)==0x80 ) ;//wait during fifo is not full
//>13
while( (rIISCON & 0x200)==0x200 ) ;//wait during fifo is empty
//now fifo is full, read
*(g_oI2Splaybuffer[1].uCurrAddr++) = rIISRXD;
inc++;
if( inc >= sizeWord) break;
}
}
else
{
while(1)
{
//while( (rIISCON1 & 0x80)==0x80 ) ;//wait during fifo is not full
while( (rIISCON1 & 0x200)==0x200 ) ;//wait during fifo is empty
//now fifo is full, read
*(g_oI2Splaybuffer[1].uCurrAddr++) = rIISRXD1;
inc++;
if( inc >= sizeWord) break;
}
}
//IIS Rx stop
I2S_rx_finish();
if(g_oI2SState.Port == I2S_PORT0) rIISFIC = 0x0; //For FIFO flush
else rIISFIC1 = 0x0; //For FIFO flush
printf("\nEnd of Record!\n");
}
//mode 1 : mic rec
//mode 2 : line rec
void IIS_RecSound_Polling_logic(int mode, unsigned int uBufferAddr, unsigned int uPcmByteSize)
{
unsigned int inc=0;
unsigned int sizeWord = uPcmByteSize/4;
unsigned int breakpoint = sizeWord/2+1;
unsigned int* ptemp;
int i;
//init
rGPHCON = (rGPHCON & ~(3<<28) ) | (1<<28);//out(clockout1 tp 5)
rGPHUDP = rGPHUDP & ~(0x3<<28)|(0x0<<28);//pullup/down disable
rGPHDAT = (rGPHDAT & ~(1<<14) ) | (0<<14);//init-low
g_oI2Splaybuffer[1].uCurrAddr = (unsigned int *)uBufferAddr;
printf("Press any key to record.\n");
getchar();
printf("\n Recording............\n");
//IIS Rx start
if(g_oI2SState.Port == I2S_PORT0) rIISCON |= 0x1;
else rIISCON1 |= 0x1;
rGPHDAT = 0x755f;
if(g_oI2SState.Port == I2S_PORT0)
{
while(1)
{
//while( (rIISCON & 0x80)==0x80 ) ;//wait during fifo is not full
if(inc!=breakpoint)
while( (rIISCON & 0x200)==0x200 ) ;//wait during fifo is empty
//now fifo is full, read
*(g_oI2Splaybuffer[1].uCurrAddr++) = rIISRXD;
if(inc==breakpoint) rGPHDAT = 0x755f;
//if(inc==breakpoint+16) rGPHDAT = 0x755f; //0x355f + (inc%2)*0x4000;
inc++;
if( inc >= sizeWord) break;
//to make overrun.
//problem : how possibly know this happens?,
// once happens, then it's over.
//===> interrupt routine is needed, hw changes is needed.
if( inc == breakpoint)
{
rGPHDAT = 0x355f;
printf("Stoped by manual, press to continue, monitor tp5 at low to high triggering..\n");
getchar();
//continue
rGPHDAT = 0x755f;
while( (rIISCON & 0x800)==0x100 ) ;//wait during right
for(i=0;i<200;i++); //(to avoid trasition error)
while( (rIISCON & 0x800)==0x000 ) ;//wait during left
// L R L
// 0 5.2us 10.4us 15.6us
// \___________/--------\_________/
//right width 5.2us <---------> critical path at before rtl fix
//after rtl fix.
//port0
//400:133:66
// i<650 - | 15.41us - read when sync clk is left. data is read at next left sync signal.(ok) V
// i<600 - | 13.27us - read when sync clk is left. data is read at next left sync signal.(ok) V
//no delay - | 5.67us - read when sync clk is right. data is read at next left sync signal.(ok) V
for(i=0;i<650;i++);
rGPHDAT = 0x355f;
}
}
}
else
{
while(1)
{
if(inc!=breakpoint)
while( (rIISCON1 & 0x200)==0x200 ) ;//wait during fifo is empty
//now fifo is full, read
*(g_oI2Splaybuffer[1].uCurrAddr++) = rIISRXD1;
if(inc==breakpoint) rGPHDAT = 0x755f;
inc++;
if( inc >= sizeWord) break;
//to make overrun.
//problem : how possibly know this happens?,
// once happens, then it's over.
//===> interrupt routine is needed, hw changes is needed.
if( inc == breakpoint)
{
rGPHDAT = 0x355f;
printf("Stoped by manual, press to continue, monitor tp5 at low to high triggering..\n");
getchar();
//continue
rGPHDAT = 0x755f;
while( (rIISCON1 & 0x800)==0x100 ) ;//wait during right
for(i=0;i<20;i++); //(to avoid trasition error)
while( (rIISCON1 & 0x800)==0x000 ) ;//wait during left
// L R L
// 0 5.2us 10.4us 15.6us
// \___________/--------\_________
//right width 5.2us
//after rtl fix.
//port1
//400:133:66
// i<600 - | 14.13us - read when sync clk is left. data is read at next left sync signal.(ok) V
// i<300 - | 9.36us - read when sync clk is left. data is read at next left sync signal.(ok) V
// i<300 - | 12.69us - read when sync clk is left. data is read at next left sync signal.(ok) V
// i<100 - | 11.09us - read when sync clk is left. data is read at sams left sync signal.(ok) V
// i<100 - | 6.91s - read when sync clk is right. data is read at next left sync signal.(ok) V
//no delay - | 5.85us - read when sync clk is right. data is read at next left sync signal.(ok) V
for(i=0;i<600;i++);
rGPHDAT = 0x355f;
}
}
}
//IIS Rx stop
I2S_rx_finish();
if(g_oI2SState.Port == I2S_PORT0) rIISFIC = 0x0; //For FIFO flush
else rIISFIC1 = 0x0; //For FIFO flush
ptemp = (unsigned int *)(uBufferAddr+breakpoint*4);
printf("content at the breakpoint @0x%x\n",ptemp);
printf("breakpoint : 0x%x\n", *ptemp);
printf("fifo 1 : breakpoint+4 : 0x%x (from the point continuing)\n", *(ptemp+1) );
for(i=2; i<24; i++)
{
if( i ==17 ) printf("fifo 17 is the data when continued from overrun\n");
printf("fifo %d, breakpoint+%d : 0x%x\n",i, 4*i, *(ptemp+i) );
}
printf("\nEnd of Record!\n");
}
/*
//fifo is full : read content from before the momoent stop., and at the moment of stop
*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
rGPHDAT = 0x755f;
*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
rGPHDAT = 0x355f;
*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
rGPHDAT = 0x755f;
*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
rGPHDAT = 0x355f;
*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
rGPHDAT = 0x755f;
*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
rGPHDAT = 0x355f;
*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
inc=inc+16;*/
/*
//mode 1 : mic rec
//mode 2 : line rec
void IIS_RecSound_Polling_logic(int mode, unsigned int uBufferAddr, unsigned int uPcmByteSize)
{
unsigned int inc=0;
unsigned int sizeWord = uPcmByteSize/4;
unsigned int breakpoint = sizeWord/2+1;
unsigned int* ptemp;
int i;
//init
rGPHCON = (rGPHCON & ~(3<<28) ) | (1<<28);//out(tp 32)
rGPHUDP = rGPHUDP & ~(0x3<<28)|(0x0<<28);//pullup/down disable
rGPHDAT = (rGPHDAT & ~(1<<14) ) | (0<<14);//init-low
g_oI2Splaybuffer.uCurrAddr = (unsigned int *)uBufferAddr;
printf("Press any key to record.\n");
getchar();
printf("\n Recording............\n");
//IIS Rx start
if(g_oI2SState.Port == I2S_PORT0) rIISCON |= 0x1;
else rIISCON1 |= 0x1;
rGPHDAT = 0x755f;
if(g_oI2SState.Port == I2S_PORT0)
{
while(1)
{
//while( (rIISCON & 0x80)==0x80 ) ;//wait during fifo is not full
while( (rIISCON & 0x200)==0x200 ) ;//wait during fifo is empty
//now fifo is full, read
*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
if(inc>=breakpoint) rGPHDAT = 0x355f + (inc%2)*0x4000;
inc++;
if( inc >= sizeWord) break;
//to make overrun.
//problem : how possibly know this happens?,
// once happens, then it's over.
//===> interrupt routine is needed, hw changes is needed.
if( inc == breakpoint)
{
rGPHDAT = 0x355f;
printf("Stoped by manual, press to continue, monitor tp32 at low to high triggering..\n");
getchar();
//continue
rGPHDAT = 0x755f;
//fifo flush
//wait during left-work.
// while( (rIISCON & 0x800)==0x000 ) ;
//wait during right-flip occur..
while( (rIISCON & 0x800)==0x100 ) ;
}
}
}
else
{
while(1)
{
while( (rIISCON1 & 0x80)==0x80 ) ;//wait during fifo is not full
//now fifo is full, read
*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD1;
if( ( (unsigned int)(g_oI2Splaybuffer.uCurrAddr) )
>= (uBufferAddr+ uPcmByteSize)
) break;
}
}
//IIS Rx stop
I2S_rx_finish();
if(g_oI2SState.Port == I2S_PORT0) rIISFIC = 0x0; //For FIFO flush
else rIISFIC1 = 0x0; //For FIFO flush
ptemp = (unsigned int *)(uBufferAddr+breakpoint*4);
printf("content at the breakpoint\n");
printf("breakpoint : 0x%x\n", *ptemp);
printf("fifo 0 : breakpoint+4 : 0x%x (from the point continuing)\n", *(ptemp+1) );
for(i=2; i<20; i++)
printf("breakpoint+%d : 0x%x\n",i-1, *(ptemp+i) );
printf("\nEnd of Record!\n");
}
*/
//be careful. interrupt enable setting should be prior to the test, and after that, enabled setting should be kept.
void IIS_PlayWave_Polling(int port, unsigned char *start_addr, unsigned int play_size, int bitperch)
{
unsigned char Exit_Key;
unsigned char Burst, Datasize;
unsigned char rBurst, rDatasize;
unsigned int estInitialTC;//
unsigned int realInitialTC, backup, inc;
unsigned int i, uFifoStat0, uFifoStat1, uFifoStat2;
//unsigned int* uPcmBuffer;
//size estimate,
Burst = 1;//1: single, 4 : 4burst - doesn't work?
Datasize = 4;//1:byte, 2:half word 4:word [transfer unit]
rBurst = (Burst == 1)? 0 : 1;//0:single, 1:4 burst
rDatasize = (Datasize==1)?0:
(Datasize==2)?1:2;//0:byte, 1:half word, 2: word.
estInitialTC = play_size/ ( Burst*Datasize );// playsize(byte) / ( single or burst * transfer unit ) = tc
realInitialTC = estInitialTC;
backup=realInitialTC/2+3;//front center/
inc=0;
printf("Word unit @0:%d, overrun point:%d\n", realInitialTC, backup);
printf("\nConnect head-phone plug into speaker-out socket on SMDK2450 and Press any key.\n");
getchar();
printf("If you want to exit, Press the 'x' key.\n");
printf("Now Play...\n");
g_underruncnt=0;
g_oI2Splaybuffer[0].uStartAddr = (unsigned int *)start_addr;
g_oI2Splaybuffer[0].uCurrAddr = g_oI2Splaybuffer[0].uStartAddr;
//IIS Tx Start
//fill fifo before starting.
if(port == I2S_PORT0) rIISCON = rIISCON & ~(0x7e) | 0x1;//IIS Interface start, dma all off
else rIISCON1 = rIISCON1 & ~(0x7e) | 0x1;//IIS Interface start, dma all off
//printf("trace 32 must detached, due to it read fifo,\n");
while(1)
{
if(port == I2S_PORT0)
{
while( (rIISCON & 0x100)==0x100 ) ;//wait during full
}
else
{
while( (rIISCON1 & 0x100)==0x100 ) ;//wait during full
}
// following makes delay.
// uFifoStat0 = (rIISFIC & 0x1f00)>>8 ;
// printf("fifo count %d ", uFifoStat0);
if(port == I2S_PORT0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -