文档章节

外部存储控制器EMC 与norflash

cicue
 cicue
发布于 2014/07/12 22:40
字数 1008
阅读 331
收藏 2

嵌入式芯片本身的ram和rom都很小,但有时需要处理的数据有很大,于是出现了EMC,EMC可以外接norflash,sdram等来增加存储区域。

CPU可以通过AHB从机寄存器接口对EMC寄存器进行编程.为了避免可能发生的字顺序问题,操作EMC寄存器的过程中,所有数据的床上必须是32位宽的字.
通过数据缓冲区进行读写操作,可提供存储器带宽并减少传输等待时间.数据宽城区可用作读缓冲区,写缓冲区或读写缓冲区.

访问外部存储器需要注意几点:

1.数据传输的字节顺序

2.数据产生的宽度

3.对写保护的存储器区域进行写操作.

EMC与NOR_FLASH接线方式。

EMC_OE输出使能,EMC_WE写使能,EMC_CS片选

EMC操作norflash用到的寄存器

我们再看看EMC的基本操作过程:

1.首先是使能EMC:   lpc1788为例

   在使用EMC前一定要先在功率控制寄存器中将其使能:   有的芯片不需要这两步操作,本身就开启的

  LPC_SC->SCS     |= (0x01 << 0);
  LPC_SC->PCONP   |= 0x00000800;                  /* 使能EMC功率控制         */

  接下来,设置EMC控制寄存器EMCControl的第0位置1,使能EMC:

  LPC_EMC->Control = 0x00000001;	              /* 使能EMC                 */
  LPC_EMC->Config  = 0x00000000;	              /*小端模式,ROP复位        */

2.引脚连接:

  将相关的引脚连接到EMC模块.

  LPC_IOCON->P3_0 = 1;                            /* D0 @ P3.0               */
  LPC_IOCON->P3_1 = 1;                            /* D1 @ P3.1               */
  LPC_IOCON->P3_2 = 1;                            /* D2 @ P3.2               */
  LPC_IOCON->P3_3 = 1;                            /* D3 @ P3.3               */
  LPC_IOCON->P3_4 |= 1;                           /* D4 @ P3.4               */
  LPC_IOCON->P3_5 = 1;                            /* D5 @ P3.5               */
  LPC_IOCON->P3_6 = 1;                            /* D6 @ P3.6               */
  LPC_IOCON->P3_7 = 1;                            /* D7 @ P3.7               */
				  
  LPC_IOCON->P3_8  = 1;                           /* D8 @ P3.8               */
  LPC_IOCON->P3_9  = 1;                           /* D9 @ P3.9               */
  LPC_IOCON->P3_10 = 1;                           /* D10 @ P3.10             */
  LPC_IOCON->P3_11 = 1;                           /* D11 @ P3.11             */

  LPC_IOCON->P3_12 = 1;                           /* D12 @ P3.12             */
  LPC_IOCON->P3_13 = 1;                           /* D13 @ P3.13             */
  LPC_IOCON->P3_14 = 1;                           /* D14 @ P3.14             */
  LPC_IOCON->P3_15 = 1;                           /* D15 @ P3.15             */


  LPC_IOCON->P4_0 = 1;                            /* A0 @ P4.0               */
  LPC_IOCON->P4_1 = 1;                            /* A1 @ P4.1               */
  LPC_IOCON->P4_2 = 1;                            /* A2 @ P4.2               */
  LPC_IOCON->P4_3 = 1;                            /* A3 @ P4.3               */

  LPC_IOCON->P4_4 = 1;                            /* A4 @ P4.4               */
  LPC_IOCON->P4_5 = 1;                            /* A5 @ P4.5               */
  LPC_IOCON->P4_6 = 1;                            /* A6 @ P4.6               */
  LPC_IOCON->P4_7 = 1;                            /* A7 @ P4.7               */

  LPC_IOCON->P4_8  = 1;                           /* A8 @ P4.8               */
  LPC_IOCON->P4_9  = 1;                           /* A9 @ P4.9               */
  LPC_IOCON->P4_10 = 1;                           /* A10 @ P4.10             */
  LPC_IOCON->P4_11 = 1;                           /* A11 @ P4.11             */

  LPC_IOCON->P4_12 = 1;                           /* A12 @ P4.12             */
  LPC_IOCON->P4_13 = 1;                           /* A13 @ P4.13             */
  LPC_IOCON->P4_14 = 1;                           /* A14 @ P4.14             */
  LPC_IOCON->P4_15 = 1;                           /* A15 @ P4.15             */
				   
  LPC_IOCON->P4_16 = 1;                           /* A16 @ P4.16             */
  LPC_IOCON->P4_17 = 1;                           /* A17 @ P4.17             */
  LPC_IOCON->P4_18 = 1;                           /* A18 @ P4.18             */
  LPC_IOCON->P4_19 = 1;                           /* A19 @ P4.19             */

  LPC_IOCON->P4_20 = 1;                           /* A20 @ P4.20             */
  LPC_IOCON->P4_21 = 1;                           /* A21 @ P4.21             */
  LPC_IOCON->P4_22 = 1;                           /* A22 @ P4.22             */
  LPC_IOCON->P4_23 = 1;                           /* A23 @ P4.23             */


  LPC_IOCON->P4_24 = 1;                           /* OEN @ P4.24             */
  LPC_IOCON->P4_25 = 1;                           /* WEN @ P4.25             */
  LPC_IOCON->P4_31 = 1;                           /* CSN[1] @ P4.31          */

3.时序设置:

LPC_EMC->StaticConfig1   = 0x00000081;    //配置外部总线,16bit宽度
LPC_EMC->StaticWaitWen1  = 0x00000000;         /* (n+1) -> 1 clock cycles  */
LPC_EMC->StaticWaitOen1  = 0x00000001;         /* (n) -> 1 clock cycles    */
LPC_EMC->StaticWaitRd1   = 0x00000004;         /* (n+1) -> 5 clock cycles  */
LPC_EMC->StaticWaitPage1 = 0x00000000;         /* (n+1) -> 1 clock cycles  */
LPC_EMC->StaticWaitWr1   = 0x00000002;         /* (n+2) -> 4 clock cycles  */
LPC_EMC->StaticWaitTurn1 = 0x00000000;         /* (n+1) -> 1 clock cycles  */

一般不使用EMCStaticExtendedWait寄存器来计时读和写传输,而使用EMCStaticWaitRd和EMCStaticWaitWr寄存器,这样是为了灵活设置各种读写参数,可以尽量提高读和写的速度;当然用户也可简单地只使用EMCStaticExtendedWait寄存器来延时读和写传输时序,只是这样读写效率会比较低。  

读的时序图

通常情况下,我们再操作外部存储器时分为读,写两个操作.

  在读操作的过程中,我们需要配置下面的寄存器

  a.静态存储器输出使能延时寄存器(EMCStaticWaitOen0-1);

  b.静态存储器读延时寄存器(EMCStaticWaitRd0-1);

EMCStaticWaitOen(n)  Tce max 70ns

EMCStaticWaitRd(n)  从片选有效到从器件输出允许失效之间的延时时间

读时序图

EMCStaticWaitWen(n) Tcs min 0ns

EMCStaticWaitWr(n) 

EMCStaticWaitTurn(n) 总线翻转周期,即从片选信号无效到有效之间的时间

EMCStaticWaitPage 设置读取一页的等待时间t的长短

页模式下,一次片选有效期内可联系读/写4个字节,在这过程中,-WE和-OE信号保持不变,只有地址信号发生变化


© 著作权归作者所有

上一篇: boot os 互相升级
下一篇: linux 中断处理
cicue
粉丝 15
博文 111
码字总数 75311
作品 0
徐汇
私信 提问
Cortex A8系列S5PV210的启动概述

1、硬件特性: (1)内存:内存有两种类型,SRAM(Static RAM)和DRAM(Dynamic RAM),分别称为静态内存和动态内存。 SRAM:静态内存,特点是容量小、价格高。优点是不需要软件初始化就可以直...

WuWeiZhu
2018/04/28
0
0
嵌入式启动过程笔记

内存。 sram:静态内存,价格贵容量大,不需要初始化上电就能用。 dram:动态内存,价格便宜容量小,需要初始化后才能使用。 在单片机额中,由于内存小希望开发尽量简单,所以内存适合全部用...

jiangheng12138
2016/07/14
0
0
s3c2440存储控制器和地址以及启动的理解

1.首先应该先了解Flash ROM的种类   NOR FLASH地址线和数据线分开,来了地址和控制信号,数据就出来。   NAND Flash地址线和数据线在一起,需要用程序来控制,才能出数据。通俗的说,只给...

慎思
2012/08/21
221
0
嵌入式中的CPU和外部存储器

一、一些存储类相关的概念 1、ROM (read only memory)只读存储器,一般作为外部存储器,类似于硬盘、Flash、光盘等。 2、RAM (ramdam access memory)随机访问存储器,内部存储器,用来存储程...

LEIGE_Linux
2017/07/15
0
0
NandFlash系列之一:NorFlash与NandFlash对比

NandFlash系列之一:NorFlash与NandFlash对比 作者:刘洪涛,华清远见嵌入式学院高级讲师。 FLASH存储器又称闪存,主要有两种:NorFlash和NandFlash,下面我们从多个角度来对比介绍一下。在实...

地狱的烈火
2013/07/17
70
0

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
今天
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
4
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部