关于ECC的校验,网上找了很多都不太满意各种论文基本上对于细节描述都是略过,最后终于找到个说的比较细致的。
看了个大佬的博客描述得挺细节的
https://blog.csdn.net/wangjasonlinux/article/details/9350451
ECC的作用和使用限定
ECC的全称是Error Checking and Correction,是一种用于Nand的差错检测和修正算法。如果操作时序和电路稳定性不存在问题的话,NAND Flash出错的时候一般不会造成整个Block或是Page不能读取或是全部出错,而是整个Page(例如512Bytes)中只有一个或几个bit出错。ECC能纠正1个比特错误和检测2个比特错误,而且计算速度很快,但对1比特以上的错误无法纠正,对2比特以上的错误不保证能检测。
解释以下ECC是什么,格式是怎样的
校验码生成算法:ECC校验每次对256字节的数据进行操作,包含列校验和行校验。对每个待校验的Bit位求异或,若结果为0,则表明含有偶数个1;若结果为1,则表明含有奇数个1。列校验规则如表1所示。256字节数据形成256行、8列的矩阵,矩阵每个元素表示一个Bit 位。
用数学表达式表示为:
P4=D7(+)D6(+)D5(+)D4 P4`=D3(+)D2(+)D1(+)D0
P2=D7(+)D6(+)D3(+)D2 P2`=D5(+)D4(+)D1(+)D0
P1=D7(+)D5(+)D3(+)D1 P1`=D6(+)D4(+)D2(+)D0
这里生成了6个bit
这里(+)表示“位异或”操作
D0表示第0列的256个bit相异或。 D1表示第1列的256个bit相异或。用理D3......D7表示第7列的256个bit相异或
图中的P8和P8`是什么?
P8=C0+C2+C4............+C254
P8`=C1+C3+C5+.....+C255
P16=C0+C1+C4+C5+C8+C9...............+C252+C253(处理2个C,跳过2个C)
P16`=C2+C3+C6+C7.................+C254+255(跳过2个C,处理2个C)
P32(处理4个C,跳过4个C)
P32`(跳过4个C,处理4个C)
.....................
.....................
Pn(处理128个C,跳过128个C)
Pn(跳过128个C,处理128个C)
总共会生成16个bit。
C0对应第1行的8个bit相异或。C1对应第2行的8个bit相异或..........c255对应第第256行。
这个图是网上找,说实话不是很好,但是懒得画了,所以参数看起来有点怪。
对行和列分别处理行处理生成16bit,列处理生成了6bit。每256个字节我们用3字节来装ECC。所以多出来了2bit,这2bit是保留位。