1. 程式人生 > >NandFlash操作詳解(一)

NandFlash操作詳解(一)

NandFlash的分類:

         根據物理結構上的區別,NandFlash主要分為以下兩種:

                   SLC(SingleLevel Cell):單層式儲存

                   MLC(MultiLevel Cell):多層式儲存

                   SLC在儲存格式上只存一位(bit)資料,而MLC則存放兩位資料。

根據NandFlash每頁(頁的概念在後面有介紹)儲存位元組數,NandFlash分大頁和小頁兩種,大頁就是每一個Page有2k 或4k位元組,小頁就是一個Page只有512位元組。

s3c2410通常使用小頁NandFlash,s3c2440通常使用大頁NandFlash。s3c2440為了支援大頁NandFlash,它的NandFlash控制器相對於s3c2410的NandFlash控制器要多幾個暫存器,所以在移植uboot到s3c2440的過程中,基於2410的NandFlash程式碼改動會涉及到暫存器的修改。

NandFlash的結構:

         手冊中有(我的NandFlash晶片為K9F2G08U0C):


Features中講到Page、Block,這些東西是什麼呢?如下:


從上面的圖中可以看到:一塊NandFlash可以劃分為2048個塊,一個塊分為64個頁,一頁分為2k+64位元組的兩個區,2k存放有效資料,64位元組儲存校驗資訊等。

這種劃分的形式在任何NandFlash中都是一樣的。只是說塊數、頁數、每頁大小可能不一樣。

Row Address - 行地址可以簡單的認為是頁號

Column Address - 列地址相當於在一個頁內的偏移地址。

有了頁號和偏移地址便能正確的訪問到每個儲存單元。

NandFlash的訪問:

         觀察開發板的原理圖:


可以發現NandFlash的接線沒有一根是s3c2440的資料匯流排addr(n),這也就說明了s3c2440不能像操作NorFlash/SDRAM一樣直接使用絕對地址訪問NandFlash空間。也就是說NandFlash的訪問是獨立於ARM定址空間的,NandFlash使用獨立編址。

         NandFlash的程式設計應該嚴格參照NandFlash資料手冊的時序來操作訊號線(CLE、ALE、CE、R/B等),操作每個時序訊號都是有時序關係的,導致在操作和使用上都不方便,所以三星給s3c2440增加了NandFlash控制器,程式設計操作NandFlash的時候只需要往幾個暫存器(配置NandFlash控制器)中寫入特定的值即可控制NandFlash。

         回過頭來觀察電路圖,NandFlash的接線中能傳輸資料的只有LDATA0~LDATA7這8根資料線,地址和資料都是通過這8根線和s3c2440互動的。地址資料有32位(4位元組),在傳輸地址時是分5次傳輸的(不是4次)。如下:

第一次傳輸A0~A7          Column Address

第二次傳輸A8~A11                   Column Address

第三次傳輸A12~19                 Row Address

第四次傳輸A20~A27               Row Address

第五次傳輸A28                          Row Address

NandFlash訊號引腳:

CLE(CommandLatch Enale):命令鎖存允許

ALE(AddressLatch Enable):地址鎖存允許

CE:晶片選擇

RE:讀允許

WE:寫允許

WP:在寫或擦除期間,提供防寫

R/B:讀/忙

ALE:地址鎖存  ALE = 1,data0-data7上傳輸的是地址

CLE:命令鎖存  CLE = 1,data0-data7上傳輸的是命令

都是0的時候data0-data7上傳輸的是資料

NandFlash初始化:

         在讀/寫NandFlash前,都需要先對NandFlash初始化,所謂初始化就是配置一些必要的時序,開啟s3c2440手冊NandFlash Controller可以看到第一個暫存器是NFCONF


可以看到這個暫存器需要配置三個域,TACLS、TWRPH0、TWRPH1,這三個值怎麼設定呢?看下面的分析:

在NandFlash的晶片手冊中找到如下時序:


其中:t2 = TCLS - twp。要想讓NandFlash工作必須給NandFlash給這三個時間提供合理值。取值表在NandFlash晶片手冊中有說明:


提供至少最小值以上的值才能正常工作。我們的是3.3V的NandFlash晶片。

所以:

t1(twp)最小12ns

t2 = TCLS – twp= 12-12 = 0ns

         t3(TCLH)最小5ns

確定最小值以後找到2440手冊的時序:


對照兩張時序圖可以發現:t2就是TACLS,t1是TWRPH0,t3是TWRPH1.所以便得到了需要配置的三個域的最小值了。

因為NandFlash使用的是HCLK,而我們使用的HCLK是100MHz,就是說一次時鐘脈衝10ns。

TACLS最小0ns

         TWRPH0最小12ns

         TWRPH1最小5ns

根據三個域的說明:

所以:

                   10ns* TACLS > 0ns   所以TACLS取1即可

                   10ns* (TWRPH0+1) >12ns 所以TWRPH0取1或2即可

                   10ns* (TWRPH1+1)>5ns 所以TWRPH1取1即可

         以上三個值再取大一點都是可以的,只要比最小值大就行。

配置暫存器NFCONT

因為在未初始化時,不需要片選,所以需要disable chip Select

         MODE位預設是關閉NandFlash控制器,現在需要開啟:


         在對NandFlash控制器做配置後通常需要對控制器做復位操作:

         在NandFlash晶片手冊中找到復位操作:

         所以復位操作應有如下步驟:

1、  選擇nand(片選),這是每一個NandFlash操作都要做的

2、  清除RnB,因為需要等待RnB訊號

3、  傳送命令0xff

4、  等待RnB

5、  取消片選

程式碼實現:

void nand_reset()                                                                                                                                                                                                       

{

    //選中flash、片選

    select_chip();

    //清除RnB

    clear_RnB();

    //傳送0xff命令

    send_cmd(0xff);

    //等待RnB

    wait_RnB();

    //取消選中flash

    deselect_chip();

}

void nand_init()//NandFlash初始化

{

    //初始化NFCONF

    NFCONF = (TACLS<<12) | (TWRPH0<<8) | (TWRPH1<<4);

    //初始化NFCONT

    NFCONT = (1<<0) | (1<<1);

    //復位

    nand_reset();      

}

下一節NandFlash操作詳解(二)