?? adc_pwm_amr_enc_dec_1.c
字號:
#include "DSP28_Device.h"
#include "RS.H"
#include "setting.h"
#include "new1.h"
interrupt void eva_cmp1_isr(void);
interrupt void evb_cmp4_isr(void);
interrupt void adc_isr(void);
extern int16 buffer3[];
extern int16 buffer4[];
extern int16 synth[];
//WordType FrameTx = TotalFrame;
//WordType FrameRx = TotalFrame;
//WordType RxFirstFrame = 1;
WordType AdcFrame = 4;
//WordType PwmFrame = 1;
Uint16 i, j = 0;
Uint16 ConversionCount = 1;
Uint16 EncFlag = 0;
Uint16 DecFlag = 0;
//Uint16 PwmFlag = 1;
//Uint16 PwmConv = 0;
Uint16 DemoduFlag = 0;
Uint16 PWMOFDMStart = 0;
Uint16 PwmoutStart = 0;
Uint16 PwmCount = 0; //音頻輸出計數(shù)
Uint16 pwmtestCount = 0;
Uint16 EncNum = 0;
Uint16 ModuDataOutNum = 0; //調(diào)制數(shù)據(jù)輸出計數(shù)
Uint16 ADCInputVoiceNum = 0; //音頻輸入采樣計數(shù)
Uint16 ADCModuDataNum = 88; //調(diào)制數(shù)據(jù)采樣輸入計數(shù)
Uint16 Voltage1[480]; //音頻輸入采樣
extern int Voltage2[3200]; //調(diào)制后的數(shù)據(jù)發(fā)射
//extern int Voltage3[2200]; //調(diào)制后的數(shù)據(jù)接收
int Voltage4[320]; //音頻輸出
int *pModuData = Voltage2;
//int *pADCModuData = Voltage3; //指示待調(diào)制數(shù)據(jù)
int ModuFrame;
//int ModuPreFrame = 5;
//int DemoduFrame; //解調(diào)的幀數(shù)
extern int demodushift;
Uint16 volt2flag; //voltage2 buffer pointer
int16 OFDM_frame;
//extern int DataBuffer[];
Uint16 FrameSynFlag = 0; // OFDM demodulate frame synch starting flag
Uint16 FrameSyn;
Uint16 volt3flag;
int *DecoData = buffer4;
Uint16 OFDMSampleStart = 0;
Uint16 SampleDelay = 0;
Uint16 TestCnt = 0;
Uint16 Div2Flag = 1;
Uint16 BitConv = 1;
void main(void)
{
DINT;
InitSysCtrl();
InitFlash();
EINT;
EALLOW;
SysCtrlRegs.HISPCP.all = 0x0000; // HSPCLK = SYSCLKOUT = 150MHz
EDIS;
EALLOW;
GpioMuxRegs.GPAMUX.all = 0x00FF;
GpioMuxRegs.GPBMUX.all = 0x00FF;
EDIS;
DINT;
IER = 0x0000;
IFR = 0x0000;
InitPieCtrl();
InitPieVectTable();
InitAdc();
AdcRegs.ADCTRL3.bit.ADCCLKPS = 0x0003; //ADC clock =150/6=25M
AdcRegs.ADCTRL1.bit.CPS = 0x0000;
// AdcRegs.ADCTRL1.bit.ACQ_PS = 0x0009; // SAM/HOLD = 400/10 = 40KHz
EALLOW;
PieVectTable.ADCINT = &adc_isr;
PieVectTable.CMP1INT = &eva_cmp1_isr;
PieVectTable.CMP4INT = &evb_cmp4_isr;
EDIS;
// Configure ADC
AdcRegs.ADCMAXCONV.all = 0x0001; // Setup 2 conv's on SEQ1
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0000; // Setup ADCINA0 as 1st SEQ1 conv.
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x0008; // Setup ADCINB0 as 2nd SEQ1 conv.
AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1 = 1; // Enable EVASOC to start SEQ1
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // Enable SEQ1 interrupt (every EOS)
// Configure EVA
EvaRegs.EVAIMRA.all = 0x0002;
EvaRegs.EVAIFRA.all = 0x0002;
EvaRegs.ACTRA.all = 0x0666;
EvaRegs.DBTCONA.all = 0x0000; // Disable Dead Band Unit
EvaRegs.COMCONA.all = 0xA600;
// Configure EVB
EvbRegs.EVBIMRA.all = 0x0002;
EvbRegs.EVBIFRA.all = 0x0002;
EvbRegs.ACTRB.all = 0x0666;
EvbRegs.DBTCONB.all = 0x0000; // Disable Dead Band Unit
EvbRegs.COMCONB.all = 0xA600;
EvaRegs.GPTCONA.bit.T2TOADC = 2; // Enable EVASOC in EVA
EvaRegs.T2CNT = 0x0000;
EvaRegs.T2PR =0x249F; // SOC 采樣頻率= HSPCLK/9375 = 16K
EvaRegs.T2CON.all = 0x1040; // Enable timer 2 compare (upcount mode)
EvaRegs.T1PR = 0x249F; // PWM 輸出語音頻率= HSPCLK/9375=16KHz
EvaRegs.T1CNT = 0x0C35;
EvaRegs.CMPR1 = 0x0000; // 調(diào)制后的數(shù)據(jù)發(fā)送
EvaRegs.T1CON.all = 0x1042; // Enable timer 1 compare (upcount mode)
EvbRegs.T3PR = 0x249F; // PWM 輸出OFDM信號頻率= HSPCLK/9375=16KHz
EvbRegs.T3CNT = 0x186A;
EvbRegs.CMPR4 = 0x0000; // 解碼后的數(shù)據(jù)進行D/A
EvbRegs.T3CON.all = 0x1042;
PieCtrlRegs.PIEIFR1.all = 0;
PieCtrlRegs.PIEIFR2.all = 0;
PieCtrlRegs.PIEIFR4.all = 0;
PieCtrlRegs.PIEIER1.bit.INTx6 = 1;//AD
PieCtrlRegs.PIEIER2.bit.INTx1 = 1;//compare1 interrupt voice output
PieCtrlRegs.PIEIER4.bit.INTx1 = 1;//compare4 interrupt OFDM signal output
IER |= (M_INT1 | M_INT2 | M_INT4);
EINT;
ERTM;
asm(" nop");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" setc ovm,sxm");
asm(" spm 1");
initiate(); //編碼初始化
Speech_Decode_Frame_init();
Init_RS();
/*the variable used
for judging first OFDM frame in Transmit.c */
OFDM_frame = 0;
volt2flag = 3200;
demodushift = 0;
TestCnt = 0;
// for(i=0;i<88;i++)
// Voltage3[i] = 0x0FFF;
//初始化參數(shù)
PWMOFDMStart = 0;
EncFlag = 0;
EncNum = 0;
ModuFrame = -1;
// pModuData = Voltage2;
/*Main function*/
while (1)
{
//語音編碼和調(diào)制
if(EncFlag == 1) //EncFlag為0表示接收數(shù)據(jù)不夠編碼,一直等待
{
EncFlag = 0;
for(i=0; i<160; i++)
{
buffer3[i] = Voltage1[160*EncNum + i] - 0x8D60;
// buffer3[i] -= 0x08D6;
}
if(++EncNum == 3)
EncNum = 0;
codamr(); //語音編碼
for(i=0; i<103; i++,j++)
{
buffer3[i] = AmrCode[j];
if(j == 5150)
{
j = 0;
}
}
demodushift = 0;
for(i=0;i<103;i++)
buffer4[i] = buffer3[i];
Speech_Decode_Frame();
for(i=0; i<160; i++,pwmtestCount++)
{
Voltage4[pwmtestCount] = ((synth[i]>>4) + 0x0800) & 0x0FFF;
}
if(pwmtestCount == 320)
pwmtestCount = 0;
/* for(i=0; i<103; i++)
{
buffer3[i] = BitConv;
BitConv = !BitConv;
}*/
//跟蹤voltage2的OFDM數(shù)據(jù)塊存儲位置
/* ModuFrame = RS_OFDM_Mod();
if ( PWMOFDMStart == 0 )
{
volt2flag = 3200;
if(ModuFrame == 1)
pModuData = Voltage2 + 1040;
}
else if( PWMOFDMStart == 1 )
{
if(ModuFrame == 1)
pModuData = Voltage2 + 1040;
else if(ModuFrame == 2 || ModuFrame == 3)
pModuData += 720;
else if(ModuFrame == 4)
pModuData = Voltage2;
}*/
}
/* //OFDM解調(diào)和語音解碼
if(FrameSynFlag == 1 )
{
if(DemoduFlag == 1)
asm(" ESTOP0");
//FrameSyn = FindFrame(Voltage3);
volt3flag = 264 + 864;
pADCModuData = Voltage3 + 264;
FrameSynFlag = 0;
}
if(DemoduFlag == 1)
{
if(FrameSynFlag == 1)
asm(" ESTOP0");
DecFlag = Receive(pADCModuData, DecoData);
DemoduFlag = 0;
demodushift = 0;
if(AdcFrame == 1)
{
//Receive(pADCModuData, DecoData);
pADCModuData += 864;
//DecFlag = 2;
//demodushift = 0;
}
else if(AdcFrame == 2)
{
//Receive(pADCModuData, DecoData);
pADCModuData = Voltage3 + 88;
//DecFlag = 3;
//demodushift = 0;
}
else if(AdcFrame == 3)
{
//Receive(pADCModuData, DecoData);
pADCModuData = Voltage3 + 88 + 720;
//DecFlag = 2;
// demodushift = 0;
}
else if(AdcFrame == 4)
{
//Receive(pADCModuData, DecoData);
//DecFlag = 3;
// demodushift = 0;
}
}
while(DecFlag)
{
Speech_Decode_Frame();
for(i=0; i<160; i++,pwmtestCount++)
{
// synth[i] = (synth[i]/8) + 0x0FFF;
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;
ADCInputVoiceNum++;
TestCnt++;
if(TestCnt == 240) PwmoutStart = 1;
//PWMOFDMStart = 1;
if(ADCInputVoiceNum == 160)
{
EncFlag = 1;
}
else if(ADCInputVoiceNum == 320)
{
//ADCInputVoiceNum = 0;
EncFlag = 1;
}
else if(ADCInputVoiceNum == 480)
{
ADCInputVoiceNum = 0;
EncFlag = 1;
}
}
ConversionCount = !ConversionCount;
/* //調(diào)制數(shù)據(jù)輸入的采樣16k
if(OFDMSampleStart)
{
Voltage3[ADCModuDataNum] = AdcRegs.ADCRESULT1;
Voltage3[ADCModuDataNum] = (Voltage3[ADCModuDataNum]>>4) & 0x0FFF;
Voltage3[ADCModuDataNum] -= 0x0920;
if(AdcFrame == 3 && ADCModuDataNum == 88+1352+j)
{
Voltage3[j] = Voltage3[j+1352+88];
j++;
if(j == 88)
j=0;
}
ADCModuDataNum++;
if (ADCModuDataNum == 1608)
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)
{
ADCModuDataNum = 88;
DemoduFlag = 1;
AdcFrame++; //AdcFrame = 2
}
else if(AdcFrame==2 && ADCModuDataNum == 88+720)
{
DemoduFlag = 1;
AdcFrame++; //AdcFrame = 3
}
else if(AdcFrame==3 && ADCModuDataNum == 88+1440)
{
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_cmp1_isr(void) //音頻輸出
{
if(PwmoutStart)
{
if( Div2Flag)
{
EvaRegs.CMPR1 = Voltage4[PwmCount];
PwmCount++;
if(PwmCount == 320)
PwmCount = 0;
// if(PwmCount == pwmtestCount)
// asm(" ESTOP0");
}
if(Div2Flag == 1)
Div2Flag = 0;
else if(Div2Flag == 0)
Div2Flag = 1;
else
asm(" ESTOP0");
}
EvaRegs.EVAIMRA.all = 0x0002;
EvaRegs.EVAIFRA.all = 0x0002;
// Acknowledge interrupt to recieve more interrupts from PIE group 2
PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;
return;
}
interrupt void evb_cmp4_isr(void) //調(diào)制后數(shù)據(jù)輸出
{
/* if(PWMOFDMStart)
{
Voltage2[ModuDataOutNum] = ((Voltage2[ModuDataOutNum]>>3)+0x1000) & 0x1FFF;
EvbRegs.CMPR4 = Voltage2[ModuDataOutNum];
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 + -