xuer250 发表于 2015-1-5 22:18

C6713的EDMA例程改写成将数据从EDMA传到SDRAM中

各位大神,我想问个特别初级的问题,希望可以给予指导,就是C6713的EDMA的例程中,想把例程中的程序改写成把数据从EDMA传到外设SDRAM中,那个如何修改程序呢?
例程:
/*********************************************************************************
* 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   1

/* 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 50               /* 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;
int pong;
int outbuff;

/* 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 :-
                           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(&pong_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(pong),      /* Destination address parameter
                                 ping - destination address                  */

EDMA_IDX_OF(0x00000004),/* Index parameter                                 */

EDMA_RLD_OF(0x00000000) /* Count reload/link parameter                     */
};                        

   
/*----------------------------------------------------------------------------*/
void main(){

/*Set the CCFG register of Cache to default value*/
*(int *)0x01840000 = (*(int *)0x01840000 & 0x00000000);

/* initialize the CSL library */
CSL_init();

/* Initialize DEC6713 board */
DEC6713_init();
/* initialize the input source data */
ping_data=0x00000000;
pong_data=0x80000000;

/* Since these variables are the source of an EDMA transfer, we   */
/* need to flush them out of the cache since we just wrote to them. */
CACHE_wbInvL2(&ping_data, 4, CACHE_WAIT);
CACHE_wbInvL2(&pong_data, 4, CACHE_WAIT);

/* Let's disable/clear related interrupts just in case they are pending */
/* from a previous run of the program.                                  */
setupInterrupts();/* defined below */
   
/* Although not required, let's clear all of the EDMA parameter RAM. */
/* This makes it easier to view the RAM and see the changes as we    */
/* configure it.                                                   */
EDMA_clearPram(0x00000000);
   
/* Let's open up a timer device, we'll use this to simulate input events */
/* at a given sample rate.                                                */
hTimer = TIMER_open(TIMER_DEV1, TIMER_OPEN_RESET);

/* Lets open up the EDMA channel associated with timer #1. */
hEdma = EDMA_open(EDMA_CHA_TINT1, EDMA_OPEN_RESET);

/* We also need two EDMA reload parameter sets so let's allocate them */
/* here. Notice the -1, this means allocate any availale table.      */
hEdmaPing = EDMA_allocTable(-1);
hEdmaPong = EDMA_allocTable(-1);

/* Let's copy the ping reload configuration structure to an */
/* intermediate configuration structure.                  */
cfgEdma = cfgEdmaPing;

/* Let's initialize the link fields of the configuration structures */
cfgEdmaPing.rld = EDMA_RLD_RMK(0,hEdmaPing);
cfgEdmaPong.rld = EDMA_RLD_RMK(0,hEdmaPong);
cfgEdma.rld   = EDMA_RLD_RMK(0,hEdmaPong);

/* Now let's program up the EDMA channel with the configuration structure */
EDMA_config(hEdma, &cfgEdma);   

/* Let's also configure the reload parameter tables in the EDMA PRAM */
/* with the values in the configuration structures.                  */
EDMA_config(hEdmaPing, &cfgEdmaPing);
EDMA_config(hEdmaPong, &cfgEdmaPong);   

/* Configure up the timer. */
TIMER_configArgs(hTimer,
    TIMER_CTL_OF(0x00000200),
    TIMER_PRD_OF(TPRD), /* timer period*/
    TIMER_CNT_OF(0)
);   

/* Enable the related interrupts */
IRQ_enable(IRQ_EVT_EDMAINT);
EDMA_intDisable(TCCINTNUM);
EDMA_intClear(TCCINTNUM);
EDMA_intEnable(TCCINTNUM);      

/* Enable the EDMA channel */
EDMA_enableChannel(hEdma);   

/* Finally, enable the timer which will drive everything. */
TIMER_start(hTimer);

while(transferCount <= TRANSFER_CNT); /* waiting for interrupts */
}

/*----------------------------------------------------------------------------*/
void processbuff(int arg){

int *inbuff;
int x;
printf("\n %2d -",transferCount);
if (pingpong){

    /* If pingpong is 0, then we own the ping input buffer */
    inbuff = ping;
    printf(" Ping ");
   
}else{

    /* If pingpong is 1, then we own the pong input buffer */
    inbuff = pong;
    printf(" Pong " );
   
}

transferCount++;
/* Now let's process the input buffer, for simplicity, we'll */
/* just copy it to the output buffer.                        */
for (x=0; x<BUFF_SZ; x++) {
    outbuff = inbuff;
}

/* If this example is enhanced to actually do something with the*/
/* output buffer such as DMA it somewhere, you will want to flush */
/* it out of the cache first.                                     */
   CACHE_wbInvL2(outbuff, (BUFF_SZ << 2), CACHE_WAIT);


/* Since we're done processing the input buffer, clean it from cache, */
/* this invalidates it from cache to ensure we read a fresh version   */
/* the next time.                                                   */
   CACHE_clean(CACHE_L2,inbuff,(BUFF_SZ << 2));
}
/*----------------------------------------------------------------------------*/

/************************************************************************\
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_EDMAINT, 8);
   IRQ_reset(IRQ_EVT_EDMAINT);
   
} /* End of SetInterruptsEdma() */


/************************************************************************\
name:      Interrupt Service Routine c_int08

purpose:   ISR to service EDMAINT. vecs.asm must be modified to include
            c_int08 entry.
            
inputs:    n/a

returns:   n/a
\************************************************************************/
interrupt void   
c_int08(void)   
{
/* Clear the pending interrupt from the EDMA interrupt pending register */
EDMA_intClear(TCCINTNUM);

/* Perform ping-pong */
pingpong = (pingpong + 1) & 1;

/*Exit from the program if certain no of transfres are done*/
if (transferCount >= TRANSFER_CNT)
{
      TIMER_pause(hTimer);
      stopEdma();
      TIMER_close(hTimer);
      printf ("\nDone.....");
      exit(0);   
}

/* Based on if we ping'ed or pong'ed, we need to set the EDMA channel */
/* link address for the NEXT frame.                                 */
        if (pingpong){
    /* Currently doing pong so setup next frame for ping */                     

    /* Modify the input data source, this just simulates */
    /* the input data changing.                        */
    ping_data++;

    /* Rememer to flush this variable out of the cache */
    /* since it's the source of an EDMA transfer       */
    CACHE_wbInvL2(&ping_data, 4, CACHE_WAIT);
   
    /* Now filling pong so set link to ping */
    EDMA_link(hEdma,hEdmaPing);
   
   
}else{
    /* Currently doing ping so setup next frame for pong */                     

    /* Modify the output data source, this just simulates */
    /* the input data changing.                           */
    pong_data++;
   
    /* Rememer to flush this variable out of the cache */
    /* since it's the source of an EDMA transfer       */
   
    CACHE_wbInvL2(&pong_data, 4, CACHE_WAIT);
    /* Now filling ping so set link to pong */
   
    EDMA_link(hEdma,hEdmaPong);
   
}
processbuff(0);
return;

} /* end c_int08 */


/************************************************************************\
name:      stopEdma

purpose:   Stops the EDMA service.

inputs:    void

returns:   void
\************************************************************************/
void stopEdma(void) {

    /*Disable interrupts, close EDMA channel before exit of the program*/
    IRQ_disable(IRQ_EVT_EDMAINT);
    EDMA_RSET(CCER,0x00000000);
    EDMA_disableChannel(hEdma);
    EDMA_intDisable(TCCINTNUM);
    EDMA_intClear(TCCINTNUM);

        EDMA_close(hEdma);
        EDMA_resetAll();
        EDMA_RSET(CIPR,0xFFFFFFFF);
        EDMA_RSET(ECR,0xFFFFFFFF);
}

/******************************************************************************\
* End of main.c
\******************************************************************************/

zhangmangui 发表于 2015-1-5 23:10

重点应该在GEL上 吧   

xuer250 发表于 2015-1-6 10:09

zhangmangui 发表于 2015-1-5 23:10 static/image/common/back.gif
重点应该在GEL上 吧

GEL?不是在例程里面修改配置么?

zhangmangui 发表于 2015-1-6 22:15

xuer250 发表于 2015-1-6 10:09 static/image/common/back.gif
GEL?不是在例程里面修改配置么?

外扩SDRAM在GEL中也有设置 吧    你看看
页: [1]
查看完整版本: C6713的EDMA例程改写成将数据从EDMA传到SDRAM中