10.NandFlash的驱动_写操作
上一节,学习了NandFlash的按页读的操作,下面是实现NandFlash的按页写。首先还是查看NandFlash芯片K9F2G08U0A的时序图
根据I/O pin角的信号信息,知道要实现NandFlash的写操作需要的步骤如下:
最后实现按页写的函数:
int NF_WritePage(unsigned long addr, unsigned char* buff)
{
int ret;
int i;
//选中flash芯片
select_chip();
//清除RnB
clear_RnB();
//发送命令0x80
send_cmd(0x80);
//发送列地址
send_addr(0x00);
send_addr(0x00);
//发送行地址
send_addr(addr&0xff);
send_addr((addr>>8)&0xff);
send_addr((addr>>16)&0xff);
//写入数据
for(i=0;i<2048;i++)
{
NFDATA = buff[i];
}
//发送命令0x10
send_cmd(0x10);
//等待RnB
wait_RnB();
//发送命令0x70
send_cmd(0x70);
//读取写入结果
ret = NFDATA;
//取消选中flash芯片
deselect_chip();
return ret;
}
编译make一下,没有错误的情况下,还不能烧写到开发板,因为不管是norflash或者是NandFlash,在进行写之前必须进行擦除。接下来就是实现擦除函数:
void NF_Erase(unsigned long addr)
该函数有一个参数,就是页地址。
接下来看NandFlash芯片K9F2G08U0A擦除的信息:
注意的是,在擦除的时候,不会按照页擦除的,而是把该页所在的整块全部擦除。
根据上面擦除的时序图,擦除函数的实现步骤:
void NF_Erase(unsigned long addr)
{
int ret;
//选中flash芯片
select_chip();
//清除RnB
clear_RnB();
//发送命令0x60
send_cmd(0x60);
//发送行地址
send_addr(addr&0xff);
send_addr((addr>>8)&0xff);
send_addr((addr>>16)&0xff);
//发送命令D0
send_cmd(0xD0);
//等待RnB
wait_RnB();
//发送命令0x70
send_cmd(0x70);
//读取擦除结果
ret = NFDATA;
//取消选中flash芯片
deselect_chip();
return ret;
}
最后在main.c里面添加测试代码:
上面的测试代码中,先定义一个页大小的char buffer。然后格式化一个块大小的空间。接着将123写入NandFlash,接着通过NF_PageRead函数把刚才写入的值读出。最后通过点灯判断读出的是不是刚才写入的数字。来验证对NandFlash的写操作是否成功:成功就是没加NandFlash的操作代码,烧写到开发板,灯亮。加上上面的代码后烧写到开发板,灯不亮。