工具与软件:
大家好!
我目前使用的是用于 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 计算?