我入职以来接触的第一个实践内容就是MTD下的NAND FLASH的驱动,下面我将从nand flash的基础和驱动程序两个方面来探讨该知识点,同时最后我会把自己的

动手实验也展示出来,我学习是基于jz4780grus开发板来学习的,使用的nandflash的型号是MT29F32G08CBACA,我的大致学习结构如目录所示:

一、NAND FLASH概述

二、NAND FLASH的参数及物理结构

三、NAND FLASH的地址访问方法

四、 NAND FLASH的操作方法

五、 NAND FLASH的其他一些补充

(一)Nand Flash的概述

1、Nand Flash的定义:

NAND Flash 在嵌入式系统中的地位与PC机上的硬盘是类似的。用于保存系统运行所必需的操作系统,应用程序,用户数据,运行过程中产生的各类数据,系统掉电后数据不会丢失。

2、 Nand Flash的几个重要的基本特性:

a、NandFlash的IO接口

对于Norflash、dram 之类的存储设备,CPU 可以直接通过地址总线对其进行访问,而 Nand Flash 没有这类的总线,只有 IO 接口,只能通过复用的 IO接口发送命令和地址,从而实现对 Nand Flash 内部数据进行访问。(端口的复用)

b、  NandFlash的读、写、擦除操作:

读写是以页为单位的,擦除是以块为单位的。

对于Nand的写操作,只能由1变成0,而不能由0变成1。所以必须先对nand执行erase操作,即将0变成1,然后再写(使对应的1变成0

 c、存储在Nand中的数据容易发生错误,所以采取一定的算法对数据进行编码和解码很有必要。在数据存储到nand flash之前进行编码,连同校验数据一同存储到nand之中;在数据从nand读出之后进行解码,以验证数据是否出错。(BCH

3、与Nand Flash相关的名词术语:

1. ONFI标准

ONFI(Open NAND Flash Interface,开放式NAND闪存接口)规范是一种Flash闪存接口的标准,它是Intel为统一当初混乱的闪存接口所倡导的标准。因为在此之前,市场上销售的NAND闪存芯片在引脚定义上都不完全相同。这就使得为一家公司设计的控制器,很有可能无法用在另一家公司的产品上。比如为东芝芯片设计的控制器,就无法用在三星或海力士的产品上,这就给上游的主控设计商以及最终的产品设计人员带来了很大的困难。

为此,Intel联合多家NAND Flash厂商制定了ONFI标准,统一NAND Flash芯片的引脚定义,并在此基础上采用新的技术以实现新的功能。

2. Block Management(坏)块管理

NandFlash 由于其物理特性,只有有限的擦写次数,超过那个次数,基本上就是坏了。在使用过程中,有些 Nand Flash 的 block 会出现被用坏了,当发现了,要及时将此 block 标注为坏块,不再使用。于此相关的管理工作,属于 Nand Flash 的坏块管理的一部分工作。

3. Wear-Leveling 负载平衡

NandFlash 的 block 的管理,还包括负载平衡。

正是由于 Nand Flash 的 block,都是有一定寿命限制的,所以如果你每次都往同一个 block擦除然后写入数据,那么那个 block 就很容易被用坏了,所以我们要去管理一下,将这么多次的对同一个 block 的操作,平均分布到其他一些 block 上面,使得在 block 的使用上,相对较平均,这样相对来说,可以更能充分利用 Nand Flash。

4. ECC 错误校验码

NandFlash 物理特性上使得其数据读写过程中会发生一定几率的错误,所以要有个对应的错误检测和纠正的机制,于是才有此 ECC,用于数据错误的检测与纠正。Nand Flash 的 ECC,常见的算法有海明码和BCH,这类算法的实现,可以是软件也可以是硬件。不同系统,根据自己的需求,采用对应的软件或者是硬件。

5.SLC MLC

SLC(Single Level Cell)

单个存储单元,只存储一位数据,表示 1 或 0。

对于数据的表示,单个存储单元中内部所存储电荷的电压,和某个特定的阈值电压 Vth相比,如果大于此 Vth 值,就是表示 1,反之,小于 Vth,就表示 0.

MLC(Multi Level Cell)

与 SLC 相对应的,就是单个存储单元,可以存储多个位,比如 2 位,4位等。其实现机制,说起来比较简单,

就是通过控制内部电荷的多少,分成多个阈值,通过控制里面的电荷多少,而达到我们所需要的存储成不同的数据。比如,假设输入电压是 Vin=4V(实际没有这样的电压,此处只是为了举例方便),那么,可以设计出 2 的 2 次方=4 个阈值, 1/4 的 Vin=1V,2/4 的 Vin=2V,3/4 的 Vin=3V,Vin=4V,分别表示 2 位数据 00,01,10,11,对于写入数据,就是充电,通过控制内部的电荷的多少,对应表示不同的数据。

4、Nand Flash的数据存储:

NAND flash的数据是以bit的方式保存;对于SLC而言,一个cell只能存储一个bit,而对于MLC而言,一个cell可以存储2bit;这些cell8个或者16个为单位连成bit line,形成所谓的bytex8/wordx16),即我们所说的NAND device的位宽。

NAND flash以页(后面会介绍到)为单位读写数据,而以块为单位擦出数据。

(二)Nand Flash的参数及结构

1、MT29F32G08CBACA型号分析

2、MT29F32G08CBACA的封装及设备结构

3、MT29F32G08CBACA存储单元组织结构

Organization

– Page size : 4320bytes (4096 + 224 bytes)

– Block size: 256pages (1024K + 56K bytes)

– Plane size: 2 planesx 2048 blocks per plane

– Device size: 32Gb:4096 blocks

NANDFLASH存储器MT29F32G08CBACA的总容量为34560Mb(4G+224M),其中包括两个plane,每个plane由2048个block (块) ,每个block又由256 pages组成,而每个page包含了大小为4K字节的Data area(数据存储区域) 和224字节的Spare area(备用区域)

OOB:每页还有一块区域,在Linux 系统中,称为OOB(Out Of Band),这个区域最初基于Nand Flash在读写数据时容易错误的特性,为了保证数据的正确性,采用相应的检测和纠错机制(EDC/ECC),而设计的用于放置数据的校验值的区域。

关于 oob具体用途,总结起来有:

1、标记是否是坏块

2、存储ECC数据

3、存储一些和文件系统相关的数据。如jffs2就会用到这些空间存储一些特定信息,而yaffs2文件系统,会在oob中,存放很多和自己文件系统相关的信息。

4、MT29F32G08CBACA功能框图

由于,I/O线是数据地址和命令复用的,所以要根据ALE和CLE的高低电平可以判断I/O线上传递过来的是地址,命令还是数据。

NAND FLASH学习笔记之nand flash基础(一)相关推荐

  1. J2EE学习笔记三:EJB基础概念和知识 收藏

    J2EE学习笔记三:EJB基础概念和知识 收藏 EJB正是J2EE的旗舰技术,因此俺直接跳到这一章来了,前面的几章都是讲Servlet和JSP以及JDBC的,俺都懂一些.那么EJB和通常我们所说的Ja ...

  2. java学习笔记15--多线程编程基础2

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...

  3. Linux 学习笔记之超详细基础linux命令 Part 3

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 2----------------- ...

  4. XML学习笔记01【xml_基础、xml_约束】

    Java后端 学习路线 笔记汇总表[黑马程序员] XML学习笔记01[xml_基础.xml_约束][day01] XML学习笔记02[xml_解析][day01] 目录 01 xml_基础 今日内容 ...

  5. 36篇博文带你学完opencv :python3+opencv学习笔记汇总目录(基础版)

    经过几天的学习,opencv基础部分学习完啦.整理出来. OpenCV opencv学习笔记1:图片读入,显示与保存(有代码) opencv学习笔记2:图像处理基础 opencv学习笔记3:像素处理 ...

  6. 《Go语言圣经》学习笔记 第三章 基础数据类型

    <Go语言圣经>学习笔记 第三章 基础数据类型 目录 整型 浮点数 复数 布尔型 字符串 常量 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语言小白学习笔记, ...

  7. python表单提交的两种方式_Flask框架学习笔记之表单基础介绍与表单提交方式

    本文实例讲述了Flask框架学习笔记之表单基础介绍与表单提交方式.分享给大家供大家参考,具体如下: 表单介绍 表单是HTML页面中负责数据采集功能的部件.由表单标签,表单域和表单按钮组成.通过表单,将 ...

  8. 【转】医疗业务学习笔记--DICOM协议的基础内容!!!!!!!!!!

    转自:医疗业务学习笔记--DICOM协议的基础内容 - 知乎 本文首发于"雨夜随笔"公众号,欢迎关注. DICOM协议是医疗领域对如何处理.存储.打印和传输医疗图片的一系列标准.D ...

  9. JDBC 学习笔记(一)—— 基础知识 + 分页技术

    2019独角兽企业重金招聘Python工程师标准>>> 本文查阅方法:     1.查阅目录 -- 查阅本文目录,确定想要查阅的目录标题     2.快捷"查找" ...

最新文章

  1. Python趣味打怪:60秒学会一个例子,147段简单代码助你从入门到大师 | 中文资源...
  2. 528. 按权重随机选择
  3. ulimit问题 关于nproc设置
  4. c语言程序设计中三子棋游戏,C语言实现简易版三子棋游戏
  5. 2022年,我只做 3 件事
  6. 旺财速啃H5框架之Bootstrap(六)
  7. 破解数据匮乏现状:纵向联邦学习场景下的逻辑回归(LR)
  8. Extjs中的组件含有ID,会导致界面混乱。(textfield,comboBox等)
  9. struts_login实例
  10. Linux 基础——ls 命令
  11. 软件测试三五七原则,运动前必看!“三五七”原则和注意事项
  12. 节点数对5层网络迭代次数的影响
  13. Kali Rolling更换登录界面的背景
  14. python勒索病毒代码_勒索病毒GandCrab-v5.04完整分析
  15. 29.【Axure 10 】软件母版功能区域
  16. 界面自动化测试工具-Ksend
  17. 用支付宝如何自己拍证件照?
  18. 查询包含关系的SQL
  19. python turtle库输出文字_Python 海龟 turtle 画图讲解 (五):输入/输出文字及鼠标与键盘交互设计...
  20. 让生活不吃亏的技巧—《谈判》|每周一本书(7)

热门文章

  1. 给大家收集了一些C语言代码优化的方法
  2. 计算机无线网络怎么连接,Win7电脑如何连接无线网络
  3. 单元格格式VBA(3)
  4. git 常用操作流程实现
  5. codeforces Round 314 div.2
  6. 6岁儿童语言能力理解能力差怎么办
  7. Xcode江湖录-第02章 纵观全局——布局探索
  8. 算法实验三 【电子老鼠闯迷宫】分支限界
  9. vue 页面生成图片功能
  10. Linux 线程创建