Flash基础入门:nand flash_笔记
Vivian 2018-05-30 来源 : 阅读 1760 评论 0

摘要:本文主要向大家介绍了Flash基础入门的nand flash_笔记,希望学习这篇文章,对大家的Flash基础入门有所帮助。

本文主要向大家介绍了Flash基础入门的nand flash_笔记,希望学习这篇文章,对大家的Flash基础入门有所帮助。

名次解释:

BBM  :  Bad Block Management 坏块管理

BBT  : Bad Block Table 坏块表

ECC : Error Correction Code 错误校验码

MTD : Memory Technology Device 内存技术设备

 

Norflash:以块为单元,写入时需要先擦除,擦除和写入的速度很慢,但Norflash具有SRAM接口,有单独的地址总线和数据总线,接口简单,像访问ROM一样,读取速度快,能随机访问存储单元。通常用来存储启动代码,价格贵1-16M居多

Norflash有两种标准JEDEC 和CFI

JEDEC  Joint Electron Device Engineering Council 电子元件工业联合会,JEDEC用来帮助程序读取Flash的PID和VID,以确定flash的大小和算法。

CFI  Common Flash Interface 公共闪存接口。是一个公开标准的从flash中读取数据的接口,是系统软件查询已安装的flash的各种参数,市面Norflash大多支持CFI。

CFI规定先往flash数据总线写入55H,再写98H,然后从地址10H读取3Byte,如果是'Q'  'R'  'Y' ,那么遵循CFI标准。

cfi.h规定了 查询的数据结构

[cpp] view plain copy
1. /* Basic Query Structure */    
2. struct cfi_ident {    
3.     uint8_t  qry[3];//’Q‘,'R','Y'    
4.     uint16_t P_ID;    
5.     uint16_t P_ADR;    
6.     uint16_t A_ID;    
7.     uint16_t A_ADR;    
8.     uint8_t  VccMin;    
9.     uint8_t  VccMax;    
10.     uint8_t  VppMin;    
11.     uint8_t  VppMax;    
12.     uint8_t  WordWriteTimeoutTyp;    
13.     uint8_t  BufWriteTimeoutTyp;    
14.     uint8_t  BlockEraseTimeoutTyp;    
15.     uint8_t  ChipEraseTimeoutTyp;    
16.     uint8_t  WordWriteTimeoutMax;    
17.     uint8_t  BufWriteTimeoutMax;    
18.     uint8_t  BlockEraseTimeoutMax;    
19.     uint8_t  ChipEraseTimeoutMax;    
20.     uint8_t  DevSize;    
21.     uint16_t InterfaceDesc;    
22.     uint16_t MaxBufWriteSize;    
23.     uint8_t  NumEraseRegions;    
24.     uint32_t EraseRegionInfo[0]; /* Not host ordered */    
25. } __attribute__((packed));


nand flash结构图

 Flash基础入门:nand flash_笔记

对于flash,读取/写入的最小单元 是 Page/页,一般大小是2KB 4KB 8KB

擦除的最小单元是 Block/块,一般大小是128KB  256KB  512KB

 

管脚说明:

IO0 - IO7 :数据/地址复用

CLE :命令锁存

ALE :地址锁存

CE :芯片使能

RE :读使能

WE :写使能

WP :写保护

R/B :就绪/忙

 

典型特性:

1、页擦除时间是200us,慢的800us

2、块擦除时间是1.5ms

3、页数据读取到数据寄存器一般时间是20us

4、串行访问一个数据的时间是25ns

5、页寄存器(Page Register),对于每一片plane,都有用于缓存将要读写的一页数据,又叫页缓存

nand flash的读写数据流向:

 Flash基础入门:nand flash_笔记

举例:nand flash 数据读取时序图

Flash基础入门:nand flash_笔记

 

物理地址 = 块大小 * 块号  +  页大小 * 页号  +  页内地址

 

案例:

型号K9K8G08U0A,8192个块,每个块64页,每个页2K

访问第7000个块中的第64页的1208字节的地址,物理地址 = 128K *7000 + 2K *64 +1208 = 0x36B204B8

nand flash的地址周期组成:

Flash基础入门:nand flash_笔记

nand flash的地址周期有5个,2个列周期column address,3个行周期row address

A0 - A10是业内地址,范围0 - 2047

A11用于表示业内的oob区域,其大小是64字节

A12 - A30 是页号

A18 - A30 是块号

所以:0x36B204B8 = 11  0110  1011  0010  0000  0100  1011  1000

周期1  : A0 - A7        1011 1000       0xB8

周期2  : A10 - A8                  100       0x04

周期3  : A19 - A11    010 0000 0      0x40

周期4  : A27 - A20    110 1011 0       0xD6

周期5  : A30 - A28                 11 0       0x06

注意:A11用于oob位置,只有当页内地址属于2048-2111的时候,A11才会有效果

在Linux源码/drivers/mtd/nand/nand_base.c中,是这样处理的:

[cpp] view plain copy
1. static void nand_command_lp(struct mtd_info *mtd, unsigned int command,  
2.                 int column, int page_addr)  
3. {  
4. ......  
5.         /* Serially input address */  
6.         if (column != -1) {  
7. ......  
8.             chip->cmd_ctrl(mtd, column1, ctrl); /* 发送Col Addr 1 */  
9.             ctrl &= ~NAND_CTRL_CHANGE;  
10.             chip->cmd_ctrl(mtd, column >> 8, ctrl); /* 发送Col Addr 2 */  
11.         }  
12.         if (page_addr != -1) {  
13.             chip->cmd_ctrl(mtd, page_addr2, ctrl); /* 发送Row Addr 1 */  
14.             chip->cmd_ctrl(mtd, page_addr >> 8, /* 发送Row Addr 2 */  
15.                        NAND_NCE | NAND_ALE);   
16.             /* One more address cycle for devices > 128MiB */  
17.             if (chip->chipsize > (128 << 20))  
18.                 chip->cmd_ctrl(mtd, page_addr >> 16, /* 发送Row Addr 3 */  
19.                            NAND_NCE | NAND_ALE);   
20.         }  
21. }


虽然操作是读取页内部分数据,但硬件仍会将整个页读取到页缓存中。

 

nand flash相关规范

ONFI 规范   Open Nand Flash Interface specification

有Intel主导,统一了nand flash的操作接口包括操作命令。

//onfi.org/specifications/

 

LBA规范

LBA Nand Flash : Logical Block Address,逻辑块寻址的Nand Flash,Toshiba主导

普通nand flash是按物理块寻址,缺点是坏块情况下的软件工作量繁重。

LBA把ECC校验、坏块管理、负载平衡的工作放在硬件上实现。

//www.toshiba-components.com/prpdf/5678E.pdf

 

嵌入式常用文件系统:

JFFS2 是RedHat基于JFFS开发的闪存文件系统。可读,可压缩的日志型文件系统,提供崩溃/掉电安全保护,使用了基于哈希表的日志节点结构,加快了对节点操作速度,支持数据压缩,提供“写平衡”支持,是目前最流行的文件系统。缺点是:文件系统已满,或者接近于满时,JFFS2运行变慢,因为碎片收集的问题

Yaffs 和jffs2类似的闪存文件系统,专为嵌入式系统使用Nand型闪存而设计的一种日志文件系统。比jffs2少了一个功能,因此速度更快,对内存要求比较小。自带Nand芯片驱动,提供了直接访问文件系统的API。用户可以直接对文件系统操作。相反,Jffs2在Nand闪存上表现得并不稳定,更适合Nor闪存

本文由职坐标整理并发布,了解更多内容,请关注职坐标常用软件Flash频道!

本文由 @Vivian 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程