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 计算

可以通过多种方式重新组合数据,同时实现相同的结果。一种方法是使用指向数据数组的指针,然后按照经过反射的位和字节顺序将内容存储到另一个数组中。

/**
 * 重新配置数据以进行 CRC 计算(与 LSB 优先传输方式进行对比)。
 *
 * \详细信息:以提交的字节的相反顺序重新排列位,
 * 并为 CRC 更改计算的字节顺序。必须执行该操作,因为总是按照
 * LSB 优先的顺序从 UART 向外传输数据。
 *
 * \参数 uint8_t *data 是指向数据数组的指针。
 * \参数 uint32_t length 是数据数组的长度。
 *
 * \返回计算得到的 crc_t CRCvalue。
 */
crc_t formatCRCdata(uint8_t *data, uint32_t length)
{
    uint32_t u32i, u32j;
    uint8_t checkCRC[length];
    crc_t dataCRC;
    // 将 LSB 作为 CRC 数组中的第一个元素开始复制
    u32j = length - 1;
    for(u32i = 0; u32i < length; u32i++)         // 对于数据包中的每个字节
    {    
        checkCRC[u32i] = revByte((data[u32j]));  // 反转字节
        u32j--;
    }
    dataCRC = crcBitwise(checkCRC, length);      // 或 TableCRCcalc(checkCRC, length)
    return dataCRC;
}