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

ADS122U04 和 ADS122C04 之间的 CRC 计算差异

正如概述中提到的,CRC 值是相对于数据传输的位顺序计算出的,因为它被移出器件。与“C”器件相比,“U”器件的数据传输有很大不同。“U”器件使用 UART 传输,数据以 LSB 优先的方式进行传输,而“C”器件使用 I2C 传输,数据以 MSB 优先的方式进行传输。如图 3-5 所示,在采用 MSB 优先的传输方式时,数据被读入微控制器外设并以与数据传输相同的方式重新组合(在使用大端字节序格式时)。

GUID-6F521098-72CA-40E9-9686-D6FB8F291CAD-low.gif图 3-5 MSB 优先方式中用于移动数据的存储器的内容

“U”器件的 CRC 计算遵循与图 3-3 中所示过程相同的过程。不过,“U”器件的不同之处在于移位寄存器首先从 LSB(而不是 MSB)开始。结果直接影响 CRC 计算和数据存储到存储器中的字节顺序。

当通过代码函数计算 CRC 时,了解数据存储的方法用处极大。例如,考虑一个由字节(8 位)可寻址位置构成的存储器。一个 32 位整数由四个相邻的字节组成。将该整数视为一个包含四个字节的数组。如果存储在数组第一个元素中的值是该整数的最高有效字节 (MSB),则该值以大端字节序的方式进行存储。如果最低有效字节 (LSB) 存储为数组的第一个元素,则该整数以小端字节序的方式进行存储。表 3-1 所示为有关 32 位值如何存储在存储器中的对比情况。当数据以 MSB 优先的方式进行传输时,传输顺序遵循大端字节序格式。相反,当数据以 LSB 优先的方式进行传输时,传输顺序遵循小端字节序格式。对于此处讨论的内容,微控制器将使用大端字节序格式。不过,在这两种方法中,字节数组元素的最高有效位都是第 7 位,最低有效位都是第 0 位。

表 3-1 32 位数据的存储器寻址
32 位数据存储器地址大端字节序小端字节序
0A0B0C0Dh0h0Ah (MSB)0Dh (LSB)
1h0Bh0Ch
2h0Ch0Bh
3h0Dh (LSB)0Ah (MSB)

CRC 的计算仅基于数据传输位和字节的顺序。不过,LSB 优先的数据被传输到微控制器 UART 外设,在此处,接口将以 LSB 优先的方式移动数据,但存储器中的内容顺序将与其传输的顺序相反。传输的数据与存储器中的数据顺序相反,因此微控制器计算出的 CRC 值在位和字节顺序上都不正确。对于以 LSB 优先的方式传输的数据,必须对字节顺序和每个字节内的位顺序进行反转或反射才能进行计算(请参阅图 3-6)。

GUID-F77ADBBA-9ACE-40EF-AF44-EBA83543F00F-low.gif图 3-6 LSB 优先方式中用于移动数据的存储器的内容,需要反射才能进行 CRC 计算

如果微控制器存储器采用大端字节序方式并且接收到的 UART 转换数据存储为有符号的 32 位整数,那么仅仅反转表示整数值的字节的顺序是不够的。部分原因是原始数据是 24 位(16 位器件为 16 位),而整数值进行了符号扩展。此外,大多数微控制器 UART 外设会在时钟脉冲下以 LSB 优先的方式将数据输入到 8 位移位寄存器中,但会以相反的方向将字节存储在存储器中。外设将在存储器中重新对齐位顺序,这是位传输顺序的相反顺序或是其的反射。不过,在计算数据包的 CRC 时,位的顺序和数量必须与传输的位的顺序和数量相匹配。例如,如果将 24 位转换结果存储为有符号的 32 位值,则在执行 CRC 计算时,必须使用已进行正确反射的原始二进制补码 3 字节数据,而不是已进行符号扩展的 4 字节有符号数。

作为所需步骤的示例,下面介绍了如何通过一个有符号 32 位整数数组 (sData) 创建一个表示 24 位转换数据的数组 (cData)。新数组 (cData) 用于计算 CRC,以便与从 ADS122U04 传输的 CRC 进行比较。

  1. 将 sData 数组复制到 cData 数组中,其中 cData 数组表示小端字节序格式,如图 3-7 所示。
  2. 转换数据为 24 位,因此请勿在 cData 数组中使用进行了符号扩展的字节。
  3. cData 数组现在包含正确的字节顺序,但其位顺序不正确。
  4. 对于 cData 数组中的每个字节元素,反射位顺序,使位顺序与最初的传输顺序相同,如表 3-2 所示。
  5. 计算 cData 数组中前三个元素的 CRC。

GUID-829F8C41-29E8-46C0-B8B5-A4744D52D1D4-low.gif图 3-7 更改字节顺序以反映 LSB 优先
表 3-2 使用 LSB 优先方式将有符号 32 位整数转换为 24 位整数后进行反射,以用于 CRC 计算
数组元素sData(32 位)cData(24 位)反射后的 cData
000h78h (0111 1000b)1Eh (0001 1110b)
14Eh68h (0110 1000b)16h (0001 0110b)
268h4Eh (0100 1110b)72h (0111 0010b)
378hN/AN/A