?? adc_pwm_spi_done.c
字號:
#include "DSP28_Device.h"
#include "RS.H"
#include "setting.h"
interrupt void eva_cmp3_isr(void);
interrupt void EVB_T3PINT_ISR(void);
interrupt void EVA_T1PINT_ISR(void);
interrupt void adc_isr(void);
extern void DSP28x_usDelay(unsigned long Count);
extern int16 buffer3[];
extern int16 buffer4[];
extern int16 synth[];
#define DAC_CLR GpioDataRegs.GPBDAT.bit.GPIOB8
#define DAC_LD GpioDataRegs.GPBDAT.bit.GPIOB9
#define DAC_CS GpioDataRegs.GPBDAT.bit.GPIOB10
WordType AdcFrame;
Uint16 i, j;
Uint16 ConversionCount;
Uint16 EncFlag;
Uint16 DecFlag;
Uint16 DemoduFlag;
Uint16 PWMOFDMStart;
Uint16 PwmoutStart;
Uint16 PwmCount; //音頻輸出計數
Uint16 pwmtestCount;
Uint16 EncNum;
Uint16 ModuDataOutNum; //調制數據輸出計數
Uint16 ADCInputVoiceNum; //音頻輸入采樣計數
Uint16 ADCModuDataNum; //調制數據采樣輸入計數
Uint16 Voltage1[480]; //音頻輸入采樣
extern int Voltage2[3200]; //調制后的數據發射
int Voltage3[3500]; //調制后的數據接收
int Voltage4[1600]; //音頻輸出
int *pModuData;
int *pADCModuData; //指示待調制數據
int ModuFrame;
extern int demodushift;
int16 OFDM_frame;
Uint16 FrameSynFlag; // OFDM demodulate frame synch starting flag
Uint16 FrameSyn;
Uint16 volt3flag;
int *DecoData;
Uint16 OFDMSampleStart;
Uint16 SampleDelay;
Uint16 TestCnt;
Uint16 Div2Flag;
Uint16 BitConv;
Uint16 SpiRxTemp;
Uint16 Volt3_Temp;
Uint16 StartProcessFlag;
/*variables in TxRx.c*/
extern WordType TxSymbolMark;
extern WordType TxBitMark;
extern WordType RxPosMark;
extern WordType FrameTx;
extern WordType FrameRx;
extern unsigned long int Seed;
extern short OFDMFrameNum;
/*
Uint16 SynErrCntDown = 0;
Uint16 SynErrCntUp = 0;
Uint16 MaxFrameSyn = 0;
*/
extern Uint16 secureRamFuncs_loadstart;
extern Uint16 secureRamFuncs_loadend;
extern Uint16 secureRamFuncs_runstart;
void main(void)
{
DINT;
InitSysCtrl();
EALLOW;
GpioMuxRegs.GPAMUX.all = 0x00FF;
GpioMuxRegs.GPBMUX.all = 0x00FF;
GpioMuxRegs.GPBDIR.all = 0x0700;
GpioMuxRegs.GPFMUX.all = 0x0005;
GpioMuxRegs.GPEQUAL.all = 0x0032;
EDIS;
IER = 0x0000;
IFR = 0x0000;
InitPieCtrl();
InitPieVectTable();
/* */
// Section secureRamFuncs contains user defined code that runs from CSM secured RAM
memcpy( &secureRamFuncs_runstart,
&secureRamFuncs_loadstart,
&secureRamFuncs_loadend - &secureRamFuncs_loadstart);
/*** Initialize the FLASH ***/
InitFlash(); // Initialize the FLASH (FILE: SysCtrl.c)
InitAdc();
InitSpi();
AdcRegs.ADCTRL3.bit.ADCCLKPS = 0x0003; //ADC clock =150/6=25M
AdcRegs.ADCTRL1.bit.CPS = 0x0000;
AdcRegs.ADCTRL1.bit.ACQ_PS = 0x0001; //
AdcRegs.ADCTRL1.bit.SEQ_CASC = 0x0001; //single 16-state sequencer
EALLOW;
PieVectTable.ADCINT = &adc_isr;
PieVectTable.CMP3INT = &eva_cmp3_isr;
PieVectTable.T1PINT = &EVA_T1PINT_ISR;
PieVectTable.T3PINT = &EVB_T3PINT_ISR;
EDIS;
// Configure ADC
AdcRegs.ADCMAXCONV.all = 0x0008; // Setup 16 conversion on SEQ
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0000; // Setup ADCINA0 as 1-8 SEQ conv.
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x0003;
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x0000;
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x0000;
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x0000;
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x0000;
AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x0000;
AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x0000;
AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 0x0000; // Setup ADCINA3 as 9-16 SEQ 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 = 0x0088;
EvaRegs.EVAIFRA.all = 0x0088;
EvaRegs.ACTRA.all = 0x0800;
EvaRegs.DBTCONA.all = 0x0000; // Disable Dead Band Unit
EvaRegs.COMCONA.all = 0xA600;
// Configure EVB
EvbRegs.EVBIMRA.all = 0x0080;
EvbRegs.EVBIFRA.all = 0x0080;
EvbRegs.ACTRB.all = 0x0000;
EvbRegs.DBTCONB.all = 0x0000; // Disable Dead Band Unit
EvbRegs.COMCONB.all = 0x0000;
//ADC interrupt period configuration
EvaRegs.GPTCONA.bit.T2TOADC = 2; // Enable EVASOC in EVA
EvaRegs.T2CNT = 0x186A;
EvaRegs.T2PR =0x249F; // SOC 采樣頻率= HSPCLK/9375 = 16K
EvaRegs.T2CON.all = 0x1040; // Enable timer 2 compare (upcount mode)
//PWM6 and SPI interrupt period configuration
EvaRegs.T1PR = 0x249F; // PWM 輸出語音頻率= HSPCLK/9375=16KHz
EvaRegs.T1CNT = 0x0001;
EvaRegs.CMPR3 = 0x0000; // 調制后的數據發送
EvaRegs.T1CON.all = 0x1042; // Enable timer 1 compare (upcount mode)
//OFDM wave sample delay, Period = 8us
EvbRegs.T3PR = 0x04B0;
EvbRegs.T3CNT = 0x0000;
EvbRegs.T3CON.all = 0x1040;
//Enable XINT1 interrupt, on falling edge
XIntruptRegs.XINT1CR.all = 0x0001;
PieCtrlRegs.PIEIFR1.all = 0;
PieCtrlRegs.PIEIFR2.all = 0;
PieCtrlRegs.PIEIFR4.all = 0;
PieCtrlRegs.PIEIER1.bit.INTx4 = 1;//XINT1
IER |= (M_INT1 | M_INT2 | M_INT4);
EINT;
ERTM;
asm(" nop");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" setc ovm,sxm");
asm(" spm 1");
load();
initiate(); //編碼初始化
Speech_Decode_Frame_init();
Init_RS();
//初始化參數
/*the variable used
for judging first OFDM frame in Transmit.c */
OFDM_frame = 0;
demodushift = 0;
/*initialize variables used in TxRx.c*/
TxSymbolMark = 0;
TxBitMark = 0;
RxPosMark = 0;
FrameTx = TotalFrame;
FrameRx = TotalFrame;
Seed = 101;
OFDMFrameNum = 2;
/*initialize variables in main function*/
TestCnt = 0;
FrameSynFlag = 0;
for(i=0;i<88;i++)
Voltage3[i] = 0x2FFF;
AdcFrame = 4;
ConversionCount = 1;
EncFlag = 0;
DecFlag = 0;
DemoduFlag = 0;
PWMOFDMStart = 0;
PwmoutStart = 0;
PwmCount = 0;
pwmtestCount = 0;
EncNum = 0;
ModuDataOutNum = 0;
ADCInputVoiceNum = 0;
ADCModuDataNum = 88;
pModuData = Voltage2;
pADCModuData = Voltage3;
DecoData = buffer4;
ModuFrame = -1;
OFDMSampleStart = 0;
SampleDelay = 0;
TestCnt = 0;
Div2Flag = 1;
BitConv = 1;
StartProcessFlag = 0;
while(1)
{
while(StartProcessFlag)
{
//語音編碼和調制
if(EncFlag == 1) //EncFlag為0表示接收數據不夠編碼,一直等待
{
EncFlag = 0;
for(i=0; i<160; i++)
{
buffer3[i] = Voltage1[160*EncNum + i] - 0x89E0;
}
if(++EncNum == 3) //30幀
EncNum = 0;
asm(" setc ovm,sxm");
asm(" spm 1");
codamr(); //語音編碼
asm(" setc ovm,sxm");
asm(" spm 1");
//跟蹤voltage2的OFDM數據塊存儲位置
ModuFrame = RS_OFDM_Mod();
asm(" setc ovm,sxm");
asm(" spm 1");
if(ModuFrame == 1)
pModuData = Voltage2 + 1040;
else if(ModuFrame == 2 || ModuFrame == 3)
pModuData += 720;
else if(ModuFrame == 4)
pModuData = Voltage2;
}
//OFDM解調和語音解碼
if(FrameSynFlag == 1 )
{
if(DemoduFlag == 1)
asm(" ESTOP0");
asm(" setc ovm,sxm");
asm(" spm 1");
FrameSyn = FindFrame(Voltage3);//264;
/*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.ADCRESULT3>>4) & 0x0FFF)\
+((AdcRegs.ADCRESULT4>>4) & 0x0FFF)\
+((AdcRegs.ADCRESULT5>>4) & 0x0FFF)\
+((AdcRegs.ADCRESULT6>>4) & 0x0FFF)\
+((AdcRegs.ADCRESULT7>>4) & 0x0FFF)\
+((AdcRegs.ADCRESULT8>>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.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 = 0x0088;
EvaRegs.EVAIFRA.all = 0x0088;
// Acknowledge interrupt to recieve more interrupts from PIE group 2
PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;
return;
}
interrupt void EVA_T1PINT_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] + 0x4CC0;/*BaseSet*/
Voltage2[ModuDataOutNum]/2 + 0x4CC0;/*HandSet*/
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 == 9600+3)
OFDMSampleStart = 1; //OFDM sample start*/
if( ModuDataOutNum == 3200 )
{
ModuDataOutNum = 0;
}
}
EvaRegs.EVAIMRA.all = 0x0088;
EvaRegs.EVAIFRA.all = 0x0088;
// Acknowledge interrupt to recieve more interrupts from PIE group 4
PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;
return;
}
interrupt void EVB_T3PINT_ISR(void) //OFDM波形采樣開始
{
if(PWMOFDMStart)
{
SampleDelay++;
if(SampleDelay == 50000+23)/*+23 for HandSet
-6 for BaseSet*/
{
OFDMSampleStart = 1;
EvbRegs.EVBIMRA.all = 0x0000;
}
}
EvbRegs.EVBIFRA.all = 0x0080;
// Acknowledge interrupt to recieve more interrupts from PIE group 4
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
return;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -