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

📄 adc_pwm_spi.c

📁 基于TMS320F2812的AMR+RS编解码+OFDM调制解调源程序。是stand alone运行版本
💻 C
📖 第 1 页 / 共 2 页
字号:
		//OFDM解调和语音解码		
		if(FrameSynFlag == 1 )                    	
		{			
			if(DemoduFlag == 1)
				asm(" ESTOP0");
			asm(" setc 	 ovm,sxm");    
    		asm(" spm	 1");  		
			FrameSyn = 264;//FindFrame(Voltage3) - 2;
			
			/*if(FrameSyn > 264)
			{
				FrameSyn = 264;	
			}*/
			asm(" setc 	 ovm,sxm");    
    		asm(" spm	 1");  	
    		    		
    		
			volt3flag = FrameSyn + 864;
			pADCModuData = Voltage3 + FrameSyn;
			FrameSynFlag = 0;
		}
		
		if(DemoduFlag == 1)								
		{
			if(FrameSynFlag == 1)
				asm(" ESTOP0");
			
	        asm(" setc 	 ovm,sxm");    
    		asm(" spm	 1");  	
			DecFlag = Receive(pADCModuData, DecoData);
			asm(" setc 	 ovm,sxm");    
    		asm(" spm	 1");  	
			DemoduFlag = 0;
			demodushift = 0;
			
			if(AdcFrame == 1)
			{
				pADCModuData += 864;
	    	}
	    	else if(AdcFrame == 2)
	    	{
	    		pADCModuData += 720;
	      	}
	    	else if(AdcFrame == 3)
	    	{
	    		pADCModuData += 720;
	    	}
  		}
 
  		while(DecFlag)
  		{
  			asm(" setc 	 ovm,sxm");    
    		asm(" spm	 1");  
  			Speech_Decode_Frame();	
  			asm(" setc 	 ovm,sxm");    
    		asm(" spm	 1");  
  			for(i=0; i<160; i++,pwmtestCount++)
     		{	
     			Voltage4[pwmtestCount] = ((synth[i]>>4) + 0x0800) & 0x0FFF;
     			if(pwmtestCount+1 == PwmCount)
     				asm(" ESTOP0");					
       		}
       		DecFlag--;
       		demodushift += 103;
       		if(pwmtestCount == 1600)
       			pwmtestCount = 0;
       		
		}
	}
}

interrupt void  adc_isr(void)//adc中断以16k速率进入
{   	
	//输入语音采样8k
   	if(ConversionCount)                                 
   	{
   		Voltage1[ADCInputVoiceNum] = (((AdcRegs.ADCRESULT0>>4) & 0x0FFF)\
   									 +((AdcRegs.ADCRESULT2>>4) & 0x0FFF)\
   									 +((AdcRegs.ADCRESULT4>>4) & 0x0FFF)\
   									 +((AdcRegs.ADCRESULT6>>4) & 0x0FFF)\
   									 +((AdcRegs.ADCRESULT8>>4) & 0x0FFF)\
   									 +((AdcRegs.ADCRESULT10>>4) & 0x0FFF)\
   									 +((AdcRegs.ADCRESULT12>>4) & 0x0FFF)\
   									 +((AdcRegs.ADCRESULT14>>4) & 0x0FFF))/8;
   								     
   		Voltage1[ADCInputVoiceNum] = (Voltage1[ADCInputVoiceNum]<<4) & 0xFFF0;
   		ADCInputVoiceNum++;
   		TestCnt++;
   		if(TestCnt == 740) 
			PWMOFDMStart = 1;
   		if(ADCInputVoiceNum == 160) 
		{
    		EncFlag = 1;
   		}	
    	else if(ADCInputVoiceNum == 320) 
		{
   		 	EncFlag = 1;
   		}
   		else if(ADCInputVoiceNum == 480)
   		{
   			ADCInputVoiceNum = 0;
   			EncFlag = 1;
   		}	
    }
    ConversionCount = !ConversionCount;
   
   //调制数据输入的采样16k  	
    if(OFDMSampleStart)
    {
   		Volt3_Temp = (((AdcRegs.ADCRESULT1>>4) & 0x0FFF)\
   					 +((AdcRegs.ADCRESULT3>>4) & 0x0FFF)\
   					 +((AdcRegs.ADCRESULT5>>4) & 0x0FFF)\
   					 +((AdcRegs.ADCRESULT7>>4) & 0x0FFF)\
   					 +((AdcRegs.ADCRESULT9>>4) & 0x0FFF)\
   					 +((AdcRegs.ADCRESULT11>>4) & 0x0FFF)\
   					 +((AdcRegs.ADCRESULT13>>4) & 0x0FFF)\
   					 +((AdcRegs.ADCRESULT15>>4) & 0x0FFF))/8; 

		Voltage3[ADCModuDataNum] = ((Volt3_Temp<<4) & 0xFFF0) - 0x82C0;
   		
   	/*	if(AdcFrame == 3 && ADCModuDataNum == volt3flag - 88 + j)
		{
			Voltage3[j] = Voltage3[ADCModuDataNum];
			j++;
			if(j == 88) 
				j=0;				
		}	*/		
		
   		ADCModuDataNum++;
   		
   		if (ADCModuDataNum == 1648)
   			PwmoutStart = 1;//start outputing voice
   			
   		if(AdcFrame==4 && ADCModuDataNum == 480)
   		{
   			FrameSynFlag = 1;
   			AdcFrame = 0;  
   		}
   		else if(AdcFrame==0 && ADCModuDataNum == volt3flag)
   		{
   			DemoduFlag = 1; 
   			AdcFrame++; //AdcFrame = 1
   			volt3flag += 720;
   		}
   		else if(AdcFrame==1 && ADCModuDataNum == volt3flag)
   		{   			
   			DemoduFlag = 1;
   			AdcFrame++;   //AdcFrame = 2
   			volt3flag += 720;
   			   			
   		}	
   		else if(AdcFrame==2 && ADCModuDataNum == volt3flag)
   		{
  			DemoduFlag = 1; 
   			AdcFrame++;  //AdcFrame = 3	
   			volt3flag += 720;
   		}
		else if(AdcFrame==3 && ADCModuDataNum == volt3flag)
   		{
  			DemoduFlag = 1; 
   			AdcFrame++; //AdcFrame = 4   						
   			ADCModuDataNum = 88;	
   		}  	
   		
   	}
   	
    // Reinitialize for next ADC sequence
    AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;         // Reset SEQ1
    AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;		// Clear INT SEQ1 bit
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;   // Acknowledge interrupt to PIE
    return;
}


interrupt void eva_cmp3_isr(void)     //语音输出
{
	if(PwmoutStart)
	{
		if( Div2Flag)
		{
			EvaRegs.CMPR3 = Voltage4[PwmCount];
			PwmCount++;
			if(pwmtestCount == PwmCount)
     			asm(" ESTOP0");
			if(PwmCount == 1600)
  	   			PwmCount = 0;
  	   	
		}
		Div2Flag = !Div2Flag;
	}	
	
	
	EvaRegs.EVAIMRA.all = 0x0008;
    EvaRegs.EVAIFRA.all = 0x0008;	    
	// Acknowledge interrupt to recieve more interrupts from PIE group 2
	PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;
	return;

}


interrupt void EVB_T3PINT_ISR(void)
{
	if(PWMOFDMStart)
	{
		//CS low
		DAC_CS = 0;
		asm(" nop");
		asm(" nop");
		asm(" nop");
		asm(" nop");
		asm(" nop");
		asm(" nop");
		asm(" nop");
		asm(" nop");
		SpiaRegs.SPIDAT = ((Voltage2[ModuDataOutNum] + 0x8000)>>1)&0x7FFF;
   		while(!SpiaRegs.SPISTS.bit.INT_FLAG);	//wait until transmit finished
   		SpiRxTemp = SpiaRegs.SPIRXBUF;//clear INT_FLAG
		asm(" nop");
		asm(" nop");
		asm(" nop");
		asm(" nop");
		asm(" nop");
		asm(" nop");
		asm(" nop");
		asm(" nop");
		//CS high
   		DAC_CS = 1;
   		asm(" nop");
		asm(" nop");
		asm(" nop");
		asm(" nop");
		//LD low
   		DAC_LD = 0;
   		asm(" nop");
		asm(" nop");
		asm(" nop");
		asm(" nop");
		asm(" nop");
		asm(" nop");
		asm(" nop");
		asm(" nop");
		//LD high
		DAC_LD = 1;
   		
   		ModuDataOutNum++;
   		SampleDelay++;
   		if(SampleDelay == 9604)
    		OFDMSampleStart = 1; //OFDM sample start
    	if( ModuDataOutNum == 3200 )
    	{
    		ModuDataOutNum = 0;
   		}   	
   		
   	}	

   	
	EvbRegs.EVBIMRA.all = 0x0080;
   	EvbRegs.EVBIFRA.all = 0x0080;
   	// Acknowledge interrupt to recieve more interrupts from PIE group 4
	PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
	return;
}


/*
interrupt void evb_cmp4_isr(void)    //OFDM调制波形输出
{
	if(PWMOFDMStart)
	{
	
		//EvbRegs.CMPR4 = ((Voltage2[ModuDataOutNum]>>3)+0x1000) & 0x1FFF;
		EvbRegs.CMPR4 = ((Voltage2[ModuDataOutNum]>>2)+0x2000) & 0x3FFF;
		
    	ModuDataOutNum++;
    	SampleDelay++;
    	if(SampleDelay == 9600)
    		OFDMSampleStart = 1; //OFDM sample start
    	if( ModuDataOutNum == 3200 )
    	{
    		ModuDataOutNum = 0;
   		}   	
   	}
   	
    EvbRegs.EVBIMRA.all = 0x0002;  
    EvbRegs.EVBIFRA.all = 0x0002;	
	// Acknowledge interrupt to recieve more interrupts from PIE group 2
	PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;   	
	return;
}
*/

⌨️ 快捷键说明

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