最近在study ARM,在网上看到一些先行者们总结出来的一些东西,觉得很有参考意义,特收藏起来便于日后查找学习(在此向原帖作者致敬)。


第一节概论



nandflash在对大容量的数据存储中发挥着重要的作用。相对于norflash,它具有一些优势,但它的一个劣势是很容易产生坏块,因此在使用nandflash时,往往要利用校验算法发现坏块并标注出来,以便以后不再使用该坏块。nandflash没有地址或数据总线,如果是8位nandflash,那么它只有8个IO口,这8个IO口用于传输命令、地址和数据。nandflash主要以page(页)为单位进行读写,以block(块)为单位进行擦除。每一页中又分为main区和spare区,main区用于正常数据的存储,spare区用于存储一些附加信息,如块好坏的标记、块的逻辑地址、页内数据的ECC校验和等。

s3c2440内部集成有内部sram(steppingstone),当选择从nand flash启动的时候,nand flash的前4k代码将会自动copy到内部sram中后运行。

(一)nand flash控制器的特性:

1、支持读/写/编程 NAND FLASH内存

2、系统复位后nand flash的前4k代码自动copy到内部sram,copy完  成后从sram启动,此时内部sram被映射为nGCS0。(当OM[1:0]=    00时使能NAND FLASH 启动模式)

3、支持硬件ECC校验

4、系统启动后内部ram可以用做其他的用途。

(二)操作nand flash方法

1、设置nand flash配置寄存器NFCONF

2、向命令寄存器NFCMD写入操作命令

3、向地址寄存器NFADDR写入地址

4、读/写数据前要读取状态寄存器NFSTAT来判断nand flash是否处于忙状态。

(三)ECC奇偶检验

S3C2440在读/写操作时,自动生成2048字节的奇偶校验码。

nand flash的页为2048B。在读写的时候每页会产生4个bit大小的ECC校验码。

28bit ECC校验码=22bit 线校验码+6bit列校验码

ECC产生模块执行以下步骤:

1:当MCU写数据到NAND时,ECC产生模块生成ECC码。

2:当MCU从NAND读数据时,ECC产生模块生成ECC码同时用户程序将它与先前写入时产生的ECC码作比较。

在自动引导模式下,不进行ECC检测。因此,NAND FLASH的前4KB应确保不能有位错误(一般NAND FLASH厂家都确保)。

(四)坏块管理

   由于NAND Flash的工艺不能保证NAND的Memory Array在其生命周期中保持性能的可靠,因此,在NAND的生产中及使用过程中会产生坏块。坏块的特性是:当编程/擦除这个块时,不能将某些位拉高,这会造成Page Program和Block Erase操作时的错误,相应地反映到Status Register的相应位。

(1) 固有坏块,这是生产过程中产生的坏块,一般芯片原厂都会在出厂时都会将坏块第一个page的spare area的第6个bit标记为不等于0xff的值。

   (2) 使用坏块,这是在NAND Flash使用过程中,如果Block Erase或者Page Program错误,就可以简单地将这个块作为坏块来处理,这个时候需要把坏块标记起来。为了和固有坏块信息保持一致,将新发现的坏块的第一个page的 spare area的第6个Bit标记为非0xff的值。

    (3)坏块管理

    根据上面的这些叙述,可以了解NAND Flash出厂时在spare area中已经反映出了坏块信息,因此,如果在擦除一个块之前,一定要先check一下spare area的第6个bit是否是0xff,如果是就证明这是一个好块,可以擦除;如果是非0xff,那么就不能擦除。

当然,这样处理可能会犯一个错误―――“错杀伪坏块”,因为在芯片操作过程中可能由于电压不稳定等偶然因素会造成NAND操作的错误。但是,为了数据的可靠性及软件设计的简单化,我们就要奉行“蒋委员长”的“宁可错杀一千,也决不放过一个”的宗旨。

    (4)需要对前面由于Page Program错误发现的坏块进行一下特别说明。如果在对一个块的某个page进行编程的时候发生了错误就要把这个块标记为坏块,首先就要把其他好的page里面的内容备份到另外一个空的好块里面,然后,把这个块标记为坏块。

    当然,这可能会犯“错杀”之误,一个补救的办法,就是在进行完页备份之后,再将这个块擦除一遍,如果Block Erase发生错误,那就证明这个块是个真正的坏块,那就毫不犹豫地将它打个“戳”吧!

   (2)可能有人会问,为什么要使用spare area的第六个bit作为坏块标记。这是NAND Flash生产商的默认约定。



第二节 NAND寄存器设置说明

对NAND数据的读写主要通过NAND寄存器来实现,下面介绍其主要的寄存器

一、NFCONF寄存器

TACLS        [13:12]        TACLS持续时间设置, 取值范围0~3,hclk*tacls

twrph0        [10:8]        twrph0持续时间设置,取值范围0~7 ,hclk*(twrph0+1)

twrph1        [6:4]        twrph1持续时间设置,取值范围0~7 ,hclk*(twrph1+1)

Advflash(只读)        [3]        CPU自动加载NAND前4K内容时

此位在系统复位或唤醒期间被NCON0引脚决定

0:256/512页大小

1:1024/2048页大小

Pagesize(只读)        [2]        CPU自动加载NAND前4K内容时

当Advflash=0

  0:256 1:512

当Advflash=1

  0:1024 1:2048

此位在系统复位或唤醒期间被GPG13引脚决定启用后GPG13可以作为常规端口或外部中断输入使用

addrCycle(只读)        [1]        CPU自动加载NAND前4K内容时

当Advflash=0

  0:3个周期 1:4个周期

当Advflash=1

  0:4个周期 1:5个周期

此位在系统复位或唤醒期间被GPG14引脚决定

启用后GPG14可以作为常规端口或外部中断输入使用

Buswidth(读/写)        [0]        CPU自动加载NAND前4K内容时和常规读取时总线宽度

0:8bit 1:16bit

此位在系统复位或唤醒期间被GPG15引脚决定

启用后GPG15可以作为常规端口或外部中断输入使用

查看该寄存器定义,我们主要对NAND时序参数TACLS、TWRPH0、TWRPH1进行设置,这三个参数见下面时序图

TA CL S:表示CLE/ALE命令地址锁定信号建立后到nWE信号建立时间(setup time)。

TWRPH0:表示nWE的持续时间。

TWRPH1:表示nWE锁存结束后CLE/ALE维持时间(hold time)。

7e0d8bc7-552e-47dd-a0a3-5a56c7762efc.JPG


下面,我们看看K9F2G08时序时间,因为HCLK为100MHZ,所以一个clock为10ns

31e3e929-945d-4c12-9895-d579fee834a6.JPG


根据上面时序时间,我们可以保守取值TACLS=1,TWRPH1=0,TWRPH0=twp=4



ldr r0,=NFCONF

ldr r1,=(1<<12)|(4<<8)|(0<<4)|(0<<0);表8位I/O端口

strh r1,[r0]



二、NFCONT寄存器

Lock-tight        [13]        Lock-tight配置

0:禁止1:启用

以前,此位设置为1,不能清除,唯一在复位和唤醒时能够使此位无效(软件不能清除)

当设置为1时,范围为NFSBLK(0X4E000038)到NFEBLK(0X4E00003C)-1不被锁定,在这范围之外,写和擦除命令是无效,只有读命令是允许的。

当你试图写或擦除锁定区域,违规存取将发生,NFSTAT[3]被设置

NFSBLK和NFEBLK相同,全部区域将被锁定

Soft-lock        [12]        Soft-lock配置

0:禁止1:启用

软件锁定能在任何时间被软件修改

当设置为1时,范围为NFSBLK(0X4E000038)到NFEBLK(0X4E00003C)-1不被锁定,在这范围之外,写和擦除命令是无效,只有读命令是允许的。

当你试图写或擦除锁定区域,违规存取将发生,NFSTAT[3]被设置

NFSBLK和NFEBLK相同,全部区域将被锁定

EnblllegalAccInt        [10]        0:禁止1:允许中断

当CPU试图编程或擦除锁定区域时(NFSBLK(0X4E000038)到NFEBLK(0X4E00003C)-1)

EnbRnBINT        [9]        RnB状态输入信号转换成中断信号

0:禁止1:允许

RnB_TransMode        [8]        RnB转换检测信号设置

0:上升沿 1:下除沿

Reserved        [7]        保留

SpareECCLock        [6]        锁定SPARE纠码区域

0:不锁定1:锁定

备用纠码区域状态在NFSECC(0x4e000034)同下

ManiECCLock        [5]        锁定MAIN纠码区域

0:不锁定 1:锁定

主纠码区域状态在NFMECC0/1(0X4E00002C/30)(即当启用ECC功能及锁定ECC时,数据产生的ECC奇偶码存放在NFMECC0/1寄存器中)

InitECC        [4](只写)        初始化ECC编码器

1:初始化ECC编码器

Reserved        [3:2]        保留

Reg_nCE        [1]        NAND Flash nFCE信号控制

0:强制nFCE信号为低:(允许片选信号)

1:强制nFCE信号为高:(禁止片选信号)

在启动期间,其值自动控制

其值在MODE位为1时有效

MODE        [0]        NAND Flash操作模式

0:不使用

1:使用



ldr r0,=NFCONT

        ldr r1,=(0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0)

        strh r1,[r0]

     锁定MAIN及SPACE区域ECC,初始化ECC,启用NAND功能,禁止片选信号



三、NFCMD寄存器

NAND命令设置寄存器

Reserved        [15:8]        保留

NFCMMD        [7:0]        NAND控制命令值



四、NFADDR寄存器

NAND地址设置寄存器

Reserved        [15:8]        保留

NFADDR        [7:0]        NAND地址设置值



五、NFDATA寄存器

NAND数据读写寄存器

NFDATA        [31:0]        NAND读或编程数据



六、NFSTAT寄存器

NAND操作状态寄存器

Reserved        [7:4]        保留,

IIIegalAccess        [3]        一旦软件锁定或LOCK-tight使能?

RnB_TransDetect        [2]        当RnB由低向高电平转变是,该位被设置并发出中断,如果中断允许,要清除该位向该位写1

0:电平转换未检测

1:电平转换检测

Nce(只读)        [1]        NCE输出信号状态

RNB(只读)        [0]        Rnb输入信号状态

0:NAND状态正忙

1:NAND状态准备好操作



第三节K9F2G08NAND编程

TQ2440是三星生产的K9F2G08,容量为256MB。下观就以它为例进行介绍。


d1169958-2da2-41ce-adb1-eee1b2d6e9de.JPG


该芯片为48引脚,有三种封装,其外围引脚较少,这样就方便和S3C2440的硬件连接,即方便设计电路,又可以减少占用总线资源。具体的引脚见手册的第8页,


4c1d91ab-c9e0-43ae-842b-d28266631982.JPG


X-Buffers Latches & Decoders:用于产生行地址;

?  Y-Buffers Latches & Decoders:用于产生列地址;

?  Command Register:用于命令字的操作;

?  Control Logic & High Voltage Generator:控制逻辑及产生Flash所需的高压;

?  Nand Flash Array:存储部件;

?  Page Register & S/A :页寄存器,当读、写页时,会将数据先读入或写入此寄存器,大小为2048+64 B。

下图为NAND FLASH的存储单元组织结构图:


a209c3c2-baae-4112-bbd7-a0248631c5a6.JPG


K9F2G08容量为256MB,分为131072行(页),2112 x 8列。每页大小为2048字节,另外有64字节的额外空间,这64字节的空间的列地址为2048—2111。

命令、地址、数据都通过8个I/O口输入/输出,这种形式减少了芯片的引脚个数,并使得系统很容易升级到更大的容量,写入命令、地址或数据时,都需要将WE#、CE#信号同时拉低。数据在WE#信号的上升沿被锁存,其中CLE为命令锁存信号、ALE为地址锁存信号。整个芯片为(256+8)MB,因此,需要29根地址线来寻址,这样,如果我们以字节为单位发出寻址信号,总共需要5个周期,其中2周期列地址信号,3周期的行地址信号。见下图。


0791dc13-d31c-4bb1-8d07-e169b6d8ed95.JPG


地址疑惑:我们知道,K9F2G08容量为256M,故其需要28位地址进行寻址,每一页容量为2K,需11位地址,共有131072行,需要地址17位,页和行地址相加为28位正好寻址256M,,而上表中用的地址为29位,再看看页地址[A0~A11]12位,可寻址空间为4K,行地址[A12~A28]17位,可寻址空间为131072行,显然页地址多出一位,其寻址空间扩大了一倍。当我们考虑地址[0x800=2048=1000 0000 0000]寻址时,由于一页大小为2048,其地址范围为[0~2047],0x800应为第一页第一个字节。其列地址为0,行地址为1(A11为行地址第一个位)。但当我们按上表分析该地址时,其列地址为0x800(2048)行地址为0,那么该地址读取的数据为第0页第2048个字节(即SPACE区域的第一个字节),显然问题的关键在A11上,也就是说当A11为1时,我们寻址空间为页2048~2111(共64字节)。通过实际检验,可以断定,我们地址addr[11]应为行地址第一位,读取Main页地址(0~2047)范围内时,A11必须置0,访问space区域时,A11必须置1,由我们根据需要决定,不从地址中取值,故行地址应从a[11]位开始。

2、操作命令字介绍 

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


7fe7de85-3230-4e2f-80e4-6790ec2bd0c5.JPG


附件:
7e0d8bc7-552e-47dd-a0a3-5a56c7762efc.JPG 下载次数: 426
31e3e929-945d-4c12-9895-d579fee834a6.JPG 下载次数: 427
d1169958-2da2-41ce-adb1-eee1b2d6e9de.JPG 下载次数: 416
4c1d91ab-c9e0-43ae-842b-d28266631982.JPG 下载次数: 417
a209c3c2-baae-4112-bbd7-a0248631c5a6.JPG 下载次数: 411
0791dc13-d31c-4bb1-8d07-e169b6d8ed95.JPG 下载次数: 420
7fe7de85-3230-4e2f-80e4-6790ec2bd0c5.JPG 下载次数: 420

7.NAND芯片的读写及ECC检验软硬件实现_上相关推荐

  1. 模拟NAND FLASH 读写BCH ECC校验

    一.模拟NAND FLASH 读写BCH ECC校验 将内核源码里的bch校验程序分离出来,从而可以手动修改原始数据和bch校验码,达到模拟出错纠正过程. 源码 bch.c.bch.h.types.h ...

  2. NAND Flash硬件读写原理

    1.nand接口 s3c2440板的Nand Flash模块由两部分组成:Nand Flash控制器(集成在s3c2440)和Nand Flash存储芯片(K9F1208U0B)两大部分组成.当要访问 ...

  3. 嵌入式linux之Nor/Nand FLASH的读写

    http://www.cnblogs.com/tureno/articles/2708461.html 所谓Flash,是内存(Memory)的一种,但兼有RAM和ROM 的优点,是一种可在系统(In ...

  4. K9F1G08U0D Nand芯片

    使用三星公司的K9F1G08U0D芯片做文件系统,首先要对K9F1G08U0D Nand芯片比较熟悉,整个网络找遍了,都找不到完全相对应的文档,只能找到K9F1G08U0A的手册,看到网上人家说K9F ...

  5. STM32芯片解锁读写保护:更改Option Byte [Error已解决]

    STM32芯片解锁读写保护:更改Option Byte [Error已解决] 问题描述 解决办法 原理:RDP保护级别 问题描述 STM32使用中经常见到芯片设置了读保护(芯片被锁住),导致无法读取. ...

  6. ks检验正态分布结果_统计学里的数据正态性检验

    在前面的文章中讲过,很多模型的假设条件都是数据是服从正态分布的.这篇文章主要讲讲如何判断数据是否符合正态分布.主要分为两种方法:描述统计方法和统计检验方法. 01.描述统计方法 描述统计就是用描述的数 ...

  7. 单节磷酸铁锂电池充电管理芯片IC驱动方案3.6V充电芯片手电筒_低压应急球泡灯适用

    单节磷酸铁锂电池充电管理芯片IC驱动方案3.6V充电芯片手电筒_低压应急球泡灯适用 2:品牌名称:泛海微 3方案特点: 4.(1)产品特点 特点:   3.6V独立的单节磷酸铁锂电池充电管理    ...

  8. NAND FLASH的读写操作(硬件原理图分析)

    转载:NAND FLASH的读操作及原理 硬件原理 上面是我使用的NAND FLASH的硬件原理图,面对这些引脚,很难明白他们是什么含义,下面直接引用韦东山老师的课程中的提问: NAND FLASH是 ...

  9. (超详细)STM32芯片Flash读写操作讲解和代码(寄存器版本)

    关于Flash,官方的解释为:Flash为32位宽的存储单元,可用于存储代码和数据常量.Flash模块位于微控制器内存映射中的特定基址--.而对于我们来说,只要知道Flash闪存区是一个掉电后也不会清 ...

最新文章

  1. Running Spark on YARN
  2. LeetCode算法题-Minimum Depth of Binary Tree(Java实现)
  3. 1123 Is It a Complete AVL Tree (30 分)【难度: 难 / 平衡树 未完成】
  4. c语言获取五子棋盘光标位置,跪求C语言五子棋悔棋部分实现
  5. linux下执行shell脚本文件,Linux下使用shell脚本自动执行脚本文件
  6. matlab dividend,[原创]基于(Matlab/R/C++)的方差Gamma模型(Hull期权期货)随机抽样[by fantuanxiaot]...
  7. [html] 你是如何理解html与css分离的?
  8. html:(18):文本输入框,密码输入框,文本域
  9. 动态规划java LCS_动态规划递归求解LCS长度 | 学步园
  10. 倒计时 7 天 | 完整议程大揭秘!来 20 个 AI 论坛,与百名大咖携手玩转人工智能...
  11. python简单程序实例-python简单实例训练(21~30)
  12. CS 客户端不引用AE
  13. 腾讯实习网申到面试--小记
  14. win11如何备份系统 Windows11备份系统的设置方法
  15. 五大自动化测试 Python 框架
  16. php显示控制器不存在,解决ThinkPHP6提示控制器不存在问题
  17. 无root权限怎么完全卸载系统自带软件(捆绑软件)
  18. crt格式证书转pem格式证书
  19. 【Ubuntu】Ubuntu16.04 安装显卡驱动重启黑屏问题处理
  20. C++常成员函数 常对象成员

热门文章

  1. malloc/calloc/realloc
  2. 图片右轮播第一张和最后一张无缝衔接
  3. 步步高Java一面凉经
  4. 构建企业级多元数据库的信创DBaaS平台-2022云和恩墨大讲堂
  5. Python数据分析与挖掘——回归模型的诊断
  6. 纯 canvas 实现漂亮的仪表盘
  7. 深度学习:Windows7_64位 安装 TensorFlow(CPU版本)及常见问题
  8. VR的国内研究现状及发展趋势
  9. memoQ Webinar(入门级)分享会回顾
  10. 同声传译又下一城!微软《Skype翻译》新增俄语支持