|
5#
楼主 |
发表于 2018-11-28 14:05:22
|
只看该作者
本帖最后由 Leo_9824 于 2018-11-28 15:56 编辑
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观察数据
|
|