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

 

  1.   商标
  2. 1引言
  3. 2简单校验和
    1. 2.1 校验和代码示例
  4. 3CRC
    1. 3.1 CRC 通用计算
      1. 3.1.1 使用按位异或计算
      2. 3.1.2 使用查找表
        1. 3.1.2.1 表初始化
        2. 3.1.2.2 CRC 计算
      3. 3.1.3 ADS122U04 和 ADS122C04 之间的 CRC 计算差异
        1. 3.1.3.1 字节反射示例
        2. 3.1.3.2 使用字节反射重新组合数据以进行 CRC 计算
  5. 4汉明码
    1. 4.1 汉明码计算
      1. 4.1.1 汉明码计算示例
        1. 4.1.1.1 计算位数以进行奇偶校验和校验和计算
          1. 4.1.1.1.1 计算数据中置 1 的位的数量示例
          2. 4.1.1.1.2 使用查找表计算置 1 的位的数量示例
      2. 4.1.2 验证传输的数据
        1. 4.1.2.1 汉明验证
        2. 4.1.2.2 校验和验证
        3. 4.1.2.3 误差校正
  6. 5总结
  7. 6参考文献
  8. 7修订历史记录

表初始化

用于存储表数组的存储器大小将取决于待返回的 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;
    }
}