FLASH ECC算法

1.ECC算法简介

由于NAND Flash的工艺不能保证NAND的Memory Array在其生命周期中保持性能的可靠,因此,在NAND的生产中及使用过程中会产生坏块。为了检测数据的可靠性,在应用NAND Flash的系统中一般都会采用一定的坏区管理策略,而管理坏区的前提是能比较可靠的进行坏区检测。
如果操作时序和电路稳定性不存在问题的话,NAND Flash出错的时候一般不会造成整个Block或是Page不能读取或是全部出错,而是整个Page(例如512Bytes)中只有一个或几个bit出错。
对数据的校验常用的有奇偶校验、CRC校验等,而在NAND Flash处理中,一般使用一种比较专用的校验——ECC(Error Checking and Correction)。ECC能纠正单比特错误和检测双比特错误,而且计算速度很快,但对1比特以上的错误无法纠正,对2比特以上的错误不保证能检测。

2.ECC算法描述

ECC算法包括校验与纠错两部分,下文将分别介绍。

2.1 ECC校验算法

ECC一般每256字节原始数据生成3字节ECC校验数据,这三字节共24比特分成两部分:6比特的列校验和16比特的行校验,多余的两个比特置1,如下图所示。

在这里插入图片描述
其中CP0 ~ CP5 为六个Bit位,表示Column Parity(列极性),RP0 ~ RP15 为十六个Bit位,表示Row Parity(行极性)。
ECC的列校验和生成规则如下图所示。
在这里插入图片描述
用数学表达式表示为:
CP0=C0 ^ C2 ^ C4 ^ C6 CP1=C1 ^ C3 ^ C5 ^ C7
CP2=C0 ^ C1 ^ C4 ^ C5 CP3=C2 ^ C3 ^ C6 ^ C7
CP4=C0 ^ C1 ^ C2 ^ C3 CP5=C4 ^ C5 ^ C6 ^ C7
ECC的行校验和生成规则如下图所示。
在这里插入图片描述
用数学表达式表示为:
RP0=Byte0^ Byte2^ Byte4^ Byte6……Byte252^ Byte254
RP1=Byte1^ Byte3^ Byte5^ Byte7……Byte253^ Byte255
RP2=Byte0^ Byte1^ Byte4^ Byte5……Byte252^ Byte253
RP3=Byte2^ Byte3^ Byte6^ Byte7……Byte254^ Byte255
RP4=(Byte0-Byte3异或)^( Byte8-Byte11异或) ……
RP5=(Byte4-Byte7异或)^( Byte12-Byte15异或) ……
RP6=(Byte0-Byte7异或)^( Byte16-Byte23异或) ……
RP7=(Byte8-Byte15异或)^( Byte24-Byte31异或) ……
RP8=(Byte0-Byte15异或)^( Byte32-Byte47异或) ……
RP9=(Byte16-Byte31异或)^( Byte48-Byte63异或) ……
RP10=(Byte0-Byte31异或)^( Byte64-Byte95异或) ……
RP11=(Byte32-Byte63异或)^( Byte96-Byte127异或) ……
RP12=(Byte0-Byte63异或)^( Byte128-Byte191异或)
RP13=(Byte64-Byte127异或)^( Byte192-Byte255异或)
RP14=Byte0-Byte127异或
RP15=Byte128-Byte255异或
当往NAND Flash的page中写入数据的时候,每256字节我们生成一个ECC校验和,称之为原ECC校验和,保存到PAGE的OOB(out-of-band)数据区中。
当从NAND Flash中读取数据的时候,每256字节我们生成一个ECC校验和,称之为新ECC校验和。
校验的时候,根据上述ECC生成原理不难推断,将从OOB区中读出的原ECC校验和与新ECC校验和按位异或,若结果为0,则表示不存在错(或是出现了ECC无法检测的错误);若3个字节异或结果中存在11个比特位为1,表示存在一个比特错误,且可纠正;若3个字节异或结果中只存在1个比特位为1,表示OOB区出错;其他情况均表示出现了无法纠正的错误。

2.2 ECC纠错算法

若校验结果为一个比特位错误,可以修正。定位出错的比特位的方法是,先确定行地址(即哪个字节出错),再确定列地址(即该字节中的哪一个Bit位出错)。
将OOB区中读出的原ECC校验和新ECC校验和按位异或按位异或,得到的结果三个字节分别保存在s0,s1,s2中
确定行地址的方法如下:
设行地址为unsigned char byteoffs,抽取s1中的Bit7,Bit5,Bit3,Bit1,作为 byteoffs的高四位, 抽取s0中的Bit7,Bit5,Bit3,Bit1 作为byteoffs的低四位, 则byteoffs的值就表示出错字节的行地址(范围为0 ~ 255)。
确定列地址的方法如下:
抽取s2中的Bit7,Bit5,Bit3 作为 bitnum 的低三位,bitnum其余位置0,则bitnum的表示出错Bit位的列地址 (范围为0 ~ 7)。

3. ECC算法步骤

①. Flash中数据写入时,计算生成的ECC校验和;
②. Flash中数据读出时,计算生成的新的ECC校验和;
③. 将两次ECC校验和进行位异或运算;
④. 根据上一步运算结果进行数据校验和纠错,
若数据正确或无法纠错,跳至第6步;
若仅发生1bit错误,跳至第五步。
⑤. 纠正数据;
⑥. 算法结束。

4. 算法验证

本文将通过自建数据模拟FLASH的数据读写,进行算法的验证。
算法的验证分为4项:

A. 读写数据一致无错误验证
在这里插入图片描述
B. 读取数据存在1bit错误
本文通过将第一个字符由a修改为c模拟1bit的错误
(a的ascii:0110 0001 ; c的ascii:0110 0011)
在这里插入图片描述
C. 读取数据存在多bit错误
本文通过将第一个字符由a修改为b模拟多bit的错误
(a的ascii:0110 0001 ; b的ascii:0110 0010)
在这里插入图片描述
D. oob错误
在这里插入图片描述

写在最后

本人用C语言实现了ECC算法,有需求源码的可在这下载https://download.csdn.net/download/sdnyqfyqf/12328674
点关注不迷路~~

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值