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 可用于传输长度达几百位、几千位甚至更长的数据。在大多数情况下,针对嵌入式应用讨论的通用 CRC 代码基于 32 位或更短的短数据传输长度。数据是面向字节的,以字节的倍数进行传输,最长为 4 个字节(对于 32 位传输)。如果最大数据传输长度是 8 位的倍数,则可使用指向存储器阵列的指针来完成 CRC 计算。

CRC 是通过用数据除以多项式来实现的,因此讨论的初始部分将说明使用长除法确定余数的过程。传输的数据值被所使用的多项式除。当数据是被除数时,在这种情况下使用的初始值为零。这与将 0h 和数据执行异或运算等效,结果与数据相等。完成的长除法(其中除数为多项式,被除数为数据)的余数成为计算出的 CRC 值。因此用数据(被除数)除以多项式(除数),计算出的结果为商。计算得到的余数是 CRC 值。

当初始值为零且数据有前导零时,CRC 计算将忽略计算中的前导零。为了使 CRC 计算更加稳妥以包括任何前导零,使用了零以外的初始值。最常见的非零初始值是针对所使用的 CRC 大小的全 1。8 位 CRC 的非零初始值为 FFh,16 位 CRC 的非零初始值为 FFFFh。ADC 器件数据表中指定了计算的初始值。然后将初始值和数据一起进行异或运算以得到被除数。

ADC 实现的多项式通常是标准 CRC 多项式,例如 CRC-8-ATM 或 CRC-16-CCITT。这些多项式已被证明对数据传输完整性检查是有效的。通常,这些标准 CRC 算法之一是在嵌入式微控制器中实现的,可加快计算速度。ADS122C04 使用 16 位多项式 CRC-16-CCITT,它已广泛用于通信数据传输。该多项式是 x16 + x12 + x5 + 1,等效于 10001000000100001b。生成的 CRC 结果是用数据除以多项式的长除法得到的余数。除了提及两个值的减法变成异或运算之外,此处的讨论不详细介绍模 2 数学运算的过程。

ADS122C04 的初始 16 位起始值在数据表中作为 FFFFh 给出。图 3-1 中的示例使用长度为 24 位的数据值,这类似于转换结果。该示例使用值 4E6878h 作为数据。

由于最终结果将是 16 位的余数,初始值附加零,这样总长度将由数据长度加上 16 位余数构成。

  1. 初始值 = 0xFFFF(根据 ADS122C04 数据表)
  2. 在初始值右侧填充 24 个“0”,从而使初始值的总长度为转换数据的长度加上 CRC 的长度(一共 40 位)
  3. 将左对齐的初始值与转换后的值进行异或运算:FFFF000000h XOR 4E68780000h = 0xB197780000(请参阅图 3-1
  4. 将步骤 2 的结果除以多项式:B197780000h ÷ 11021h,然后取余数 B72Ch 作为计算出的 CRC 值

除数除被除数的过程会得到余数 B72Ch(如图 3-2 所示),这将是 ADS122C04 在发送转换数据后发送的 CRC 值。

GUID-DB4063A1-A99A-4364-830E-284C5064C378-low.gif图 3-1 通过将初始值和数据执行异或运算来计算 CRC 计算的起始值示例
GUID-BC6EFE6B-59CB-4D43-BA6C-AB05E84A2ECD-low.gif图 3-2 两个具有二进制系数的多项式的二进制长除法

对于串行传输数据的 ADC 器件,硬件实现通常通过移位寄存器来执行,此时随着数据的移出计算出 CRC。可能需要对数据进行反转或反射以进行 CRC 计算,具体取决于接口类型。数据反射只是传输位顺序的交换。在Topic Link Label3.1.3中比较 ADS122C04 (I2C) 和 ADS122U04 (UART) 器件的 CRC 计算时,更详细地讨论了该顺序为何如此重要。数据传输的区别在于 UART 是 LSB 优先,而 I2C 是 MSB 优先。在数据传输到存储器时对 UART 接收缓冲区的读取变得复杂起来。在读取接收缓冲区时,位的顺序相对于每个字节的传输顺序进行了反转或反射。在计算 CRC 时,必须使用传输时位的正确顺序。

微控制器还可以使用硬件实现来计算 CRC。除了 CRC 硬件实现之外,嵌入式处理器代码也可以完成与长除法所执行的任务相同的任务,方法是使用类似的异或过程并循环遍历每个位和字节,然后将 CRC 作为余数返回。异或过程在函数内作为按位运算过程需要耗费大量的时间。另一种常用的方法是使用查找表来处理这些值。以下内容分别对按位异或和查找表这两种方法进行了讨论。