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—8.读写SDRAM的更多相关文章

  1. 【iCore4 双核心板_ARM】例程三十七:SDRAM实验——读写SDRAM

    实验现象: 上电即开始读写SDRAM测试,测试过程中,蓝色LED点亮,如果出现错误,红色LED闪烁,测试成功,绿色LED点亮. 核心代码: int main(void) { /* USER CODE ...

  2. 【转】S3C2440与SDRAM NorFlash NandFlash连线分析

    一.SDRAM(HY57V561620F)连线分析 1.  S3C2440 有27根地址线ADDR[26:0],8根片选信号ngcs0-ngcs7,对应bank0-bank7,当访问bankx 的地址 ...

  3. SDRAM读写一字(下)

    SDRAM读写一字 SDRAM控制模块 上电后进行初始化状态,初始化完成后进入空闲状态,在此进行判断如下判断: 如果自刷新时间到,则进行自刷新操作,操作完成后重新进入空闲状态: 如果读使能有效则进行读 ...

  4. 让LED程序在片外SDRAM中运行

    让LED程序在片外SDRAM中运行 一.引子 在前一篇文章中,我们已经成功点亮过LED了,为什么还要再重复一次呢? 我们已经知道,Mini2440开发板有两种启动模式:从NorFlash启动和从Nan ...

  5. S3C2440的Linux启动过程分析(一)——SC2440处理器结构

    1.1.     S3C2440处理器结构 S3C2440处理器的结构如下图所示,其核心单元为ARM9TDMI处理器核,主要包括16K的指令Cache和16K的数据Cache,以及分开的指令和数据MM ...

  6. 基于SDRAM的视频图像采集系统

    本文是在前面设计好的简易SDRAM控制器的基础上完善,逐步实现使用SDRAM存储视频流数据,实现视频图像采集系统,CMOS使用的是OV7725. SDRAM控制器的完善 1. 修改SDRAM的时钟到1 ...

  7. 第26章 FMC—扩展外部SDRAM

    本章参考资料:<STM32F76xxx参考手册2>.<STM32F7xx规格书>.库帮助文档<STM32F779xx_User_Manual.chm>. 关于SDR ...

  8. 第26章 FMC—扩展外部SDRAM—零死角玩转STM32-F429系列

    第26章     FMC—扩展外部SDRAM 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ...

  9. 基于JZ2440开发板编写bootloader总结(一)

    凡走过必留下痕迹,学点什么都会有用的. 本系列博文总结了自己在学习嵌入式Linux编程过程中的收获,若有错误,恳请指正,谢谢! --参考教材韦东山系列教材 bootloader 是一个用于启动linu ...

随机推荐

  1. .Net5 IdentityServer4下SqlServer和Mysql数据迁移

    1.概念 以下概念从官网整理的,我也是看官网一步一步学习的 官网地址 https://identityserver4.readthedocs.io/en/latest/index.html 1.1 I ...

  2. JUnit5参数化测试的几种方式

    参数化测试一直是津津乐道的话题,我们都知道JMeter有四种参数化方式:用户自定义变量.用户参数.CSV文件.函数助手,那么JUnit5有哪些参数化测试的方式呢? 依赖 JUnit5需要添加junit ...

  3. vue(17)vue-route路由管理的安装与配置

    介绍 Vue Router 是 Vue.js官方的路由管理器.它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌.包含的功能有: 嵌套的路由/视图表 模块化的.基于组件的路由配置 路由参 ...

  4. 前端-Vue基础3(父子组件交互)

    1.子组件往父组件传值 点击子组件的值,子组件自增,父组件的值也跟着自增 通过:this.$emit('change')方法向父组件暴露事件,在子组件中引用,可以调用父组件的方法 点击子组件触发cli ...

  5. C语言:宏定义

    #include <stdio.h> #define PI 3.14159265454454235432453245 main() { printf("%f\n",PI ...

  6. 手写Spring框架,是时候撸个AOP与Bean生命周期融合了!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 嘎小子,这片代码水太深你把握不住! 在电视剧<楚汉传奇>中有这么一段刘邦 ...

  7. Linux 安装exclipse

    1,在官网下载:https://www.eclipse.org/downloads/packages/ 2,前提:安装好jdk 3,使用命令解压:tar -zxvf eclipse_xxxxxx.ta ...

  8. LeetCode通关:听说链表是门槛,这就抬脚跨门而入

    分门别类刷算法,坚持,进步! 刷题路线参考:https://github.com/youngyangyang04/leetcode-master       https://github.com/ch ...

  9. JavaScript实现拖放效果

    JavaScript实现拖放效果 笔者实现该效果也是套用别人的轮子的.传送门 然后厚颜无耻的贴别人的readme~,笔者为了方便查阅就直接贴了,有不想移步的可以看这篇.不过还是最好请到原作者的GitH ...

  10. 常用PLC与ifix/intouch驱动地址匹配规则

    常用PLC与IFIX /的InTouch驱动地址匹配规则如下(持续更新): 1.施耐德M580<----->Intouch的/ IFIX: AI:400102<-----> 4 ...