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修订历史记录

汉明验证

汉明位是通过以下方式计算得出的:获取接收到的数据并计算汉明位,然后通过按位异或的方式与接收到的汉明位进行比较。

/**
 * 通过重新计算并与传输的数据执行异或运算以进行比较来验证汉明/数据位。
 *
 * \详细信息:通过为每个汉明位使用位掩码,然后计算掩码值中
 * 置 1 的位的数量,来计算汉明位。  该操作执行 5 次,
 * 针对每个汉明位执行一次。此外,会计算校验和,返回附加到 24 位
 * 数据的完整字节。用于计算的“in”值假定
 * 传输的数据不包含汉明字节。计算完成后,
 * 将汉明字节添加到输入值中,这是通过将 24 位值
 * 左移 8 位来完成的。
 *
 * \参数 uint32_t in 是要计算和比较的值。
 *
 * \返回 uint32_t ham,如果与汉明位/校验和的计算结果相匹配,则返回 0。
 */
uint32_t checkHamming(uint32_t in)
{
    // 验证汉明位时,取输入数据并计算汉明值,然后减去
    //    汉明字节
    // 所以取“in”并右移 8 位,然后计算汉明值
    uint32_t ham = calcHamming((in & 0xFFFFFF00) >> 8);
    // 计算出的汉明字节与从数据返回的汉明字节进行异或运算,
    //    在理想情况下结果对于汉明码加上校验和为 0,因为汉明值
    //    是完整的 32 位字,汉明字节是从数据中计算出来的,然后
    //    与实际传输的汉明字节进行比较
    uint32_t res = ham ^ in;
    if(res == 0) return res;
    else return (ham & 0x000000FF);
}