ZHCAAO5A June 2020 – August 2021 ADS112C04 , ADS112U04 , ADS114S06 , ADS114S08 , ADS122C04 , ADS122U04 , ADS1235 , ADS1235-Q1 , ADS124S06 , ADS124S08 , ADS1259 , ADS1259-Q1 , ADS125H01 , ADS125H02 , ADS1260 , ADS1260-Q1 , ADS1261 , ADS1262 , ADS1263 , ADS127L01 , ADS131A02 , ADS131A04 , ADS131M04 , ADS131M06 , ADS131M08
用于存储表数组的存储器大小将取决于待返回的 CRC 值的大小。为了提高效率,表边界应设置为字节对齐。该表包含 256 个 16 位条目(对于 16 位 CRC)或 256 个 8 位条目(对于 8 位 CRC)。
typedef crc_t uint16_t; // 对于 8 位 CRC,使用 uint8_t
#define POLYNOMIAL 0x1021 // CRC16-CCITT,但对于 8 位 CRC,使用 CRC-8-ATM (HEC)
// 和多项式值 0x07
#define REMAINDER_INIT 0xFFFF // CRC16-CCITT,但对于 8 位 CRC,使用 CRC-8-ATM(HEC),
// 对于 ADS1260、ADS1261 和 ADS1235 上的 8 位 CRC,使用 0xFF
// 对于 ADS124S0x、ADS114S0x、ADS1262 和 ADS1263 上的 8 位 CRC,使用 0x00
#define WIDTH (8 * sizeof(crc_t))
crc_t crcTable[256];
/**
* 初始化要存储在存储器中的 CRC 查找表。
*
* \详细信息:对单个字节中包含的每个可能组合进行 CRC 计算,
* 然后将其存储到 crcTable 数组中,其中每个数组元素与一个
* 特定字节值相关。
*
*
* \返回 void。
*/
void initCRCtable(void)
{
crc_t remainder;
uint32_t byte, bit;
// 对数据包中的每个字节
// 执行多项式长除法
for(byte = 0; byte < 256; byte++)
{
remainder = (byte << (WIDTH - 8)); // 将下一个字节取到余数中
for(bit = 8; bit > 0; bit--) // 对于余数中的每个字节
{
if(remainder & (1 << (WIDTH - 1)))
remainder = (remainder << 1) ^ POLYNOMIAL; // 如果最高位置 1,则将余数
// 左移并将其与除数异或,
else // 然后将结果存储
// 在余数中
remainder = (remainder << 1); // 如果最高位清零,则左移
// 余数
}
crcTable[byte] = remainder;
}
}