开发环境:自制E1_AMC板卡,cpu为LPC2468,SDRAM为mt48lc16m16a2,4M*16bit*4banks,Demo板SDARAM为ds_k4s56xx32h,4M*16bit*4banks。两个板卡cpu均选择16bit databus。
配置方法 :
(1)参照SDRAM datasheet,正确设置cpu的动态存储器控制器EMC的时间寄存器;
(2)正确选择EMC的行列地址寄存器,因为不同的行列地址模式处理器芯片对应不同的工作模式;
(3)每种SDRAM都有其模式寄存器初始化方法,但几乎都相同,可以互相参考。拿mt48lc16m16a2举例,
如18页fugere7 MODE REGISTER DEFINATION所示,SDRAM行地址A12~A0必须在初始化期间输出0x33用于配置SDRAM模式寄存器的Burst Length(burst length配置后,SDRAM会根据地址线数值提供给cpu一定大小的存储空间供访问,如1byte,2byte,4byte等)等,但行地址A12~A0与存储区地址不是一一对应的,cpu负责将程序使用的存储器地址解析成行列地址并输出到地址线上(行列地址复用,列地址为A8~A0),所以此处的初始化值0x33还需要进行cpu特有的移位,以保证能够在行地址上输出模式寄存器需要的值,模式寄存器配置后SDRAM可使用。
配置语句如 dummy = *((volatile unsigned int*)(SDRAM_BASE_ADDR | (0x33 << 12)));
此处为什么左移12bit未知?
(4)模式寄存器初始化的时间以及整个SDRAM初始化的顺序可以参见56页figure36 Initialize and load mode register的初始化时序图。图中load mode register清晰指出模式寄存器初始化的时间,再此之前需要手动刷新SDRAM,即不断配置dynamic memory refresh timer register,等到芯片激活且进行入nomal模式后,自动刷新寄存器auto-refresh period register才起作用。
此处结合现有的cpu和sdram给出参考的配置顺序是:
send command NOP->Send command: PRECHARGE-ALL->refresh->连续nop指令->refresh->configure mode register->读对应的行地址->send command normal
解决的问题:之前由于注销掉了"读对应的行地址"操作,出现了对SDRAM进行16bit和8bit连续读写正确,对以跨越0x40倍数的地址进行32bit读写操作出现错误,但在每个0x40倍数的边界之内连续读写正确的奇怪现象,今天终于解决了该bug,并且理解了从上学时就十分头痛的SDRAM配置问题。
阅读(5869) | 评论(0) | 转发(2) |