




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 電工聘請(qǐng)合同范本
- 供熱ppp項(xiàng)目合同范本
- 分期出租手機(jī)合同范本
- 共享單車租賃合同范本
- 個(gè)體雇傭司機(jī)合同范本
- 公司買車抵押合同范本
- 沖壓模具采購合同范本
- 內(nèi)墻涂料維修合同范本
- 醫(yī)療材料采購合同范本
- 保險(xiǎn)服務(wù)合同范本
- Q∕SY 19001-2017 風(fēng)險(xiǎn)分類分級(jí)規(guī)范
- 智慧消防綜合解決方案
- 勞務(wù)分包項(xiàng)目經(jīng)理崗位職責(zé)
- 幼兒繪本故事:奇怪的雨傘店
- 鋼琴基礎(chǔ)教程教案
- 糖基轉(zhuǎn)移酶和糖苷酶課件(PPT 111頁)
- 屋面網(wǎng)架結(jié)構(gòu)液壓提升施工方案(50頁)
- (語文A版)四年級(jí)語文下冊(cè)課件跳水 (2)
- 第6章向量空間ppt課件
- 醫(yī)療機(jī)構(gòu)聘用(返聘)證明
- 【單元設(shè)計(jì)】第七章《萬有引力與宇宙航行》單元教學(xué)設(shè)計(jì)及教材分析課件高一物理人教版(2019)必修第二冊(cè)
評(píng)論
0/150
提交評(píng)論