OK6410裸機(jī)簡(jiǎn)單的NAND FLASH驅(qū)動(dòng)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
OK6410裸機(jī)簡(jiǎn)單的NANDFLASH驅(qū)動(dòng),只寫了個(gè)簡(jiǎn)單的函數(shù),讀取一頁(yè)
/*************************************************************************************************************
*文件名:NandFlash.c
*功能:S3C6410NandFlash底層驅(qū)動(dòng)函數(shù)
*作者:陳鵬
*創(chuàng)建時(shí)間:2012年3月31日21:34
*最后修改時(shí)間:2012年3月31日
*詳細(xì):NandFlash底層驅(qū)動(dòng)函數(shù),
板載NANDFLASH信息:2GB,MLCK9G4G08(K9GAG08U0D,頁(yè)大小4KB,4bit糾正)
*************************************************************************************************************/
#include"s3c6410_system.h"
#include"NandFlash.h"
#include"s3c6410_map.h"
//配置
//CONF
#defineECCType1//ECC類型選擇,0:SLC(1位修正);1:MLC(4位修正)
#defineTACLS5//CLE&ALE持續(xù)時(shí)間(0-7)(=HCLK*TACLS)
#defineTWRPH05//TWRPH0持續(xù)時(shí)間(0-7)(=HCLK*(TWRPH0+1))
#defineTWRPH15//TWRPH1持續(xù)時(shí)間(0-7)(=HCLK*(TWRPH1+1))
#defineAdvFlash1//預(yù)先NANDflash存儲(chǔ)器啟動(dòng);0:支持512字節(jié)/頁(yè);1:支持2KB/頁(yè)
#defineAddrCycle1//NANDFlash存儲(chǔ)器地址周期,0:0:3地址周期,1:4地址周期;1:0:4地址周期,1:5地址周期
//CONT
#defineSoftLock0//軟件鎖配置,0:禁用鎖,1:使能鎖
#defineMainECCLock1//鎖存主區(qū)ECC生成:0:開啟主區(qū)ECC;1:鎖存主區(qū)ECC
#defineSpareECCLock1//鎖存?zhèn)溆脜^(qū)ECC生成;0:開啟備用區(qū)ECC,1:鎖存?zhèn)溆脜^(qū)ECC,備用區(qū)ECC狀態(tài)寄存器是NFSECC(0x7020003C)
#defineRegNCE11//NANDFlash存儲(chǔ)器nGCS[3]信號(hào)控制:0:強(qiáng)制nGCS[3]為低(使能片選);1:強(qiáng)制nGCS[3]為高(禁用片選)注:即使Reg_nCE1和Reg_nCE0同時(shí)被設(shè)置為0,它們之中也只有一個(gè)被聲明
#defineMODE1//NANDFlash控制器操作模式:0:NANDFlash控制器禁用(不工作)1:NANDFlash控制器使能
//NANDFLASH操作宏
#defineNANDCMD(cmd)(NAND->CMMD=(cmd))//向NANDflash寫入命令
#defineNANDADDR(addr)(NAND->ADDR=(addr))//向NANDflash寫入地址
#defineNANDDATA(NAND->DATA)//向NANDflash讀寫數(shù)據(jù)
#defineNF_nCS3_L(NAND->CONT&=~(1<<2))
#defineNF_nCS3_H(NAND->CONT|=(1<<2))
#defineNF_nCS2_L(NAND->CONT&=~(1<<1))//片選
#defineNF_nCS2_H(NAND->CONT|=(1<<1))
#defineNF_RnB(NAND->STAT&BIT0)//0:存儲(chǔ)器忙,1:空閑
//NANDFLASH信息宏
#defineFLASH_MAX_ADDR0x80000000//FLASH最大能夠達(dá)到的地址,是2GB
#defineFLASH_BLOCK_SIZE0x20000//FLASH塊大小,為512KB
#defineFLASH_PAGE_SIZE0x1000//FLASH頁(yè)大小,為4KB
//ECC8BIT512B
//NANDFLASH命令定義
#defineNAND_READ_1th0x00//讀數(shù)據(jù)區(qū),第一個(gè)訪問周期
#defineNAND_READ_2th0x30//讀數(shù)據(jù)區(qū),第二個(gè)訪問周期
#defineNAND_READ_ID0x90//讀NANDID
#defineNAND_READ_STATUS10x70//讀狀態(tài)1
#defineNAND_READ_STATUS20xf1//讀狀態(tài)2
#defineNAND_RESET0xff//復(fù)位
/*************************************************************************************************************************
*函數(shù):voidNnadFlashWait(void)
*功能:等待操作完成
*參數(shù):無
*返回:無
*依賴:無
*作者:陳鵬
*時(shí)間:20120331
*最后修改時(shí)間:20120331
*說明:低電平操作忙
*************************************************************************************************************************/
voidNnadFlashWait(void)
{
while(NF_RnB==0);//等待寫完成為低表示忙
}
/*************************************************************************************************************************
*函數(shù):staticvoidNandFlashWrite5BitAddr(vu32Addr)
*功能:向NANDFLASH寫入4字節(jié)的地址
*參數(shù):地址
*返回:無
*依賴:無
*作者:陳鵬
*時(shí)間:20120331
*最后修改時(shí)間:20120331
*說明:寫NAND地址,地址共32bit,分5次寫入
*************************************************************************************************************************/
staticvoidNandFlashWrite5BitAddr(vu32Addr)
{
vu8temp;
temp=Addr&0xff;//取低8位地址
printf("rn1th=%02X",temp);
NANDADDR(temp);//寫入A0-A7;
temp=(Addr>>8)&0x1f;
printf("rn2th=%02X",temp);
NANDADDR(temp);//寫A8-A12,0,0,0
temp=(Addr>>13);