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

📄 mic.c

📁 凌阳SPCE3200 系统开发板随机自带源程序。共安排了32个子目录
💻 C
字号:
#include    ".\Peripheral\MIC\MIC.h"

unsigned int gunMIC_transbuf1[DATANUM_SIZES]; // catch range
unsigned int *gunMIC_trans1_ptr;
unsigned int gunMIC_transbuf2[DATANUM_SIZES]; // catch range
unsigned int *gunMIC_trans2_ptr;
unsigned int gunMIC_readbuf1[(DATANUM_COUNT * DATANUM_SIZES)];
unsigned int gunMIC_readbuf2[(DATANUM_COUNT * DATANUM_SIZES)];
unsigned int gunMIC_AUDIO_PCM_BUFFER; 
unsigned int gunMIC_DMA_PCM_BUFFER;
unsigned int gunMIC_count1=0;
unsigned int gunMIC_count2=0;
unsigned int gunMIC_PCMDataOffsetPtr=0;
unsigned int gucMIC_BUffFull=0;

//unsigned int DATANUM_SIZES;

#ifdef MOVE_BY_BLOCK
unsigned int gunMIC_RemainDataA=0;	
unsigned int gunMIC_RemainDataB=0;				
#endif

unsigned char MICAudioBuffChange(void)
{
#ifdef MOVE_BY_BLOCK	
	unsigned int j;
	unsigned int BufferRemainData;
#endif
	
	if(gunMIC_AUDIO_PCM_BUFFER==AUDIO_PCM_BUFFER_A)
	{
	    if(gucMIC_BUffFull == 0)
	    {
	    	if(gunMIC_count1 < (DATANUM_COUNT-1))
	    	{
	    		gucMIC_BUffFull = 0;
	    		return ((unsigned char) gunMIC_AUDIO_PCM_BUFFER) ;
	    	}
	    	else
	    	{
	    		gucMIC_BUffFull = 1;
	    	}
	    }
	
	   if(gunMIC_count1!=0)	  
	   {	
		#ifdef MOVE_BY_BLOCK
		BufferRemainData = (gunMIC_count1 * DATANUM_SIZES) +  gunMIC_RemainDataA;
		gunMIC_RemainDataB = BufferRemainData % DATANUM_BLOCK;
		
		for(j=0;j<gunMIC_RemainDataB;j++)
		{
		   gunMIC_readbuf2[j] = gunMIC_readbuf1[BufferRemainData - gunMIC_RemainDataB  + j] ;
		}				
		#endif
						
		gunMIC_AUDIO_PCM_BUFFER = AUDIO_PCM_BUFFER_B;
		gunMIC_count2 = 0;
		gunMIC_PCMDataOffsetPtr = 0;
		
		gucMIC_BUffFull = 0;
	   }
	   else
	   {
	   	 //
	   }
			
	}
	else
	{
        if(gucMIC_BUffFull == 0)
	    {
	    	if(gunMIC_count2 < (DATANUM_COUNT-1))
	    	{
	    		gucMIC_BUffFull = 0;
	    		return ((unsigned char) gunMIC_AUDIO_PCM_BUFFER) ;
	    	}
	    	else
	    	{
	    		gucMIC_BUffFull = 1;
	    	}
	    }
		
		if(gunMIC_count2!=0)
		{
			#ifdef MOVE_BY_BLOCK
			BufferRemainData = (gunMIC_count2 * DATANUM_SIZES) +  gunMIC_RemainDataB;
			gunMIC_RemainDataA = BufferRemainData % DATANUM_BLOCK;
			
			for(j=0;j<gunMIC_RemainDataA;j++)
			{
			   gunMIC_readbuf1[j] = gunMIC_readbuf2[BufferRemainData - gunMIC_RemainDataA  + j] ;
			}				
			#endif
			
			gunMIC_AUDIO_PCM_BUFFER = AUDIO_PCM_BUFFER_A;
			gunMIC_count1 = 0;	
			gunMIC_PCMDataOffsetPtr = 0;
			
			gucMIC_BUffFull = 0;
		}
		else
		{
			//
		}	
	
	}
		
	return ((unsigned char) gunMIC_AUDIO_PCM_BUFFER) ;
}

void MIC32Init(unsigned int SampleRate)
{
	unsigned int count;
		
	//init		
	gunMIC_DMA_PCM_BUFFER = DMA3_BUFFER_A;
	gunMIC_AUDIO_PCM_BUFFER = AUDIO_PCM_BUFFER_A;
	gunMIC_count1 = 0;
	gunMIC_count2 = 0;
	gunMIC_PCMDataOffsetPtr = 0;
	gucMIC_BUffFull = 0;
	
	#ifdef MOVE_BY_BLOCK
    gunMIC_RemainDataA=0;	
    gunMIC_RemainDataB=0;				
    #endif
	
	//end
	
	gunMIC_trans1_ptr = ((unsigned int)gunMIC_transbuf1) & 0x8fffffff; // non-catch range
	gunMIC_trans2_ptr = ((unsigned int)gunMIC_transbuf2) & 0x8fffffff; // non-catch range
	
	
	*P_DMA_AHB_SA2BA = (unsigned int) gunMIC_trans1_ptr;
	*P_DMA_AHB_EA2BA = (unsigned int) gunMIC_trans1_ptr + 4 * DATANUM_SIZES - 4;
	*P_DMA_AHB_SA2BB = (unsigned int) gunMIC_trans2_ptr;
	*P_DMA_AHB_EA2BB = (unsigned int) gunMIC_trans2_ptr + 4 * DATANUM_SIZES - 4;
	*P_DMA_APB_SA2 = P_ADC_MIC_DATA;
	*P_DMA_CHANNEL2_CTRL = DMA_P2M | DMA_REQ | DMA_FIX | DMA_DOUBLE_BUF | DMA_32BIT_BURST | DMA_IRQON | DMA_ON;
	
	
	//*P_ADC_CLOCK_SET = 47;	// for 44.1KHz
	*P_ADC_SAMPLE_CLK = (33868800/SampleRate/16)-1;
	*P_ADC_SAMPLE_HOLD = 0x2000000F;
	
	*P_ADC_MIC_CTRL1 = ANA_AD_POWON | ANA_AD_ON | ANA_MIC_ON | ANA_MICBST_OFF | ANA_MICBIAS_ON | ANA_ADV_INT | 
				   ANA_MIC_CHANNEL;
	*P_ADC_INT_STATUS = DIG_ADCIRQ_CLR | DIG_ADCIRQ_DIS | DIG_ASPIRQ_CLR | DIG_ASPIRQ_DIS | DIG_MICIRQ_CLR | 
				       DIG_MICIRQ_DIS | FIFO_ERR_CLR;
	*P_ADC_MIC_CTRL2 =  DIG_AD_ON | DIG_AD_AUTO | DIG_MICSIGN_OFF | DIG_MICMUTE_OFF | DIG_DMASIZE_32 | 
			           DIG_SMART_OFF | DIG_FIFO_L0;
		
	
	*P_ADC_MIC_GAIN = 10;  //15
	 
}

void MIC32_Off(void)
{
		*P_ADC_MIC_CTRL1 = ANA_AD_POWOFF | ANA_AD_OFF | ANA_MIC_OFF | ANA_MICBST_OFF | ANA_MICBIAS_OFF | ANA_ADV_INT | 
				   ANA_MIC_CHANNEL;
				   
        *P_DMA_CHANNEL2_CTRL = DMA_P2M | DMA_REQ | DMA_FIX | DMA_DOUBLE_BUF | DMA_32BIT_BURST | DMA_IRQON | DMA_OFF;				   
}

void MICGetPCMData(void)
{
    unsigned int j;
    
                
        if(gunMIC_AUDIO_PCM_BUFFER==AUDIO_PCM_BUFFER_A)
        {
        	if(gunMIC_count1>=DATANUM_COUNT)
        	{
        		if(gunMIC_DMA_PCM_BUFFER == DMA3_BUFFER_A)
				{
					gunMIC_DMA_PCM_BUFFER = DMA3_BUFFER_B;
				}
				else
				{
					gunMIC_DMA_PCM_BUFFER = DMA3_BUFFER_A;
				}
		
				return;
        	}
        } 
        else
        {
        	if(gunMIC_count2>=DATANUM_COUNT)
        	{
        		if(gunMIC_DMA_PCM_BUFFER == DMA3_BUFFER_A)
				{
					gunMIC_DMA_PCM_BUFFER = DMA3_BUFFER_B;
				}
				else
				{
					gunMIC_DMA_PCM_BUFFER = DMA3_BUFFER_A;
				}
		
				return;
        	}
        	
        }
    
			if(gunMIC_AUDIO_PCM_BUFFER==AUDIO_PCM_BUFFER_A)
			{			
				if(gunMIC_DMA_PCM_BUFFER == DMA3_BUFFER_A)
				{
					gunMIC_DMA_PCM_BUFFER = DMA3_BUFFER_B; 
					for(j = 0; j < DATANUM_SIZES; j++)
					{						
				#ifdef MOVE_BY_BLOCK
				        gunMIC_readbuf1[gunMIC_count1 * DATANUM_SIZES + j + gunMIC_RemainDataA] = *(gunMIC_trans1_ptr + j);
				#else						
						gunMIC_readbuf1[gunMIC_count1 * DATANUM_SIZES + j] = *(gunMIC_trans1_ptr + j);
				#endif					
					}
				}		
				else
				{
					gunMIC_DMA_PCM_BUFFER = DMA3_BUFFER_A; 
					for(j = 0; j < DATANUM_SIZES; j++)
					{
				#ifdef MOVE_BY_BLOCK
				        gunMIC_readbuf1[gunMIC_count1 * DATANUM_SIZES + j + gunMIC_RemainDataA] = *(gunMIC_trans2_ptr + j);
				#else		
						gunMIC_readbuf1[gunMIC_count1 * DATANUM_SIZES + j] = *(gunMIC_trans2_ptr + j);
				#endif		
					}
				}	
				
			
				gunMIC_count1++;
			
			}
			else
			{
				if(gunMIC_DMA_PCM_BUFFER == DMA3_BUFFER_A)
				{
					gunMIC_DMA_PCM_BUFFER = DMA3_BUFFER_B; 
					for(j = 0; j < DATANUM_SIZES; j++)
					{
			    #ifdef MOVE_BY_BLOCK			
			            gunMIC_readbuf2[gunMIC_count2 * DATANUM_SIZES + j + gunMIC_RemainDataB] = *(gunMIC_trans1_ptr + j);
			    #else
						gunMIC_readbuf2[gunMIC_count2 * DATANUM_SIZES + j] = *(gunMIC_trans1_ptr + j);
				#endif		
				 		
					}
				}		
				else
				{
					gunMIC_DMA_PCM_BUFFER = DMA3_BUFFER_A; 
					for(j = 0; j < DATANUM_SIZES; j++)
					{
				#ifdef MOVE_BY_BLOCK	
				        gunMIC_readbuf2[gunMIC_count2 * DATANUM_SIZES + j + gunMIC_RemainDataB] = *(gunMIC_trans2_ptr + j);
				#else		
						gunMIC_readbuf2[gunMIC_count2 * DATANUM_SIZES + j] = *(gunMIC_trans2_ptr + j);
				#endif		
					}
				}	
				
				gunMIC_count2++;
				
				
			} //if(gunMIC_AUDIO_PCM_BUFFER==AUDIO_PCM_BUFFER_A)
	
}

unsigned int MICGetBuffSizes(void)
{
	unsigned int DataSizes;
	
	if(gunMIC_AUDIO_PCM_BUFFER==AUDIO_PCM_BUFFER_A)
	{
		DataSizes = (gunMIC_count2 * DATANUM_SIZES * 4 + (gunMIC_RemainDataB*4)); //unit: bytes;
        DataSizes = DataSizes - (DataSizes % (DATANUM_BLOCK*4)) - (gunMIC_PCMDataOffsetPtr*4); 	
        
        if(DataSizes==0)
        {
        	gucMIC_BUffFull = 1;
        }
	}
	else
	{
		DataSizes = (gunMIC_count1 * DATANUM_SIZES * 4 + (gunMIC_RemainDataA*4)); //unit: bytes
        DataSizes = DataSizes - (DataSizes % (DATANUM_BLOCK*4)) - (gunMIC_PCMDataOffsetPtr*4); 	
        
        if(DataSizes==0)
        {
        	gucMIC_BUffFull = 1;
        }
	}
	
	
	MICAudioBuffChange();  
	
	if(gunMIC_AUDIO_PCM_BUFFER==AUDIO_PCM_BUFFER_A)
	{
#ifdef MOVE_BY_BLOCK
        DataSizes = (gunMIC_count2 * DATANUM_SIZES * 4 + (gunMIC_RemainDataB*4)); //unit: bytes;
        DataSizes = DataSizes - (DataSizes % (DATANUM_BLOCK*4)) - (gunMIC_PCMDataOffsetPtr*4); 			
	    return DataSizes;
#else
        return (gunMIC_count2 * DATANUM_SIZES * 4) ; //unit: bytes
#endif	    
	}
	else
	{
#ifdef MOVE_BY_BLOCK
        DataSizes = (gunMIC_count1 * DATANUM_SIZES * 4 + (gunMIC_RemainDataA*4)); //unit: bytes
        DataSizes = DataSizes - (DataSizes % (DATANUM_BLOCK*4)) - (gunMIC_PCMDataOffsetPtr*4); 							
		return DataSizes;
#else
        return (gunMIC_count1 * DATANUM_SIZES * 4) ; //unit: bytes
#endif		
	}
}

unsigned int MICGetDataPtr(unsigned int DataSizes) //DataSizes must be multiple of 4
{
	U32 gunMIC_PCMDataOffsetPtr_temp; 
	U32 ALLDataSizes;
	
	ALLDataSizes = MICGetBuffSizes();
    ALLDataSizes += gunMIC_PCMDataOffsetPtr*4; //bytes
  

	gunMIC_PCMDataOffsetPtr_temp = gunMIC_PCMDataOffsetPtr;
	gunMIC_PCMDataOffsetPtr += (DataSizes/4);
	
	if(gunMIC_PCMDataOffsetPtr > (ALLDataSizes/4))
	{			 
		gunMIC_PCMDataOffsetPtr -= (DataSizes/4);
		return MIC_DATA_NOT_ENOUGH; //allocated Data Sizes too bigger		
	}	
	
	
	if(gunMIC_AUDIO_PCM_BUFFER==AUDIO_PCM_BUFFER_A)
	{
		return &gunMIC_readbuf2[gunMIC_PCMDataOffsetPtr_temp];
	}
	else
	{
		return &gunMIC_readbuf1[gunMIC_PCMDataOffsetPtr_temp];
	}

}

⌨️ 快捷键说明

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