转载:NAND FLASH的读操作及原理

硬件原理

上面是我使用的NAND FLASH的硬件原理图,面对这些引脚,很难明白他们是什么含义,下面直接引用韦东山老师的课程中的提问:

NAND FLASH是一个存储芯片

那么: 这样的操作很合理"读地址A的数据,把数据B写到地址A"

问1. 原理图上NAND FLASH和S3C2440之间只有数据线,

怎么传输地址?

答1.在DATA0~DATA7上既传输数据,又传输地址

当ALE为高电平时传输的是地址,

问2. 从NAND FLASH芯片手册可知,要操作NAND FLASH需要先发出命令

怎么传入命令?

答2.在DATA0~DATA7上既传输数据,又传输地址,也传输命令

当ALE为高电平时传输的是地址,

当CLE为高电平时传输的是命令

当ALE和CLE都为低电平时传输的是数据

问3. 数据线既接到NAND FLASH,也接到NOR FLASH,还接到SDRAM、DM9000等等

那么怎么避免干扰?

答3. 这些设备,要访问之必须"选中",

没有选中的芯片不会工作,相当于没接一样

问4. 假设烧写NAND FLASH,把命令、地址、数据发给它之后,

NAND FLASH肯定不可能瞬间完成烧写的,

怎么判断烧写完成?

答4. 通过状态引脚RnB来判断:它为高电平表示就绪,它为低电平表示正忙

读操作步骤

由上图的读操作时序图可以得到这么一个读操作的流程:

(1)发出命令
     (2)发出地址
     (3)读数据

再结合我们的S3C2440芯片,具体操作读NAND FLASH的步骤如下(芯片是通过NAND FLASH控制器进行读写操作的):

NAND FLASH S3C2440

发命令 选中芯片

CLE设为高电平 NFCMMD=命令值

在DATA0~DATA7上输出命令值

发出一个写脉冲

发地址 选中芯片 NFADDR=地址值

ALE设为高电平

在DATA0~DATA7上输出地址值

发出一个写脉冲

发数据 选中芯片 NFDATA=数据值

ALE,CLE设为低电平

在DATA0~DATA7上输出数据值

发出一个写脉冲

读数据 选中芯片 val=NFDATA

发出读脉冲

读DATA0~DATA7的数据

要注意的是,每次操作之前都要写选中NAND FLASH。

接下来我们先了解一下NAND FLASH的内部结构:

由上图可以看到,每一页的大小为2KB,而且每一页都有64B的OOB(out of bank,主要用于坏块检测)。如果CPU读取NAND FLASH上的第2048个数据,那么将会访问到的是page 1的第一个字节(从page 0开始数),这一点很重要,OOB对于读写操作来说是透明的。另外,发出的地址给NAND FLASH是分为五个周期进行的:

有了这些基础知识后,下面马上开始写代码(下面的代码是用来重定位的作用,也就是从NAND FLASH中读取数据,然后拷贝到目的地址)

void delay_some_time(void){volatile int i;for(i=0; i<10; i++);}void nand_select(void){NFCONT &= ~(1<<1);}void nand_deselect(void){NFCONT |= (1<<1);}void nand_cmd(unsigned char cmd){NFCMMD = cmd;delay_some_time(); //经验判断,发出命令后需要等待一些时间}void nand_addr(unsigned int addr){unsigned int col = addr % 2048;unsigned int page = addr / 2048;//puts("in nand_addr\n\r");/*芯片手册规定要在5个周期之内分别按下面的规则发出地址*/NFADDR = col & 0xff;delay_some_time();NFADDR = (col >> 8) & 0xff;delay_some_time();NFADDR = page & 0xff;delay_some_time();NFADDR = (page >> 8) & 0xff;delay_some_time();NFADDR = (page >> 16) & 0xff;delay_some_time();//puts("leave nand_addr\n\r");}void nand_wait_ready(void){/*NFSTAT的最低位为0的时候代表NAND flash正忙*/while (!(NFSTAT & 1));}unsigned char nand_data(void){return NFDATA;}void nand_read(unsigned int addr, unsigned char *buf, unsigned int len){int col = addr % 2048; //有可能是从每页的中间开始读int i = 0;//puts("in nand_read function\n\r");/*1. 选中:因为NAND FLASH的数据线是复用的,所以必须先选中*/nand_select();//puts("after nand_select\n\r");while (i<len){/*2. 发出读命令00h*/nand_cmd(0x00);/*3. 发出地址(分5步发出)*/nand_addr(addr);/*4. 发出读命令30h*/nand_cmd(0x30);/*5. 判断状态,确定是否已经读完*/nand_wait_ready();/*6. 读数据*/for(; (col < 2048) && (i < len); col++){buf[i] = nand_data();i++;addr++;}col = 0;}/*7. 取消片选*/nand_deselect();
}

(1)每次读操作开始前都要先选中芯片

(2)读操作前都要先发出00命令

(3)按照NAND FLASH芯片手册的要求,发出的地址,要分为五个周期,分别发出:列地址的低8位、列地址的高8位、行(页)地址的0~7位、行(页)地址的8~15位和行(页)地址的15~23位。其中,列地址求余后的余数,页地址则是除法得到的商。

(4)之后是发出的30命令(就是这么规定,没有解释)

(5)NAND FLASH读数据也很简单,直接读寄存器NFDATA

(6)读完后,取消片选,整个读操作的流程就算结束

NAND FLASH的读写操作(硬件原理图分析)相关推荐

  1. Nand flash(一)硬件实现机制

    Flash全名叫做Flash Memory,属于非易失性存储设备(Non-volatile Memory Device),与此相对应的是易失性存储设备(Volatile Memory Device). ...

  2. nand flash的读操作详解

    这篇文章不是介绍 nandflash的物理结构和关于nandflash的一些基本知识的.你需要至少了解 你手上的 nand flash的物理结构和一些诸如读写命令 操作的大概印象,你至少也需要看过 s ...

  3. 【SemiDrive源码分析】【X9 Audio音频模块分析】16 - 音频模块框图及硬件原理图分析

    [SemiDrive源码分析][X9 Audio音频模块分析]16 - 音频模块框图及硬件原理图分析 一.X9HP 音频模块框图及硬件原理图分析 1.1 音频接口 I2S 介绍 1.2 X9 平台音频 ...

  4. nand flash基础——读写擦操作

    当对一个cell进行读操作时,对相应的wordline施加Vread电压,对其他wordline施加Vpass电压,如上图所示.状态为"0"的cell(被program的cell) ...

  5. NAND FLASH的读操作及原理

    硬件原理 上面是我使用的NAND FLASH的硬件原理图,面对这些引脚,很难明白他们是什么含义,下面直接引用韦东山老师的课程中的提问: NAND FLASH是一个存储芯片 那么: 这样的操作很合理&q ...

  6. 嵌入式linux之Nor/Nand FLASH的读写

    http://www.cnblogs.com/tureno/articles/2708461.html 所谓Flash,是内存(Memory)的一种,但兼有RAM和ROM 的优点,是一种可在系统(In ...

  7. K9F1208U0M 64M nand flash 手册阅读以及相关驱动程序分析

    首先给大家分享一个巨牛巨牛的人工智能教程,是我无意中发现的.教程不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈-我正在学习中,觉得太牛了,所以分享给大家!点这里可以跳转 ...

  8. K9F1208U0M(64M nand flash)手册阅读以及相关驱动程序分析

    作者:wogoyixikexie@gliet 以前一直使用别人成功的FMD,早几天对一些细节以及编程方法一无所知,同时也有很多人问我flash相关问题,我好想在论坛指点江山,给养技术,可是感觉有些东西 ...

  9. 华大单片机HC32L136X单片机flash数据读写操作使用

    此款单片机是由有64K的字节flash,一共有128页,一页有512字节,以下是容量划分: 这里使用的是字节位宽的数据读写操作进行演示,其他2种方式大同小异,需要用到自己去研究,首先需要添加对应的fl ...

最新文章

  1. Lotus的书买回来了
  2. Hadoop学习笔记:MapReduce框架详解
  3. python界面设计实例-【Python】Tkinter图形界面设计(GUI)
  4. Linux 设备模型之 (kobject、kset 和 Subsystem)(二)
  5. key位置 win10生成的ssh_Windows 10:如何在OpenSSH中生成SSH密钥
  6. 苹果今年将为iPhone采购1.72亿块OLED屏幕 六成用于iPhone 13
  7. 【原】人生的程序公式
  8. 树莓派硬件编程——(零)先导篇
  9. nnet3-compute计算chain前向传播概率矩阵(声学模型输出)
  10. USB数据采集卡:labjack T7、T7 Pro系列的技术特点
  11. 压力传感器如何直接连接电脑笔记本采集数据表格导出
  12. 度量学习Metric Learning
  13. 【其它】笔记本的辐射有多大?
  14. vSphereClient创建虚拟机教程
  15. 8421BCD码与十进制的转换
  16. Foxail邮箱远程主机强迫关闭了一个现有连接怎么解决
  17. Unity中导出apk文件
  18. 装配一台计算机有哪些安全注意事项,挤出机注意事项
  19. SQL Developer的下载、安装和连接Oracle数据库
  20. 【线性代数】机器学习·算法必备 线性代数总结

热门文章

  1. 强化学习实例6:策略迭代法(policy iteration)
  2. html+css (静态页面+动画案例)
  3. IBM WebSphere Portal宕机或性能低常见问题分析 及解决措施
  4. salesforce 定时任务遇到的坑
  5. DELPHI中自定义消息的发送和接收
  6. Golang 插件开发入门教程
  7. Win7系统删除网络驱动器盘符
  8. 小孔成像实验探究的软件_转载:探究小孔成像实验
  9. Ajax技术网站赏析
  10. html2canvas在ios中空白或者截图不完整解决。