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、 取消片選
程式碼實現:
|
下一節NandFlash操作詳解(二)