2.3 编程原理
Nandflah接口控制器提供了一系列的擦除、编程、读取等命令,正是这些命令应用程序为控制Nandflash芯片部件提供了接口。
2.4 操作步骤
对一个Nandflash的操作,总体上,可以分为4个周期。
3 无操作系统下的编程
由图1可以看出,命令地址数据信号分时复用I/O0~I/O7,而且32的地址也要分时输入,因此32位的地址需要4个时间周期,k9f1208芯片容量为64MB,地址空间为[0:25],地址空间被分为[0:7],[9:16],[17:24],[25]4个部分分时输入。第8位地址[8]是halfpagepointer(半页指针),表示在整页中的位置,即:是0~255地址空间还是256~511地址空间。通过命令由硬件完成设置,具体实现如下:
// 将rNFCONF定义为Nandflash 的配置寄存器
#define rNFCONF (*(volatile unsigned *)0x4e000000)
//将rNFCMD定义为Nandflash的命令寄存器
#define rNFCMD (*(volatile unsigned char *)0x4e000004)
//将rNFADDR定义为Nandflash的地址寄存器
#define rNFADDR (*(volatile unsigned char *)0x4e000008)
//将rNFDATA定义为Nandflash的数据寄存器
#define rNFDATA (*(volatile unsigned char *)0x4e00000c)
将rNFSTAT定义为Nandflash的状态寄存器
#define rNFSTAT (*(volatile unsigned char *)0x4e000010)
#define NFChipEn() (rNFCONF &= ~0x800)// 通过设置配置寄存器让芯片使能
#define NFChipDs() (rNFCONF |= 0x800)//解除芯片使能
#define WrNFCmd(cmd) (rNFCMD = (cmd))//通过命令寄存器送出命令
#define WrNFAddr(addr) (rNFADDR = (addr))//通过地址寄存器送出地址
#define WrNFDat(dat) (rNFDATA = (dat))//通过数据寄存器送出数据
#define RdNFDat() (rNFDATA)//读取数据寄存器
#define RdNFStat() (rNFSTAT)//读取状态寄存器
void InitNandCfg(void)
{//通过配置寄存器进行初始化配置
rNFCONF = (1<<15)|(1<<12)|(1<<11)|(7<<8)|(7<<4)|(7);
}
unsigned int WaitNFBusy(void)
{//用于等待硬件操作完成,若返回值为1则表明硬件操作过程中出错
unsigned char stat;
WrNFCmd(QUERYCMD);//送出查询命令
do {
stat = RdNFDat();//从数据寄存器中,读出数据
}while(!(stat&0x40));//在查询时序下,数据寄存器的第5位,若为1则表示硬件操作完成
|