我是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
。