SDRAM:Synchronous Dynamic Random Access Memory,同步动态随机存储器,同步是指内存工作需要同步时钟,内部的命令的发送与数据的传输都以它为基准;动态是指存储阵列需要不断的刷新来保证数据不丢失;随机是指数据不是线性依次存储,而是自由指定地址进行数据读写


一.内部结构

原理图如下:

在这里插入图片描述

存储逻辑结构:

在这里插入图片描述

可以看出SDRAM的内部是一个阵列,就像表格一样,其寻址方式是按照块、行、列来的,即先选定SDRAM芯片,然后发出块信号确定那一块,再发出行信号确定哪一行,再发出列信号确定哪一列。


CPU对SDRAM的访问可以分为以下几步:


CPU对存储控制器发出统一编址

内存控制器发出片选信号,选定SDRAM芯片

选定哪一个Bank(通过ADDR24、ADDR25信号线选定,总共4个Bank)

对选定的Bank进行行列寻址

找到对应的地址,通过32根数据线进行数据传输(原理图中是32位)

看起来很简单,但是我们要考虑到,不同规格SDRAM对应着不同的寻址方式,因为不同的SDRAM可能行列数不一样,对时序要求不一样,所以在访问SDRAM之前,我们要配置存储控制器中的一些寄存器来匹配SDRAM!!!


二.相关寄存器

存储控制器一共有13个寄存器,6种寄存器,对BANK0~BANK5进行访问时,只需要配置BWSCON和BANKCONx寄存器,但是对SDRAM访问,不仅仅需要对这俩个寄存器进行配置,还需要额外配置4个寄存器。


下面以访问SDRAM为例子介绍一下这些寄存器(按照芯片手册中的顺序来介绍):


BWSCON

位宽&等待控制寄存器

在这里插入图片描述

ST6:决定是否使用SDRAM的数据掩码,对SDRAM时为0,对SRAM时为1。

WS6:决定是否使用WAIT信号,一般不使用。(WAIT信号就是在SDRAM没准备好的时候,由SDRAM发给CPU,请求延迟一段时间)

DW6:决定BANK位宽,自然是32位。

所以,BWSCON寄存器要或运算的值为:0x02000000


BANKCON6

BANK控制寄存器,用来控制外接设备的访问时序的,BANK0~BANK5默认0X0700

在这里插入图片描述

对于SDRAM的访问,我们需要配置的就是图中阴影部分的:


MT:决定BANK外接的是SDRAM还是SRAM,SDRAM选择11.


Trcd:行列信号之间的延迟时间,根据芯片手册得知最小为21ns,而我们的HCLK时钟为100MHz,一个clock10ns,所以保险起见选择30ns,即:01。


SCAN:设置列地址位,这里使用的SDRAM列地址一共9位,所以为:01.

在这里插入图片描述

所以,BANKCON6寄存器要或运算的值为:0x00018005


REFRESH

刷新控制寄存器,用来控制SDRAM的刷新模式和刷新频率。我们知道,SDRAM中的存储阵列需要不断的刷新来保证数据不丢失,所以就要配置刷新控制寄存器。

在这里插入图片描述

REFEN:决定使能刷新功能,当然是开启了,值为:1


TREFMD:刷新的模式,一般自动刷新,值为:0


Trp:根据芯片手册得知20ns保险,对应2clocks,值为:00


Tsrc:默认即可


Refresh Counter:刷新计数的值,查SDRAM的手册可得8192个刷新周期为64ms,则每一个刷新周期为7.8125ns,通过公式计算可得刷新计数的值为:1955

在这里插入图片描述

所以,REFRESH寄存器要或运算的值为:0x008c07a3


BANKSIZE

在这里插入图片描述

BURST_EN:决定是否允许突发传输,值为:1。

SCKE_EN:决定是否使用SCKE信号来决定省电模式,值为:1。

SCLK_EN:决定SCLK时钟信号的产生模式,值为:1。

BK76MAP:决定BANK6、BANK7的大小,这里SDRAM是64M,所以值为:001。(BANK0~BANK5的大小是128M固定的,BANK6、BANK7的大小是可以控制的)

所以,BANKSIZE寄存器要或运算的值为:0x000000b1


MRSR

SDRAM模式设置寄存器

在这里插入图片描述

只有CL的值是可以修改的,查询芯片手册:

在这里插入图片描述

可知,CL可以是2clock或者是3clock,保险起见,值为:011


所以,MRSR寄存器要或运算的值为:0x00000030


/**********************************************************************************************************************/

综上所述,对SDRAM初始化的代码为:


void SDRAM_Init(void)

{

    /* 对BANK6进行配置 以访问SDRAM */

    BWSCON   |= 0x02000000;//对SDRAM使用数据掩码、不使用WAIT信号、设置BANK6位宽32bit

    BANKCON6 = 0x00018005;//BANK6外接SDRAM、行列信号间延迟3clocks、设置列地址位数

    REFRESH  = 0x008c07a3;//配置刷新模式及刷新计数值

    BANKSIZE = 0x000000b1;//设置BANK6大小为64MB

    MRSRB6   = 0x00000030;//设置CL为3clocks

}


三.读写SDRAM

对SDRAM进行配置之后,进行读写操作,看看写进去的值和读出来的值是否统一。


测试就直接写在main.c中吧:


#include "s3c2440_soc.h"

#include "uart.h"


void SDRAM_Init(void)

{

    /* 对BANK6进行配置 以访问SDRAM */

    BWSCON   |= 0x02000000;//对SDRAM使用数据掩码、不使用WAIT信号、设置BANK6位宽32bit

    BANKCON6 = 0x00018005;//BANK6外接SDRAM、行列信号间延迟3clocks、设置列地址位数

    REFRESH  = 0x008c07a3;//配置刷新模式及刷新计数值

    BANKSIZE = 0x000000b1;//设置BANK6大小为64MB

    MRSRB6   = 0x00000030;//设置CL为3clocks

}


int SDRAM_Test(void)

{

    /* BANK6 基地址0x30000000 */

    volatile unsigned char *p = (volatile unsigned char *)(0x30000000);

    int n;

    /* 写入20Byte数据 */

    for( n=0;n<20;n++ )

    {

        *(p+n) = 0xbb;

    }


    for( n=0;n<20;n++ )

    {

        if( 0xbb != *(p+n) )

        return 0;

    }


    return 1;

}


int main(void)

{

    SDRAM_Init();

    uart0_init();


    if( SDRAM_Test() )

        puts("OK!!!n");

    else

        puts("NOT OK!!!n");


    return 0;

    

}


代码亲测可以。

关键字:S3C2440  内部结构 引用地址:S3C2440—8.读写SDRAM

上一篇:S3C2440—9.复制程序到SDRAM中执行
下一篇:S3C2440—7.存储控制器访问外设

推荐阅读

参考文件:STM32固件库使用手册的中文翻译版.pdf 如图1 我们先把USART初始化函数添加到主函数,如图二 包括Baudrate,Word Length,Stop Bit,Parity,Hardware Flow Control(硬件流控制),Usart Mode; UE使能,使能串口外设,如图3 3.串口初始化,串口外设使能之后,就要发送数据了如图4; 4.发送完成标志位函数,如图5; 程序1 实现功能代码如下/*****...
“传统工业机器人发展受到了一定制约,新一代的机器人增长乏力,新的公司在不断倒闭关门,是不是机器人的冬天来了?还是机器人正处于进入春天的过渡期,也就是所谓的‘倒春寒’,即将迎来新的发展机遇?”在2019世界机器人大会现场,新松机器人自动化股份有限公司创始人、总裁曲道奎抛出了这个问题。 根据国际机器人联合会数据,在全球经济发展滞缓的环...
  一直以来有不少新手在微控的QQ群和微控技术论坛中经常会问到关在用MSP430设计时碰到3V与5V之间电平互换问题。为此,我大概简明地整理了一份关这3V与5V互换的电路图。希望能帮忙到入门的新手和学生。  电路参考与下图所示     图1:这是一个5V转3V电平的单向电路,其原理为将5V电平分压成3V供MSP430单片机系统。其电阻分配可以取大点(电流功耗的...
近日,科翰龙自主研发的晶圆打码机WM-SC800R通过验收。北京亦庄消息显示,这是国内首台通过FAB厂(通常指半导体工厂)验收的具有自主知识产权的晶圆(Wafer)ID打码设备。据介绍,两年前,WM-SC800R就在FAB厂的8英寸集成电路晶圆生产线上进行晶圆(Wafer)ID软打码测试及试生产。检测结果优良,该晶圆打码机所加工的晶圆(Wafer)ID码完全达到了SEMI(半导体设备...

史海拾趣

问答坊 | AI 解惑

2006年湖北省电子设计大赛题目:智能搬运车

本帖最后由 paulhyde 于 2014-9-15 03:55 编辑 题目见附件  …

查看全部问答∨

单片机与单片机之间的串口通信

本帖最后由 paulhyde 于 2014-9-15 08:57 编辑 单片机与单片机之间的串口通信  …

查看全部问答∨

赛灵思编译测试应用软件关键文件

赛灵思编译测试应用软件关键文件: 1、xparameter.h文件   这个文件很重要,因为指明各硬件模块的属性和地址,比如最常用的XPAR_RS232_BASEADDR等,这个文件是只读的,最好不要修改,否则错误是不可预知的,呵呵 2、ld文件   也就是L ...…

查看全部问答∨

两个单片机用串口通讯

可不可以将两个单片机的串口直接连接在一起进行通信? 我用的是MSP430,该单片机上有串口模块,我直接将两个单片机的串口连接在一起,从一个单片机发信息给另外一个单片机。 但是好像数据没有成功发送出去,因为另外一个单片机上没有接收到数据。 ...…

查看全部问答∨

请问CE下有没有类似于win32下的dbgView这样的工具?

我现在要在一个板子上开发驱动,但是这个板子不能和电脑进行串口或网络连接,只能通过SD卡把程序拷贝上去运行来看结果如何? 请问CE下有没有类似于win32下的dbgView这样的工具,能够显示调试信息。…

查看全部问答∨

铁电的问题

我用的是FM25L256 在30001~30050的字节空间里写入0X55 当我每测过一次把序号写入上述单元,比如我一次测量的时候序号为1,则相应的30001也写入1,其他的仍为0X55,问题是我在读铁电的时候从30001里读出数据为1,本应从30002读出的数据为0X55,可是 ...…

查看全部问答∨

在线等待!单片机上电后,IO口与地相连!

如题。我的单片机一上电,就出现地和IO口相连的情况,没加点时则没有相连...这是为什么呢?哪位能帮我分析一下吗?…

查看全部问答∨

ST7的I2C

ST7中与I2C相关的寄存器可以直接访问吗?@tiny volatile    unsigned char I2CCR     @0x18;      @tiny volatile     ...…

查看全部问答∨

汽车电子防盗跟踪系统工作原理及应用

目前,汽车被盗的情况时有发生,给车辆导航的也是借助于GPS 的定位显示器,它只需接收24颗地球同步卫星中的两颗以上(越多越精确)就可以显示出当前车辆的位置,但它只能接受信息而没有发射功能,故对于防盗没有作用。本设备使用简便,闭合W1,车主 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved