NAND FLASH的读写操作(硬件原理图分析)
转载: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的读写操作(硬件原理图分析)相关推荐
- Nand flash(一)硬件实现机制
Flash全名叫做Flash Memory,属于非易失性存储设备(Non-volatile Memory Device),与此相对应的是易失性存储设备(Volatile Memory Device). ...
- nand flash的读操作详解
这篇文章不是介绍 nandflash的物理结构和关于nandflash的一些基本知识的.你需要至少了解 你手上的 nand flash的物理结构和一些诸如读写命令 操作的大概印象,你至少也需要看过 s ...
- 【SemiDrive源码分析】【X9 Audio音频模块分析】16 - 音频模块框图及硬件原理图分析
[SemiDrive源码分析][X9 Audio音频模块分析]16 - 音频模块框图及硬件原理图分析 一.X9HP 音频模块框图及硬件原理图分析 1.1 音频接口 I2S 介绍 1.2 X9 平台音频 ...
- nand flash基础——读写擦操作
当对一个cell进行读操作时,对相应的wordline施加Vread电压,对其他wordline施加Vpass电压,如上图所示.状态为"0"的cell(被program的cell) ...
- NAND FLASH的读操作及原理
硬件原理 上面是我使用的NAND FLASH的硬件原理图,面对这些引脚,很难明白他们是什么含义,下面直接引用韦东山老师的课程中的提问: NAND FLASH是一个存储芯片 那么: 这样的操作很合理&q ...
- 嵌入式linux之Nor/Nand FLASH的读写
http://www.cnblogs.com/tureno/articles/2708461.html 所谓Flash,是内存(Memory)的一种,但兼有RAM和ROM 的优点,是一种可在系统(In ...
- K9F1208U0M 64M nand flash 手册阅读以及相关驱动程序分析
首先给大家分享一个巨牛巨牛的人工智能教程,是我无意中发现的.教程不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈-我正在学习中,觉得太牛了,所以分享给大家!点这里可以跳转 ...
- K9F1208U0M(64M nand flash)手册阅读以及相关驱动程序分析
作者:wogoyixikexie@gliet 以前一直使用别人成功的FMD,早几天对一些细节以及编程方法一无所知,同时也有很多人问我flash相关问题,我好想在论坛指点江山,给养技术,可是感觉有些东西 ...
- 华大单片机HC32L136X单片机flash数据读写操作使用
此款单片机是由有64K的字节flash,一共有128页,一页有512字节,以下是容量划分: 这里使用的是字节位宽的数据读写操作进行演示,其他2种方式大同小异,需要用到自己去研究,首先需要添加对应的fl ...
最新文章
- Lotus的书买回来了
- Hadoop学习笔记:MapReduce框架详解
- python界面设计实例-【Python】Tkinter图形界面设计(GUI)
- Linux 设备模型之 (kobject、kset 和 Subsystem)(二)
- key位置 win10生成的ssh_Windows 10:如何在OpenSSH中生成SSH密钥
- 苹果今年将为iPhone采购1.72亿块OLED屏幕 六成用于iPhone 13
- 【原】人生的程序公式
- 树莓派硬件编程——(零)先导篇
- nnet3-compute计算chain前向传播概率矩阵(声学模型输出)
- USB数据采集卡:labjack T7、T7 Pro系列的技术特点
- 压力传感器如何直接连接电脑笔记本采集数据表格导出
- 度量学习Metric Learning
- 【其它】笔记本的辐射有多大?
- vSphereClient创建虚拟机教程
- 8421BCD码与十进制的转换
- Foxail邮箱远程主机强迫关闭了一个现有连接怎么解决
- Unity中导出apk文件
- 装配一台计算机有哪些安全注意事项,挤出机注意事项
- SQL Developer的下载、安装和连接Oracle数据库
- 【线性代数】机器学习·算法必备 线性代数总结