• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > SAM4E單片機之旅——16、NAND Flash讀寫

    SAM4E單片機之旅——16、NAND Flash讀寫

    作者: 時間:2017-04-12 來源:網絡 收藏

      這次大概介紹了一下 Flash,以及在ASF中使用它的方法。

    本文引用地址:http://www.czjhyjcfj.com/article/201704/346498.htm

      一、 接線

      這個開發板搭載了一個256 MB,8位的 Flash(MT29F2G08ABAEA)。引腳接線如下:

        

    wps_clip_image-17474

     

      偷個懶,直接上引腳復用的圖。其中PC14表明該 FLASH需要作為SMC的外設0使用。通過使用NANDOE和NANDWE引腳說明需要使用芯片的NAND Flash控制邏輯。另外,PC18復用為輸入引腳,用以查詢芯片的狀態。

        

    wps_clip_image-1894

     

      二、 NAND Flash

      組織結構與尋址

      NAND Flash的容量較大。整片Flash分為若干個塊(Block),每個Block分為若干個頁(Page)。在每個頁中,除了數據區域,也包含若干“多余”的區域,用來進行ECC等操作。在進行擦除操作是,基本單位是“塊”;而編程的基本單位是“頁”。

      另外,NAND Flash的物理特性決定了其在編程時,每個bit只能從1變成0。所以在寫入前,必須先對該塊進行擦除(擦除時把所有位置為1)。

      該Flash的結構如下(忽略plane):

        

    wps_clip_image-30709

     

      在尋址時,是通過行地址和列地址指定儲存單元的。其中行地址表示頁的編號,列地址表示指定在目標地址在該頁的位置。

      讀寫時序

      因為沒有地址線,所以讀寫較為復雜。讀寫時,需要先發送相應操作命令,然后發送地址,才能進行數據傳輸。一個簡單的“頁讀取”操作時序圖如下:

        

    wps_clip_image-13318

     

      該命令首先拷貝整個頁到NAND Flash的cache寄存器中,然后在需要輸出的時候,再從指定的列地址開始輸出。

      PS,該NAND Flash支持在上電的時候自動送出第一頁的數據,所以經過適當的配置,也是可以通過它進行Boot的。

      CE# Don’t Care

      在給NAND Flash發送完命令后,Flash需要一個準備的過程。在這個過程中,需要保持片選信號的有效。(據說否則Flash就會進入低功耗狀態)

      一個簡單的方法是使用GPIO直接控制這個引腳。在ASF中使用的即是這個方法。

      另外的方法即是使用Flash的“CE# Don’t Care”功能。開啟這個功能后,即使片選無效,Flash也會進行工作。這樣做的好處是不用再手動控制片選信號線外;同時可以在Flash進行內部操作時,可以進行其他的片選。比如在一塊Flash忙時,可以給另外一塊Flash發送命令。但是,開啟這個功能可能會增加Flash的功耗。

      三、 ASF中NAND Flash使用

      準備

      在ASF Wizard中添加“NAND Flash on EBI”模塊。

      在conf_board.h中進行如下聲明,記得調用board_init():

      1#define CONF_BOARD_NAND

      Flash 初始化

      在board_init()之后,調用nand_flash_raw_initialize() 即可完成NAND Flash的初始化工作。

      struct nand_flash_raw nf_raw;

      memset((void*)&nf_raw, 0, sizeof(nf_raw));

      // Init NAND Flash, and get informations into nf_raw

      if (nand_flash_raw_initialize(&nf_raw, 0,

      BOARD_NF_COMMAND_ADDR, BOARD_NF_ADDRESS_ADDR, BOARD_NF_DATA_ADDR)) {

      MainExit();

      }

      該函數中,會對SMC和若干引腳進行配置;同時對Bus matrix進行設置,以使用芯片提供的NAND Flash邏輯功能。

      然后會對NAND Flash進行重置。接著就會讀取該Flash的ID,并根據該ID檢測Flash的參數,如page大小,block數目等。

      基本操作

      在nand_flash_raw.h中還提供了一些比較基礎的操作。

      以下代碼對所有的塊進行擦除,若在擦除中碰到錯誤,則打印出來(這里printf會通過UART0口打印,以后有機會會說怎么實現):

      // Get NAND's information from nf_raw

      const struct nand_flash_model* nf_mod = &(nf_raw.model);

      int num_block = nand_flash_model_get_device_size_in_blocks(nf_mod);

      // Erase all block

      printf("Erasing NAND Flash...nr");

      int error;

      for (int i = 0; i < num_block; i++) {

      error = nand_flash_raw_erase_block(&nf_raw, i);

      if (error == NAND_COMMON_ERROR_BADBLOCK) {

      printf("-E- Block %u is BAD block. nr", i);

      }

      }

      還有page的寫入、讀取和拷貝等操作就不一一列舉了……



    關鍵詞: SAM4E NAND

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 岚皋县| 武乡县| 巍山| 北海市| 正蓝旗| 英超| 杭锦旗| 广昌县| 苍山县| 耿马| 瓦房店市| 涿州市| 白水县| 洪江市| 凉山| 益阳市| 天镇县| 巴南区| 定兴县| 木里| 西林县| 高陵县| 招远市| 宁远县| 特克斯县| 兰坪| 格尔木市| 衡东县| 光山县| 中山市| 修武县| 东城区| 永福县| 徐州市| 寿阳县| 巩义市| 昌邑市| 巧家县| 兴隆县| 汾西县| 崇明县|