1、查看sdram原理图
由上图我们看出使用了两片16位数据宽度sdram芯片构成了一个32位数据宽度,读写数据都是以32位来操作。从上图中我们还可以恶获取到sdram的片选信号nSCS连接在nGCS6,即对应着bank 6。
2、sdram寄存器配置
1)BUS WIDTH & WAIT CONTROL REGISTER (BWSCON)
该寄存器用于配置内存的位宽,和是否使能wait信号。此处我们的sdram是挂载在bank 6下面的,故只需要配置ST6、WS6、DW6即可,其它位保持默认为0。
2)BANK CONTROL REGISTER (BANKCONn: nGCS6-nGCS7)
该寄存器配置我们在bank 6下外挂的存储器的类型,我们此处使用的是SDRAM故配置MT为11,再根据SDRAM数据手册配置Trcd和SCAN。此处我配置Trcd=01,SCAN=01。
3)REFRESH CONTROL REGISTER
配置刷新控制寄存器REFEN=1使能自动刷新,TREFMD=0设置自动刷新,Trp=00配置为两个时钟,Tsrc=00配置为四个时钟,Refresh Counter=1269。
4)BANKSIZE REGISTER
配置BURST_EN=1,SCKE_EN=1,SCLK_EN=1,BK76MAP=001。
5)SDRAM MODE REGISTER SET REGISTER (MRSR)
配置CL=010。
3、sdram初始化
void sdram_init(void)
{
BWSCON = 0x02000000; //配置bank6外接SDRAM的数据位宽为32位
BANKCON6 = 0x00018005; //配置RAS# to CAS# delay为3个时钟
REFRESH = 0x009004f5; //配置SDRAM为自动刷新并设置自动刷新计数器
BANKSIZE = 0x000000b1; //配置SDRAM的突发模式和掉电模式
MRSRB6 = 0x00000020; //配置SDRAM输出数据延迟两个时钟
}
3、sdram读写测试
int sdram_test(void)
{
volatile unsigned char *p = (volatile unsigned char *)0x30000000;
int i;
// write sdram
for (i = 0; i < 1000; i++)
p[i] = 0x25;
// read sdram
for (i = 0; i < 1000; i++)
if (p[i] != 0x25)
return -1;
return 0;
}