Chinaunix首页 | 论坛 | 博客
  • 博客访问: 153349
  • 博文数量: 101
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 9
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-17 08:11
文章分类
文章存档

2017年(91)

2016年(10)

我的朋友

分类: 嵌入式

2017-03-08 14:42:53

原文地址:SDRAM配置方法说明 作者:1032120121

开发环境:自制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配置问题。
阅读(1026) | 评论(0) | 转发(0) |
0

上一篇:printk用法

下一篇:自己编译arm-linux-gcc

给主人留下些什么吧!~~