NandFlash數(shù)據(jù)存儲(chǔ)規(guī)則與數(shù)據(jù)讀寫方法_第1頁(yè)
NandFlash數(shù)據(jù)存儲(chǔ)規(guī)則與數(shù)據(jù)讀寫方法_第2頁(yè)
NandFlash數(shù)據(jù)存儲(chǔ)規(guī)則與數(shù)據(jù)讀寫方法_第3頁(yè)
NandFlash數(shù)據(jù)存儲(chǔ)規(guī)則與數(shù)據(jù)讀寫方法_第4頁(yè)
NandFlash數(shù)據(jù)存儲(chǔ)規(guī)則與數(shù)據(jù)讀寫方法_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

談到NandFlash的數(shù)據(jù)存儲(chǔ)方式,關(guān)于NANDFlash的數(shù)據(jù)讀寫方法方面的文章不多,這篇文章具體表達(dá)了NandFlash數(shù)據(jù)存儲(chǔ)方式和數(shù)據(jù)讀寫方法,并用具體的芯片為例作了具體的解釋。NANDFlash的數(shù)據(jù)是以bit的方式保存在memorycell,一般來說,一個(gè)cell中只能存儲(chǔ)一個(gè)bit。這些cell以8個(gè)或者16個(gè)為單位,連成bitline,形成所謂的byte(x8)/word(x16NANDDeviceLine會(huì)再組成(NandFlash有多種構(gòu)造,我使用的NandFlash是K9F1208,下面內(nèi)容針對(duì)三星的K9F1208U0M),每頁(yè)528Byte,每32個(gè)形成一個(gè)Block,Sizeof(block)=16kByte。1block=16kbyte,512Mbit=64Mbyte,Numberof(block)=40961block=32,1=528byte=512byte(MainArea)+16byte(SpareArea)Nandflash--BlockAddress--Address--ColumnAddress。對(duì)于NANDFlash來講,地址和命令只能在I/O[7:0]上傳遞,數(shù)據(jù)寬度是8位。512byte需要9bit來表示對(duì)于528byte系列的NAN這512byte被分成1sthalf和2ndhalf,各自的訪問由地址指針命令來選擇,A[7:0]就是所謂的columnaddress32個(gè)需要5bit來表示占用A[13:9],即該在塊內(nèi)的相對(duì)地址Block的地址是由A14以上的bit來表示,例如512Mb的NAND,共4096block,因此,需要12個(gè)bit來表示,即A[25:14],假設(shè)是1Gbit的528byte/的NANDFlash,則blockaddress用A[26:24]表示。而address就是blcokaddress|addressinblockNANDFlash的地址表示為: BlockAddress|Addressinblock|halfpointer|ColumnAddress地址傳送挨次是ColumnAddress,Address,BlockAddress。由于地址只能在I/O[7:0]上傳遞,因此,必需承受移位的方式進(jìn)展。例如,對(duì)于512Mbitx8的NANDflash,地址范圍是0~0x3FF_FFFF,只要是這個(gè)范圍內(nèi)的數(shù)值表示的地址都是有效的。NAND_ADDR為例:1步是傳遞columnaddress,就是NAND_ADDR[7:0],不需移位即可傳遞到I/O[7:0]上,而halfpointer即bit8是由操作指令打算的,即指令打算在哪個(gè)half上進(jìn)展讀寫。而真正的bit8的值是don”tcare的。2步就是將NAND_ADDR9位,將NAND_ADDR[16:9]傳到I/O[7:0]上3步將NAND_ADDR[24:17]放到I/O上4NAND_ADDR[25]I/O4步才能4-stepaddressing。假設(shè)NANDFlash256Mbitblockadress最高位只到bit24,因此尋址3x16NANDflash的mainarea的容量為256wor512byt的1sthalf和2ndhalf之分了,所以,bit8就變得沒有意義了,也就是這個(gè)時(shí)候bit8完全不用管,x8器件一樣。除了,這一點(diǎn)之外,x16NAND使用方法和x8的使用方法完全一樣。正如硬盤的盤片被分為磁道,每個(gè)磁道又分為假設(shè)干扇區(qū),一塊nandflash也分為假設(shè)干blockblock。一般而言,block、之間的關(guān)系隨著芯片的不同而不同,典型的安排是這樣的:1block=321=512bytes(datafield)+16bytes(oob)flash的讀寫都是以一個(gè)flashblock512bytes1sthalf2sdhalf,每個(gè)half256個(gè)字節(jié)。K9F1208U0B4096Blocks,故我們可以知道這塊flash的容量為4096*(32*528)=69206016Bytes=66MB;但事實(shí)上每個(gè)16Bytes是用于存4096*(32*512)=67108864Bytes=64MB由上圖所示,1個(gè)528Bytes組成,528個(gè)字節(jié)按挨次由上而下以列為單位進(jìn)展排〔1列代表一個(gè)Byte00Byte,第1行為第1Byt81個(gè)Byte里面的1bi528BytesDataFieldSpareFieldSpareField占528Bytes16Bytes,16Bytes是用于在讀寫操作的時(shí)候存放校驗(yàn)碼用的,一般不用做一般數(shù)據(jù)的存儲(chǔ)區(qū),除去這16Bytes,512Bytes便是我們用于存放數(shù)據(jù)用的DataField,所以一個(gè)528個(gè)Bytes512Bytes進(jìn)展容量的計(jì)算。讀命令有兩個(gè),分別是Read1,Read2其中Read1用于讀取DataField的數(shù)據(jù),而Read2則是用于讀取SpareField的數(shù)據(jù)。對(duì)于NandFlash來說,讀操作的最小操作單位為,也就是說當(dāng)我們給定了讀取的起始位置后,讀操作將從該位置開頭,連續(xù)讀取到本的最終一個(gè)Byte為止〔可以包括SpareFiel。NandFlash的尋址NandFlash的地址存放器把一個(gè)完整的NandFlashColumnAddressAddress.進(jìn)展尋址。ColumnAddress:列地址。ColumnAddress其實(shí)就是指定上的某個(gè)Byte,指定這個(gè)Byte其實(shí)也就是指定此頁(yè)的讀寫起始地址。Address:頁(yè)地址。由于頁(yè)地址總是以512Bytes對(duì)齊的,所以它的低90。確定讀寫操作是在Flash上的哪個(gè)頁(yè)進(jìn)展的。Read1命令當(dāng)我們得到一個(gè)NandFlash地址src_addr時(shí)我們可以這樣分解出ColumnAddress和Address:column_addr=src_addr%512;//columnaddress_address=(src_addr>>9);//address也可以這么認(rèn)為,一個(gè)NandFlashA0~A7column_addr,A9~A25是它的Address。(留意地址位A8并沒有消滅,也就是A8被無視,在下面你將了解到這是什么緣由)Read14Cycle00h01h〔00h01h的區(qū)分請(qǐng)見下文描述之后將分4個(gè)Cycle1st.Cycle是發(fā)送ColumnAddres2nd.Cycle4th.Cycle則是指定Address〔每次向地址存放器發(fā)送的數(shù)據(jù)只能是817位的Address3Read100h01h。這里消滅了兩個(gè)讀命是否令00h是用于讀寫1sthalf01h是用于讀取2ndhalf現(xiàn)在我可以結(jié)合上圖給你說明為什么K9F1208U0BDataField2個(gè)half了。Read1的1st.Cycle是發(fā)送ColumnAddresColumnAddress00Byte開頭始終讀取到此頁(yè)的最終一個(gè)Byte(包SpareField),假設(shè)我指定的ColumnAddress127,狀況也與前面一樣,但不知道你覺察沒有,用于傳遞ColumnAddress8條〔I/O0~I/O7A0~A7,這也是A8為什么不消滅在我們傳遞的地址位中,也就是說我們能夠指定的ColumnAddress范圍為0~255,但不要忘了,1個(gè)DataField512Byte組成的,假設(shè)現(xiàn)在我要指定讀256個(gè)字節(jié)處開頭讀取此頁(yè),那將會(huì)發(fā)生什么情景?我必需把ColumnAddress設(shè)256,但ColumnAddress255,這就造成數(shù)據(jù)溢出們才把DataField分為兩個(gè)半?yún)^(qū),當(dāng)要讀取的起始地址〔ColumnAddress〕0~255內(nèi)時(shí)我00h256~51101h命令.假設(shè)現(xiàn)在我要指定從256bytecolumn_addr=256;從2ndNF_CMD=0x01; half開頭讀取NF_ADDR=column_addr&0xff;1stCycleNF_ADDR=_address&0xff;2nd.CycleNF_ADDR=(_address>>8)&0xff;3rd.CycleNF_ADDR=(_address>>16)&0xff;4th.Cycle其中NF_CMD和NF_ADDR分別是NandFlash的命令存放器和地址存放器的地址解引用,我一般這樣定義它們:#definerNFCMD(*(volatileunsignedchar*)0x4e000004)//NADDFlashcommand#definerNFADDR(*(volatileunsignedchar*)0x4e000008)//NANDFlashaddressNF_CMD=0x018位〔A8〕1〔如上文分析,A801h00h這兩個(gè)命令來置高位或是置低位,這樣我們傳遞column_addr的值256隨然由于數(shù)據(jù)溢出變?yōu)?,但A8NF_CMD=0x011了,所以我們傳到地址存放器里的值變成了:A0A1A2A3A4A5A6A7A81000000018256256byte〔2ndhalf0號(hào)byte〕開頭讀取數(shù)據(jù)。nand_flash.c3個(gè)函數(shù):voidnf_reset(void);voidnf_init(void);voidnf_read(unsignedintsrc_addr,unsignedchar*desc_addr,intsize);nf_reset將被nf_init調(diào)用。nf_initnand_flash的初始化函數(shù),在對(duì)nandflash進(jìn)展任何操作之前,nf_init必需被調(diào)用。nf_read(unsignedintsrc_addr,unsignedchar*desc_addr,intsize);為讀函數(shù),src_addrnandflash上的地址,desc_addr是內(nèi)存地址,size是讀取文件的長(zhǎng)度。nf_resetnf_read函數(shù)中存在兩個(gè)宏:NF_nFCE_L;NF_nFCE_H;你可以看到當(dāng)每次對(duì)NandFlash進(jìn)展操作之前NF_nFCE_L必定被調(diào)用,操作完畢之時(shí)NF_nFCE_H必定被調(diào)用。這兩個(gè)宏用于啟動(dòng)和關(guān)閉Flash芯片的工作〔片選/取消片選。nf_reset中的:rNFCONF=(1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0);這一行代碼是對(duì)NandFlash的掌握存放器進(jìn)展初始化配置,rNFCONF是NandFlash的配置存放器,各個(gè)位的具體功能請(qǐng)參閱s3c2410數(shù)據(jù)手冊(cè)?,F(xiàn)在舉一個(gè)例子,假設(shè)我要從NandFlash50001024個(gè)字節(jié)到內(nèi)0x30000000處,我們這樣調(diào)用read函數(shù):nf_read(5000,0x30000000,1024);5000src_addr.:依據(jù)column_addr=src_addr%512;_address=(src_addr>>9);我們可得出:column_addr=5000%512=392_address=(5000>>9)=950009392個(gè)字節(jié)處,于是我們的nf_read函數(shù)將這樣發(fā)送命令和參數(shù):column_addr=5000%512;>_address=(5000>>9);NF_CMD=0x01;2ndhalf開頭讀取NF_ADDR=column_addr&0xff;1stCycleNF_ADDR=_address&0xff;2nd.CycleNF_ADDR=(_address>>8)&0xff;3rd.CycleNF_ADDR=(_address>>16)&0xff;4th.Cycle向NandFlash的命令存放器和地址存放器發(fā)送完以上命令和參數(shù)之后 ,我們就可以從rNFDATA存放器(NandFlash數(shù)據(jù)存放器)讀取數(shù)據(jù)了.。我用下面的代碼進(jìn)展數(shù)據(jù)的讀取.:for(i=column_addr;i<512;i++){*buf++=NF_RDDATA;}每當(dāng)讀取完一個(gè)之后,數(shù)據(jù)指針會(huì)落在下一個(gè)0Column(0Byte).下面是源代碼:/*本代碼只屬于溝通學(xué)習(xí),不得用于商業(yè)開發(fā)*/#include“s3c2410.h“#include“nand_flash.h“staticunsignedcharseBuf[16]={0xff};//--------------------------------------------------------------------------------------unsignedshortnf_checkId(void){inti;unsignedshortid;NF_nFCE_L;//chipenableNF_CMD(0x90);//ReadIDNF_ADDR(0x0);for(i=0;i<10;i++);//waittWB(100ns)id=NF_RDDATA<<8;//Makercode(K9S1208V:0xec)id|=NF_RDDATA;//Devidecode(K9S1208V:0x76)NF_nFCE_H;//chipenablereturnid;}//--------------------------------------------------------------------------------------staticvoidnf_reset(void){inti;NF_nFCE_L;//chipenableNF_CMD(0xFF);//resetcommandfor(i=0;i<10;i++);//tWB=100ns.NF_WAITRB;//wait200~500us;NF_nFCE_H;//chipdisable}//--------------------------------------------------------------------------------------voidnf_init(void){rNFCONF=(1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0);//11111xxxrxxx,rxxx//EnrrECCRnFCE=HtACLStWRPH0tWRPH1nf_reset;}//--------------------------------------------------------------------------------------voidnf_read(unsignedintsrc_addr,unsignedchar*desc_addr,intsize){inti;unsignedintcolumn_addr=src_addr%512;//columnaddressun

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論