F280049C实现ecc功能——关于ecc的计算问题

Flash API例程使用遇到的问题总结-CSDN博客中提到TI论坛上大神给了我一段代码,协助我完成了对于ECC的计算,代码如下:

void ManualEccValues(uint32 startAddress, uint32 *Buffer32)
{
    uint32 i;
    uint64 *LData, *HData;
 
    // Loop through all data blocks
    for (i = 0; i < (WORDS_IN_FLASH_BUFFER + 1)/8; i++)
    {
       // 将 LData 指向 Buffer 中的低 64 位数据(即 Buffer[0] 和 Buffer[1])
       LData = (uint64 *)(Buffer32);
 
       // 将 HData 指向 Buffer 中的高 64 位数据(即 Buffer[2] 和 Buffer[3])
       HData = (uint64 *)(Buffer32 + 2);
 
       // 计算低 64 位的 ECC
       uint16 ECC_LB = Fapi_calculateEcc(startAddress, *LData);
 
       // 计算高 64 位的 ECC
       uint16 ECC_HB = Fapi_calculateEcc(startAddress + 4, *HData);
 
       // 将两个 ECC 值合并为一个 16 位的 ECC
       uint16 ECC_B = ((ECC_HB << 8) | ECC_LB);
 
       ECCValues_manual[i] = ECC_B;
       Buffer32 += 4;
       startAddress += 8;
    }
 
}

之前我读取连续四个地址的64位数据,然后计算ecc的结果不正确,上面的代码分别计算了低64位和高64位ecc值,一共是128位。为什么要进行这样的分段呢?这几天又去查了文档,在技术手册3.12.10节Error Correction Code(ECC) Protection中给出了下面这张图:

可以看到它的存储方式是128位对齐方式,即数据按128位的存储块访问。这128位数据包含了低64位的数据Data[63:0]和与之对应的8位ECC[7:0];高64位的数据Data[127:64]和对应的8位ECC[15:8]。

或者也可以理解Flash中每个扇区为ECC内存分配的大小为512×16:

这16位的ECC分别来自高64位数据和低64位数据,因此在实现过程中需要分为两个数据段来进行操作(可以理解为以Buffer[0]和[1]作为低64位,然后Buffer[2]和[3]作为高64位,为了计算完整个扇区的数据编写循环即可)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值