XuSenfeng

个人站

复读了,更新随缘,有的文件不全或者图片缺失具体看我的笔记库(https://github.com/XuSenfeng/note)


DDR3

目录

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