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

6678在用for循环EDMA时只能成功搬移第一次,打断点搬移可以全部成功搬移

   连续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

赞(0)
未经允许不得转载:TI中文支持网 » 6678在用for循环EDMA时只能成功搬移第一次,打断点搬移可以全部成功搬移
分享到: 更多 (0)