在飞思卡尔iMX31上,如何将SDRAM地址转换为CPU地址?

时间:2011-03-17 22:47:01

标签: assembly embedded arm microcontroller

我是iMX31和嵌入式系统的新手,请帮助我理解从SDRAM地址到ARM CPU地址的转换,特别是在SDRAM控制器的“特殊”命令模式下。

这是我遇到问题的SDRAM初始化代码:

    ldr r0, ESDCTL_BASE_W
    mov r2, #SDRAM_BASE_ADDR /* 0x80000000 */

    ldr r1, =0x92100000 /* Precharge */
    str r1, [r0]
    ldr r1, =0x0
    ldr r12, =0x80000F00
    str r1, [r12]

    ldr r1, =0xA2100000 /* Auto-refresh */
    str r1, [r0]
    ldr r1, =0x0
    str r1, [r2]

    ldr r1, SDRAM_0xB2100000 /* Load Mode Register */
    str r1, [r0]
    ldr r1, =0x0
    strb r1, [r2, #0x33]

    ldr r1, =0xFF
    ldr r12, =0x81000000

我的RAM是 Micron LPDDR MT46H64M32LF ,此代码很好地遵循初始化过程,但在 PRECHARGE 步骤中,地址0x80000F00即将到来从?

从iMX31参考手册中我了解到,在 PRECHARGE 步骤中,我需要将SDRAM引脚A10设置为HIGH,从而产生 PRECHARGE ALL 。以下是来自RM的 PRECHARGE 的文字:

  

...在此模式下,对SDRAM / LPDDR地址空间的访问(读或写)将产生预充电命令周期。 SDRAM / LPDDR地址位A10确定单个存储体或所有存储体是否由命令预充电。访问SDRAM / LPDDR地址A10为低电平的地址将仅对存储区地址选择的存储区进行预充电,如图19-75所示。相反,A10为高电平的访问将为所有存储区预充电,而不管存储区地址,...请注意,A10是SDRAM引脚,而不是A10位ARM地址总线。将SDRAM A10转换为相应的ARM地址取决于内存配置。

这是“特殊”模式下多路复用地址总线的另一个文本:

  

在“特殊”模式期间,例如,预充电模式(SMODE = 1)或加载模式寄存器(SMODE = 3)没有地址移位,意味着CPU地址A0在所有存储器宽度上映射到MA0。例如,为了驱动MA10位(对于precharge all命令),应该设置CPU A10位(对于16位或32位外部器件)。相同的逻辑对于加载模式寄存器命令有效,如第19.5.4.1节“SDRAM初始化”中的初始化例程示例所示。

根据上面的文字并假设A0是0x80000000的第一位,将A10设置为1应该给出地址0x80000400,而不是代码中的0x80000F00。为什么???有什么与DDR的特点有关吗?如何在SDRAM引脚和ARM CPU地址之间进行正确的转换?

更新:我在这里展示的代码片段应该与DDR一起使用。对于SDRAM,它实际上在 PRECHARGE 中使用0x80000400

0 个答案:

没有答案