您好,我们的原理图C6655 芯片,链接了两片 MT41J128M16HA-15EIT DDR3 芯片,这样的话 SDCFG 寄存器中的
NM:bus-width 设置是16 bit 位宽,还是32 bit 位宽?单个芯片是16 bit width。
我们遇到问题,DDR3 memory 写值后,读出的值与写入的值不一致。
有时候,写入的值只地位变化,高位出现一个固定值,比如,我在0x8000 0000 写入 0,写入后显示,0x0400 0000,写入1 ,显示0x0400 0001,这是什么原因造成的?
是初始话不成功,还是布板,走线,有问题?
谢谢!
BRS,
Meng
Shine:
NM:bus-width 设置是32 bit 位宽
和初始化不成功,布线都有关系。 ddr3 leveling做了吗?先降频试试。
Lingcon Meng:
回复 Shine:
目前DDR3的频率是,1333Mhz,降频降到多少比较合适,谢先
Lingcon Meng:
回复 Shine:
非常感谢您的回复,请问一下,SDCFG 寄存器的 IBANK_POS 位,再两片 MT41J128M16HA-15EIT下,我设置的 IBANK_POS = 0 是否正确?
另外,降频降到多少比较合适,非常感谢!
Lingcon Meng:
回复 Shine:
DDR3leveling 做了
Shine:
回复 Lingcon Meng:
降到800MHz试试。
Lingcon Meng:
回复 Shine:
Hello Shine,
谢谢您的回复。
重新check了设置参数。BUS_Width设置成32 bit宽,STK自带DDR3测试程序可以正常通过。也就是DDR_quick_test() 可以正常测试通过。
但是我们自己写了一段代码如下,先写进去,然后读出来。
long long i;
#define LEN (512*1024*1024)
volatile unsigned int *startAddr
//write value to DDR3
startAddr = (unsigned int *)0x80000000;
for(i=0;i<(LEN>>2);i++)
{
*startAddr++ = i;
}
我单步跟踪,写进去的值是对的,等写完所有数据,打算再读的时候,这个时候发现其内容改变了,
0x8000 0000的地址写进去的值是0,但是这个时候显示值是 0x0400 0000,写进去的值是 1,这时候显示的值是 0x0400 0001
以此类推。
但是到i的值大于 0x04ff ffff 以后,也就是0x84ff ffff以后的地址,值是正常的,由于0x0500 0000 把那个高位 0x04XX XXXX 的值给覆盖了。
所以重新再读的时候,读出来的结果与写进去的值不一致。验证不能通过。
问题:
1)如果这个函数DDR_quick_test() 测试通过,是否代表DDR3测试通过,DDR可以正常使用。
2)我们自己写的程序,从逻辑上应该没有任何问题,具体不能过的原因是什么? 是否与 逻辑地址与物理地址有关系,地址需要转换,我们这儿没有处理?(一个地址是32 bits 一个是36 bits)
另外,根据你的建议,降频后,测试效果一样。
非常感谢!
BRS,
Meng
Lingcon Meng:
回复 Shine:
另外,我看STK 平台每次写数据之前,都将其转换成long long 类型,读的时候也是 long long 类型读出的,读写寄存器,与这有没有关系。