外部存储控制器EMC 与norflash

嵌入式芯片自己的ram和rom都很小,但有时须要处理的数据有很大,因而出现了EMC,EMC能够外接norflash,sdram等来增长存储区域。编程

CPU能够经过AHB从机寄存器接口对EMC寄存器进行编程.为了不可能发生的字顺序问题,操做EMC寄存器的过程当中,全部数据的床上必须是32位宽的字.
经过数据缓冲区进行读写操做,可提供存储器带宽并减小传输等待时间.数据宽城区可用做读缓冲区,写缓冲区或读写缓冲区.spa

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

1.数据传输的字节顺序接口

2.数据产生的宽度flash

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

EMC与NOR_FLASH接线方式。class

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

EMC操做norflash用到的寄存器
配置

咱们再看看EMC的基本操做过程:im

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信号保持不变,只有地址信号发生变化

相关文章
相关标签/搜索