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
汉明码计算法既可用于计算待传输的数据,也可用于验证接收的数据。汉明位掩码应用于五个汉明位中的每一个位的数据。此外,还会计算校验和并将其附加到结果中。返回的值是以无符号 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));
}