目录
文章目录
一,啥是DDR3
I.MX6U-ALPHA 开发板上带有一个 256MB/512MB 的 DDR3 内存芯片。 I.MX6U支持 LPDDR2、 LPDDR3/DDR3, I.MX6U-ALPHA开发板上选择的是 DDR3。
1.1 RAM 随机存储器。
可以随时进行读写操作,速度很快,掉电以后数据会丢失。
内存条、SRAM、SDRAM、DDR 等都是 RAM。
保存程序数据、中间结果,如:存储变量。
1.2 ROM 只读存储器。
可以进行写操作的!只是写起来比较麻烦,要先发送要先进行擦除,然后在发送要写的地址或扇区,最后才是要写入的数据。如Flash。
256MB/512MB 的 DDR3 就是 RAM,而 512MB NANF Flash 或 8GB EMMC 就是 ROM。
1.3 SRAM 静态随机存储器。
STM32F103/F407 内部 RAM 比较小,在一些比较耗费内存的应用中会出现内存捉紧的情况,比如 emWin 做 UI 界面。基本都会外扩一个512KB 或 1MB 的 SRAM 。
1.4 SDRAM 同步动态随机存储器。
“同步”的意思是 SDRAM 工作需要时钟线, “动态” 的意思是 SDRAM 中的数据需要不断的刷新来保证数据不会丢失, “随机”的意思就是可以读写任意地址的数据。
与 SRAM 相比,SDRAM 集成度高、功耗低、成本低、适合做大容量存储,但是需要定时刷新来保证数据不会丢失。因此 SDRAM 适合用来做内存条,SRAM 适合做高速缓存或 MCU内部的 RAM。
SDRAM 目前已经发展到了第四代,分别为:SDRAM、DDR SDRAM、DDR2SDRAM、DDR3 SDRAM、DDR4 SDRAM。
STM32 开发板最常用的华邦W9825G6KH 。W9825G6KH 是一款 16 位宽(数据位为 16 位)、32MB 的 SDRAM、速度一般为 133MHz、166MHz 或 200MHz。
框图:
- 控制线
CLK :时钟线,SDRAM 是同步动态随机存储器, “同步”的意思就是时钟,因此需要一根额外的时钟线,这是和 SRAM 最大的不同,SRAM 没有时钟线。
CKE :时钟使能信号线,SRAM 没有 CKE 信号。
CS :片选信号,这个和 SRAM 一样,都有片选信号。
RAS:行选通信号,低电平有效,SDRAM 和 SRAM 的寻址方式不同,SDRAM 按照行、列来确定某个具体的存储区域。
RAS 是行选通信号,表示要发送行地址.
CAS :列选通信号,和 RAS 类似,低电平有效,选中以后就可以发送列地址了。
WE :写使能信号,低电平有效。 - A10 地址线
A10 地址线还有另外一个作用, A10 还控制着 Auto-precharge, 也就是预充电。
SDRAM芯片内部会分为多个 BANK。SDRAM 在读写完成以后,如果要对同一个 BANK 中的另一行进行寻址操作就必须将原来有效的行关闭,然后发送新的行/列地址,关闭现在工作的行, 准备打开新行的操作就叫做预充电。一般 SDSRAM 都支持自动预充电的功能。 - 地址线
对于 W9825G6KH 来说一共有 A0-A12,共 13 根地址线, SDRAM 寻址是按照行地址和列地址来访问的,因此这 A0~A12 包含了行地址和列地址。
不同的 SDRAM 芯片,根据其位宽、容量等的不同,行列地址数是不同的,这个在 SDRAM 的数据手册里面会也清楚的。比如 W9825G6KH 的 A0-A8 是列地址,一共 9 位列地址,A0~A12 是行地址,一共 13位,因此可寻址范围为:29*213=4194304B=4MB,W9825G6KH 为 16 位宽(2 个字节),因此还需要对 4MB 进行乘 2 处理, 得到 4*2=8MB, 但是 W9825G6KH 是一个 32MB 的 SDRAM 啊,为什么算出来只有 8MB, 仅仅为实际容量的 1/4。 8MB 只是一个 BANK 的容量,W9825G6KH 一共有 4 个 BANK。 - BANK 选择线
BS0 和 BS1 是 BANK 选择信号线,单一的 BANK 会带来严重的寻址冲突, 减低内存访问效率。
图中的⑤就是 W9825G6KH 就是 4 个 BANK 示意图,每个 SDRAM数据手册里面都会写清楚自己是几BANK。 既然有4个BANK, 那么在访问的时候就需要告诉SDRAM, 我们现在需要访问哪个BANK,BS0 和 BS1 就是为此而生的, 4 个 BANK 刚好 2 根线, 如果是 8 个 BANK 的话就需要三根线,也就是 BS0~BS2。BS0、BS1 这两个线也是 SRAM 所没有的。 - BANK 区域
这部分就是 W9825G6KH 的 4 个 BANK 区域。这个概念也是 SRAM 所没有的。 - 数据线
W9825G6KH 是 16 位宽的 SDRAM,因此有 16 根数据线,DQ0~DQ15,不同的位宽其数据线数量不同,这个和 SRAM 是一样的。 - 高低字节选择
W9825G6KH 是一个 16 位的 SDRAM,因此就分为低字节数据和高字节数据,LDQM 和
UDQM 就是低字节和高字节选择信号,这个也和 SRAM 一样。
1.5 DDR->双倍速率 SDRAM
DDR 内存是 SDRAM 的升级版本,SDRAM 分为 SDR SDRAM、DDR SDRAM、DDR2 SDRAM、DDR3 SDRAM、DDR4 SDRAM。
SDRAM 在一个 CLK 周期传输一次数据.
DDR 在一个 CLK 周期传输两次数据,也就是在上升沿和下降沿各传输一次数据,这个概念叫做预取(prefetch),相当于DDR 的预取为 2bit,因此DDR 的速度直接加倍!
DDR2 在 DDR 基础上进一步增加预取(prefetch),增加到了 4bit,相当于比 DDR 多读取一倍的数据.
DDR3 在 DDR2 的基础上将预取(prefetch)提高到 8bit,因此又获得了比 DDR2 高一倍的传输速率.
I.MX6U-ALPHA 开发板上接了一个 256MB/512MB 的 DDR3L,16 位宽,型号为NT5CC128M16JR/MT5CC256M16EP,nanya 公司出品的,分为对应 256MB 和 512MB 容量。EMMC 核心板上用的 512MB 容量的 DDR3L, NAND 核心板上用的 256MB 容量的 DDR3L。(我的是EMMC)
DDR3结构框图
- 控制线
ODT:片上终端使能,ODT 使能和禁止片内终端电阻。
ZQ:输出驱动校准的外部参考引脚,此引脚应该外接一个 240 欧的电阻到 VSSQ 上,一般直接接地。
RESET :复位引脚,低电平有效。
CKE :时钟使能引脚。
A12 :A12 是地址引脚,但是有也有另外一个功能,因此也叫做 BC 引脚,A12 会在 READ和 WRITE 命令期间被采样,以决定 burst chop 是否会被执行。
CK 和 CK# :时钟信号,DDR3 的时钟线是差分时钟线,所有的控制和地址信号都会在 CK对的上升沿和 CK#的下降沿交叉处被采集。
CS#:片选信号,低电平有效。
RAS# 、CAS#和 和 WE#:行选通信号、列选通信号和写使能信号。 - 地址线
A[14:0]为地址线,A0-A14,一共 15 根地址线,根据 NT5CC256M16ER-EK 的数据手册可知,列地址为 A0-A9,共 10 根,行地址为 A0~A14,共 15 根,因此一个 BANK 的大小就是210*2152=32MB2=64MB,根据图 23.1.4.2 可知一共有 8 个 BANK,因此 DDR3L 的容量就是 64*8=512MB。 - BANK 选择线
一片 DDR3 有 8 个 BANK,因此需要 3 个线才能实现 8 个 BANK 的选择,BA0~BA2 就是用于完成 BANK 选择的。 - BANK 区域
DDR3 一般都是 8 个 BANK 区域。 - 数据线
因为是 16 位宽的,因此有 16 根数据线,分别为 DQ0~DQ15。 - 数据选通引脚
DQS 和 DQS#是数据选通引脚, 为差分信号, 读的时候是输出, 写的时候是输入。 LDQS(有的叫做 DQSL)和 LDQS#(有的叫做 DQSL#)对应低字节, 也就是 DQ0-7, UDQS(有的叫做 DQSU)和 UDQS#(有的叫做 DQSU#),对应高字节,也就是 DQ8~15。 - 数据输入屏蔽引脚
DM 是写数据收入屏蔽引脚。
二,购买DDR3,你要知道什么
2.1 传输速率
比如 1066MT/S、1600MT/S、1866MT/S 等,这个是首要考虑的,因为这个决定了 DDR3 内存的最高传输速率。
2.2 tRCD 参数
tRCD 全称是 RAS-to-CAS Delay,也就是行寻址到列寻址之间的延迟。DDR 的寻址流程是先指定 BANK 地址,然后在指定行地址,最后指定列地址确定最终要寻址的单元。BANK 地址和行地址是同时发出的,这个命令叫做“行激活”(Row Active)。行激活以后就发送列地址和具体的操作命令(读还是写),这两个是同时发出的,因此一般也用“读/写命令”表示列寻址。在行有效(行激活)到读写命令发出的这段时间间隔叫做 tRCD,如图所示:
一 般 DDR3 数 据 手 册 中 都 会 给 出 tRCD 的 时 间 值 , 比 如NT5CC256M16EP-EK 这个 DDR3,tRCD 参数如图 所示:
tRCD 为 13.91ns,这个我们在初始化 DDR3 的时候需要配置。有时候大家也会看到 “13-13-13” 之类的参数, 这个是用来描述 CL-tRCD-TRP 的, 如图所示:
NT5CC256M16ER-EK 这个 DDR3 的 CL-TRCD-TRP 时间参数为 “13-13-13” 。因此 tRCD=13,这里的 13 不是 ns 数,而是 CLK 时间数,表示 13 个 CLK 周期。
2.3 CL参数
当列地址发出以后就会触发数据传输,但是从数据从存储单元到内存芯片 IO 接口上还需要一段时间,这段时间就是非常著名的 CL(CAS Latency),也就是列地址选通潜伏期,如图所示:
CL 参数一般在 DDR3 的数据手册中可以找到, 比如 NT5CC256M16EP-EK 的 CL 值就是 13个时钟周期,一般 tRCD 和 CL 大小一样。
2.4 AL参数
在 DDR 的发展中,提出了一个前置 CAS 的概念,目的是为了解决 DDR 中的指令冲突,它允许 CAS 信号紧随着 RAS 发送,相当于将 DDR 中的 CAS 前置了。但是读/写操作并没有因此提前,依旧要保证足够的延迟/潜伏期,为此引入了 AL(Additive Latency),单位也是时钟周期数。AL+CL 组成了 RL(Read Latency),从 DDR2 开始还引入了写潜伏期 WL(Write Latency),
WL 表示写命令发出以后到第一笔数据写入的潜伏期。 引入 AL 以后的读时序如图所示:
①、tRCD,前面已经说过了。
②、AL。
③、CL。
④、RL 为读潜伏期,RL=AL+CL。
2.5 tRC参数
tRC 是两个 ACTIVE 命令,或者 ACTIVE 命令到 REFRESH 命令之间的周期,DDR3L 数据手册会给出这个值,比如 NT5CC256M16EP-EK 的 tRC 值为 47.91ns。
2.6 tRAS参数
tRAS 是 ACTIVE 命令到 PRECHARGE 命令之间的最小时间,DDR3L 的数据手册同样也会给出此参数,NT5CC256M16EP-EK 的 tRAS 值为 34ns。
三, I.MX6U MMDC 控制器
STM32 的 FMC 或 FSMC 外设用于连接 SRAM 或 SDRAM,MMDC 就是 I.MX6U的内存控制器。
3.1 MMDC控制器
MMDC 是一个多模的 DDR 控制器,可以连接 16 位宽的 DDR3/DDR3L、16 位宽的 LPDDR2,MMDC 是一个可配置、高性能的 DDR 控制器。MMDC 外设包含一个内核(MMDC_CORE)和 PHY(MMDC_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 校准 DDRI/O 引脚、校准 DDR 驱动能力。
3.2 MMDC 控制器信号引脚
STM32 的 FMC/FSMC 的 IO 引脚是带有复用功能的,如果不接 SRAM 或SDRAM 的话 FMC/FSMC 是可以用作其他外设 IO 的。但是,DDR 接口不一样,DDR 对于硬件要求非常严格,因此 DDR 的引脚都是独立的,一般没有复用功能,只做为 DDR
引脚使用。I.MX6U 也有专用的 DDR 引脚,如图所示:
注意,DDR 引脚的电气属性寄存器和普通的外设引脚电气属性寄存器不同!
3.3 MMDC 控制器时钟源
I.MX6U 的 DDR 或者 MDDC 的时钟频率为 400MHz,查阅 I.MX6ULL 参考手册的《Chapter 18 Clock Controller Module(CCM)》章节。MMDC 时钟源如图所示:
主要分为 4 部分
- pre_periph2 时钟选择器
也就是 periph2_clkd 的前级选择器,由 CBCMR 寄存器的PRE_PERIPH2_CLK_SEL 位(bit22:21)来控制,一共有四种可选方案.
当 PRE_PERIPH2_CLK_SEL 为 0x01 的时候选中 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)来控制,
当为 0 的时候选择 pll2_main_clk作为periph2_clk 的时钟源,
当为 1 的时候选择 periph2_clk2_clk作为periph2_clk的时钟源。
这里肯定要将 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。
I.MX6U 参考手册一直说 DDR 的频率为 400MHz,但是实际只有 396MHz。
3.4 DDR3L 的封装介绍
DDR3L的容量不同的话地址线是不同的,比如行地址和列地址线数就不同。
但是 DDR3L 厂商为了方便选择将不同容量的 DDR3 封装做成一样,没有用到的地址线 DDR3L 芯片会屏蔽掉。
而且,根据规定,所有厂商的 DDR 芯片 IO 一摸一样,不管是引脚定义还是引脚间距,但是芯片外形大小可能不同。
只要做好硬件,可以在不需要修改硬件 PCB 的前提下,随意的更换不同容量、不同品牌的 DDR3L 芯片,极大的方便了我们的芯片选型。