1: flash 的介绍
NC: 不接
nand flash 存储单元结构图:
1:如图所示一页中main区的容量512B,16表示spare区容量(用于读写数据操作的时候存放校验码)
2:每个块里包含很多页,老的flash页的大小是256M, 512M,这类称作small block, 地址周期只有4个。常见的nand flash页的大小正常是2K,这成为big block, 地址周期有5个。这个芯片每页512M属于小页
3:芯片写操作是以页为单位的,擦除是以块为单位的。nand flash 擦除就是把数据全变为1
4:由于nandflash 无法像norflash直接运行程序,所以一般用nandflash作为存储芯片的时候一般会在内部集成4K的ram.在启动的时候硬件会自动从nandflash 拷贝4K的空间到ram上,然后在ram上从0地址开始运行,再把NANDFLASH的程序拷贝到内存中去运行。
nand flash和2410或者2440的连接图如下:
具体引脚的含义上面已经描述过在此就不在赘述。
nand flash控制器介绍:
CPU访问nand flash时候,需要先发出命令,然后再发出地址,最后才是数据的读写。这一系列的过程需要各个使能信号来分辨是命令还是地址还是数据.nand flash提供了NFCONF, NFCMD,NFADDR,NFDATA,NFSTAT,NFECC等6个寄存器。
代码分析:
由图中可以知道TACLS = TCLS - TWP = 15 - 15 = 0
根据寄存器中描述的计算公式:Duration = HCLK x TACLS => 0ns = 10ns x TACLS => TACLS = 0
void nand_init(void)
{
#define TACLS 0
#define TWRPH0 3
#define TWRPH1 0
NFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4); //设置时序
NFCONT = (1<<4)|(1<<1)|(1<<0); //使能nand flash控制器,初始化ECC,禁止片选
}
void nand_select_chip(void)
{
int i;
NFCONT &= ~(1<<1); //片选使能
for(i=0; i<10; i++);
}
void write_cmd(int cmd)
{
unsigned long *p = (unsigned long *)NFCMD;
*p = cmd; //写命令
}
/* 等待NAND Flash就绪 */
void wait_idle(void)
{
int i;
volatile unsigned char *p = (volatile unsigned char *)NFSTAT;
while(!(*p & BUSY))
for(i=0; i<10; i++);
}
/* 取消片选信号 */
nand_deselect_chip(void)
{
NFCONT |= (1<<1);
}
//读取数据
unsigned char read_data(void)
{
volatile unsigned char *p = (volatile unsigned char *)NFDATA;
return *p;
}
/* 发出地址 */
void write_addr(unsigned int addr)
{
int i;
volatile unsigned char *p = (volatile unsigned char *)NFADDR;
*p = addr & 0xff;
for(i=0; i<10; i++);
*p = (addr >> 9) & 0xff;
for(i=0; i<10; i++);
*p = (addr >> 17) & 0xff;
for(i=0; i<10; i++);
*p = (addr >> 25) & 0xff;
for(i=0; i<10; i++);
}