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
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 位余数构成。
除数除被除数的过程会得到余数 B72Ch(如图 3-2 所示),这将是 ADS122C04 在发送转换数据后发送的 CRC 值。
对于串行传输数据的 ADC 器件,硬件实现通常通过移位寄存器来执行,此时随着数据的移出计算出 CRC。可能需要对数据进行反转或反射以进行 CRC 计算,具体取决于接口类型。数据反射只是传输位顺序的交换。在Topic Link Label3.1.3中比较 ADS122C04 (I2C) 和 ADS122U04 (UART) 器件的 CRC 计算时,更详细地讨论了该顺序为何如此重要。数据传输的区别在于 UART 是 LSB 优先,而 I2C 是 MSB 优先。在数据传输到存储器时对 UART 接收缓冲区的读取变得复杂起来。在读取接收缓冲区时,位的顺序相对于每个字节的传输顺序进行了反转或反射。在计算 CRC 时,必须使用传输时位的正确顺序。
微控制器还可以使用硬件实现来计算 CRC。除了 CRC 硬件实现之外,嵌入式处理器代码也可以完成与长除法所执行的任务相同的任务,方法是使用类似的异或过程并循环遍历每个位和字节,然后将 CRC 作为余数返回。异或过程在函数内作为按位运算过程需要耗费大量的时间。另一种常用的方法是使用查找表来处理这些值。以下内容分别对按位异或和查找表这两种方法进行了讨论。