⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iis.c

📁 Audio codec--TLV320AIC31 裸测代码
💻 C
字号:
/********************************************/
/* IIS.c    : IIS module test sources      .*/
/* Author   : YZ							*/
/* Time     : 2006-9-13		    			*/
/********************************************/

#include "iis.h"
#include <stdlib.h>
#include <stdio.h>
#include "common.h"
#include "cfIdedma.h"
#define nodma
//#define open_file

// A 48 point, 20 bit sine table
const int sinewave[] = { 0x00000, 0x10B51, 0x2120F, 0x30FBB, 0x3FFFF, 0x4DEBD, 0x5A826, 0x658C8, 0x6ED9D, 0x7641A,
                         0x7BA36, 0x7EE79, 0x7FFFE, 0x7EE79, 0x7BA36, 0x7641A, 0x6ED9D, 0x658C8, 0x5A826, 0x4DEBD,
                         0x3FFFF, 0x30FBB, 0x2120F, 0x10B51, 0x00000, 0xEF4AF, 0xDEDF1, 0xCF045, 0xC0001, 0xB2143,
                         0xA57DA, 0x9A738, 0x91263, 0x89BE6, 0x845CA, 0x81187, 0x80002, 0x81187, 0x845CA, 0x89BE6,
                         0x91263, 0x9A738, 0xA57DA, 0xB2143, 0xC0001, 0xCF045, 0xDEDF1, 0xEF4AF };

//this function is used to delay several ms 
void apSleep(unsigned int msec)
{
    unsigned int utimer, etimer, ttimer;

    utimer       = 0;
    etimer       = 0xFFFF - 1000;
    ttimer       = SLEEP_TIMEOUT;

    *TIMER0_CTRL = 0x00;
    *TIMER0_LOAD = 0xFFFF;

    // Wait for timer to be loaded
    while((*TIMER0_LOAD != 0xFFFF) && ttimer) 
        ttimer--;

    // Wait for timer to count down
    *TIMER0_CTRL = 0x80;
    do 
    {
    	if((*TIMER0_VALUE & 0xFFFF) < etimer)
    	{
            *TIMER0_LOAD = 0xFFFF;
        	utimer++;
    	}
    }while(utimer<msec);
}


void playback()
{
	unsigned short temp;	
	int loop,i, time,t;
	
	FILE *fp;
	
	//static unsigned long play_buffer[90000];
	unsigned short *play_buffer;
	
	*PIN = 0x80;
	*IIS_CR0=0x032f;
	*IIS_CR1=0x0002;
	*IIS_IMSC=0x000f;
	#ifndef nodma
		*IIS_DMACR=0x0003;
	#endif	
	*IIS_CPSR=0x0004;
	
	#ifdef open_file
	  if ((fp = fopen("C:\\play.pcm","rb"))==NULL)
   		 
   		 {
   		  	printf("error for fopen play\n");
   			return;
   			
   			}   			
 		
 		  play_buffer=(unsigned short *)malloc(0x200000*(sizeof(char)));
 		   if (play_buffer==NULL)
          {
        	  printf(" error for alloc play_buffer\n");
        	  return ;
       	 }
 		   
 		   for (i=0;i<0x100000;i++)
        	fread(&play_buffer[i],2,1,fp); 
          
      	 fclose(fp);
 	#else
 		
          play_buffer=(unsigned short *)malloc(0x1000*(sizeof(char)));
          if (play_buffer==NULL)
          {
        	  printf(" error for alloc play_buffer\n");
        	  return ;
       	 }
          
		for( i = 0; i<4096; i++)
   		 {
      	  if(t<48)
       		 {
       		  play_buffer[i] = sinewave[t]>>4;
        	  t++;
       		 }
      	  else
      	   {
          	   t=0;
          	 play_buffer[i] =sinewave[t]>>4;
           }
   		 }
    
		
	#endif
	
          
  printf("begin for play\n");          

#ifdef nodma
	// Generate a 1kHz 1 second tone (sinewave) on each channel
    // Frequency is defined by CODEC (48kHz).
 // while(0){
 
    for (time = 0; time < 8000; time++) 
   	 {
        for (loop = 0; loop < 48; loop++) 
        {
            // Wait for TX FIFO not to be full then write left and right channels
            temp = (sinewave[loop] >> 4);
			//apSleep(1);
           // while((!(*IIS_SSR & 0x0002)) && time < 4000);            
           //	*IIS_SDR = (time < 4000) ? 0 : 0;
            *IIS_SDR = 0;
           // apSleep(1);
            //while((!(*IIS_SSR & 0x0002)) && time < 4000);
           	//	*IIS_SDR = (time < 4000) ? temp : temp;
           	*IIS_SDR = temp;
      	  }
  	 	}
//	 }
	 

 for(temp=0;temp<1000;temp++)
 {	  	  
 	 for (i=0;i<0x100000;i++)
 	  {
 	
 	
 	//  while(!(*IIS_SSR & 0x1));
 	
 	while(!(*IIS_MIS & 0x8));  
 	   *IIS_SDR = *(play_buffer+i);		  	  	            
      }    	 	
   }
    
   
#else
  
   while(1)
    {
    	    	 	 
    	 	  	SetDMA(0, (unsigned long)play_buffer, (unsigned long)IIS_SDR ,0x1000);  	 	  	
    	 	  
      	
      			WaitDMA();  
      			
      			 *IIS_SDR = 0;
      		 
     }
     		 
     		 
  
 #endif    
   
 
  
    
}


void record()
{
	int loop;
	FILE *fp;
	FILE *fp2;
	static unsigned short data1[90000];
	static unsigned short data2[90000];
	unsigned short temp1;
	
	*PIN = 0x80;
	*IIS_CR0=0x011f;
	*IIS_CPSR=0x0008;
	*IIS_IMSC=0x0004;
	*IIS_CR1=0x0002;
	
	
	
	

    fp = fopen("C:\\recordl.pcm","wb");
    fp2 = fopen("C:\\recordr.pcm","wb");
       
    for (loop = 0; loop < 90000; loop++) 
    {
    // Wait for TX FIFO not to be full then write left and right channels
    	while(!(*IIS_MIS & 0x4));  
    	data2[loop] = *IIS_SDR;      
    	data1[loop] = *IIS_SDR;              
    }    

    fwrite(data1, sizeof(short), 90000, fp);
    fwrite(data2, sizeof(short), 90000, fp2);
    
	fclose(fp);	
	fclose(fp2);
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -