s3c2410/s3c2440 nand flash工作原理
NAND Flash的尋址方式和NAND Flash的memory組織方式緊密相關(guān)。NAND Flash的數(shù)據(jù)是以bit的方式保存在memory cell,一般來說,一個cell中只能存儲一個bit。這些cell以8個或者16個為單位,連成bit line,形成所謂的byte(x8)/word(x16),這就是NAND Device的位寬。這些Line會再組成Page,通常是528Byte/page或者264Word/page。然后,每32個page形成一個Block,Sizeof(block)=16kByte Block是NAND Flash中最大的操作單元,擦除就是按照block為單位完成的,而編程/讀取是按照page為單位完成的。所以,按照這樣的組織方式可以形成所謂的三類地址:
-Block Address
-Page Address
-Column Address
首先,必須清楚一點,對于NAND Flash來講,地址和命令只能在I/O[7:0]上傳遞,數(shù)據(jù)寬度可以是8位或者16位,但是,對于x16的NAND Device,I/O[15:8]只用于傳遞數(shù)據(jù)(此點不是很認同)。清楚了這一點,我們就可以開始分析NAND Flash的尋址方式了。
以528Byte/page 總?cè)萘?12Mbit+512kbyte的NAND器件為例:因為1 block="16kbyte",512Mbit="64Mbyte",Numberof(block)=1024 1block="32page", 1page="528byte"=512byte(Main Area)+16byte(Spare Area) 用戶數(shù)據(jù)保存在main area中。512byte需要9bit來表示,對于528byte系列的NAND,這512byte被分成1st half和2nd half, 各自的訪問由所謂的pointer operation命令來選擇,也就是選擇了bit8的高低。因此A8就是halfpage pointer(這是我給出的一個名字),A[7:0]就是所謂的column address。32個page需要5bit來表示,占用A[13:9],即該page在塊內(nèi)的相對地址Block的地址是由A14以上的bit來表示,例如512Mb的NAND,共4096block,因此,需要12個bit 來表示,即A[25:14],如果是1Gbit的528byte/page的NAND Flash,則block address用A[26:14]表示。而page address就是blcok address|page address in block。
NAND Flash的地址表示為:
Block Address|Page Address in block|halfpage pointer|Column Address
地址傳送順序是Column Address, Page Address, Block Address。由于地址只能在I/O[7:0]上傳遞,因此,必須采用移位的方式進行。例如,對于512Mbit x8的NAND flash,地址范圍是0~0x3FF_FFFF,只要是這個范圍內(nèi)的數(shù)值表示的地址都是有效的。
以NAND_ADDR為例:
第1步是傳遞column address,就是NAND_ADDR[7:0],不需移位即可傳遞到I/O[7:0]上而halfpage pointer即bit8是由操作指令決定的,即指令決定在哪個halfpage上進行讀寫,
而真正的bit8的值是don't care的。
第2步就是將NAND_ADDR右移9位,將NAND_ADDR[16:9]傳到I/O[7:0]上。
第3步將NAND_ADDR[24:17]放到I/O上。
第4步需要將NAND_ADDR[25]放到I/O上。
因此,整個地址傳遞過程需要4步才能完成,即4-step addressing。
如果NAND Flash的容量是256Mbit以下,那么,block adress最高位只到bit24,因此尋址只需要3步。
下面,就x16的NAND flash器件稍微進行一下說明。
由于一個page的main area的容量為256word,仍相當(dāng)于512byte。但是,這個時候沒有所謂的1st halfpage和2nd halfpage之分了,所以,bit8就變得沒有意義了,也就是這個時候bit8完全不用管,地址傳遞仍然和x8器件相同。除了這一點之外,x16的NAND使用方式和x8的使用方式完全相同。
1.1Nandflash芯片工作原理
Nandflash芯片型號為SamsungK9F1208U0B,數(shù)據(jù)存儲容量為64MB,采用塊頁式存儲管理。8個I/O引腳充當(dāng)數(shù)據(jù)、地址、命令的復(fù)用端口。
1.1.1芯片內(nèi)部存儲布局及存儲操作特點
一片Nandflash為一個設(shè)備(device),其數(shù)據(jù)存儲分層為:
1設(shè)備(Device)=4096塊(Blocks)
1塊(Block)=32頁/行(Pages/rows);頁與行是相同的意思,叫法不一樣
1頁(Page)=528字節(jié)(Bytes)=數(shù)據(jù)塊大小(512Bytes分為前半頁和和后半頁)+OOB塊大小(16Bytes)
在每一頁中,最后16個字節(jié)(又稱OOB)用于NandFlash命令執(zhí)行完后設(shè)置狀態(tài)用,剩余512個字節(jié)又分為前半部分和后半部分??梢酝ㄟ^NandFlash命令00h/01h/50h分別對前半部、后半部、OOB進行定位通過NandFlash內(nèi)置的指針指向各自的首地址。
存儲操作特點:
1.擦除操作的最小單位是塊。
2.NandFlash芯片每一位(bit)只能從1變?yōu)?,而不能從0變?yōu)?,所以在對其進行寫入操作之前要一定將相應(yīng)塊擦除(擦除即是將相應(yīng)塊得位全部變?yōu)?).
3.OOB部分的第六字節(jié)(即517字節(jié))標(biāo)志是否是壞塊,如果不是壞塊該值為FF,否則為壞塊。
4.除OOB第六字節(jié)外,通常至少把OOB的前3個字節(jié)存放NandFlash硬件ECC碼(關(guān)于硬件ECC碼請參看Nandflash控制器一節(jié)).
1.1.2重要芯片引腳功能
I/O0I/O7:復(fù)用引腳??梢酝ㄟ^它向nandflash芯片輸入數(shù)據(jù)、地址、nandflash命令以及輸出數(shù)據(jù)和操作狀態(tài)信息。
CLE(CommandLatchEnable):命令鎖存允許
ALE(AddressLactchEnable):地址鎖存允許
CE:芯片選擇
RE:讀允許
WE:寫允許
WP:在寫或擦除期間,提供寫保護
R/B:讀/忙輸出
1.1.3尋址方式
SamsungK9F1208U0BNandFlash片內(nèi)尋址采用26位地址形式。從第0位開始分四次通過I/O0-I/O7進行
傳送,并進行片內(nèi)尋址。具體含義如下:
0-7位:字節(jié)在上半部、下半部及OOB內(nèi)的偏移地址
8位:值為0代表對一頁內(nèi)前256個字節(jié)進行尋址
值為1代表對一頁內(nèi)后256個字節(jié)進行尋址
9-13位:對頁進行尋址
14-25位:對塊進行尋址
當(dāng)傳送地址時,從位0開始
1.1.4Nandflash主要內(nèi)設(shè)命令詳細介紹
NandFlash命令執(zhí)行是通過將命令字送到NandFlash控制器的命令寄存器來執(zhí)行。
NandFlash的命令是分周期執(zhí)行的,每條命令都有一個或多個執(zhí)行周期,每個執(zhí)行周期都有相映代碼表示該周期將要執(zhí)行的動作。
主要命令有:Read1、Read2、ReadID、Reset、PageProgram、BlockErase、ReadStatus。
詳細介紹如下:
1.Read1:
功能:表示將要讀取Nandflash存儲空間中一個頁的前半部分,并且將內(nèi)置指針定位到前半部分的第一個字節(jié)。
命令代碼:00h
2.Read2:
功能:表示將要讀取Nandflash存儲空間中一個頁的后半部分,并且將內(nèi)置指針定位到后半部分的第一個字節(jié)。
命令代碼:01h
3.ReadID:
功能:讀取Nandflash芯片的ID號
命令代碼:90h
4.Reset:
功能:重啟芯片。
命令代碼:FFh
5.PageProgram:
功能:對頁進行編程命令,用于寫操作。
命令代碼:首先寫入00h(A區(qū))/01h(B區(qū))/05h(C區(qū)),表示寫入那個區(qū);再寫入80h開始編程模式(寫入模式),接
下來寫入地址和數(shù)據(jù);最后寫入10h表示編程結(jié)束.
6.BlockErase
功能:塊擦除命令。
命令代碼:首先寫入60h進入擦寫模式,然后輸入塊地址;接下來寫入D0h,表示擦寫結(jié)束.
7.ReadStatus
功能:讀取內(nèi)部狀態(tài)寄存器值命令。
命令代碼:70h
2NandFlash控制器工作原理
對NandFlash存儲芯片進行操作,必須通過NandFlash控制器的專用寄存器才能完成。所以,不能對NandFlash進行總線操作。而NandFlash的寫操作也必須塊方式進行。對NandFlash的讀操作可以按字節(jié)讀取。
2.1NandFlash控制器特性
1.支持對NandFlash芯片的讀、檢驗、編程控制
2.如果支持從NandFlash啟動,在每次重啟后自動將前NandFlash的前4KB數(shù)據(jù)搬運到ARM的內(nèi)部RAM中
3.支持ECC校驗
2.2NandFlash控制器工作原理
NandFlash控制器在其專用寄存器區(qū)(SFR)地址空間中映射有屬于自己的特殊功能寄存器,就是通過將NandFlash芯片的內(nèi)設(shè)命令寫到其特殊功能寄存器中,從而實現(xiàn)對Nandflash芯片讀、檢驗和編程控制的。特殊功能寄存器有:NFCONF、NFCMD、NFADDR、NFDATA、NFSTAT、NFECC。寄存詳細說明見下一節(jié)。
1.配置寄存器(NFCONF):用于對NandFlash控制器的配置狀態(tài)進行控制。
2.命令寄存器(NFCMD):用于存放Nandflash芯片內(nèi)設(shè)的操作命令。
3.地址寄存器(NFADDR):用于存放用于對Nandflash芯片存儲單元尋址的地址值。
4.數(shù)據(jù)寄存器(NFDATA):Nandflash芯片所有內(nèi)設(shè)命令執(zhí)行后都會將其值放到該寄存器中。同時,讀出、寫入Nandflash存儲空間的值也是放到該寄存器。
5.狀態(tài)寄存器(NFSTAT):用于檢測Nandflash芯片上次對其存儲空間的操作是否完成。
6.ECC校驗寄存器(NFECC):ECC校驗寄存器。
3:實驗代碼:
3.1:NandFlash的初始化
voidinit_nand()
{
//時間參數(shù)設(shè)為:TACLS=0TWRPH0=3TWRPH1=0
NFCONF=0x300;
/*使能NANDFlash控制器,初始化ECC,禁止片選*/
NFCONT=(1<<4)|(1<<1)|(1<<0);
/*復(fù)位NANDFlash*/
NFCONT&=~(1<<1);//發(fā)出片選信號
NFCMMD=0xFF;//復(fù)位命令
wait_idle();//循環(huán)查詢NFSTAT位0,直到它等于1
NFCONT|=0x2;//取消片選信號
}
3.2:NandFlash的讀操作
匯編代碼:
ldr r0, =0