简介:
Nandflash与计算机的硬盘类似,用于保存系统运行所必须的操作系统、用户数据、运行过程等各类数据。并且在Nandflash中的数据在掉电后仍可永久保存。
一、目标芯片(K9F1208U0M)
1、此芯片为三星公司生产的容量为64MB。(下图为网上图片、非本人原创)。由下图可以看出,1page = 528byte(其中Data feild = 512bytes、spare = 16bytes)。
1 block = 32 pages = 32 * 528byte。其中可以存储数据的是 (32 * 512byte) = 16KB。然而此芯片有4096个block。所以此芯片的容量可以计算得出:(4096 * 32 * 512)byte = 64MB。
2、行地址和列地址解析。(下表非上述芯片的地址列表、只供参考说明用)
一共有 4096 个块,每个块内有 32 页,每个页是(512+16) Bytes,假设,我们要访问其中的第2000个块中的第 10 页中的200 字节处的地址,此时,我们就要先把具体的地址算出来:
物理地址 = 块大小×块号+页大小×页号+页内地址
=2000 * 16K + 10 *512Byte + 200
= 0x1F414C8
但是有的程序编程时是按页写的,所以物理地址将不加页内地址。所以上述物理地址如果按页写则为0x1F41400(即A0-A7为0)。
3、Nandflash控制器主要寄存器介绍
1、NFCONF 用来设置时序、数据位宽等
2、NFCONT 用来使能flash、使能控制引脚、初始化ECC等
3、NFCMD 用来发送命令
4、NFADDR 用来发送地址
5、NFDATA 读、写数据
6、NFSTAT 状态寄存器
4、核心语句分析
上图为命令字,操作Nandflash时、先传输命令、然后是地址、最后是读/写数据。
二、分析代码:
1、 // 发片选 (主要是将NFCONT寄存器的bit1位置0,关闭片选就是把寄存器的相应位置1)
void nand_select_chip(void)
{
unsigned long i;
NFCONT &= ~(1<<1);
for(i=0; i<10; i++);
}
2、// 等待就绪 (NFSTAT的bit4表示状态位。0--busy,1--空闲)
void nand_wait_idle(void)
{
unsigned long i;
while( !(NFSTAT & (1<<0)) )
for(i=0; i<10; i++);
}
3、发出地址信号 (在数据手册中列出了地址操作。没有用到A8是因为当读命令为0时,A8=0;当读命令为1时,A8=1;)
NFADDR = addr & 0xff;
NFADDR = (addr>>9) & 0xff;
NFADDR = (addr>>17) & 0xff;
NFADDR = (addr>>25) & 0xff;