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算法代码

Part Number: TMS320F280049C

我最近在使用 TMS320F28004X 的 Flash API,参考手册中提供了一个计算 ECC 的函数。以下是文档中给出的 ECC 计算函数代码:

uint16 CalcEcc(uint32 address, uint64 data)
{
const uint32 addrSyndrome[8] = {0x554ea, 0x0bad1, 0x2a9b5, 0x6a78d, 0x19f83, 0x07f80, 0x7ff80, 0x0007f};
const uint64 dataSyndrome[8] = {0xb4d1b4d14b2e4b2e, 0x1557155715571557, 0xa699a699a699a699, 0x38e338e338e338e3,
0xc0fcc0fcc0fcc0fc, 0xff00ff00ff00ff00, 0xff0000ffff0000ff, 0x00ffff00ff0000ff};
const uint16 parity = 0xFC; // Odd parity
uint16 eccVal = 0;
uint16 bit, eccBit;
uint64 xorData;
uint32 xorAddr;

// Extract bits [20:2] from the address (aligned)
uint32 debugaddr_shift = (address >> 2) & 0x7FFFF;

// Calculate ECC for each bit
for (bit = 0; bit < 8; bit++)
{
// Address syndrome
xorAddr = (debugaddr_shift >> bit) & addrSyndrome[bit];
xorData = data & dataSyndrome[bit];

// Fold address and data into single-bit parity
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);

// XOR address syndrome with data bits
eccBit = ((uint16)xorData ^ (uint16)xorAddr) & 0x0001;

// Add ECC bit to ECC value
eccVal |= (eccBit << bit);
}

// Add parity for odd parity
eccVal ^= parity;

return eccVal;
}

我现在对输入参数data有一些疑问。该函数的输入参数 data 表示 64 位数据,用于计算对应的8位 ECC。那么这是否意味着,每计算一个 ECC 需要从 Flash 连续读取 4 个地址中的数据(4 x 16-bit = 64-bit) 来组合成一个数据块?

x 出现错误。请重试或与管理员联系。