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

EDMA3只能传输四分之一数据(SYSBIOS)

疑问如题,已经阅读过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=64bCnt = 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 modesparamSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);//Program the TCCparamSet.opt |= (1 << OPT_ITCINTEN_SHIFT);paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);paramSet.opt &= 0xFFFFFFFBu;//syncType = EDMA3_DRV_SYNC_AedmaResult = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);}

 

运行的时候看变量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就不对了,也是四分之一

改变最大数量,每次都只传四分之一,想了一上午没想通,有人遇到过类似的问题吗?附件是代码,想参考的可以拿去用。Edma_No_Link.zip

继续修改程序,按照EDMA3 user's guide 的Figure 3-2. Block Move Example PaRAM Configuration的设置,依然只能传输四分之一数据,附带一个小提示,该文档有一个错误,如下图,红圈部分应该为0:

Nancy Wang:

看配置暂时没有看出什么问题。
请问edma3_test: Data write-read matching FAILED at i = 16是查看目的地址没有收到数据还是只是与源地址不匹配?

Lucius Green:

回复 Nancy Wang:

这个打印内容是 example里的内容搬运过来的,源代码如下:C:\ti\edma3_lld_2_12_05_30E\examples\edma3_driver\src的dma_test.c的325行

for (i = 0; i < (acnt*bcnt*ccnt); i++){if (srcBuff1[i] != dstBuff1[i]){Istestpassed = 0u;printf("edma3_test: Data write-read matching" \"FAILED at i = %d\r\n", i);break;}}

我修改如下:

for (i = 0; i < (MAX_ACOUNT*1*1); i++){if (s_addr[i] != d_addr[i]){Istestpassed = 0u;platform_write("edma3_test: Data write-read matching" \"FAILED at i = %d\r\n", i);break;}}

所以我推断是用指针指向 数组里的内容,判断 收没收到数据的。目前就是没有头绪哪里导致到只有四分之一数据正确,paraSet.opt的bit3 STATIC 用0和1都试过,没有效果。

Nancy Wang:

回复 Lucius Green:

直接查看一下d_addr的数据可以看到吗?看看是没有收到数据还是是错误的数据。

Lucius Green:

回复 Nancy Wang:

查看过了,没有收到数据,原地址我写的是0-63,目的地址初始化的时候写的是63-0,DMA之后,0-15是传过去了,15位以后没变,就是数据没传过去。 修改了数据类型,用signed char可以传送56个,其他int和float ,uint32_t只能传递16个,这一定是错觉,这应该和数据类型没有关系。 将DMA修改为QDMA出现相同问题。 还在尝试修改其他变量来查找原因。

Nancy Wang:

回复 Lucius Green:

可否将完整的工程上传以及使用的SDK版本。

Lucius Green:

回复 Nancy Wang:

文件我放在附件,2个附近,一个是用CCS10.1版本做的,一个是用CCS9.3做的,

是用的模块:XDCtools 3.61.2.27  ,SYSBIOS 6.76.3.01 ,EDMA3 Low Level Driver edma3_lld_2_12_05_30E,MCSDK PDK TMS3320C6678 ,截图如下:

用的PLATFORM截图如下:

程序附件如下:10.1Edma3_Nolink_Test_V10dot1.zip

9.3:Edma_No_Link_CCS9dot3.zip

Lucius Green:

回复 Tony Tang:

解释通,原来不是配置的问题,我还在用C++的思想理解硬件,C++一个memory copy不管数据类型 直接copy,EDMA3里边也是不管数据类型,只不过需要用户自己计算类型Acount的关系。

Lucius Green:

回复 Lucius Green:

有进步,根据Tony的说法,修改了数据类型和Acount的比例关系,现在每次都能传递7/8的数据了,最后1/8的数据跑哪里去了还在找。

Lucius Green:

回复 Lucius Green:

问题已解决:

首先,是Tony说的问题,Acount对标的是字节数,而我用的int或者float类型,这个类型占用4个字节,需要调整Acount的数值。

其次,就是DATA_SECTION的应用问题,这个问题还没搞明白原理,一会再去找找文档看下,在我这个代码里:

//#pragma DATA_ALIGN(Data_in_DDR3, 4);
//#pragma DATA_SECTION ( Data_in_DDR3 , ".mysection_in_ddr3");
uint32_t Data_in_DDR3[16];#pragma DATA_ALIGN(Data_in_MSM, 4);
#pragma DATA_SECTION ( Data_in_MSM , ".mysection_in_msm");
uint32_t Data_in_MSM[16];

如果注释掉#pragma DATA_ALIGN(Data_in_DDR3, 4);和#pragma DATA_SECTION ( Data_in_DDR3 , ".mysection_in_ddr3"); 就能够正常跑完64个数据,如果打开注释的话,传递的数据就少于64个,具体少几个不清楚,我尝试这修改了几次结果如下:

float类型58/64 ,int 类型 8/16,14/16等。

推断:我的platform中将程序,数据的内从都设置成了DDR3,如下图:

本来数据就在DDR3中,再定义DATA_SECTION 的话会有问题?

感谢Nancy的长期跟踪和提示,感谢Tony的提醒和指正。

附件放上能正常使用的程序,上面的回帖内附件的程序是有问题的,请用这个:3175.Edma_No_Link.zip

赞(0)
未经允许不得转载:TI中文支持网 » EDMA3只能传输四分之一数据(SYSBIOS)
分享到: 更多 (0)