S3C2440對(duì)NandFlash操作和電路原理_第1頁(yè)
S3C2440對(duì)NandFlash操作和電路原理_第2頁(yè)
S3C2440對(duì)NandFlash操作和電路原理_第3頁(yè)
S3C2440對(duì)NandFlash操作和電路原理_第4頁(yè)
S3C2440對(duì)NandFlash操作和電路原理_第5頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、S3C2440對(duì)Nand Flash操作和電路原理S3C2440內(nèi)部集成了一個(gè)Nand flash控制器。S3C2440的Nand flash控制器包含了如下的特性:l一個(gè)引導(dǎo)啟動(dòng)單元l Nand Flash存儲(chǔ)器接口,支持8位或16位的每頁(yè)大小為256字,512字節(jié),1K字和2K字節(jié)的Nand flash l軟件模式:用戶可以直接訪問(wèn)Nand Flash存儲(chǔ)器,此特性可以用于Nand Flash存儲(chǔ)器的讀、擦除和編程。l S3C2440支持8/16位的Nand Flash存儲(chǔ)器接口總線l硬件ECC生成,檢測(cè)和指示(軟件糾錯(cuò))。l Steppingstone接口,支持大/小端模式的按字節(jié)/半字

2、/字訪問(wèn)。我用的開(kāi)發(fā)板是天嵌的TQ2440,板子用到的Nand Flash是Samsung公司的K9F2G08U0A,它是8位的Nand flash。本文只介紹Nand Flash的電路原理和Nand Flash的讀、寫、擦除等基本操作,暫不涉及Nand Flash啟動(dòng)程序的問(wèn)題。Nand Flash的電路連接如圖1所示:圖1 Nand Flash電路原理上圖的左邊為K9F2G08U0A與2440的連接圖,原理方面就不多介紹,去看看datasheet估計(jì)就懂得了,右邊的部分是S3C2440的Nand控制器的配置。配置引腳NCON,GPG13,GPG14和GPG15用來(lái)設(shè)置Nand Flash的

3、基本信息,Nand控制器通過(guò)讀取配置引腳的狀態(tài)獲取外接的Nand Flash的配置信息,圖2是這四個(gè)配置引腳的定義:圖2 Nand控制配置引腳信息由于K9F2G08U0A的總線寬度為8位,頁(yè)大小為2048字節(jié),需要5個(gè)尋址命令,所以NCON、GPG13和GPG14應(yīng)該接高電平,GPG15應(yīng)該接低電平。K9F2G08U0A沒(méi)有地址或數(shù)據(jù)總線,只有8個(gè)IO口,這8個(gè)IO口用于傳輸命令、地址和數(shù)據(jù)。K9F2G08U0A主要以page(頁(yè))為單位進(jìn)行讀寫,以block(塊)為單位進(jìn)行擦除。每一頁(yè)中又分為main區(qū)和spare區(qū),main區(qū)用于正常數(shù)據(jù)的存儲(chǔ),spare區(qū)用于存儲(chǔ)一些附加信息,如塊好壞的

4、標(biāo)記、塊的邏輯地址、頁(yè)內(nèi)數(shù)據(jù)的ECC校驗(yàn)和等。K9F2G08U0A的存儲(chǔ)陣列如圖3所示:圖3 K9F2G08U0A內(nèi)部存儲(chǔ)陣列由上圖,我們可以知道:K9F2G08U0A的一頁(yè)為(2K+64)字節(jié)(2K表示的是main區(qū)容量,64表示的是spare區(qū)容量),它的一塊為64頁(yè),而整個(gè)設(shè)備包括了2048個(gè)塊。這樣算下來(lái)一共有2112M位容量,如果只算main區(qū)容量則有256M字節(jié)(即256M8位)。圖4 K9F2G08U0A地址序列要實(shí)現(xiàn)用8個(gè)IO口來(lái)要訪問(wèn)這么大的容量,如圖4所示:K9F2G08U0A規(guī)定了用5個(gè)周期來(lái)實(shí)現(xiàn)。第一個(gè)周期訪問(wèn)的地址為A0A7;第二個(gè)周期訪問(wèn)的地址為A8A11,它作用在

5、IO0IO3上,而此時(shí)IO4IO7必須為低電平;第三個(gè)周期訪問(wèn)的地址為A12A19;第四個(gè)周期訪問(wèn)的地址為A20A27;第五個(gè)周期訪問(wèn)的地址為A28,它作用在IO0上,而此時(shí)IO1IO7必須為低電平。前兩個(gè)周期傳輸?shù)氖橇械刂罚笕齻€(gè)周期傳輸?shù)氖切械刂?。通過(guò)分析可知,列地址是用于尋址頁(yè)內(nèi)空間,行地址用于尋址頁(yè),如果要直接訪問(wèn)塊,則需要從地址A18開(kāi)始。由于所有的命令、地址和數(shù)據(jù)全部從8位IO口傳輸,所以Nand flash定義了一個(gè)命令集來(lái)完成各種操作。有的操作只需要一個(gè)命令(即一個(gè)周期)即可,而有的操作則需要兩個(gè)命令(即兩個(gè)周期)來(lái)實(shí)現(xiàn)。K9F2G08U0A的命令說(shuō)明如圖5所示:圖5 K9F2

6、G08U0A命令表為了方便使用,我們宏定義了K9F2G08U0A的常用命令#define CMD_READ1 0x00/頁(yè)讀命令周期1#define CMD_READ2 0x30/頁(yè)讀命令周期2#define CMD_READID 0x90/讀ID命令#define CMD_WRITE1 0x80/頁(yè)寫命令周期1#define CMD_WRITE2 0x10/頁(yè)寫命令周期2#define CMD_ERASE1 0x60/塊擦除命令周期1#define CMD_ERASE2 0xd0/塊擦除命令周期2#define CMD_STATUS 0x70/讀狀態(tài)命令#define CMD_RESET 0

7、xff/復(fù)位#define CMD_RANDOMREAD1 0x05/隨意讀命令周期1#define CMD_RANDOMREAD2 0xE0/隨意讀命令周期2#define CMD_RANDOMWRITE 0x85/隨意寫命令接下來(lái)介紹幾個(gè)Nand Flash控制器的寄存器。Nand Flash控制器的寄存器主要有NFCONF(Nand Flash配置寄存器),NFCONT(Nand Flash控制寄存器),NFCMMD(Nand Flash命令集寄存器),NFADDR(Nand Flash地址集寄存器),NFDATA(Nand Flash數(shù)據(jù)寄存器),NFMECCD0/1(Nand Fla

8、sh的main區(qū)ECC寄存器),NFSECCD(Nand Flash的spare區(qū)ECC寄存器),NFSTAT(Nand Flash操作狀態(tài)寄存器),NFESTAT0/1(Nand Flash的ECC狀態(tài)寄存器),NFMECC0/1(Nand Flash用于數(shù)據(jù)的ECC寄存器),以及NFSECC(Nand Flash用于IO的ECC寄存器)。(1)NFCONF:2440的NFCONF寄存器是用來(lái)設(shè)置NAND Flash的時(shí)序參數(shù)TACLS、TWRPH0、TWRPH1。配置寄存器的3:0是只讀位,用來(lái)指示外部所接的Nand Flash的配置信息,它們是由配置引腳NCON,GPG13,GPG14和

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

10、已經(jīng)做了詳細(xì)說(shuō)明。(5)NFDATA:只用到低8位,讀、寫此寄存器將啟動(dòng)對(duì)NAND Flash的讀數(shù)據(jù)、寫數(shù)據(jù)操作。(6)NFSTAT:只用到位0,用來(lái)檢測(cè)NAND是否準(zhǔn)備好。0:busy,1:ready。NFCONF寄存器使用TACLS、TWRPH0、TWRPH1這3個(gè)參數(shù)來(lái)控制NAND Flash信號(hào)線CLE/ALE與寫控制信號(hào)nWE的時(shí)序關(guān)系,它們之間的關(guān)系如圖6和圖7所示:圖6 CLE/ALE時(shí)序圖圖7 nWE和nRE時(shí)序圖TACLS為CLE/ALE有效到nWE有效之間的持續(xù)時(shí)間,TWRPH0為nWE的有效持續(xù)時(shí)間,TWRPH1為nWE無(wú)效到CLE/ALE無(wú)效之間的持續(xù)時(shí)間,這些時(shí)間都

11、是以HCLK為單位的。通過(guò)查閱K9F2G08U0A的數(shù)據(jù)手冊(cè),我們可以找到并計(jì)算與S3C2440相對(duì)應(yīng)的時(shí)序:K9F2G08U0A中的Twp與TWRPH0相對(duì)應(yīng),Tclh與TWRPH1相對(duì)應(yīng),TACLS應(yīng)該是與Tcls相對(duì)應(yīng)。K9F2G08U0A給出的都是最小時(shí)間,2440只要滿足它的最小時(shí)間即可。TACLS、TWRPH0、TWRPH1這三個(gè)變量取值大一些會(huì)更保險(xiǎn),在這里,這三個(gè)值分別取1,2和0。下面就開(kāi)始詳細(xì)介紹K9F2G08U0A的基本操作,包括復(fù)位,讀ID,頁(yè)讀、寫數(shù)據(jù),隨意讀、寫數(shù)據(jù),塊擦除等。為了更好地應(yīng)用ECC和使能Nand Flash片選,我們還需要一些宏定義:#define

12、NF_nFCE_L()rNFCONT&=(1 1);#define NF_CE_L()NF_nFCE_L()/打開(kāi)nandflash片選#define NF_nFCE_H()rNFCONT|=(1 1);#define NF_CE_H()NF_nFCE_H()/關(guān)閉nandflash片選#define NF_RSTECC()rNFCONT|=(1 4);/復(fù)位ECC#define NF_MECC_UnLock()rNFCONT&=(1 5);/解鎖main區(qū)ECC#define NF_MECC_Lock()rNFCONT|=(1 5);/鎖定main區(qū)ECC#define NF_SECC_Un

13、Lock()rNFCONT&=(1 6);/解鎖spare區(qū)ECC#define NF_SECC_Lock()rNFCONT|=(1 6);/鎖定spare區(qū)ECC NFSTAT是另一個(gè)比較重要的寄存器,它的第0位可以用于判斷nandflash是否在忙,第2位用于檢測(cè)RnB引腳信號(hào):#define NF_WAITRB()while(!(rNFSTAT&(1 0);/等待Nand Flash不忙#define NF_CLEAR_RB()rNFSTAT|=(1 2);/清除RnB信號(hào)#define NF_DETECT_RB()while(!(rNFSTAT&(1 2);/等待RnB信號(hào)變高,即不忙

14、NFCMMD,NFADDR和NFDATA分別用于傳輸命令,地址和數(shù)據(jù),為了方便起見(jiàn),我們可以定義一些宏定義用于完成上述操作:#define NF_CMD(data)rNFCMD=(data);/傳輸命令#define NF_ADDR(addr)rNFADDR=(addr);/傳輸?shù)刂?define NF_RDDATA()rNFDATA)/讀32位數(shù)據(jù)#define NF_RDDATA8()(rNFDATA8)/讀8位數(shù)據(jù)#define NF_WRDATA(data)rNFDATA=(data);/寫32位數(shù)據(jù)#define NF_WRDATA8(data)rNFDATA8=(data);/寫8

15、位數(shù)據(jù)首先,是初始化操作void rNF_Init(void)rNFCONF=(TACLS 12)|(TWRPH0 8)|(TWRPH1 4)|(0 0);/初始化時(shí)序參數(shù)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片選及控制器rNF_Reset();/復(fù)位芯片復(fù)位操作,寫入復(fù)位命令static void rNF_Reset()NF_CE_L();/打開(kāi)nandflash片選NF_CLEA

16、R_RB();/清除RnB信號(hào)NF_CMD(CMD_RESET);/寫入復(fù)位命令NF_DETECT_RB();/等待RnB信號(hào)變高,即不忙NF_CE_H();/關(guān)閉nandflash片選讀取K9F2G08U0A芯片ID的操作如下:時(shí)序圖在datasheet的figure18。首先需要寫入讀ID命令(0x90),然后再寫入0x00地址,并等待芯片就緒,就可以讀取到一共五個(gè)周期的芯片ID,第一個(gè)周期為廠商ID,第二個(gè)周期為設(shè)備ID,第三個(gè)周期至第五個(gè)周期包括了一些具體的該芯片信息,函數(shù)如下static char rNF_ReadID()char pMID;char pDID;char cyc3,c

17、yc4,cyc5;NF_nFCE_L();/打開(kāi)nandflash片選NF_CLEAR_RB();/清RnB信號(hào)NF_CMD(CMD_READID);/讀ID命令NF_ADDR(0x0);/寫0x00地址for(i=0;i 100;i+);等一段時(shí)間/讀五個(gè)周期的ID pMID=NF_RDDATA8();/廠商ID:0xEC pDID=NF_RDDATA8();/設(shè)備ID:0xDA cyc3=NF_RDDATA8();/0x10 cyc4=NF_RDDATA8();/0x95 cyc5=NF_RDDATA8();/0x44 NF_nFCE_H();/關(guān)閉nandflash片選return(pD

18、ID);下面介紹Nand Flash讀操作,讀操作是以頁(yè)為單位進(jìn)行的。如果在讀取數(shù)據(jù)的過(guò)程中不進(jìn)行ECC校驗(yàn)判斷,則讀操作比較簡(jiǎn)單,在寫入讀命令的兩個(gè)周期之間寫入要讀取的頁(yè)地址,然后讀取數(shù)據(jù)即可。如果為了更準(zhǔn)確地讀取數(shù)據(jù),則在讀取完數(shù)據(jù)之后還要進(jìn)行ECC校驗(yàn)判斷,以確定所讀取的數(shù)據(jù)是否正確。在上文中已經(jīng)介紹過(guò),Nand Flash的每一頁(yè)有兩區(qū):main區(qū)和spare區(qū),main區(qū)用于存儲(chǔ)正常的數(shù)據(jù),spare區(qū)用于存儲(chǔ)其他附加信息,其中就包括ECC校驗(yàn)碼。當(dāng)我們?cè)趯懭霐?shù)據(jù)的時(shí)候,我們就計(jì)算這一頁(yè)數(shù)據(jù)的ECC校驗(yàn)碼,然后把校驗(yàn)碼存儲(chǔ)到spare區(qū)的特定位置中,在下次讀取這一頁(yè)數(shù)據(jù)的時(shí)候,同樣我

19、們也計(jì)算ECC校驗(yàn)碼,然后與spare區(qū)中的ECC校驗(yàn)碼比較,如果一致則說(shuō)明讀取的數(shù)據(jù)正確,如果不一致則不正確。ECC的算法較為復(fù)雜,好在S3C2440能夠硬件產(chǎn)生ECC校驗(yàn)碼,這樣就省去了不少的麻煩事。S3C2440既可以產(chǎn)生main區(qū)的ECC校驗(yàn)碼,也可以產(chǎn)生spare區(qū)的ECC校驗(yàn)碼。因?yàn)镵9F2G08U0A是8位IO口,因此S3C2440共產(chǎn)生4個(gè)字節(jié)的main區(qū)ECC碼和2個(gè)字節(jié)的spare區(qū)ECC碼。在這里我們規(guī)定,在每一頁(yè)的spare區(qū)的第0個(gè)地址到第3個(gè)地址存儲(chǔ)main區(qū)ECC,第4個(gè)地址和第5個(gè)地址存儲(chǔ)spare區(qū)ECC。產(chǎn)生ECC校驗(yàn)碼的過(guò)程為:在讀取或?qū)懭肽膫€(gè)區(qū)的數(shù)據(jù)之前

20、,先解鎖該區(qū)的ECC,以便產(chǎn)生該區(qū)的ECC。在讀取或?qū)懭胪陻?shù)據(jù)之后,再鎖定該區(qū)的ECC,這樣系統(tǒng)就會(huì)把產(chǎn)生的ECC碼保存到相應(yīng)的寄存器中。main區(qū)的ECC保存到NFMECC0/1中(因?yàn)镵9F2G08U0A是8位IO口,因此這里只用到了NFMECC0),spare區(qū)的ECC保存到NFSECC中。對(duì)于讀操作來(lái)說(shuō),我們還要繼續(xù)讀取spare區(qū)的相應(yīng)地址內(nèi)容,以得到上次寫操作時(shí)所存儲(chǔ)的main區(qū)和spare區(qū)的ECC,并把這些數(shù)據(jù)分別放入NFMECCD0/1和NFSECCD的相應(yīng)位置中。最后我們就可以通過(guò)讀取NFESTAT0/1(因?yàn)镵9F2G08U0A是8位IO口,因此這里只用到了NFESTAT

21、0)中的低4位來(lái)判斷讀取的數(shù)據(jù)是否正確,其中第0位和第1位為main區(qū)指示錯(cuò)誤,第2位和第3位為spare區(qū)指示錯(cuò)誤。下面是一段具體的頁(yè)讀操作程序:U8 rNF_ReadPage(U32 page_number)U32 i,mecc0,secc;NF_RSTECC();/復(fù)位ECC NF_MECC_UnLock();/解鎖main區(qū)ECC NF_nFCE_L();/使能芯片NF_CLEAR_RB();/清除RnB NF_CMD(CMD_READ1);/頁(yè)讀命令周期1,0x00/寫入5個(gè)地址周期NF_ADDR(0x00);/列地址A0-A7 NF_ADDR(0x00);/列地址A8-A11 NF

22、_ADDR(addr)&0xff);/行地址A12-A19 NF_ADDR(addr 8)&0xff);/行地址A20-A27 NF_ADDR(addr 16)&0xff);/行地址A28 NF_CMD(CMD_READ2);/頁(yè)讀命令周期2,0x30 NF_DETECT_RB();/等待RnB信號(hào)變高,即不忙for(i=0;i 2048;i+)bufi=NF_RDDATA8();/讀取一頁(yè)數(shù)據(jù)內(nèi)容NF_MECC_Lock();/鎖定main區(qū)ECC值NF_SECC_UnLock();/解鎖spare區(qū)ECC mecc0=NF_RDDATA();/讀spare區(qū)的前4個(gè)地址內(nèi)容,即第20482

23、051地址,這4個(gè)字節(jié)為main區(qū)的ECC/把讀取到的main區(qū)的ECC校驗(yàn)碼放入NFMECCD0/1的相應(yīng)位置內(nèi)rNFMECCD0=(mecc0&0xff00)8)|(mecc0&0xff);rNFMECCD1=(mecc0&0xff 000000)8)|(mecc0&0xff0000)16);NF_SECC_Lock();/鎖定spare區(qū)的ECC值secc=NF_RDDATA();/繼續(xù)讀spare區(qū)的4個(gè)地址內(nèi)容,即第20522055地址,其中前2個(gè)字節(jié)為spare區(qū)的ECC值/把讀取到的spare區(qū)的ECC校驗(yàn)碼放入NFSECCD的相應(yīng)位置內(nèi)rNFSECCD=(secc&0xff00

24、)8)|(secc&0xff);NF_nFCE_H();/關(guān)閉nandflash片選/判斷所讀取到的數(shù)據(jù)是否正確if(rNFESTAT0&0xf)=0x0)return 0x66;/正確else return 0x44;/錯(cuò)誤這段程序是把某一頁(yè)的內(nèi)容讀取到全局變量數(shù)組buffer中。該程序的輸入?yún)?shù)直接就為K9F2G08U0A的第幾頁(yè),例如我們要讀取第128064頁(yè)中的內(nèi)容,可以調(diào)用該程序?yàn)椋簉NF_ReadPage(128064)。由于第128064頁(yè)是第2001塊中的第0頁(yè)(128064=200164+0),所以為了更清楚地表示頁(yè)與塊之間的關(guān)系,也可以寫為:rNF_ReadPage(200

25、1*64)。頁(yè)寫操作的大致流程為:在兩個(gè)寫命令周期之間分別寫入頁(yè)地址和數(shù)據(jù),當(dāng)然如果為了保證下次讀取該數(shù)據(jù)時(shí)的正確性,還需要把main區(qū)的ECC值和spare區(qū)的ECC值寫入到該頁(yè)的spare區(qū)內(nèi)。然后我們還需要讀取狀態(tài)寄存器,以判斷這次寫操作是否正確。下面就給出一段具體的頁(yè)寫操作程序,其中輸入?yún)?shù)也是要寫入數(shù)據(jù)到第幾頁(yè):U8 rNF_WritePage(U32 page_number)U32 i,mecc0,secc;U8 stat,temp;temp=rNF_IsBadBlock(page_number 6);/判斷該塊是否為壞塊if(temp=0x33)return 0x42;/是壞塊,

26、返回NF_RSTECC();/復(fù)位ECC NF_MECC_UnLock();/解鎖main區(qū)的ECC NF_nFCE_L();/打開(kāi)nandflash片選NF_CLEAR_RB();/清RnB信號(hào)NF_CMD(CMD_WRITE1);/頁(yè)寫命令周期1/寫入5個(gè)地址周期NF_ADDR(0x00);/列地址A0A7 NF_ADDR(0x00);/列地址A8A11 NF_ADDR(page_number)&0xff);/行地址A12A19 NF_ADDR(page_number 8)&0xff);/行地址A20A27 NF_ADDR(page_number 16)&0xff);/行地址A28 for

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

28、前4個(gè)字節(jié)地址內(nèi),即第20482051地址for(i=0;i 4;i+)NF_WRDATA8(ECCBufi);NF_SECC_Lock();/鎖定spare區(qū)的ECC值secc=rNFSECC;/讀取spare區(qū)的ECC校驗(yàn)碼/把ECC校驗(yàn)碼保存到全局變量數(shù)組ECCBuf中ECCBuf4=(U8)(secc&0xff);ECCBuf5=(U8)(secc 8)&0xff);/把spare區(qū)的ECC值繼續(xù)寫入到spare區(qū)的第20522053地址內(nèi)for(i=4;i 6;i+)NF_WRDATA8(ECCBufi);NF_CMD(CMD_WRITE2);/頁(yè)寫命令周期2 delay(1000)

29、;/延時(shí)一段時(shí)間,以等待寫操作完成NF_CMD(CMD_STATUS);/讀狀態(tài)命令/判斷狀態(tài)值的第6位是否為1,即是否在忙,該語(yǔ)句的作用與NF_DETECT_RB();相同dostat=NF_RDDATA8();while(!(stat&0x40);NF_nFCE_H();/關(guān)閉Nand Flash片選/判斷狀態(tài)值的第0位是否為0,為0則寫操作正確,否則錯(cuò)誤if(stat&0x1)temp=rNF_MarkBadBlock(page_number 6);/標(biāo)注該頁(yè)所在的塊為壞塊if(temp=0x21)return 0x43/標(biāo)注壞塊失敗else return 0x44;/寫操作失敗else

30、 return 0x66;/寫操作成功該段程序先判斷該頁(yè)所在的壞是否為壞塊,如果是則退出。在最后寫操作失敗后,還要標(biāo)注該頁(yè)所在的塊為壞塊,其中所用到的函數(shù)rNF_IsBadBlock和rNF_MarkBadBlock,我們?cè)诤竺娼榻B。我們?cè)倏偨Y(jié)一下該程序所返回?cái)?shù)值的含義,0x42:表示該頁(yè)所在的塊為壞塊;0x43:表示寫操作失敗,并且在標(biāo)注該頁(yè)所在的塊為壞塊時(shí)也失?。?x44:表示寫操作失敗,但是標(biāo)注壞塊成功;0x66:寫操作成功。擦除是以塊為單位進(jìn)行的,因此在寫地址周期是,只需寫三個(gè)行周期,并且要從A18開(kāi)始寫起。與寫操作一樣,在擦除結(jié)束前還要判斷是否擦除操作成功,另外同樣也存在需要判斷是否

31、為壞塊以及要標(biāo)注壞塊的問(wèn)題。下面就給出一段具體的塊擦除操作程序:U8 rNF_EraseBlock(U32 block_number)char stat,temp;temp=rNF_IsBadBlock(block_number);/判斷該塊是否為壞塊if(temp=0x33)return 0x42;/是壞塊,返回NF_nFCE_L();/打開(kāi)片選NF_CLEAR_RB();/清RnB信號(hào)NF_CMD(CMD_ERASE1);/擦除命令周期1/寫入3個(gè)地址周期,從A18開(kāi)始寫起NF_ADDR(block_number 6)&0xff);/行地址A18A19 NF_ADDR(block_numb

32、er 2)&0xff);/行地址A20A27 NF_ADDR(block_number 10)&0xff);/行地址A28 NF_CMD(CMD_ERASE2);/擦除命令周期2 delay(1000);/延時(shí)一段時(shí)間NF_CMD(CMD_STATUS);/讀狀態(tài)命令/判斷狀態(tài)值的第6位是否為1,即是否在忙,該語(yǔ)句的作用與NF_DETECT_RB();相同dostat=NF_RDDATA8();while(!(stat&0x40);NF_nFCE_H();/關(guān)閉Nand Flash片選/判斷狀態(tài)值的第0位是否為0,為0則擦除操作正確,否則錯(cuò)誤if(stat&0x1)temp=rNF_MarkB

33、adBlock(page_number 6);/標(biāo)注該塊為壞塊if(temp=0x21)return 0x43/標(biāo)注壞塊失敗else return 0x44;/擦除操作失敗else return 0x66;/擦除操作成功該程序的輸入?yún)?shù)為K9F2G08U0A的第幾塊,例如我們要擦除第2001塊,則調(diào)用該函數(shù)為:rNF_EraseBlock(2001)。K9F2G08U0A除了提供了頁(yè)讀和頁(yè)寫功能外,還提供了頁(yè)內(nèi)地址隨意讀、寫功能。頁(yè)讀和頁(yè)寫是從頁(yè)的首地址開(kāi)始讀、寫,而隨意讀、寫實(shí)現(xiàn)了在一頁(yè)范圍內(nèi)任意地址的讀、寫。隨意讀操作是在頁(yè)讀操作后輸入隨意讀命令和頁(yè)內(nèi)列地址,這樣就可以讀取到列地址所指定地

34、址的數(shù)據(jù)。隨意寫操作是在頁(yè)寫操作的第二個(gè)頁(yè)寫命令周期前,輸入隨意寫命令和頁(yè)內(nèi)列地址,以及要寫入的數(shù)據(jù),這樣就可以把數(shù)據(jù)寫入到列地址所指定的地址內(nèi)。下面兩段程序?qū)崿F(xiàn)了隨意讀和隨意寫功能,其中隨意讀程序的輸入?yún)?shù)分別為頁(yè)地址和頁(yè)內(nèi)地址,輸出參數(shù)為所讀取到的數(shù)據(jù),隨意寫程序的輸入?yún)?shù)分別為頁(yè)地址,頁(yè)內(nèi)地址,以及要寫入的數(shù)據(jù)。U8 rNF_RamdomRead(U32 page_number,U32 add)NF_nFCE_L();/打開(kāi)Nand Flash片選NF_CLEAR_RB();/清RnB信號(hào)NF_CMD(CMD_READ1);/頁(yè)讀命令周期1/寫入5個(gè)地址周期NF_ADDR(0x00);/

35、列地址A0A7 NF_ADDR(0x00);/列地址A8A11 NF_ADDR(page_number)&0xff);/行地址A12A19 NF_ADDR(page_number 8)&0xff);/行地址A20A27 NF_ADDR(page_number 16)&0xff);/行地址A28 NF_CMD(CMD_READ2);/頁(yè)讀命令周期2 NF_DETECT_RB();/等待RnB信號(hào)變高,即不忙NF_CMD(CMD_RANDOMREAD1);/隨意讀命令周期1/頁(yè)內(nèi)地址NF_ADDR(char)(add&0xff);/列地址A0A7 NF_ADDR(char)(add 8)&0x0f);/列地址A8A11 NF_CMD(CMD_RANDOMREAD2);/隨意讀命令周期2 return NF_RDDATA8();/讀取數(shù)據(jù)U8 rNF_RamdomWrite(U32 page_num

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論