为了能检测到单个位错误,把每256字节的数据划分为一张8x256共2048位的表,使用22位校验码进行校验,16位为行校验码,进行横向校验,6位为列校验码,按进行纵向校验。下图描述了这22位校验码产生的原理:
列校验:
CP0:对所有字节的Bit 6,4,2,0进行异或操作的结果
CP1:对所有字节的Bit 7,5,3,1进行异或操作的结果
.
.
CP5:对所有字节的Bit 7,6,5,4进行异或操作的结果
行校验:
LP0:对0,2,4,6...254字节的所有位进行异或操作的结果
LP1:对1,3,5,7...255字节的所有位进行异或操作的结果
.
.
LP15:对128~255字节的所有位进行异或操作的结果
22位校验码需要三个字节保存,前两字节保存16位行校验码LP0~LP15,第三字节保存6位列校验码CP0~CP5,剩余2位置1:
把数据写入Nand Flash时,我们产生校验码并将它保存到Flash的Spare Data Area。从Flash读出数据时,产生一个新的ECC校验码,将它和Spare Data Area读出的旧校验码进行异或操作:
结果为0:数据正确
结果有11位为1:数据有1位错误(可纠正)
其他结果:数据超过1位发生错误,无法纠正
下面是ECC产生算法的c++实现代码(仅满足示意用途,为了便于理解没有经过优化,在实际使用中,大量的异或运算可转为查表操作)