S3C2440對Nand_Flash的基本操作_第1頁
S3C2440對Nand_Flash的基本操作_第2頁
S3C2440對Nand_Flash的基本操作_第3頁
S3C2440對Nand_Flash的基本操作_第4頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、精品文檔S3C2440對 Nand Flash操作和電路原理 K9F2G08U0AS3C2440 內部集成了一個Nand flash控制器。 S3C2440 的 Nand flash控制器包含了如下的特性:l 一個引導啟動單元lNand Flash 存儲器接口,支持8 位或 16 位的每頁大小為 256 字, 512 字節(jié), 1K字和 2K 字節(jié)的 Nand flashl軟件模式:用戶可以直接訪問Nand Flash 存儲器,此特性可以用于 Nand Flash存儲器的讀、擦除和編程。lS3C2440 支持 8/16 位的 Nand Flash 存儲器接口總線l硬件 ECC 生成,檢測和指示

2、(軟件糾錯 )。lSteppingstone 接口,支持大 /小端模式的按字節(jié) /半字 /字訪問。我用的開發(fā)板是天嵌的TQ2440 ,板子用到的 Nand Flash 是 Samsung 公司的 K9F2G08U0A ,它是 8 位的 Nand flash 。本文只介紹 Nand Flash 的電路原理和 Nand Flash 的讀、寫、擦除等基本操作,暫不涉及Nand Flash 啟動程序的問題。Nand Flash 的電路連接如圖1 所示:圖 1 Nand Flash 電路原理上圖的左邊為 K9F2G08U0A與 2440 的連接圖,原理方面就不多介紹,去看看datasheet 估計就懂得

3、了,右邊的部分是 S3C2440 的 Nand 控制器的配置。配置引腳NCON ,GPG13 ,GPG14 和 GPG15 用來設置 Nand Flash 的基本信息, Nand 控制器通過讀取配置引腳的狀態(tài)獲取外接的Nand Flash 的配置信息,圖2 是這四個配置引腳的定義:.精品文檔圖 2 Nand 控制配置引腳信息由于 K9F2G08U0A 的總線寬度為 8 位,頁大小為 2048 字節(jié),需要 5 個尋址命令,所以 NCON 、GPG13 和 GPG14應該接高電平, GPG15 應該接低電平。K9F2G08U0A 沒有地址或數據總線,只有8 個 IO 口,這 8 個 IO 口用于傳

4、輸命令、地址和數據。K9F2G08U0A主要以 page (頁)為單位進行讀寫,以block (塊)為單位進行擦除。每一頁中又分為main 區(qū)和 spare 區(qū), main 區(qū)用于正常數據的存儲, spare 區(qū)用于存儲一些附加信息,如塊好壞的標記、塊的邏輯地址、頁內數據的ECC 校驗和等。K9F2G08U0A 的存儲陣列如圖3 所示:圖 3 K9F2G08U0A 內部存儲陣列由上圖,我們可以知道: K9F2G08U0A 的一頁為(2K 64)字節(jié)(2K 表示的是 main 區(qū)容量, 64 表示的是 spare 區(qū)容量),它的一塊為 64 頁,而整個設備包括了 2048 個塊。這樣算下來一共有

5、 2112M 位容量,如果只算 main 區(qū)容量則有 256M 字節(jié)(即 256M× 8 位)。圖 4 K9F2G08U0A地址序列.精品文檔要實現用 8 個 IO 口來要訪問這么大的容量,如圖4 所示:K9F2G08U0A規(guī)定了用 5 個周期來實現。第一個周期訪問的地址為 A0A7 ;第二個周期訪問的地址為A8A11 ,它作用在 IO0IO3 上,而此時 IO4IO7 必須為低電平;第三個周期訪問的地址為A12A19 ;第四個周期訪問的地址為A20A27 ;第五個周期訪問的地址為A28 ,它作用在 IO0上,而此時 IO1IO7 必須為低電平。前兩個周期傳輸的是列地址,后三個周期傳

6、輸的是行地址。通過分析可知,列地址是用于尋址頁內空間,行地址用于尋址頁,如果要直接訪問塊,則需要從地址A18 開始。由于所有的命令、地址和數據全部從 8 位 IO 口傳輸,所以 Nand flash 定義了一個命令集來完成各種操作。有的操作只需要一個命令(即一個周期)即可,而有的操作則需要兩個命令(即兩個周期)來實現。K9F2G08U0A 的命令說明如圖5 所示:圖 5 K9F2G08U0A 命令表為了方便使用,我們宏定義了 K9F2G08U0A 的常用命令#define CMD_READ10x00/ 頁讀命令周期 1#define CMD_READ20x30/ 頁讀命令周期 2#define

7、 CMD_READID0x90/讀 ID 命令#define CMD_WRITE10x80/頁寫命令周期 1#define CMD_WRITE20x10/頁寫命令周期 2#define CMD_ERASE10x60/塊擦除命令周期 1#define CMD_ERASE20xd0/塊擦除命令周期 2#define CMD_STATUS0x70/讀狀態(tài)命令#define CMD_RESET0xff/ 復位#define CMD_RANDOMREAD10x05/ 隨意讀命令周期 1.精品文檔#define CMD_RANDOMREAD20xE0/ 隨意讀命令周期 2#define CMD_RANDO

8、MWRITE0x85/隨意寫命令接下來介紹幾個 Nand Flash 控制器的寄存器。 Nand Flash 控制器的寄存器主要有 NFCONF (Nand Flash 配置寄存器), NFCONT (Nand Flash 控制寄存器), NFCMMD (Nand Flash 命令集寄存器), NFADDR (Nand Flash 地址集寄存器),NFDATA(Nand Flash 數據寄存器),NFMECCD0/1 (Nand Flash 的 main 區(qū) ECC 寄存器),NFSECCD( Nand Flash 的 spare 區(qū) ECC 寄存器), NFSTAT (Nand Flash

9、操作狀態(tài)寄存器), NFESTAT0/1 (Nand Flash 的ECC 狀態(tài)寄存器), NFMECC0/1 (Nand Flash 用于數據的 ECC 寄存器),以及 NFSECC (Nand Flash 用于 IO 的 ECC 寄存器)。( 1)NFCONF:2440 的 NFCONF 寄存器是用來設置 NAND Flash 的時序參數 TACLS 、TWRPH0 、TWRPH1 。配置寄存器的 3:0是只讀位,用來指示外部所接的Nand Flash 的配置信息,它們是由配置引腳NCON ,GPG13 ,GPG14和 GPG15 所決定的(比如說 K9F2G08U0A 的配置為 NCON

10、 、GPG13 和 GPG14 接高電平, GPG15 接低電平,所以3:0 位狀態(tài)應該是 1110 )。(2)NFCONT :用來使能 /禁止 NAND Flash 控制器、使能 /禁止控制引腳信號nFCE 、初始化 ECC 。它還有其他功能,在一般的應用中用不到,比如鎖定NAND Flash 。(3)NFCMMD :對于不同型號的Flash ,操作命令一般不一樣。參考前面介紹的K9F2G08U0A 命令序列。( 4)NFADDR: 當寫這個寄存器時,它將對 Flash 發(fā)出地址信號。只用到低 8 位來傳輸,所以需要分次來寫入一個完整的 32 位地址, K9F2G08U0A 的地址序列在圖

11、4 已經做了詳細說明。(5)NFDATA: 只用到低 8 位,讀、寫此寄存器將啟動對NAND Flash 的讀數據、寫數據操作。( 6)NFSTAT: 只用到位 0,用來檢測 NAND 是否準備好。 0:busy ,1:ready 。NFCONF 寄存器使用 TACLS 、TWRPH0 、TWRPH1 這 3 個參數來控制 NAND Flash 信號線 CLE/ALE 與寫控制信號 nWE 的時序關系,它們之間的關系如圖 6 和圖 7 所示:圖 6 CLE/ALE 時序圖.精品文檔圖 7 nWE 和 nRE 時序圖TACLS 為 CLE/ALE 有效到 nWE 有效之間的持續(xù)時間, TWRPH

12、0 為 nWE 的有效持續(xù)時間, TWRPH1 為 nWE無效到 CLE/ALE 無效之間的持續(xù)時間,這些時間都是以HCLK 為單位的。通過查閱K9F2G08U0A 的數據手冊,我們可以找到并計算與S3C2440 相對應的時序: K9F2G08U0A 中的 Twp 與 TWRPH0 相對應, Tclh 與 TWRPH1 相對應,TACLS 應該是與 Tcls 相對應。 K9F2G08U0A給出的都是最小時間,2440 只要滿足它的最小時間即可。TACLS 、TWRPH0 、TWRPH1 這三個變量取值大一些會更保險,在這里,這三個值分別取1,2 和 0。下面就開始詳細介紹K9F2G08U0A

13、的基本操作,包括復位,讀ID,頁讀、寫數據,隨意讀、寫數據,塊擦除等。為了更好地應用 ECC和使能 Nand Flash 片選,我們還需要一些宏定義:#define NF_nFCE_L()rNFCONT &= (1<<1); #define NF_CE_L()NF_nFCE_L() /打開 nandflash 片選#define NF_nFCE_H()rNFCONT |= (1<<1); #define NF_CE_H()NF_nFCE_H()/ 關閉 nandflash 片選#define NF_RSTECC()rNFCONT |= (1<<4);

14、 / 復位 ECC#define NF_MECC_UnLock() rNFCONT &= (1<<5); /解鎖 main 區(qū) ECC#define NF_MECC_Lock()rNFCONT |= (1<<5); /鎖定 main 區(qū) ECC#define NF_SECC_UnLock()rNFCONT &= (1<<6); / 解鎖 spare 區(qū) ECC#define NF_SECC_Lock()rNFCONT |= (1<<6); /鎖定 spare 區(qū) ECCNFSTAT 是另一個比較重要的寄存器,它的第0 位可以用于判

15、斷 nandflash 是否在忙,第2 位用于檢測 RnB 引腳信號:#define NF_WAITRB()while(!(rNFSTAT &(1<<0) ) ); / 等待 Nand Flash 不忙.精品文檔#define NF_CLEAR_RB() rNFSTAT |= (1<<2); /清除 RnB 信號#define NF_DETECT_RB()while(!(rNFSTAT&(1<<2);/等待 RnB 信號變高,即不忙NFCMMD ,NFADDR 和 NFDATA 分別用于傳輸命令,地址和數據,為了方便起見,我們可以定義一些宏定

16、義用于完成上述操作:#define NF_CMD(data)rNFCMD= (data); / 傳輸命令#define NF_ADDR(addr)rNFADDR = (addr); /傳輸地址#define NF_RDDATA()(rNFDATA)/ 讀 32 位數據#define NF_RDDATA8()(rNFDATA8)/讀8位數據#define NF_WRDATA(data)rNFDATA = (data); /寫 32 位數據#define NF_WRDATA8(data)rNFDATA8 = (data); / 寫8位數據首先,是初始化操作void rNF_Init(void)rN

17、FCONF = (TACLS<<12)|(TWRPH0<<8)|( TWRPH1<<4)|(0<<0);/初始化時序參數rNFCONT =(0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0);/非鎖定,屏蔽 nandflash 中斷,初始化 ECC 及鎖定 main 區(qū)和 spare 區(qū) ECC ,使能 nandflash 控制器,禁止片

18、選rNF_Reset();/ 復位芯片復位操作,寫入復位命令static void rNF_Reset()NF_CE_L();/打開 nandflash 片選NF_CLEAR_RB();/清除 RnB 信號NF_CMD(CMD_RESET);/ 寫入復位命令.精品文檔NF_DETECT_RB();/等待 RnB 信號變高,即不忙NF_CE_H();/關閉 nandflash 片選讀取 K9F2G08U0A 芯片 ID 的操作如下: 時序圖在 datasheet 的 figure18 。首先需要寫入讀 ID 命令 (0x90) ,然后再寫入 0x00 地址,并等待芯片就緒,就可以讀取到一共五個周

19、期的芯片 ID ,第一個周期為廠商 ID ,第二個周期為設備 ID,第三個周期至第五個周期包括了一些具體的該芯片信息,函數如下static char rNF_ReadID()char pMID;char pDID;char cyc3, cyc4, cyc5;NF_nFCE_L();/打開 nandflash 片選NF_CLEAR_RB();/清 RnB 信號NF_CMD(CMD_READID);/讀 ID 命令NF_ADDR(0x0);/寫 0x00 地址for ( i = 0; i < 100; i+ ); 等一段時間/讀五個周期的 IDpMID = NF_RDDATA8();/廠商

20、ID:0xECpDID = NF_RDDATA8();/設備 ID:0xDAcyc3 = NF_RDDATA8();/0x10cyc4 = NF_RDDATA8();/0x95cyc5 = NF_RDDATA8();/0x44NF_nFCE_H();/關閉 nandflash片選return (pDID);.精品文檔下面介紹 Nand Flash讀操作 ,讀操作是以頁為單位進行的。如果在讀取數據的過程中不進行ECC 校驗判斷,則讀操作比較簡單,在寫入讀命令的兩個周期之間寫入要讀取的頁地址,然后讀取數據即可。如果為了更準確地讀取數據,則在讀取完數據之后還要進行 ECC 校驗判斷,以確定所讀取的數

21、據是否正確。在上文中已經介紹過, Nand Flash 的每一頁有兩區(qū): main 區(qū)和 spare 區(qū), main 區(qū)用于存儲正常的數據,spare 區(qū)用于存儲其他附加信息,其中就包括 ECC 校驗碼。當我們在寫入數據的時候,我們就計算這一頁數據的ECC 校驗碼,然后把校驗碼存儲到 spare 區(qū)的特定位置中,在下次讀取這一頁數據的時候,同樣我們也計算ECC 校驗碼,然后與 spare區(qū)中的 ECC 校驗碼比較,如果一致則說明讀取的數據正確,如果不一致則不正確。ECC 的算法較為復雜,好在 S3C2440 能夠硬件產生 ECC 校驗碼,這樣就省去了不少的麻煩事。 S3C2440 既可以產生

22、main 區(qū)的 ECC 校驗碼,也可以產生 spare 區(qū)的 ECC 校驗碼。因為 K9F2G08U0A是 8 位 IO 口,因此 S3C2440共產生 4個字節(jié)的 main 區(qū) ECC 碼和 2 個字節(jié)的 spare 區(qū) ECC 碼。在這里我們規(guī)定,在每一頁的spare 區(qū)的第 0 個地址到第 3個地址存儲 main 區(qū) ECC ,第 4 個地址和第 5 個地址存儲 spare 區(qū) ECC 。產生 ECC 校驗碼的過程為:在讀取或寫入哪個區(qū)的數據之前,先解鎖該區(qū)的ECC ,以便產生該區(qū)的 ECC 。在讀取或寫入完數據之后,再鎖定該區(qū)的 ECC ,這樣系統(tǒng)就會把產生的 ECC 碼保存到相應的寄

23、存器中。 main 區(qū)的 ECC 保存到 NFMECC0/1 中(因為 K9F2G08U0A 是 8 位 IO 口,因此這里只用到了 NFMECC0 ), spare 區(qū)的 ECC 保存到NFSECC 中。對于讀操作來說,我們還要繼續(xù)讀取spare 區(qū)的相應地址內容,以得到上次寫操作時所存儲的main 區(qū)和spare 區(qū)的 ECC ,并把這些數據分別放入 NFMECCD0/1 和 NFSECCD 的相應位置中。最后我們就可以通過讀取 NFESTAT0/1 (因為 K9F2G08U0A 是 8 位 IO 口,因此這里只用到了 NFESTAT0 )中的低 4 位來判斷讀取的數據是否正確,其中第 0

24、 位和第 1 位為 main 區(qū)指示錯誤,第 2 位和第 3 位為 spare 區(qū)指示錯誤。下面是一段具體的頁讀操 作程序:U8 rNF_ReadPage( U32 page_number )U32 i, mecc0, secc;NF_RSTECC();/復位 ECCNF_MECC_UnLock();/ 解鎖 main 區(qū) ECCNF_nFCE_L();/使能芯片NF_CLEAR_RB();/清除 RnBNF_CMD(CMD_READ1);/頁讀命令周期1, 0x00/寫入 5 個地址周期NF_ADDR(0x00);/ 列地址 A0-A7NF_ADDR(0x00);/列地址 A8-A11NF_

25、ADDR(page_number) & 0xff);/行地址 A12-A19NF_ADDR(page_number >> 8) & 0xff);/ 行地址 A20-A27NF_ADDR(page_number >> 16) & 0xff);/行地址 A28NF_CMD(CMD_READ2);/ 頁讀命令周期2, 0x30NF_DETECT_RB();/等待 RnB 信號變高,即不忙.精品文檔for (i = 0; i < 2048; i+)bufi =NF_RDDATA8();/讀取一頁數據內容NF_MECC_Lock();/ 鎖定 mai

26、n 區(qū) ECC 值NF_SECC_UnLock();/ 解鎖 spare 區(qū) ECC/讀 spare 區(qū)的前 4 個地址內容,即第20482051 地址,這4 個字節(jié)為main 區(qū)的 ECCmecc0=NF_RDDATA();/把讀取到的main 區(qū)的 ECC 校驗碼放入NFMECCD0/1的相應位置內rNFMECCD0=(mecc0&0xff00)<<8)|(mecc0&0xff);rNFMECCD1=(mecc0 & 0xff000000)>>8)|(mecc0 & 0xff0000)>>16);NF_SECC_Lock(

27、);/ 鎖定 spare 區(qū)的 ECC 值/繼續(xù)讀 spare 區(qū)的 4 個地址內容, 即第 20522055 地址,其中前 2 個字節(jié)為spare區(qū)的ECC 值secc=NF_RDDA TA();/把讀取到的spare 區(qū)的 ECC 校驗碼放入NFSECCD 的相應位置內rNFSECCD=(secc&0xff00)<<8)|(secc&0xff);NF_nFCE_H();/ 關閉 nandflash 片選/判斷所讀取到的數據是否正確if (rNFESTAT0&0xf) = 0x0)return 0x66;/ 正確elsereturn 0x44;/ 錯誤這段

28、程序是把某一頁的內容讀取到全局變量數組 buffer 中。該程序的輸入參數直接就為 K9F2G08U0A 的第幾頁,例如我們要讀取第 128064 頁中的內容,可以調用該程序為: rNF_ReadPage(128064) 。由于第 128064 頁是第 2001塊中的第 0 頁(128064 2001×640),所以為了更清楚地表示頁與塊之間的關系,也可以寫為:rNF_ReadPage(2001*64) 。頁寫操作的大致流程為:在兩個寫命令周期之間分別寫入頁地址和數據,當然如果為了保證下次讀取該數據時的正確性,還需要把 main 區(qū)的 ECC 值和 spare 區(qū)的 ECC 值寫入到

29、該頁的 spare 區(qū)內。然后我們還需要讀取狀態(tài)寄存器,以判斷這次寫操作是否正確。下面就給出一段具體的頁寫操作程序,其中輸入參數也是要寫入數據到第幾頁:U8 rNF_WritePage(U32 page_number).精品文檔U32 i, mecc0, secc;U8 stat, temp;temp = rNF_IsBadBlock(page_number>>6);/判斷該塊是否為壞塊if(temp = 0x33)return 0x42;/是壞塊,返回NF_RSTECC();/復位 ECC >使能 ECCNF_MECC_UnLock();/解鎖 main 區(qū)的 ECCNF_

30、nFCE_L();/ 打開 nandflash 片選NF_CLEAR_RB();/清 RnB 信號NF_CMD(CMD_WRITE1);/ 頁寫命令周期1/寫入 5 個地址周期NF_ADDR(0x00);/列地址 A0A7NF_ADDR(0x00);/ 列地址 A8A11NF_ADDR(page_number) & 0xff);/行地址 A12A19NF_ADDR(page_number >> 8) & 0xff);/行地址 A20A27NF_ADDR(page_number >> 16) & 0xff);/行地址 A28for (i = 0;

31、i < 2048; i+)/寫入一頁數據NF_WRDATA8(char)(i+6);NF_MECC_Lock();/ 鎖定 main 區(qū)的 ECC 值mecc0=rNFMECC0;/讀取 main 區(qū)的 ECC 校驗碼/把 ECC 校驗碼由字型轉換為字節(jié)型,并保存到全局變量數組ECCBuf 中ECCBuf0=(U8)(mecc0&0xff);ECCBuf1=(U8)(mecc0>>8) & 0xff);ECCBuf2=(U8)(mecc0>>16) & 0xff);ECCBuf3=(U8)(mecc0>>24) & 0x

32、ff);NF_SECC_UnLock();/ 解鎖 spare 區(qū)的 ECC/把 main 區(qū)的 ECC 值寫入到spare 區(qū)的前 4 個字節(jié)地址內,即第20482051 地址for(i=0;i<4;i+)NF_WRDATA8(ECCBufi);NF_SECC_Lock();/鎖定 spare 區(qū)的 ECC 值secc=rNFSECC;/讀取 spare 區(qū)的 ECC 校驗碼/把 ECC 校驗碼保存到全局變量數組ECCBuf 中ECCBuf4=(U8)(secc&0xff);ECCBuf5=(U8)(secc>>8) & 0xff);/把 spare 區(qū)的

33、ECC 值繼續(xù)寫入到spare 區(qū)的第 20522053 地址內for(i=4;i<6;i+).精品文檔NF_WRDATA8(ECCBufi);NF_CMD(CMD_WRITE2);/頁寫命令周期2delay(1000);/ 延時一段時間,以等待寫操作完成NF_CMD(CMD_STA TUS);/ 讀狀態(tài)命令/判斷狀態(tài)值的第6 位是否為1,即是否在忙,該語句的作用與NF_DETECT_RB(); 相同dostat = NF_RDDATA8();while(!(stat&0x40);NF_nFCE_H();/關閉 Nand Flash 片選/判斷狀態(tài)值的第0 位是否為0,為 0 則

34、寫操作正確,否則錯誤if (stat & 0x1)temp = rNF_MarkBadBlock(page_number>>6);/標注該頁所在的塊為壞塊if (temp = 0x21)return 0x43/ 表示寫操作失敗,并且在標注該頁所在的塊為壞塊時也失敗elsereturn 0x44;/ 寫操作失敗elsereturn 0x66;/ 寫操作成功該段程序先判斷該頁所在的壞是否為壞塊,如果是則退出。在最后寫操作失敗后,還要標注該頁所在的塊為壞塊,其中所用到的函數rNF_IsBadBlock 和 rNF_MarkBadBlock ,我們在后面介紹。我們再總結一下該程序所

35、返回數值的含義, 0x42:表示該頁所在的塊為壞塊;0x43:表示寫操作失敗,并且在標注該頁所在的塊為壞塊時也失?。?x44:表示寫操作失敗,但是標注壞塊成功;0x66:寫操作成功。擦除 是以塊為單位進行的,因此在寫地址周期是,只需寫三個行周期,并且要從A18 開始寫起。與寫操作一樣,在擦除結束前還要判斷是否擦除操作成功,另外同樣也存在需要判斷是否為壞塊以及要標注壞塊的問題。下面就給出一段具體的塊擦除操作程序:U8 rNF_EraseBlock(U32 block_number)char stat, temp;temp = rNF_IsBadBlock(block_number); / 判斷該

36、塊是否為壞塊 if(temp = 0x33)return 0x42;/是壞塊,返回NF_nFCE_L();/打開片選NF_CLEAR_RB();/ 清 RnB 信號NF_CMD(CMD_ERASE1);/ 擦除命令周期1/ 寫入 3 個地址周期,從A18 開始寫起.精品文檔NF_ADDR(block_number << 6) & 0xff);/行地址 A18A19NF_ADDR(block_number >> 2) & 0xff);/行地址 A20A27NF_ADDR(block_number >> 10) & 0xff);/行地址

37、A28NF_CMD(CMD_ERASE2);/擦除命令周期2delay(1000);/延時一段時間NF_CMD(CMD_STATUS);/讀狀態(tài)命令/判斷狀態(tài)值的第6 位是否為1,即是否在忙,該語句的作用與NF_DETECT_RB(); 相同dostat = NF_RDDA TA8();while(!(stat&0x40);NF_nFCE_H();/關閉 Nand Flash 片選/判斷狀態(tài)值的第0 位是否為0,為 0 則擦除操作正確,否則錯誤if (stat & 0x1)temp = rNF_MarkBadBlock(page_number>>6); / 標注該塊

38、為壞塊 if (temp = 0x21)return 0x43/標注壞塊失敗elsereturn 0x44;/擦除操作失敗elsereturn 0x66;/ 擦除操作成功該程序的輸入參數為K9F2G08U0A 的第幾塊,例如我們要擦除第2001 塊,則調用該函數為: rNF_EraseBlock(2001)K9F2G08U0A 除了提供了頁讀和頁寫功能外,還提供了頁內地址隨意讀、寫功能。頁讀和頁寫是從頁的首地址開始讀、寫,而隨意讀、寫實現了在一頁范圍內任意地址的讀、寫。隨意讀操作是在頁讀操作后輸入隨意讀命令和頁內列地址,這樣就可以讀取到列地址所指定地址的數據。隨意寫操作是在頁寫操作的第二個頁寫

39、命令周期前,輸入隨意寫命令和頁內列地址,以及要寫入的數據,這樣就可以把數據寫入到列地址所指定的地址內。下面兩段程序實現了隨意讀和隨意寫功能,其中隨意讀程序的輸入參數分別為頁地址和頁內地址,輸出參數為所讀取到的數據,隨意寫程序的輸入參數分別為頁地址,頁內地址,以及要寫入的數據。U8 rNF_RamdomRead(U32 page_number, U32 add)NF_nFCE_L();/打開 Nand Flash 片選NF_CLEAR_RB();/清 RnB 信號NF_CMD(CMD_READ1);/頁讀命令周期1/寫入 5 個地址周期NF_ADDR(0x00);/列地址 A0A7NF_ADDR

40、(0x00);/列地址 A8A11NF_ADDR(page_number) & 0xff);/行地址 A12A19NF_ADDR(page_number >> 8) & 0xff);/行地址 A20A27.精品文檔NF_ADDR(page_number >> 16) & 0xff);/行地址 A28NF_CMD(CMD_READ2);/頁讀命令周期 2NF_DETECT_RB();/ 等待 RnB 信號變高,即不忙NF_CMD(CMD_RANDOMREAD1);/ 隨意讀命令周期 1/頁內地址NF_ADDR(char)(add&0xff);/列地址 A0A7NF_ADDR(char)(add>>8)&0x0f);

溫馨提示

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

最新文檔

評論

0/150

提交評論