第012课 内存控制器与SDRAM

2020-03-23来源: eefocus关键字:内存控制器  SDRAM

第001节辅线1硬件知识_内存接口概念

首先来分析下操作GPIO控制器和操作UART控制器两者的区别。


如图是S3C2440是个片上系统,有GPIO控制器(接有GPIO管脚),有串口控制器 (接有TXD RXD引脚)。

这里写图片描述

配置GPIO控制器相应的寄存器,即可让引脚输出高低电平;配置UART控制器相应的寄存器,即可让引脚输出波形。前者相对简单,类似门电路,后者相对复杂,属于协议类接口。类似的协议类接口还有iic、iis、spi等。 

对于CPU是不管什么接口的,它只写相应的寄存器,由控制器根据寄存器的配置去控制具体的引脚。


那么CPU是如何访问各个不同的寄存器的呢?


CPU只管发出一个地址,内存控制器根据该地址选择不同的模块,然后从模块中得到数据或者发送数据到模块中。


前面的GPIO/门电路接口、协议类接口,都不会把地址输出到外部,接下来的内存类接口,会把地址输出到外部,比如Nor Flash、网卡、SDRAM。


如图,SDRAM、DM9000网卡、Nor Flash都接在JZ2440的数据总线和地址总线上,CPU把数据和地址发送出去,然后内存控制器根据片选信号选择相应的设备接收地址和数据信号,互不干扰。

这里写图片描述

片选信号和地址的关系怎么确定?


这个是由2440芯片特性决定的。

这里写图片描述

当选择Nor Flash启动时,CPU发出的指令的地址范围处于0x0000000 - 0x06000000,内存控制器就会使nGCS0处于低电平(片选引脚被选中),Nor Flash被选中。


当CPU发出的指令的地址范围处于0x20000000 - 0x26000000,内存控制器就会使nGCS4处于低电平(片选引脚被选中),网卡被选中。


当CPU发出的指令的地址范围处于0x30000000 - 0x36000000,内存控制器就会使nGCS6处于低电平(片选引脚被选中),SDRAM被选中。 


内存控制器根据不同的地址地址范围,发出不同的片选引脚,只有被片选引脚选中的芯片才能正常工作,不被选中的芯片就像不存在一样,不工作。


GPIO/门电路接口、协议类接口、内存类接口都属于CPU的统一编址。对于Nand Flash,在原理图上它的地址线并没有连接到CPU,因此它不参与CPU的统一编址。但它的数据线也接到了数据总线上,为了防止干扰,它也有一个片选信号(CE)。当CPU访问Nand Flash时,Nand Flash控制器才会片选Nand Flash,让其接收数据总线上的数据。

这里写图片描述

再来看下Nor Flash的空间,0x00000000 * 0x06000000,为128M,即每一个片选信号可以选择的空间是128M=2^27,也就需要A0、A1……A26,共27根地址线。CPU发出的32位地址线,内存控制器根据地址范围,片选上相应的bank,并将地址转化为27位。

这里写图片描述

第002节辅线1硬件知识_不同位宽设备的连接

参考2440芯片手册,可以看到内存接口与8-bit ROM连接时,2440的A0与外部芯片的A0相连。

这里写图片描述

当与两个8-bit ROM拼接成的一个16-bit ROM连接时,2440的A1与外部芯片的A0相连。

这里写图片描述

当与四个8-bit ROM拼接成的一个32-bit ROM连接时,2440的A2与外部芯片的A0相连。

这里写图片描述

当与一个16-bit ROM连接时,2440的A1与外部芯片的A0相连。

这里写图片描述

可以看出外接芯片的位宽有变化时,地址线的接法也会有变化。那这个变化有什么规律呢?


假设CUP执行:


MOV R0, #3 @去地址为3的内存上 

LDRB R1, [R0] @ 从内存为3的地址上,读出一个字节


如图有8bitROM、16bitROM、32bitROM。

这里写图片描述

8个bit组成一个字节,字节是计算机的最小的存储单位,因此我们读取数据肯定都是8bit的倍数。 


* 对于8bitROM ,8bit是一次读写的最小单位,即0地址是第一个8bit,1地址是第二个8bit;CPU发出的命令是读取地址为3上的数据,即A0和A1都为1,8bitROM的A0和A1收到的也都是1,于是找到了ROM上地址为3的8bit数据,包含了我们需要的数据。 


* 对于16bitROM ,16bit是一次读写的最小单位,即0地址是第一个16bit,里面有两个8bit数据;CPU发出的命令是读取地址为3上的数据,即A0和A1都为1,16bitROM的A0和A1分别收到的是1和0,于是找到了ROM上地址为1的16bit数据,包含了我们需要的数据,最后内存控制器再帮我们挑选出所需的8bit数据。 


* 对于32bitROM ,32bit是一次读写的最小单位,即0地址是第一个32bit,里面有四个8bit数据;CPU发出的命令是读取地址为3上的数据,即A0和A1都为0,32bitROM的A0和A1收到的都是0,于是找到了ROM上地址为0的32bit数据,包含了我们需要的数据,最后内存控制器再帮我们挑选出所需的8bit数据。

image.png

接到芯片上的引脚用来确定读取芯片上的哪一个单元的数据,把这个单元的数据返回给内存控制器,内存控制器会根据没有连接芯片的引脚,来确定返回哪一个单元的数据给CPU,


再举一个例子: 

假如传递一个32位的数据时


MOV R0, #4 

LDR R1, [R0] @去地址4,读取4字节数据


执行过程如下:


8bitROM: 当CPU发出地址(000100),内存控制器会把000100,000101,000110,000111处的地址转发给ROM,ROM会把得到的地址000100,000101,000110,000111,上的数据返回给内存控制器,内存控制器会把得到的4个8bit的数据组装成一个32位的数据返回给CPU。


16bitROM: 当CPU发出地址(000100),内存控制器会把00010,00011处的地址转发给ROM,ROM会把得到的地址00010,00011,上的数据返回给内存控制器,内存控制器会把得到的2个16bit的数据组装成一个32位的数据返回给CPU。


32bitROM: 当CPU发出地址(000100),内存控制器会把0001处的地址发送给ROM,ROM会把得到的地址0001上的数据返回给内存控制器,内存控制器会把得到的1个32bit数据返回给CPU。


怎样确定芯片的访问地址: 

1.根据片选信号确定基地址, 

2.根据芯片所接地址线确定范围


实例: 

Nor Flash 使用的是片选0(nGCS0),基地址为0,用到A20,A19……A1,A0共21条地址线,所以地址范围为0x00000000 ~ 0x1FFFFF也就是2M的空间大小。 


网卡(Net)使用的是片选4(nGCS4),基地址为0x20000000,用到A2,A0共2根地址线,所以地址范围为0x20000000 ~ 0x20000005。 


SDRAM使用的是片选6(nGCS6),基地址为0x30000000。

image.png

第003节辅线1硬件知识_时序图分析示例

这节我们分析一下我们了解时序图,信号之间是怎样一起工作的,以Nor Flash 为例。


2440和Nor Flash 之间有地址线,数据线,还有各种数据线连接。

这里写图片描述

以Nor Flash为例,分析下如何设置它的时序。


如图是S3C2440的Nor Flash控制器的读时序图,里面很多参数都需要根据外接芯片的性能进行设置,有的芯片性能好、响应时间快,就可以把参数时间设置小一点,释放更好的性能。

这里写图片描述

如图是Nor Flash芯片的读时序。

这里写图片描述

我们需要做的就是设置S3C2440的Nor Flash控制器时序去满足Nor Flash芯片的时序。每个参数的参考范围可以通过AC CHARACTERISTICS得到。

这里写图片描述

结合Nor Flash芯片的两张图,可以得到如下信息:


发出地址数据(Addresses)后,要等待Taa(要求大于等于70ns)时间,地址数据才有效;

发出片选信号(CE#)后,要等待Tce(要求大于等于70ns)时间,片选信号才有效;

发出读信号(OE#)后要等待Toe(要求大于等于30ns)时间,读信号才有效;

为了简单我们把地址数据(Addresses),片选信号(CE#),读信号(OE#),同时发出,然后让它们都等待70ns(等待信号有效)。对应S3C2440的Nor Flash控制器的读时序图,需要让地址信号A[24:0]、片选信号nGCS、读信号nOE同时发出,保持Tacc大于等于70ns。


查阅S3C2240的参考手册,Nor Flash是接在BANKCON0上的,因此只需要设置BANKCON0即可。

这里写图片描述

可以看到Tacc上电初始值是111,对应14个clocks。系统上电采用12MHz的晶振,HCLK=12MHz,Tacc=(1000/12*14)≈1166ns,这个值很大,几乎可以满足所有Nor Flash的要求。


启动后,将HCLK设置为100MHz,T=1000/100=10ns,Tacc需要大于等于70ns,因此设置Tacc等于101,8个clocks即可。


在前面uart实验的源码基础上,新建init.c和init.h两个文件。


在init.c里面只需要设置BANKCON0寄存器即可。


#include "s3c2440_soc.h"

void bank0_tacc_set(int val)

{

    BANKCON0 = val << 8;

}


init.h进行函数声明。


#ifndef _INIT_H

#define _INIT_H

void bank0_tacc_set(int val);

#endif


最后在主函数里面,通过串口获取输入的值,传入bank0_tacc_set()函数里,设置Tacc,然后再读取Nor Flash上的闪灯程序。


#include "s3c2440_soc.h"

#include "uart.h"

#include "init.h"


int main(void)

{

    unsigned char c;


    uart0_init();

    puts("Enter the Tacc val: nr");


    while(1)

    {

        c = getchar();

        putchar(c);

        if (c >= '0' && c <= '7')

        {

            bank0_tacc_set(c - '0');

            led_test();

        }

        else

        {

            puts("Error, val should between 0~7nr");

            puts("Enter the Tacc val: nr");

        }

    }

    return 0;

}


实验效果:


输入0~4,Tacc小于70ns,无法读取Nor Flash上数据,LED不能闪烁。


输入4~7,Tacc大于70ns,可以读取Nor Flash上数据,LED不断闪烁,且值越小越快(区别不明显)。


第004节辅线1硬件知识_SDRAM的设置

本节将讲解如何设置SDRAM,如果想对内存有更多的了解,可以在网上搜索看下这篇文档“高手进阶_终极内存技术指南——

[1] [2]
关键字:内存控制器  SDRAM 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic492327.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:第011课 Jz2400串口(UART)的使用
下一篇:第013课 S3c2440代码重定位详解

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

内存控制器与SDRAM
内存接口概念:通常ARM芯片内置的内存很少,要运行Linux,需要扩展内存。ARM9扩展内存使用SDRAM内存,ARM11使用 DDR SDRAM。S3C2440通常外接32位64MBytes的SDRAM,采用两片16位32M的SDRAM芯片,SDRAM芯片通过地址总线、数据总线、若干控制线与S3C2440芯片相连。芯片资源:S3C2440有ADDR0~ ADDR26共27根地址线(128M),其中ADDR0,ADDR16~ ADDR26为GPIO/地址线复用,GPIO只能是输出,DDR1~ADDR15为专用地址线,就只能是当地址线用。有32根数据线DATA0 ~DATA31全部都是专用数据线。虽然是32位的芯片,CPU发出的地址
发表于 2020-03-08
内存控制器与SDRAM
【ARM裸板】内存控制器、SDRAM基础与代码重定位
为T=10ns,Tacc = 8T即可9.代码重定位1.Nand启动时,一上电,硬件会把前4K数据复制到SRAM2.CPU从0地址运行如果程序大于4K,前4K的代码需要把整个程序读取出来放到SDRAM【重定位:重新确定程序地址】9.1 Nor Flash特点可以像内存一样的读取不可以像内存一样直接写入(写入有保护)9.2 Nor直接写入的结果程序中含有需要修改(写入)的变量,写在Nor上,直接修改变量是无效的因此需要重定位,放到SDRAM上9.3 实验以Nor Flash 启动,修改一变量,改变量并不会被修改,即无效以Nand Flash 启动,修改一变量,改变量会被修改9.4 程序包含哪几部分代码段text 代码 数据段data
发表于 2020-03-06
【ARM裸板】内存控制器、SDRAM基础与代码重定位
ARM笔记:内存控制器程序
;   bl    memsetup            @设置存储控制器    bl    copy_steppingstone_to_sdram    @赋值代码到SDRAM中    ldr    pc,=on_sdram  
发表于 2017-11-17
NIST开发出微机电系统(MEMS)延迟线内存控制器
美国国家标准与技术研究所(NIST)日前展示一款采用微机电系统(MEMS)的延迟线内存控制器,可望作为未来量子电脑的暂存内存控制器。 当MEMS中的内存控制器元素在触及以振幅与相位编码量子资讯的微波脉冲时,将引起共振作用。由于这种机械振荡作用将在一般量子运作期间持续一段连续的时间,NIST认为,微米级内存控制器将可在量子计算期间暂时储存资料。 原则上, MEMS内存控制器的运作方式就像早期电脑时代的传统延迟线内存控制器一样,利用水银柱中的水银传送声波的方式暂存资料。而近年来,同样的延迟线内存控制器的概念已经用于测量光纤长度的光学系统中,以实现资料暂存。 JILA研究人员展示在蓝宝石基底上的微型MEMS鼓与电路,它可
发表于 2013-10-09
Intel 2008年下半年推出六核处理器
芯片。该款45纳米的芯片将包括一个整合式的记忆控制器,因此无需前端总线。Gelsinger解释说,新的Nehalem的架构是模块化的,这意味着英特尔能够使用不同的构件板块组建一个芯片,该技术保障他们能从两核增加到八核。   Nehalem被设计为双向且同步多线程,可以使用英特尔的QuickPath互联架构,并包括一个三级高速缓存层次。Gelsinger说,更多关于Nehalem的规格的信息将在英特尔开发者论坛上予以披露。   英特尔还向记者重申, Itanium 处理器家族的升级产品--Tukwila芯片也预计于今年年底面市。   Tukwila是一款四核的65纳米处理器,能运行高达2千兆赫,有双集成内存控制器,使用英特尔
发表于 2008-03-18
STM32F429驱动外部SDRAM
STM32F429的一个很大优势就是可以直接驱动SDRAM,这样一下子就可以外扩可观的运存,很诱惑。这里用到的SDRAM 为W9825G6KH, 256Mbit, 32MByte配置CubeMX这里不展开这里面的数值的具体计算过程,主要是按照手册来算的,感兴趣的可以网上寻找,有很多相关的资料。SDRAM 初始化,SDRAM不像SRAM配置好了就可以用,他需要初始化#include "stm32f4xx_hal.h"extern SDRAM_HandleTypeDef hsdram1;#define SDRAM_MODEREG_BURST_LENGTH_1       
发表于 2020-03-14
STM32F429驱动外部SDRAM
小广播
何立民专栏 单片机及嵌入式宝典

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

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