DDR3
由于芯片内部的SRAM太小, 所以需要外界的RAM, 就是DDR
内存发展历史
-
RAM: 随机存储器, 可以对任意地址进行操作, 比如内存条、SRAM、SDRAM、DDR等都是RAM。
-
ROM:只读存储器, ROM是Flash,比如EMMC或UFS存储器, 因为历史原因,很多人还是将Flash叫做ROM。但是EMMC和UFS,甚至是NAND Flash,这些都是可以进行写操作的
-
SRAM: 静态随机存储器, 最开始的是芯片内部的, 后来由于内存不够用, 会进行外扩RAM, SRAM突出的特点就是无需刷新, 通常作为SOC的内部RAM使用或Cache使用, STM32内存的RAM或I.MX6U内部的OCRAM都是SRAM, 缺点就是成本高, 有数据线, 地址线
- SDRAM:同步动态随机存储器,价格低, 容量高, SDRAM中的数据需要不断的刷新来保证数据不会丢失,“随机”的意思就是可以读写任意地址的数据。需要时钟线, 常见的是100MHz, 133MHz, 166MHz, 200MHz, 通过行地址和列地址之分, 还要选择BANK区域
- DDR: 本质上是SDRAM, 对于数据的传输速率提升, 一个clk传输两次数据, 在上升沿和下降沿各传输一次数据,这个概念叫做预取
- DDR2: 进一步增加预取(prefetch),增加到了4bit,相当于比DDR多读取一倍的数据,因此DDR2的数据传输速率就是533~800MT/s
- 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,工作电压为1.2V。DDR3叫做标压DDR3,工作电压为1.5V,一般台式内存条都是DDR3。DDR3L是低压DDR3,工作电压为1.35V,一般手机、嵌入式、笔记本等都使用DDR3L
开发板上接了一个256MB/512MB的DDR3L,16位宽, BANK三根线, 有八个, 行15根, 线10根
时间参数
传输的速度
MT/S每秒传输多少M次数据DDR3 1600, DDR3 1866等不同的速率和时序有关
tRCD参数
行地址和列地址之间的延时, DDR的寻址流程是先指定BANK地址,然后再指定行地址,最后指定列地址确定最终要寻址的单元, BANK地址和行地址是同时发出的,这个命令叫做“行激活”, 行激活以后就发送列地址和具体的操作命令(读还是写),这两个是同时发出的,因此一般也用“读/写命令”表示列寻址。在行有效(行激活)到读写命令发出的这段时间间隔叫做tRCD
CL参数
数据从存储单元到内存芯片IO接口上还需要一段时间,这段时间就是非常著名的CL(CAS Latency),也就是列地址选通潜伏期, 一般tRCD和CL大小一样
tRC参数
tRC是两个ACTIVE命令,或者ACTIVE命令到REFRESH命令之间的周期
tRAS
是ACTIVE命令到PRECHARGE命令之间的最小时间
MMDC控制器
第35章
支持多重的DDR, 16位
最高支持的频率是400Mhz, 传输的速率是800MHz
提供的DDR3连接信号, 6ULL提供了专用的I/O, 不可以设置I/O的复用, 但是可以设置电气属性
时钟源: 使用的是PLL2-PFD2设置的是396MHz, MMDC的最大个频率就是这个, 之前已将设置好了, bootrom也进行了相关的设置
CBCMR[PRE_PERIPH2_CLK_SEL]进行选择时钟源, 01
CBCDR[PERIPH2_CLK_SEL](bit26)再次选择, 0这时候就是396分频
CBCDR[FABRIC_MMDC_PODF]设置分频
测试工具
ddr_stress_tester软件
有一个配置文件, 是一个excel到恩智浦官方可以找到, 配置好以后会同步更新RealView.inc文件, 然后ddr_stress会使用这个软件
测试: 会通过配置信息下载到芯片中
USB通讯, 然后可以进行超频测试
测试前进行校准
Write leveling calibration
MMDC_MPWLDECTRL0 ch0 (0x021b080c) = 0x00000000
MMDC_MPWLDECTRL1 ch0 (0x021b0810) = 0x00080008
Read DQS Gating calibration
MPDGCTRL0 PHY0 (0x021b083c) = 0x013C0138
MPDGCTRL1 PHY0 (0x021b0840) = 0x00000000
Read calibration
MPRDDLCTL PHY0 (0x021b0848) = 0x40403234
Write calibration
MPWRDLCTL PHY0 (0x021b0850) = 0x4040342E