📄 directchannel.c
字号:
#include "DSP28_Device.h"
#include "RS.H"
#include "setting.h"
//#include "fir.h"
//#include "filter.h"
//#include "newamr3.h"
interrupt void eva_cmp3_isr(void);
//interrupt void evb_cmp4_isr(void);
//interrupt void EVB_T3PINT_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
//#define FIR_ORDER 50
//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 = 0;
Uint16 SpiRxTemp;
//FIR16 lpf = FIR16_DEFAULTS;
//#pragma DATA_SECTION(dbuffer,"firldb");
//long dbuffer[(FIR_ORDER+2)/2];
//const long coeff[(FIR_ORDER+2)/2]= FIR16_LPF50_3400;
void main(void)
{
DINT;
InitSysCtrl();
InitFlash();
EINT;
EALLOW;
SysCtrlRegs.HISPCP.all = 0x0000; // HSPCLK = SYSCLKOUT = 150MHz
SysCtrlRegs.LOSPCP.all = 0x0001; //LSPCLK=75MHz
EDIS;
EALLOW;
GpioMuxRegs.GPAMUX.all = 0x00FF;
GpioMuxRegs.GPBMUX.all = 0x00FF;
GpioMuxRegs.GPBDIR.all = 0x0700;
GpioMuxRegs.GPFMUX.all = 0x0005;
EDIS;
DINT;
IER = 0x0000;
IFR = 0x0000;
DAC_CLR = 1;
DAC_CS = 1;
DAC_LD = 1;
InitPieCtrl();
InitPieVectTable();
InitAdc();
InitSpi();
/* while(1)
{
SpiaRegs.SPIDAT = 0xAAA0;
while(!SpiaRegs.SPISTS.bit.INT_FLAG)
{
asm(" nop");
}
SpiRxTemp = SpiaRegs.SPIRXBUF;//clear INT_FLAG
asm(" nop");
asm(" nop");
asm(" nop");
DELAY_US(2000L);
}*/
AdcRegs.ADCTRL3.bit.ADCCLKPS = 0x0003; //ADC clock =150/6=25M
AdcRegs.ADCTRL1.bit.CPS = 0x0000; //25M/1
AdcRegs.ADCTRL1.bit.ACQ_PS = 0x0004; // S/H TIME = 6/25M = 240ns
EALLOW;
PieVectTable.ADCINT = &adc_isr;
PieVectTable.CMP3INT = &eva_cmp3_isr;
// PieVectTable.CMP4INT = &evb_cmp4_isr;
// PieVectTable.T3PINT = &EVB_T3PINT_ISR;
EDIS;
PieCtrlRegs.PIEIER1.bit.INTx6 = 1;//AD
PieCtrlRegs.PIEIER2.bit.INTx3 = 1;//compare3 interrupt voice output
// PieCtrlRegs.PIEIER4.bit.INTx1 = 1;//compare4 interrupt OFDM signal output
// PieCtrlRegs.PIEIER4.bit.INTx4 = 1;//T3 period interrupt
IER |= (M_INT1 | M_INT2 | M_INT4);
EINT;
ERTM;
// Configure ADC
AdcRegs.ADCMAXCONV.all = 0x0007; // Setup 2 conv's on SEQ1
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0000; // Setup ADCINA0 as 1st SEQ1 conv.
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x0000; // Setup ADCINB0 as 2nd SEQ1 conv.
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.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 = 0x1000;
EvaRegs.T2PR =0x493E; // SOC 采样频率= 8K
EvaRegs.T2CON.all = 0x1040; // Enable timer 2 compare (upcount mode)
EvaRegs.T1PR = 0x249F;//0x186A; // PWM 输出语音频率= HSPCLK/9375=16KHz
EvaRegs.T1CNT = 0x0800;
EvaRegs.CMPR3 = 0x0000; // 调制后的数据发送
EvaRegs.T1CON.all = 0x1042; // Enable timer 1 compare (upcount mode)
/*
EvbRegs.T3PR = 0x249F;//0x493E; // PWM 输出OFDM信号频率= HSPCLK/9375=16KHz
EvbRegs.T3CNT = 0x0000;
EvbRegs.CMPR4 = 0x0000; // 解码后的数据进行D/A
EvbRegs.T3CON.all = 0x1042;//0x1040;
*/
// Configure EVA
EvaRegs.EVAIMRA.all = 0x0008;
EvaRegs.EVAIFRA.all = 0x0008;
EvaRegs.ACTRA.all = 0x0800;
EvaRegs.DBTCONA.all = 0x0000; // Disable Dead Band Unit
EvaRegs.COMCONA.all = 0xA600;
/*
// Configure EVB
EvbRegs.EVBIMRA.all = 0x0002;//0x0080;
EvbRegs.EVBIFRA.all = 0x0002;//0x0080;
EvbRegs.ACTRB.all = 0x0666;
EvbRegs.DBTCONB.all = 0x0000; // Disable Dead Band Unit
EvbRegs.COMCONB.all = 0xA600;//0x0000;
*/
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;
/*
lpf.dbuffer_ptr=dbuffer;
lpf.coeff_ptr=(long *)coeff;
lpf.order=FIR_ORDER;
lpf.init(&lpf);*/
/*Main function*/
while (1)
{
asm(" nop");
//语音编码和调制
if(EncFlag == 1) //EncFlag为0表示接收数据不够编码,一直等待
{
EncFlag = 0;
for(i=0; i<160; i++)
{
buffer3[i] = Voltage1[160*EncNum + i] - 0x8980;
// buffer3[i] -= 0x08D6;
}
if(++EncNum == 3)
EncNum = 0;
/* */
codamr(); //语音编码
//跟踪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] + 0x8000) & 0xFFF0;
}
DecFlag--;
demodushift += 103;
if(pwmtestCount == 320)
pwmtestCount = 0;
}*/
}
}
}
interrupt void adc_isr(void)//adc中断以16k速率进入
{
//输入语音采样8k
// if(ConversionCount)
// {
Voltage1[ADCInputVoiceNum] = /*(AdcRegs.ADCRESULT0>>4) & 0x0FFF;*/
(((AdcRegs.ADCRESULT0>>4) & 0x0FFF)\
+((AdcRegs.ADCRESULT1>>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))/8;
/* lpf.input=Voltage1[ADCInputVoiceNum];
lpf.calc(&lpf);
Voltage1[ADCInputVoiceNum]=lpf.output;
*/
Voltage1[ADCInputVoiceNum] = Voltage1[ADCInputVoiceNum] & 0x0FFF;//(Voltage1[ADCInputVoiceNum]<<4) & 0xFFF0;
ADCInputVoiceNum++;
TestCnt++;
if(TestCnt == 20)
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_cmp3_isr(void) //音频输出
{
if(PwmoutStart)
{
if( !Div2Flag)
{
// Voltage1[PwmCount] = (Voltage1[PwmCount]>>4) & 0x0FFF;
EvaRegs.CMPR3 = 0x0800;//Voltage1[PwmCount];//0x124F;//Voltage4[PwmCount];
PwmCount++;
//if(PwmCount == pwmtestCount) //check if buffer written conflict
// asm(" ESTOP0");
if(PwmCount == 480)//320)
PwmCount = 0;
}
Div2Flag++;
if(Div2Flag == 2)
Div2Flag = 0;
}
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_cmp4_isr(void) //调制后数据输出
{
if(PwmoutStart)
{
if( !Div2Flag)
{
// Voltage1[PwmCount] = (Voltage1[PwmCount]>>4) & 0x0FFF;
EvbRegs.CMPR4 = 0x0800;//Voltage1[PwmCount];
PwmCount++;
//if(PwmCount == pwmtestCount) //check if buffer written conflict
// asm(" ESTOP0");
if(PwmCount == 480)//320)
PwmCount = 0;
}
Div2Flag++;
if(Div2Flag == 2)
{
Div2Flag = 0;
return;
}
}
EvbRegs.EVBIMRA.all = 0x0002;
EvbRegs.EVBIFRA.all = 0x0002;
// Acknowledge interrupt to recieve more interrupts from PIE group 4
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
return;
}
*/
/*
interrupt void EVB_T3PINT_ISR(void)
{
if(PwmoutStart)
{
//CS low
DAC_CS = 0;
asm(" nop");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" nop");
SpiaRegs.SPIDAT = Voltage4[PwmCount];//0xC800;
while(!SpiaRegs.SPISTS.bit.INT_FLAG) //wait until transmit finished
asm(" nop");
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;
PwmCount++;
if(PwmCount == 320)
PwmCount = 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;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -