This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 《TMS320F280049C:FLASH_API 指南中的 ECC 计算算法问题》

Guru**** 2481465 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1459832/tms320f280049c-the-question-of-ecc-calculation-algorithm-in-flash_api-guide

器件型号:TMS320F280049C

工具与软件:

大家好!

我目前使用的是用于 TMS320F28004X 的闪存 API、我会按照参考指南中的规定实施 ECC 计算。 以下是文档中的函数代码、用于计算给定64位数据块和地址的 ECC:

uint16 CalcEcc (uint32地址、uint64数据)

CONST UINT32 addrsyndesd[8]={0x554ea、0x0bad1、0x2a9b5、0x6a78d、0x19f83、 0x07f80、0x7ff80、0x0007f};
const uint64 datasyndesd[8]={0xb4d1b4d14b2e4b2e、0x155715571557、0xa699a699a699a699、0x38e338e338e338e3、
0xc0fcc0fcc0fcc0fc、0xff00ff00ff00、0xff0000ff0000ff、0x00ff00ff0000ff};
const uint16奇偶校验= 0xFC;//奇偶校验位
uint16 eccVal = 0;
uint16位、eccBit;
uint64 xorData;
uint32 xorAddr;

debugdr =地址;
//从地址提取位[20:2](对齐)
debugadr_shift =(地址>> 2)和0x7FFFF;

//计算每个位的 ECC
对于(位= 0;位< 8;位++)

//地址综合征
xorAddr =(debugdr_shift >>位)& addrsyndesdem[bit];
xorData = DATA & datasynthed[bit];

//将屏蔽的地址折叠到一个位以进行奇偶校验计算。
//结果将显示为 LSB。
//
xorAddr = xorAddr ^(xorAddr >> 16);
xorAddr = xorAddr ^(xorAddr >> 8);
xorAddr = xorAddr ^(xorAddr >> 4);
xorAddr = xorAddr ^(xorAddr >> 2);
xorAddr = xorAddr ^(xorAddr >> 1);

xorData = xorData ^(xorData >> 32);
xorData = xorData ^(xorData >> 16);
xorData = xorData ^(xorData >> 8);
xorData = xorData ^(xorData >> 4);
xorData = xorData ^(xorData >> 2);
xorData = xorData ^(xorData >> 1);

//异或地址综合征以及相应的数据位
eccBit =((uint16) xorData ^(uint16) xorAddr)& 0x0001;

//将 ECC 位添加到 ECC 值中
eccVal |=(eccBit <<位);
}

//为奇数位奇校验添加奇校验
eccVal ^=奇偶校验;

返回 eccVal;

}

我目前正在尝试了解输入参数data及其与闪存结构的相关性。 下面是我被混淆的具体要点:

该函数计算64位数据的8位 ECC。 这是否意味着输入data需要从存储在中的64位数据收集  连续4个地址 以形成一个64位数据块进行 ECC 计算?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    该函数将计算包括地址在内的64位对齐字的 ECC。 是的、您必须提供存储在4个连续地址中的64位数据(您可以使用64位指针)。 您可以使用 以下代码片段。

     uint64 *LData、*HData;

    //
    //将 LData 指向低64位数据
    //和 HData 到较高的64位数据
    //
    LData =(uint64 *)(Buffer32);
    HTData =(uint64 *)(Buffer32 + 2);

    //
    //计算低64位和高64位数据的 ECC
    //
    ECC_LB = Fapi_calculateEcc (u32Index、* LData);
    ECC_HB = Fapi_calculateEcc (u32Index+4、* HData);
    ECC_B =((ECC_HB<<8)| ECC_LB);

    此致、

    Rajeshwary

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢您的详细解释和提供代码片段! 您的回复澄清了我在如何处理64位对齐数据和正确计算 ECC 值方面的困惑。

    此致、
    Riddy

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很高兴您的问题得到解决。

    此致、

    Rajeshwary