嵌入式开发者社区

标题: EDMA3数据传输 [打印本页]

作者: Leo_9824    时间: 2018-11-26 19:31
标题: EDMA3数据传输
本帖最后由 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?




作者: tronlong-gxd    时间: 2018-11-27 08:45
提示: 作者被禁止或删除 内容自动屏蔽
作者: Leo_9824    时间: 2018-11-27 09:10
tronlong-gxd 发表于 2018-11-27 08:45
您好,是EDMA3CC0 。

谢谢您的答复,我还是想确认一下,有资料说明EDMA3CC0/1/2都可实现DDR3到MSM之间的数据传递只是吞吐率不同,EDMA3CC0更优。我想确认:EDMA3CC1/2可用于DDR3到MSM之间的数据传递么?
还有个问题:
我在测试时发现,DDR3到L2,MSM到MSM数据传输都没问题,但DDR3到MSM数据有时是乱码,有时没有,不知道是什么原因。
作者: wjz1    时间: 2018-11-27 12:01
Leo_9824 发表于 2018-11-27 09:10
谢谢您的答复,我还是想确认一下,有资料说明EDMA3CC0/1/2都可实现DDR3到MSM之间的数据传递只是吞吐率不 ...

您好:
CC0被优化用于内部MSM和DDR3子系统之间的数据传输,CC1、CC2被用作系统外围设备和在系统存储器间移动数据等其他传输。
关于DDR3传输数据到MSM会出现乱码的问题,出现这种可能的原因比较多,我这边没有遇到这种问题,所以不太好判断具体是什么原因怎么造成的。
作者: Leo_9824    时间: 2018-11-28 14:05
本帖最后由 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观察数据












作者: Leo_9824    时间: 2018-11-28 15:55
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一致性?
作者: wjz1    时间: 2018-11-28 15:55
Leo_9824 发表于 2018-11-28 14:05
DDR3与MSM的EDMA3传输乱码问题可能是cache一致性导致的,还是有一些疑问,下面是我的源码:
void CacheIni ...

您好:
建议排查下CacheInit()函数内容是否有问题。根据您总结的内容可判断是cache这部分导致出现乱码的现象,只需屏蔽CacheInit()函数,就不会出现乱码的现象。
作者: Leo_9824    时间: 2018-11-28 15:59
wjz1 发表于 2018-11-28 15:55
您好:
建议排查下CacheInit()函数内容是否有问题。根据您总结的内容可判断是cache这部分导致出现乱码的现 ...

请看一下我前面回复内容,应该是L2 cache和MSM一致性问题,还有些疑问在前面回复中
作者: Leo_9824    时间: 2018-11-30 10:15
本帖最后由 Leo_9824 于 2018-11-30 10:17 编辑
Leo_9824 发表于 2018-11-28 15:59
请看一下我前面回复内容,应该是L2 cache和MSM一致性问题,还有些疑问在前面回复中 ...

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




欢迎光临 嵌入式开发者社区 (https://51ele.net/) Powered by Discuz! X3.4