⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 DSP通过EMIF接口与外部FIFO通信并实现IQ调制功能
💻 C
📖 第 1 页 / 共 2 页
字号:
/**********************************************************************************/
/*程序名称:EDMA数据传输例程													  */
/*创建人:马文武																  */
/*创建时间:2007-04-23															  */
/*程序功能:通过EDMA方式,将输入FIFO的数据读入到DSP的L2空间,以供主程序处理,采用 */
/*块输入模式。处理完毕后,采用EDMA方式将数据送到输出FIFO。为保证处理和数据的输入输*/
/*出不发生影响,采用Ping-Pong方式输入输出。由于在本次设计的硬件上输入和输出都连接*/
/*在EMIFB上,占有同一个总线(输入和输出FIFO都分配在CE3),所以数据传输方式为:触发*/
/*数据传输-inPing-outPing-触发数据处理-触发数据传输-inPong-outPong-触发数据*/
/*处理-触发数据传输-inPing-outPing-...									  */
/**********************************************************************************/
/*----------------------------------------------------------------------------*/
//传输原程序头文件区
#include <std.h>
#include <swi.h>
#include <log.h>
#include <clk.h>
#include <csl.h>
#include <csl_cache.h>
#include <csl_edma.h>
#include <csl_timer.h>
#include <csl_irq.h>
#include <stdio.h>
#include <csl_chip.h>
#include <csl_cache.h>
#include <csl_emifb.h>
#include <csl_gpio.h>
#include <string.h>
#include "sin_table.h"
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
//用户程序头文件区
#include "FilterTables.h"
#include <stdio.h>
#include "stdlib.h"
#include <math.h>
#include <float.h>
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
//传输原程序变量区
#define BUFF_SZ  2048              /* 每次数据传输的数据块大小  */
#pragma DATA_SECTION(emifb_data,".off_fifo");  /*分配FIFO的地址*/
short emifb_data;
#define TCCINTNUM_in   4      /*EDMA传输结束检测字*/
#define TCCINTNUM_out   6
#define PING 0
#define PONG 1
#pragma DATA_ALIGN(ping,2048); /*定义输入缓存数据边界*/
#pragma DATA_ALIGN(pong,2048);
short ping[BUFF_SZ];
short pong[BUFF_SZ];
#pragma DATA_ALIGN(outping,2048);/*定义输出缓存数据边界*/
#pragma DATA_ALIGN(outpong,2048);
short outping[BUFF_SZ];
short outpong[BUFF_SZ];
 short  flag_ping=0,flag_pong=0,flag=0;
 short num_ping=0,num_pong=0; 
void processing(void); /*用户处理程序*/
static int pingpong = 0;			  /*ping-pong标志位*/
extern SWI_Obj processingSwi;
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
//用户程序变量区
struct complex_sh 
	{
		short 	x;
		short 	y;
	};

struct complex_t 
	{
		int 	x;
		int 	y;
	};
	
void CalcBPFilter( 
			short 	*pIn, 
			struct 	complex_sh *pOut
			);

/*----------------------------------------------------------------------------*/	

/*----------------------------------------------------------------------------*/
//配置区	
/*GPIO配置,输入FIFO半满信号通过GPIO4输入到DSP中,触发传输*/
static Uint32 gpgc = GPIO_GPGC_RMK(
    GPIO_GPGC_GP0M_GPIOMODE,
    GPIO_GPGC_GPINT0M_DEFAULT,
    GPIO_GPGC_GPINTPOL_DEFAULT,
    GPIO_GPGC_LOGIC_DEFAULT,
    GPIO_GPGC_GPINTDV_DEFAULT
);
static Uint32 gpen = GPIO_GPEN_OF(0x60d0);  //14,13,7,6,4 GPIO
static Uint32 gpdir = GPIO_GPDIR_OF(0x6080);
static Uint32 gpval = GPIO_GPVAL_OF(0x60d0);
static Uint32 gphm = GPIO_GPHM_RMK(GPIO_GPHM_GPXHM_DEFAULT);
static Uint32 gplm = GPIO_GPLM_RMK(GPIO_GPLM_GPXLM_DEFAULT);
static Uint32 gppol = GPIO_GPPOL_RMK(GPIO_GPPOL_GPINTXPOL_DEFAULT);

/*EMIFB配置*/
static EMIFB_Config MyEmifbConfig = 
{
    EMIFB_GBLCTL_RMK
    (
        EMIFB_GBLCTL_EK2RATE_FULLCLK,   //1 X EMIF input clock
        EMIFB_GBLCTL_EK2HZ_CLK,     //eclkout2 continue output during hold
        EMIFB_GBLCTL_EK2EN_ENABLE,  //eclkout2 enable output
        EMIFB_GBLCTL_BRMODE_MRSTATUS,   //bus request is memory access or refresh pending/in progress
        EMIFB_GBLCTL_NOHOLD_ENABLE,
        EMIFB_GBLCTL_EK1HZ_CLK,     //eclkout1 continue output during hold
        EMIFB_GBLCTL_EK1EN_ENABLE   //eclkout1 enable output
    ),
    0x1051c4B1,
    0x1051c4B1,
    0x1051c4B1,
	0x1051c4B1,//用到CE3
    EMIFB_SDCTL_DEFAULT,
    EMIFB_SDTIM_DEFAULT,
    EMIFB_SDEXT_DEFAULT,
	0x00000031,
	0x00000031,
	0x00000031,
	0x00000031 //用到CE3
};

/*定义EDMA输入句柄*/
EDMA_Handle hEdma;      
EDMA_Handle hEdmaping;/*ping*/
EDMA_Handle hEdmapong;/*pong*/

EDMA_Config cfgEdma;/*定义输入主配置*/

/*定义EDMA输入句柄*/
EDMA_Handle hEdmaxmt; 
EDMA_Handle hEdmaxmtping;
EDMA_Handle hEdmaxmtpong;

EDMA_Config cfgEdmaxmt;/*定义输入主配置*/

/*输入ping配置*/
EDMA_Config cfgEdmaping={	
		/* OPT Setup */
		EDMA_OPT_RMK(
			EDMA_OPT_PRI_LOW,       /* 011  */
			EDMA_OPT_ESIZE_16BIT,   /* 01 */
			EDMA_OPT_2DS_NO,        /* 0  */
			EDMA_OPT_SUM_NONE,      /* 00 */
			EDMA_OPT_2DD_YES,       /* 1  */
			EDMA_OPT_DUM_INC,       /* 01 */
			EDMA_OPT_TCINT_YES,     /* 1  */
			EDMA_OPT_TCC_OF(TCCINTNUM_in),     /* 4 */
			EDMA_OPT_TCCM_DEFAULT,  /* 0  */
			EDMA_OPT_ATCINT_DEFAULT,/* 0  */
			EDMA_OPT_ATCC_DEFAULT,  /* 0  */
			EDMA_OPT_PDTS_DEFAULT,  /* 0  */
			EDMA_OPT_PDTD_DEFAULT,  /* 0  */
			EDMA_OPT_LINK_YES,      /* 1  */
			EDMA_OPT_FS_YES         /* 1  */
		),

		EDMA_SRC_OF(&emifb_data),   /* 传输源地址 */
		EDMA_CNT_OF(0x08000001),	/* 每次传输1帧,每帧2048个元素 */
		EDMA_DST_OF(ping),			/* 传输目的地址 */
  		EDMA_IDX_OF(0x00000000),
  		EDMA_RLD_OF(0x00000000)
};
/*输入pong配置*/
EDMA_Config cfgEdmapong={
		EDMA_OPT_RMK(
			EDMA_OPT_PRI_LOW,       /* 011  */
			EDMA_OPT_ESIZE_16BIT,   /* 01 */
			EDMA_OPT_2DS_NO,        /* 0  */
			EDMA_OPT_SUM_NONE,      /* 00 */
			EDMA_OPT_2DD_YES,       /* 1  */
			EDMA_OPT_DUM_INC,       /* 01 */
			EDMA_OPT_TCINT_YES,     /* 1  */
			EDMA_OPT_TCC_OF(TCCINTNUM_in),     /* 4 */
			EDMA_OPT_TCCM_DEFAULT,  /* 0  */
			EDMA_OPT_ATCINT_DEFAULT,/* 0  */
			EDMA_OPT_ATCC_DEFAULT,  /* 0  */
			EDMA_OPT_PDTS_DEFAULT,  /* 0  */
			EDMA_OPT_PDTD_DEFAULT,  /* 0  */
			EDMA_OPT_LINK_YES,      /* 1  */
			EDMA_OPT_FS_YES         /* 1  */
		),
		EDMA_SRC_OF(&emifb_data), 
		EDMA_CNT_OF(0x08000001),
		EDMA_DST_OF(pong),
	    EDMA_IDX_OF(0x00000000),
	    EDMA_RLD_OF(0x00000000)
};

/*输出ping配置*/
EDMA_Config cfgEdmaxmtping={	
		EDMA_OPT_RMK(
			EDMA_OPT_PRI_LOW,       /* 011  */
			EDMA_OPT_ESIZE_16BIT,   /* 01 */
			EDMA_OPT_2DS_YES,       /* 1  */
			EDMA_OPT_SUM_INC,       /* 01 */
			EDMA_OPT_2DD_NO,        /* 0  */
			EDMA_OPT_DUM_NONE,      /* 00 */
			EDMA_OPT_TCINT_YES,     /* 1  */
			EDMA_OPT_TCC_OF(TCCINTNUM_out),     /* 6 */
			EDMA_OPT_TCCM_DEFAULT,  /* 0  */
			EDMA_OPT_ATCINT_DEFAULT,/* 0  */
			EDMA_OPT_ATCC_DEFAULT,  /* 0  */
			EDMA_OPT_PDTS_DEFAULT,  /* 0  */
			EDMA_OPT_PDTD_DEFAULT,  /* 0  */
			EDMA_OPT_LINK_YES,      /* 1  */
			EDMA_OPT_FS_YES         /* 1  */
		),

		EDMA_SRC_OF(outping), 		/* 传输源地址 */
		EDMA_CNT_OF(0x08000001),
		EDMA_DST_OF(&emifb_data),
  		EDMA_IDX_OF(0x00000000),
  		EDMA_RLD_OF(0x00000000)
};

EDMA_Config cfgEdmaxmtpong={
		EDMA_OPT_RMK(
			EDMA_OPT_PRI_LOW,       /* 011  */
			EDMA_OPT_ESIZE_16BIT,   /* 01 */
			EDMA_OPT_2DS_YES,       /* 1  */
			EDMA_OPT_SUM_INC,       /* 01 */
			EDMA_OPT_2DD_NO,        /* 0  */
			EDMA_OPT_DUM_NONE,      /* 00 */
			EDMA_OPT_TCINT_YES,     /* 1  */
			EDMA_OPT_TCC_OF(TCCINTNUM_out),     /* 6 */
			EDMA_OPT_TCCM_DEFAULT,  /* 0  */
			EDMA_OPT_ATCINT_DEFAULT,/* 0  */
			EDMA_OPT_ATCC_DEFAULT,  /* 0  */
			EDMA_OPT_PDTS_DEFAULT,  /* 0  */
			EDMA_OPT_PDTD_DEFAULT,  /* 0  */
			EDMA_OPT_LINK_YES,      /* 1  */
			EDMA_OPT_FS_YES         /* 1  */
		),
		EDMA_SRC_OF(outpong), 		/* 传输源地址 */
		EDMA_CNT_OF(0x08000001),
		EDMA_DST_OF(&emifb_data),
	    EDMA_IDX_OF(0x00000000),
	    EDMA_RLD_OF(0x00000000)
};
//配置结束
/*----------------------------------------------------------------------------*/

GPIO_Handle hGpio;
void main()
{
  /* 初始化芯片支持库(CSL) */
  CSL_init();    
  //配置EMIFB
  EMIFB_config(&MyEmifbConfig);
  //打开GPIO句柄
  hGpio = GPIO_open(GPIO_DEV0,GPIO_OPEN_RESET);
  GPIO_configArgs(hGpio,gpgc,gpen,gpdir,gpval,gphm,gplm,gppol);

  IRQ_reset(IRQ_EVT_EDMAINT);     /*重置EDMA传输结束中断*/  
  EDMA_intDisable(TCCINTNUM_in);  /*清除中断控制字*/
  EDMA_intDisable(TCCINTNUM_out);    
  
  EDMA_clearPram(0x00000000);     /*清除EDMA的RAM组*/ 

  /* 打开EDMA句柄 */
  hEdma = EDMA_open(EDMA_CHA_EXTINT4, EDMA_OPEN_RESET);
  hEdmaxmt = EDMA_open(EDMA_CHA_EXTINT6, EDMA_OPEN_RESET);
  /* 分配EDMA重载地址 */
  hEdmaping = EDMA_allocTable(-1);
  hEdmapong = EDMA_allocTable(-1);
  hEdmaxmtping = EDMA_allocTable(-1);
  hEdmaxmtpong = EDMA_allocTable(-1);
  /*设置传输主配置*/
  cfgEdma = cfgEdmaping;
  cfgEdmaxmt = cfgEdmaxmtpong;
  
  /*传输主配置*/
  EDMA_config(hEdma, &cfgEdma);   
  EDMA_config(hEdmaxmt, &cfgEdmaxmt);
  
  /*传输pingpong配置*/
  EDMA_config(hEdmaping, &cfgEdmaping);
  EDMA_config(hEdmapong, &cfgEdmapong);
  EDMA_config(hEdmaxmtping, &cfgEdmaxmtping);   
  EDMA_config(hEdmaxmtpong, &cfgEdmaxmtpong);   
  
  EDMA_RSET(EPRL,0x00000010);	  /*设置GPIO4为下跳沿触发*/
  EDMA_RSET(EERL,0x00000040);     /*使能EDMA通道6的CPU触发*/
  
  EDMA_link(hEdma,hEdmaping);     /*输入链接*/
  EDMA_link(hEdmaping,hEdmapong);  
  EDMA_link(hEdmapong,hEdmaping);
  
  EDMA_link(hEdmaxmt,hEdmaxmtping);/*输出链接*/
  EDMA_link(hEdmaxmtping,hEdmaxmtpong);    
  EDMA_link(hEdmaxmtpong,hEdmaxmtping); 
  
  EDMA_intClear(TCCINTNUM_in);	   /*清除EDMA中断控制字*/
  EDMA_intClear(TCCINTNUM_out);           
  EDMA_intEnable(TCCINTNUM_in);    /*使EDMA中断控制字能*/    
  EDMA_intEnable(TCCINTNUM_out);   
      
  EDMA_enableChannel(hEdma); 	   /*使能EDMA传输*/
  EDMA_enableChannel(hEdmaxmt);   
  IRQ_enable(IRQ_EVT_EDMAINT);	   /*使能EDMA中断*/
  IRQ_globalEnable();		       /*使能全局中断*/
  EDMA_RSET(ESRL,0x00000040);
   while(1);
  /*等待EDMA传输结束中断*/
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -