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