基于LPC2214簡單的nandflash讀寫_第1頁
基于LPC2214簡單的nandflash讀寫_第2頁
基于LPC2214簡單的nandflash讀寫_第3頁
基于LPC2214簡單的nandflash讀寫_第4頁
基于LPC2214簡單的nandflash讀寫_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、本程序基于LPC2214對(duì)外擴(kuò)nandflash的簡單讀寫:主函數(shù)部分:/* 對(duì)于LPC2214由于內(nèi)部沒有nandflash控制器,當(dāng)然也沒有ECC校驗(yàn),所以這些在 LPC2214里面都需要我們自己去寫,不過基本一樣送地址直接送就可以了,只是沒有 特別的寄存器去代替而已,只不過ECC校驗(yàn)?zāi)菈K比較煩。本程序只對(duì)nandflash的簡單 讀寫沒有ECC校驗(yàn),沒有壞去檢查等。只有簡單的讀寫。*/#include "config.h"#include "nandflash.c"#define uint unsigned int#define uchar uns

2、igned charuint8 databuf2=0x16,0x16;uint8 databuf12;#define LED 0x000f0000void delay_ms(uint32 z) uint32 x,y; for(x=3000;x>0;x-) for(y=z;y>0;y-); void nandflash_init() PINSEL2=PINSEL2&0xfffffff7; /將P1.16-P1.25設(shè)置為GPIO口 IO1DIR=LED; /將P1.16-1.19設(shè)置為輸出端 IO1SET=LED; / PINSEL2=(BIT5|BIT8|BIT14|BIT

3、16|BIT23|BIT24|BIT25|BIT26|BIT27); IO0DIR = 0x39FFB2F0; /0=輸入,1=輸出; BCFG2=0x00000c48; PINSEL2=0x0e004120; /使能WE OE CS2 / BCFG2=0x0000fbef; /存儲(chǔ)器組配置寄存器 /IO0SET = 0x00003000;int main() nandflash_init(); / NF_Reset(); / NF_CheckId(); / NF_Init(); BlockErase(); NF_WritePage(0,10,0,2,databuf); /寫入一頁數(shù)據(jù) / d

4、elay_ms(10); NF_ReadPage(0,10,0,2,databuf1); /讀出一頁數(shù)據(jù) while(1) if(databuf10=0x16)&&(databuf11=0x16) IO1CLR=LED; delay_ms(2000); IO1SET=LED; delay_ms(2000); else if(databuf10=0xff)|(databuf11=0xff) IO0SET=LED; delay_ms(500); IO0CLR=LED; delay_ms(500); else IO1CLR=LED; return(0);Nandflash.c部分:既

5、對(duì)nandflash的操作和一些簡單的初始化設(shè)置等#include <string.h>#include "config.h"#include "nandflash.h"uint32 DataCheckSum=0;uint8 DataProtect;uint8 Read_Flash_Buf2048;uint8 NorFlashIDRD2=0x0,0x0;uint8 NorFlashID5=0x0,0x0,0xFF,0xFF,0xFF;uint16 device_id;uint32 NandFFileCnt;uint32 NANDFLASH_S

6、TART;uint8 GdromDataBuf2048+64;/wlw changeuint8 *GdromRawcodes;/指向從nand中讀出的ECC值uint8 GdromECCcodes24;/wlw add,計(jì)算的ECC值extern uint8 databuf12;char *MY_ID = "QUANTAI TECHNOLOGY,LTD.;Ztech GD-ROM ;2007-7-9"char *GD_GameTitle; struct SYSTEM_ID * GdromSystem_ID(uint8 *gddata);void Read_GdromSyst

7、emID(uint8 *gddata);uint32 NF_CheckId(void) int i; uint16 id; NF_CMD(0x90); NF_ADDR(0x0); for(i=0;i<10;i+); /wait tWB(100ns)/? id=NF_RDDATA()<<8;/ Maker code id|=NF_RDDATA();/ Devide code return id;void NF_Reset(void) int i; NF_CMD(0xFF);/reset command for(i=0;i<10;i+); /tWB = 100ns. NF_

8、WAITRB(); /wait 200500us;void NF_Init(void) DataCheckSum = 0x0; NF_Reset(); device_id = NF_CheckId(); NandFFileCnt = 0x4; switch(device_id)case ID_K9S1208V0M : ; break;case ID_K9S1G08U0M: ; break;case ID_K9K8G08U0M: ; break;case ID_NAND08GW3B2C : ; device_id = ID_K9K8G08U0M; break; default : break;

9、void NF_ReadPage(uint32 block,uint32 page,uint32 Column,uint32 length ,uint8 *buffer) int i; / int ret=0; register uint8 * bufPt=buffer; unsigned int blockPage; page = page & 0x3f; /頁不能大于64,一個(gè)塊只有64pages blockPage=(block<<6)+page; /1 Block=64page,列包含塊和頁 Column = Column & 0x0fff; /高四位設(shè)為0

10、 NF_CMD(0x00); / 讀命令 NF_ADDR(Column&0xff); / 第一行地址A0-A7 NF_ADDR(Column>>8)&0xff); /第二行地址A8-A11,高四位屏蔽為0 NF_ADDR(blockPage&0xff); / Block & Page num.列地址A12-A19 NF_ADDR(blockPage>>8)&0xff); /列地址A20-A27 if(device_id = ID_K9K8G08U0M) NF_ADDR(blockPage>>16)&0xff);

11、 / row2 NF_CMD(0x30); / Read command for(i=0;i<5;i+); /wait tWB(100ns) NF_WAITRB(); / Wait tR(max 12us)忙信號(hào)檢測 /i=length; /while(i-!=0) for(i=0;i<length;i+) *bufPt+=NF_RDDATA();/ Read one page /bufferi=*bufPt+; / return ret;int NF_IsBadBlock(uint32 blockNum)uint32 page; uint32 Column; uint8 data

12、_buff1; page = blockNum/0x800; Column =blockNum%0x800; / NF_ReadPage(0,(page+Error_ADDR),Column,1 ,data_buff); if(data_buff0 = MarkID) return 1; else return 0; int NF_WritePage(uint32 block,uint32 page,uint32 Column,uint32 length ,uint8 *buffer) int i; int state; uint32 blockPage; uint8 *bufPt=buffe

13、r; page=page&0x3f; blockPage=(block<<6)+page; Column = Column & 0x0fff; NF_CMD(0x80); / Write 1st command NF_ADDR(Column&0xff); / Column = 0 NF_ADDR(Column>>8)&0xff); / NF_ADDR(blockPage&0xff); / NF_ADDR(blockPage>>8)&0xff); / Block & page num. if(device

14、_id = ID_K9K8G08U0M) NF_ADDR(blockPage>>16)&0xff); / row2 for(i=0;i<length;i+) NF_WRDATA(*bufPt+);/ Write one page to NFM from buffer NF_CMD(0x10); / Write 2nd command for(i=0;i<1000;i+); /tWB = 100ns. /? NF_WAITRB(); /wait tPROG 200500us; NF_CMD(0x70); / Read status command for(i=0;

15、i<3;i+); /twhr=60ns state = NF_RDDATA(); / if (state & 0x1) / Page write error / Uart_SendString("PROGRAM_ERROR:block#=%dn",block); return (state & 0x1) ;uint8 NF_WriteProm(void)static uint32 page=0,block=0;/800; uint8 err;uint16 length=2048;uint32 Column=0;if(page>63) page=0

16、; block+;page+;err = NF_WritePage(block,page,Column,length,Read_Flash_Buf);return err;void ReadGdromChkData(void) static uint32 page=0,block=0;/800; uint32 Column=0; uint16 length=2048; if(page>63) page=0; block+; page+; NF_ReadPage(block,page,Column,length,GdromDataBuf); /讀 Check Data 數(shù)據(jù)長度uint8

17、NFID_WriteProm(void)static uint32 page=0,block=0; uint8 err;uint16 length=2;uint32 Column=0;if(page>63) page=0; block+;err = NF_WritePage(block,page,Column,length,NorFlashID);NF_ReadPage(block,page,Column,length,NorFlashID); return err;void NFID_Read(void) uint32 page=0,block=0; uint32 Column=0;

18、uint16 length=2; uint8 FindID,err; FindID=1; while(FindID) NF_ReadPage(block,page,Column,length,NorFlashIDRD); /讀 Check Data 數(shù)據(jù)長度 if(NorFlashIDRD0!=0xFF) FindID=0; else Column+; NorFlashIDRD0+; if(NorFlashIDRD0=0xFF) NorFlashIDRD0=0; NorFlashIDRD1+; Column=Column+2; if(Column=2048) Column=0; block+;

19、 BlockErase(); err = NF_WritePage(block,page,Column,length,NorFlashIDRD); void BlockErase(void)int i; uint8 page=10; uint32 blockPage=0; blockPage=(blockPage<<6)+page; NF_CMD(0x60); / Write 1st command /NF_ADDR(blockPage&0xff); /NF_ADDR(blockPage>>8)&0xff); / Block & page num

20、.if(device_id = ID_K9K8G08U0M)NF_ADDR(blockPage>>16)&0xff); / Block & page num.NF_CMD(0xD0); / Write 2nd commandfor(i=0;i<1000;i+); /tWB = 100ns. /?NF_WAITRB(); /wait tPROG 200500us;NF_CMD(0x70); / Read status commandvoid BlockEraseProm(void)int i; uint8 page=0,j; uint32 blockPage;

21、for(j=0;j<20;j+) blockPage=j; blockPage=(blockPage<<6)+page; NF_CMD(0x60); / Write 1st command /NF_ADDR(blockPage&0xff); /NF_ADDR(blockPage>>8)&0xff); / Block & page num.if(device_id = ID_K9K8G08U0M)NF_ADDR(blockPage>>16)&0xff); / Block & page num.NF_CMD(0xD0

22、); / Write 2nd commandfor(i=0;i<1000;i+); /tWB = 100ns. /?NF_WAITRB(); /wait tPROG 200500us;NF_CMD(0x70); / Read status commandfor(i=0;i<10;i+); /twhr=60nsNandflash.h.部分,對(duì)nandflash定義和申明:#ifndef _NANDFLASH_H_#define _NANDFLASH_H_#define ID_K9S1208V0M 0xec76#define ID_K9S1G08U0M 0xECF1#define ID

23、_K9K8G08U0M 0xECD3#define ID_NAND01GW 0x20F1#define ID_NAND08GW3B2C 0x20D3#define MarkAdr 2050#define MarkID 0x7F #define DOWNLOAD_ADDRESS 0x81000000#define CHECK_ADDRESS 0x32800000#define EnNandflash 1#define DisNandflash 0#define EnECC 1#define DisECC 0#define nFCE_HIGH 1#define nFCE_LOW 0#define

24、nOTEA 0x0#define TEA 0x2#define NANDFLAH_BASE 0x82000000 /nGCS2#define NandFlashData NANDFLAH_BASE#define NandFlashCmd NANDFLAH_BASE+0x800000#define NandFlashAddr NANDFLAH_BASE+0x400000 #define _WRByte(addr,data)*(volatile uint8 *)(addr)=(uint8)data#define _RDByte(addr) ( *(volatile uint8 *)(addr) )

25、#define NF_CMD(cmd) (_WRByte(NandFlashCmd,cmd)#define NF_ADDR(addr)(_WRByte(NandFlashAddr,addr)#define NF_RDDATA() (_RDByte(NandFlashData)#define NF_WRDATA(data) (_WRByte(NandFlashData,data)#define NF_WAITRB() while(IO0PIN & BIT25) != BIT25); extern uint16 device_id;extern uint32 NandFFileCnt;extern uint8 DataProtect;extern uint8 GdromDataBuf;void NF_Reset(void);uint32 NF_CheckId(void);void NF_Init(void);void NF_ReadPage(uint32 block,uint32 page,uint32 Column,uint32 length ,uint8 *bufferc);int ReadData_To_Chihiro(uint32 block,uint32 page,uint32 Column,uint32 leng

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論