本帖最后由 djyos 于 2015-5-11 21:03 编辑
0.前言
STM32F103中FSMC模块可支持NOR、NAND和PC Card。对于NAND Flash器件而言,可映射(挂接)到该模块下的BANK2/3,同时这两个BANK,FSMC额外提供了硬件ECC功能,用于确保NAND Flash页数据的完整性。相对于软件实现的ECC功能,硬件ECC更为高效。本文笔者就此功能及其使用作一些说明。
首先,什么是ECC(Error checking and Correction)呢?简单来讲,它是一种对传输数据的错误检测和修正的算法。不同于NOR Flash内部结构,NAND Flash存储单元(cell)是串行组织的,当读取一个单元的时候,读出放大器(sense amplifier)所检测到信号强度会被这种串行存储结构削弱,这也难免降低了所读信号的准确性。因此如何保证NAND Flash数据的可靠性成了一个问题。ECC作为一种解决手段,被广泛使用。ECC有三种常用的算法,包括汉明码(hamming code)、RS码(Reed Solomon code)和BCH码。其中汉明码是FSMC模块的硬件ECC所采用的校验方式。
1. 汉明编码介绍
Hamming编码计算简单。通过计算块上数据包得到2个ECC值。为计算ECC值,数据包中的比特数据要先进行分割,如1/2组、1/4组、1/8组等,直到其精度达到单个比特为止,以8 bit即1 Byte的数据包为例进行说明,如图1所示。
该数据按图1所示方式进行比特分割,分别得到上方的偶校验值ECCe和下方的奇校验值ECCo。其中,1/2校验值经“异或”操作构成ECC校验的最高有效位,同理1/4校验值构成ECC校验的次高有效位,最低有效位由具体到比特的校验值填补。图2展示了两个ECC校验值的计算过程。
即偶校验值ECCe为“101”,奇校验值ECCo为“010”。图1所示为只有1 Byte数据的数据包,更大的数据包需要更多的ECC值。事实上,每n bit的ECC数值可满足2nbit数据包的校验要求。又由于这种Hamming码算法要求一对ECC数据(奇偶),所以总共要求2n bit的ECC校验数据来处理2nbit的数据包。
计算之后,原数据包和ECC数值都要写入NAND器件。稍后,原数据包将从NAND器件中读取,此时ECC值将重新计算。如果新计算的ECC不同于先前编入NAND器件的ECC,那么表明数据在读写过程中出错。
例如,原始数据01010001中有1个单一的比特出现错误,出错后的数据是01010101。经前面所示方法计算,从图3中可以清楚地看到由于数据发生了变化,2个新的ECC数值已不同与原来的ECC值。
此时把所有4个ECC数值进行按位“异或”,就可以判断是否出现了1个单一比特的错误或者是多比特的错误。如果计算结果为全“0”,说明数据在读写过程中未发生变化。如果计算的结果为全“1”,表明发生了1 bit错误,如图4所示。如果计算结果是除了全“0”和全“1”的任何一种情况,那么就是2 bit出错的情况。2 bit错误总可以检测到,然而,Hamming码算法仅能够保证更正单一比特的错误。如果两个或是更多的比特出错,那么就不能修改该出错的数据包,在这种情况下,Hamming算法就可能不能够指示出已经出现的错误。不过,考虑到SLC NAND器件的比特错误的情况,出现2、3 bit错误的可能性非常低。
对于1 bit错误的情况,出错地址可通过将原有ECCo值和新ECCo值进行按位“异或”来识别获取。通过图5中的计算,结果为2,表明原数据第2 bit位出现了问题。该计算采用奇校验数据ECCo,这是因为它们可以直接地反映出出错比特的位置。
找到出错比特后,只要通过翻转它的状态就可修复数据包,具体操作也就是将该位与“1”进行异或操作,如图6所示。
在上述举例中,校验1个8 bit数据包需要6 bit的ECC数据。在这种情况下,校验数据量达到原始数据包的数据量的75%,看上去并不令人满意。然而,随着数据包大小的增加,Hamming算法将表现得越来越有效率。由前面2n bit数据需要2n bit ECC校验的关系推知,每增加一倍的数据要求两个额外的ECC信息比特。这样,当数据增加到,比如512 Byte时,仅产生24 bit的ECC,此时用于校验的数据占原数据的比例降为0.06%,效率较高。
2.STM32的硬件ECC
STM32硬件ECC所采用的汉明算法可实现一位错误修正和两位错误检测,支持页256、512、1024、2048、4096 以及 8192bytes。当FSMC的硬件ECC功能开启后,FSMC模块根据用户设置的参数(计算页大小、数据位宽等)对NAND Flash数据线上传递的(读/写)数据进行ECC计算,数据传输结束后,ECC计算结果自动存放在ECCR寄存器中。与其他器件不同的是,STM32的硬件ECC功能只负责ECC计算的功能,而对于ECC值的校验,用户需软件实现。
假设连接了一块页大小为512bytes的NAND Flash在BANK2,先设置寄存器PRC2,配置页大小,位宽等。当需写入某一页时,先将PRC2寄存器的ECCEN位置1,即开始ECC功能,再执行数据写入命令。写完成后,读取ECCR2寄存器之中的ECC值,因为页为512大小,所以有效的ECC校验位大小应是24bit。同样的方法,读取该页时,我们同样也能在ECCR2寄存器读取到该页的ECC值。此时,拥有了写和读所产生的ECC值,继而可以对这页数据进行ECC校验了。对WECC值的奇偶位分别作异或,就可判断所读取的页数据是否与正确。一旦不正确,进一步采用汉明校验,就可以修正最多一位错误。如果错误位大于一位,则无法修正。
3.硬件ECC校验算法实现
下图是部分算法实现(经测试),详细内容请参见都江堰操作系统源码。
4.总结
STM32的硬件ECC是一个十分实用的功能,通过本文的介绍和对源码的理解,相信读者能够较容易地实现这个功能。
转帖自 都江堰操作系统论坛,原帖地址:http://djyos.com/bbs/thread-11443-1-1.html
|