S3C2440—8.读写SDRAM
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的更多相关文章
- 【iCore4 双核心板_ARM】例程三十七:SDRAM实验——读写SDRAM
实验现象: 上电即开始读写SDRAM测试,测试过程中,蓝色LED点亮,如果出现错误,红色LED闪烁,测试成功,绿色LED点亮. 核心代码: int main(void) { /* USER CODE ...
- 【转】S3C2440与SDRAM NorFlash NandFlash连线分析
一.SDRAM(HY57V561620F)连线分析 1. S3C2440 有27根地址线ADDR[26:0],8根片选信号ngcs0-ngcs7,对应bank0-bank7,当访问bankx 的地址 ...
- SDRAM读写一字(下)
SDRAM读写一字 SDRAM控制模块 上电后进行初始化状态,初始化完成后进入空闲状态,在此进行判断如下判断: 如果自刷新时间到,则进行自刷新操作,操作完成后重新进入空闲状态: 如果读使能有效则进行读 ...
- 让LED程序在片外SDRAM中运行
让LED程序在片外SDRAM中运行 一.引子 在前一篇文章中,我们已经成功点亮过LED了,为什么还要再重复一次呢? 我们已经知道,Mini2440开发板有两种启动模式:从NorFlash启动和从Nan ...
- S3C2440的Linux启动过程分析(一)——SC2440处理器结构
1.1. S3C2440处理器结构 S3C2440处理器的结构如下图所示,其核心单元为ARM9TDMI处理器核,主要包括16K的指令Cache和16K的数据Cache,以及分开的指令和数据MM ...
- 基于SDRAM的视频图像采集系统
本文是在前面设计好的简易SDRAM控制器的基础上完善,逐步实现使用SDRAM存储视频流数据,实现视频图像采集系统,CMOS使用的是OV7725. SDRAM控制器的完善 1. 修改SDRAM的时钟到1 ...
- 第26章 FMC—扩展外部SDRAM
本章参考资料:<STM32F76xxx参考手册2>.<STM32F7xx规格书>.库帮助文档<STM32F779xx_User_Manual.chm>. 关于SDR ...
- 第26章 FMC—扩展外部SDRAM—零死角玩转STM32-F429系列
第26章 FMC—扩展外部SDRAM 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ...
- 基于JZ2440开发板编写bootloader总结(一)
凡走过必留下痕迹,学点什么都会有用的. 本系列博文总结了自己在学习嵌入式Linux编程过程中的收获,若有错误,恳请指正,谢谢! --参考教材韦东山系列教材 bootloader 是一个用于启动linu ...
随机推荐
- 网络编程+Python
一.网络编程(模块:socket,from socket import *): 1. 网络层的IP地址可以唯一标识网络中的主机,传输层的"协议+端口"则可以唯一标识主机中应用程序( ...
- XCTF(MISC) give_you_flag
题目描述:菜狗找到了文件中的彩蛋很开心,给菜猫发了个表情包 1.下载附件,点击查看 发现在数完钱后,有出现一个二维码的东西. 2.使用stegsolv工具,进行逐帧查看. 说个题外话,stegsolv ...
- java基础---数组的排序算法(3)
一.排序的基本概念 排序:将一个数据元素集合或序列重新排列成按一个数据元素某个数据项值有序的序列 稳定排序:排序前和排序后相同元素的位置关系与初始序列位置一致(针对重复元素来说,相对位置不变) 不稳定 ...
- 谷粒商城--分布式基础篇(P1~P27)
谷粒商城--分布式基础篇P1~P27 去年3月份谷粒商城分布式基础.进阶.高级刚出的时候就开始学了,但是中途因为一些事就中断了,结果一直到现在才有时间重新开始学,看到现在网上这么多人都学完了,确实感觉 ...
- WIN10 网卡驱动异常代码56的问题及解决方法
故障描述: 原来使用正常的一个微机室,突然一天控制端主机网络连接异常,平时的网络控制软件无法使用.检查网络配置正常,网络诊断.修复.将网卡禁用也没有效果:后来删除网卡想重装,则恶运开始,无法安装驱动: ...
- C语言:缓冲区
缓冲区(Buffer)又称为缓存(Cache),是内存空间的一部分.也就是说,计算机在内存中预留了一定的存储空间,用来暂时保存输入或输出的数据,这部分预留的空间就叫做缓冲区(缓存).有时候,从键盘输入 ...
- c语言:scanf()高级应用
1) 指定读取长度 还记得在 printf() 中可以指定最小输出宽度吗?就是在格式控制符的中间加上一个数字,例如,%10d表示输出的整数至少占用 10 个字符的位置: 如果整数的宽度不足 10,那么 ...
- matlab——插值与拟合
@ 目录 前言 一.拟合 1.定义 2.三种判别准则 3.最小二乘法 (1)一般形式 (2)常用函数 (3)matlab实现 二.插值 1.定义 2.方法 (1)分段线性插值 (2)拉格朗日插值多项式 ...
- [刘阳Java]_eayui-pagination分页组件_第5讲
分页组件也是很基本的应用,这里我只给出一段简单的代码 关键注意一点:分页组件可以在上面添加buttons按钮,或者自定义分页组件的外观.这些内容需要自行的查看EasyUI的API文档 <!DOC ...
- 【剑指offer】52. 两个链表的第一个公共节点
剑指 Offer 52. 两个链表的第一个公共节点 知识点:链表: 题目描述 输入两个链表,找出它们的第一个公共节点. 如下面的两个链表: 示例 示例1: 输入:intersectVal = 8, l ...