?? adc_pwm_no_pass_ch_2.c
字號:
#include "DSP28_Device.h"
#include "RS.H"
#include "setting.h"
#include "newamr3.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; //音頻輸出計數
Uint16 pwmtestCount = 0;
Uint16 EncNum = 0;
Uint16 ModuDataOutNum = 0; //調制數據輸出計數
Uint16 ADCInputVoiceNum = 0; //音頻輸入采樣計數
Uint16 ADCModuDataNum = 88; //調制數據采樣輸入計數
Uint16 Voltage1[480]; //音頻輸入采樣
extern int Voltage2[3200]; //調制后的數據發射
//extern int Voltage3[2000]; //調制后的數據接收
int Voltage4[320]; //音頻輸出
int *pModuData = Voltage2;
int *pADCModuData = Voltage2; //指示待調制數據
int ModuFrame;
//int ModuPreFrame = 5;
//int DemoduFrame; //解調的幀數
extern int demodushift;
Uint16 volt2flag; //voltage2 buffer pointer
int16 OFDM_frame;
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;
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;
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;
// Configure ADC
AdcRegs.ADCMAXCONV.all = 0x0000; // 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)
EvaRegs.GPTCONA.bit.T2TOADC = 2; // Enable EVASOC in EVA
EvaRegs.T2CNT = 0x0000;
EvaRegs.T2PR =0x493E; // SOC 采樣頻率= 8K
EvaRegs.T2CON.all = 0x1040; // Enable timer 2 compare (upcount mode)
EvaRegs.T1PR = 0x249F; // PWM 輸出語音頻率= HSPCLK/9375=16KHz
EvaRegs.T1CNT = 0x0C35;
EvaRegs.CMPR1 = 0x0000; // 調制后的數據發送
EvaRegs.T1CON.all = 0x1042; // Enable timer 1 compare (upcount mode)
/*
EvbRegs.T3PR = 0x249F; // PWM 輸出OFDM信號頻率= HSPCLK/9375=16KHz
EvbRegs.T3CNT = 0x186A;
EvbRegs.CMPR4 = 0x0000; // 解碼后的數據進行D/A
EvbRegs.T3CON.all = 0x1042;
*/
// 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;
*/
asm(" nop");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" setc ovm,sxm");
asm(" spm 1");
initiate(); //編碼初始化
Speech_Decode_Frame_init();
Init_RS();
//初始化參數
PWMOFDMStart = 0;
EncFlag = 0;
EncNum = 0;
ModuFrame = -1;
pModuData = Voltage2;
OFDM_frame = 0;
volt2flag = 3200;
demodushift = 0;
TestCnt = 0;
/*Main function*/
while (1)
{
//語音編碼和調制
if(EncFlag == 1) //EncFlag為0表示接收數據不夠編碼,一直等待
{
for(i=0; i<160; i++)
{
buffer3[i] = Voltage1[160*EncNum + i] - 0x8D60;
// buffer3[i] -= 0x08D6;
}
if(++EncNum == 3)
EncNum = 0;
EncFlag = 0;
codamr(); //語音編碼
for(i=0; i<103; i++,j++)
{
buffer3[i] = CodeAmr[j];
if(j == 3090)
{
j = 0;
}
}
//跟蹤voltage2的OFDM數據塊存儲位置
ModuFrame = RS_OFDM_Mod();
if(ModuFrame == 1)
{
pModuData = Voltage2 + 1040;
//FrameSyn = FindFrame(Voltage2);
pADCModuData = Voltage2 + 176;
DecFlag = Receive(pADCModuData, DecoData);
demodushift = 0;
}
else if( ModuFrame == 2 )
{
pModuData = Voltage2 + 1760;
pADCModuData += 864;
DecFlag = Receive(pADCModuData, DecoData);
demodushift = 0;
}
else if( ModuFrame == 3)
{
pModuData = Voltage2 + 2480;
pADCModuData += 720;
DecFlag = Receive(pADCModuData, DecoData);
demodushift = 0;
}
else if(ModuFrame == 4)
{
pModuData = Voltage2;
pADCModuData += 720;
DecFlag = Receive(pADCModuData, DecoData);
demodushift = 0;
}
if(DecFlag)
{
Speech_Decode_Frame();
for(i=0; i<160; i++,pwmtestCount++)
{
Voltage4[pwmtestCount] = ((synth[i]>>4) + 0x0800) & 0x0FFF;
}
DecFlag--;
demodushift += 103;
if(pwmtestCount == 320)
pwmtestCount = 0;
}
}
}
}
interrupt void adc_isr(void)//adc中斷以16k速率進入
{
//輸入語音采樣8k
// if(ConversionCount)
// {
Voltage1[ADCInputVoiceNum] = AdcRegs.ADCRESULT0;
ADCInputVoiceNum++;
TestCnt++;
if(TestCnt == 640)
PwmoutStart = 1;
if(ADCInputVoiceNum == 160)
{
EncFlag = 1;
}
else if(ADCInputVoiceNum == 320)
{
EncFlag = 1;
}
else if(ADCInputVoiceNum == 480)
{
ADCInputVoiceNum = 0;
EncFlag = 1;
}
// }
// ConversionCount = !ConversionCount;
// 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(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) //調制后數據輸出
{
if(PWMOFDMStart)
{
Voltage2[ModuDataOutNum] = ((Voltage2[ModuDataOutNum]>>4)+0x0800) & 0x0FFF;
EvbRegs.CMPR4 = Voltage2[ModuDataOutNum];
ModuDataOutNum++;
SampleDelay++;
if(SampleDelay == 9600)
OFDMSampleStart = 1; //OFDM sample start
if( ModuDataOutNum == volt2flag )
{
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 + -