/*********************************************************************************
* Copyright 2003 by SEED Electronic Technology Ltd.
* All rights reserved. Property of SEED Electronic Technology Ltd. *
* Designed by: Hongshuai.Li *
*********************************************************************************/
/* FILENAME...... DEC6713_EDMA.c
* DATE CREATED.. 21/12/2004
* LAST MODIFIED. 21/12/2004
*------------------------------------------------------------------------------
* This program uses the timer to trigger EDMA events. These events in turn
* trigger linked EDMA parameter tables to fill a ping pong buffer structure.
* On running the program you'll note that the program bounces between the ping
* and pong buffers filling each with a value that comes from the source.
* (Note: This example runs with CACHE enable).
\******************************************************************************/
#include <stdio.h>
#include <csl.h>
#include <csl_cache.h>
#include <csl_edma.h>
#include <csl_timer.h>
#include <csl_irq.h>
#include <DEC6713.h>
/*----------------------------------------------------------------------------*/
/* Pick which EDMA transfer completion interrupt we want to use */
#define TCCINTNUM 10
/* define the constants */
#define BUFF_SZ 256 /* ping-pong buffer sizes in # of ints */
#define FCPU 150000000 /* CPU clock frequency */
#define SRATE 8000 /* data sample rate (simulated w/timer */
#define TPRD (FCPU/(4*SRATE)) /* timer period */
#define TRANSFER_CNT 20 /* Transfer count */
/* Create the buffers. We want to align the buffers to be cache friendly */
/* by aligning them on an L2 cache line boundary. */
#pragma DATA_ALIGN(ping,128);
#pragma DATA_ALIGN(pong,128);
#pragma DATA_ALIGN(outbuff,128);
int ping[BUFF_SZ];
int pong[BUFF_SZ];
int outbuff[BUFF_SZ];
/* These two variables serve as the data sources for this example. */
/* Also want to align these on a cache line boundary since they */
/* sources of EDMA transfers. */
#pragma DATA_ALIGN(ping_data,128);
#pragma DATA_ALIGN(pong_data,128);
static int ping_data;
static int pong_data;
/* global variable used to track the ping-pong'ing */
static int pingpong = 0;
volatile int transferCount = 0;
extern far void vectors();
void setupInterrupts(void);
void stopEdma(void); /* function used to stop EDMA */
/*-------------------------------------------------------------------------*/
/* declare the CSL objects */
TIMER_Handle hTimer; /* Handle for the timer device */
EDMA_Handle hEdma; /* Handle for the EDMA channel */
EDMA_Handle hEdmaPing; /* Handle for the ping EDMA reload parameters */
EDMA_Handle hEdmaPong; /* Handle for the pong EDMA reload parameters */
EDMA_Config cfgEdma; /* EDMA configuration structure */
/* Create the EDMA configuration structure for ping transfers */
EDMA_Config cfgEdmaPing = {
EDMA_OPT_RMK( /* Making Options parameter register - EDMA_OPT */
EDMA_OPT_PRI_LOW, /* Priority levels for EDMA events:-
EDMA_OPT_PRI_LOW - Low priority EDMA transfer
EDMA_OPT_PRI_HIGH - High priority EDMA transfer*/
EDMA_OPT_ESIZE_32BIT,/* Element size :-
EDMA_OPT_ESIZE_32BIT - 32 bit word
EDMA_OPT_ESIZE_16BIT - 16 bit word
EDMA_OPT_ESIZE_8BIT - 8 bit word */
EDMA_OPT_2DS_NO, /* Source dimension :-
EDMA_OPT_2DS_NO - 1-dimensional source
EDMA_OPT_2DS_YES - 2-dimensional source */
EDMA_OPT_SUM_NONE, /* Source address update mode :-
EDMA_OPT_SUM_NONE - Fixed address mode
EDMA_OPT_SUM_INC - Increment address mode
EDMA_OPT_SUM_DEC - Decrement address mode
EDMA_OPT_SUM_IDX - Address modified by element
index or frame Index */
EDMA_OPT_2DD_NO, /* Destination dimension :-
EDMA_OPT_2DD_NO - 1-dimensional source
EDMA_OPT_2DD_YES - 2-dimensional source */
EDMA_OPT_DUM_INC, /* Destination address update mode :-
EDMA_OPT_DUM_NONE - Fixed address mode
EDMA_OPT_DUM_INC - Increment address mode
EDMA_OPT_DUM_DEC - Decrement address mode
EDMA_OPT_DUM_IDX - Address modified by element
index or frame Index */
EDMA_OPT_TCINT_YES, /* Transfer complete interrupt :-
EDMA_OPT_TCINT_NO - Indication disabled
EDMA_OPT_TCINT_YES - Indication enabled */
EDMA_OPT_TCC_OF(TCCINTNUM),/* Transfer complete code */
EDMA_OPT_LINK_YES, /* Linking of event parameters
EDMA_OPT_LINK_NO - Disabled
EDMA_OPT_LINK_YES - Enabled */
EDMA_OPT_FS_NO /* Frame synchronization
EDMA_OPT_FS_NO - Channel is element/array
synchronized
EDMA_OPT_FS_YES - Channel is frame synchronized*/
),
EDMA_SRC_OF(&ping_data),/* Source address register
&ping_data - source address */
EDMA_CNT_OF(BUFF_SZ), /* Transfer count parameter
BUFF_SZ - buffer sizes in # of ints */
EDMA_DST_OF(ping), /* Destination address parameter
ping - destination address */
EDMA_IDX_OF(0x00000004),/* Index parameter */
EDMA_RLD_OF(0x00000000) /* Count reload/link parameter */
};
/* Create the EDMA configuration structure for pong transfers */
EDMA_Config cfgEdmaPong = {
EDMA_OPT_RMK( /* Making Options parameter register - EDMA_OPT */
EDMA_OPT_PRI_LOW, /* Priority levels for EDMA events:-
EDMA_OPT_PRI_LOW - Low priority EDMA transfer
EDMA_OPT_PRI_HIGH - High priority EDMA transfer */
EDMA_OPT_ESIZE_32BIT,/* Element size :-
EDMA_OPT_ESIZE_32BIT - 32 bit word
EDMA_OPT_ESIZE_16BIT - 16 bit word
EDMA_OPT_ESIZE_8BIT - 8 bit word */
EDMA_OPT_2DS_NO, /* Source dimension :-
EDMA_OPT_2DS_NO - 1-dimensional source
EDMA_OPT_2DS_YES - 2-dimensional source */
EDMA_OPT_SUM_NONE, /* Source address update mode :-
EDMA_OPT_SUM_NONE - Fixed address mode
EDMA_OPT_SUM_INC - Increment address mode
EDMA_OPT_SUM_DEC - Decrement address mode
EDMA_OPT_SUM_IDX - Address modified by element
index or frame Index */
EDMA_OPT_2DD_NO, /* Destination dimension :-
评论0