TI中文支持网
TI专业的中文技术问题搜集分享网站

大神,帮我彻底解决这个DMA问题好吗

C5509A的DMA传输,从SARAM到SARAM。在CMD中将SARAM的地址设置为 SARAM  : origin = 00014001h, length = 0005000h时成功传输,而将SARAM的地址改为  SARAM  : origin = 00024001h, length = 0005000h时就不成功了,我如何改才能成功啊,您上次没有告诉我怎么改啊,大神!

Gary Wu:

确认下,代码里DMA的源地址也更改了吧

Gary Wu:

回复 Gary Wu:

设置DMA source address,可以参考如下链接

http://processors.wiki.ti.com/index.php/55x_FAQ#How_do_I_program_the_address_of_my_data_in_the_DMA.3F

gang zhao:

回复 Gary Wu:

反正是很奇怪,高四位地址如果设置成奇数就可以,偶数就不行。例如SARAM1  : origin = 0014001h, 0034001,0054001等是可以成功的,2,4,6就不行

gang zhao:

回复 gang zhao:

而且你说的我都设置了的,还是很感谢

Shine:

回复 gang zhao:

gang zhao

反正是很奇怪,高四位地址如果设置成奇数就可以,偶数就不行。例如SARAM1  : origin = 0014001h, 0034001,0054001等是可以成功的,2,4,6就不行

gang zhao:

回复 Shine:

主程序:

#include <stdio.h>

 

//#include <csl.h>

//#include <csl_irq.h>

#include <csl_dma.h>

 

//———Global constants———

 

/* Constant defines transfer length */

#define N       128

//———Global data definition———

/* Place src and dst of DMA transfer in seperate memory section */

/* to better control placement in user specified memory range   */

#pragma DATA_SECTION(src,"dmaMem")

Uint16 src[N];

   

#pragma DATA_SECTION(dst, "ba")

Uint16 dst[N];

 

DMA_Config  myconfig = {

  DMA_DMACSDP_RMK(

    DMA_DMACSDP_DSTBEN_NOBURST,

    DMA_DMACSDP_DSTPACK_OFF,

    DMA_DMACSDP_DST_SARAM,

    DMA_DMACSDP_SRCBEN_NOBURST,

    DMA_DMACSDP_SRCPACK_OFF,

    DMA_DMACSDP_SRC_SARAM,

    DMA_DMACSDP_DATATYPE_16BIT

  ),                                       /* DMACSDP  */

  DMA_DMACCR_RMK(

    DMA_DMACCR_DSTAMODE_POSTINC,

    DMA_DMACCR_SRCAMODE_POSTINC,

    DMA_DMACCR_ENDPROG_OFF,

    DMA_DMACCR_REPEAT_OFF,

    DMA_DMACCR_AUTOINIT_OFF,

    DMA_DMACCR_EN_STOP,

    DMA_DMACCR_PRIO_HI,

    DMA_DMACCR_FS_ENABLE,

    DMA_DMACCR_SYNC_NONE

  ),                                       /* DMACCR   */

  DMA_DMACICR_RMK(

    DMA_DMACICR_BLOCKIE_OFF,

    DMA_DMACICR_LASTIE_OFF,

    DMA_DMACICR_FRAMEIE_ON,

    DMA_DMACICR_FIRSTHALFIE_OFF,

    DMA_DMACICR_DROPIE_OFF,

    DMA_DMACICR_TIMEOUTIE_OFF

  ),                                       /* DMACICR  */

    (DMA_AdrPtr)&src,                     /* DMACSSAL */

    0,                                     /* DMACSSAU */

    (DMA_AdrPtr)&dst,                      /* DMACDSAL */

    0,                                     /* DMACDSAU */

    N,                                     /* DMACEN   */

    1,                                     /* DMACFN   */

    0,                                     /* DMACFI   */

    0                                      /* DMACEI   */

};

 

/* Define a DMA_Handle object */

DMA_Handle myhDma;

int i, j;  

Uint16 err = 0;

volatile Uint16 WaitForTransfer = TRUE;

 

//———Function prototypes———

 

/* Function prototypes */

void taskFxn(void);

 

//———main routine———

void main(void)

{

    /* Initialize CSL library – This is REQUIRED!!! */

    CSL_init();

 

    /* Initialize source and destination buffers */

    for (i = 0; i <= (N – 1); i++) {

        dst[i] = 0;

        src[i] = i + 1;

    }

 

    /* Call Function For DMA Transfer */

    taskFxn();

}

 

void taskFxn(void)

{

    /* Open DMA Channel 0 */

    myhDma = DMA_open(DMA_CHA0, 0);   

 

    /* By default, the TMS320C55xx compiler assigns all data symbols word */

    /* addresses. The DMA however, expects all addresses to be byte       */

    /* addresses. Therefore, we must shift the address by 2 in order to   */

    /* change the word address to a byte address forthe DMA transfer.     */      

    myconfig.dmacssal = (DMA_AdrPtr)(((Uint16)(&src)<<1)&0xFFFF);

    myconfig.dmacdsal = (DMA_AdrPtr)(((Uint16)(&dst)<<1)&0xFFFF);

    myconfig.dmacssau = (unsigned short int)(((unsigned long int)&src)>>15);

    myconfig.dmacdsau = (unsigned short int)(((unsigned long int)&dst)>>15);    /* Write configuration structure values to DMA control registers */

    DMA_config(myhDma, &myconfig);                  

 

    /* Enable DMA channel to begin transfer */

    DMA_start(myhDma);

 

    /* Wait for FRAME status bit in DMA status register to signal */

    /* transfer is complete.                                      */

    while (!DMA_FGETH(myhDma,DMACSR,FRAME)) {

       ;  

  }

 

    /* Check data values to make sure transfer happened correctly */

    for (i = 0; i <= (N – 1); i++) {

        if (dst[i] != src[i]) {

            ++err;

        }

    }

           

    printf ("%s\n",err?"TEST FAILED" : "TEST PASSED");

 

    /* We are through with DMA, so close it */

    DMA_close(myhDma);

}

CMD程序:

MEMORY{    PAGE 0:

        MMR     : origin = 0000000h, length = 00000c0h         SPRAM   : origin = 00000c0h, length = 0000040h        VECS    : origin = 0000100h, length = 0000100h        DARAM0  : origin = 0000200h, length = 0003E00h        DARAM1  : origin = 0004000h, length = 0004000h        DARAM2  : origin = 0008000h, length = 0004000h        DARAM3  : origin = 000c000h, length = 0004000h

        SARAM0  : origin = 0010001h, length = 0004000h        SARAM1  : origin = 0014001h, length = 0004000h 

        PDROM   : origin = 0ff8000h, length = 07f00h    /*  VECS    : origin = 0ffff00h, length = 00100h */ /* reset vector */}      

 SECTIONS{        .vectors  : {} > VECS  PAGE 0        /* interrupt vector table */        .cinit   : {} > SARAM0 PAGE 0        .text    : {} > SARAM1 PAGE 0

        .stack   : {} > DARAM0 PAGE 0        .sysstack: {} > DARAM0 PAGE 0        .sysmem  : {} > DARAM1 PAGE 0        .cio     : {} > DARAM1 PAGE 0        .data    : {} > DARAM1 PAGE 0        .bss     : {} > DARAM1 PAGE 0        .const   : {} > DARAM1 PAGE 0

        .csldata:  {} > DARAM0   PAGE 0         dmaMem:   {} > SARAM0 PAGE 0  ba:   {} > SARAM1 PAGE 0

}

Shine:

回复 gang zhao:

估计你没用large memory model, compiler编译选项选择-ml, 相应的库用rts55x.lib, csl5509x.lib.

附加是我在例程上改的代码, 可以搬高位SARAM.

gang zhao:

回复 Shine:

但是用您给的文件,进行“Load Program…”时出现错误,提示“Data verification failed at address 0x48000 please verify target memory and memory map”。我确定不是硬件的问题,而且我也选择了-ml,库也选上了。会不会CMD文件不匹配啊

gang zhao:

回复 Shine:

非常非常感谢,虽然还是没有搞懂,不过不影响的,不麻烦您了。

赞(0)
未经允许不得转载:TI中文支持网 » 大神,帮我彻底解决这个DMA问题好吗
分享到: 更多 (0)