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

C6657的EDMA3只传输了一个ACNT就停止传输了

各位好,

我就是进行了一下EDMA的搬移测试,我调用的Keystone_Common.c里面的EDMA3的初始化函数进行初始化,EDMA_Init();

之后我用Keystone_Common.c里面的EDMA_copy()函数进行数据搬移,是能正常搬移的,但是因为这个函数就是用A-同步模式,里面的参数设置是只支持搬移连续地址上的数据,就是BCNT和CCNT都为1,ACNT就设置为要搬移的个数。原本的配置是如下:

 EDMACCRegs->PARAMSET[uiChannel].OPT=  CSL_EDMA3_OPT_MAKE(CSL_EDMA3_ITCCH_DIS,   CSL_EDMA3_TCCH_DIS,   CSL_EDMA3_ITCINT_DIS,   CSL_EDMA3_TCINT_EN,
   uiChannel,
   CSL_EDMA3_TCC_NORMAL,
   CSL_EDMA3_FIFOWIDTH_NONE,   CSL_EDMA3_STATIC_DIS,   CSL_EDMA3_SYNC_A,   CSL_EDMA3_ADDRMODE_INCR,   CSL_EDMA3_ADDRMODE_INCR);
 EDMACCRegs->PARAMSET[uiChannel].SRC= GLOBAL_ADDR(srcAddr);
 EDMACCRegs->PARAMSET[uiChannel].A_B_CNT= (1<<16)|(byteCount&0xFFFF);
 EDMACCRegs->PARAMSET[uiChannel].DST= GLOBAL_ADDR(dstAddr);
 EDMACCRegs->PARAMSET[uiChannel].SRC_DST_BIDX= 0;
 EDMACCRegs->PARAMSET[uiChannel].LINK_BCNTRLD= 0xFFFF;
 EDMACCRegs->PARAMSET[uiChannel].SRC_DST_CIDX= 0;
 EDMACCRegs->PARAMSET[uiChannel].CCNT= 1;

因此我的数据搬移需求所以改动了一下里面的设置,就是把改了一下ACNT的值和BCNT的值和BIDX以及CIDX改动了一下,如下:

 EDMACCRegs->PARAMSET[uiChannel].OPT=  CSL_EDMA3_OPT_MAKE(CSL_EDMA3_ITCCH_DIS,   CSL_EDMA3_TCCH_DIS,   CSL_EDMA3_ITCINT_DIS,   CSL_EDMA3_TCINT_EN,
   uiChannel,
   CSL_EDMA3_TCC_NORMAL,
   CSL_EDMA3_FIFOWIDTH_NONE,   CSL_EDMA3_STATIC_DIS,   CSL_EDMA3_SYNC_A,   CSL_EDMA3_ADDRMODE_INCR,   CSL_EDMA3_ADDRMODE_INCR);
 EDMACCRegs->PARAMSET[uiChannel].SRC= GLOBAL_ADDR(srcAddr);
 EDMACCRegs->PARAMSET[uiChannel].A_B_CNT= ((byteCount/2)&0xFFFF<<16)|(2&0xFFFF);
 EDMACCRegs->PARAMSET[uiChannel].DST= GLOBAL_ADDR(dstAddr);
 EDMACCRegs->PARAMSET[uiChannel].SRC_DST_BIDX= 0x00020002;//0;
 EDMACCRegs->PARAMSET[uiChannel].LINK_BCNTRLD= 0x0000FFFF;
 EDMACCRegs->PARAMSET[uiChannel].SRC_DST_CIDX= 0x00020002;
 EDMACCRegs->PARAMSET[uiChannel].CCNT= 1;

之后数据搬移就不能成功了,就一直卡在while(0==((*TPCC_IPR)&(1<<(uiChannel))));这个地方,就是没有搬移完成,可以从内存中看到只搬移了一个ACNT大小的数据,我想知道这是为什么?是我还需要进行一些什么其他的配置嘛?

非常希望各位能提供一下帮助,感谢。

user4257905:

EDMA_Copy底下的触发和校验是否传输完成的过程如下:/*Manually trigger the EDMA*/(*TPCC_ESR)= 1<<(uiChannel);if(wait){/*wait for completion*/while(0==((*TPCC_IPR)&(1<<(uiChannel))));
/*clear completion flag*/(*TPCC_ICR)= 1<<(uiChannel);}
因为A-同步模式要BCNT*CCNT次同步,是因为这个手动触发EDMA只是一次同步嘛?
我其实改动了一下配置,让没完成一次TR传输就进一次中断,之后代码改成了如下:/*Manually trigger the EDMA*/(*TPCC_ESR)= 1<<(uiChannel);if(wait){while(tmp != num){/*wait for completion*/while(0==((*TPCC_IPR)&(1<<(uiChannel))));
tmp++;/*clear completion flag*/(*TPCC_ICR)= 1<<(uiChannel);
/*Manually trigger the EDMA*/(*TPCC_ESR)= 1<<(uiChannel);}}
这样确实是可以传输完成,但是我觉得这个方法好像不太对,而且很费时间,用EDMA就变得没什么必要了。

,

Nancy Wang:

user4257905 说: 因为A-同步模式要BCNT*CCNT次同步,是因为这个手动触发EDMA只是一次同步嘛? 我其实改动了一下配置,让没完成一次TR传输就进一次中断,之后代码改成了如下:

是的,如果是手动触发的话在A-同步模式就需要进行BCNT*CCNT次传输。

,

Shine:

看您之前的帖子,您是从fifo里搬数据吗?

,

user4257905:

是从内存数组里搬数据到FIFO里面,fifo输入接口是16bit,所以我就设成了目的地址的BIDX为0,ACNT为2字节,BCNT为要传输的总字节数bytecounts/2,但是发现触发了以后只发送了一个2字节,我以为这样设置好以后,触发一次就可以把所有的数据都传输过去的

,

user4257905:

我现在手动触发BCNT次是可以传过去的,但是我觉得太慢了,有别的方法可以快速的完成这种情况的数据的传输嘛?

赞(0)
未经允许不得转载:TI中文支持网 » C6657的EDMA3只传输了一个ACNT就停止传输了
分享到: 更多 (0)