DDR2 软件设计规范
编制日期 2026-10-05 | 版本号 Rev 1.4
面向 1 Gb ×16 DDR2-800 SDRAM(FBGA-84,CL5)的控制器驱动设计约定 —— 覆盖 上电初始化 18 步、模式寄存器 MR / EMR / EMR2 / EMR3、Posted CAS 与 RL / WL 延迟链、 刷新与温度补偿、OCD 校准、ODT 与端接、掉电与休眠,逐条给出可落地的命令序列、时序门限与状态判据。
| 文档编号 | DDR2-SW-SPEC-001 |
|---|---|
| 版本 / 状态 | V1.0 · 正式发布 |
| 适用器件 | DDR2-400 / 533 / 667 / 800 / 1066 SDRAM,x8 / x16,FBGA-60 / FBGA-84 / TSOP-66 及 DDR2 SODIMM / UDIMM 模组 |
| 参考标准 | JEDEC JESD79-2(DDR2 SDRAM Specification)· 各厂商器件 datasheet 的 Mode Register Definition 与 Address Table |
| 配套文档 | DDR2_电路设计指南.html(硬件 / 原理图 / 端接 / 布线约束) |
0. 目的与范围
本规范约束 DDR2 器件在嵌入式 / SoC 内存控制器中的软件行为:上电初始化序列、模式寄存器配置、读 / 写 / 刷新命令时序、OCD 校准、ODT 开关、低功耗与休眠、异常恢复。凡本文与器件 datasheet 冲突,以 datasheet 为准。
- 统一初始化序列:电源稳定 → CKE 拉高 → PREA → EMR2 → EMR3 → EMR(DLL 使能) → MR(DLL 复位) → PREA → REF×2 → MR(解除复位) → OCD → tDLLK → ZQCL,固化一套 18 步流程。
- 统一寄存器配置:CL / BL / WR / AL / Rtt / OCD / DLL 全部通过 MRS / EMRS 写入;MR 默认值未定义,必须四个寄存器全部显式初始化。
- 统一刷新策略:以 tREFI 为节拍发 Auto Refresh;DDR2 没有自动温度补偿,超过 85 ℃ 必须由软件置 EMR2 的 A7(SRF)或把刷新间隔减半。
- 统一低功耗路径:空闲进 Precharge Power-Down,休眠进 Self Refresh,明确进入前必先 PREA、退出后必等 tXSRD。
一句话结论:DDR2 是「命令驱动、时钟双边沿、4n 预取、树形拓扑、没有硬件复位脚」的器件 ——
所有读写都要先 ACT 打开行,再发 RD/WR;读数据在 AL+CL 个周期后出现,写数据只要 AL+CL−1 个周期;
没有 DLL 复位与 tDLLK 等待的读、没有 OCD/ZQ 校准的驱动阻抗、没有按温度缩短的 tREFI、没有 PREA 就进的自刷新,都会让系统表现为偶发位错甚至完全无法训练。
文档使用说明
- 本文是《DDR2 电路设计指南》的软件配套篇:硬件篇解决「怎么接、怎么供电、怎么端接、怎么走线」,本文解决「控制器怎么初始化、命令怎么发、时序怎么等、低功耗怎么进」。
- 命令码、寄存器位、时序值取自 JEDEC JESD79-2 通用约定与本系列《DDR2 电路设计指南》;不同厂商、不同容量、不同后缀的器件在保留位、页容量、bank 数上存在差异,移植前必须逐条核对目标料号 datasheet。
- 文中 C 代码为协议骨架伪代码,演示流程与判断条件,非特定平台可直接编译的完整实现;
ddr_cmd()、now_ns()等为平台相关底层。 - 数值以 DDR2-800(tCK = 2.5 ns)为默认算例,其它速率档的折算值见附录 B.2。
① MR 默认值未定义,上电必须完整写一遍 MR / EMR / EMR2 / EMR3——不能「只改要用的位」,MRS 必须按 BA 整寄存器重写; ② 任何 DLL 复位后必须等 tDLLK = 200 × tCK 才能发读命令——未满足就读,tDQSCK / tAC 违例; ③ DDR2 没有温度自动补偿(无 SRT / ASR)——刷新率必须由软件按实测壳温切换; ④ DDR2 没有 RESET 引脚、没有 write leveling——异常恢复只能靠 CKE 掉电或重新初始化,写方向偏斜只能靠 PCB 等长。
1 · 器件定位与阵列组织
DDR2 不是「即插即用的 SRAM」。它有 4~8 个 Bank、行 / 列分离的地址、4n 预取、片内 ODT、Posted CAS,且所有功能靠 MRS / EMRS 配置。软件设计的第一件事,是把「地址空间」「突发粒度」和「刷新节奏」搞清楚。
1.1 器件定位与关键参数
数据取自《DDR2 电路设计指南》§1.1 代际规格对比与 §1.3 关键电气参数;最终以目标料号 datasheet 为准。
| 项目 | 参数 | 软件影响 |
|---|---|---|
| 组织 | 64M × 16(1 Gb 示例) | x16 接口,DQ[15:0] 双字节通道 |
| Bank 地址 | BA0~BA1(4 bank)/ BA0~BA2(8 bank) | 必须按料号核对;误把 BA2 接成 A14 会容量识别错误 |
| 行地址 (Row) | A0~A12 / A0~A13 / A0~A14 | 随容量变化;ACT 命令期间送出 |
| 列地址 (Col) | A0~A8(256Mb/512Mb)/ A0~A9(1 Gb 起) | 决定页容量;A10 在 RD/WR 中兼作 Auto-Precharge |
| 页尺寸 / 突发 | 1 KB / 2 KB ;BL = 4 或 8 | 一次 BL8 突发搬 8 × 16bit = 16 B |
| 速度档 | DDR2-400/533/667/800/1066 | 决定 CL / AL / WR / tCK,MRS 必须据此配 |
| 温度等级 | 商用 0~85 ℃ / 工业 −40~95 ℃ | 决定 tREFI 倍率与 EMR2 的 SRF 位 |
| 复位脚 | 无 RESET# | 异常恢复只能靠 CKE 掉电或完整重新初始化 |
1.2 阵列组织与地址映射
DDR2 的地址在命令中分时复用,软件最容易在这里出错:ACT 命令送行地址,RD/WR 命令送列地址,BA 选择 Bank。
| 地址类型 | 位宽 | 出现在哪些命令 | 含义 |
|---|---|---|---|
| Bank 地址 BA[2:0] | 2 或 3 bit | ACT / RD / WR / PRE / MRS / EMRS | 选择 Bank;MRS / EMRS 用 BA1:BA0 选 MR / EMR(1) / EMR(2) / EMR(3) |
| 行地址 Row | A0~A12 / A13 / A14 | ACT | Bank 内行号;打开到行缓冲(页) |
| 列地址 Col | A0~A8 / A0~A9 | RD / WR | 页内偏移;A10 = 1 触发 Auto-Precharge |
| A10(模式位) | 1 bit | PRE / ZQCL / ZQCS | PRE 时 A10=1 即 Precharge All;ZQCL / ZQCS 也靠 A10 区分 |
DDR2 的页容量 = 列数 × 位宽 / 8。256 Mb / 512 Mb 的 x16 料号列地址常为 A0~A8(512 列 → 1 KB 页),1 Gb 及以上常扩展到 A0~A9(1024 列 → 2 KB 页)。这一差异还会连带影响 tRRD(1 KB 页取 7.5 ns,2 KB / 4 KB 页取 10 ns)。本系列《DDR2 电路设计指南》表格中 x16 多标注 1 KB,属按料号而定的口径,软件配置 tRRD / tFAW 前必须用目标料号的 Address Table 逐项核实。
DDR2 内核一次读出 4 × 位宽的数据送进 I/O 锁存器,再由 CK 上下沿分 4 次(2 个 CK 周期)送出。因此 DDR2 取消了 BL = 2,只支持 BL = 4 与 BL = 8;这是与 DDR(2n 预取)最直观的协议差异,也是「按字节写」必须靠 DM 屏蔽或突发截断的原因。
1.3 引脚与信号分组
FBGA-84(x16)的关键信号分组如下,软件 / 控制器需按组管理:
| 分组 | 信号 | 方向与功能 |
|---|---|---|
| 时钟 | CK / CK#,CKE | 差分时钟 + 时钟使能;CKE 低电平进入掉电 / 自刷新,上电初始化期间必须为低 |
| 命令 | CS#,RAS#,CAS#,WE#,ODT | 命令译码;ODT 高电平打开片内端接(只作用于 DQ / DQS / DM) |
| 地址 | BA0~BA2,A0~A13/14,A10/AP | Bank / 行 / 列复用;A10 兼作 Precharge All 与 ZQCL / ZQCS 模式位 |
| 数据 | DQ[15:0],LDQS/LDQS#,UDQS/UDQS#,LDM/UDM | 16 bit 双向数据 + 两组字节选通 + 写数据掩码 |
| 参考 / 校准 | ZQ,VREF | ZQ 外接 240 Ω ±1% 提供 OCD / ODT 校准基准(部分 FBGA-60 不引出);VREF = VDDQ/2 |
| 复位 | 无 | DDR2 没有 RESET# 引脚——这是与 DDR3 / DDR4 在软件恢复路径上的根本差异 |
1.4 树形拓扑与「无 fly-by、无 write leveling」
DDR2 的地址 / 命令 / 时钟采用树形(对称 T 分支)拓扑,而不是 DDR3 起的 fly-by 菊花链。这个拓扑选择直接决定了三条软件约束:
2 · 术语与缩写
DDR2 的命令与寄存器术语量大,且不少名词与 DDR3 同名但含义不同。这里按「命令 / 寄存器」与「时序 / 延迟」两组列出,后续章节直接引用。
2.1 命令与寄存器术语
| 术语 | 全称 / 含义 | 软件关注点 |
|---|---|---|
| ACT | Activate —— 打开指定 Bank 的某一行到行缓冲 | 读 / 写前必须 ACT;受 tRCD 约束 |
| RD / RDA | Read / Read with Auto-precharge(A10 = 1) | RDA 在突发结束后自动 PRE 该行 |
| WR / WRA | Write / Write with Auto-precharge(A10 = 1) | 受 tWR 与 tDAL 约束 |
| PRE / PREA | Precharge / Precharge All(A10 = 1) | 关闭行并写回;受 tRP 约束 |
| REF | Auto Refresh —— 内部刷新若干行 | 周期发,受 tRFC / tREFI 约束 |
| SRE / SRX | Self Refresh Entry / Exit | 进入前必须 PREA;退出后必须等 tXSRD = 200 tCK |
| MRS / EMRS | Mode Register Set / Extended MRS | BA1:BA0 选寄存器;受 tMRD = 2 tCK 约束 |
| ZQCL / ZQCS | ZQ 长校准 / 短校准(A10 = 1 / 0) | DDR2 的阻抗基准校准;128 tCK / 64 tCK |
| OCD | Off-Chip Driver Calibration —— 片外驱动校准 | DDR2 特有;EMR 的 A9:A7 控制,必须按进入 / 退出规范完成 |
| DES / NOP | Device Deselect / No Operation | 初始化与等待窗口的填充命令 |
| PDE / PDX | Power-Down Entry / Exit | CKE 拉低进入;退出需 tXP = 2 tCK(快速退出) |
2.2 时序与延迟术语
| 术语 | 含义 | DDR2-800 典型值 |
|---|---|---|
| CL | CAS 读延迟,RD → 第一个数据出现 | 5 tCK(可选 6) |
| AL | Additive Latency,Posted CAS 附加延迟 | 4 tCK(推荐 AL = CL − 1) |
| RL | 读延迟 = AL + CL | 9 tCK |
| WL | 写延迟 = AL + CL − 1 | 8 tCK(比 RL 少 1 拍) |
| BL | 突发长度,4 或 8 | 8(BL8) |
| WR | 写恢复 = ceil(tWR / tCK),写 MR 的 A11:A9 | 6(15 ns / 2.5 ns) |
| tRCD | ACT → RD / WR | 12.5 ns / 5 tCK |
| tRP | PRE → ACT | 12.5 ns / 5 tCK |
| tRAS / tRC | ACT → PRE / 同 Bank ACT → ACT | 45 ns / 57.5 ns |
| tRFC | 单次 Auto Refresh 周期(随密度) | 127.5 ns(1 Gb) |
| tREFI | 平均刷新间隔 | 7.8 µs(≤85 ℃)/ 3.9 µs(>85 ℃) |
| tDLLK | DLL 锁定时间 | 200 tCK = 500 ns |
| tMRD | 两次 MRS / EMRS 最小间隔 | 2 tCK |
| tINIT1 / tINIT2 | 上电等待 / CKE 拉高后等待 | 200 µs / 400 ns |
| tAOND / tAOFD | ODT 引脚拉高 → 生效 / 拉低 → 关闭 | 2 tCK / 2.5 tCK |
| tXSRD / tXSNR | 自刷新退出到读 / 到非读命令 | 200 tCK / tRFC + 10 ns |
3 · 控制器架构与初始化
DDR2 的初始化是整份规范里最不容出错的一段:18 个步骤、4 个模式寄存器、DLL 复位与锁定、OCD 校准、ZQCL,任意一步跳过都可能表现为「能读能写但偶发错」。
3.1 分层职责
| 层级 | 职责 | 本文覆盖 |
|---|---|---|
| 应用层 / OS | 分配内存、缓存一致性、页表 | 不涉及 |
| 驱动层 | 按速度档填时序寄存器、发初始化序列、刷新调度、温度策略 | 本文主体 |
| 控制器(DDRC) | 命令译码、Bank 调度、仲裁、自动刷新计时、ODT 引脚时序 | 配置约定与门限 |
| PHY 层 | DQS gating、读捕获延时线、写方向相位、IO 驱动 | 训练接口约定 |
| 硬件 / PCB | 端接、VREF、VTT、等长、去耦 | 见《DDR2 电路设计指南》 |
3.2 上电初始化 18 步
下列序列依据 JEDEC JESD79-2,最终以主控 DDR 控制器设计指南与目标料号 datasheet 为准。
// DDR2 SDRAM 上电初始化序列(JESD79-2)
//
// 1 VDD / VDDQ / VDDL 同时上电,斜率单调;VREF 跟随 VDDQ/2;VTT 不先于 VDDQ 建立
// 2 CKE 保持低电平(≤ 0.2 × VDDQ),ODT 保持无效
// 3 电源稳定后等待 tINIT1 = 200 µs (对比:DDR3 为 500 µs)
// 4 CK/CK# 必须在 CKE 拉高前已稳定翻转 ≥ 10 ns(或 5 × tCK,取大者)
// 5 CKE 拉高,发 NOP / DESELECT,等待 tINIT2 = 400 ns
// 6 PRECHARGE ALL (A10 = 1,BA = X)
// 7 EMRS(EMR2):BA[1:0] = 10,A[12:0] = 0x000 // 常规温区;高温用 0x080
// 8 EMRS(EMR3):BA[1:0] = 11,A[12:0] = 0x000 // 保留位全部清零
// 9 EMRS(EMR) :BA[1:0] = 01,A0 = 0 // 使能 DLL
// 10 MRS(MR) :BA[1:0] = 00,A8 = 1 // DLL 复位,同时写 CL / BL / WR
// 11 PRECHARGE ALL
// 12 AUTO REFRESH × 2(间隔 ≥ tRFC;部分器件要求 8 次)
// 13 MRS(MR) :A8 = 0 // 解除 DLL 复位,写入最终 CL / BL / WR
// 14 EMRS(EMR) :A[9:7] = 111 // OCD 默认值
// 15 EMRS(EMR) :A[9:7] = 000 // OCD 退出,保持校准结果
// [可选] 完整 OCD:Drive(1)=001 → Drive(0)=010 → Adjust=100 → Exit=000
// 16 等待 tDLLK = 200 × tCK 完成 DLL 锁定(DDR2-800 = 500 ns)
// 17 [推荐] ZQCL(A10 = 1),等待 tZQCL ≥ 128 × tCK(DDR2-800 = 320 ns)
// 18 进入正常操作,按 tREFI ≤ 7.8 µs(≤ 85 ℃)周期性发 AUTO REFRESH
static int ddr2_init(const struct ddr2_cfg *cfg)
{
/* 1~2:电源与 CKE 由硬件 / PMIC 保证,驱动先断言状态 */
ddr_cke_low(); /* CKE ≤ 0.2 × VDDQ */
ddr_odt_disable();
/* 3~5:上电等待与时钟稳定 */
wait_us(200); /* tINIT1 */
clk_enable_ddr(cfg->ck_mhz); /* 差分 CK 起振 */
wait_ns(max(10, 5 * cfg->tck_ns)); /* CK 稳定 ≥ 10 ns */
ddr_cke_high();
ddr_cmd(NOP);
wait_ns(400); /* tINIT2 */
/* 6:全部预充电 */
ddr_cmd(PREA); /* A10 = 1 */
wait_ns(cfg->trp_ns);
/* 7~9:EMR2 → EMR3 → EMR(DLL 使能),每步间隔 tMRD */
ddr_mrs(BA_EMR2, 0x000); wait_tMRD(cfg);
ddr_mrs(BA_EMR3, 0x000); wait_tMRD(cfg);
ddr_mrs(BA_EMR1, emr1_value(cfg, /*dll_en=*/1));
wait_tMRD(cfg);
/* 10:MR 写 DLL 复位 + CL / BL / WR */
ddr_mrs(BA_MR, mr_value(cfg, /*dll_reset=*/1));
wait_tMRD(cfg);
/* 11~12:PREA + 两次自动刷新 */
ddr_cmd(PREA); wait_ns(cfg->trp_ns);
ddr_cmd(REF); wait_ns(cfg->trfc_ns);
ddr_cmd(REF); wait_ns(cfg->trfc_ns);
/* 13:解除 DLL 复位(其余位与步骤 10 完全一致) */
ddr_mrs(BA_MR, mr_value(cfg, /*dll_reset=*/0));
wait_tMRD(cfg);
/* 14~15:OCD 默认值 → 退出 */
ddr_mrs(BA_EMR1, emr1_value(cfg, 1) | OCD_DEFAULT << 7); wait_tMRD(cfg);
ddr_mrs(BA_EMR1, emr1_value(cfg, 1) | OCD_EXIT << 7); wait_tMRD(cfg);
/* 16:等 DLL 锁定,期间只能发 NOP / DES */
wait_ns(200 * cfg->tck_ns); /* tDLLK */
/* 17:ZQ 长校准(若封装引出 ZQ 球) */
if (cfg->zq_present) {
ddr_cmd(ZQCL); /* A10 = 1 */
wait_ns(128 * cfg->tck_ns); /* tZQCL */
}
/* 18:打开自动刷新并做读写回环验证 */
ddr_enable_auto_refresh(cfg->trefi_ns);
return ddr2_loopback_check(); /* 见 12.3 */
}
① 步骤 10 → 13 的「DLL 复位 → 解除复位」两次 MRS:只写一次 MR 且 A8 一直为 0,DLL 从未被复位,读时序 tDQSCK / tAC 可能整体偏移; ② 步骤 14~15 的 OCD 进入与退出:只写默认值不写退出,DQ 会停留在 OCD 校准态; ③ 步骤 16 的 tDLLK 等待:用「差不多 500 ns」的忙等替代按 tCK 计数的等待,变频后必然出错。
3.3 容量与配置校验
初始化完成后,驱动必须回到「事实」上去核对配置,防止贴错料、位宽配错或 BA 连接错误:
- 容量探测:按行 / 列 / Bank 步进做「写入图案 → 回读」的地址回卷测试,确认实际可见容量与预期一致;地址线错位会表现为「容量减半」或「镜像重复」。
- 位宽与 rank 核对:确认总线位宽(x8 / x16 / 32 bit 拼两片)与 CS 数量;x16 器件的两组 DQS(LDQS / UDQS)都要参与训练。
- 速度档核对:确认 tCK 与 CL / AL / WR 的组合在器件速度档支持范围内(DDR2-800 常用 CL5 / AL4 / WR6)。
- 模式寄存器回读或复核:部分主控支持 MR 影子寄存器回读;不支持的,至少把写入值记录在驱动日志里以便定位。
- 读写回环验证:见 §12.3;通过后才允许向上层发布内存。
1 Gb 器件同时存在 4 bank 与 8 bank 两个版本。若把 BA2 误连到 A14,容量识别会出错且症状隐蔽(表现为访问高半区时命中低半区数据)。上电自检必须包含 Bank 地址回卷测试,而不是只测线性地址。
4 · 模式寄存器 MR / EMR 体系
DDR2 共 4 个模式寄存器,通过 MRS / EMRS 命令配合 BA1:BA0 选择:BA=00 → MR,BA=01 → EMR(1),BA=10 → EMR(2),BA=11 → EMR(3)。MR 的默认值未定义,上电必须四个全部显式写一遍。
4.1 四张表总览
| 寄存器 | BA1:BA0 | 命令 | 主要字段 | 初始化中的角色 |
|---|---|---|---|---|
| MR | 00 | MRS | BL、BT、CL、TM、DLL 复位、WR、PD | 写两次:A8=1 复位 DLL → A8=0 解除 |
| EMR(1) | 01 | EMRS | DLL 使能、DIC 驱动强度、Rtt、AL、OCD、DQS#、RDQS、Qoff | 写三次:DLL 使能 → OCD 默认值 → OCD 退出 |
| EMR(2) | 10 | EMRS | A7 = SRF 自刷新温区,其余保留写 0 | 初始化写 0x000;高温改为 0x080 |
| EMR(3) | 11 | EMRS | 全部保留位 | 仍须写一次 0x000,兼容后续器件 |
4.2 MR(BA = 00):BL / BT / CL / DLL / WR / PD
| 位 | 字段 | 编码 | 说明 |
|---|---|---|---|
| A2:A0 | BL 突发长度 | 010 = 4,011 = 8,其余保留 | DDR2 取消了 BL = 2;常规使用 BL = 8 |
| A3 | BT 突发类型 | 0 = 顺序,1 = 交错 | 多数主控用顺序模式 |
| A6:A4 | CL 读延迟 | 010=2,011=3,100=4,101=5,110=6,111=7 | DDR2-800 常用 5 或 6;DDR2-1066 用 6 或 7 |
| A7 | TM 测试模式 | 0 = 正常,1 = 厂商测试 | 严禁写 1,误写会让器件进入测试态 |
| A8 | DLL 复位 | 0 = 正常,1 = 复位 DLL | 初始化先写 1,等 tDLLK = 200 tCK 后再写 0 |
| A11:A9 | WR 写恢复 | 001=2 … 110=7,111=8 | WR = ceil(tWR / tCK);DDR2-800:15 / 2.5 = 6 |
| A12 | PD 掉电模式 | 0 = 快速退出(DLL 保持),1 = 慢速退出 | 按主控支持情况选择;见 §10.1 |
| A13 | 保留 | 写 0 | — |
4.3 EMR(1)(BA = 01):DLL / DIC / Rtt / AL / OCD / DQS#
| 位 | 字段 | 编码 | 说明 |
|---|---|---|---|
| A0 | DLL 使能 | 0 = 使能(正常),1 = 禁止 | 禁止 DLL 只能低频工作,正常必须写 0 |
| A1 | DIC 驱动强度 | 0 = 全强度(约 18 Ω),1 = 减弱(约 30 Ω) | 点对点短走线用减弱档可改善过冲与 EMI |
| A6、A2 | Rtt 标称 ODT | 00 = 关闭,01 = 75 Ω,10 = 150 Ω,11 = 50 Ω | DDR2 只有一个标称值,无 DDR3 的动态 ODT |
| A5:A3 | AL 附加延迟 | 000=0 … 110=6 | Posted CAS 附加延迟,推荐 AL = CL − 1;必须 ≤ CL − 1 |
| A9:A7 | OCD 校准 | 000=退出,001=Drive(1),010=Drive(0),100=Adjust,111=默认值 | 多数设计只做「默认值 → 退出」 |
| A10 | DQS# 使能 | 0 = 使能差分 DQS#,1 = 禁止 | 正常必须使能差分 DQS |
| A11 | RDQS 使能 | 0 = 禁止(默认) | 冗余选通,仅部分 x8 器件支持;x16 通常不用 |
| A12 | Qoff 输出使能 | 0 = 输出缓冲使能,1 = 关闭 | 调试或总线隔离时用,正常写 0 |
4.4 EMR(2) 与 EMR(3)
| 寄存器 | BA1:BA0 | 有效位 | 说明 |
|---|---|---|---|
| EMR(2) | 10 | A7 = SRF | 0 = 常规温区(0~85 ℃,tREFI = 7.8 µs);1 = 扩展温区(85~95 ℃,刷新率 ×2,tREFI = 3.9 µs)。其余位写 0。 |
| EMR(3) | 11 | 无 | 全部保留位,必须写 0x000;初始化时仍须发送一次以兼容后续器件。 |
4.5 DDR2-800 位图取值示例
// DDR2-800(tCK = 2.5 ns)典型取值:CL = 5,BL = 8,WR = 6 tCK,AL = 4 // // MR (BA=00) 位图: A12 | A11 A10 A9 | A8 | A7 | A6 A5 A4 | A3 | A2 A1 A0 // PD | WR | DLL | TM | CL | BT | BL // 取值: 0 | 1 0 0 | 1 | 0 | 1 0 1 | 0 | 0 1 1 // | = 6 | 复位|正常| = 5 |顺序| = 8 // → 0 1001 0101 0011b = 0x953 (步骤 10:DLL 复位阶段) // → 0 1000 0101 0011b = 0x853 (步骤 13:A8 = 0,解除 DLL 复位) // // EMR (BA=01) 位图: A12 | A11 | A10 | A9 A8 A7 | A6 | A5 A4 A3 | A2 | A1 | A0 // Qoff| RDQS| DQS# | OCD |Rtt1| AL |Rtt0| DIC| DLL // 取值: 0 | 0 | 0 | 0 0 0 | 1 | 1 0 0 | 0 | 1 | 0 // | | 使能 | 退出 | | = 4 | |减弱| 使能 // → Rtt = A6:A2 = 10 → 150 Ω(点对点单 rank 写时端接) // → 0 0000 0110 0010b = 0x062 // // 若 T 分支双片(两个负载)改用 75 Ω:A6 = 0,A2 = 1 → 0x026 // OCD 阶段:A9:A7 = 111(默认值)→ 0x3E2;退出:A9:A7 = 000 → 0x062 // // EMR2 (BA=10) = 0x000(A7 = 0,常规温区) // EMR2 (BA=10) = 0x080(A7 = 1,扩展温区,Tc > 85 ℃ 时刷新率加倍) // EMR3 (BA=11) = 0x000 // // 注意:以上为通用 DDR2 约定,不同厂商 / 容量可能存在保留位差异, // 投板前必须用目标型号 datasheet 的 Mode Register Definition 表逐位核对。
4.6 写 MRS 的准则
- 整寄存器重写:MR 默认值未定义,每次 MRS / EMRS 都要给出完整 13 bit 操作数,不能只改某一位。
- 间隔 tMRD = 2 tCK:两次 MRS / EMRS 之间至少 2 个时钟周期,期间用 NOP / DES 填充。
- 所有 Bank 必须空闲:发 MRS / EMRS 前所有 Bank 已 PRE,且距最后一次数据操作 ≥ tMRD 相关门限。
- A7(TM)恒为 0:写 1 会进入厂商测试模式,表现为器件不响应正常命令。
- CL 与 AL 必须互洽:AL ≤ CL − 1;CL 在 MR、AL 在 EMR,两者必须一致,否则读写时序整体错位。
- 改 Rtt 需重发 EMRS:DDR2 无动态 ODT,切换端接值要占用总线(tMRD + 命令周期),且切换期间不能有进行中的读写。
- 变频必须重写:CL / AL / WR 都随 tCK 变化,任何 DVFS 或降频动作后必须重跑完整 MRS 序列并等 tDLLK。