各位好,
我就是进行了一下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次是可以传过去的,但是我觉得太慢了,有别的方法可以快速的完成这种情况的数据的传输嘛?