学习到210的SDRAM初始化的时候,让我郁闷了两三天,啃上这么一大段技术鸡肠,着实让我“搔首踟蹰“相当郁闷,先是把SDRAM那一部分初始化的内容都给读了一遍,再结合uboot里面的代码,但是却是一头雾水,因为里面有很多内容讲的不清不楚,也没有相关提示,其实最大的障碍是SDRAM的初始化那一段不是很清楚,网上的资料也相当少,于是就开始了持续两天的摸索,在网上搜索相关资料,现在算是有了点小结果,在这里记录一下以便日后翻阅。
初始化的模块划分:
第一步 设置 DRAM Driver Strength(内存访问信号的强度)
第二步 初始化初始化 PHY DLL
第三步 初始化 DMC0
第四步 初始化 DDR2 DRAM
datasheet里的步骤没有设置 DRAM Driver Strength(内存访问信号的强度) ,因为使用默认的就可以
先贴上DATASHEET给出的初始化顺序:
1.2.1.3
DDR2
Initialization sequence for DDR2 memory type:
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 to clock frequency. Set the PhyControl0.ctrl_dll_on bit-field to ‘1’ to turn on the PHY DLL.
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.
4. Set the PhyControl0.ctrl_start bit-field to ‘1’.
5. Set the ConControl. At this moment, an auto refresh counter should be off.
6. Set the MemControl. At this moment, all power down modes should be off.
7. Set the MemConfig0 register. If there are two external memory chips, set the MemConfig1 register.
8. Set the PrechConfig and PwrdnConfig registers.
9. Set the TimingAref, TimingRow, TimingData and TimingPower registers according to memory AC parameters.
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.
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.
1-5
S5PV210_UM 1 DRAM CONTROLLER
15. Wait for minimum 400ns.
16. Issue a PALL command using the DirectCmd register.
17. Issue an EMRS2 command using the DirectCmd register to program the operating parameters.
18. Issue an EMRS3 command using the DirectCmd register to program the operating parameters.
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.
看不懂上面的英文的可以参考:http://blog.csdn.net/mutemob/article/details/12968565
我懒得再写上翻译这里贴上别人博客的1-12步的译文:
下面按步骤来做:
1.这一步是在芯片引脚XDDR2SEL上实现的而不是通过寄存器设置
2-13步都比较简单,查看相关寄存器的配置说明就应该没太大的障碍了,有了相关的翻译,初学者也应该很快可以配置好
接下来的14-25步的SDRAM有些就让人摸不着头脑了,因为说得不详细(因为详细了可就有的说了涉及的知识非常多,不过做的不好的就是没有提示在哪里可以得到相关资料),而且寄存器的配置说明讲额也不是很清楚
这些步骤主要是对寄存器DirectCmd的操作,贴上这个的寄存器的操作:
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必须设定为低。
A9 ~ A11定义了写恢复时间WR. 详细情况见下面的示意图:
从上面的表格就很清楚了,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)之后至少200s, 然后发布 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 复位”.
最后附上SDRAM初始化的参考资料地址http://wenku.baidu.com/view/4ee3d1d380eb6294dd886cf4.html,也希望这帖子可以帮到别人