一、内存控制器简介
- nGCSx片选信号是内存控制器自动选择的
假设CPU请求地址0x3000_0010
的数据内存控制器会自动片选nGCS6请求Bank6的数据
- 每个Bank128MB大小
- 内存控制器配置的本质就是让各个Bank满足外接的内存设备时序要求,所以需要结合外接设备芯片手册分析
一、Norflash简单例子
根据韦东山老师分析外接Norflash只要满足Tacc$\geq$70ns就能满足时序要求
这里配置BANKCON0[10:8],初始化上电是HCLK=12M(外接晶振)14个时钟就是1166ns,满足要求绰绰有余。初始化时钟之后HCLK=100M,1个时钟就是10ns所以配置为101也就是8个时钟就能满足要求
只读寄存器BWSCON,这里只关心BANK0相关位,根据外部引脚决定位宽
注意示例代码需要在norflash上才能观察到现象
二、SDRAM
接在开发板BANK6,起始地址0x3000_0000
BWSCON
DW6设置为32-bit,Bank7没有用到习惯上设置为一样
BANKCON6
MT设置为11 SDRAM, Trcd表示发送row地址到column地址之间的间隔,这里设置为20ns,因为HLCK=100M一个时钟是10ns这里设置为00,列地址CA0~CA8一共是9位,设置为0x00018001
REFRESH
- 23位 设置为1 使能刷新
- 22位 设置为0 自动刷新
- [21:20]位 预充电时钟 设置为20ns两个周期00
- [19:18]位 trc设置为70ns 7个周期 所以tsrc设置为5个周期 01
- [10:0]位 刷新周期根据数据手册
8192 refresh cycles / 64ms
算出是7.8us,根据示例设置为1296
最终设置值为0x008404f5
BANKSIZE
- 7位设置为突发写入 一次写入多字节
- 5位 使能休眠模式 1
- 4位 设置为1
- [21:20]位 64M 设置为001
最终设置为0x000000b1
MRSRB6
- 选择fixed标记的位
- [6:4]位 CAS Latency表示发送地址之后几个时钟出数据,设置为2 3 都可以,这里设置为2
这个寄存器就是配置SDRAM的模式寄存器的和FPGA里初始化最后一个LMR命令一样
这里设置为0x00000020
代码
需要把BANK7相关寄存器也需要一起设置代码才会生效,原因目前不明
#include "s3c2440.h"
void Init_SDRAM(){
BWSCON = 0x22000000;
BANKCON6 = 0x00018001;
BANKCON7 = 0x00018001;
REFRESH = 0x008404f5;
BANKSIZE = 0x000000b1;
MRSRB6 = 0x00000020;
MRSRB7 = 0x00000020;
}
int SDRAM_Test(){
volatile unsigned char *p = (volatile unsigned char *)0x30000000;
int i;
//写
for(i=0; i<1000; i++)
p[i] = 0x55;
//读
for(i=0; i<1000; i++)
if(p[i] != 0x55)
return -1;
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。