EDMA3数据传输 - TMS320C6678 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5315|回复: 8

[已解决] EDMA3数据传输

[复制链接]

5

主题

14

帖子

1076

积分

金牌会员

Rank: 6Rank: 6

积分
1076
发表于 2018-11-26 19:31:13 | 显示全部楼层 |阅读模式
本帖最后由 Leo_9824 于 2018-11-26 19:31 编辑

最近在调试EDMA3数据传输。传输路径是DDR3向MSM传输。发现数据总是不对。开始我用EDMA3CC1控制器,后来发现SPRS691E中有这么一句话:
EDMA3CC0 is optimized to be used for transfers to/from/within the MSMC and DDR-3 subsystems.The others are to be used for the remaining traffic.
我理解是只能用EDMA3CC0实现MSM和DDR3数据传输,然后改为CC0。但是数据依然不对。然后我改成EDMA3CC0 控制MSM和MSM之间数据传递,结果就对了。
DDR3和MSM之间数据传输应该用EDMA3CC0 还是EDMA3CC1?



回复

使用道具 举报

4

主题

188

帖子

1698

积分

禁止发言

积分
1698
发表于 2018-11-27 08:45:54 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

5

主题

14

帖子

1076

积分

金牌会员

Rank: 6Rank: 6

积分
1076
 楼主| 发表于 2018-11-27 09:10:37 | 显示全部楼层

谢谢您的答复,我还是想确认一下,有资料说明EDMA3CC0/1/2都可实现DDR3到MSM之间的数据传递只是吞吐率不同,EDMA3CC0更优。我想确认:EDMA3CC1/2可用于DDR3到MSM之间的数据传递么?
还有个问题:
我在测试时发现,DDR3到L2,MSM到MSM数据传输都没问题,但DDR3到MSM数据有时是乱码,有时没有,不知道是什么原因。
回复 支持 反对

使用道具 举报

0

主题

56

帖子

1394

积分

金牌会员

Rank: 6Rank: 6

积分
1394
发表于 2018-11-27 12:01:34 | 显示全部楼层
Leo_9824 发表于 2018-11-27 09:10
谢谢您的答复,我还是想确认一下,有资料说明EDMA3CC0/1/2都可实现DDR3到MSM之间的数据传递只是吞吐率不 ...

您好:
CC0被优化用于内部MSM和DDR3子系统之间的数据传输,CC1、CC2被用作系统外围设备和在系统存储器间移动数据等其他传输。
关于DDR3传输数据到MSM会出现乱码的问题,出现这种可能的原因比较多,我这边没有遇到这种问题,所以不太好判断具体是什么原因怎么造成的。
回复 支持 反对

使用道具 举报

5

主题

14

帖子

1076

积分

金牌会员

Rank: 6Rank: 6

积分
1076
 楼主| 发表于 2018-11-28 14:05:22 | 显示全部楼层
本帖最后由 Leo_9824 于 2018-11-28 15:56 编辑
wjz1 发表于 2018-11-27 12:01
您好:
CC0被优化用于内部MSM和DDR3子系统之间的数据传输,CC1、CC2被用作系统外围设备和在系统存储器间 ...

DDR3与MSM的EDMA3传输乱码问题可能是cache一致性导致的,还是有一些疑问,下面是我的源码:
void CacheInit() // 使能DDR3可cache
{    // L1pcache = 32k;
    // L1dcache = 32k;
    // L2cache = 128k;
    Cache_setMar((Ptr *)0x90000000, 0x00000020, Cache_Mar_ENABLE | Cache_PFX); //用于存放其他数据
    Cache_setMar((Ptr *)0x91000000, 0x00000020, Cache_Mar_ENABLE | Cache_PFX); //用于存放其他数据
}
void task()
{
   // ddr中写数据
   for(cnt=0;cnt<8192;cnt++)
  {
      *((Uint16 *)0x90000100+ 2*cnt)) = cnt*3+1;
      *((Uint16 *)0x91000100+ 2*cnt)) = cnt*2-1;
   }

   edma3Init();         // edma3 寄存器初始化
   edma3InterruptInit();// edma3 中断初始化
   edma3ParInit();      // edma3 PaRAM初始化

   while(1)
  {
//        Cache_inv((void *)Data1, 16384, Cache_Type_ALLD, TRUE);
//        Cache_inv((void *)Data2, 16384, Cache_Type_ALLD, TRUE);
           edma3Start(); // EDMA3启动
           while(irqRaised == 0u) // 等待EDMA3完成中断
          {
          }
          Cache_inv((void *)Data1, 16384, Cache_Type_ALLD, TRUE);
          Cache_inv((void *)Data2, 16384, Cache_Type_ALLD, TRUE);
        
          // 其他程序
  }        
}
问题1:当我屏蔽掉CacheInit()函数后导数据就正常了,但是CacheInit()中使能cache的地址范围是0x9000_0000~0x9000_0020,我操作数据的范围是0x9000_0100~0x9000_2000,为什么会有影响呢?
问题2:每次运行程序,使能DDR3 可Cache的情况下第一次运行数据都是错的,但是点击restart按钮后再运行数据就是对的,
问题3:我在完成EDMA3数据传输 前/后 执行Cache_inv(),没有任何作用。只要DDR3使能可缓存数据就是乱码。
问题4:Cache_inv()应该放在EDMA3完成数据传输后面吧?
麻烦您帮我分析一下,谢谢

备注:我每次都是在memory browser观察数据











回复 支持 反对

使用道具 举报

5

主题

14

帖子

1076

积分

金牌会员

Rank: 6Rank: 6

积分
1076
 楼主| 发表于 2018-11-28 15:55:03 | 显示全部楼层
Leo_9824 发表于 2018-11-28 14:05
DDR3与MSM的EDMA3传输乱码问题可能是cache一致性导致的,还是有一些疑问,下面是我的源码:
void CacheIni ...

问题有了新发现,我在配置cache时使能了128k L2cache。好像没有维护L2和MSM的cache一致性,我将L2 cache配置成0k 数据就对了(不确定是不是问题根源)。

Cache_inv();这个函数对L2和MSM的一致性不起作用么?
CACHE_invL2();是不是得用这个函数维护cache一致性?
回复 支持 反对

使用道具 举报

0

主题

56

帖子

1394

积分

金牌会员

Rank: 6Rank: 6

积分
1394
发表于 2018-11-28 15:55:49 | 显示全部楼层
Leo_9824 发表于 2018-11-28 14:05
DDR3与MSM的EDMA3传输乱码问题可能是cache一致性导致的,还是有一些疑问,下面是我的源码:
void CacheIni ...

您好:
建议排查下CacheInit()函数内容是否有问题。根据您总结的内容可判断是cache这部分导致出现乱码的现象,只需屏蔽CacheInit()函数,就不会出现乱码的现象。
回复 支持 反对

使用道具 举报

5

主题

14

帖子

1076

积分

金牌会员

Rank: 6Rank: 6

积分
1076
 楼主| 发表于 2018-11-28 15:59:17 | 显示全部楼层
wjz1 发表于 2018-11-28 15:55
您好:
建议排查下CacheInit()函数内容是否有问题。根据您总结的内容可判断是cache这部分导致出现乱码的现 ...

请看一下我前面回复内容,应该是L2 cache和MSM一致性问题,还有些疑问在前面回复中
回复 支持 反对

使用道具 举报

5

主题

14

帖子

1076

积分

金牌会员

Rank: 6Rank: 6

积分
1076
 楼主| 发表于 2018-11-30 10:15:48 | 显示全部楼层
本帖最后由 Leo_9824 于 2018-11-30 10:17 编辑
Leo_9824 发表于 2018-11-28 15:59
请看一下我前面回复内容,应该是L2 cache和MSM一致性问题,还有些疑问在前面回复中 ...

问题已解决,cache一致性导致的错误,通过memory browser勾选L1D L2发现的问题。DDR3写数据没写进去。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2024-3-29 10:27 , Processed in 0.052302 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表