连续16次DMA只成功了第一次,后15次L2SRAM里的数据还是原有数据,不是ddr3里的数据。
在for循环里打断点一次一次DMA又是可以成功DMA16次的
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);
}
Shine:
后15次L2SRAM里的数据还是原有数据很有可能是cache一致性问题,请看一下在读之前是否有做cache invalid.
user6045763:
回复 Shine:
你好 仔细观察了一下 后15次DMA的是成功DMA的 但是数据不是源地址中的数据,不知道是哪里来的,打断点测则可以DMA到源地址的数据 为什么?已经加了cache_inv