外部存儲控制器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信號保持不變,只有地址信號發生變化

相關文章
相關標籤/搜索