对S3C2440读取NAND Flash的总结

发布者:RadiantEyes最新更新时间:2016-07-11 来源: eefocus关键字:S3C2440  NAND  FLASH 手机看文章 扫描二维码
随时随地手机看文章
  在网上找了一些资料,又结合自己的经历谈一下我对NAND Flash 的了解。

S3C2440 板的Nand Flash 支持由两部分组成:Nand Flash 控制器(集成在S3C2440 CPU)和Nand Flash 存储芯片(K9F1208U0B)两大部分组成。当要访问Nand Flash中的数据时,必须通过Nand Flash控制器发送命令才能完成。所以, Nand Flash相当于S3C2440的一个外设,而不位于它的内存地址区. 

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,数据存储容量为64MB ,采用块页式存储管理。一共有4096个block(块),每个block有32个page(页),每个page有 528Byte。 

1block 32page, 1page=528byte=512byte(Main Area)+16byte(Spare Area) 

Nand flash 以页为单位读写数据,而以块为单位擦除数据。

按照这样的组织方式可以形成所谓的三类地址: 

--Block Address -- Page Address  --Column Address 

 

对于NAND Flash 来讲,8 个I/O 引脚充当数据、地址、命令的复用端口。地址和命令只能在I/O[7:0]上传递,数据宽度是8 位。 

512byte需要9bit来表示,对于528byte系列的NAND,这512byte被分成 1st half 和 2nd half ,最后16 个字节 (又称OOB)用于Nand Flash 命令执行完后设置状态用,各自的访问由地址指针命令来选择,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:14]表示。

 

NAND Flash 的地址表示为: 

Block Address|Page Address in block|halfpage pointer|Column Address 

地址传送顺序是Column Address,Page Address,Block Address。 

由于地址只能在I/O[7:0]上传递,因此,必须传递多次。 例如,对于512Mbit x8 的NAND flash,地址范围是0-0x3FF FFFF,只要是这个范围内的数值表示的地址都是有效的。以NAND_ADDR 为例: 第1 步是传递column address,就是NAND_ADDR[7:0]给相应的寄存器,即可传递到I/O[7:0]上,而halfpage pointer 即bit8 是由操作指令决定的,即指令决定在哪个halfpage 上进行读写。而真正的bit8 的值是don't care 的。 第2 步就是将NAND_ADDR[16:9]传到I/O[7:0]上。第3步将NAND_ADDR[24:17]放到I/O 上。第4步需要将NAND_ADDR[25]放到I/O 上 因此,整个地址传递过程需要4 步才能完成,即4-step addressing。 如果NAND Flash 的容量是256Mbit 以下,那么,block adress 最高位只到bit24,因此寻址只需要3 步。下面,就x16 (16位)的NAND flash 器件稍微进行一下说明。由于一个page 的main area 的容量为256word,仍相当于512byte。但是,这个时候没有所谓 的1st halfpage 和2nd halfpage 之分了,所以,bit8就变得没有意义了,也就是这个时候 bit8 完全不用管,地址传递仍然和x8 器件相同。除了,这一点之外,x16 的NAND使用方法和 x8 的使用方法完全相同。

正如硬盘的盘片被分为磁道,每个磁道又分为若干扇区,一块nand flash也分为若干block,每个block分为如干page。一般而言,block、page之间的关系随着芯片的不同而不同,典型的分配是这样的:
1block 32page
1page 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进行容量的计算。

读命令有两个,分别是 Read1,Read2其中Read1用于读取Data Field的数据,而Read2则是用于读取Spare Field的数据。对于Nand Flash来说,读操作的最小操作单位为Page,也就是说当我们给定了读取的起始位置后,读操作将从该位置开始,连续读取到本Page的最后一个 Byte为止(可以包括Spare Field)

Nand Flash的寻址
    Nand Flash的地址寄存器把一个完整的Nand Flash地址分解成Column Address与Page Address.进行寻址。

Column Address: 列地址。Column Address其实就是指定Page上的某个Byte,指定这个Byte其实也就是指定此页的读写起始地址。

Paage Address:页地址。由于页地址总是以512Bytes对齐的,所以它的低9位总是0。确定读写操作是在Flash上的哪个页进行的。

Read1命令

当我们得到一个Nand Flash地址addr时我们可以这样分解出Column Address和Page Address
column_addr=src_addrQ2;    // column address
page_address=(src_addr>>9);  // page address

也可以这么认为,一个Nand Flash地址的src_addr[7,0]是它的column_addr,addr[25,9]是它的Page Address。(注意地址位src_addr[8]并没有出现,也就是addr[8] 被忽略,在下面你将了解到这是什么原因)

 

Read1 命令的操作发送完读命令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,对应addr[7,0],这也是addr[8]为什么不出现在我们传递的地址位中),也就是说我们能够指定的 Column Address范围为0-255,但不要忘了,1个Page的Data Field是由512个Byte组成的,假设现在我要指定读命令从第256个字节处开始读取此页,那将会发生什么情景?我必须把Column Address设置为256,但Column Address最大只能是255,这就造成数据溢出。正是因为这个原因我们才把Data Field分为两个半区,当要读取的起始地址(Column Address)在0-255内时我们用00h命令,当读取的起始地址是在256-511时,则使用01h命令.假设现在我要指定从第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=0x30;

事实上,当NF_CMD=0x01时,NAND Flash 地址寄存器中的第8位(A8)将被设置为1(如上文分析,A8位不在我们传递的地址中,这个位其实就是硬件电路根据 01h或是00h这两个命令来置高位或是置低位),这样我们传递column_addr的值256随然由于数据溢出变为1,但A8位已经由于NF_CMD =0x01的关系被置为1了。这8个位所表示的正好是256,这样读操作将从此页的第256号byte(2nd half的第0号byte)开始读取数据。 

在对NAND Flash进行任何操作之前,NAND Flash 必须被初始化。向NandFlash的命令寄存器和地址寄存器发送完以上命令和参数之后,我们就可以从rNFDATA寄存器(NandFlash数据寄存器)读取数据了.
我用下面的代码进行数据的读取.
for(i=column_addr;i<512;i++)
{
        *buf++=NF_RDDATA();
}

每当读取完一个Page之后,数据指针会落在下一个Page的0号Column(0号Byte).

 

存储操作特点: 
1. 擦除操作的最小单位是块。 
2. Nand Flash 芯片每一位(bit)只能从1 变为0 ,而不能从0 变为 1,所以在对其进行写入操作之前要一定将相应块擦除(擦除即是将相应块得位全部变为 1). 
3. OOB 部分的第六字节(即517 字节)标志是否是坏块,如果不是坏块该值为FF ,否则为坏块。 
4. 除OOB 第六字节外,通常至少把OOB 的前3 个字节存放Nand Flash 硬件ECC 码(关于硬件ECC 码请参看 Nandflash 控制器一节). 

 

重要芯片引脚功能 
    I/O0-I/O7:复用引脚。可以通过它向nand flash 芯片输入数据、地址、nand flash 命令以及输出数据和操作状态信息。 
    CLE(Command Latch Enable):  命令锁存允许 
    ALE(Address Lactch Enable): 地址锁存允许 
    -CE: 芯片选择     
    -RE: 读允许 
    -WE: 写允许 
    -WP: 在写或擦除期间,提供写保护 
    R/-B: 读/忙输出 

 
Nand Flash 控制器中的硬件 ECC 介绍 

ECC产生方法    

ECC 是用于对存储器之间传送数据正确进行校验的一种算法,分硬件ECC 和软件ECC 算法两种,在S3C2440 的Nand Flash 控制器中实现了由硬件电路 (ECC 生成器)实现的硬件ECC 。 

ECC生成器工作过程 
   当写入数据到Nand flash 存储空间时, ECC 生成器会在写入数据完毕后自动生成ECC 码,将其放入到ECC0-ECC2 。当读出数据时Nand Flash 同样会在读数据完毕后,自动生成ECC码将其放到ECC0-ECC2 当中。 

ECC 的运用 

当写入数据时,可以在每页写完数据后将产生的ECC 码放入到OOB 指定的位置(Byte 6)去,这样就完成了ECC 码的存储。这样当读出该页数据时,将所需数据以及整个OOB 读出,然后将指定位置的ECC 码与读出数据后在ECC0 -ECC1 的实际产生的ECC 码进行对比,如果相等则读出正确,若不相等则读取错误需要进行重读。

 

  操作命令字介绍

操作NAND FLASH时,先传输命令,接着输出地址,最后读/写数据,期间还要检查FLASH的状态。具体的命令字见下表。

对S3C2440读取NAND <wbr>Flash的总结
  1、Read命令字为00h,30h。
对S3C2440读取NAND <wbr>Flash的总结

  如上图,当发出00h命令后,接着4个字节的地址序列,然后再发出30h命令,接着,就可以读出数据了,当发送完30h后,可以检测R/B引脚看是否准备好了,如果准备好,就可以读出数据。

  2、Reset

  命令字:FFh

  当向芯片发送FFh命令时,可以复位芯片,如果芯片正在处于读、写、擦除状态,复位命令会终止这些命令。

3、Page Program

  命令字:80h,10h.

  NAND FLASH的写操作一般是以页为单位进行的,因此才会叫Page Program,但是也支持一个字以上的(包括一个字)连续写操作。开始发出80h命令,接着发送5个字节的地址序列,然后向FLASH发送数据,最大为一页大小,最后发送10h命令启动烧写,此时FLASH内部会自动完成写、校验操作。发送10h后,可以通过读状态命令70h(见下文)获知写操作是否完成,是否成功。

4、Copy-Back Program

  命令字:00h、8Ah、10h.

  此命令用于将一页复制到同一层的另外一页,它省去了读出数据、将数据重新载入FLASH的过程,使得效率大大提高。

  关于层:NAND FLASH有层的概念,K9F2G08分为两层,每层包括了1024个块,如下图,因此上面的命令表中才会有two-plane的命令,这些命令可以使得在两个层间完成操作,这样程序员就很方便的使用一个命令完成更多的操作,其命令格式和单层操作的类似,详见手册。但K9F2G08R0A不支持两层命令。

对S3C2440读取NAND <wbr>Flash的总结

对S3C2440读取NAND <wbr>Flash的总结

  上图清晰的告诉我们,开始发送00h和源地址,当发送35h之后,芯片将一页大小的数据读入到内部寄存器,接着,我们发送85h和目的地址序列,最后发送10h启动。最后,我们可以使用70h/7Bh检测是否完成,是否成功。

  5、Block Erase

  命令字:60h、D0h

  擦除操作是以块为单位的,也就是128K。开始发出60h,然后发出3个地址序列仅行地址,最好发出D0h。具体操作,如下图。

对S3C2440读取NAND <wbr>Flash的总结

  6、Read Status

    命令字:70h

    读状态命令可以读出芯片的状态寄存器,查看是否读、写操作是否完成、是否成功。具体的状态见下图。

对S3C2440读取NAND <wbr>Flash的总结

  S3C2440的NAND FLASH控制器介绍

  看了上面的命令时序图,大家肯定认为对NAND FLASH的操作比较复杂,因此S3C2440为了简化操作,为我们提供了几个寄存器,比如NFCMD寄存器,就是NAND FLASH命令寄存器,如果我们需要读命令,直接向此寄存器写00h、30h即可。

  基本操作步骤:

  1.设置NFCONF和NFCONT寄存器,配置NAND FLASH;

  2.向NFCMD寄存器写入命令;

  3.向NFADDR寄存器写入地址;

  4.读/写数据,通过NFSTAT检测NAND FLASH的状态,读R/nB信号以确定是否完成操作,是否成功。

  主要寄存器:

  (NFCONF) 

  配置寄存器,设置NAND FLASH的时序参考TACLS、TWRPH0、TWRPH1,这三个参数见下面时序图;设置位宽度;还包括一些只读位,用来批示是否支持其它大小的页。

  TACLS:表示CLT/ALE的建立时间(setup time)。

  TWRPH0:表示CLE/ALE的持续时间。

  TWRPH1:表示CLE/ALE的维持时间(hold time)。

对S3C2440读取NAND <wbr>Flash的总结

对S3C2440读取NAND <wbr>Flash的总结

NFCONT

  用来使能/禁止NAND FLASH控制器、使能/禁止控制引脚信号nFCE、初始化ECC。

  NFCMD

  命令寄存器,用来向其写入命令。

  NFADDR

  地址寄存器,用来向其写入地址。

  NFDATA

  数据寄存器,用来读、写数据使用,只用到8位。

  NFSTAT

  状态寄存器,只用到一位,0:busy;1:ready。

   NFECC

  校验寄存器,ECC 校验寄存器 

  NAND FLASH的操作(以读为例) 

  

  1、设置NFCONF和NFCONT

  NFCONF主要是设置TACLS、TWRPH0、TWRPH1三个时间参数。根据手册的参数表,见下图:

对S3C2440读取NAND <wbr>Flash的总结

  三个参数只有最小值 MIN,没有最大值,因此,只要参数大于表格中的数即可,这里涉及时钟的一些概念,这里直接将参数告诉大家:

  TACLS=1;TWRPH0=4;TWRPH1=0。

  NFCONT设置为:NFCONT=(1<<4)|(1<<1)|(1<<0) 表示使能NAND FLASH控制器、禁止控制引脚信号nFCE、初始化ECC。

关键字:S3C2440  NAND  FLASH 引用地址:对S3C2440读取NAND Flash的总结

上一篇:arm片上总线:AHB and APB
下一篇:S3C2440 Mini 2440 DMA方式实现Uart(串口)通信

推荐阅读最新更新时间:2024-03-16 14:59

产业链消息人士:NAND闪存控制器供应依旧紧张
4月20日消息,据国外媒体报道,3月份曾有产业链人士透露,虽然NAND闪存仍是供过于求,但由于控制芯片严重短缺,将导致固态硬盘的价格上涨,NAND闪存的合约价格在二季度将因此而趋于稳定,并开始上涨。 而在最新的报道中,英文媒体称NAND闪存控制器的供应依旧紧张。 英文媒体是援引产业链消息人士的透露,报道NAND闪存控制器供应紧张的。这一产业链的消息人士还透露,NAND闪存控制器的供应依旧紧张,可能会影响内嵌存储设备和固态硬盘的出货。 从供求关系来看,如果NAND闪存控制器真如产业链消息人士透露的那样供应依旧紧张,影响到了内嵌存储设备和固态硬盘的出货,最终可能还会影响相关产品的价格。
[半导体设计/制造]
产业链消息人士:<font color='red'>NAND</font>闪存控制器供应依旧紧张
基于OHCI协议的S3C2440 USB Host Driver之协议介绍(三)
OpenHCI通过两级仲裁在端点中选择哪一个服务。第一级是表级。每一个需要服务的端点类型在相应的类型表里。HC选择服务哪一个表。而在表内,端点都有差不多公平的机会被访问到。HCD通知设置HcPeriodicStart限制从帧开始到开始要服务周期表的时间。周期表服务时,当前帧下,中断表优先于同步表。当周期表服务完,控制和批量有可能会接着服务。 ED作为锚点,供一列TD依附在其上。当HC访问ED且找到一个有效的TD地址,HC完成与指定ED的单笔事务,TD表明了内存地址。 当一个TD所定义的所有数据都传输完,TD从他的ED上解下,且连到完成队列。 ED描述符 FA就是设备地址 EN就是端点地址 D为方向 S
[单片机]
基于OHCI协议的<font color='red'>S3C2440</font> USB Host Driver之协议介绍(三)
S3C2440的LCD编程
S3C2440的LCD编程 1. LCD工作的硬件需求:   要使一块LCD正常的显示文字或图像,不仅需要LCD驱动器,而且还需要相应的LCD控制器。在通常情况下,生产厂商把LCD驱动器会以 COF/COG的 形式与LCD玻璃基板制作在一起,而LCD控制器则是由外部的电路来实现,现在很多的MCU内部都集成了LCD控制器,如S3C2410/2440等。通 过LCD控制器就可以产生LCD驱动器所需要的控制信号来控制STN/TFT屏了。 2. S3C2440内部LCD控制器结构图: 我们根据数据手册来描述一下这个集成在S3C2440内部的LCD控制器: a:LCD控制器由REGBANK、LCDCDMA、TIMEGEN、VID
[单片机]
<font color='red'>S3C2440</font>的LCD编程
东芝营益飙升近80% 将加码投资Flash
东芝(Toshiba)9日公布财报,受惠于存储器需求畅旺,营益飙升将近80%。该公司并宣布将加码投资存储器。 法新社、路透社、金融时报报导,东芝发布本财年第二季(7~9月)财报,营收年增2.4%至1.24万亿日圆,营益飙升76%至1,351亿日圆(12亿美元),高于路透访调估计的1,245日圆。不过该季仍呈现亏损,净损1,001亿日圆。 东芝营益大增,主因存储器表现强劲,不过东芝已经同意出售半导体事业子公司“东芝存储器”(TMC)给予贝恩资本和SK海力士等集团,代价为2万亿日圆(约18亿美元)。目前出售案仍在审查当中,东芝希望能在明年三月前完成交易,避免从东京证交所下市。 尽管“摇钱树”TMC即将转手,东芝宣布TMC计
[半导体设计/制造]
谈谈BGA芯片S3C2440的焊接
刚开始接触BGA的芯片,大家可能觉得头大,第一是要布四层以上,出了问题不好查找,再就是过孔与线宽都较小,容易出现问题,其实大可不必这样担心,现在的制板技术是一点问题没有的,精度比你想象的要高的多。 最近使用2440做了个项目,布了个四层板,制板后一次就成功了,关键是审查的时间比较长,参看了别人的电路图,再就是布板时,每根线都查清楚了;但是板子做出来了,焊接可能是大家面临的一个大问题,找SMT厂,确实比较贵,我找过4片要了300元,还是说以后量产的可能。 能不能自己焊呢?当然可以,我给你说的方法可以说成功率100%,别的我没有焊过,2440焊过多次,下面就说一下我的焊接办法: 第一、选择热风枪;我使用的是安泰信850
[单片机]
群联潘健成:未来五年 NAND供不应求
内存股王群联电子昨(27)日举行股东临时会补选一席董事,由日商东芝内存株式会社(TMC)当选。 在市场供需方面,群联董事长潘健成乐观表示,未来五年,储存型闪存(NAND Flash)将持续供不应求。 台湾东芝先进半导体因集团组织调整,今年8月1日辞去群联董事,群联昨日召开股东临时会补选,并顺利由东芝内存株式会社当选。 群联董事长潘健成谈话重点 图/经济日报提供 潘健成表示,东芝内存主导负责东芝的全球半导体事业,东芝已将群联股权移转给东芝内存;而群联与东芝间不仅相互投资,也透过合作互补,强化技术,双方关系将比过去15年更加紧密,在产业的竞争力也更强大。 针对未来产业景气,潘健成表示,五年前很难想象手机的容量会到256GB,但今天
[半导体设计/制造]
群联潘健成:未来五年 <font color='red'>NAND</font>供不应求
嵌入式系统中的线性Flash文件系统设计
作者: WuYJ@263.net.cn 摘要:设计一种能够在典型嵌入式环境下应用的线性文件系统,为嵌入式系统Flash空间的管理提供一种非常有效的手段。它包装和通用文件系统类似的API接口,设计的实现独立于实时操作系统(RTOS)和具体的Flash典型,可方便移植到不同的嵌入式应用中。 在嵌入式系统中,为了便于对闪存(Flash)空间进行管理,会采用文件的形式来访问Flash。目前,可以购买到的Flash文件系统一般都是兼容DOS的文件系统(Flash File System,FFS),这对需要一个具有复杂的目录层次,并且DDS文件兼容的系统来说是必要的;但是对大多数的嵌入式应用来说,这种文件系统太过奢侈。笔者在参与嵌入式系
[嵌入式]
JTAG口及其对Flash的在线编程
摘要:通过JTAG实现对Flash在线编程。首先,介绍JTAG的定义、结构及引脚的定义,并阐述JTAG状态机的工作原理。然后,介绍JTAG口的边界扫描寄存器,给出实现JTAG在线写Flash的电路,和如何通过JTAG实现Flash的编程及程序流程图。 关键词:JTAG Flash 在线编程 随着嵌入式技术的发展,在一些高端的掌上设备中,都使用了Flash芯片,如Compaq的iPAQ、联想的天祺系列等产品。但对于研发人员来说,在开发阶段需要大量的程序调试,就意味着要对Flash进行擦除和改写的工作,因此,如何对Flash进行在线编程是问题的关键所在。本文介绍一种通过JTAG对Flash进行的在线编程方法。 1 JTAG简介 JTAG
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved