注:以下内容学习于韦东山老师arm裸机第一期视频教程
如果想要完全了解SDRAM,参考: 高手进阶,终极内存技术指南-完整/进阶版
一.SDRAM的访问方法
1.1 SDRAM结构图
![](https://i-blog.csdnimg.cn/blog_migrate/353ea44ef45c1b80bae95c13684071f0.png)
a.由4个BANK组成,可以看作是表格
b.里面的每个格子有16位数据(2440接有两片SDRAM,每一片提供16位数据)
c.访问时,需要先发出片选信号选中SDRAM,然后发出BANK信号选中哪个BANK,最后发出行地址和列地址(这些信号都是由内存控制器发出)
1.2 内存控制器执行流程
假设当CPU执行 ldr r0, =0x30000000
ldr r1, [r0] /* 读内存的数据 */
1.2.1 CPU将地址发送给内存控制器
1.2.2 内存控制器根据地址发出片选信号nGCS6
1.2.3 根据接的类型是SDRAM,拆分地址
a.BANK地址
b.发出行地址
c.发出列地址
(需要去设置每个地址有多少地址条,设置内存控制器中的相关寄存器)
1.2.4 读取数据
二.内存控制器中相关寄存器的设置
2.1 设置BWSCON寄存器,如下图 (最终设置为0x22000000)
我们只需要设置BANK6
2.1.1 DW6 [25:24] Determines data bus width for bank 6(决定bank6的位宽)
00 = 8-bit 01 = 16-bit, 10 = 32-bit 11 = reserved
我们使用两个16位的芯片拼接成32位的,因此设置为10
2.1.2 WS6 [26] Determines WAIT status for bank 6.(决定bank6的等待信号)
0 = WAIT disable, 1 = WAIT enable
假设CPU的读写速度很慢,CPU发出读写命令后,内存芯片没有在规定时间准备好数据,可以向CPU发出wait信号,请求CPU宽限一点时间,我们用不到设置为0
2.1.3 ST6 [27] Determines SRAM for using UB/LB for bank 6.(决定SRAM是否使用UB/LB引脚)
0 = Not using UB/LB (The pins are dedicated nWBE[3:0)(nWBE表示写某个字节的时候是否真正写进去)
1 = Using UB/LB (The pins are dedicated nBE[3:0])(读/写字节的时候都可以使用nBE[3:0]这个引脚来决定是否使用这个byte)
我们的内存是32位的,如果我们想要修改某个字节,仍然需要提供4个字节的数据,这时便需要通过nWBE[3:0](SDRAM中的L_nWBE[3:0])
当想要读一个字节的时候,仍然会读到32位的数据,会从中挑出需要的字节(具体方法在上一节中提到过).因此不需要nBE来屏蔽某一个字节
因此对于SDRAM,我们选择为0
2.2 设置BANKCON6寄存器,如下图 (最终设置为0x18001)
![](https://i-blog.csdnimg.cn/blog_migrate/da9bf392242fc0f40c59ecea7d788c1d.png)
设置该寄存器对照时序图如下: