📄 main_edma1.c
字号:
/********************************************************************************/
/* b_perph.c */
/* written by David Bell */
/* on 01/09/01 */
/* */
/* b_perph uses a single EDMA channel to service an external AFE. Channel 4 is */
/* used to burst a frame of data for every EXT_INT4 event received. The data is */
/* transferred from the AFE to L2 memory. */
/********************************************************************************/
/***********************6713初始化(xt1029)************************/
#define CHIP_6713 1
#include <stdio.h>
#include <csl_cache.h>
#include <csl_timer.h>
#include <csl_irq.h>
#include <csl.h>
#include <csl_edma.h>
#include <c6x.h>
#include "c6211dsk.h"
#include "math.h"
/* definitions */
#define MEM_SRC 0x8000 /* Source address for transfer */
#define MEM_DST 0xB0280000 /* Switch(2..0) = 001 0xB0000000 Switch(2..0) =000 */
#define EL_COUNT 2049 /* Element count for transfer */
#define FR_COUNT 1
/* PLL configuration */ //屏蔽pll(xt1029)
/*#define PLL_DIV0 0
#define PLL_DIV1 1
#define PLL_DIV2 2
#define PLL_DIV3 3
*/
#include <math.h>
//#include "DspRegDefine.h"
#define InputLength 25/*设有25个数字序列*/
#define SineLength 64/*一个周期正谐波的长度*/
#define p1 0 /*零相位*/
#define p2 SineLength/2 /*pi相位*/
#define OutputLength InputLength*SineLength/*输出数据的总长度*/
#define pi 3.1416
int w;
int m=0;
static int BPSK[OutputLength];/*输出数据的数组*/
static int data_squence[InputLength]={1,0,1,0,1,1,0,0,1,0,1,0,0,1,1,0,1,1,0,0,1,0,1,0,1};
static int sin_data[SineLength*2];/*共有2个正谐波*/
static int multiply[OutputLength];/*和本地载波相乘后的结果*/
static int de_BPSK[InputLength];/*判决后的结果*/
void submit_qdmas(void);
void submit_qdma(void);
void wait(void);
//void startPLL();
//void delay();
extern far void vectors();
void setupInterrupts(void);
/***********************************submit_qdma**********************************/
/* Submit a QDMA request to transfer the data. */
/********************************************************************************/
void
submit_qdma(void)
{
EDMA_Config config;
config.opt = (Uint32) /* 0x21200001 */
((EDMA_OPT_PRI_HIGH << _EDMA_OPT_PRI_SHIFT )
| (EDMA_OPT_ESIZE_32BIT << _EDMA_OPT_ESIZE_SHIFT )
| (EDMA_OPT_2DS_NO << _EDMA_OPT_2DS_SHIFT )
| (EDMA_OPT_SUM_INC << _EDMA_OPT_SUM_SHIFT )
| (EDMA_OPT_2DD_NO << _EDMA_OPT_2DD_SHIFT )
| (EDMA_OPT_DUM_NONE << _EDMA_OPT_DUM_SHIFT )
| (EDMA_OPT_TCINT_NO << _EDMA_OPT_TCINT_SHIFT )
| (EDMA_OPT_TCC_DEFAULT << _EDMA_OPT_TCC_SHIFT )
#if (C64_SUPPORT)
| (EDMA_OPT_TCCM_DEFAULT << _EDMA_OPT_TCCM_SHIFT )
| (EDMA_OPT_ATCINT_NO << _EDMA_OPT_ATCINT_SHIFT)
| (EDMA_OPT_ATCC_DEFAULT << _EDMA_OPT_ATCC_SHIFT )
| (EDMA_OPT_PDTS_DISABLE << _EDMA_OPT_PDTS_SHIFT )
| (EDMA_OPT_PDTD_DISABLE << _EDMA_OPT_PDTD_SHIFT )
#endif
| (EDMA_OPT_LINK_NO << _EDMA_OPT_LINK_SHIFT )
| (EDMA_OPT_FS_YES << _EDMA_OPT_FS_SHIFT ));
config.src = (unsigned int)MEM_SRC; /* 0x80000000 */
config.cnt = (unsigned int)EL_COUNT; /* 0x00000100 */
config.dst = (unsigned int)MEM_DST; /* 0x00002000 */
config.idx = (unsigned int)0; /* 0x00000000 */
EDMA_qdmaConfig(&config);
} /* end submit_qdma */
/**************************************wait**************************************/
/* Wait until the transfer completes, as indicated by the status of the low- */
/* priority queue in the queue status register (QSR). */
/********************************************************************************/
void
wait(void)
{
while (!(EDMA_getPriQStatus() & EDMA_OPT_PRI_HIGH));
} /* end wait */
/******************************以上为6713所需初始化(xt1029)****************/
/************************子函数和子程序定义***************************/
void main()
{
int i=0,j=0;
void PhaseSelection(int a);/*相位选择函数声明*/
void multiply_and_decision();/*本地载波相乘和判决声明*/
/***********************原6713中所需的配置(xt1029)************/
/* DSP initialization */
CSR=0x100; /* Disable all interrupts */
IER=1; /* Disable all interrupts except NMI */
ICR=0xffff; /* Clear all pending interrupts */
// PLL Configuration
// startPLL();
// delay();
*(unsigned volatile int *)EMIF_GCR = 0x3778;
*(unsigned volatile int *)EMIF_CE0 = 0x30; /* EMIF CE1 control, 32bit */
*(unsigned volatile int *)EMIF_CE1 = CE1_8; /* EMIF CE1 control, 32bit */
*(unsigned volatile int *)EMIF_CE2 = 0x30; /* EMIF CE1 control, 32bit */
*(unsigned volatile int *)EMIF_CE3 = CE1_32; /* EMIF CE1 control, 32bit */
*(unsigned volatile int *)EMIF_SDCTRL = 0x07126000; /* EMIF SDRAM control */
*(unsigned volatile int *)EMIF_SDRP = 0x61a; /* EMIF SDRM refresh period */
*(unsigned volatile int *)EMIF_SDEXT= 0x54529; /* EMIF SDRM extension */
/* Configure L2 for 64K Cache and enable caching of external memory*/
for(i=0;i<5;i++)
{
*(short int *)(0xB0040000) = 0x000;
}
for(i=0;i<5;i++)
{
*(short int *)(0xB0040000) = 0x001;
}
submit_qdma();
wait();
i=0;
submit_qdma();
wait();
i=0;
for(i=0;i<5;i++)
{
*(short int *)(0xB0040000) = 0x000;
}
for(i=0;i<5;i++)
{
*(short int *)(0xB0040000) = 0xFFFFFFFF;
*(short int *)(0xB004000C) = 0xFFFFFFFF;
*(short int *)(0xB0040010) = 0xFFFFFFFF;
}
IRQ_setVecs(vectors);
IRQ_globalEnable();
IRQ_nmiEnable();
IRQ_map(IRQ_EVT_EXTINT4, 4);
IRQ_reset(IRQ_EVT_EXTINT4);
IRQ_enable(IRQ_EVT_EXTINT4);
/*************************配置完毕(xt1029)****************************/
for(i=0;i<SineLength;i++)/*在sin_data[]里面存储一个正弦波*/
{
sin_data[i]=(int)(32*sin(2*pi*i/(SineLength)));/*调用sin函数*/
}
for(j=0;j<SineLength;j++)/*再往sin_data[]里存储一个sin波形,这样sin_data[]里有两个sin波行*/
{
sin_data[i++]=sin_data[j];
}
for(j=0;j<InputLength;j++) //BPSK相位选择
{
if(data_squence[j]==1)/*I码片与Q前半个码片组合进行相位选择*/
PhaseSelection(p1);
else
PhaseSelection(p2);
}
multiply_and_decision();/*本地载波相乘和判决调用*/
for(i=0;i< OutputLength+8;i++)
// for(i=0;i<20;i++)
{ *( int *)(0x30000+4*i) = de_BPSK[i];//把数据给一个地址,然后从这个地址看结果(xt1029)
}
for(;;);
}
/***************相位选择函数定义开始*******************/
void PhaseSelection(int a)
{int count=0;
for(m;m<OutputLength;m++) //主意:此处m已经确定,无需赋初值,尽管在该处出现编译警告
{
BPSK[m]=sin_data[a++];/*从a点开始读入*/
if(count++==SineLength)
{break;}
}
}
/***************相位选择函数定义结束*******************/
/***************本地载波相乘和判决函数定义开始*********/
void multiply_and_decision()
{
int i=0,j=0,sum=0,h=0;
for(i=0;i<OutputLength;i++)
{
multiply[i]=BPSK[i]*sin_data[j];/*调制信号与cos相乘*/
j++;
if(j==SineLength)
j=0;
}
for(i=0;i<InputLength;i++)
{
for(j=0;j<SineLength;j++)
{
if(multiply[h++]>=0)
sum++;
}
if(sum>=SineLength/2) de_BPSK[i]=1;
else de_BPSK[i]=0;
sum=0;
}
}
/***************本地载波相乘和判决函数定义结束*********/
/************************函数输出(xt1029)***********************/
/******************* 主函数到此(xt1029)*****************************/
/*
for(i=0;i<10;i++)
{
a =*(int *)(0x30000+i);
*( int *)(0x8000)=a;
}
for(;;)
{
submit_qdma();
wait();
}
*/
/***********************************屏蔽PLL等(原因:编译时地址出错)(xt1029)***********/
/******************************************************************************\
* PLL initial Programm
\******************************************************************************/
/*
void startPLL()
{
//PLL_bypass();
delay();
PLL_reset();
delay();
PLL_setPllRatio(PLL_DIV0,0x1); /* DIVD0 Ndiv */ //clock_in = 40MHz
/* PLL_enablePllDiv(PLL_DIV0);
PLL_setMultiplier(20); /* Mmul Multiply by the number */
// system_clock=(clock_in/Ndiv)* Mmul
// system_clock=(40/1)*5=200MHz
/* PLL_setOscRatio(0x0); // clock out3
PLL_enableOscDiv();
delay();
// PLL_operational();
PLL_setPllRatio(PLL_DIV1,0x1); // system_clk1 for DSP core
// DSPcore = system_clock/1 = 200MHz
PLL_enablePllDiv(PLL_DIV1); /* dsp core divide bu the number+1*/
/* delay();
PLL_setPllRatio(PLL_DIV2,0x09); /* peripheral sysclk2 divide by the number+1*/
/* PLL_enablePllDiv(PLL_DIV2); // Peripherals R62 测量
// peripheral sysclk2 = system_clock/(9+1) = 20MHz
delay();
PLL_setPllRatio(PLL_DIV3,0x4); /* sysclk3 divide bu the number+1*/
/* PLL_enablePllDiv(PLL_DIV3); // EMIF interface clock
// EMIF sysclk = 200/2 =100MHz
delay();
delay();
PLL_deassert();
delay();
delay();
PLL_enable();
delay();
delay();
return;
}
void delay()
{
int i;
for(i=0;i<0xfff;i++){}
return;
}
*/
/************************************************************************\
name: SetInterruptsEdma
purpose: Sets up interrupts to service EDMA transfers
inputs: void
returns: void
\************************************************************************/
void setupInterrupts(void)
{
IRQ_setVecs(vectors); /* point to the IRQ vector table */
IRQ_nmiEnable();
IRQ_globalEnable();
IRQ_map(IRQ_EVT_EXTINT4, 4);
IRQ_reset(IRQ_EVT_EXTINT4);
} /* End of SetInterruptsEdma() */
/************************************************************************\
name: Interrupt Service Routine c_int04
\************************************************************************/
interrupt void
c_int04(void)
{
int i;
IER = 0;
IRQ_clear(IRQ_EVT_EXTINT4);
submit_qdma();
w=!w;
//*(short int *)(0x90080000) = w;
// wait();
IRQ_enable(IRQ_EVT_EXTINT4);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -