详细的实验代码请查看这里:
一、 分类
主要分为:DRAM——小电容充电,需要不断刷新数据,速度慢;SRAM——不需要刷新,速度快名单功耗大,成本高(stepping stone为4K的SRAM)
DRAM分为:SDRAM(Synchronous Dynamic Radom Access Memery)同步随机存储器。
同步:工作需要同步时钟,用于命令和数据的发送
动态:不断对电容进行刷新
随机:不是线性存储,而是通过地址读写
DDR(Double Data Rate SDRAM)双倍速同步动态随机存储器,除了在时钟脉冲的上升沿传输数据,还可以在下降沿传输,速度是SDRAM的两倍。
二、 内存的内部结构
1. 数据存放在每个格,读写时先指定行地址,再指定列地址,内存芯片一般被分割为4个L-BANK(Logic_Bank)。
2. 寻址信息包括:L_Bank 选择信号、行地址以及列地址
3. 内存容量计算方法:一个芯片 = 4 X 单元格数 X 格的大小
如:HY57V561620(L): 4 Bank X 4M X 16bit = 32 MB
三、 关于S3C2440的内存地址空间(可参考2440手册第五章 Memory Controller)
1. 地址线:2440提供27根地址线,2的27次方 = 128MB
2. 片选信号:2440提供8个片选信号
3. 因此外置空间共有 8 X 128MB = 1GB (0X4000 0000)应该注意的是,各片选信号不能同时访问,内存一般就放到nGCS6,起始地址未0x3000 0000
4. 存储控制器
ARM9 Core——>存储器控制器——>内存、Nandflash、网卡芯片等
四、 内存芯片的硬件连接(参考HY57V561620内存芯片)
规格:4Bank X 4M X 16bit = 32MB, 2440的内存连接线为:32MB X 2 = 64MB
因此,2440可以采用并联,32bit位宽的方式,同时连接两块16bit的内存芯片,间接组成一块32bit位宽的内存芯片,每块32MB,两块就可以看成是一个64MB的内存块了
五、 存储控制器寄存器(参考2440芯片手册第五章 Memory Controller)
1. BWSCON (Bus WIDTH & WAIT CONTROL REGISTER)0x48000000 R/W
ST7 | [31] | 0 | ST6 | [27] | 0 |
WS7 | [30] | 0 | WS6 | [26] | 0 |
DW7 | [29:28] | 10 | DW6 | [25:24] | 10 |
因此,BWSCON可设置为0x2200 0000
2. BANKCON(0-5),以下地址:
0x4800 0004
0x4800 0008
0x4800 000c
0x4800 0010
0x4800 0014
0x4800 0018
都设置为0x0000 0700
3. 而BANKCON6(0x4800 001c)和BANKCON7(0x4800 0020)的默认值都是0x18008
MT | [16:15] | SDRAM | 11 |
[14:15] | 0 | ||
Trcd | [3:2] | 查看时序图:2 | CLOCKS:00 |
SCAN | [1:0] | column:CA0-CA8 | 9bit:01 |
因此,BANKCON6和BANKCON7应该设为0x00018001
4. REFRESH(SRAM 重新刷新功能)0x4800 0024 R/W 默认是0xac 0000
REFEN | [23] | 刷新使能 | 1 |
TREFMD | [22] | 自动刷新 | 0 |
Trp | [21:20] | 时序:2 CLKS | 00 |
Tsrc | [19:18] | 7 CLKS | 11 |
[17:16] | not_used | 00 | |
[15:11] | not_used | 00000 |
也就是(2^11 + 1 - 100 X 7.8)= 1269 也就是100 1111 0101也就是 0x008c 04f5
5. BANKSIZE(0x4800 0028)的设置为:
BURST_EN | [7] | 突发模式使能 | 1 |
[6] | not_used | 0 | |
SCKE_EN | [5] | 节电模式 | 1 |
SCLK_EN | [4] | 1 | |
[3] | not_used | 0 | |
BKMAP | [2:0] | 64MB | 001 |
6. 而MRSRB6(0x4800 002c)和MRSRB7(0x4800 0030)(SDRAM MODE REGISTER SET REGISTER)
CL | [6:4] | CAS Latercy 3 CLOCKS | 011 |
六、 整个内存初始化实验代码如下:
#define mem_con 0x48000000
mem_init:
ldr r0, =mem_con
add r3, r0,#4*13
adrl r1, mem_data
0:
ldr r2, [r1], #4
str r2, [r0], #4
cmp r0, r3
bne 0b
mov pc, lr
mem_data:
.long 0x22000000
.long 0x00000700
.long 0x00000700
.long 0x00000700
.long 0x00000700
.long 0x00000700
.long 0x00000700
.long 0x00018001
.long 0x00018001
.long 0x008c04f5
.long 0x000000b1
.long 0x00000030
.long 0x00000030