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

引言

数字传输几乎涉及生活的方方面面,而且,传输的长度、距离和速度会各不相同。数字流在卫星电视和智能手机数据中很常见。在许多情况下,传输中发生错误仅仅会带来一些微小的影响,例如图像信号瞬间失真或音频出现咔嗒声或砰砰声。不过,在关键系统中,错误会导致严重的问题,甚至会危及生命。例如,自动驾驶汽车和飞机中的飞行控制系统就属于关键系统,而将数据保存到计算机上的存储介质,需要高度的数据完整性但又不会对生命造成威胁。

数字数据流受干扰的原因可能有多种。理想情况下,保持数据完整性的较好方法是首先防止产生干扰。但即使在系统设计中采用最佳做法,仍有可能发生不可预见的事件,从而改变数字数据的传输。

在设计系统时,首先要分析干扰所带来的影响。如果关键系统(如飞行控制系统)内存在干扰,则需要了解干扰发生的时间并在发生干扰时发出警报或防止数据受损。为了查明是否存在数字传输错误或故障,可使用一种数据分析方法来确定是否发生数据损坏。为了更好地了解故障情况,需要了解数据中存在的错误类型。

使用通信数据包中的简单通过或不通过(有时也被称为 ACK 或 NACK)示例,有助于理解数据验证的必要性。许多人都熟悉 I2C 通信协议,因此本文将以该协议作为示例。I2C 使用 8 位数据传输,随后的第 9 位表示接收器件的反馈数据传输是有效 (ACK) 还是无效 (NACK)。如果接收器件在第 9 个时钟 (SCL) 位使数据线 (SDA) 保持在低电平,则发送器件得知通信信息已接收并被确认 (ACK)。不过,这种类型的系统不会明确表示数据是否真正有效,而是仅表示是否已按预期接收数据(ACK 或 NACK)。这种方法中没有任何机制来确定器件间传输的数据是否有效。

另一种常见的数字通信方法是使用通用异步接收器/发送器 (UART)。根据具体实现方式,数据传输使用奇偶校验法来检查数据的完整性。数据的每个字节都配备一个开始位和一个停止位,数据位介于开始位和停止位之间。奇偶校验法用于确定 ASCII 字符是否按预期传输。数据包含一个 7 位 ASCII 字符和一个奇偶校验位,共 8 位数据。在二进制中,对所传输字符 7 个位中每一个值为“1”的位进行计数。例如,ASCII 字符“A”的值为 41h 或 1000001b,其中包含两个“1”。术语偶校验和奇校验告知最终用户在包含奇偶校验位时奇偶校验位的值是与偶数个“1”值相关还是与奇数个“1”值相关。使用奇偶校验可在一定程度上确认数据是有效还是无效。不过,尽管这种简单的奇偶校验很有用,但通信中的多个位可能发生翻转,从而显示为有效数据,但实际上可能无效。通信随着数据长度和速度的增加而不断发展,随着传输的数据包变得更多、更大,数据完整性问题日益凸显,这就要求采用更全面的方法来验证数据传输。

随着使用调制解调器连接计算机、服务器和互联网来进行二进制数据传输这种方式日益普及,数据完整性验证技术也得到了改进。调制解调器速度提高了,人们就更需要一种更好的方法来检测数字传输中是否发生错误。数据完整性不仅仅是一个点对点问题,而且还是涉及有线和无线网络以及数据向多个端点传输的主要问题。

嵌入式系统会产生类似的数据完整性问题,其中有许多可选方法来确保数据完整性。一种简单的方法是发送数据,然后让接收方将数据返回给发送方进行比较,以此来验证数据。其他系统可能采用对数据取反以进行比较或使用数据校验和的方法。还有一种更复杂的方法,即使用基于多项式的循环冗余校验 (CRC)。在上述方法中,每一种都具有不同的集成难度和不同的数据完整性结果。

表 1-1 数据完整性方法
方法 优势 劣势
对数据取反 可以轻松快速地进行计算 传输长度加倍;
无纠错功能
奇偶校验 可以轻松快速地进行计算;
检测短数据包中的单个位错误
许多组合都会导致相同的奇偶校验值,因此容易出错;
仅对小数据包有用;
无纠错功能
校验和 可以轻松快速地进行计算;
检测短数据包中的单个位错误和某些多位错误
许多组合都会导致相同的校验和值,因此容易出错;
仅对小数据包有用;
无纠错功能
CRC 会产生相同 CRC 值的位翻转组合更少,因此可以进行更全面的分析 需要冗长的计算时间或可以使用 LUT,但会增加存储器使用量;
无纠错功能
汉明码 可以增加对多位错误的检测;
可以实现单个位纠错
需要冗长的计算时间

并非所有模数转换器 (ADC) 都具有用于确定通信错误的内置硬件方法。对于这些类型的器件,应通过读取来验证写入器件的任何内容。对于转换数据,应多次读取结果并比较接收到的结果。ADC 器件数据表将指明是否有可用于数据完整性检查的硬件方法,以及器件是检查传入和传出数据的完整性还是仅检查传出数据的完整性。在为特定应用选择 ADC 时,应考虑系统在受 ADC 支持的数据完整性方法方面的关键性。

校验和以及 CRC 是 ADC 常用的硬件方法,用于将编码值附加到传输的数据消息的末尾。附加的信息用于确定传输中是否发生错误。对于使用校验和的器件(例如 ADS1259),转换数据后跟一个校验和字节。校验和是 24 位转换结果中的三个数据字节和常数 9Bh 之和。该常数对数据应用了一个偏移量,从而降低同一个校验和多次出现的可能性。在将这些字节相加时,计算中会忽略任何溢出。将计算出的校验和结果与传输的校验和进行比较,如果计算出的校验和等于校验和字节,则验证通过。

当采用 CRC 检测数据完整性时(以 ADS124S08 为例),接收方必须在完成传输后验证数据,计算所传输数据的消息部分并与传输的 CRC 值进行比较。如果计算出的 CRC 值与传输的 CRC 值不匹配,则说明传输出现错误。这样的比较就类似于使用校验和,但计算方式存在很大不同。与校验和相比,CRC 可实现更高精度的数据验证,但 CRC 使用多项式除法而不是校验和的简单加法,因此涉及更多的处理工作。

除 CRC 之外,ADS122U04 和 ADS122C04 系列提供的一些硬件方法也支持不太复杂的数据完整性验证方法。这些器件中采用的功能是通过将数据传输两次来实现的。第一次传输的是未取反的数据,第二次传输的是按位取反值的原始数据。如果通信成功,则在对两次传输的数据执行异或运算后,每个位都为“1”(没有“0”)。

本应用手册的一个重点内容是介绍如何使用校验和及 CRC,包括使用“C”固件的嵌入式处理器所涉及的计算和函数。也可以使用其他计算方法,但这需在处理器内使用内部硬件外设。不过,处理器的硬件 CRC 外设可能与 ADC 使用的多项式实现不完全相同,具体取决于所用多项式。

大多数信息和示例也可在修改后用于其他 ADC,例如 ADS124S08、ADS1261 和 ADS1262 系列器件。此外,本应用手册还讨论了使用汉明码进行数据完整性检测,而且 ADS131A04 系列器件支持这一功能。ADS131A04 器件经配置可用于关键应用,对该器件而言可在传入和传出通信中验证数据完整性。汉明码选项支持单个位检错和纠错。汉明字节内有一个简单的 2 位校验和,有助于判定一些多位错误。除汉明码/校验和之外,还可将 CRC 添加到传输中以发现大多数多位错误。

表 1-2 器件和数据完整性方法示例列表
器件 接口 数据方向 使用的验证数据完整性的方法 多项式 数据完整性计算
ADS122C04 I2C MSB 优先 对数据取反;
CRC-16-CCITT
x16 + x12 + x5 + 1;
初始值 FFFFh
寄存器读取、24 位转换结果和数据计数器字节(启用时)
ADS122U04 UART LSB 优先 对数据取反;
CRC-16-CCITT
x16 + x12 + x5 + 1;
初始值 FFFFh
寄存器读取、24 位转换结果和数据计数器字节(启用时)
ADS124S08 SPI MSB 优先 CRC-8-ATM (HEC) x8 + x2 + x + 1;
初始值 00h
24 位转换结果和状态字节(启用时)
ADS131A04 SPI MSB 优先 CRC-16-CCITT
和/或汉明码
x16 + x12 + x5 + 1;
初始值 FFFFh
传入和传出传输;CRC 和汉明码可同时启用
ADS1259 SPI MSB 优先 校验和 不适用 24 位转换数据加上 9Bh 的偏移量
ADS1261 SPI MSB 优先 CRC-8-ATM (HEC) x8 + x2 + x + 1;
初始值 FFh
传入命令;24 位转换结果和状态字节(启用时)
ADS1262 SPI MSB 优先 校验和或
CRC-8-ATM (HEC)
x8 + x2 + x + 1;
初始值 00h
32 位转换数据加上 9Bh 偏移量的校验和或仅 32 位转换数据(使用 CRC 时)