只读分享解决方案文档原理方案设计📅 2026-10-05🔖 V1.0⏳ 29天有效(至 2026-11-09)
🔧解决方案&应用市场分析 -> 原理方案设计 -> DRAM系列产品方案 -> DDR2_软件设计规范

DDR2_软件设计规范

生成时间 2026-10-05 13:58:46 有效期至 2026-11-09 23:25:29(29天有效(至 2026-11-09))
同系列 · 原理方案设计

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。
不在本规范范围:SDRAM 颗粒物理层与 PCB 布线(见《DDR2 电路设计指南》);PHY 层比特级训练算法的具体实现;内存子系统的 ECC 纠错(由控制器或颗粒外 ECC 模块负责,不在 DDR2 颗粒内);操作系统页表与缓存一致性策略。

一句话结论: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 器件定位与关键参数

1 Gb
主流容量(示例器件)
64M × 16 bit · 1Gb = 128MB
4 / 8
Bank 数量
≥1 Gb 需核对 BA0~BA2
1~2 KB
页容量 (Page Size)
随列地址位宽按料号而定
1.8 V
供电 VDD / VDDQ / VDDL
SSTL_18,±0.1 V
800
数据率 MT/s(DDR2-800)
tCK = 2.5 ns · CL5
4n
预取架构
决定最小突发 BL = 4
127.5 ns
tRFC(1 Gb)
512Mb 105ns / 2Gb 197.5ns
7.8 µs
tREFI(Tc ≤ 85 ℃)
>85 ℃ → 3.9 µs(EMR2 A7=1)
FBGA-84
主流封装(x16)
0.8 mm pitch · 60 球可能无 ZQ

数据取自《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 bitACT / RD / WR / PRE / MRS / EMRS选择 Bank;MRS / EMRS 用 BA1:BA0 选 MR / EMR(1) / EMR(2) / EMR(3)
行地址 RowA0~A12 / A13 / A14ACTBank 内行号;打开到行缓冲(页)
列地址 ColA0~A8 / A0~A9RD / WR页内偏移;A10 = 1 触发 Auto-Precharge
A10(模式位)1 bitPRE / ZQCL / ZQCSPRE 时 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 逐项核实。

4n 预取决定了最小突发长度

DDR2 内核一次读出 4 × 位宽的数据送进 I/O 锁存器,再由 CK 上下沿分 4 次(2 个 CK 周期)送出。因此 DDR2 取消了 BL = 2,只支持 BL = 4 与 BL = 8;这是与 DDR(2n 预取)最直观的协议差异,也是「按字节写」必须靠 DM 屏蔽或突发截断的原因。

1 Device = 1 Gb(64M × 16)= 4 Bank × 16K Row × 1K Col 128 MB · 4n 预取 · BL4 / BL8 · 页容量按料号 1~2 KB 1 Bank = 16K Row(BA0~BA1 选择,1 Gb 起需核对 BA2) ACT 打开某一行进入行缓冲;同一 Bank 内换行为 PRE + ACT 1 Row = 1K Col × 16 bit = 2 KB 页(512 列时为 1 KB) RD / WR 用列地址访问;A10 = 1 时突发结束自动 Precharge 1 Burst = 8 × 16 bit = 16 B(BL8)/ 4 × 16 bit = 8 B(BL4) 4n 预取 → DDR2 无 BL = 2;不足一拍的部分用 LDM / UDM 屏蔽
图 1 · DDR2 x16 阵列层级:Device → Bank → Row → Column → Burst

1.3 引脚与信号分组

FBGA-84(x16)的关键信号分组如下,软件 / 控制器需按组管理:

分组信号方向与功能
时钟CK / CK#,CKE差分时钟 + 时钟使能;CKE 低电平进入掉电 / 自刷新,上电初始化期间必须为低
命令CS#,RAS#,CAS#,WE#,ODT命令译码;ODT 高电平打开片内端接(只作用于 DQ / DQS / DM)
地址BA0~BA2,A0~A13/14,A10/APBank / 行 / 列复用;A10 兼作 Precharge All 与 ZQCL / ZQCS 模式位
数据DQ[15:0],LDQS/LDQS#,UDQS/UDQS#,LDM/UDM16 bit 双向数据 + 两组字节选通 + 写数据掩码
参考 / 校准ZQ,VREFZQ 外接 240 Ω ±1% 提供 OCD / ODT 校准基准(部分 FBGA-60 不引出);VREF = VDDQ/2
复位无DDR2 没有 RESET# 引脚——这是与 DDR3 / DDR4 在软件恢复路径上的根本差异

1.4 树形拓扑与「无 fly-by、无 write leveling」

DDR2 的地址 / 命令 / 时钟采用树形(对称 T 分支)拓扑,而不是 DDR3 起的 fly-by 菊花链。这个拓扑选择直接决定了三条软件约束:

约束 01
关闭 write leveling
DDR2 没有 write leveling 机制(那是 DDR3 fly-by 的补偿手段)。若控制器 PHY 支持该功能,固件必须显式关闭;误开启会让写方向 DQS 相位被错误搬移。
判据:控制器 write_leveling_enable = 0
约束 02
写方向偏斜靠 PCB 等长
写方向 CK 与 DQS 的飞行时间差只能靠布线等长补偿,硬件无法自动校准。软件侧只能把实测窗口作为「设计是否合格」的判据,不能拿来救设计。
判据:tDQSS ±0.25 tCK 内可稳定读写
约束 03
读方向仍需门控训练
读方向 DQS 由 DRAM 发出、边沿与 DQ 位边界对齐,控制器必须做 DQS gating + 90° 移相采样窗口训练,不能硬编码延时值。
判据:读窗口扫描 ≥ 0.45 UI 且中心对齐

2 · 术语与缩写

DDR2 的命令与寄存器术语量大,且不少名词与 DDR3 同名但含义不同。这里按「命令 / 寄存器」与「时序 / 延迟」两组列出,后续章节直接引用。

2.1 命令与寄存器术语

术语全称 / 含义软件关注点
ACTActivate —— 打开指定 Bank 的某一行到行缓冲读 / 写前必须 ACT;受 tRCD 约束
RD / RDARead / Read with Auto-precharge(A10 = 1)RDA 在突发结束后自动 PRE 该行
WR / WRAWrite / Write with Auto-precharge(A10 = 1)受 tWR 与 tDAL 约束
PRE / PREAPrecharge / Precharge All(A10 = 1)关闭行并写回;受 tRP 约束
REFAuto Refresh —— 内部刷新若干行周期发,受 tRFC / tREFI 约束
SRE / SRXSelf Refresh Entry / Exit进入前必须 PREA;退出后必须等 tXSRD = 200 tCK
MRS / EMRSMode Register Set / Extended MRSBA1:BA0 选寄存器;受 tMRD = 2 tCK 约束
ZQCL / ZQCSZQ 长校准 / 短校准(A10 = 1 / 0)DDR2 的阻抗基准校准;128 tCK / 64 tCK
OCDOff-Chip Driver Calibration —— 片外驱动校准DDR2 特有;EMR 的 A9:A7 控制,必须按进入 / 退出规范完成
DES / NOPDevice Deselect / No Operation初始化与等待窗口的填充命令
PDE / PDXPower-Down Entry / ExitCKE 拉低进入;退出需 tXP = 2 tCK(快速退出)

2.2 时序与延迟术语

术语含义DDR2-800 典型值
CLCAS 读延迟,RD → 第一个数据出现5 tCK(可选 6)
ALAdditive Latency,Posted CAS 附加延迟4 tCK(推荐 AL = CL − 1)
RL读延迟 = AL + CL9 tCK
WL写延迟 = AL + CL − 18 tCK(比 RL 少 1 拍)
BL突发长度,4 或 88(BL8)
WR写恢复 = ceil(tWR / tCK),写 MR 的 A11:A96(15 ns / 2.5 ns)
tRCDACT → RD / WR12.5 ns / 5 tCK
tRPPRE → ACT12.5 ns / 5 tCK
tRAS / tRCACT → PRE / 同 Bank ACT → ACT45 ns / 57.5 ns
tRFC单次 Auto Refresh 周期(随密度)127.5 ns(1 Gb)
tREFI平均刷新间隔7.8 µs(≤85 ℃)/ 3.9 µs(>85 ℃)
tDLLKDLL 锁定时间200 tCK = 500 ns
tMRD两次 MRS / EMRS 最小间隔2 tCK
tINIT1 / tINIT2上电等待 / CKE 拉高后等待200 µs / 400 ns
tAOND / tAOFDODT 引脚拉高 → 生效 / 拉低 → 关闭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 计数的等待,变频后必然出错。

DDR2 上电初始化 18 步(JESD79-2)· 以 DDR2-800 / tCK = 2.5 ns 为例 1~3 电源与等待 CKE 低 · VREF 跟随 tINIT1 = 200 µs 4~5 时钟与 CKE CK 稳定 ≥ 10 ns tINIT2 = 400 ns 6 PREA A10 = 1 全预充 等 tRP = 12.5 ns 7~9 EMR2/3/1 EMR1 写 A0 = 0 使能 DLL · 间隔 tMRD 10 MR + DLL 复位 A8 = 1 · 写 CL/BL/WR 关键步骤,不可省 11~12 PREA + REF×2 间隔 ≥ tRFC 127.5 ns(1 Gb) 13 MR 解除复位 A8 = 0 · 其余位不变 与步骤 10 成对出现 14~15 OCD 默认值 111 → 退出 000 DDR2 特有,易被省略 16 等 tDLLK 200 tCK = 500 ns 期间只发 NOP / DES 17 ZQCL(推荐) A10 = 1 · 128 tCK 320 ns(DDR2-800) 18 正常操作 开自动刷新 tREFI = 7.8 µs 关键间隔:tMRD = 2 tCK | tDLLK = 200 tCK | tZQCL = 128 tCK | tRFC 随密度(512Mb 105 ns / 1Gb 127.5 ns / 2Gb 197.5 ns) 顺序不可颠倒:EMR2 → EMR3 → EMR(DLL 使能) → MR(DLL 复位) → PREA → REF×2 → MR(解除复位) → OCD → tDLLK → ZQCL 掉电顺序(必须遵守):停访问 → PRECHARGE ALL → 等 tRP →(保数据则进 Self Refresh)→ CKE 低 → 关 VTT → 关 VDDQ → 关 VDD 任何时刻 VDD / VDDQ 压差不得超过 0.3 V;VTT 不得先于 VDDQ 建立、不得后于 VDDQ 撤除
图 2 · DDR2 上电初始化 18 步:电源等待、模式寄存器加载、DLL 复位与锁定、OCD 校准、ZQCL

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;通过后才允许向上层发布内存。
Bank 数是最容易踩的坑

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命令主要字段初始化中的角色
MR00MRSBL、BT、CL、TM、DLL 复位、WR、PD写两次:A8=1 复位 DLL → A8=0 解除
EMR(1)01EMRSDLL 使能、DIC 驱动强度、Rtt、AL、OCD、DQS#、RDQS、Qoff写三次:DLL 使能 → OCD 默认值 → OCD 退出
EMR(2)10EMRSA7 = SRF 自刷新温区,其余保留写 0初始化写 0x000;高温改为 0x080
EMR(3)11EMRS全部保留位仍须写一次 0x000,兼容后续器件

4.2 MR(BA = 00):BL / BT / CL / DLL / WR / PD

位字段编码说明
A2:A0BL 突发长度010 = 4,011 = 8,其余保留DDR2 取消了 BL = 2;常规使用 BL = 8
A3BT 突发类型0 = 顺序,1 = 交错多数主控用顺序模式
A6:A4CL 读延迟010=2,011=3,100=4,101=5,110=6,111=7DDR2-800 常用 5 或 6;DDR2-1066 用 6 或 7
A7TM 测试模式0 = 正常,1 = 厂商测试严禁写 1,误写会让器件进入测试态
A8DLL 复位0 = 正常,1 = 复位 DLL初始化先写 1,等 tDLLK = 200 tCK 后再写 0
A11:A9WR 写恢复001=2 … 110=7,111=8WR = ceil(tWR / tCK);DDR2-800:15 / 2.5 = 6
A12PD 掉电模式0 = 快速退出(DLL 保持),1 = 慢速退出按主控支持情况选择;见 §10.1
A13保留写 0—

4.3 EMR(1)(BA = 01):DLL / DIC / Rtt / AL / OCD / DQS#

位字段编码说明
A0DLL 使能0 = 使能(正常),1 = 禁止禁止 DLL 只能低频工作,正常必须写 0
A1DIC 驱动强度0 = 全强度(约 18 Ω),1 = 减弱(约 30 Ω)点对点短走线用减弱档可改善过冲与 EMI
A6、A2Rtt 标称 ODT00 = 关闭,01 = 75 Ω,10 = 150 Ω,11 = 50 ΩDDR2 只有一个标称值,无 DDR3 的动态 ODT
A5:A3AL 附加延迟000=0 … 110=6Posted CAS 附加延迟,推荐 AL = CL − 1;必须 ≤ CL − 1
A9:A7OCD 校准000=退出,001=Drive(1),010=Drive(0),100=Adjust,111=默认值多数设计只做「默认值 → 退出」
A10DQS# 使能0 = 使能差分 DQS#,1 = 禁止正常必须使能差分 DQS
A11RDQS 使能0 = 禁止(默认)冗余选通,仅部分 x8 器件支持;x16 通常不用
A12Qoff 输出使能0 = 输出缓冲使能,1 = 关闭调试或总线隔离时用,正常写 0

4.4 EMR(2) 与 EMR(3)

寄存器BA1:BA0有效位说明
EMR(2)10A7 = SRF0 = 常规温区(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。
扫码打开本页
微信扫码 · 展会可扫

再分享给同事

同事可直接打开这份资料《DDR2_软件设计规范》,在线阅读;完整章节请下载芯参谋。