疑问如题,已经阅读过e2echina.ti.com/question_answer/dsp_arm/c6000_multicore/f/53/t/108452?tisearch=e2e-quicksearch&keymatch=EDMA%20%E5%9B%9B%E5%88%86%E4%B9%8B%E4%B8%80这个帖子了,这个帖子的楼主也没回答到底解决没有。
还有一个帖子也读了,他是超过32767的限制才有问题,我这一共就船64个bytes,不会存在数量超过-32768~+32767的问题:
自己写的程序,按照C:\ti\edma3_lld_2_12_05_30E\examples\edma3_driver\src 这个例子里dma_test.c这里代码一点一点拷贝下来的,按理说应该是能正常运行的,可是看了下传输结果,只有4分之一传成功了,剩下的就报错了,配置如下(代码都是拷贝过来的,一个标点符号都没改...是不可能的,改了点,但是配置的东西还是拷贝的没变):
有个全局的变量声明:
#define MAX_ACOUNT (64u)
#pragma DATA_ALIGN(Data_in_DDR3, 4);
#pragma DATA_SECTION ( Data_in_DDR3 , ".mysection_in_ddr3");//这个我放到了DDR3里
Uint32 Data_in_DDR3[MAX_ACOUNT];
#pragma DATA_ALIGN(Data_in_MSM, 4);
#pragma DATA_SECTION ( Data_in_MSM , ".mysection_in_msm");//这个我放到了MSMCSRAM里
Uint32 Data_in_MSM[MAX_ACOUNT];
Uint32 *s_addr,*d_addr;
函数内部代码,配置部分:
if (edmaResult == EDMA3_DRV_SOK)
{
s_addr = Data_in_DDR3 ;
d_addr = Data_in_MSM ;
paramSet.srcAddr = (uint32_t)(s_addr);
paramSet.destAddr = (uint32_t)(d_addr);
aCnt = MAX_ACOUNT;//MAX_ACOUNT=64
bCnt = 1;
cCnt = 1;
paramSet.aCnt = aCnt;
paramSet.bCnt = bCnt;
paramSet.cCnt = cCnt;
paramSet.srcBIdx = MAX_ACOUNT;
paramSet.destBIdx = MAX_ACOUNT;
paramSet.srcCIdx = MAX_ACOUNT;
paramSet.destCIdx = MAX_ACOUNT;
paramSet.bCntReload = bCnt;
paramSet.linkAddr = 0xFFFFu;
paramSet.opt &= 0xFFFFFFFCu;//Source & Destination are in INCR modes
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);//Program the TCC
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
paramSet.opt &= 0xFFFFFFFBu;//syncType = EDMA3_DRV_SYNC_A
edmaResult = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
}
运行的时候看变量paramSet.opt的前4个bit都是0,那就代表着:
bit0:源Increment (INCR) mode,
bit1:目的Increment (INCR) mode,
bit2:A-synchronized,
bit3:0h = Set is not static,其他的没啥说的:最后打印的如下:edma3_test: Data write-read matchingFAILED at i = 16 ,这个16就是64的四分之一,刚开始用的256,到64就不对了,也是四分之一
改变最大数量,每次都只传四分之一,想了一上午没想通,有人遇到过类似的问题吗?附件是代码,想参考的可以拿去用。6318.Edma_No_Link.zip
继续修改程序,按照EDMA3 user's guide
的Figure 3-2. Block Move Example PaRAM Configuration的设置,依然只能传输四分之一数据,附带一个小提示,该文档有一个错误,如下图,红圈部分应该为0: