外存——NandFlash芯片与S5PV210的NandFlash控制器

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

本文介绍了NandFlash芯片的接口、结构、常见操作,以及NandFlash控制器相关的内容。

一、NandFlash芯片的接口

值得一提的是,X210开发板虽然有NandFlash控制器,但并没有使用NandFlash芯片作为外存,而是使用inand芯片或者SD卡作为外存。这里之所以讲解NandFlash芯片的相关的内容,只不过是为了让内容更加完备。

1、NandFlash芯片的型号

以K9F2G08芯片为例:

  • K9F表示是三星公司的NandFlash系列;
  • 2G表示Nand的大小是2Gbit,即256MB;
  • 08表示Nand是8位的,即数据线有8根。

2、NandFlash芯片的数据位

Nand有8位数据位的,也有16位数据位的。Nand是并行接口。

Nand的数据线上传递的不一定全部是有效数据,也可能有命令、地址等。

3、NandFlash芯片的功能框图

(1)NandFlash的结构

可以看作一个矩阵式存储器。被分成一个个小块,每一小块可以存储一个bit位。

(2)Page(页)

NandFlash中可以被单次访问的最小单元叫做Page,即NandFlash进行一次读写至少要读写这么多内容,或者是这么多内容的整数倍。K9F2G08芯片中,Page的大小是2KB+64B,这说明要读写K9F2G08,每次至少要读写2KB或者n*2KB,即使只需要其中的一个字节。其中2KB是真正用来存储的,而64B是用来存储ECC数据、块坏标志。这就是我们说的典型的块设备,不过现在有些块设备为了方便,提供了一种random read模式,可以只读取1个字节。

(3)Block(块)

页往上还有一个“块”的概念,1个块等于若干个页,比如K9F2G08中1个块等于64页。

(4)Device

块往上是整个Nand芯片,叫做Device。一个Device有很多个Block,比如K9F2F08有2028个block,所以整个Device大小为2048×64×2K = 256MB。

(5)page与block的意义

块设备不能完全按字节访问而必须块访问,这是物理上的限制,而非人为设置的障碍。对于我们做软件的来说,只能去想办法适应硬件,不是想着超越硬件。在NandFlash中,Page是读写NandFlash的最小单位,Block是擦除NandFlash的最小单位。

(6)Nand芯片的组成:Nand存储颗粒+Nand接口电路

Nand存储颗粒就是纯粹的采用Nand原理的存储单元,类似于仓库;Nand接口电路用来管理存储颗粒,并且给外界提供一个统一的、Nand接口规格的访问接口。

Nand中有许多存储单元,每个单元都有自己的地址,所以Nand的地址是编排精确到字节的,但是实际读写却只能精确到页,所以Nand的很多操作都要求给的地址是页对齐的,比如2K、4K、512K等这样的地址,不能给3000B这样的地址。

Nand读写时地址传递是通过IO线发送的,因为地址有32位而IO只有8位,所以需要多个cycle才能发送完毕。一般的Nand都是4cycle或者5cycle发送地址(从这里把Nand分为了4cycle Nand和5cycle Nand)。

(7)总结

Nand芯片内部有存储空间,并且有电路来管理这些存储空间,向外部提供统一的Nand接口的访问规则。外部的SoC可以使用Nand接口时序来读写这个Nand存储芯片。理论上,外部SoC可以直接模拟Nand接口来读写Nand芯片,但因为nand接口对时序要求非常严格,而且时序很复杂,所以SoC一般都是通过专用的Nand控制器来操控Nand芯片。

二、NandFlash芯片的结构

1、NandFlash芯片的单元组织:page与block

(1)Nand的页和块设备(比如硬盘)的扇区是类似的。扇区最早在磁盘中是512字节,后来也有些高级硬盘扇区不是512字节而是1024字节/2048字节/4096字节等。Nand也是一样,不同的Nand的页的大小是不同的,也有512字节/1024字节/2048字节/4096字节等。Nand:页——>块;块设备:扇区——>块。

(2)不同的Nand芯片中,一个block等于多少page也是不定的。

(3)Nand的组织架构挺乱的,接口时序也不同,导致不同厂家的Nand芯片,或者同一个厂家的不同系列型号的nand接口也不一样。一旦升级容量或者换芯片系列则硬件要重新做,软件也要重新移植。

2、带内数据和带外数据

(1)带内数据和带外数据

Nand的每个页由2部分组成,这2部分各自都有一定的存储空间。比如K9F2G08中为2K+64字节。2K字节属于带内数据,是我们真正的存储空间,将来存储在Nand中的有效数据就是存在这2K范围内的(平时计算nand的容量时只考虑这2KB)。64字节的带外数据不能用来存储有效数据,它是作为别的附加用途的,比如用来存储ECC数据、存储坏块标志等……

(2)ECC(error correction code,错误校验码)

Nand的稳定性不够好,因而nand存储的出错(即位反转)概率高。将有效信息存储到Nand中的同时,按照一定的算法(譬如CRC16等校验算法)计算出ECC信息,然后存储到Nand这个页的带外数据区。读取数据时,对数据用同样的算法再计算一次ECC,并且和从带外数据区读出的ECC进行校验。如果校验通过则证明Nand的有效数据可信,如果校验不通过则证明这个数据已经被损坏,只能丢弃或者尝试修复。

(3)坏块标志

Nand芯片在用一段时间后,某些块可能会坏掉(无法擦除或者无法读写),类似于硬盘的坏道。坏块是不可避免的,而且随着Nand的使用坏块会越来越多。当坏块还不太多的时候,这个Nand都可以用,当坏块太多了使用不划算时才会换新的。

为了管理Nand,发明了一种坏块标志机制。Nand的每个页的64字节的带外数据中,文件系统定义了一个固定位置(比如定位第24字节)来标记这个块是好的还是坏的。当某个块已经坏了,文件系统将该块标记为坏块,以后访问nand时直接跳过这个块。

3、NandFlash芯片的地址时序

Nand读写时地址传递是通过IO线发送的,因为地址有32位而IO只有8位,所以需要4cycle或者5cycle发送地址。寻址的最小单位是字节,但是读写的最小单位是页。

在写代码时,Nand读写时的地址要按照Nand要求的时序和顺序去依次写入。

4、NandFlash芯片的命令码

外部SoC要想通过Nand控制器来访问Nand接口,就必须按照Nand接口规定的内容,给Nand接口发送命令、地址、数据等信息来读写Nand。

Nand芯片内部的接口电路本身可以接收外部的命令,然后根据这些命令来读写Nand内容,实现与外部SoC的交互。所以我们对nand进行的所有操作(擦除、读、写……)都要有命令、地址、数据的参与才能完成,而且必须按照Nand芯片规定的流程来做。

三、NandFlash芯片的常见操作

1、坏块检查

Flash设备使用之前要先以块为单位进行擦除,擦除后里面全是1,因此读出来的值是0xff。

检查坏块的思路:先进行块擦除,然后将整块读出来,依次检测各字节是否为0xff,如果是则表明不是坏块,不是则表明是坏块。

2、页写操作(program)

往Flash中写入数据的过程就叫做编程(program)。写Flash之前先确保这个页被擦干净,然后SoC通过命令线、IO线依次发送写命令、写页地址、写数据等进入NandFlash。

(1)写操作的过程

SoC通过内部的Nand控制器和外部的Nand芯片完成顺序对接,然后按照时序要求将一页数据发给Nand芯片内部的接口电路。

Nand芯片内部的接口电路先将数据放到自己的缓冲区,然后再集中写入Nand芯片的存储区域中。

Nand芯片内部的接口电路将一页数据从缓冲区中写入Nand存储区域中需要一定的时间,这段时间内Nand芯片不能再响应SOC发过来的其他命令,所以SoC要等待Nand芯片内部的接口电路忙完。

SoC通过不断读取状态寄存器的状态位(这个状态寄存器有2种情况:一种是SoC的Nand控制器自带的,另一种是SoC通过发命令从命令响应得到的),得知页数据是否已经写完。

(2)ECC校验

Nand的读写可能出错,为了安全进行ECC校验。

1)软件式校验

Nand芯片手册上推荐的方式是将刚才写入的1页数据读出来,和写入的内容进行逐一对比。如果读出的和写入的完全一样,说明刚才的写入过程正确完成了;如果读出来的和写入的不完全一样那就说明刚才的写入有问题。

2)硬件式ECC

一般情况下,SoC内部的Nand控制器会提供硬件式ECC,即Nand控制器中有一个硬件模块专门做ECC操作。

在写入Nand芯片时,打开ECC生成开关,则在写入Nand芯片的过程中,Nand控制器的ECC模块会自动生成ECC数据,并放在相应的寄存器中,然后将ECC数据写入Nand芯片的带外数据区。

在读取Nand芯片时,打开硬件ECC开关,则在读取Nand芯片的过程中,硬件ECC会自动计算读进来的一页数据的ECC值,并放到相应的寄存器中。然后读取带外数据区中原来写入时存入的ECC值,和这会读取时得到的ECC值进行校验,校验通过则说明读写正确,校验不通过则说明读写不正确。

3、擦除操作(erase)

擦除时必须给块对齐的地址。如果给了不对齐的地址,结果是不可知的(有些Nand芯片没关系,它内部会自动将其对齐,而有些Nand会返回地址错误)。

读写时给的地址也是一样,要求是页对齐地址。如果给了不对齐的,结果是不可知的。

4、页读操作(read)

待写。

四、S5PV210的NandFlash控制器

1、Nand控制器的作用

Nand芯片本身通过Nand接口电路来存取数据,Nand接口电路和SOC之间通过Nand接口时序来通信。但Nand接口时序相对复杂,如果完全用软件来实现Nand接口时序,则难以保证时序正确与稳定,代码很难写。解决方案是在SoC内部集成一个Nand控制器,其实质是一块硬件电路,其完全满足Nand接口时序的操作,然后将接口时序的操作寄存器化。

在SoC没有Nand控制器时,需要SoC来处理接口时序,编程很麻烦,需要程序员看Nand芯片的接口时序图,严格按照接口时序图中编程。在SoC有Nand控制器时,SoC只需要编程操控Nand控制器的寄存器即可,Nand控制器内部硬件会根据寄存器值来生成合适的Nand接口时序和Nand芯片通信。因此读写Nand芯片时不用再关注Nand接口时序,只要关注SoC的Nand控制器的寄存器,编程变得简单。

扩展来说,现在的技术趋势是硬件加速。目前几乎所有的外设在SoC内部都有对应的控制器来与其通信。SoC内部集成的各种控制器越多,则SoC硬件能完成的功能越多,使用此SoC来完成相应任务时,软件编程越简单。比如图形处理和图像处理领域,现在大部分的应用级别的SoC都集成有内部编码器,像S5PV210就有,更复杂的比如4418、6818也有。利用这些硬件编码器来进行快速编解码,软件工作量和大大难度降低。

2、NandFlash控制器结构框图

S5PV210的NandFlash控制器结构框图,位于数据手册Section 5内的第4节,第693页。

(1)特殊功能寄存器SFR

这是后续编程的关键,编程时就是通过读写SFR来产生Nand接口时序以读写Nand芯片的。

(2)Nand interface

这是NandFlash控制器的硬件接口,将来和Nand芯片的相应引脚进行连接

(3)ECC生成器

3、NandFlash控制器的主要寄存器

NandFlash控制器的主要寄存器有NFCONF、NFCONT、NFCMMD、NFADDR、NFDATA、

NFMECCD0、NFMECCD1、NFSECCD、NFSTAT。

五、NandFlash操作代码解析

1、擦除函数

待写。

2、页读取函数

待写。

3、页写入函数

待写。

4、总结

(1)NandFlash这类芯片,一般通过专用的接口时序和SoC内部的控制器相连。这种连接方式是非常普遍的,像LCD、DDR等都是类似的连接。这种接法和设计,对我们编程来说,关键在于两点:SoC的控制器的寄存器理解、Nand芯片本身的文档和流程图等信息。

(2)学习NandFlash要注意的是:
第一,要结合SoC的数据手册、Nand芯片的数据手册、示例代码三者来理解。
第二,初学时不要尝试完全不参考自己写出Nand操作的代码,初学时应该是先理解实例代码,知道这些代码是怎么写出来的,必要时对照文档来理解代码。代码理解之后去做实践,实践成功后以后再考虑自己不参考代码只参考文档来写出nand操作的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天糊土

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值