




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Nand Flash讀寫完全解析2010-09-30 22:42NAND Flash 的數據是以bit 的方式保存在memory cell,一般來說,一個cell 中只能存儲一個bit。這些cell 以8 個或者16 個為單位,連成bit line,形成所謂的byte(x8)/word(x16),這就是NAND Device 的位寬。這些Line 會再組成Page.(Nand Flash 有多種結構,我使用的Nand Flash 是K9F1208,下面內容針對三星的K9F1208U0M),每頁528Byte,每32 個page 形成一個Block, Sizeof(block)=16kByte
2、。1 block="16kbyte",512Mbit=64Mbyte,Numberof(block)=4096 1block=32page, 1page=528byte=512byte(Main Area)+16byte(Spare Area) Nand flash 以頁為單位讀寫數據,而以塊為單位擦除數據。按照這樣的組織方式可以形成所謂的三類地址: -Block Address - Page Address -Column Address 對于NAND Flash 來講,地址和命令只能在I/O7:0上傳遞,數據寬度是8 位。 512byte需要9bit來表示,對于528b
3、yte系列的NAND,這512byte被分成1st half和2nd half,各自的訪問由地址指針命令來選擇,A7:0就是所謂的column address。32 個page 需要5bit 來表示,占用A13:9,即該page 在塊內的相對地址。Block的地址是由A14 以上的bit 來表示,例如512Mb 的NAND,共4096block,因此,需要12 個bit 來表示,即A25:14,如果是1Gbit 的528byte/page的NAND Flash,則block address用A26:24表示。而page address就是blcok address|page address i
4、n block NAND Flash 的地址表示為: Block Address|Page Address in block|halfpage pointer|Column Address 地址傳送順序是Column Address,Page Address,Block Address。 由于地址只能在I/O7:0上傳遞,因此,必須采用移位的方式進行。 例如,對于512Mbit x8 的NAND flash,地址范圍是00x3FF_FFFF,只要是這個范圍內的數值表示的地址都是有效的。以NAND_ADDR 為例: 第1 步是傳遞column address,就是NAND_ADDR7:0,不需移
5、位即可傳遞到I/O7:0上,而halfpage pointer 即bit8 是由操作指令決定的,即指令決定在哪個halfpage 上進行讀寫。而真正的bit8 的值是don't care 的。 第2 步就是將NAND_ADDR 右移9 位,將NAND_ADDR16:9傳到I/O7:0上 第3 步將NAND_ADDR24:17放到I/O 上 第4 步需要將NAND_ADDR25放到I/O 上 因此,整個地址傳遞過程需要4 步才能完成,即4-step addressing。 如果NAND Flash 的容量是256Mbit 以下,那么,block adress 最高位只到bit24,因此尋
6、址 只需要3 步。 下面,就x16 的NAND flash 器件稍微進行一下說明。 由于一個page 的main area 的容量為256word,仍相當于512byte。但是,這個時候沒有所謂 的1st halfpage 和2nd halfpage 之分了,所以,bit8就變得沒有意義了,也就是這個時候 bit8 完全不用管,地址傳遞仍然和x8 器件相同。除了,這一點之外,x16 的NAND使用方法和 x8 的使用方法完全相同。正如硬盤的盤片被分為磁道,每個磁道又分為若干扇區,一塊nand flash也分為若干block,每個block分為如干page。一般而言,block、page之間的關
7、系隨著芯片的不同而不同,典型的分配是這樣的:1block = 32page1page = 512bytes(datafield) + 16bytes(oob) 需要注意的是,對于flash的讀寫都是以一個page開始的,但是在讀寫之前必須進行flash的擦寫,而擦寫則是以一個block為單位的。同時必須提醒的是,512bytes理論上被分為1st half 和2sd half,每個half各占256個字節。我們討論的K9F1208U0B總共有4096 個Blocks,故我們可以知道這塊flash的容量為4096 *(32 *528)= 69206016 Bytes = 66 MB 但事實上每個
8、Page上的最后16Bytes是用于存貯檢驗碼和其他信息用的,并不能存放實際的數據,所以實際上我們可以操作的芯片容量為4096 *(32 *512) = 67108864 Bytes = 64 MB由 上圖所示,1個Page總共由528 Bytes組成,這528個字節按順序由上而下以列為單位進行排列(1列代表一個Byte。第0行為第0 Byte ,第1行為第1 Byte,以此類推,每個行又由8個位組成,每個位表示1個Byte里面的1bit)。這528Bytes按功能分為兩大部分,分別是Data Field和Spare Field,其中Spare Field占528Bytes里的16Bytes,
9、這16Bytes是用于在讀寫操作的時候存放校驗碼用的,一般不用做普通數據的存儲區,除去這 16Bytes,剩下的512Bytes便是我們用于存放數據用的Data Field,所以一個Page上雖然有528個Bytes,但我們只按512Bytes進行容量的計算。讀 命令有兩個,分別是 Read1,Read2其中Read1用于讀取Data Field的數據,而Read2則是用于讀取Spare Field的數據。對于Nand Flash來說,讀操作的最小操作單位為Page,也就是說當我們給定了讀取的起始位置后,讀操作將從該位置開始,連續讀取到本Page的最后一個 Byte為止(可以包括Spare F
10、ield)Nand Flash的尋址 Nand Flash的地址寄存器把一個完整的Nand Flash地址分解成Column Address與Page Address.進行尋址。Column Address: 列地址。Column Address其實就是指定Page上的某個Byte,指定這個Byte其實也就是指定此頁的讀寫起始地址。Paage Address:頁地址。由于頁地址總是以512Bytes對齊的,所以它的低9位總是0。確定讀寫操作是在Flash上的哪個頁進行的。Read1命令當我們得到一個Nand Flash地址src_addr時我們可以這樣分解出Column Address和Pag
11、e Addresscolumn_addr=src_addr%512; / column addresspage_address=(src_addr>>9); / page address也可以這么認為,一個Nand Flash地址的A0A7是它的column_addr,A9A25是它的Page Address。(注意地址位A8并沒有出現,也就是A8被忽略,在下面你將了解到這是什么原因)Read1的 命令里面出現了兩個命令選項,分別是00h和01h。這里出現了兩個讀命是否令你意識到什么呢?是的,00h是用于讀寫1st half的命令,而01h是用于讀取2nd half的命令?,F在我可
12、以結合上圖給你說明為什么K9F1208U0B的DataField被分為2個half了。如上文我所提及的,Read1的1st.Cycle是發送Column Address,假設我現在指定的Column Address是0,那么讀操作將從此頁的第0號Byte開始一直讀取到此頁的最后一個Byte(包括Spare Field),如果我指定的Column Address是127,情況也與前面一樣,但不知道你發現沒有,用于傳遞Column Address的數據線有8條(I/O0I/O7,對應A0A7,這也是A8為什么不出現在我們傳遞的地址位中),也就是說我們能夠指定的 Column Address范圍為0
13、255,但不要忘了,1個Page的DataField是由512個Byte組成的,假設現在我要指定讀命令從第256個字節處 開始讀取此頁,那將會發生什么情景?我必須把Column Address設置為256,但Column Address最大只能是255,這就造成數據溢出。正是因為這個原因我們才把Data Field分為兩個半區,當要讀取的起始地址(Column Address)在0255內時我們用00h命令,當讀取的起始地址是在256511時,則使用01h命令.假設現在我要指定從第256個byte開 始讀取此頁,那么我將這樣發送命令串column_addr=256;NF_CMD=0x01; ?
14、 從2nd half開始讀取NF_ADDR=column_addr&0xff; 1st CycleNF_ADDR=page_address&0xff; 2nd.CycleNF_ADDR=(page_address>>8)&0xff; 3rd.CycleNF_ADDR=(page_address>>16)&0xff; 4th.Cycle其中NF_CMD和NF_ADDR分別是NandFlash的命令寄存器和地址寄存器的地址解引用,我一般這樣定義它們,#define rNFCMD (*(volatile unsigned char *)0x4e
15、000004) /NADD Flash command#define rNFADDR (*(volatile unsigned char *)0x4e000008) /NAND Flash address事實上,當NF_CMD=0x01時,地址寄存器中的第8位(A8)將被設置為1(如上文分析,A8位不在我們傳遞的地址中,這個位其實就是硬件電路根據 01h或是00h這兩個命令來置高位或是置低位),這樣我們傳遞column_addr的值256隨然由于數據溢出變為1,但A8位已經由于NF_CMD =0x01的關系被置為1了,所以我們傳到地址寄存器里的值變成了A0 A1 A2 A3 A4 A5 A6
16、A7 A81 0 0 0 0 0 0 0 1 這8個位所表示的正好是256,這樣讀操作將從此頁的第256號byte(2nd half的第0號byte)開始讀取數據。 nand_flash.c中包含3個函數void nf_reset(void);void nf_init(void);void nf_read(unsigned int src_addr,unsigned char *desc_addr,int size);nf_reset()將被nf_init()調用。nf_init()是nand_flash的初始化函數,在對nand flash進行任何操作之前,nf_init()必須被調用。nf
17、_read(unsigned int src_addr,unsigned char *desc_addr,int size);為讀函數,src_addr是nand flash上的地址,desc_addr是內存地址,size是讀取文件的長度。在nf_reset和nf_read函數中存在兩個宏NF_nFCE_L();NF_nFCE_H();你可以看到當每次對Nand Flash進行操作之前NF_nFCE_L()必定被調用,操作結束之時NF_nFCE_H()必定被調用。這兩個宏用于啟動和關閉Flash芯片的工作(片選/取消片選)。至于nf_reset()中的rNFCONF=(1<<15)
18、|(1<<14)|(1<<13)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0);這一行代碼是對NandFlash的控制寄存器進行初始化配置,rNFCONF是Nand Flash的配置寄存器,各個位的具體功能請參閱s3c2410數據手冊?,F在舉一個例子,假設我要從Nand Flash中的第5000字節處開始讀取1024個字節到內存的0x30000000處,我們這樣調用read函數nf_read(5000, 0x30000000,1024);我們來分析5000
19、這個src_addr.根據column_addr=src_addr%512; page_address=(src_addr>>9); 我們可得出column_addr=5000%512=392page_address=(5000>>9)=9于是我們可以知道5000這個地址是在第9頁的第392個字節處,于是我們的nf_read函數將這樣發送命令和參數column_addr=5000%512;>page_address=(5000>>9);NF_CMD=0x01; 從2nd half開始讀取NF_ADDR= column_addr &0xff; 1
20、st CycleNF_ADDR=page_address&0xff; 2nd.CycleNF_ADDR=(page_address>>8)&0xff; 3rd.CycleNF_ADDR=(page_address>>16)&0xff; 4th.Cycle向NandFlash的命令寄存器和地址寄存器發送完以上命令和參數之后,我們就可以從rNFDATA寄存器(NandFlash數據寄存器)讀取數據了.我用下面的代碼進行數據的讀取.for(i=column_addr;i<512;i+) *buf+=NF_RDDATA();每當讀取完一個Page之
21、后,數據指針會落在下一個Page的0號Column(0號Byte).下面是源代碼:/* www.another- author: caiyuqing 本代碼只屬于交流學習,不得用于商業開發*/#include "s3c2410.h"#include "nand_flash.h"static unsigned char seBuf16=0xff;/-unsigned short nf_checkId(void) int i; unsigned short id; NF_nFCE_L(); /chip enable NF_CMD(0x90); /Read I
22、D NF_ADDR(0x0); for(i=0;i<10;i+); /wait tWB(100ns) id="NF"_RDDATA()<<8; / Maker code(K9S1208V:0xec) id|=NF_RDDATA(); / Devide code(K9S1208V:0x76) NF_nFCE_H(); /chip enable return id;/-static void nf_reset(void) int i; NF_nFCE_L(); /chip enable NF_CMD(0xFF); /reset command for(i=0;
23、i<10;i+); /tWB = 100ns. NF_WAITRB(); /wait 200500us; NF_nFCE_H(); /chip disable/-void nf_init(void) rNFCONF=(1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0); / 1 1 1 1 1 xxx r xxx, r xxx / En r r ECCR nFCE="H" tACLS tWRPH0 tWRPH1 nf_reset();/-void nf_read(unsigned int src_addr,unsigned char *desc_addr,int size) int i; unsigned int column_addr = src_addr % 512; / column address unsigned int page_address = (s
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 家具包裝組管理制度
- 家庭打麻將管理制度
- 應急值班點管理制度
- 弱電設備房管理制度
- 征收辦保密管理制度
- 微機室設備管理制度
- 心理放松室管理制度
- 快遞小袋子管理制度
- 急性肺栓塞管理制度
- 總工辦崗位管理制度
- 醫院護士辭職申請書集合六篇(護士崗位辭職申請書)
- 靜脈注射 Microsoft PowerPoint 演示文稿課件
- 同濟大學論文答辯通用PPT模板
- AFC檢測技術規程
- 部編人教版二年級下學期數學期末學業質量監測復習課堂知識練習題
- 餐飲行業抖音代運營方案
- 《聰明人和傻子和奴才》 課件
- Fleischner指南解讀
- 建筑工地安全生產百日攻堅行動實施方案
- 電廠度電機維修技術規范書正式
- 年產40萬噸甲醇合成工藝設計
評論
0/150
提交評論