锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

外设篇:NandFlash和iNand

时间:2023-02-12 19:30:00 mlc连接器mmc集成电路

NandFlash的接口

Nand型号及命名
(1)Nand型号命名有意义,拿K9F2G以08为例分析:K9F说是三星公司的NandFlash系列。2G表示Nand的大小是2Gbit(256MB)。08表示Nand是8位(8位是8条数据线)
(2)Nand从命名中可以看出:制造商、系列型号、容量大小、数据位数。

Nand的数据位
(1)Nand有8个数据位和16个数据位。制作电路/编写软件时,应根据实际购买情况进行采购Nnad设计电路/写软件的位数。
(2)说明Nand并行接口(8/16位)
(3)Nand在线传输的数据不一定都是有效的数据,也可能有命令、地址等。

Nand的功能框图


(1)Nand该结构可视为矩阵存储器,分为小块,每小块可存储一个bit然后用一定的单位组合成整个位置Nand。
(2)Nand可单次访问的最小单元(即对Nand读写至少要读写这么多,或者整数倍这么多)叫做Page(页),在K9F2G08芯片中,Page的大小是2KB 64B。也就是说,我们要读写K9F2G08,每次至少读写2KB或者n*2KB,即使我们只是想要一个字节。这就是我们所说的典型的块设备(现在一些块设备提供了一种方便的设备)random read模式,可以只读取1个字节)。
(3)页面向上还有一个Block(块)概念,一个块等于几页(例如K9F2G08中一块等于64页)。
(4)页面向上是整个页面Nand芯片,叫做Device。一个Device是若干个Block,譬如K9F2F08一个Device有2028个block。所以整个Device大小为:2048×64×2K = 256MB
(5)设备分块page、block有什么意义?首先要明白,块设备不能完全按字节访问,而必须是物理限制,而不是人为障碍。其次,Page和Block各有各的意义,比如Nand中:Page是读写Nand最小单位;Block是擦除Nand最小单位。(这些规则都是Nand没有人想要物理原理和限制要求,所以对于我们做软件的人来说,我们只能找到适应硬件的方法,而不是超越硬件)。
(6)Nand芯片主要包括两部分:Nand存储颗粒 Nand接口电路。储存颗粒是纯粹的Nand存储单元的原理与仓库相似;Nand接口电路是用来管理存储颗粒,并且给外界提供一个统一的Nand访问接口的接口规格。
(7)Nand有多个存储单元,每个单元都有自己的地址(地址准确到字节)。所以Nand地址编排准确到字节,但实际读写只能准确到页面(所以Nand许多操作要求页面对齐地址,例如2K、4K、512K这样的地址不能给3万B这样的地址)。Nand读写时地址的传递是通过IO由于地址30位,线路发送IO只有8个,所以需要多个cycle才能完成发送。一般的Nand都是4cycle或者5cycle发送地址(从这里开始Nand分为了4cycle Nand和5cycle Nand)。
总结:Nand芯片内部有存储空间,有管理这些存储空间的电路,为外部提供统一的存储空间Nand接口的访问规则,然后外部SoC可以使用Nand读写接口时序Nand存储芯片。Nand理论上,接口是一种公共接口和标准SoC可直接模拟Nand接口来读写Nand但实际上是因为芯片,nand接口对时序要求非常严格,时序非常复杂,所以一般SoC都是通过硬件Nand(这些控制器通常被用作SoC内部外设存在)控制Nand芯片的。

NandFlash的结构
Nand单元组织:block与page(大页Nand与小页Nand)
(1)Nand页面类似于之前提到的块设备(尤其是硬盘)的风扇区域。风扇区域最早在磁盘中是512字节,后来一些高级硬盘风扇区域不是512字节,而是1024字节/2048字节/4096字节。Nand同样,不同Nand页面512字节/1024字节/2048字节/4096字节等。
(2)一个block等于多少page也不确定,不同Nand也不一样Nand芯片有多少block也不确定,不同Nand芯片也不一样。
总结:Nand组织结构相当混乱,接口顺序不同,导致不同厂家的结构Nand芯片,或同一制造商的不同系列型号的存储容量nand接口也不一样nand一个大问题是,一旦容量升级或芯片系列更换,硬件和软件应重新移植。

带内数据和带外数据(ECC与坏块标记)
(1)Nand每个页面由两部分组成,各有一定的存储空间。譬如K9F2G08中为2K 64字节。其中的2K字节属于带内数据,是我们未来存储的真实存储空间Nand这2个数据存在于有效数据中K范围内(我们通常计算nand只考虑这2个容量KB);64字节的带外数据不能作为其他附加用途存储有效数据(例如存储ECC数据、用来存储坏块标志等····)
(2)什么是ECC:(error correction code,校验码错误)。因为nand存储本身出错(位反转)概率高(Nand较Nor最大的缺点是稳定性),所以当我们存储有效的信息时Nand中时会同时按一定算法计算ECC信息(譬如CRC16等校验算法),ECC同时存储信息Nand带外数据区的页面。然后在将来读取数据时,用相同的算法再次计算数据ECC,并从带外数据区阅读ECC进行校验。如果校验通过则证明Nand有效的有效数据,如果验证失败,则证明数据已被损坏(只能丢弃或试图修复)。
(3)块标:Nand芯片使用一段时间后,有些块可能会坏掉(这些块不能擦掉或读写),nand坏块与硬盘坏道非常相似。坏块是不可避免的,随着Nand会有越来越多的坏块。当坏块不太多的时候,这个Nand它们都可以使用,除非有太多的碎片不划算。所以我们要管理Nand发明了一种坏块标志机制。Nand在每页64字节的外部数据中,我们(通常是文件系统)定义固定位置(如定位第24字节)来标记块是好是坏。当文件系统发现该块坏了,无法使用时,将该块标记为坏块,以后访问nand直接跳过这个块。

Nand的地址时序
(1)nand有多个地址,分4/5周期通过IO引脚发送给Nand芯片来对Nand寻址。寻址的最小单位是字节,但读写的最小单位是页面。
(2)nand编写代码时,应根据地址编写代码Nand依次写入所需的时序和顺序。

Nand的命令码
(1)外部SoC要想通过Nand访问控制器Nand(本质是通过Nand必须遵循接口Nand接口给nand发送命令、地址、数据等信息Nand。
(2)Nand芯片内部管理电路本身可以接收外部发送的命令,然后根据这些命令读写Nand内容与外部SoC互动。所以我们是对的nand所有操作(擦除、读写···)必须参与命令、地址和数据,必须遵循Nand做芯片规定的流程。

NandFlash常见的操作和流程分析

坏块检查


(1)Flash使用前统一擦除(擦除单位为块)。Flash擦拭设备后,里面全是1,所以擦拭后读出的值为0xff。
(2)检查坏块的想法是:先擦掉块,然后读出整个块,依次检查节是否为0xff,如果是,说明不是坏块,如果不是,说明是坏块。

页写(program)操作


(1)写之前确保这个页是被擦除干净的。如果不是擦除干净的(而是脏的、用过的)页,写进去的值就是错的,不是你想要的结果。
(2)写操作(write)在flash操作称为编程(program)
(3)SoC写Flash总是通过命令线,IO发送命令、页面地址、数据等。NandFlash。
(4)写作过程:SOC通过Nand控制器和Nand芯片完成顺序对接,然后按时序要求发送一页数据Nand芯片内部的接口电路。接口电路先收到自己的缓冲区,然后集中写入Nand芯片存储区。Nand接口电路将一页数据从缓冲区写入Nand存储系统中需要一定的时间,这段时间Nand芯片不能再响应了SOC其他发送的命令,所以SoC要等待Nand接口电路很忙。等待方法是SoC持续读取状态寄存器(这种状态寄存器有两种情况:一种是SoC的Nand控制器自带,另一个是SoC通过发命令获得命令响应),然后通过检查寄存器的状态位置来知道Nand接口电路刚刚写的那一页数据写完了吗?直到SoC只有收到正确状态的寄存器响应,我们才能认为刚才要写的页面数据已经ok。(如果SoC收到的状态一直是错误的。你可以考虑重写或认为这一页所在的块是坏块,或者整个块Nand芯片已经挂断了)。
(5)正常情况下,第四步已经结束。但是因为Nand读写是不可靠的,所以我们会为了安全而这样做ECC校验。ECC有两种验证:硬件验证和软件验证。有很多策略可以用于软件验证,其中之一(Nand芯片手册中推荐的方法是:阅读刚刚写入的1页数据,并逐一比较写入的内容。如果读的和写的完全一样,说明刚才的写过程正确完成;如果读的和写的不完全一样,说明刚才写的有问题。
(6)硬件式ECC:SoC的Nand可提供硬件式控制器ECC(这也是比较常见的情况)。硬件式ECC就是在Nand的控制器中有个硬件模块专门做ECC操作。当我们操作Nand只需按照芯片SoC按时打开要求ECC当我们写入生成开关时Nand芯片时SoC的Nand控制器的ECC自动生成模块ECC将数据放入相应的寄存器中,然后我们只需要生成它ECC数据写入Nand带外数据区域的芯片;将来读取这个Nand芯片也要打开硬件ECC开关,然后在阅读过程中开始阅读硬件ECC读取的一页数据将自动计算ECC并将其放入相应的寄存器中。然后我们读取带外数据区原始写入时存入的内容ECC值,我们刚读的时候得到的ECC验证值。然后我们读取带外数据区原始写入时存入的内容ECC值,我们刚读的时候得到的ECC值得验证。验证通过后,说明读写正确,验证不通过后,说明不正确(放弃数据或尝试修复)。

擦除(erase)操作


(1)擦拭时必须对齐块址。如果给了不对齐的地址,结果是不可知的(有些Nand芯片没关系,它内部会自动将其对齐,而有些Nand会返回地址错误)。
(2)读写时给的地址也是一样,要求是页对齐地址。如果给了不对齐的,也是有可能对有可能错。

页读(read)操作

S5PV210的NandFlash控制器

SoC的Nand控制器的作用
(1)Nand芯片本身通过Nand接口电路来存取数据,Nand接口电路和SOC之间通过Nand接口时序来通信。Nand接口时序相对复杂,如果要SoC完全用软件来实现Nand接口时序有一些不好(主要是:第一很难保证时序能满足、容易不稳定;第二代码很难写)。解决方案是:在SoC内部集成一个Nand控制器(实质就是一块硬件电路,这个硬件电路完全满足Nand接口时序的操作,然后将接口时序的操作寄存器化)。
(2)SOC和Nand芯片之间通信,在SoC没有Nand控制器时需要SoC自己来处理接口时序,编程很麻烦,需要程序员看Nand芯片的接口时序图,严格按照接口时序图中编程(尤其要注意各个时间参数);在SoC有Nand控制器时SoC只需要编程操控Nand控制器的寄存器即可,Nand控制器内部硬件会根据寄存器值来生成合适的Nand接口时序和Nand芯片通信。所以在有Nand控制器时编程要简单很多,我们读写Nand芯片时再也不用关注Nand接口时序了,只要关注SoC的Nand控制器的寄存器即可。
(3)扩展来讲,现在的技术趋势就是:几乎所有的外设在SoC内部都有对应的控制器来与其通信,那么SoC内部集成的各种控制器(也就是各种内部外设)越多,则SoC硬件能完成的功能越多,将来用这个SoC来完成相应任务时软件编程越简单。譬如说图形处理和图像处理领域,2D图像编码(jpeg编码)、视频编码(h.264编码),现在大部分的application级别的SoC都有集成的内部编码器(像S5PV210就有、更复杂的譬如4418、6818就更不用说了,只会更多更先进),我们可以利用这些硬件编码器来进行快速编解码,这样软件工作量和难度降低了很多(这就是所谓的硬件加速)。

结构框图分析


(1)结构框图中关键点:SFR(我们后续编程的关键,编程时就是通过读写SFR来产生Nand接口时序以读写Nand芯片的) + Nand interface(硬件接口,将来和Nand芯片的相应引脚进行连接) + ECC生成器

S5PV210的Nand控制器的主要寄存器
NFCONF、NFCONT、NFCMMD、NFADDR、NFDATA、NFMECCD0&NFMECCD1、NFSECCD、NFSTAT


Nand操作代码解析
擦除函数

页读取函数

页写入函数

总结:
(1)像NandFlash这类芯片,通过专用的接口时序和SoC内部的控制器相连(这种连接方式是非常普遍的,像LCD、DDR等都是类似的连接)。这种接法和设计对我们编程来说,关键在于两点:SoC的控制器的寄存器理解和Nand芯片本身的文档、流程图等信息。
(2)对于我们来说,学习NandFlash,要注意的是:
第一,要结合SoC的数据手册、Nand芯片的数据手册、示例代码三者来理解。
第二,初学时不要尝试完全不参考自己写出Nand操作的代码,初学时应该是先理解实例代码,知道这些代码是怎么写出来的,必要时对照文档来理解代码。代码理解之后去做实践,实践成功后以后再考虑自己不参考代码只参考文档来写出nand操作的代码。

iNand介绍

iNand/eMMC/SDCard/MMCCard的关联
(1)最早出现的是MMC卡,卡片式结构,按照MMC协议设计。(相较于NandFlash芯片来说,MMC卡有2个优势:第一是卡片化,便于拆装;第二是统一了协议接口,兼容性好。)
(2)后来出现SD卡,兼容MMC协议。SD卡较MMC有一些改进,譬如写保护、速率、容量等。
(3)SD卡遵守SD协议,有多个版本。多个版本之间向前兼容。
(4)iNand/eMMC在SD卡的基础上发展起来,较SD卡的区别就是将SD卡芯片化了(解决卡的接触不良问题,便于设备迷你化)。
(5)iNand和eMMC的关联:eMMC是协议,iNand是Sandisk公司符合eMMC协议的一种芯片系列名称。

iNand/eMMC的结构框图及其与NandFlash的区别
(1)iNand内部也是由存储系统和接口电路构成(和Nand结构特性类似,不同之处在于接口电路功能不同)。
(2)iNand的接口电路挺复杂,功能很健全。譬如:
第一,提供eMMC接口协议,和SoC的eMMC接口控制器通信对接。
第二,提供块的ECC校验相关的逻辑,也就是说iNand本身自己完成存储系统的ECC功能,SoC使用iNand时自己不用写代码来进行ECC相关操作,大大简化了SoC的编程难度。(NandFlash分2种:SLC和MLC,SLC更稳定,但是容量小价格高;MLC容易出错,但是容量大价格低)
第三,iNand芯片内部使用MLC Nand颗粒,所以性价比很高。
第四,iNand接口电路还提供了cache机制,所以inand的操作速度很快。

iNand/eMMC的物理接口和SD卡物理接口的对比:


(1)S5PV210芯片本身支持4通道的SD/MMC,在X210中实际是在SD/MMC0通道接了iNand芯片,而SD/MMC2接了SD卡(SD/MMC3也接了SD卡)。
(2)对比inand和SD卡接线,发现:这两个接线几乎是一样的,唯一的区别就是SD卡IO线有4根,而iNand的IO线有8根。
(3)这个告诉我们,我们在实际操作iNand芯片时和操作SD卡时几乎是一样的(物理接线几乎一样,软件操作协议几乎一样)。

结论:iNand/eMMC其实就是芯片化的SD/MMC卡,软件操作和SD卡相同。
分析iNand芯片的操作代码时,其实就是以前的SD卡的操作代码。一些细节的区别就是为了区分各种不同版本的SD卡、iNand的细节差异。

SD卡/iNand操作

硬件接口:DATA、CLK、CMD
(1)iNand的IO线有8根,支持1、4、8线并行传输模式;SD卡IO线有4根,支持1、4线并行传输模式。
(2)CMD线用来传输命令、CLK线用来传输时钟信号。
(3)接口有CLK线,工作时主机SoC通过CLK线传输时钟信号给SD卡/iNand芯片,说明:SD/iNand是同步的,SD/iNand的工作速率是由主机给它的CLK频率决定的。

命令响应的操作模式
(1)SD协议事先定义了很多标准命令(CMD0、CMD1·····),每个命令都有它的作用和使用条件和对应的响应。SD卡工作的时候就是一个一个的命令周期组合起来的,在一个命令周期中,主机先发送CMD给SD卡,然后SD卡解析这个命令并且执行这个命令,然后SD卡根据结果回发给主机SoC一个响应。(有些命令是不需要响应的,这时SD卡不会给主机回发响应,主机也不用等待响应)。标准的命令+响应的周期中,主机发完一个命令后应该等待SD卡的响应而不是接着发下一条命令。

SD/iNand的体系结构图


(1)SD卡内部有一个接口控制器,这个控制器类似于一个单片机,这个单片机的程序功能就是通过CMD线接收外部主机SoC发给SD卡的命令码,然后执行这个命令并且回发响应给主机SoC。这个单片机处理命令及回发响应遵循的就是SD协议。这个单片机同时可以控制SD卡内部的存储单元,可以读写存储单元。

 

SD/iNand的寄存器(重点是RCA寄存器)
(1)注意这里说的是SD卡内部的寄存器,而不是主机SoC的SD控制器的寄存器。(很多外置芯片内部都是有寄存器的,这些寄存器可以按照一定的规则访问,访问这些寄存器可以得知芯片的一些信息)。
(2)RCA(relative address,相对地址寄存器)。我们在访问SD卡时,实际上SD卡内部每个存储单元的地址没有绝对数字,都是使用相对地址。相对地址由SD卡自己决定的,存放在RCA寄存器中。

SoC的SD/MMC/iNand控制器简介:
(1)不同的SoC可能在SD/MMC/iNand等支持方面有差异,但是如果支持都是通过内部提供SD控制器来支持的。
(2)S5PV210的SD卡控制器在Section8.7部分

SD/iNand代码实战分析

命令码CMD和ACMD
(1)SD卡工作在命令+响应的模式下。
(2)SD协议的命令分2种:CMDx和ACMDx。CMD是单命令命令,就是单独发一个CMD即可表示一个意思。ACMD是一种扩展,就是发2个CMD加起来表示一个意思。可以认为ACMDx = CMDy+CMDz(y一般是55)

卡类型识别SD or MMC?
(1)MMC协议、SD协议、eMMC协议本身是一脉相承的,所以造成了一定的兼容性,所以当我们SoC控制器工作时连接到SoC上的可能是一个MMC卡、也可能是SD卡、也可能是iNand芯片。主机SoC需要去识别这个卡到底是什么版本的卡。
(2)SoC如何区分卡种类?因为不同版本的卡内部协议不同的,所以对卡识别命令的响应也是不同的。SoC通过发送一些命令、听取响应就可以根据不同的响应判定卡的版本。

卡状态
(1)SD卡内部的接口控制器类似于一个单片机,这个单片机其实是一个状态机。所以SD卡任何时候都属于某一种状态(空闲状态、准备好状态、读写状态、出错状态····都是事先定义好的),在这种状态下能够接受的命令是一定的,接受到命令之后执行一定的操作然后根据操作结果会跳转为其他状态。如果主机发过来的命令和当前状态不符状态机就不响应,如果收到命令和当前状态相符就会执行相应操作,执行完之后根据结果跳转为其他状态。

卡回复类型
(1)一般来说,SD卡的命令都属于:命令+响应的模式。也有极少数的SD卡命令是不需要回复的。
(2)卡回复有R1、R7、R1B等8种类型,每种卡回复类型都有自己的解析规则。然后卡在特定状态下响应特定命令时有可能回复哪种响应都是SD协议事先规定好的,详细细节要查阅协议文档。

linux内核风格的寄存器定义
(1)定义一个基地址,然后定义要访问的寄存器和基地址之间的偏移量,在最终访问寄存器时地址就等于基地址+偏移量。
(2)给大家提供的代码中宏定义是不完整的,很多宏定义只能从字面意思来理解对应,无法通过语法完全获得。这样写代码的好处是可以见名知意,就算代码不全都能读。

SD/iNand相关的GPIO初始化
(1)GPG0相关的GPIO初始化,参考LED部分的设置技术
(2)时钟设置参考裸机第六部分时钟那一章,设置时使用到了位操作技巧,参考C高级第二部分
(3)要求能够在两三分钟之内完全看懂这些代码涉及到的知识,要能够在数据手册、原理图中找到相对应的点,要能够瞬间明白代码中涉及到的C语言语法技巧,这样才叫融会贯通,才能够从代码中学到东西。

SD/iNand相关的时钟系统设置

SD/iNand的时钟设置
(1)SD卡本身工作需要时钟,但是自己又没有时钟发生单元,依靠主机SoC的控制器通过SD接口中的CLK线传一个时钟过来给SD卡内部使用。所以主机SD卡控制器先初始化好自己的时钟,然后将自己的时钟传给SD卡。
(2)因为此时刚开始和SD卡通信,主机不清楚SD卡属于哪个版本(高版本和低版本的SD卡的读写速率不同,高版本的可以工作在低版本的速率下,低版本的SD卡不能工作在高版本速率下),所以先给SD卡发400KHz的低速率时钟,SD卡拿到这个时钟后就能工作了。然后在后面和SD卡进行进一步通信时去识别SD卡的版本号,识别后再根据SD卡的版本进一步给它更合适的时钟。


SD/iNand代码实战分析3
命令发送函数解析


卡类型识别操作时序及代码分析


卡读写时序及代码分析

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章