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

汉明码计算示例

汉明码计算法既可用于计算待传输的数据,也可用于验证接收的数据。汉明位掩码应用于五个汉明位中的每一个位的数据。此外,还会计算校验和并将其附加到结果中。返回的值是以无符号 32 位整数表示的 24 位数据和汉明字节。

#define HAMMING_BIT0_MASK 0x00DAB555
#define HAMMING_BIT1_MASK 0x00B66CCC
#define HAMMING_BIT2_MASK 0x0071E3C3
#define HAMMING_BIT3_MASK 0x000FE03F
#define HAMMING_BIT4_MASK 0x00001FFF
#define CHECKSUM_BIT_MASK 0xFFFFFF00
#define HC_FIX_FAIL 0xFFFFFFFF
/**
 * 计算输入的 24 位数据的汉明位。
 *
 * \详细信息:通过为每个汉明位使用位掩码,然后计算掩码值中
 * 置 1 的位的数量,来计算汉明位。  该操作执行 5 次,
 * 针对每个汉明位执行一次。此外,会计算校验和,返回附加到 24 位
 * 数据的完整字节。用于计算的“in”值假定
 * 传输的数据不包含汉明字节。计算完成后,
 * 将汉明字节添加到输入值中,这是通过将 24 位值
 * 左移 8 位来完成的。
 *
 * \参数 uint32_t in 是要计算的值。
 *
 * \返回 uint32_t out,其中包含附加了汉明字节值的 24 位数据。
 */
uint32_t calcHamming(uint32_t in)
{
    // 获取传递的整数值并将其转换为在传回时将包含
    //    汉明字节的格式
    uint32_t out = in << 8;
    // 通过获取输入值,与掩码值进行与运算,将结果
    //   与 0x01 进行与运算,然后计算位的数量,来计算
    //   5 个汉明位。如果数量为奇数,则将汉明位置 1,使数量为偶数。 
    // 如果数量为偶数,则不将汉明位置 1。
    uint32_t hamming =
        ((countBits(HAMMING_BIT0_MASK & in) & 0x01)     ) |
        ((countBits(HAMMING_BIT1_MASK & in) & 0x01) << 1) |
        ((countBits(HAMMING_BIT2_MASK & in) & 0x01) << 2) |
        ((countBits(HAMMING_BIT3_MASK & in) & 0x01) << 3) |
        ((countBits(HAMMING_BIT4_MASK & in) & 0x01) << 4) ;
    // 将数据左移 8 位,与左移 3 位后的汉明位进行或运算,其结果与数据的校验和
    //   与 2 个位 (0x03) 进行与运算后左移 1 位的结果进行或运算,LSB 为 0,
    //   这样就得到返回值,其中共有 5 个汉明位、2 个校验和位和一个“0”位,
    //   总共 8 位。
    return    (out | (hamming << 3) | ((countBits(in) & 0x03) << 1));
}