怎么看时序图--nand flash的读操作详解
nand flash时序图详解
怎么看时序图--nand flash的读操作详解 2013-11-16 10:25:36分类:嵌入式这篇文章不是介绍 nand flash的物理结构和关于nand flash的一些基本知识的。
你需要至少了解你手上的 nand flash的物理结构和一些诸如读写命令操作的大概印象,你至少也需要看过 s3c2440中关于nand flash控制寄存器的说明。
由于本人也没有专门学过这方面的知识,下面的介绍也是经验之谈。
这里我用的 K9F2G08-SCB0 这款nand flash 来介绍时序图的阅读。
不同的芯片操作时序可能不同,读的命令也会有一些差别。
当然其实有时候像nand flash这种 s3c2440内部集成了他的控制器的外设。
具体到读写操作的细节时序(比如 CLE/ALE的建立时间,写脉冲的宽度。
数据的建立和保持时间等),不明白前期也没有多大的问题。
因为s3c2440内部的nand flash控制器做了大部分的工作,你需要做的基本就是设置几个时间参数而已。
然后nand flash会自动进行这些细节操作。
当然如果处理器上没有集成 nand flash的控制器那么久必须要自己来写时序操作了。
所以了解最底层的时序操作总是好的但是上层一点的,比如读写操作的步骤时序(比如读操作,你要片选使能,然后发命令,然后发地址,需要的话还需发一个命令,然后需要等待操作完成,然后再读书数据)。
是必须要明白的。
这都不明白的话,怎么进行器件的操作呢也就是说 s3c2440 可以说在你设置很少的几个时间参数后,将每一个步骤中细微的操作都替你做好了。
(比如写命令,你只要写个命令到相应寄存器中,cpu内部就会协各个引脚发出适应的信号来实现写命令的操作)。
而我们所需要做的就是把这些写命令,写地址,等待操作完成。
等步骤组合起来。
从而完成一个读操作就像上面说的,虽然我们不会需要去编写每个步骤中的最细微的时序。
但是了解下。
会让你对每个操作步骤的底层细节更加明了先来看一个命令锁存的时序。
Nand Flash的读写操作
NandFlash的读写操作正如硬盘的盘片被分为磁道,每个磁道又分为若干扇区,一块nand flash也分为若干block,每个block分为如干page。
一般而言,block、page之间的关系随着芯片的不同而不同,典型的分配是这样的:1block = 32page1 page = 512bytes(datafield) + 16bytes(oob)需要注意的是,对于flash的读写都是以一个page开始的,但是在读写之前必须进行flash 的擦写,而擦写则是以一个block为单位的。
同时必须提醒的是,512bytes理论上被分为1st half 和2sd half,每个half各占256个字节。
我们讨论的K9F1208U0B总共有4096 个Blocks,故我们可以知道这块flash的容量为4096 *(32 *528)= 69206016 Bytes = 66 MB但事实上每个Page上的最后16Bytes是用于存贮检验码和其他信息用的,并不能存放实际的数据,所以实际上我们可以操作的芯片容量为4096 *(32 *512) = 67108864 Bytes = 64 MB 由上图所示,1个Page总共由528 Bytes组成,这528个字节按顺序由上而下以列为单位进行排列(1列代表一个Byte。
第0行为第0 Byte ,第1行为第1 Byte,以此类推,每个行又由8个位组成,每个位表示1个Byte里面的1bit)。
这528Bytes按功能分为两大部分,分别是Data Field和Spare Field,其中Spare Field占528Bytes里的16Bytes,这16Bytes是用于在读写操作的时候存放校验码用的,一般不用做普通数据的存储区,除去这16Bytes,剩下的512Bytes便是我们用于存放数据用的Data Field,所以一个Page上虽然有528个Bytes,但我们只按512Bytes进行容量的计算。
NADN FLASH时序详解
NADN FLASH时序详解怎么看时序图--nand flash的读操作详解这篇文章不是介绍 nand flash的物理结构和关于nand flash的一些基本知识的。
你需要至少了解你手上的 nand flash的物理结构和一些诸如读写命令操作的大概印象,你至少也需要看过 s3c2440中关于nand flash控制寄存器的说明。
由于本人也没有专门学过这方面的知识,下面的介绍也是经验之谈。
这里我用的 K9F2G08-SCB0 这款nand flash 来介绍时序图的阅读。
不同的芯片操作时序可能不同,读的命令也会有一些差别。
当然其实有时候像nand flash这种 s3c2440内部集成了他的控制器的外设。
具体到读写操作的细节时序(比如 CLE/ALE的建立时间,写脉冲的宽度。
数据的建立和保持时间等),不明白前期也没有多大的问题。
因为s3c2440内部的nand flash控制器做了大部分的工作,你需要做的基本就是设置几个时间参数而已。
然后nand flash会自动进行这些细节操作。
当然如果处理器上没有集成 nand flash的控制器那么久必须要自己来写时序操作了。
所以了解最底层的时序操作总是好的但是上层一点的,比如读写操作的步骤时序(比如读操作,你要片选使能,然后发命令,然后发地址,需要的话还需发一个命令,然后需要等待操作完成,然后再读书数据)。
是必须要明白的。
这都不明白的话,怎么进行器件的操作呢也就是说 s3c2440 可以说在你设置很少的几个时间参数后,将每一个步骤中细微的操作都替你做好了。
(比如写命令,你只要写个命令到相应寄存器中,cpu内部就会协各个引脚发出适应的信号来实现写命令的操作)。
而我们所需要做的就是把这些写命令,写地址,等待操作完成。
等步骤组合起来。
从而完成一个读操作就像上面说的,虽然我们不会需要去编写每个步骤中的最细微的时序。
但是了解下。
会让你对每个操作步骤的底层细节更加明了先来看一个命令锁存的时序。
Nand-Flash存储器介绍及编程
Nand-Flash存储器1概述NOR和NAND是目前市场上两种主要的非易失闪存技术。
Nor-flash存储器的容量较小、写入速度较慢,但因其随机读取速度快,因此在嵌入式系统中,常应用在程序代码的存储中。
Nor-flash存储器的内部结构决定它不适合朝大容量发展;而NAND-flash存储器结构则能提供极高的单元密度,可以达到很大的存储容量,并且写入和擦除的速度也很快。
但NAND-flash存储器需要特殊的接口来操作,因此它的随机读取速度不及Nor-flash存储器。
二者以其各自的特点,在不同场合发挥着各自的作用。
NAND-flash存储器是flash存储器的一种技术规格,其内部采用非线性宏单元模式,为固态大容量存储器的实现提供了廉价有效的解决方案,因而现在得到了越来越广泛的应用。
例如体积小巧的U盘就是采用NAND-flash存储器的嵌入式产品。
由于NAND-flash(非线性flash)存储器内部结构不同于Nor-flash(线性flash)存储器,因此对它的读写操作也有较大的区别。
BF533中没有像支持SDRAM一样提供直接与NAND-flash存储器的接口,读写的过程要靠软件编程来完成。
本实验将以东芝公司的TC58DVM82A1FT芯片为例,介绍NAND-flash存储器芯片的读写流程和时序。
2 实验内容和目标包括以下几点。
2编写程序,读出器件的识别码(ID)。
3对NAND-flash的一个或若干个块进行擦除操作。
4在被擦除的一个或若干个块写入数据。
5将写入的数据读出并进行验证。
6查找坏块。
3NAND-flash介绍及编程指导NAND-flash存储器中的宏单元彼此相连,仅第一个和最后一个Cell分别与Work Line和BIT Line相连,因此NAND-flash架构的存储容量较Nor-flash架构的高。
NAND-flash存储器的容量较大,改写速度快,主要应用在大量资料的存储,如嵌入式产品中,包括数码相机、MP3随身听记忆卡等。
对Nand flash读操作的分析
前几天大致分析了u-boot针对smdk2410的源码,了解了启动的流程,但是对板上许多硬件的驱动过程还不太清楚。
smdk2410源码中有针对Nor Flash的初始化和读取,但源码中没有对Nand Flash的操作,虽然针对其他型号的板子应该有Nand的源码,但方便起见,我查阅了vivi的源码,它支持从Nand Flash启动,自然有我需要的东西。
下面我就自己的分析和总结列出来,中间当然也从google上得到不少前人留下的宝贵资料:)。
我先摘录一段对Nor和Nand flash区别的几条总结:NOR flash采用位读写,因为它具有sram的接口,有足够的引脚来寻址,可以很容易的存取其内部的每一个字节。
NAND flash使用复杂的I/O口来串行地存取数据。
8个引脚用来传送控制、地址和数据信息(复用)。
NAND的读和写单位为512Byte的页,擦写单位为32页的块。
●NOR的读速度比NAND稍快一些。
●NAND的写入速度比NOR快很多。
●NAND的4ms擦除速度远比NOR的5s快。
●大多数写入操作需要先进行擦除操作。
●NAND的擦除单元更小,相应的擦除电路更少。
在NOR器件上运行代码不需要任何的软件支持,在NAND器件上进行同样操作时,通常需要驱动程序,也就是内存技术驱动程序(MTD),NAND和NOR器件在进行写入和擦除操作时都需要MTD。
再来看看Nand flash自身的特点(部分摘自August0703的文章):Nand Flash的数据是以bit的方式保存在memory cell中,一般来说,一个cell 中只能存储一个bit。
这些cell 以8个或者16个为单位,连成bit line,形成所谓的byte(x8)/word(x16),这就是NAND Device的位宽。
多个line(多个位宽大小的数据)会再组成Page。
我使用的Nand flash是三星的K9F1208U0M,从datesheet上得知,此flash每页528Bytes(512byte的Main Area + 16byte的Spare Area),每32个page形成一个Block(32*528B)。
nand flash架构读取操作原理
nand flash架构读取操作原理
NAND Flash是一种非易失性存储器,其读取操作原理如下:
1. 数据存储:NAND Flash将数据存储在一组互相连接的存储单元(或称为“存储块”),每个存储单元存储一个或多个数据位。
2. 读取操作:当进行读取操作时,控制器发送一个读取命令给NAND Flash芯片。
读取命令包括存储单元的地址,用于指示需要读取的数据位在哪个存储单元中。
3. 地址解码:NAND Flash芯片通过解码器将接收到的地址信号解码为特定的存储单元。
4. 数据传输:一旦解码,NAND Flash芯片会将请求的数据位传输给控制器。
数据传输是通过读取线路进行的,其中包括数据线和引脚,以便将数据传输到控制器。
5. 数据返回:NAND Flash芯片将请求的数据位返回给控制器后,控制器可以根据需要将数据传输到主机系统的内存中。
需要注意的是,NAND Flash芯片的读取操作是以块为单位进行的,而不是以字节或位为单位。
这是因为每个存储单元中的数据位是同时读取的。
因此,如果需要读取少于一个存储块的数据,控制器仍会读取整个存储块,并从中提取所需数据,这会导致一定的浪费。
NandFlash驱动(实现初始化以及读操作)
NandFlash驱动(实现初始化以及读操作)本节来学习裸机下的Nand Flash驱动,本节学完后,再来学习Linux下如何使⽤Nand Flash驱动Linux中的Nand Flash驱动,链接如下:(只需要初始化Flash以及读Flash)打开2440芯⽚⼿册,K9F2G08U0M芯⽚⼿册(因为2440中Nand Flash是⽤的256MB(2Gb)内存,8个数据引脚)在芯⽚⼿册中得到K9F2G08U0M=2048块Block=128K页Pages=256MB=2Gb1个设备=2048块Block1块Block=64页Pages1页=(2K+64)B (因为每个地址⾥都存放了⼀个字节,所以⽤B表⽰)其中64B是存放ECC的OOB地址,(ECC:存放判断位反转的校验码)Nand Flash 缺点:读数据容易位反转可以通过ECC编码器值来判断读数据是否位反转,若位反转则重新读数据写过程:1)写页数据2)然后⽣成ECC3)将ECC写⼊到OBB页地址⾥(写数据是不会出现位反转)读过程:1)读出页数据,然后⽣成临时ECC(此时ECC可能有错)2)然后读出OOB页地址⾥的ECC3)⽐较两个ECC,判断是否出现位反转读OOB⽅法:读整个Nand Flash时,是读不出页⾥⾯的OBB地址,⽐如读2049这个地址数据时,是读的第⼆页上的第2个地址:只有读某⼀页时,才能读出这个页⾥⾯的OOB地址, ⽐如读第0页的2049这个地址数据时,才是读的第0页OOB的第2个地址:Nand Flash芯⽚硬件引脚图:RnB:就绪(ready)/忙(busy)输出信号,需要采⽤上拉电阻(1:表⽰写⼊数据成功,0:表⽰正在写⼊)CLE:命令(command)锁存(latch)使能,(1:表⽰当前传的是命令值)ALE:地址锁存使能,(1:表⽰当前传的是地址值,当CLE=0和ALE=0,表⽰传的是数据)nCE:芯⽚使能(低电平使能) (n:表⽰低电平有效)nWE:写使能 ,⽐如写命令时,当CLE=1,ALE=0时,当nWE来个上升沿,则会将IO数据写⼊flash中nRE:读使能,和we类似nWP:写保护(protect) (1:不保护,0:只能读不能写),默认接⾼电平.1.编写nand_init()函数1.1设置通信时序图1(nandflash时序表):图2(nandflash时序图):通过图2和图1可以看出:tCS是等待芯⽚使能CE的时间, tCS=20nStCLS和tALS是等待WE(写信号)结束的时间, tCLS=tALS=15nStWP是WE(写信号)维持时间, tWP=15nStALH是等待命令写⼊成功的时间, tALH=5nStCLH是等待地址写⼊成功的时间, tCLH=5nS图3(2440-nandflash时序图):⾸先查看2440芯⽚⼿册⾥nandflash时序图,如上图,可以看出需要设置TACLS,TWRPH0和TWRPH1,这三个参数TACLS:属于等待WE(写信号)就绪的时间,对⽐图2得出TACLS= tCLS- tWP=0nSTWRPH0:属于WE(写信号)的时间, 对⽐图2得出TWRPH0= tWP=15nSTWRPH1:属于等待命令写⼊成功的时间,对⽐图2得出TWRPH1=tALH=tCLH=5nS最后,在NFCONF寄存器中设置这三个参数TACLS[13:12]表⽰Duration(持续时间)=HCLK*TACLS,由于Duration=0nS,所以TACLS=0TWRPH0 [10:8]表⽰Duration(持续时间)=HCLK*( TWRPH0+1),由于Duration=15nS,HCLK=10nS(100Mhz),所以TWRPH0 =1. TWRPH1 [6:4]表⽰Duration(持续时间)= HCLK*( TWRPH1 +1),由于Duration=5nS,HCLK=10nS(100Mhz),所以TWRPH1 =0 1.2然后定义全局变量,并实现nand_init()初始化:/* nand flash 时序 */#define TACLS 0#define TWRPH0 1#define TWRPH1 0/* nand flash 寄存器 */#define NFCONF *((unsigend int *)0X4E000000); //配置寄存器(⽤来设置时序)#define NFCONT *((unsigend int *)0X4E000000); //控制寄存器(⽤来使能nandflash控制器以及ECC编码器,还有控制芯⽚使能CE脚)#define NFCMMD *((unsigend char *)0X4E000000);//发送命令寄存器(命令只有8位)#define NFADDR *((unsigend char *)0X4E000000);//发送地址寄存器(地址只有8位)#define NFDATA *((unsigend int *)0X4E000000);//读/写数据寄存器(数据只有8位)#define NFSTAT *((unsigend int *)0X4E000000);//运⾏状态寄存器(⽤于判断RnB脚)/*因为Nand Flash只有8位I/O脚,所以NFCMMD/ NFADDR/ NFDATA三个寄存器值都是unsigend char型 */1.3 nand_init()函数初始化void nand_init(void){/* 设置时序 */NFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4);/* bit4=1:初始化ECC, bit1=1:禁⽌⽚选 bit0=1:启动nandflash控制器*/NFCONT = (1<<4)|(1<<1)|(1<<0);}2编写nand_read()函数2.1编写nand_read()函数需要以下⼏个⼦函数:2.1.1⽚选使能函数(在读写FLASH之前都要选中⽚选)nand_select() //使能⽚选{int i;NFCONT&=~(1<<1); // NFCONT控制器位1置0for(i=0;i<10;i++); //等待芯⽚使能成功}2.1.2取消⽚选函数(退出读写FLASH时需要取消⽚选)nand_deselect() //取消⽚选{int i;NFCONT&=~(1<<1); // NFCONT控制器位1置0for(i=0;i<10;i++); //等待芯⽚使能成功}2.1.3读命令函数nand_cmd(unsigned char cmd){int i;NFCMMD= cmd; // 向NFCMMD寄存器写⼊命令for(i=0;i<10;i++); //等待写⼊命令成功}2.1.4判断RnB状态函数(在写⼊所有命令后都要判断RnB脚是否为⾼电平就绪)nand_waite_idle(){int i;while(!(NFSTAT&0X01)) // 等待NFSTAT寄存器位0置1for(i=0;i<10;i++);}2.1.5读数据函数nand_read_data(){unsigend char p=NFDATA; //读取NFDATA寄存器return p; //返回}2.1.6 编写写⼊地址函数(分5个周期)⾸先Nand Flash引脚只有8位,然⽽地址共有2048(块)*64(页)*2KB,为了读出多个地址,如下图,所以需要分5个周期来实现发送地址如上图,其中 A10~A0对应页⼤⼩(列),由于nandflash每页2048B,所以只⽤到A10~A0 A28~A11对应页⽬录(⾏),表⽰共有2048块*64(每块有64页)个⽬录例如,4097 地址就是:A10~A0=4097%2048= 1(A0=1,其余为0)A28~A11=4097/2048=2(A13=1,其余为0)所以nand_write_nand()函数如下:void nand_read_addr(unsigned int addr){unsigned int col = addr % 2048;unsigned int page = addr / 2048;volatile int i;NFADDR=(col>>0)&0xff; //A7~A0,第1周期for(i=0;i<10;i++);NFADDR=(col>>8)&0x0f; //A10~A8,第2周期for(i=0;i<10;i++);NFADDR=(page>>0)&0xff; //A18~A11,第3周期for(i=0;i<10;i++);NFADDR=(page>>8)&0xff; //A26~A19,第4周期for(i=0;i<10;i++);NFADDR=(page>>16)&0xff; //A27~A28,第5周期for(i=0;i<10;i++);}2.2Nand Flash命令图:如上图,例如:当要reset复位nand flash时1) 使能⽚选nand_select();2) 发送0XFF复位命令nand_cmd(0xFF);3) 等待RnB状态是否就绪 nand_wait_idle();4) 取消⽚选 nand_deselect();2.3Nand Flash读数据时序图:从上图可以看出nand flash 读数据分为了以下⼏个步骤:(1) 使能⽚选CE,将CLE置1,等待发送命令(2) 将WE置低,将IO置为0X00,然后拉⾼WE,触发⼀次上升沿,则将把0x00写⼊flash中(3) 将CLE置0,表⽰发送地址(分为5个周期)(4) 发送读命令0X30(5) 等待RnB信号为⾼电平(6) 读数据(在同⼀页⾥,数据可以连续读,读下⼀页时,需要重新发送新的地址才⾏例如:读1000地址到2050地址时,1.发出1000地址,到达页0的1000地址上,然后再连续读(2048-1000)次,直到读到页0的2047处.2.再发出2048地址,到达页1的0地址上,然后连续读(2051-2048)次,直到读到2050为⽌)(7) 取消⽚选nCE2.4 所以nand_read()函数如下:void nand_read(unsigned int src,unsigned char *dest,unsigned int len)/* src:源地址,为32位地址,所以⽤unsigend int表⽰*dest:⽬的地址内容,由于这⾥是将数据读出到⽬的地址内容中,所以需要⽤到*指针,因为每个地址⾥存的是⼀个字节,所以⽤unsigend char 型 */ {int col=src%2048; //第⼀次读,可能不是读的页⾸地址,所以需要记录当前页的位置int i=0; //当前读了0次nand_select(); //1使能⽚选nCEwhile(i<len){ nand_cmd(0X00); //2发送读命令0X00nand_write_addr(src); // 3发送yuan地址(分为5个周期)nand_cmd(0X30); //4发送读命令0X30nand_wait_idle(); //5等待RnB信号为⾼电平for(;(col<2048)&&(i<len);col++) //连续读页内数据{dest[i]=nand_read_data(); //6.读数据i++;src++;}col=0;}nand_deselect(); // 取消⽚选nCE }。
ARM9(S3C2440)之九nand flash的读写操作
九 ARM9(2440)对nand flash的读写操作转载自:骨Zi里德骄傲这篇文章转自别处,写的非常详细,让我们熟悉2440对nand flash 的整个操作过程:s3c2440对nandflash的操作(K9F2G08)nandflash在对大容量的数据存储中发挥着重要的作用。
相对于norflash,它具有一些优势,但它的一个劣势是很容易产生坏块,因此在使用nandflash时,往往要利用校验算法发现坏块并标注出来,以便以后不再使用该坏块。
nandflash 没有地址或数据总线,如果是8位nandflash,那么它只有8个IO口,这8个IO口用于传输命令、地址和数据。
nandflash主要以page(页)为单位进行读写,以block(块)为单位进行擦除。
每一页中又分为main区和spare区,main 区用于正常数据的存储,spare区用于存储一些附加信息,如块好坏的标记、块的逻辑地址、页内数据的ECC校验和等。
三星公司是最主要的nandflash供应商,因此在它所开发的各类处理器中,实现对nandflash的支持就不足为奇了。
s3c2440不仅具有nandflash的接口,而且还可以利用某些机制实现直接从nandflash启动并运行程序。
本文只介绍如何对nandflash实现读、写、擦除等基本操作,不涉及nandflash启动程序的问题。
在这里,我们使用的nandflash为K9F2G08U0A,它是8位的nandflash。
不同型号的nandflash的操作会有所不同,但硬件引脚基本相同,这给产品的开发扩展带来了便利。
因为不同型号的PCB板是一样的,只要更新一下软件就可以使用不同容量大小的nandflash。
K9F2G08U0A的一页为(2K+64)字节(加号前面的2K表示的是main区容量,加号后面的64表示的是spare区容量),它的一块为64页,而整个设备包括了2048个块。
这样算下来一共有2112M位容量,如果只算main区容量则有256M字节(即256M×8位)。
Nand Flash的读写操作
NandFlash的读写操作正如硬盘的盘片被分为磁道,每个磁道又分为若干扇区,一块nand flash也分为若干block,每个block分为如干page。
一般而言,block、page之间的关系随着芯片的不同而不同,典型的分配是这样的:1block = 32page1 page = 512bytes(datafield) + 16bytes(oob)需要注意的是,对于flash的读写都是以一个page开始的,但是在读写之前必须进行flash 的擦写,而擦写则是以一个block为单位的。
同时必须提醒的是,512bytes理论上被分为1st half 和2sd half,每个half各占256个字节。
我们讨论的K9F1208U0B总共有4096 个Blocks,故我们可以知道这块flash的容量为4096 *(32 *528)= 69206016 Bytes = 66 MB但事实上每个Page上的最后16Bytes是用于存贮检验码和其他信息用的,并不能存放实际的数据,所以实际上我们可以操作的芯片容量为4096 *(32 *512) = 67108864 Bytes = 64 MB 由上图所示,1个Page总共由528 Bytes组成,这528个字节按顺序由上而下以列为单位进行排列(1列代表一个Byte。
第0行为第0 Byte ,第1行为第1 Byte,以此类推,每个行又由8个位组成,每个位表示1个Byte里面的1bit)。
这528Bytes按功能分为两大部分,分别是Data Field和Spare Field,其中Spare Field占528Bytes里的16Bytes,这16Bytes是用于在读写操作的时候存放校验码用的,一般不用做普通数据的存储区,除去这16Bytes,剩下的512Bytes便是我们用于存放数据用的Data Field,所以一个Page上虽然有528个Bytes,但我们只按512Bytes进行容量的计算。
nand flash 读写(基本操作)
开场白:希望通过这篇文章记录一下自己在调试NAND flash的经验。
希望对大家有用。
上个月搞了一块开发板QT210。
说实话没有找到很多的datasheet就开始搞了。
最早还是从boot说起,说到这这里不得不提到boot中打印的错误信息****CRC Error*****。
最后还是决定静心调试看看怎么回事。
结果发现资料还是确少,怎么办?找了以前的omap开发板。
(个人觉得omap的板子BSP还是做的比较好的)。
在omap上调试了一下并测试了一些基本的NAND的读写操作。
210的板子准备在linux中使用MTD去管理者块flash。
并且留下了疑问:s5pc110的片子memory map给nand 和onenand留下了256MB的空间,但是210的板子使用的是三星的1GMB的flash。
多余的7百多兆的flash的空间如何管理?nand bsp分析:型号:MT29F2G16xxxx硬件平台:omap3530在分析之前,确定硬件平台和device的型号还是很有必要的。
应为在3530的板子上是使用的LPDDR(micron)。
在以前的工作中和供应商打过交道。
其实flash的型号以及位宽和一些其他的参数可以从芯片的命名的法则上了解。
在查阅了相关文档后确定NAND的型号。
基本的read函数。
下来了解一下nand的操作时序:io是复用的。
即是data又是cmd。
但是注意16bits位宽的device在cmd和寻址时候是8bits位宽,数据读出时候是16bits位宽。
简单通过一个函数:read,但是在read之前先要把上图中现实的cmd 以及addr作用到总线上。
这就是软件的作用了。
在这里不得不提一下omap的GPMC。
其实这就是一个包含NAND Controller的硬件模块。
具体的初始化和寄存器设置工作状态在别的文章中解释。
(GPMC的设置也是要花时间去调试和跟踪的,不想影响了NAND的分析)只要记住软件正确的操作了GPMC相关的NAND控制器,就是对NAND devide进行相关操作了。
nand_flash -简明自学资料-
编写原因:
各种 nand flash 英文 datasheets 上的内容虽详尽但繁杂,有些业内常识性的 东西没交代清楚,给初学者造成困扰; 不同的 datasheets 都有一些共通的要点(基本架构、指令和符号等) ,了解 这些后再看 datasheet 的操作命令和时序图部分会省力很多。
3
注:1)R/B#信号以及 toggle 模式下的对应读操作的 DQS 信号是外部从 flash 读出的,而
其余引脚信号(包括 toggle 模式下的对应写操作的 DQS 信号)都是由 flash device 以 外的模块产生、输入进而控制其状态的,即分别对应开篇“功能结构抽象图”里的状 态信号和控制信号。 2)以上带“#”的引脚,表示信号低电平时对应功能或状态有效,有的 datasheet 则 用顶部一横杠标示, 如:
2
号,剩下 个 Byte 的高位用于存储 block 编号,如是多层或多芯片等的,再在其中插入 8 相应编号即可,列地址以外的部分称为 Row Address(行地址,即页内偏移地址) 。
k
二 基本操作、时序图部分 *通用引脚符号声明
(1)CE#:芯片使能,表示 flash chip 是否被系统选中为当前操作芯片,低电平表示选中
1、Read—读
(1)Page Read 功能:用于将目标 page 中从指定列地址到页末尾地址的内容顺序读出 指令:00h + Column&Row Addresses+ 30h 过程:先将选定的 page 所有内容拷贝到 page register,再从 page register 复制到 cache, 最后将 cache 中 page 的从 column address 起到页尾的部分依次读出 (2)Cache Read 功能:用于将一个 block 中的多个 page 顺序读出(除首页可输出部分内容外,其它页都 是整页被 I / O 读出) 指令:00h + Column&Row Addresses(首页)+ 30h + 31h + …… + 31h + 3Fh 过程:1)将首页的所有内容复制到 register,完成时接到 31h(Cache Read 指令) ; 2)把 page register 里的内容复制到 cache; 3) 完毕时 page register 可用, 立即开始将下一页拷贝到 page register, 同时, cache 里的内容可被 I / O 读出; 4) 当 page register 的数据已加载好, 且 cache 被读完时, 若又收到 31h, 则返回 2) , 否则接收的是准结束指令 3Fh,转向 5) ; 5)将 page register 里最后一页的内容复制到 cache,然后被 I / O 读出,操作结束。 (3)Random Data Output 功能:当用 Read 指令把 page 内容读到 cache 后,从中读取指定列地址以后的内容 指令:… 05h + Column Addresses + E0h
个教程教你解读器件时序图
3个教程教你解读:器件时序图
1、如何读单片机的时序图,国外的一个培训文档,讲解得很精细,有兴趣有朋
友好好读读。
2、MCU如何根据LCD的时序来写底层驱动
3、另外一个教程(整理自国内论坛)
具体内容如下:
时序时序,就是按照一定的时间顺序给出信号
就能得到你想要的数据,或者把你要写的数据写进芯片;
举个KM62256(三星的一种存储器)读数据的例子:
先给地址,地址保持的最短时间是:trc;
再给CS片选;片选滞后地址的最短时间可以算出来;
再给OE(读信号);同样滞后的最短时间也可以算出来;
数据线上本来是高阻态;
这时,滞后OE一段时间之后,数据输出,直到数据有效输出并保持一段时间;
然后OE变高;
然后CS变高;
然后改变地址;
这时数据仍然保持一段时间有效;然后无效;然后高阻;
你找一个KM62256(三星的一种存储器)看懂了,其它的芯片也都差不多了;时间参数参考下图:。
nand flash 裸板驱动及其时序图详解
nand flash 裸板驱动,介绍的比较精辟/u3/96362/showart_211 3221.htmlNAND Flash的驱动程序设计:/html/99/n-599.html1. 硬件特性:【Flash的硬件实现机制】Flash全名叫做Flash Memory,属于非易失性存储设备(Non-volatile Memory Device),与此相对应的是易失性存储设备(Volatile Memory Device)。
关于什么是非易失性/易失性,从名字中就可以看出,非易失性就是不容易丢失,数据存储在这类设备中,即使断电了,也不会丢失,这类设备,除了Flash,还有其他比较常见的入硬盘,ROM等,与此相对的,易失性就是断电了,数据就丢失了,比如大家常用的内存,不论是以前的SDRAM,DDR SDRAM,还是现在的DDR2,DDR3等,都是断电后,数据就没了。
Flash的内部存储是MOSFET,里面有个悬浮门(Floating Gate),是真正存储数据的单元。
在Flash之前,紫外线可擦除(uv-erasable)的EPROM,就已经采用用Floating Gate存储数据这一技术了。
数据在Flash内存单元中是以电荷(electrical charge)形式存储的。
存储电荷的多少,取决于图中的外部门(external gate)所被施加的电压,其控制了是向存储单元中冲入电荷还是使其释放电荷。
而数据的表示,以所存储的电荷的电压是否超过一个特定的阈值Vth来表示。
【SLC和MLC的实现机制】Nand Flash按照内部存储数据单元的电压的不同层次,也就是单个内存单元中,是存储1位数据,还是多位数据,可以分为SLC和MLC:1. SLC,Single Level Cell:单个存储单元,只存储一位数据,表示成1或0.就是上面介绍的,对于数据的表示,单个存储单元中内部所存储电荷的电压,和某个特定的阈值电压Vth,相比,如果大于此Vth值,就是表示1,反之,小于Vth,就表示0.对于nand Flash的数据的写入1,就是控制External Gate去充电,使得存储的电荷够多,超过阈值Vth,就表示1了。
怎么看时序图--nand flash的读操作详解
这篇文章不是介绍nand flash的物理结构和关于nand flash的一些基本知识的。
你需要至少了解你手上的nand flash的物理结构和一些诸如读写命令操作的大概印象,你至少也需要看过s3c2440中关于nand flash控制寄存器的说明。
由于本人也没有专门学过这方面的知识,下面的介绍也是经验之谈。
这里我用的K9F2G08-SCB0 这款nand flash 来介绍时序图的阅读。
不同的芯片操作时序可能不同,读的命令也会有一些差别。
当然其实有时候像nand flash这种s3c2440内部集成了他的控制器的外设。
具体到读写操作的细节时序(比如CLE/ALE的建立时间,写脉冲的宽度。
数据的建立和保持时间等),不明白前期也没有多大的问题。
因为s3c2440内部的nand flash控制器做了大部分的工作,你需要做的基本就是设置几个时间参数而已。
然后nand flash会自动进行这些细节操作。
当然如果处理器上没有集成nand flash的控制器那么久必须要自己来写时序操作了。
所以了解最底层的时序操作总是好的但是上层一点的,比如读写操作的步骤时序(比如读操作,你要片选使能,然后发命令,然后发地址,需要的话还需发一个命令,然后需要等待操作完成,然后再读书数据)。
是必须要明白的。
这都不明白的话,怎么进行器件的操作呢也就是说s3c2440 可以说在你设置很少的几个时间参数后,将每一个步骤中细微的操作都替你做好了。
(比如写命令,你只要写个命令到相应寄存器中,cpu内部就会协各个引脚发出适应的信号来实现写命令的操作)。
而我们所需要做的就是把这些写命令,写地址,等待操作完成。
等步骤组合起来。
从而完成一个读操作就像上面说的,虽然我们不会需要去编写每个步骤中的最细微的时序。
但是了解下。
会让你对每个操作步骤的底层细节更加明了先来看一个命令锁存的时序。
也就是上面说的读nand flash操作中不是有一个写命令步骤吗。
教你如何看懂单片机时序图
教你如何看懂单片机时序图操作时序永远使用是任何一片IC芯片的最主要的内容。
一个芯片的所有使用细节都会在它的官方器件手册上包含。
所以使用一个器件事情,要充分做好的第一件事就是要把它的器件手册上有用的内容提取,掌握。
介于中国目前的芯片设计能力有限,所以大部分的器件都是外国几个IC巨头比如TI、AT、MAXIM这些公司生产的,器件资料自然也是英文的多,所以,英文的基础要在阅读这些数据手册时得到提高哦。
即便有中文翻译版本,还是建议看英文原版,看不懂时不妨再参考中文版,这样比较利于提高。
我们首先来看1602的引脚定义,1602的引脚是很整齐的SIP单列直插封装,所以器件手册只给出了引脚的功能数据表:我们只需要关注以下几个管脚:3脚:VL,液晶显示偏压信号,用于调整LCD1602的显示对比度,一般会外接电位器用以调整偏压信号,注意此脚电压为0时可以得到最强的对比度。
4脚:RS,数据/命令选择端,当此脚为高电平时,可以对1602进行数据字节的传输操作,而此脚为低电平时,则是进行命令字节的传输操作。
命令字节,即是用来对LCD1602的一些工作方式作设置的字节;数据字节,即使用以在1602上显示的字节。
值得一提的是,LCD1602的数据是8位的。
5脚:R/W,读写选择端。
当此脚为高电平可对LCD1602进行读数据操作,反之进行写数据操作。
笔者认为,此脚其实用处不大,直接接地永久置为低电平也不会影响其正常工作。
但是尚未经过复杂系统验证,保留此意见。
6脚:E,使能信号,其实是LCD1602的数据控制时钟信号,利用该信号的上升沿实现对LCD1602的数据传输。
7~14脚:8位并行数据口,使得对LCD1602的数据读写大为方便。
现在来看LCD1602的操作时序:在此,我们可以先不读出它的数据的状态或者数据本身。
所以只需要看两个写时序:① 当我们要写指令字,设置LCD1602的工作方式时:需要把RS置为低电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入。
NAND flash读写擦除操作
NAND flash读写擦除操作本文主要介绍SAMSUNG公司的S3C2410处理器和K9F1208NAND flash的读写擦除操作。
一、K9F1208NAND flash芯片介绍S3C2410处理器集成了8位NAND flash控制器。
因NAND flash K9F1208、K9F1G08的数据页大小分别为512B、2KB,在寻址方式上有一定的差异,所以程序代码并不通用。
K9F1208的器件存储容量为64M字节和2048K字节的spare存储区,8位I/O 端口采用地址、数据和命令复用的方法。
该器件的引脚图如下所示该器件的引脚功能描述如下表所示引脚名称英文描述描述I/O0~I/O7Data input/outputs数据输入输出CLE Command latch enable命令锁存使能ALE Address latch enable地址锁存使能CE#Chip enable片选RE#Read enable读使能WE#Write enable写使能WP#Write protect写保护R/B#Ready/Busy output准备好/忙碌输出VCC Power(+2.7V~3.6V)电源(+2.7V~3.6V)VSS Ground地N.C No connection空引脚NAND flash的数据是以bit的方式保存在memory cell。
一般一个cell中只能存储一个bit。
这些cell以8个或者16个为单位,连成bit line,形成所谓的byte(X8)/word(X16),这就是NAND device的位宽。
这些line组成page,page再组织形成一个block。
K9F1208的相关数据如下:1block=32page;1page=528byte=512byte(main area)+16byte(spare area)总容量为=4096(block)*32(page/block)*512(byte/page)=64MBNAND flash以页为单位读写数据,而以块为单位擦除数据。
nandflash时序
三星系列的NAND FLASH芯片容量从8MB到256MB(最近听说有1G容量的了),对于需要大容量数据存储的嵌入式系统是一个很好的选择,尤其是其接近1MB/元的高性价比,更是普通nor flash 无法比拟的。
本文以K9F2808U0C为例,采用AVR芯片连接,进行了初步的读写试验,完成了芯片的ID读出功能。
电路连接如下图:左边是所使用的AVR芯片ATmega16L的局部电路,右边是K9F2808芯片的连接图,数据/地址总线使用ATmega16的PORTB端口连接,其它全部所需信号线使用IO连接,组成了IO模拟方式。
K9F2808芯片的全部命令字如下:其中,Read1读取的是普通数据存储区域的数据,Read2读取的是每页存储器附加的16Bytes区域的数据;Page Program可以编程一页最大528Bytes的数据,Block Erase擦除指定页面数据,Read Status可以读取芯片状态。
芯片的整个读写时序可以分解为4个基本步骤,即1、命令写入,2、数据写入,3、数据读出,4、地址写入。
1、命令写入时序如下:对应函数为:void WriteCmd(unsigned char cmd) {nandPortD = 0xFF;ClsLine(nandSPortO,nandALE); ClsLine(nandSPortO,nandnCE); SetLine(nandSPortO,nandCLE); ClsLine(nandSPortO,nandnWE); nandPortO = cmd;SetLine(nandSPortO,nandnWE); ClsLine(nandSPortO,nandCLE); SetLine(nandSPortO,nandALE);}2、数据写入时序如下:对应函数为:void WriteByte(unsigned char Wdata){nandPortD = 0xFF;SetLine(nandSPortO,nandnWE);ClsLine(nandSPortO,nandCLE);ClsLine(nandSPortO,nandnCE);ClsLine(nandSPortO,nandALE);ClsLine(nandSPortO,nandnWE);while((nandSPortI & nandRnB) != nandRnB); // wait busy end nandPortO = Wdata;while((nandSPortI & nandRnB) != nandRnB); // wait busy end SetLine(nandSPortO,nandnWE);}3、数据读出时序如下:对应函数为:unsigned char ReadByte(void){unsigned char Rdata;nandPortD = 0x00;SetLine(nandSPortO,nandnWE);ClsLine(nandSPortO,nandCLE);ClsLine(nandSPortO,nandALE);ClsLine(nandSPortO,nandnCE);ClsLine(nandSPortO,nandnRE);while((nandSPortI & nandRnB) != nandRnB); // wait busy end Rdata = nandPortI;while((nandSPortI & nandRnB) != nandRnB); // wait busy end SetLine(nandSPortO,nandnRE);return Rdata;}4、地址写入时序如下:对应函数为:void WriteByteAdd(unsigned char Add){nandPortD = 0xFF;SetLine(nandSPortO,nandnWE);ClsLine(nandSPortO,nandnCE);ClsLine(nandSPortO,nandCLE);SetLine(nandSPortO,nandALE);ClsLine(nandSPortO,nandnWE);nandPortO = Add;SetLine(nandSPortO,nandnWE);while((nandSPortI & nandRnB) != nandRnB); // wait busy endClsLine(nandSPortO,nandALE);}其余操作方式均从这四种基本操作组合变化而来,适当调用或者重新编写其中的某些语句就能完成全部的K9F2808芯片读写操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
这篇文章不是介绍nand flash的物理结构和关于nand flash的一些基本知识的。
你需要至少了解你手上的nand flash的物理结构和一些诸如读写命令操作的大概印象,你至少也需要看过s3c2440中关于nand flash控制寄存器的说明。
由于本人也没有专门学过这方面的知识,下面的介绍也是经验之谈。
这里我用的K9F2G08-SCB0 这款nand flash 来介绍时序图的阅读。
不同的芯片操作时序可能不同,读的命令也会有一些差别。
当然其实有时候像nand flash这种s3c2440内部集成了他的控制器的外设。
具体到读写操作的细节时序(比如CLE/ALE的建立时间,写脉冲的宽度。
数据的建立和保持时间等),不明白前期也没有多大的问题。
因为s3c2440内部的nand flash控制器做了大部分的工作,你需要做的基本就是设置几个时间参数而已。
然后nand flash会自动进行这些细节操作。
当然如果处理器上没有集成nand flash的控制器那么久必须要自己来写时序操作了。
所以了解最底层的时序操作总是好的但是上层一点的,比如读写操作的步骤时序(比如读操作,你要片选使能,然后发命令,然后发地址,需要的话还需发一个命令,然后需要等待操作完成,然后再读书数据)。
是必须要明白的。
这都不明白的话,怎么进行器件的操作呢也就是说s3c2440 可以说在你设置很少的几个时间参数后,将每一个步骤中细微的操作都替你做好了。
(比如写命令,你只要写个命令到相应寄存器中,cpu内部就会协各个引脚发出适应的信号来实现写命令的操作)。
而我们所需要做的就是把这些写命令,写地址,等待操作完成。
等步骤组合起来。
从而完成一个读操作就像上面说的,虽然我们不会需要去编写每个步骤中的最细微的时序。
但是了解下。
会让你对每个操作步骤的底层细节更加明了先来看一个命令锁存的时序。
也就是上面说的读nand flash操作中不是有一个写命令步骤吗。
那么这个步骤具体是怎么实现的。
首先我们肯定是要片选nand flash。
只有选中芯片才能让他工作啊nand flash是通过ALE/CLE (高电平有效)来区分数据线上的数据时命令(CLE有效),地址(ALE有效)还是数据(CLE/ALE都无效)。
那么这里既然是写命令那么就一定是CLE有效(高电平)ALE无效(低电平)。
同样命令既然是写给nand flash的那么肯定有一个写周期。
我们需要注意的是,写是在上升沿有效还是下降沿有效。
时序图如下:1 这里是命令锁存是时序,那么我们要注意的其实就只有CLE 为高电平期间这段时序。
(写命令啊,CLE有效时(高电平)指示现在的数据其实命令)ALE此时一定为低电平我们可以不关心他2 所以,CLE为低电平的时期,其他大部分引脚上都是灰色的阴影,这代表我们不需要关心这段时期这些引脚的电平3 那么这个数据是什么时候被nand flash读取到的呢,注意到nWE信号在上升沿有一个贯穿所有其他引脚时序的竖线(这好像是叫生命线?我也不清楚)这就是说明,写入的数据(命令也是数据啊,只是可以通过CLE有效来区分)是在WE的上升沿有效。
也就是说,虽然WE是在低电平有效,但并不是说WE一变成低电平,命令就被锁存了(即真正获得命令)而是在WE 的上升沿,命令才真正被锁存。
知道了上面这三点,也就知道了一个大概,那么剩下的图中也只剩那些txx 的标号。
明显它指的是时间,但是具体指什么时间呢。
指的就是箭头两边所指的两条竖线之间的时间。
(在每个信号的跳变沿,都有小竖线)剩下的就是这些时间到底是代表什么了。
这里没什么难的,刚接触的觉得看不懂。
是因为之前从来没接触过。
(就像单片机刚学的时候不也是各种不懂,原因就是我们从没接触过)。
这些时间标号,在数据手册的前面都有说明比如 tCLS tCLH 从数据手册中我们可以看到分表代表的CLE建立时间,和CLE信号保持时间。
简单点你可以理解为,我让CLE引脚变成高电平,总得给人间一点时间去变成高电平吧。
总不能瞬间就变成高电平不过从时序图中我们能看到更多的端倪,之前不是说过WE 的上升沿上不是有一个最长贯穿其他信号线的竖线吗。
我们说他指示了,数据(命令也是数据)是在上升沿被锁存的,在WE 的上升沿,我写到数据线上的命令数据才真正被锁存(接收),但是我们注意到CLE 信号在WE上升沿之前有就有效了。
所以我们说,在命令数据真正被锁存之前,CLE 有效的那段tCLS 时间叫做CLE信号建立时间。
WE上升沿后。
命令已经被接受了,但这时候CLE 其实可以变为无效了,因为已经获取到命令了但是他并没有立刻结束,而是Tclh时间之后才结束。
那么我们称这段时间tCLH 为CLE 保持时间。
那么再根据手册中的说明 tCS 表示片选信号建立时间,tCH表示片选信号保持时间tDS表示数据建立时间,tDH表示数据保持时间这里我们看到一个小规律,在数据手册中以S 结尾的时间通常指的是建立时间,以H 结尾的时间指的是保持时间这里命令锁存的时序就分析完了。
我们再来看看地址锁存时序图,这个图有点复杂,因为nand flash的特性是地址周期通常需要好几个,就是一个地址是分几次发送的再给出数据手册中对应时间标号的说明同样我们按照上面分析的步骤1 这里是地址锁存是时序,那么我们要注意的其实就只有ALE 为高电平期间这段时序。
(写命令啊,ALE有效时(高电平)指示现在的数据其实是地址)CLE此时一定为低电平,可以不用管2 所以,ALE 为低电平的时期,其他大部分引脚上都是灰色的阴影,这代表我们不需要关心这段时期这些引脚的电平3 同样WE 的上升沿有一个贯穿其他信号线的长竖线,这也是代表数据(这里其实是地址)在上升沿被锁存那么剩下的也好理解tCLS 这个我们不需要关心,因为CLE 压根就是无效的。
tCS 就像之前分析的,它是指CE片选信号在WE上升沿也就是锁存地址之前的有效时间,也就是CE 建立时间tWC 呢? 不知道?不知道看手册啊,前面也说过这些时间标号在手册中都会给出。
从上面手册的解释我们看到,它指的是一个写周期的时间tWP 写脉冲宽度(也就是WE是低电平有限,twp指低电平持续时间,就是有效时间)tWH 好理解了,就是高电平时间ALS 这不就是地址信号 ALE 建立时间嘛ALH ALE信号有效保持时间啊TDS TDH 数据建立和保持时间就像上面对命令时序的分析,这里信号的建立和保持时间都是以数据被锁存分界点(WE上升沿)看到这里相信仔细看的人,应该大致该如何看一个时序图了,但是这里我们牵涉到的无非都是一些上面建立/保持时间。
复杂点的呢。
下面就来看一个复杂点的时序图,其实也不复杂,主要是说明如何在不看手册就能知道txx指的是什么时间这个时序其实并不复杂,只是他不是像上面分析的那样都是一些建立时间和保持时间。
这里牵涉到跟多的时间标号不过就像前面说的. 看手册!手册里对每个时间参数都有说明。
不过初学者通常即使看手册,对这些时间参数也是不知道是什么意思。
这里我们看手册前,先来自己分析下。
方法会了,手册就成了验证你对不对的东西了,而不是你寻找答案的东西。
TRC 这个参数有点简单。
看他的范围是一个RE周期的时间,那么就跟前面的tWC 应该是一样的。
那它应该代表的就是RE信号的一个周期时间(读信号的一个周期)TREA 呢?看标号看不出所以然,那么我们就看他的起始和结束时间从时序图能看到,这个指的是从RE有效(变低)到数据出现之间的时间。
那么tREA 可想而知就应该是读信号有效到数据被读之间的时间后面的都是这个同样的分析方法比如最后的那个tRHZ 是从RE 无效(高电平)到数据线变成高阻态之间的时间(数据线画在中间表示的是高阻态)看下手册中的解释也基本就是这个意思到这里对于时序图怎么看,相信大家都应该能理解了。
甚至可能连手册都不用看,就知道他是什么意思了。
因为我们能从时间的起始地址来推测时间标号的意思上面这些分析,都是很底层的操作,如果我们使用s3c2440 这种高级的处理器这些时序操作我们根本不需要去实现,顶多也就往几个寄存器中设置一下上面说的一些时间然后,CPU 中的nand flash控制器会自动完成上面所的所有操作。
但是还需要了解的原因是,如果你碰到一个没有nand flash 控制器的处理器怎么办,那你只能亲自实现这些具体的写命令,写地址。
等等单元操作。
然后才能将这些单元操作组合成读数据,写数据等操作(上面说过比如读操作他并不是一个简单的命令而是一系列操作,你要片选使能,然后发命令(读命令),然后发地址(要读的数据的地址),需要的话还需发一个命令,然后需要等待操作完成,然后读书数据)说完了这些具体的单元操作,那么我们再来看看一个读操作具体需要哪些步骤。
也就是我们需要真正必须掌握的时序操作对于我这款nand flash 读操作时序如下我们要注意的主要是最下面一行即I/Ox 信号线的状态,他指示了读操作需要哪些,单元步骤。
1 首先我们看到有一个0x00 是什么?数据?地址?命令?看ALE/CLE线啊,这两根线不是决定了现在的数据的类型嘛顺着往上看,我们知道0x00是在CLE有效期间的数据那么它就是一个命令2 然后是address(5Cycle) 即五个地址序列(这款nand flash 指定读数据的地址时要发送五个地址序列),往上看,是在ALE有效期间的数据,那么应该就是地址了(对于这五个地址,前面两个是列地址,后面三个是行地址。
在nand flash的物理结构中行地址对应的某一页,列地址就对应这一页中的某一列)3 接着又是0x30,此时CLE有效,那么就是命令了(也就是说这款nand flash的读操作需要两个命令)。
但是之后数据并未立刻出来,我们看到在到DATA Output即数据输出之前还有一段时间,为什么有这段时间?往上看R/nB 这个数据线上说明了原因,这段时间内它是低电平即指示现在处于忙碌状态,还未准备好数据输出。
为什么会这样?因为你写了一个命令,写了要读数据的地址,又写了一个命令。
你总要给cpu一些时间去处理这些命令吧,R/nB为低电平这段时间就是在处理这些命令(实际上是根据命令将你定位的那一页数据读到内部寄存器中),等R/nB变成高电平了,就指示命令处理完毕,现在数据也就可以读出来了。
综上我们从手册中我们就知道了读操作的具体步骤,1 首先nand flash 也是一个外设,要访问他就需要片选它,所以在执行时序图上的步骤之前需要片选nand flash.2 看后面就是安装时序图来了,看时序图! 第一步先是发送一个命令0x00.3 看时序图!然后发送五个地址序列(先发送两个列地址,在发送三个行地址(即页地址))4 看时序图!接着再是一个命令0x30.5 看时序图! R/nB 引脚为低表示现在正忙,正在处理这些命令,那就要等待R/nB 引脚变为高电平6 看时序图!这个时候就可以读数据了7 一次读操作结束了nand flash 暂时是不需要使用了,那么别忘了应该取消片选信号。