请问高手, 下面是代码,当FPGA用SRIO发送51MB的线性数到DSP的DDR。
通过内存窗口改变0x8ffffffc的值,控制 DSP去检测DDR数据。看是否为线性数据。我在内存窗口里面确实是收到了51MB的线性数。
但是调用verifyDat函数,在 “if(sum==nlength)”处加断点,然后发现DDR收到的51M数据发生改变,在51MB靠后的部分,全都是0,而前面部分数据,
要没有改变的,请问高手这是什么原因?
我的检测代码,并没有对DDR进行赋值操作,为什么DDR中的数据会发生改变??
void verifyDat();
int sum = 0;
main()
{
CACHE_setL1PSize(CACHE_L1_32KCACHE);
CACHE_setL1DSize(CACHE_L1_32KCACHE);
CACHE_setL2Size(CACHE_256KCACHE);
//…
KeyStone_SRIO_Init(&srio_cfg);
//….. *(volatile uint*)0x8ffffffc=0;
while(1)
{
asm(" NOP 20 ");
if((*(volatile uint*)0x8ffffffc))
{
sum = 0;
verifyDat();
}
}
}
void verifyDat()
{
uint * pSRc = (uint*)0x90000000;//DDR接收数据地址
int i = 0;
InvalidCache((void *)pSRc, 51*1024*1024);
int nlength = 51*1024*1024/4;
for(i=0; i<nlength; i++)
{
if(pSRc[i]!=i)
break;
else
sum++;
}
if (sum==nlength)
printf("\n succes \n");
else
printf("\n error \n");
for(i=0; i<nlength; i++)
{
pSRc[i] = 0;
}
}
jian zong1:
求,高手指点,这是怎么回事?DDR这么难用吗?
YUCHAO WANG:
回复 jian zong1:
你好:
我看了你的现象,你的过程涉及几个步骤,未必就是DDR的问题。
按我的经验,你需要这样排查问题:
第一步:检查自己的DDR是否配置正确,你可以在DSP上自己产生同样的一段数据写到DDR上,看是否能正确;
第二步:确定FPGA发数是否正确(这点很重要,后部是0很像是FPGA自己没发够数)
第三步:注意cache的一致性,把内存窗口的cache选项勾掉,看看内存里的数是不是0 另外,你如何知道收够51MB了?0x8ffffffc是FPGA写的还是别的什么机制写的?