IMX6ULL学习笔记(21)——MMDC接口使用(DDR3测试
一、MMDC简介
MMDC 接口与 STM32 的 FSMC 接口类似,只不过 MMDC 接口专用于外接 DDR,并且 MMDC 外部引脚不复用。MMDC 是一个多模的 DDR 控制器,可以连接 16 位宽的 DDR3/DDR3L、16 位宽的 LPDDR2。
MMDC 是一个可配置、高性能的 DDR 控制器。MMDC 外设包含一个内核(MMDC_CORE)和 PHY(MMDC_PHY),内核和 PHY 的功能如下:
-
MMDC_CORE
负责通过 AXI 接口与系统进行通信,实现 DDR 命令生成、DDR 命令优化和读写数据路径。控制整个 MMDC 的功能实现。 -
MMDC_PHY
负责时序调整和校准,使用特殊的校准机制以确保数据被正常收发, 最高支持 400MHz。
1.1 MMDC信号引脚
在使用 STM32 的时候 FMC/FSMC 的 IO 引脚是带有复用功能的,如果不接 SRAM 或 SDRAM 的话 FMC/FSMC 是可以用作其他外设 IO 的。但是,对于 DDR 接口就不一样了,因为 DDR 对于硬件要求非常严格,因此 DDR 的引脚都是独立的,一般没有复用功能,只做为 DDR 引脚使用。I.MX6U 也有专用的 DDR 引脚如下:
1.2 MMDC时钟源
默认情况下 PLL2 的 PFD2 时钟输出作为 MMDC 的根时钟,时钟频率为 400MHz(实际396MHz)。时钟产生路径如下图所示:
PLL2 的 PFD2 经过两个时钟选择寄存器(标号①和②)和一个时钟分频寄存器(标号③)之后连接到 MMDC_CLK_ROOT
。具体寄存器在时钟树中已经标出。特别注意的是,在程序中不能任意修改时钟选择寄存器以及时钟分频寄存器,因为程序正常运行会使用 DDR,而不正确的修改 DDR 根时钟会造成系统崩溃。
二、DDR简介
DDR 内存是 SDRAM 的升级版本,SDRAM 分为 SDR SDRAM、DDR SDRAM、DDR2 SDRAM、DDR3 SDRAM、DDR4 SDRAM。
DDR 全称是 Double Data Rate SDRAM,也就是双倍速率 SDRAM,看名字就知道 DDR 的速率(数据传输速率)比 SDRAM 高 1 倍!这 1 倍的速度不是简简单单的将 CLK 提高 1 倍,SDRAM 在一个 CLK 周期传输一次数据,DDR 在一个 CLK 周期传输两次数据,也就是在上升沿和下降沿各传输一次数据,这个概念叫做预取(prefetch),相当于 DDR 的预取为 2bit,因此 DDR 的速度直接加倍!比如 SDRAM 速度一般是 133~200MHz,对应的传输速度就是 133~200MT/s,在描述 DDR 速度的时候一般都使用 MT/s,也就是每秒多少兆次数据传输。133MT/S 就是每秒 133M 次数据传输,MT/s 描述的是单位时间内传输速率。同样 133~200MHz 的频率,DDR 的传输速度就变为了 266~400MT/S,所以大家常说的 DDR266、DDR400 就是这么来的。
DDR2 在 DDR 基础上进一步增加预取(prefetch),增加到了 4bit,相当于比 DDR 多读取一倍的数据,因此 DDR2 的数据传输速率就是 533~800MT/s,这个也就是大家常说的 DDR2 533、DDR2 800。当然了,DDR2 还有其他速度,这里只是说最常见的几种。
DDR3 在 DDR2 的基础上将预取(prefetch)提高到 8bit,因此又获得了比 DDR2 高一倍的传输速率,因此在总线时钟同样为 266~400MHz 的情况下,DDR3 的传输速率就是 1066~1600MT/S。I.MX6U 的 MMDC 外设用于连接 DDR,支持 LPDDR2、DDR3、DDR3L,最高支持 16 位数据位宽。总线速度为 400MHz(实际是 396MHz),数据传输速率最大为 800MT/S。这里我们讲一下 LPDDR3、DDR3 和 DDR3L 的区别,这三个都是 DDR3,但是区别主要在于工作电压,LPDDR3 叫做低功耗 DDR3,工作电压为 1.2V。DDR3 叫做标压 DDR3,工作电压为 1.5V,一般台式内存条都是 DDR3。DDR3L 是低压 DDR3,工作电压为 1.35V,一般手机、嵌入式、笔记本等都使用 DDR3L。
三、引脚确定
我使用的是 野火_EBF6ULL S1 Pro
开发板,DDR型号是 MT41K256M16TW-107
,容量 256M*16 共 512M 字节,数据宽度 16 位。
四、DDR3测试
4.1 下载DDR测试软件和配置文件
NXP 提供了一个非常好用的 DDR 测试软件,叫做 ddr_stress_tester。
官网下载:https://community.nxp.com/docs/DOC-102005
百度网盘:
打开下载地址,如下图所示。
我们需要下载测试软件和测试需要使用的配置文件。如下图所示。
点击标号①,在附件中找到 配置文件
,点击附件下载即可。如下图所示。
点击标号②,在附件中找到 下载工具
,下载即可,如下图所示。
下载完成并解压如下图所示:
4.2 配置文件说明
打开 I.MX6UL_DDR3_Script_Aid_V0.02.xlsx
文件,如下图所示。
配置文件包括三部分内容:
-
配置文件的说明
帮助信息,告诉用户此文件如何使用。 -
配置选项
通过此表可以设置板子的 DDR 信息,最后生成一个 .inc 结尾的 DDR 初始化脚本文件。 -
根据配置选项自动生成的.inc格式的配置文件
这个 .inc 文件就包含了 DDR 的初始化信息,一般都是寄存器地址和对应的寄存器值。DDR测试软件会用到这个文件。
4.2.1 配置选项
第二个文件是我们要修改的配置选项,如下图所示。
上图中黄色和蓝色选项框需要根据硬件平台选择即可,这里默认是 NXP 官方评估板的配置参数。 如果使用的是 野火_EBF6ULL S1 Pro
开发板这些配置参数不用修改,保持默认即可。
具体的配置界面,主要分为三部分:
① 驱动信息(Device Information)
这部分内容配置DDR芯片相关信息。各配置项介绍如下:
- Manufacturer: DDR芯片厂商,默认为镁光(Micron),这个没有意义,如果不改,配置文件也是可以使用的。
- Memory part number: DDR芯片型号,可以不用设置,没有实际意义。
- Memory type: DDR类型,有DDR3-800、DDR3-1066、DDR3-1333和DDR3-1600。这里只能通过下拉框选择,根据你使用的DDR芯片选择即可,我们选择DDR3-1600。
- DRAM density (Gb): 芯片容量,单位是Gb,我们的DDR容量是512M字节 * 8 = 4Gb。容量根据实际容量选择即可。
- DRAM Bus Width: 数据宽度,16位。
- Number of Banks: DDR banks数量,通常情况下DDR3L都是8个bank。如有特殊情况根据实际数量选择即可。
- Number of ROW Addresses: 行地址线数量,可选11~16条。这个要具体所使用的DDR3芯片来定,这里使用15条。
- Number of COLUMN Addresses: 列地址线数量,可选9~12条。这个要具体所使用的DDR3芯片来定,这里使用10条。
- Page Size (K): DDR芯片页大小,我们使用的DDR页大小是2K,其他芯片根据芯片手册说明选择即可。
- Self-Refresh Temperature (SRT): 自刷新,这个选项框是对于 i.MX6UL 来说是不可修改的。
- tRCD=tRP=CL (ns)、tRC Min (ns)、tRAS Min (ns): DDR相关延时相关参数,这些参数从DDR芯片数据手册中获得。
② 系统信息(System Information)
系统信息大多是固定的,通常情况下不需要修改,具体介绍如下:
- i.Mx Part: 芯片类型,固定为i.MX6UL。
- Bus Width: 数据总线宽度,16位。
- Density per chip select (Gb): 每片DDR芯片的容量,单位Gb,我们的DDR容量是512M字节*8 = 4Gb,根实际使用的DDR芯片选择即可。
- Number of Chip Selects used: 使用了多少片DDR芯片,我们使用了1片,根据实际使用数量选择。
- Total DRAM Density (Gb): 总共的DDR容量,我们使用了1片512M字节的DDR3L,所以这里选择4。
- DRAM Clock Freq (MHz): DDR工作频率,默认400MHz。
- DRAM Clock Cycle Time (ns): 一个时钟周期的时间长度,根据DDR工作频率计算即可,1/400M =2.5ns。
- Address Mirror (for CS1): 地址镜像,仅CS1有效。选择Disable。
③ 硬件SI参数(SI Configuratin)
这里设置的是硬件阻抗,保持默认即可。
4.2.2 保存配置信息
修改完成后,配置信息自动更新到 RealView.inc
文件,如下图所示:
RealView.inc
不能直接用,我们需要新建一个以 .inc 结尾的文件,名字自定义,但最好不要用中文。
使用 VS code 打开 RealVies.inc
文件(也可使用其他工具打开)。复制原配置文件中的全部内容到新建的 ALIENTEK_512MB.inc 文件,保存即可。后面 DDR 测试软件会使用到该配置文件。
4.3 安装ddr_stress_tester
双击 ddr_stress_tester_v3.00_setup.exe,软件会自动生成我们需要的测试工具,如下图所示。
一直点击下一步即可,最终会在当前文件夹下生成我们需要的测试软件如下图所示。
进入生成的工具,如下图所示。
4.4 DDR校准
双击DDR_Tester.exe,打开测试软件如下图所示。
根据使用的硬件平台进行配置。
配置完成后,将开发板设置为 USB 启动方式,点击 Download
按钮将测试代码下载到开
发板中,下载完成以后 DDR Test Tool 下方的信息窗口就会输出一些内容。
DDR TestTool 工具有三个测试项:DDR Calibration、DDR Stess Test 和 32bit Memory Read/Write,我们首先要做校准测试,因为不同的 PCB、不同的 DDR3L 芯片对信号的影响不同,必须要进行校准,然后用新的校准值重新初始化 DDR。点击 Calibraton
按钮,校准完成后会输出校准后的寄存器值,如下图所示。
如果校准成功软件会输出成功提示信息,如上图标号①所示。标号②处是校准后得到的6个寄存器的值, 我们需要用这些寄存器的值替换校准文件中的值。
例如我们使用的配置文件为 ALIENTEK_512MB.inc
,使用 VS code 打开后直接搜索寄存器地址,例如修改 MMDC_MPWLDECTRL0
寄存器,则直接搜索 0x021b080c
,找到后直接使用校准后的值 0x00050003
替换现有值即可。特别提醒,默认情况下,配置文件中找不到 MMDC_MPWLDECTRL1(0x021b0810)
和 MPDGCTRL1 PHY0(0x021b0840)
, 这两个寄存器直接忽略即可。修改完成后保存即可。
ALIENTEK_512MB.inc
修改完成以后重新加载并下载到开发板中,至此 DDR 校准完成。
4.5 DDR性能测试
校准完成以后就可以进行 DDR3 超频测试,超频测试的目的就是为了检验 DDR3 硬件设计合不合理,一般 DDR3 能够超频到比标准频率高 10%~15%的话就认为硬件没有问题。
DDR Test Tool 支持 DDR3 超频测试,只要指定起始频率和终止频率,那么工具就会自动开始一点点的增加频率,直到达到终止频率或者测试失败。
设置好起始频率为 400MHz,终止频率为 600MHz,设置好以后点击 Stress Test
按钮开启超频测试,超频测试时间比较久,请耐心等待。
从上图可以看出,当超频到556MHz是出现了错误,说明我测试的这块开发板最高频率为552MHz, 不同开发板稍有差别,但都能满足400M的标准工作频率。
• 由 Leung 写于 2023 年 3 月 31 日
• 参考:13. DDR测试