NandFlash的读写操作

合集下载

怎么看时序图--nand 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操作中不是有一个写命令步骤吗。

NANDFlash读写技术

NANDFlash读写技术

NAND Flash控制器S3C2410板的Nand Flash支持由两部分组成:Nand Flash控制器(集成在S3C2410 CPU)和Nand Flash存储芯片(K9F1208U0B)两部分组成。

当要访问Nand Flash中的数据时,必须通过Nand Flash控制器发送命令才能完成。

所以Nand Flash相当于S3C2410的一个外设,而不位于它的内存地址区.为了支持NAND Flash的启动装载,S3C2410A配置了一个叫Steppingstone的内部SRAM缓冲器。

当系统启动时,NAND Flash存储器的前4KB将被自动加载到Steppingstone中,然后系统自动执行这些载入的启动代码。

一般情况下,这4KB的启动代码需要将NAND Flash中的内容复制到SDRAM中。

使用S3C2410A内部硬件ECC功能可以对NAND Flash的数据进行有效性的检查。

复制完成后,将在SDRAM中执行主程序。

NAND Flash控制其具有以下特性:* NAND Flash模式:支持读/擦除/编程NAND Flash存储器。

* 自动启动模式:复位后,启动代码被传送到Steppingstone中。

传送完毕后,启动代码在Steppingstone 中执行。

* 具备硬件ECC(校验码:Error Correction Code)生成模块(硬件生成校验码,通过软件校验)* NAND Flash启动以后,4KB的内部SRAM缓冲器Steppingstone可以作为其他用途使用。

* NAND Flash控制器不能通过DMA访问,可以使用LDM/STM指令来代替DMA操作。

自启动模式的执行步骤如下:(1)完成复位(2)如果自动启动模式使能,NAND Flash存储器的前4KB自动复制到Steppingstone内部缓冲器;(3)Steppingstone映射到nGCS0;(4)CPU在Steppingstone的4KB内部缓冲器中开始执行启动代码。

nand_flash读写工作原理_概述说明

nand_flash读写工作原理_概述说明

nand flash读写工作原理概述说明1. 引言1.1 概述NAND Flash是一种非常常见和重要的存储设备,被广泛应用于各种电子产品中。

它的独特设计使得它成为一种高性能、低功耗、擦写可靠且具有较大容量的存储器解决方案。

由于其许多优点,NAND Flash在移动设备、个人电脑、服务器以及其他许多领域都有着广泛的应用。

1.2 文章结构本文将详细介绍NAND Flash的读写工作原理,并探讨其在存储领域中的优势与应用场景。

首先,我们将简要介绍NAND Flash的基本概念和特点,包括其结构和组成部分。

然后,我们将重点讲解NAND Flash进行读操作和写操作时所涉及的工作原理和步骤。

通过对这些原理的详细阐述,读者将能够全面了解NAND Flash如何实现数据的读取和写入。

除此之外,我们还将探讨NAND Flash相对于其他存储设备的优势,并介绍几个典型应用场景。

这些优势包括快速读写速度、低功耗、体积小且轻便、强大的耐久性以及较大的存储容量。

在应用场景方面,我们将重点介绍NAND Flash 在移动设备领域、物联网和服务器等各个行业中的广泛应用。

最后,我们将进行本文的小结,并对NAND Flash未来的发展进行展望。

通过全面了解NAND Flash的工作原理和优势,读者将能够更好地理解其在现代科技领域中的重要性,并对其未来发展趋势有一个清晰的认识。

1.3 目的本文的目的是通过对NAND Flash读写工作原理进行详细说明,使读者能够全面了解NAND Flash是如何实现数据读写操作的。

此外,我们还旨在向读者展示NAND Flash在存储领域中所具有的优势和广泛应用场景,使其意识到这一存储设备在现代科技产业中所扮演的重要角色。

希望通过本文,读者能够加深对NAND Flash技术的理解,并为相关领域或产品的研发与设计提供参考依据。

2. NAND Flash读写工作原理:2.1 NAND Flash简介:NAND Flash是一种非易失性存储器,采用了电子闪存技术。

nand flash 读写流程

nand flash 读写流程

nand flash 读写流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。

文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!NAND Flash 读写流程。

1. 擦除块(Erase Block)。

NANDFLASH读写

NANDFLASH读写

NANDFLASH读写NAND FLASH读写HY27UF081G2A:1Gbit (128Mx8bit / 64Mx16bit) NAND Flash Memory设备操作:3.1 Page Read.打开电源之后,芯片默认处于读状态。

也可以在写入4字节地址之后,写入命令00h和30h到命令寄存器,使能读操作。

In two consecutive(连续) read operations, the second one does need 00h command, which four address cycles and 30h command initiates that operation. Second read operation always requires setup command if first read operation was executed(执行) using also random data(随机读取) out command.Two types of operations are available: random read. The random read mode is enabled when the page address is changed. The 2112 bytes (X8 device) or 1056 words (X16 device) of data within the selected page are transferred to the data registers in less than 25us(tR). The system controller(控制器) may detect(检测) the completion of this data transfer (tR) by analyzing(分析) the output of R/B pin. Once the data in a page is loaded into the dataregisters(一旦一页的数据被加载到数据寄存器中), they may be read out in 30ns cycle time (3.3V device) by sequentially pulsing RE. The repetitive(重复) high to low transitions of the RE clock make the device output the data starting from the selected column address up to the last column address.The device may output random data in a page instead of the consecutive sequential data by writing random data output command. The column address of next data, which is going to be out, may be changed to the address which follows random data output command.1.命令输入 Command Input (CLE=1,ALE=0)ALE(0),CE(0) -> CLE(1) -> WE(0)->Command(输入并保持),在Command 保持时拉高WE(1)WE上升沿锁存Command->CE(1)->CLE(0)->ALE(1)根据时序图所得示意程序伪码void write_com(uint8 com){ALE=0;CE=0; delay 20ns;CLE=1;delay 15ns;WE=0;delay 15ns;IO7-0=com;delay 5ns;WE=1;delay 15ns;CE=1;CLE=0;ALE=1;}2.地址输入 Address Input(CLE=0,ALE=1)3.数据输入 Data Input (CLE=0,ALE=0)4.数据读出 Data Output (CLE=0,ALE=0)5.读状态寄存器(Read Status Register)6.页读取(Page Read)7.任意地址数据读取 (Random DATA Output)command 0x00->address 4字节(该页首地址)-> command 0x30->判别忙信号delay15ns->顺序读取或者command0x05->address 2字节(所要读的数据所在地址)->开始读出数据注意:注意图中的Column Address 对应Dout N的地址,0x50后是2字节在该页中的地址页写入(Page Program)command 0x80 -> address 4字节(该页首地址)->顺序写入最多2112字节->command 0x10结束写->判别忙信号->command 0x70读状态寄存器->IO0为0写成功任意地址数据写入(Random DATA Input)command 0x80 -> address 4字节(该页首地址)->顺序写入或者command0x85->写入数据->command0x10结束写入->判别忙信号->command0x70读状态->IO0为0写成功复制写入(Copy-Back Program)这个模式下,可以不用外部存储介质,直接在芯片内部快速准确地完成数据的复制重写入。

NandFlash驱动(实现初始化以及读操作)

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 }。

NAND flash读写擦除操作

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以页为单位读写数据,而以块为单位擦除数据。

ARM9(S3C2440)之九nand flash的读写操作

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 读写操作

NAND Flash 读写操作

NAND Flash 读写操作(三)2009-03-26 13:02Fisrt part :NAND flash和NOR 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 和 NOR flash的区别》Second part:NAND Flash结构与驱动分析一、NAND flash的物理组成NAND Flash 的数据是以bit的方式保存在memory cell,一般来说,一个cell 中只能存储一个bit。

这些cell 以8个或者16个为单位,连成bit line,形成所谓的byte(x8)/word(x16),这就是NAND Device的位宽。

这些Line会再组成Page,(NAND Flash 有多种结构,我使用的NAND Flash 是K9F1208,下面内容针对三星的K9F1208U0M),每页528Bytes(512byte(MainArea)+16byte(Spare Area)),每32个page形成一个Block(32*528B)。

具体一片flash上有多少个Block视需要所定。

我所使用的三星k9f1208U0M具有4096个block,故总容量为4096*(32*528B)=66MB,但是其中的2MB是用来保存ECC校验码等额外数据的,故实际中可使用的为64MB。

怎么看时序图--nand 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 读写(基本操作)

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数据存储规则与数据读写方法

谈到Nand Flash的数据存储方式,关于NAND Flash的数据读写方法方面的文章不多,这篇文章详细讲述了Nand Flash数据存储方式和数据读写方法,并用具体的芯片为例作了详细的解释。

NAND Flash 的数据是以bit 的方式保存在memory cell,一般来说,一个cell 中只能存储一个bit。

这些cell 以8 个或者16 个为单位,连成bit line,形成所谓的byte(x8)/word(x16),这就是NAND Device 的位宽。

这些Line 会再组成Page,(Nand Flash 有多种结构,我使用的Nand Flash 是K9F1208,下面内容针对三星的K9F1208U0M),每页528Byte,每32 个page 形成一个Block,Sizeof(block)=16kByte 。

1 block=16kbyte,512Mbit=64Mbyte,Numberof(block)=4096 1block=32page, 1page=528byte=512byte(Main Area)+16byte(Spare Area)Nand flash 以页为单位读写数据,而以块为单位擦除数据。

按照这样的组织方式可以形成所谓的三类地址:--Block Address -- Page Address --Column Address 。

对于NAND Flash 来讲,地址和命令只能在I/O[7:0]上传递,数据宽度是8 位。

512byte需要9bit来表示,对于528byte系列的NAND,这512byte被分成1st half和2nd half,各自的访问由地址指针命令来选择,A[7:0]就是所谓的column address。

32 个page 需要5bit 来表示,占用A[13:9],即该page 在块内的相对地址。

Block的地址是由A14 以上的bit 来表示,例如512Mb 的NAND,共4096block,因此,需要12 个bit 来表示,即A[25:14],如果是1Gbit 的528byte/page的NAND Flash,则block address用A[26:24]表示。

NAND flash读写擦除操作

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以页为单位读写数据,而以块为单位擦除数据。

NAND_FLASH_内存详解与读写寻址方式

NAND_FLASH_内存详解与读写寻址方式

NAND_FLASH_内存详解与读写寻址⽅式⼀、内存详解NAND闪存阵列分为⼀系列128kB的区块(block),这些区块是 NAND器件中最⼩的可擦除实体。

擦除⼀个区块就是把所有的位(bit)设置为"1"(⽽所有字节(byte)设置为FFh)。

有必要通过编程,将已擦除的位从"1"变为"0"。

最⼩的编程实体是字节(byte)。

⼀些NOR闪存能同时执⾏读写操作(见下图1)。

虽然NAND不能同时执⾏读写操作,它可以采⽤称为"映射(shadowing)"的⽅法,在系统级实现这⼀点。

这种⽅法在个⼈电脑上已经沿⽤多年,即将BIOS从速率较低的ROM加载到速率较⾼的RAM上。

NAND的效率较⾼,是因为NAND串中没有⾦属触点。

NAND闪存单元的⼤⼩⽐NOR要⼩(4F2:10F2)的原因,是NOR的每⼀个单元都需要独⽴的⾦属触点。

NAND与硬盘驱动器类似,基于扇区(页),适合于存储连续的数据,如图⽚、⾳频或个⼈电脑数据。

虽然通过把数据映射到RAM上,能在系统级实现随机存取,但是,这样做需要额外的RAM存储空间。

此外,跟硬盘⼀样,NAND器件存在坏的扇区,需要纠错码(ECC)来维持数据的完整性。

存储单元⾯积越⼩,裸⽚的⾯积也就越⼩。

在这种情况下,NAND就能够为当今的低成本消费市场提供存储容量更⼤的闪存产品。

NAND闪存⽤于⼏乎所有可擦除的存储卡。

NAND的复⽤接⼝为所有最新的器件和密度都提供了⼀种相似的引脚输出。

这种引脚输出使得设计⼯程师⽆须改变电路板的硬件设计,就能从更⼩的密度移植到更⼤密度的设计上。

NAND与NOR闪存⽐较NAND闪存的优点在于写(编程)和擦除操作的速率快,⽽NOR的优点是具有随机存取和对字节执⾏写(编程)操作的能⼒(见下图图2)。

NOR的随机存取能⼒⽀持直接代码执⾏(XiP),⽽这是嵌⼊式应⽤经常需要的⼀个功能。

Nand Flash的读写操作

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进行容量的计算。

nor_flash_读写过程

nor_flash_读写过程

nor_flash_读写过程一、结构分析S3C2410处理器集成了8位NandFlash控制器。

目前市场上常见的8位NandFlash有三星公司的k9f1208、k9f1g08、k9f2g08等。

k9f1208、k9f1g08、k9f2g08的数据页大小分别为512Byte、2kByte、2kByte。

它们在寻址方式上有一定差异,所以程序代码并不通用。

本文以S3C2410处理器和k9f1208系统为例,讲述Nan dFlash的读写方法。

NandFlash的数据是以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)=64MbyteNandFlash以页为单位读写数据,而以块为单位擦除数据。

按照k9f1208的组织方式可以分四类地址:Col umn Address、halfpage pointer、Page Address 、Block Address。

A[0:25]表示数据在64M 空间中的地址。

Column Address表示数据在半页中的地址,大小范围0~255,用A[0:7]表示;halfpage pointer表示半页在整页中的位置,即在0~255空间还是在256~511空间,用A[8]表示;Page Address表示页在块中的地址,大小范围0~31,用A[13:9]表示;Block Address表示块在flash中的位置,大小范围0~4095,A[25:14] 表示;二、读操作过程K9f1208的寻址分为4个cycle。

STM32单片机对NAND Flash的读写以及在ASF中的使用

STM32单片机对NAND Flash的读写以及在ASF中的使用

STM32单片机对NAND Flash的读写以及在ASF中的使用
这次大概介绍了一下NAND Flash,以及在ASF中使用它的方法。

一、接线
这个开发板搭载了一个256 MB,8位的NAND Flash(MT29F2G08ABAEA)。

引脚接线如下:
偷个懒,直接上引脚复用的图。

其中PC14表明该NAND FLASH需要作为SMC的外设0使用。

通过使用NANDOE和NANDWE引脚说明需要使用芯片的NAND Flash控制逻辑。

另外,PC18复用为输入引脚,用以查询芯片的状态。

二、NAND Flash
组织结构与寻址
NAND Flash的容量较大。

整片Flash分为若干个块(Block),每个Block分为若干个页(Page)。

在每个页中,除了数据区域,也包含若干“多余”的区域,用来进行ECC等操作。

在进行擦除操作是,基本单位是“块”;而编程的基本单位是“页”。

另外,NAND Flash的物理特性决定了其在编程时,每个bit只能从1变成0。

所以在写入前,必须先对该块进行擦除(擦除时把所有位置为1)。

该Flash的结构如下(忽略plane):
在寻址时,是通过行地址和列地址指定储存单元的。

其中行地址表示页的编号,列地址表示指定在目标地址在该页的位置。

读写时序
因为没有地址线,所以读写较为复杂。

读写时,需要先发送相应操作命令,然后发送地址,才能进行数据传输。

一个简单的“页读取”操作时序图如下:。

nadn的读写过程

nadn的读写过程

nadn的读写过程
NAND Flash是一种非易失性存储器,用于存储数据。

它的读取是以一次读取一块的形式来进行的,通常是一次读取512个字节。

下面是NAND Flash的读写过程:- 写入数据:在写入数据之前,需要先进行擦除操作。

擦除操作会将整个芯片上的数据全部清除,然后才能写入新的数据。

- 读取数据:NAND Flash的读取是以块为单位进行的,一次读取512个字节。

这种读取方式比NOR Flash慢,但是比其他类型的存储设备更快。

NAND Flash的读写过程受到许多因素的影响,如芯片的质量、工作温度、读取速度等。

在使用NAND Flash时,需要注意这些因素,以确保数据的安全性和可靠性。

nandflash基础——读写擦操作

nandflash基础——读写擦操作
状态为0的cell被program的cell的vth均大于0状态为1的cell被erase的cell的vth均小于1且所有cell的vth有一个上限所以对其他cell施加一个能确保导通的vpass电压对要读数据的cell加一个电压值在两种状态之间的vread如果该cell为0则不会形成source到drain端的通路在bitline上检测不到电流反之可以检测到电流
以上过程只是针对SLC cell,对于MLC,TLC,具有更多的状态,读的过程也更加复杂。
参考
Inside NAND Flash Memories
nandflash基础——读写擦操作 Nhomakorabea当对一个cell进行读操作时,对相应的wordline施加Vread电压,对其他wordline施加Vpass电压,如上图所示。状态为“0”的cell(被program的cell)的Vth均大于0,状态为“1”的cell(被erase的cell)的Vth均小于1,且所有cell的Vth有一个上限,所以对其他cell施加一个能确保导通的Vpass电压, 对要读数据的cell加一个电压值在两种状态之间的Vread,如果该cell为“0”,则不会形成source到drain端的通路,在bitline上检测不到电流,反之可以检测到电流。电流的检测是通过sense amplifier实现的。

nand flash工作原理

nand flash工作原理

nand flash工作原理NAND Flash是一种非易失性存储设备,常用于闪存卡、固态硬盘等产品中。

它的工作原理如下:1. 基本结构:NAND Flash由许多存储单元组成,每个存储单元可以存储一个或多个比特的数据。

存储单元被分为页(page)和块(block),每页通常为2KB或4KB,每块通常为128KB或256KB。

2. 存储原理:NAND Flash使用电荷量来存储数据。

每个存储单元中的栅极上存储了一定数量的电子,表示为1或0。

当需要读取或写入数据时,通过对栅极施加适当的电压来控制电荷量。

3. 读取操作:读取操作通过施加一定的电压来检测栅极上的电荷量。

如果电荷量高于某个阈值,表示存储单元为1;如果低于阈值,表示存储单元为0。

4. 写入操作:写入操作分为擦除和编程两个步骤。

- 擦除:Flash存储单元只能整体擦除,即擦除一个块中的所有页。

擦除操作通过施加高压来清空存储单元中的电荷。

- 编程:编程操作将数据写入存储单元。

首先,通过施加适当的电压来擦除存储单元;然后,根据数据位的值,通过施加不同的电压将电荷送入或排出存储单元。

写入操作将改变存储单元中的电荷量,从而改变存储数据的状态。

5. 坏块管理:由于NAND Flash存储单元的不可靠性,会出现一些坏块。

为了保证数据的可靠性和存储空间的利用率,NAND Flash使用坏块管理算法来跳过坏块,将其标记并不再使用。

总之,NAND Flash通过控制存储单元中的电荷量来存储数据,具有读取速度快、电源断电后数据仍能保存的特点,广泛应用于各种存储设备中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第 256 个 byte 开 始读取此页,那么我将这样发送命令串 column_addr=256; NF_CMD=0x01; 从 2nd half 开始读取 NF_ADDR=column_addr&0xff; 1st Cycle NF_ADDR=page_address&0xff; 2nd.Cycle NF_ADDR=(page_address>>8)&0xff; 3rd.Cycle NF_ADDR=(page_address>>16)&0xff; 4th.Cycle 其中 NF_CMD 和 NF_ADDR 分别是 NandFlash 的命令寄存器和地址寄存器的地址解引用, 我一般这样定义它们, #define rNFCMD (*(volatile unsigned char *)0x4e000004) //NADD Flash command #define rNFADDR (*(volatile unsigned char *)0x4e000008) //NAND Flash address 事实上,当 NF_CMD=0x01 时,地址寄存器中的第 8 位(A8)将被设置为 1(如上文分 析,A8 位不在我们传递的地址中,这个位其实就是硬件电路根据 01h 或是 00h 这两个命令 来置高位或是置低位) ,这样我们传递 column_addr 的值 256 随然由于数据溢出变为 1,但 A8 位已经由于 NF_CMD =0x01 的关系被置为 1 了, 所以我们传到地址寄存器里的值变成了 A0 1 A1 0 A2 0 A3 A4 0 0 A5 A6 0 0 A7 0 A8 1
需要注意的是, 对于 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,以此类推,每
Nand Flash 的寻址
Nand Flash 的地址寄存器把一个完整的 Nand Flash 地址分解成 Column Address 与 Page Address.进行寻址。 Column Address: 列地址。Column Address 其实就是指定 Page 上的某个 Byte,指定这个 Byte 其实也就是指定此页的读写起始地址。 Page Address:页地址。由于页地址总是以 512Bytes 对齐的,所以它的低 9 位总是 0。确 定读写操作是在 Flash 上的哪个页进行的。 Read1 命令 当我们得到一个 Nand Flash 地址 src_addr 时我们可以这样分解出 Column Address 和 Page Address column_addr = src_addr%512; // column address page_address = (src_addr>>9); // page address 也可以这么认为,一个 Nand Flash 地址的 A0~A7 是它的 column_addr,A9~A25 是它的 Page Address。(注意地址位 A8 并没有出现,也就是 A8 被忽略,在下面你将了解到这是什 么原因) Read1 命令的操作分为 4 个 Cycle,发送完读命令 00h 或 01h(00h 与 01h 的区别请见下 文描述) 之后将分 4 个 Cycle 发送参数, 1st.Cycle 是 发送 Column Address。 2nd.Cycle ,3rd.Cycle 和 4th.Cycle 则是指定 Page Address(每次向地址寄存器发送的数据只能是 8 位,所以 17 位 的 Page Address 必须分成 3 次进行发送 Read1 的命令里面出现了两个命令选项,分别是 00h 和 01h。这里出现了两个读命是否令 你意识到什么呢?是的, 00h 是用于读写 1st half 的命令, 而 01h 是用于读取 2nd half 的命令。 现在我可以结合上图给你说明为什么 K9F1208U0B 的 DataField 被分为 2 个 half 了。 如上文我所提及的, Read1 的 1st.Cycle 是发送 Column Address, 假设我现在指定的 Column Address 是 0,那么读操作将从此页的第 0 号 Byte 开始一直读取到此页的最后一个 Byte(包 括 Spare Field),如果我指定的 Column Address 是 127,情况也与前面一样,但不知道你发 现没有,用于传递 Column Address 的数据线有 8 条(I/O0~I/O7,对应 A0~A7,这也是 A8 为什么不出现在我们传递的地址位中) ,也就是说我们能够指定的 Column Address 范围为 0~255,但不要忘了,1 个 Page 的 DataField 是由 512 个 Byte 组成的,假设现在我要指定读 命令从第 256 个字节处 开始读取此页,那将会发生什么情景?我必须把 Column Address 设 置为 256,但 Column Address 最大只能是 255,这就造成数据溢出。 。 。正是因为这个原因我 们才把 Data Field 分为两个半区,当要读取的起始地址(Column Address)在 0~255 内时我 们用 00h 命令,当读取的起始地址是在 256~511 时,则使用 01h 命令.假设现在我要指定从
这 8 个位所表示的正好是 256,这样读操作将从此页的第 256 号 byte(2nd half 的第 0 号 byte)开始读取数据。 nand_flash.c 中包含 3 个函数 void nf_reset(void); void nf_init(void); void nf_read(unsigned int src_addr,unsigned char *desc_addr,int size); nf_reset()将被 nf_init()调用。nf_init()是 nand_flash 的初始化函数,在对 nand flash 进行任 何操作之前,nf_init()必须被调用。 nf_read(unsigned int src_addr,unsigned char *desc_addr,int size);为读函数, src_addr 是 nand flash 上的地址,desc_addr 是内存地址,size 是读取文件的长度。 在 nf_reset 和 nf_read 函数中存在两个宏 NF_nFCE_L(); NF_nFCE_H(); 你可以看到当每次对 Nand Flash 进行操作之前 NF_nFCE_L()必定被调用,操作结束之时 NF_nFCE_H()必定被调用。这两个宏用于启动和关闭 Flash 芯片的工作(片选/取消片选) 。 至于 nf_reset()中的 rNFCONF=(1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1< <0); 这一行代码是对 NandFlash 的控制寄存器进行初始化配置,rNFCONF 是 Nand Flash 的配置 寄存器,各个位的具体功能请参阅 s3c2410 数据手册。 现在举一个例子,假设我要从 Nand Flash 中的第 5000 字节处开始读取 1024 个字节到内 存的 0x30000000 处,我们这样调用 read 函数 nf_read(5000, 0x30000000,1024); 我们来分析 5000 这个 src_addr. 根据 column_addr=src_addr%512;
NandFlash 的读写操作
作者:蔡于清 (约有修改) 正如硬盘的盘片被分为磁道, 每个磁道又分为若干扇区, 一块 nand flash 也分为若干 block, 每个 block 分为如干 page。一般而言,block、page 之间的关系随着芯片的不同而不同,典 型的分配是这样的: 1block = 32page 1 page = 512bytes(datafield) + 16bytes(oob)
page_address=(src_addr>>9); 我们可得出 column_addr=5000%512=392 page_address=(5000>>9)=9 于是我们可以知道 5000 这个地址是在第 9 页的第 392 个字节处,于是我们的 nf_read 函 数将这样发送命令和参数 column_addr=5000%512; >page_address=(5000>>9); NF_CMD=0x01; 从 2nd half 开始读取 NF_ADDR= column_addr &0xff; 1st Cycle NF_ADDR=page_address&0xff; 2nd.Cycle NF_ADDR=(page_address>>8)&0xff; 3rd.Cycle NF_ADDR=(page_address>>16)&0xff; 4th.Cycle 向 NandFlash 的命令寄存器和地址寄存器发送完以上命令和参数之后 , 我们就可以从 rNFDATA 寄存器(NandFlash 数据寄存器)读取数据了. 我用下面的代码进行数据的读取. for(i=column_addr;i<512;i++) { *buf++=NF_RDDATA(); } 每当读取完一个 Page 之后,数据指针会落在下一个 Page 的 0 号 Column(0 号 Byte).
相关文档
最新文档