买了Smart210的板子,开始学习中,,,,,

今天看了重定位DRAM ,然而内存需要初始化,早上信心满满的我到现在崩溃的我。。。。也不知遭受了什么样的蹂躏 ,,还是记下一点学到的知识吧。。

数据手册上DDR类型的内存初始化步骤:

1. To provide stable power for controller and memory device, the controller must assert and hold CKE to a logic 
low level. Then apply stable clock. Note: XDDR2SEL should be High level to hold CKE to low.

2. Set the PhyControl0.ctrl_start_point and PhyControl0.ctrl_inc bit-fields to correct value according 
frequency. Set the PhyControl0.ctrl_dll_on bit-field to ‘1’ to turn on the PHY DLL.

//PHY Control0 Register (PhyControl0, R/W, Address = 0xF000_0018, 0xF140_0018) 
DMC0_PHYCONTROL0 = 0x00101002;

3. DQS Cleaning: Set the PhyControl1.ctrl_shiftc and PhyControl1.ctrl_offsetc bit-fields to correct value
according to clock frequency and memory tAC parameters. 
DMC0_PHYCONTROL0 = 0x00000086;

4. Set the PhyControl0.ctrl_start bit-field to ‘1’. 
DMC0_PHYCONTROL0 |= 1 << 0; 
while((MC0_PhyStatus & 0x07) != 0x07);

5. Set the ConControl. At this moment, an auto refresh counter should be off.

DMC0_CONCONTROL = 0x0FFF2010;

6. Set the MemControl. At this moment, all power down modes should be off.

// MemControl BL=4, 1Chip, DDR2 Type, dynamic self refresh, force precharge, dynamic power down off
DMC0_MEMCONTROL = 0x00202400;

7. Set the MemConfig0 register. If there are two external memory chips, set the MemConfig1 register.

// MemConfig0 256MB config, 8 banks,Mapping Method[12:15]0:linear, 1:linterleaved, 2:Mixed
DMC_MemConfig0 = 0X20F00313
DMC_MemConfig1 = 0X20F00313

8. Set the PrechConfig and PwrdnConfig registers. 
DMC0_PRECHCONFIG = 0xFF000000;
DMC0_PwrdnConfig = 0xFFFF00FF;

9. Set the TimingAref, TimingRow, TimingData and TimingPower registers according to memory AC parameters. 
DMC0_TimingAref = 0x00000618 ; //7.8us * 200MHz = 1560 = 0x0168
DMC0_ TimingRow = 0x2B34438A
DMC0_TimingData = 0x24240000; //DDR
DMC0_TimingPower = 0x0BDC0343;

10. If QoS scheme is required, set the QosControl0~15 and QosConfig0~15 registers. 
11. Wait for the PhyStatus0.ctrl_locked bit-fields to change to ‘1’. Check whether PHY DLL is locked.
while((DMC0_PhyStatus0 & 0x04) != 0x04);

12. PHY DLL compensates the changes of delay amount caused by Process, Voltage and Temperature (PVT) 
variation during memory operation. Therefore, PHY DLL should not be off for reliable operation. It can be off 
except runs at low frequency. If off mode is used, set the PhyControl0.ctrl_force bit-field to correct value 
according to the PhyStatus0.ctrl_lock_value[9:2] bit-field to fix delay amount. Clear the 
PhyControl0.ctrl_dll_on bit-field to turn off PHY DLL. 
13. Confirm whether stable clock is issued minimum 200us after power on 
14. Issue a NOP command using the DirectCmd register to assert and to hold CKE to a logic high level.
15. Wait for minimum 400ns.

16. Issue a PALL command using the DirectCmd register. 
DMC0_DIRECTCMD = 0x07000000;
DMC0_DIRECTCMD = 0x01000000; //PALL command

17. Issue an EMRS2 command using the DirectCmd register to program the operating parameters. 
DMC0_DIRECTCMD = 0x00020000;

18. Issue an EMRS3 command using the DirectCmd register to program the operating parameters. 
DMC0_DIRECTCMD = 0x00030000;

19. Issue an EMRS command using the DirectCmd register to enable the memory DLLs.

20. Issue a MRS command using the DirectCmd register to reset the memory DLL. 
21. Issue a PALL command using the DirectCmd register. 
22. Issue two Auto Refresh commands using the DirectCmd register. 
23. Issue a MRS command using the DirectCmd register to program the operating parameters without resetting 
the memory DLL. 
24. Wait for minimum 200 clock cycles. 
25. Issue an EMRS command using the DirectCmd register to program the operating parameters. If OCD 
calibration is not used, issue an EMRS command to set OCD Calibration Default. After that, issue an EMRS 
command to exit OCD Calibration Mode and to program the operating parameters. 
26. If there are two external memory chips, perform steps 14~25 for chip1 memory device.

27. Set the ConControl to turn on an auto refresh counter. 28. If power down modes is required, set the 
MemControl registers.

真的搞死了,后面的一点都不懂,先暂时stop吧,再看这真要崩溃了,,,,等学习一段之后再看看吧,下面的是搜的资料和原网址。。。。╮(╯▽╰)╭

接下来的14-25步的SDRAM有些就让人摸不着头脑了,因为说得不详细(因为详细了可就有的说了涉及的知识非常多,
不过做的不好的就是没有提示在哪里可以得到相关资料),而且寄存器的配置说明讲额也不是很清楚

cmd_type和cmd_chip 按照相关的命令设置就可以了,而后面的 cmd_bank cmd_addr 就说的不清不楚了,根本就不知道该如何配置,如:17. Issue an EMRS2 command using the DirectCmd register to program the operating parameters.,表中明明没有与EMSR2的命令啊!!
原来这几个项基本上是为MRS和EMRS这两个命令服务的,这两个命令操作这几个寄存器:模式寄存器(MSR)、扩展模式寄存器(1)(EMRS(1))、扩展模式寄存器(2)(EMRS(2))、扩展模式寄存器(3)(EMRS(3)),所以EMSR2命令其实是表示使用EMSR命令对扩展模式寄存器(2)进行操作,其他操作类似

编程(扩展)模式寄存器
为了增强使用灵活性, 突发长度, 突发类型, /CAS延迟, DLL 复位功能, 写恢复时间(WR) 都是可以定义的变量。通过预先编程模式寄存器就可以设定它们. 除
此之外, DLL 禁止功能, 驱动电阻, 附加 CAS 延迟, ODT(终结电阻), 单线选通, 和 OCD(片外驱动电阻调整) 同样也是可以定义的变量,通过预先编程扩展
模式寄存器就可以设定它们. 模式寄存器或者扩展模式寄存器的内容可以通过对他们进行重新设定来改变它们 .如果用户只是想改变寄存器中某些特定的位,
也必须通过MRS或EMRS命令对全部寄存器位进行重新设定。
MRS, EMRS和t DLL 复位这些命令并不会影响存储阵列的内容,这意味着上电后的任意时间执行初始化操作不会改变存储的内容 。(资料上的解释,了解一下)
到这里,应该可以猜测表中cmd_bank cmd_addr 这两栏的作用了,cmd_bank这栏决定了使用哪一个MRS和EMRS命令,如MRS、EMSR1或EMSR2或EMSR3;cmd_add这一项的每一位则对应了相应的设置,具体使用下面继续介绍。(参考了一份”DDR2 SDRAM操作时序规范“的资料,我才弄明白了这回事,下面有应用资料内容)

DDR2 SDRAM 模式寄存器设定 (MRS)
模式寄存器中的数据控制着 DDR2 SDRAM的操作模式.它控制着 CAS 延迟, 突发长度, 突发顺序, 测试模式, DLL复位, WR等各种选项,支持着 DDR2
SDRAM 的各种应用. 模式寄存器的默认值没有被定义, 所以上电之后必须按规定的时序规范来设定模式寄存器的值. 通过将 CS, RAS, CAS, WE, BA0 ,
BA1置低来发布模式寄存器设定命令, 操作数通过地址脚 A0 ~ A15同步送出. DDR2 SDRAM 在写模式寄存器之前,应该通过拉高CKE而完成了所有簇的裕充
电。模式寄存器设定命令的命令周期 (tMRD)必须满足完成对模式寄存器的写操作。在进行正常操作时,只要所有的簇都已经处于预充电完成状态,模式寄存
器都可以使用同一命令重新设定. 模式寄存器不同的位表示不同的功能. A0 ~ A2 设定突发长度是4还是8。 突发长度的译码规则与DDR SDRAM相同. A3定义
了突发地址顺序。A4 ~ A6定义了CAS延迟。. DDR2不支持半时钟延迟。 A7 设定测试模式. A8设定 DLL 复位。 对通常的 MRS操作,A7必须设定为低。

从上面的表格就很清楚了,BA2、BA1、BA0对应的是cmd_bank 栏,A15-A0则对应了cmd_addr ;

DDR2 SDRAM 扩展模式寄存器设定
EMRS(1)
扩展模式寄存器(1) 存储着激活或禁止DLL的控制信息, 输出驱动强度, ODT 值的选择 和附加延迟等信息. 扩展寄存器(1)的默认值没有被定义, 因此,
上电之后,扩展模式寄存器(1)的值必须按正确的步骤来设定。 写扩展模式寄存器(1)是通过拉低CS, RAS, CAS, WE ,置袄 BA0, 同时控制地址线
A0 ~ A13的状态。 在写扩展模式寄存器(1)之前,DDR2 SDRAM 应该通过将 CKE拉高完成所有簇的预充电。扩展模式寄存器(1)设定命令的命令周
期  (tMRD)必须满足完成对扩展模式寄存器(1)的写操作。在进行正常操作时,只要所有的簇都已经处于预充电完成状态,扩展模式寄存器(1)都可以使
用同一命令重新设定.. A0控制着DLL 激活或禁止。 A1被用于激活数据输出驱动能力为一半。A3~A5 决定着附加延迟, A2和 A6 用语 ODT 值的选定,
A7~A9 用于控制 OCD, A10 被用于禁止  DQS#, A11 被用于 RDQS 的激活。
DLL 激活/禁止
对通常的操作, DLL必须被激活。在上电初始化过程中,必须激活  DLL, 在开始正常操作时,要先关闭DLL。在进入自我刷新操作时,DLL会被自动禁止,
当结束自我刷新时,DLL会被自动激活。一旦 DLL被激活(随之将复位),为了使外部时钟和内部始终达到同步,在发布读命令之前必须至少要过200个
时钟周期。没有等待同步可能会导致tAC 或 tDQSCK参数错误。
EMRS(2)
扩展模式寄存器r(2)控制着刷新和相关的特性。扩展模式寄存器(2)的默认值没有被定义, 因此在上电后,必须按规定的时序对扩展模式寄存器 (2) 进行设定。通
过拉低S, RAS, CAS, WE,置高 BA1 拉低 BA0来发布扩展模式寄存器(2)的设定命令。同时控制地址线A0 ~ A15的状态. 在写扩展模式寄存器(2)之前,
DDR2 SDRAM 应该通过将 CKE拉高完成所有簇的预充电。扩展模式寄存器(2)设定命令的命令周期  (tMRD)必须满足完成对扩展模式寄存器(2)的写
操作。在进行正常操作时,只要所有的簇都已经处于预充电完成状态,扩展模式寄存器(2)都可以使用同一命令重新设定.

有了上面的知识提示,应该就可以比较没有障碍得对SDRAM进行初始化,资料中的SDRAM的初始化过程与DATASHEET里面的步骤基本相同,贴上来:

上电和初始化时序
1. 对于上电和初始化来说,下列时序是必须的。(应该说的是DATASHEET里面的第1步)
供电且保持CKE 低于 0.2*VDDQ , ODT*1 要处于低电平状态 (所有的其余脚可以都没有定义.) 电源上升沿不可以有任何翻转,上升沿时间不能大于 200mS;
并且要求在电压上升沿过程中满足, VDD>VDDL>VDDQ且 VDD-VDDQ<0.3 volts.
- VDD
*2, VDDL
*2 和 VDDQ必须由同一个电源芯片供电, 并且
- VTT 最大只能到 0.95 V, 并且
- Vref 要时刻等于 VDDQ/2.,紧跟VDDQ变化。
或者
-在给 VDDL上电的同时或之前就给VDD
*2
.上电
-在给  VDDQ上电的同时或之前就给VDDL
*2
上电
-在给VTT & VREF上电的同时或之前就给VDDQ上电.
上面的两个条件至少要满足一个。
2. 开始时钟信号并保持信号稳定.
3.在稳定电源和时钟(CK, /CK)之后至少200s, 然后发布 NOP 或者取消选定命令  &拉高CKE.
4. 等待至少 400ns然后发布预充电所有簇命令.在等待的400ns过程中要发布NOP或者取消选定命令.
5. 发布 EMRS(2)命令. (EMRS(2) 命令, 需要将 BA0拉低, 将 BA1拉高.)
6. 发布 EMRS(3) 命令. (为了发布EMRS(3)命令,将 BA0和 BA1拉高.)
7.发布 EMRS命令以激活 DLL. (为了发布"DLL激活" 命令,将 A0拉低, BA0拉高 并且将 BA1-2和 A13-A15置低.)
8. 发布MRS命令实现  “DLL复位”
*2.
(为了发布DLL 复位命令, 需要将 A8拉高 并使 BA0-1为低)
9. 发布预充电所有簇命令。
10. 至少发布两次自动刷新命令.
11. 将 A8拉低,发布模式寄存器设定命令(MRS)对芯片进行初始化操作. (也就是不对 DLL复位,编程芯片的操作参数)
12.在第8步之后至少过200个时钟周期,执行OCD 校准 ( 片外驱动电阻调校 ).
如果不使用OCD校准, EMRS OCD 校准模式结束命令 (A9=A8=A7=0) 必须在EMRS OCD默认命令 (A9=A8= A7=1)之后发布,用来设定EMRS的其它操
作参数。
13. 现在, DDR2 SDRAM 就准备好可以进行普通的操作了。.
*1) 为了保证 ODT关闭, VREF必须有效 并且 ODT脚必须拉低.
*2) 如果 VDDL或VDD 的电平值在正常操作过程中人为改变, (例如e, 为了 VDD 相交测试, 或者节省功率)
则必须执行“DLL 复位”.


DMC0_PRECHCONFIG = 0xFF000000;
DMC0_PWRDNCONFIG = 0xFFFF00FF; DMC0_TIMINGAREF = 0x00000618;
DMC0_TIMINGROW = 0x28233287;
DMC0_TIMINGDATA = 0x23240304;
DMC0_TIMINGPOWER = 0x09C80232;
DMC0_PHYSTSTUS0 = 0x4;//11 PHY DLL is locked DMC0_DIRECTCMD = 0x07000000;
DMC0_DIRECTCMD = 0x01000000;//所有板子预充电16
DMC0_DIRECTCMD = 0x00020000;
DMC0_DIRECTCMD = 0x00030000;
DMC0_DIRECTCMD = 0x00010400;
DMC0_DIRECTCMD = 0x00000542;
DMC0_DIRECTCMD = 0x01000000;//所有预充电21
DMC0_DIRECTCMD = 0x05000000;
DMC0_DIRECTCMD = 0x05000000;
DMC0_DIRECTCMD = 0x00000442;
DMC0_DIRECTCMD = 0x00010780;
DMC0_DIRECTCMD = 0x00010400;
DMC0_DIRECTCMD = 0x07100000;
DMC0_DIRECTCMD = 0x01100000;
DMC0_DIRECTCMD = 0x00120000;
DMC0_DIRECTCMD = 0x00130000;
DMC0_DIRECTCMD = 0x00110400;
DMC0_DIRECTCMD = 0x00100542;
DMC0_DIRECTCMD = 0x01100000;
DMC0_DIRECTCMD = 0x05100000;
DMC0_DIRECTCMD = 0x05100000;
DMC0_DIRECTCMD = 0x00100442;
DMC0_DIRECTCMD = 0x00110780;
DMC0_DIRECTCMD = 0x00110400; DMC0_CONCONTROL = 0x0FF02030;
DMC0_PWRDNCONFIG = 0xFFFF00FF;
DMC0_MEMCONTROL = 0x00202400; //DMC1
DMC1_PHYCONTROL0 = 0x00101000;
DMC1_PHYCONTROL0 = 0x00101002;
DMC1_PHYCONTROL1 = 0x86;
DMC1_PHYCONTROL0 = 0x00101003; while((DMC0_PHYSTATUS&0x7) != 0x7); DMC1_CONCONTROL = 0x0FFF2010;
DMC1_MEMCONTROL = 0x00202400;
DMC1_MEMCONFIG0 = 0x40E01323;
//DMC0_MEMCONFIG1 = 0x40F01323; DMC1_PRECHCONFIG = 0xFF000000;
//DMC0_PWRDNCONFIG = 0xFFFF00FF; DMC1_TIMINGAREF = 0x00000618;
DMC1_TIMINGROW = 0x28233287;
DMC1_TIMINGDATA = 0x23240304;
DMC1_TIMINGPOWER = 0x09C80232; DMC1_DIRECTCMD = 0x07000000;
DMC1_DIRECTCMD = 0x01000000;
DMC1_DIRECTCMD = 0x00020000;
DMC1_DIRECTCMD = 0x00030000;
DMC1_DIRECTCMD = 0x00010400;
DMC1_DIRECTCMD = 0x00000542;
DMC1_DIRECTCMD = 0x01000000;
DMC1_DIRECTCMD = 0x05000000;
DMC1_DIRECTCMD = 0x05000000;
DMC1_DIRECTCMD = 0x00000442;
DMC1_DIRECTCMD = 0x00010780;
DMC1_DIRECTCMD = 0x00010400;
DMC1_DIRECTCMD = 0x07100000;
DMC1_DIRECTCMD = 0x01100000;
DMC1_DIRECTCMD = 0x00120000;
DMC1_DIRECTCMD = 0x00130000;
DMC1_DIRECTCMD = 0x00110400;
DMC1_DIRECTCMD = 0x00100542;
DMC1_DIRECTCMD = 0x01100000;
DMC1_DIRECTCMD = 0x05100000;
DMC1_DIRECTCMD = 0x05100000;
DMC1_DIRECTCMD = 0x00100442;
DMC1_DIRECTCMD = 0x00110780;
DMC1_DIRECTCMD = 0x00110400; DMC1_CONCONTROL = 0x0FF02030;
DMC1_PWRDNCONFIG = 0xFFFF00FF;
DMC1_MEMCONTROL = 0x00202400;
)

最后附上SDRAM初始化的参考资料地址http://wenku.baidu.com/view/4ee3d1d380eb6294dd886cf4.html

http://www.ithao123.cn/content-8086727.html

http://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=480815

Smart210学习记录-------内存初始化的更多相关文章

  1. Smart210学习记录------块设备

    转自:http://bbs.chinaunix.net/thread-2017377-1-1.html 本章的目的用尽可能最简单的方法写出一个能用的块设备驱动.所谓的能用,是指我们可以对这个驱动生成的 ...

  2. Smart210学习记录-----SD/MMC/SDIO驱动

    转自:http://jingpin.jikexueyuan.com/article/23369.html http://blog.csdn.net/evilcode/article/details/7 ...

  3. Smart210学习记录-------linux内核模块

    Linux 驱动工程师需要牢固地掌握 Linux 内核的编译方法以为嵌入式系统构建可运行的Linux 操作系统映像.在编译 LDD6410 的内核时,需要配置内核,可以使用下面命令中的 一个: #ma ...

  4. Smart210学习记录------linux串口驱动

    转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=27025492&id=327609 一.核心数据结构 串口驱动有 ...

  5. Smart210学习记录-----Linux i2c驱动

    一:Linux i2c子系统简介: 1.Linux 的 I2C 体系结构分为 3 个组成部分: (1) I2C 核心. I2C 核心提供了 I2C 总线驱动和设备驱动的注册.注销方法,I2C 通信方法 ...

  6. Smart210学习记录------paltform总线

    转自http://blog.csdn.net/xiaochongtou123/article/details/7752328 1.概述: 通常在Linux中,把SoC系统中集成的独立外设单元(如:I2 ...

  7. Smart210学习记录-------Linux设备驱动结构

    cdev结构体 1 struct cdev { 2 struct kobject kobj; /* 内嵌的 kobject 对象 */ 3 struct module *owner; /*所属模块*/ ...

  8. Yii2的相关学习记录,初始化Yii2(二)

    前面已经将Yii2下载下来了,那我们就需要能实际的使用. 一.初始化,因为我都是在windows系统下,所以用cmd命令打开下载下来的Yii2的根目录.然后运行下面命令: init 会提示选择0为开发 ...

  9. Smart210学习记录-----linux定时器

    1.内核定时器: Linux 内核所提供的用于操作定时器的数据结构和函数如下: (1) timer_list 在 Linux 内核中,timer_list 结构体的一个实例对应一个定时器 1 stru ...

随机推荐

  1. Anysys Fluent安装教程

    按顺序按照在一个文件夹内D:\Anysys Fluent 1:安装Exceed      调整电脑时间至2005年(前辈经验)      点击解压好的Exceed.13.[x86+x64]文件夹中的M ...

  2. HTML5 视频规范简介

    HTML5 视频规范简介  创建于 2013-02-03, 周日 00:56  作者 白建鹏 HTML 一词是“超文本标记语言”(Hyper-Text Markup Language)的缩写,是用于描 ...

  3. LevelDb简单介绍和原理——本质:类似nedb,插入数据文件不断增长(快照),再通过删除老数据做更新

    转自:http://www.cnblogs.com/haippy/archive/2011/12/04/2276064.html 有时间再好好看下整个文章! 说起LevelDb也许您不清楚,但是如果作 ...

  4. PHP换行符详解 PHP_EOL,<br />

    1.PHP_EOL:用于文本的换行符,经常用于日志文件记录.可以解决: 在windows中\r\n是换行在Mac中\r是换行在Liunx中\n是换行 不统一的问题. 2. <br /> : ...

  5. FLASH AS 不显示中文

    我修改一个as游戏,发现公告显示不了,整整折腾了2天. flash TextField 汉字不显示,英文会显示,如果是汉字夹杂数字,只把数字显示了,汉字被忽略了.   有人说嵌入字体,网上一搜索,好麻 ...

  6. hdu 4612 Warm up

    http://acm.hdu.edu.cn/showproblem.php?pid=4612 将原图进行缩点 变成一个树 树上每条边都是一个桥 然后加一条边要加在树的直径两端才最优 代码: #incl ...

  7. C++定义构造函数必须使用初始化列表的场合

    明其理,而知其然也. 先给理论.1. 初始化 != 赋值. a.初始化代表为变量分配内存. 变量在其定义处被编译器初始化(编译时). 在函数中, 函数参数初始化发生在函数调用时(运行时). b.赋值代 ...

  8. IBatis.Net 表连接查询(五)

    IBatis.Net之多表查询: 一.定制实际对应类的方式 首先配置多表的测试数据库,IBatis.Net之Oracle表连接查询配置: 首先新建两张表如下: 为两张表建立外键: ALTER TABL ...

  9. 从ajax获取的数据无法通过Jquery选择器来调用事件

    如果标签是动态生成的,比如说div.tr.td等,若需通过Jquery来获取事件,那么需要用live来绑定相应的事件. 比如说绑定div的click事件 $("div").live ...

  10. java中的日志组件-log4j

    1.为什么使用日志组件 Log4J是Apache的一个开放源代码项目,它是一个日志操作包,通过使用Log4J,可以指定日志信息输出的目的地,如控制台.文件.CUI组件.NT的事件记录器:还可以控制每一 ...