非易失闪存技术NAND Flash内存设备的读写控制设计
由于NAND Flash只有8个I/O引脚,而且是复用的,既可以传数据,也可以传地址、命令。设计命令锁存使能(Command Latch Enable, CLE) 和 地址锁存使能(Address Latch Enable,ALE),就是先要发一个CLE(或ALE)命令,告诉NAND Flash的控制器一声,下面要传的是命令(或地址)。这样,NAND Flash内部才能根据传入的内容,进行对应的动作。相对于并口的NOR Flash的48或52个引脚来说,大大减小了引脚数目,这样封装后的芯片体积校同时,减少了芯片接口,使用此芯片的相关的外围电路会更简化,避免了繁琐的硬件连线。
2 软件设计
2.1 NAND Flash的读写控制
Linux MTD[4]对NAND Flash芯片的读写主要分三部分:
① struct mtd_info中的读写函数,如read、write_oob等,这是MTD原始设备层与Flash硬件层之间的接口。
② struct nand_ecc_CTRl中的读写函数,如read_page_raw、write_page等,主要用来做一些与ECC有关的操作。
③ struct nand_Chip中的读写函数,如read_buf、cmdfunc等,与具体的NAND controller相关,就是这部分函数与硬件的交互。
这三部分读写函数是相互配合着完成对NAND Flash芯片的读写的。首先,MTD上层需要读写NAND Flash芯片时,会调用struct mtd_info中的读写函数;接着,struct mtd_info中的读写函数就会调用struct nand_chip或struct nand_ecc_ctrl中的读写函数;最后,若调用的是struct nand_ecc_ctrl中的读写函数,那么它又会接着调用struct nand_chip中的读写函数。读写相关函数如图2所示。
2.2 NAND Flash的读页流程
2.2.1 读页时序
读页流程如图3所示。可以看到如果要实现读一个页的数据,就要发送Read的命令,而且是分两个周期,即分两次发送对应的命令。第一次是00h,第二次是30h,而两次命令中间,需要发送对应的你所要读取的页的地址。 图4为读页时序。
图3 读页流程
图4 读页时序
2.2.2 读页主要函数
NAND Flash读页的主要函数有nand_read、nand_do_read_ops、nand_command_lp、nand_read_page_hweCC、read_buf。MTD上层会调用struct mtd_info中的读page函数,即nand_read函数,然后调用nand_do_read_ops,接着会调用struct nand_Chip中的cmdfunc函数。这个cmdfunc函数与具体的NAND controller相关,它的作用是使NAND controller向NAND芯片发出读命令,NAND芯片收到命令后,就会做好准备等待NAND controller下一步的读取。接着nand_read函数又会调用struct nand_ecc_CTRl中的read_page函数,而read_page函数又会调用struct nand_chip中read_buf函数,从而真正把NAND芯片中的数据读取到buffer中。read_buf函数返回后,read_page函数就会对buffer中的数据做一些处理,比如ECC校验。读页主要函数代码如下:
statIC int nand_do_read_ops(struct mtd_info *mtd, loff_t from, struct mtd_oob_ops *ops) {
……
while(1) {
……
/*先发送对应的读页(read page)的命令*/
chip﹥cmdfunc(mtd, NAND_CMD_READ0, 0x00, page);
……
/*发送完命令,接着去调用read_page函数读取对应的数据*/
ret=chip﹥ecc.read_page(mtd, chip, buFPoi);
buf+=bytes;
……
readlen-=bytes;
if(!readlen)
break;
col=0;/*页内地址对齐*/
ealpage++;/*页号加1*/
page=realpage chip﹥pagemask;
……
}
……
}
2.3 NAND Flash的写页流程
2.3.1 写页时序
图5 写页时序
从图5写页时序可以看到,如果要实现写一个页的数据,就要发送Page program的命令,而且是分两个周期,即分两次发送对应的命令。第一次是80h,第二次是10h,而两次命令中间,需要发送对应的要写的页的地址和数据。第3个周期是发送读状态寄存器命令70h, 如果I/O口为低电平,表示数据写入成功,否则失败。写页流程如图6所示。
图6 写页流程
2.3.2 写页主要函数
以写NAND Flash芯片为例,其写数据的工作过程:首先,MTD上层会调用struct mtd_info中的写page函数,即nand_write函数,然后调用nand_do_read_ops。接着函数会调用struct nand_chip中cmdfunc函数,这个cmdfunc函数与具体的NAND controller相关,它的作用是使NAND controller向NAND芯片发出写命令,NAND芯片收到命令后,就会做好准备等待NAND controller下一步的读取。接着nand_write函数又会调用struct nand_ecc_ctrl中的write_page函数,而write_page函数又会调用struct nand_chip中write_buf函数,从而真正把数据写到NAND Flash芯片中。
MTD读取数据的入口是nand_write,然后调用nand_do_write_ops,此函数主体代
- 基于Nand+Flash存储管理在DSP系统中的实现(03-17)
- 基于DSP PNX1501的NandFlash在线烧录系统设计(05-21)
- 基于DSP PNX1501的NandFlash在线烧录系统(07-13)
- ARM开发步步深入之NandFlash 4KB突围(12-07)
- mini2440 nand flash和nor flash启动的区别(11-28)
- S3C6410学习——Nand flash陷阱(11-28)