OK6410裸机简单的NAND FLASH驱动
扫描二维码
随时随地手机看文章
OK6410裸机简单的NANDFLASH驱动,只写了个简单的函数,读取一页
/*************************************************************************************************************
*文件名:NandFlash.c
*功能:S3C6410NandFlash底层驱动函数
*作者:陈鹏
*创建时间:2012年3月31日21:34
*最后修改时间:2012年3月31日
*详细:NandFlash底层驱动函数,
板载NANDFLASH信息:2GB,MLCK9G4G08(K9GAG08U0D,页大小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持续时间(0-7)(=HCLK*TACLS)
#defineTWRPH05//TWRPH0持续时间(0-7)(=HCLK*(TWRPH0+1))
#defineTWRPH15//TWRPH1持续时间(0-7)(=HCLK*(TWRPH1+1))
#defineAdvFlash1//预先NANDflash存储器启动;0:支持512字节/页;1:支持2KB/页
#defineAddrCycle1//NANDFlash存储器地址周期,0:0:3地址周期,1:4地址周期;1:0:4地址周期,1:5地址周期
//CONT
#defineSoftLock0//软件锁配置,0:禁用锁,1:使能锁
#defineMainECCLock1//锁存主区ECC生成:0:开启主区ECC;1:锁存主区ECC
#defineSpareECCLock1//锁存备用区ECC生成;0:开启备用区ECC,1:锁存备用区ECC,备用区ECC状态寄存器是NFSECC(0x7020003C)
#defineRegNCE11//NANDFlash存储器nGCS[3]信号控制:0:强制nGCS[3]为低(使能片选);1:强制nGCS[3]为高(禁用片选)注:即使Reg_nCE1和Reg_nCE0同时被设置为0,它们之中也只有一个被声明
#defineMODE1//NANDFlash控制器操作模式:0:NANDFlash控制器禁用(不工作)1:NANDFlash控制器使能
//NANDFLASH操作宏
#defineNANDCMD(cmd)(NAND->CMMD=(cmd))//向NANDflash写入命令
#defineNANDADDR(addr)(NAND->ADDR=(addr))//向NANDflash写入地址
#defineNANDDATA(NAND->DATA)//向NANDflash读写数据
#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:存储器忙,1:空闲
//NANDFLASH信息宏
#defineFLASH_MAX_ADDR0x80000000//FLASH最大能够达到的地址,是2GB
#defineFLASH_BLOCK_SIZE0x20000//FLASH块大小,为512KB
#defineFLASH_PAGE_SIZE0x1000//FLASH页大小,为4KB
//ECC8BIT512B
//NANDFLASH命令定义
#defineNAND_READ_1th0x00//读数据区,第一个访问周期
#defineNAND_READ_2th0x30//读数据区,第二个访问周期
#defineNAND_READ_ID0x90//读NANDID
#defineNAND_READ_STATUS10x70//读状态1
#defineNAND_READ_STATUS20xf1//读状态2
#defineNAND_RESET0xff//复位
/*************************************************************************************************************************
*函数:voidNnadFlashWait(void)
*功能:等待操作完成
*参数:无
*返回:无
*依赖:无
*作者:陈鹏
*时间:20120331
*最后修改时间:20120331
*说明:低电平操作忙
*************************************************************************************************************************/
voidNnadFlashWait(void)
{
while(NF_RnB==0);//等待写完成为低表示忙
}
/*************************************************************************************************************************
*函数:staticvoidNandFlashWrite5BitAddr(vu32Addr)
*功能:向NANDFLASH写入4字节的地址
*参数:地址
*返回:无
*依赖:无
*作者:陈鹏
*时间:20120331
*最后修改时间: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);