连续16次DMA只成功了第一次,后15次L2SRAM里的数据不是其原有数据,也不是源地址ddr3里的数据。
在for循环里打断点一次一次DMA又是可以成功DMA16次的
CACHE_invL1d((void*)(0x10800000),4096*2*16,CACHE_WAIT);
for(j=0;j<16;j++)
{
DMA_Transfer_LFM_A((void*)(0x10800000+j*4096*2*4), (void*)(0x84000010+j*98320), 0,4096);
}
这是DMA的函数
void DMA_Transfer_LFM_A(void* dst, void* src, int n,int acnt)
{
ICR(n) = 1; /////////////Interrupt Clear Registers (ICR, ICRH)
EMCR(n) = 1<<2; /////////////Event Missed Clear Registers (EMCR/EMCRH)
EMCRH(n) = 1<<2;
SECR(n) = 1<<2; ////////////Secondary Event Clear Registers (SECR, SECRH)
SECRH(n) = 1<<2;
CCERRCLR(n) = 0xFFFFFFFF; ////////////EDMA3CC Error Clear Register (CCERRCLR)
OPT(n,0) = CSL_EDMA3_OPT_MAKE(
CSL_EDMA3_ITCCH_DIS,\
CSL_EDMA3_TCCH_DIS,\
CSL_EDMA3_ITCINT_DIS,\
CSL_EDMA3_TCINT_EN,\
0,\
CSL_EDMA3_TCC_NORMAL,\
CSL_EDMA3_FIFOWIDTH_NONE,\
CSL_EDMA3_STATIC_EN,\
CSL_EDMA3_SYNC_A,\
CSL_EDMA3_ADDRMODE_INCR,\
CSL_EDMA3_ADDRMODE_INCR
);
DST(n,0) = (int)dst;
SRC(n,0) = (int)src;
ABCNT(n,0) = CSL_EDMA3_CNT_MAKE((8*acnt),1);
//ABCNT(n,0) = CSL_EDMA3_CNT_MAKE((acnt),bcnt);
BIDX(n,0) = CSL_EDMA3_BIDX_MAKE(0,0);
RLD(n,0) = CSL_EDMA3_LINKBCNTRLD_MAKE(CSL_EDMA3_LINK_NULL,0);
CIDX(n,0) = CSL_EDMA3_CIDX_MAKE(0,0);
CCNT(n,0) = 1;
ESR(n) = 1<<2; //手动触发DMA传输,,,Event Set Registers (ESR, ESRH)
while((IPR(n) & 1) != 1);
}
Nancy Wang:
你程序中配置的手动触发次数对吗?看你的描述好像只是成功触发了一次传输。
user6045763:
回复 Nancy Wang:
执行edma的时候L2SRAM里的数是变了,但是更新后的数不是源地址里的数 不知道为什么
Nancy Wang:
回复 user6045763:
你程序里是开启了cache?试试看不开cache情况下会不会出现这样的情况。
user6045763:
回复 Nancy Wang:
L2SRAM没有开cache 去掉cache_inv也有这种情况