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:
非常非常感谢,虽然还是没有搞懂,不过不影响的,不麻烦您了。