This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

c6655 DDR3 设置



您好,我们的原理图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

  • NM:bus-width 设置是32 bit 位宽
    和初始化不成功,布线都有关系。 ddr3 leveling做了吗?先降频试试。
  • 目前DDR3的频率是,1333Mhz,降频降到多少比较合适,谢先
  • 非常感谢您的回复,请问一下,SDCFG 寄存器的 IBANK_POS 位,再两片 MT41J128M16HA-15EIT下,我设置的 IBANK_POS = 0 是否正确?
    另外,降频降到多少比较合适,非常感谢!
  • DDR3 leveling 做了
  • 降到800MHz试试。
  • 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

  • 另外,我看STK 平台每次写数据之前,都将其转换成long long 类型,读的时候也是 long long 类型读出的,读写寄存器,与这有没有关系。