imx6ull-裸机学习实验14(下)——驱动DDR3和测试
前言
I.MX6U 有一个 256MB/512MB 的 DDR3 内存芯片,支持 LPDDR2、LPDDR3/DDR3,本讲实验就来学习如何驱动 I.MX6U-ALPHA 开发板上的这片 DDR3。
DDR3实验我们会从下面几个部分来讲解:
- 介绍一些内存的基本概念:ROM/RAM、SRAM/SDRAM 、DDR3
- 介绍DDR几个关键的时间参数。
- 如何驱动I.MX6U MMDC 控制器。
- 使用ddr_stress_tester工具进行 DDR 的初始化与测试。
- 使用DDR_Tester.exe 软件对 DDR3L 进行校准。
- 使用DR Test Tool 进行 DDR3 超频测试。
在学习实验14(上)—— DDR介绍和关键时间参数,我们已经介绍完前面两个部分了,本讲实验我们就来介绍开发板的MMDC控制器,然后使用3个工具对DDR进行测试。
MMDC 控制器
MMDC介绍
对于STM32 来说, FMC 或 FSMC 外设用于连接 SRAM 或 SDRAM;对于 I.MX6U 来说也有 DDR 内存控制器,那就是MMDC。
MMDC 是一个多模的 DDR 控制器,可以连接 16 位宽的 DDR3/DDR3L、 16 位宽的 LPDDR2, 是一个可配置、高性能的 DDR 控制器。
MMDC 外设包含一个内核(MMDC_CORE) 和 PHY(MMDC_PHY)。
内核和 PHY 的功能如下:
- MMDC 内核:内核负责通过 AXI 接口与系统进行通信、 DDR 命令生成、 DDR 命令优化、读/写数据路径。
- MMDC PHY: PHY 负责时序调整和校准,使用特殊的校准机制以保障数据能够在 400MHz被准确捕获。
MMDC 的主要特性如下:
- 支持 DDR3/DDR3Lx16、支持 LPDDR2x16,不支持 LPDDR1MDDR 和 DDR2。
- 支持单片 256Mbit~8Gbit 容量的 DDR,列地址范围: 8-12 位,行地址范围 11-16bit。 2个片选信号。
- 对于 DDR3,最大支持 8bit 的突发访问。
- 对于 LPDDR2 最大支持 4bit 的突发访问。
- MMDC 最大频率为 400MHz,因此对应的数据速率为 800MT/S。
- 支持各种校准程序,可以自动或手动运行。支持 ZQ 校准外部 DDR 设备, ZQ 校准 DDR I/O 引脚、校准 DDR 驱动能力。
MMDC 信号引脚
众所周知:DDR 的引脚都是独立的,一般没有复用功能,只做为 DDR引脚使用。
I.MX6U 也有专用的 DDR 引脚,如图:
对于这些IO来说,我们不用配置引脚复用,只需要设置 DDR 引脚的电气属性。
MMDC 时钟源
I.MX6U 的 DDR 或者 MDDC 的时钟频率为 400MHz。
MMDC 的时钟源路径图,主要分为 4 部分:
①、 pre_periph2 时钟选择器,也就是 periph2_clkd 的前级选择器,由 CBCMR 寄存器的PRE_PERIPH2_CLK_SEL 位(bit22:21)来控制。
当 PRE_PERIPH2_CLK_SEL 为 0x1 的时候,选中 PLL2_PFD2 为pre_periph2 时钟源。
我们已经将 PLL2_PFD2 设置为396MHz(约等于 400MHz), I.MX6U 内部 boot rom 就是设置 PLL2_PFD2 作为 MMDC 的最终时钟源,所以I.MX6U 的 DDR 频率为 400MHz。
②、 periph2_clk 时钟选择器,由 CBCDR 寄存器的 PERIPH2_CLK_SEL 位(bit26)来控制:
将 PERIPH2_CLK_SEL 设置为 0,也就是选择pll2_main_clk 作为 periph2_clk 的时钟源,因此 periph2_clk=PLL2_PFD0=396MHz。
③、最后就是分频器,由 CBCDR 寄存器的 FABRIC_MMDC_PODF 位(bit5:3)设置分频值,可设置 0~7,分别对应 1~8 分频。
要配置 MMDC 的时钟源为 396MHz,那么此处就要设置为 1分频,因此 FABRIC_MMDC_PODF=0。
硬件原理图
EMMC 核心板使用的 DDR3L 的型号为NT5CC256M16EP-EK,容量为 512MB。
左侧是 DDR3L 原理图,右侧的是 I.MX6U 的 MMDC 控制器 IO。
DDR3L 初始化与测试
DDR初始化工具
DDR 初始化工具,叫做 ddr_stress_tester。
特点:
- 此工具通过 USB OTG 接口与开发板相连接,也就是通过 USB OTG 口进行 DDR 的初始化与测试。
- 此工具有一个默认的配置文件,为 excel 表,通过此表可以设置板子的 DDR 信息,最后生成一个.inc 结尾的 DDR 初始化脚本文件。这个.inc 文件就包含了 DDR 的初始化信息,一般都是寄存器地址和对应的寄存器值。
- 此工具会加载.inc 表里面的 DDR 初始化信息,然后通过 USB OTG 接口向板子下载DDR 相关的测试代码,包括初始化代码。
- 对此工具进行简单的设置,即可开始 DDR 测试,一般要先做校准,因为不同的 PCB其结构肯定不同,必须要做一次校准,校准完成以后会得到两个寄存器对应的校准值,我们需要用这个新的校准值来重新初始化 DDR。
- 此工具可以测试板子的 DDR 超频性能,一般认为 DDR 能够以超过标准工作频率10%~20%稳定工作的话就认定此硬件 DDR 走线正常。
- 此工具也可以对 DDR 进行 12 小时的压力测试。
安装
安装ddr_stress_tester,如图:
安装完成以后就会在此目录下生成一个名为 ddr_stress_tester_v2.90 的文件夹,此文件夹就是 DDR 测试软件,进入到此文件夹中,里面的文件如图:
DDR_Tester.exe 就是我们稍后要使用的 DDR 测试软件。
配置
配置 DDR3L,生成初始化脚本。
将I.MX6UL_DDR3_Script_Aid_V0.02.xlsx 文件拷贝到 ddr_stress_testr 软件安装目录中:
.MX6UL_DDR3_Script_Aid_V0.02.xlsx就是NXP为I.MX6UL编写的DDR3配置excel表,打开 I.MX6UL_DDR3_Script_Aid_V0.02.xlsx:
- Readme 选项卡,此选项卡是帮助信息,告诉用户此文件如何使用。
- Register Configuration 选项卡,顾名思义,此选项卡用于完成寄存器配置,也就是配置DDR3,此选项卡是我们重点要讲解的。
- RealView.inc 选项卡,当我们配置好 Register Configuration 选项卡以后, RealView.inc选项卡里面就保存着寄存器地址和对应的寄存器值。
我们需要另外新建一个后缀为.inc 的文件来保存 RealView.inc 中的初始化脚本内容, ddr_stress_testr 软件就是要使用此.inc 结尾的初始化脚本文件来初始化 DDR3。
选中“Register Configuration”选项卡,如图:
- Device Information:DDR3 芯片设备信息设置,需要根据所使用的 DDR3 芯片来设置。
- System Information:设置 I.MX6UL/6ULL 相关属性。
- SI Configuratin:信号完整性方面的配置,主要是一些信号线的阻抗设置,使用 NXP 的默认设置即可。
EMMC 核 心 板 (DDR3 型 号 为NT5CC256M16EP-EK),那么配置需要修改的地方如图:
配置完成以后点击 RealView.inc 选项卡,如图:
可以看见,RealView.inc 就是生成的配置脚本,全部是“寄存器地址=寄存器值”这种形式。
但是,RealView.inc 不能直接用,我们需要新建一个以.inc 结尾的文件,名字随便自定义,比如名为“ALIENTEK_512MB”的.inc 文件,如图:
用 notepad++打开 ALIENTEK_512MB.inc 文件,然后将、 RealView.inc 里面的所有内容全部拷贝到 ALIENTEK_512MB.inc 文件中。
这就是DDR3 的配置文件 ALIENTEK_512MB.inc。我们可以使用此配置文件对正点原子 ALPHA 开发板的 DDR3 进行校准并进行超频测试了。
DDR3L 校准
用 DDR_Tester.exe 软件对正点原子 ALPAH 开发板的 DDR3L 进行校准,因为不同的 PCB 其走线不同,必须要进行校准,经过校准一会 DDR3L 就会工作到最佳状态。
DDR_Tester 软件通过 USB OTG 线将测试程序下载到开发板中,因此首先需要使用 USB OTG 线将开发板和电脑连接起来:
双击“DDR_Tester.exe”,打开测试软件,如图:
点 击 “ Load init Script ” 加 载 前 面 已 经 生 成 的 初 始 化 脚 本 文 件ALIENTEK_512MB.inc, 注意,不能有中文路径,否则加载可能会失败!
ALIENTEK_512MB.inc 文件加载成功,还需要对 DDR Test Tool 软件进行设置:
一切设置好以后点击“Download”按钮,将测试代码下载到开发板中,下载完成以后 DDR Test Tool 下方的信息窗口就会输出一些内容,如图:
输出了一些关于板子的信息,比如 SOC 型号、工作频率、 DDR 配置信息等等。
DDR Test Tool 工具有三个测试项: DDR Calibration、DDR Stess Test 和 32bit Memory Read/Write.
我们首先要做校准测试,因为不同的 PCB、不同的 DDR3L 芯片对信号的影响不同,必须要进行校准,然后用新的校准值重新初始化 DDR。
点击“Calibraton”按钮,如图:
点击“Calibration”按钮以后就会自动开始校准,最终会得到 Write leveling calibtarion、 Read DQS Gating Calibration、 Read calibration 和 Write calibration,一共四种校准结果,校准结果如下:
Write leveling calibration
MMDC_MPWLDECTRL0 ch0 (0x021b080c) = 0x00000000
MMDC_MPWLDECTRL1 ch0 (0x021b0810) = 0x000B000BRead DQS Gating calibration
MPDGCTRL0 PHY0 (0x021b083c) = 0x0138013C
MPDGCTRL1 PHY0 (0x021b0840) = 0x00000000Read calibration
MPRDDLCTL PHY0 (0x021b0848) = 0x40402E34Write calibration
MPWRDLCTL PHY0 (0x021b0850) = 0x40403A34
得到了一些需要校准的寄存器对应的值,修 改 ALIENTEK_512MB.inc 文 件,其对应寄存器的值改为校准后的值。inc文件里找不到的寄存器可以不用修改。
ALIENTEK_512MB.inc 修改完成以后重新加载并下载到开发板中,至此 DDR 校准完成。
DDR3L 超频测试
超频测试的目的就是为了检验 DDR3 硬件设计合不合理,一般 DDR3 能够超频到比标准频率高 10%~15%的话就认为硬件没有问题。
使用工具DDR Test Tool ,它支持 DDR3 超频测试,只要指定起始频率和终止频率,就会自动开始一点点的增加频率,直到达到终止频率或者测试失败。
设置好起始频率为 400MHz,终止频率为 600MHz,设置好以后点击“Stress Test”开启超频测试:
超频测试完成以后结果如图:
正点原子的 ALPAH 开发板 EMMC 核心板 DDR3 最高可以超频到556MHz,当超频到 561MHz 的时候就失败了。