S3C2440内存控制器与SDRAM

1、S3C2440中内存控制器的简单介绍

  1. 内存控制器的作用是什么,它有哪些特点?
  2. 内存控制器是怎么被CPU使用的?
  3. CPU的地址总线是怎么与存储类芯片进行连接的?

1、它的作用与特点如图1,以下是简单的翻译:
S3C2440A内存控制器提供外部内存访问所需的内存控制信号。
S3C2440A具有以下特点:
-小/大端(可由软件选择)。
-地址空间:每个BANK都有128Mb(总共1GB/8个BANK)。
-除BANK0的可编程总线位宽位(16/32位)外,其他的所有BANK的可编程总线位宽位有三种(8/16/32位)。
-总共8个BANK:
BANK0 ~ BANK5 用于ROM、SRAM等。
BANK6 ~ BANK7 可用于ROM、SRAM、SDRAM等
-BANK0 ~ BANK6 共7个BANK的开始地址是固定的。
-BANK7 的开始地址和大小是可编程的。
-每个BANK的存取周期都是可编程的。
-可通过外部的 wait 信号进行等待,以延长总线访问周期。
-在SDRAM下支持自刷新和电源关闭模式。

图 1

2、在我们的JZ2440开发板上有着许多片内外设(如:GPIO、UART、存储类设备等),那么CPU如何操作这些外设的呢?当CPU去操作非存储类设备时,它是直接去操作CPU内部的寄存器;而它在操作存储类设备(如:NOR FLASH,DM9000、SDRAM等)时,它首先发出32bit的ADDR给内存控制器,然后内存控制器根据ADDR的范围发出片选信号,随后取出ADDR中的ADDR0~ADDR26发给选中的外设并与之进行数据交换,最后把处理后的数据返回给CPU;由第1点我们知道,内存控制器总共有8个BANK,每个BANK为128Mb(2^27),BANK的分布如图2

图 2

3、在这里我们主要介绍CPU与ROM连接的样例,CPU其他的存储类芯片的连接类似(参考S3C2440芯片手册)。通过图3、4、5我们可以看出CPU是用A0和8位ROM的A0相连,A1和16位ROM的A0相连,A2和32位ROM的A0相连。8bit的ROM中一个字节占用一个存储单元,内存控制器可以直接访问到具体的1Byte并返回给CPU;16bit的ROM中两个字节占用一个存储单元,内存控制器一次最少取2Byte,然后再根据A0的值来确定具体的字节并返回给CPU;32bit的ROM中四个字节占用一个存储单元,内存控制器一次最少取4Byte,然后再根据A1和A0的值来确定具体的字节并返回给CPU;

图 3
图 4
图 5

2、SDRAM的简单配置

  1. JZ2440上的SDRAM的内存是多大,它的q起始地址是多少?
  2. SDRAM的简单配置。

1、在JZ2440上接的有2块EM63A165TS-6G(16M x 16 bit),故总内存是64MB的。由图6我们可以看到与SDRAM的A0连接的是CPU地址总线的第2位(这也符号前文第3点相符),可是为什么只有17根地址线(加上第0根和第1根)与SDRAM连接呢,2^17也才128kb啊,这其实是因为SDRAM有点特殊,它的地址分为行/列地址(也即图6中的nSRAS和nSCAS),访问一次SDRAM需要发送2次地址信号。SDRAM中一般由4个L-BANK,它是通过ADDR24和ADDR25来选择其中一个L-BANK的,而L-BANK的行列地址是通过ADDR2-ADDR2来进行选择的。当nSRA有效时,通过ADDR2-ADDR14发送行地址;当nSCAS有效时,通过ADDR2~ADDR10发出列地址。在图6中我们还得知它的片选引脚位nGCS6,结合图2得它的起始地址为0x30000000。(参考韦东山老师写的《嵌入式Linux开发完全应用手册》)

图 6

2、通过查看S3C2440芯片手册我们看到再内存控制器中对SDRAN进行配置时我们需要设置的寄存器有:BWSCON、BANKCON6\7、REFRESH、BANKSIZE、MRSRB6\7
通过图7我们知道在BWSCON寄存器中我们只需要设置BWSCON[27:24],因为我们接了2块16bit的SDRAM且一般不需要wait信号,同时ST6设为0,因为一般将BANK7和BAANK6设为一样的,所以BWSCON = 0x22000000
根据图8我们设置BANKCON6 = 0x18001;BANKCON7 = 0x18001,其中我们用的SDRAM列地址数(SCAN)为9bit,根据图9我们取Trcd=20ns,因为我们的tHCLK为10ns,所以这里Trcd=0b00;

图 7
图 8
图 9
图 10

在图11的REFRESH寄存器中的Trp由图9取20ns、Trc取60ns,故REFRESH[21:20]=0b00,REFRESH[19:18]=0b01,结合图10和图11得REFRESH[10:0]=1269;故REFRESH = 0x8404F5;根据图12有BANKSIZE = 0x0B1

图 11
图 12

通过图10和图13我们设置 `MRSRB6 = 0x20; MRSRB7 = 0x20;

图 13

下面是将上问设置的寄存器整理在一起的代码。

void sdram_init(void)
{
	BWSCON = 0x22000000;

	BANKCON6 = 0x18001;
	BANKCON7 = 0x18001;

	REFRESH = 0x8404F5;

	BANKSIZE = 0x0B1;

	MRSRB6 = 0x20;
	MRSRB7 = 0x20;	
}

以上只是很简单的介绍了下SDRAM以及如何配置,如果想要深入了解内存的话建议看:高手进阶,终极内存技术指南——完整/进阶版。

另外如果想了解关于SDRAM、SRAM、NAND FLSH、NOR FLASH等的区别请点我

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值