ECC的全称是Error Checking and Correction,是一种用于
Nand
的差错检测和修正算法。如果操作时序和电路稳定性不存在问题的话,
NAND Flash
出错的时候一般不会造成整个
Block
或是
Page
不能读取或是全部出错,而是整个
Page
(例如
512Bytes
)中只有一个或几个
bit
出错。
ECC
能纠正1
个比特错误和检测2
个比特错误,而且计算速度很快,但对
1
比特以上的错误无法纠正,对
2
比特以上的错误不保证能检测。
校验码生成算法:ECC 校验每次对 256 字节的数据进行操作,包含列校验和行校验。对每个待校验的 Bit 位求异或,若结果为 0 ,则表明含有偶数个 1 ;若结果为 1 ,则表明含有奇数个 1 。列校验规则如表 1 所示。 256 字节数据形成 256 行、 8 列的矩阵,矩阵每个元素表示一个 Bit 位。
其中CP0 ~ CP5 为六个 Bit 位,表示 Column Parity (列极性),
CP0 为第 0 、 2 、 4 、 6 列的极性, CP1 为第 1 、 3 、 5 、 7 列的极性,
CP2 为第0、 1 、 4 、 5 列的极性, CP3 为第2、 3 、 6 、 7 列的极性,
CP4 为第 0 、 1 、 2 、 3 列的极性, CP5 为第 4 、 5 、 6 、 7 列的极性。
用公式表示就是: CP0=Bit0^Bit2^Bit4^Bit6, 表示第 0 列内部 256 个 Bit 位异或之后再跟第 2 列 256 个 Bit 位异或,再跟第 4 列、第 6 列的每个 Bit 位异或,这样, CP0 其实是 256*4=1024 个 Bit 位异或的结果。 CP1 ~ CP5 依此类推。
行校验如下图所示
其中RP0 ~ RP15 为十六个 Bit 位,表示 Row Parity (行极性),
RP0 为第 0 、 2 、 4 、 6 、….252、 254 个字节的极性
RP1-----1、 3 、 5 、 7……253、 255
RP2----0 、 1 、 4 、 5 、 8 、 9…..252、 253 (处理 2 个 Byte ,跳过 2 个 Byte )
RP3---- 2 、 3 、 6 、 7 、 10 、 11…..254 、 255 (跳过 2 个 Byte ,处理 2 个 Byte )
RP4---- 处理 4 个 Byte ,跳过 4 个 Byte ;
RP5---- 跳过 4 个 Byte ,处理 4 个 Byte ;
RP6---- 处理 8 个 Byte ,跳过 8 个 Byte
RP7---- 跳过 8 个 Byte ,处理 8 个 Byte ;
RP8---- 处理 16 个 Byte ,跳过 16 个 Byte
RP9---- 跳过 16 个 Byte ,处理 16 个 Byte ;
RP10----处理 32 个 Byte ,跳过 32 个 Byte
RP11---- 跳过 32 个 Byte ,处理 32 个 Byte ;
RP12----处理 64 个 Byte ,跳过 64 个 Byte
RP13---- 跳过 64 个 Byte ,处理 64 个 Byte ;
RP14----处理 128 个 Byte ,跳过 128 个 Byte
RP15---- 跳过 128 个 Byte ,处理 128 个 Byte ;
可见,RP0 ~ RP15 每个 Bit 位都是 128 个字节(也就是 128 行)即 128*8=1024 个 Bit 位求异或的结果。
综上所述,对 256 字节的数据共生成了 6 个 Bit 的列校验结果, 16 个 Bit 的行校验结果,共 22 个 Bit 。在 Nand 中使用 3 个字节存放校验结果,多余的两个 Bit 位置 1 。存放次序如下表所示:
以 K9F1208 为例,每个 Page 页包含 512 字节的数据区和 16 字节的 OOB 区。前 256 字节数据生成 3 字节 ECC 校验码,后 256 字节数据生成 3 字节 ECC 校验码,共 6 字节 ECC 校验码存放在 OOB 区中,存放的位置为 OOB 区的第 0 、 1 、 2 和 3 、 6 、 7 字节。