楼主说oob区翻转会导致出现错误的校正,这与我做的测试不符。
也和手册里的描述不符:
The parity codes have self-correctable information including parity code itself.
大致看了下楼主的代码,发现了问题所在。
手册中对翻转位置寄存器的描述如下
MLC ECC Error Byte Location Status Register (NFECCERL0~7, R, Address = 0xB0E2_00C0 ~ 0xB0E2_00DC)
ErrByteLoc1
[9:0]
Error byte location of 1st bit error
0x000
可以看到手册里描述的 ErrByteLoc 长度是10位,也就是Mask应该是0x3FF, 而楼主代码中用的mask为0x1FF。
这会有什么问题呢?
这个ECC引擎,不仅用来纠正数据错误,也用来纠正ECC错误,如果ECC本身发生翻转,ErrByteLoc 就会指向出错的ECC字节。
楼主用的这个MASK,屏蔽掉了最高1位,当数据长度为512时,导致把指向ECC的位置误认为指向数据的位置。
在ECC出错时错误地纠正了数据,这才出现了楼主描述的这种奇怪的现象。
ErrByteLoc
|
V
0 1 2 。。。 511 | ECC0 ECC1 。。。 ECCLast
DATA ECC