在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > SAM4E單片機(jī)之旅——16、NAND Flash讀寫

            SAM4E單片機(jī)之旅——16、NAND Flash讀寫

            作者: 時(shí)間:2017-04-12 來源:網(wǎng)絡(luò) 收藏

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

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

              一、 接線

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

                

            wps_clip_image-17474

             

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

                

            wps_clip_image-1894

             

              二、 NAND Flash

              組織結(jié)構(gòu)與尋址

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

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

              該Flash的結(jié)構(gòu)如下(忽略plane):

                

            wps_clip_image-30709

             

              在尋址時(shí),是通過行地址和列地址指定儲(chǔ)存單元的。其中行地址表示頁的編號,列地址表示指定在目標(biāo)地址在該頁的位置。

              讀寫時(shí)序

              因?yàn)闆]有地址線,所以讀寫較為復(fù)雜。讀寫時(shí),需要先發(fā)送相應(yīng)操作命令,然后發(fā)送地址,才能進(jìn)行數(shù)據(jù)傳輸。一個(gè)簡單的“頁讀取”操作時(shí)序圖如下:

                

            wps_clip_image-13318

             

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

              PS,該NAND Flash支持在上電的時(shí)候自動(dòng)送出第一頁的數(shù)據(jù),所以經(jīng)過適當(dāng)?shù)呐渲?,也是可以通過它進(jìn)行Boot的。

              CE# Don’t Care

              在給NAND Flash發(fā)送完命令后,F(xiàn)lash需要一個(gè)準(zhǔn)備的過程。在這個(gè)過程中,需要保持片選信號的有效。(據(jù)說否則Flash就會(huì)進(jìn)入低功耗狀態(tài))

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

              另外的方法即是使用Flash的“CE# Don’t Care”功能。開啟這個(gè)功能后,即使片選無效,F(xiàn)lash也會(huì)進(jìn)行工作。這樣做的好處是不用再手動(dòng)控制片選信號線外;同時(shí)可以在Flash進(jìn)行內(nèi)部操作時(shí),可以進(jìn)行其他的片選。比如在一塊Flash忙時(shí),可以給另外一塊Flash發(fā)送命令。但是,開啟這個(gè)功能可能會(huì)增加Flash的功耗。

              三、 ASF中NAND Flash使用

              準(zhǔn)備

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

              在conf_board.h中進(jìn)行如下聲明,記得調(diào)用board_init():

              1#define CONF_BOARD_NAND

              Flash 初始化

              在board_init()之后,調(diào)用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();

              }

              該函數(shù)中,會(huì)對SMC和若干引腳進(jìn)行配置;同時(shí)對Bus matrix進(jìn)行設(shè)置,以使用芯片提供的NAND Flash邏輯功能。

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

              基本操作

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

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

              // 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的寫入、讀取和拷貝等操作就不一一列舉了……



            關(guān)鍵詞: SAM4E NAND

            評論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉