CRC产品参考手册

缩写词注解

缩写 词*

英文全称

中文解释

CRC8

CRC8

生成多项式最高次幂为8的CRC算法

CRC16

CRC16

生成多项式最高次幂为16的CRC算法

CRC32

CRC32

生成多项式最高次幂为32的CRC算法

CRC64

CRC64

生成多项式最高次幂为64的CRC算法

CRC

Cyclic Redundancy Check

循环冗余校验

简介

CRCL模块提供如下的算法,用于对输入数据进行循环冗余校验,用于核对数据传输过程中是否被更改或者传输错误:

  • CRC8: SAEJ1850

  • CRC8H2F: CRC8 0x2F polynomial

  • CRC16: CCITT-FALSE

  • CRC32: 0xF4ACFB13

  • CRC32P4: CRC32 0x1F4ACFB13 polynomial

  • CRC64: CRC-64-ECMA

CRCL模块提供两种算法处理机制:

查表计算法:速度快,需要占用较大的ROM。

运行时计算法:速度慢,占用较少的ROM。

参考资料

[1] AUTOSAR_SWS_CRCLibrary.pdf,R19-11

功能描述

CRC功能

CRC功能介绍

  • CRC基本概念

CRC(循环冗余校验),是基于输入数据计算一组校验码,用于核对数据传输过程中是否被更改或者传输错误。

假设D是被校验的数据,将其转换为n位的二进制表示,如:

D = (dn-1,dn-2,dn-3,…,d1,d0),其中,d0到dn-1为二进制值0或1。

以一定的规则产生一个新的二进制序列R,假设是k位的,r0到rk-1为二进制值0或1。

冗余码R附加在原始数据二进制序列后面,成为n+k位数据的二进制表示:

C = (D,R)=(dn-1,dn-2,dn-3,…,d1,d0,rk-1,…,r2,r1,r0,)。

将C除以k阶多项式,得到(k-1)阶余项r(x),则r(x)对应的二进制码r就是CRC码。

其中k阶多项式则为生成项。

  • CRC算法原理

下述是几种标准的CRC校验生成多项式:

CRC 8bit SAE J1850:

G(x) = \(x^{8} + x^{4} + x^{3} + x^{2} + 1\)

CRC 8bit 基于0x2F:

G(x) = \(x^{8} + x^{5} + x^{3} + x^{2} + x^{1} + 1\)

CRC 16bit CCITT-FALSE:

G(x) = \(x^{16} + x^{12} + x^{5} + 1\)

CRC 32bit Ethernet IEEE-802.3:

G(x) = \(x^{32} + x^{26} + x^{23} + x^{22} + x^{16} + x^{12}{+ \ x}^{11} + x^{10} + x^{8} + x^{7} + x^{5} + x^{4} + x^{2} + x^{1} + 1\)

CRC 32bit 基于0xF4ACFB13:

G(x) = \(x^{32} + x^{31} + x^{30} + x^{29} + x^{28} + x^{25}{+ \ x}^{23} + x^{21} + x^{19} + x^{18} + x^{15} + x^{14} + x^{13} + x^{12} + x^{11} + x^{9} + x^{8} + x^{4} + x^{1} + 1\)

CRC 64bit ECMA:

G(x) = \(x^{64} + \ x^{62} + x^{57} + x^{55} + x^{54} + x^{53} + x^{52} + x^{47} + x^{46} + x^{45} + x^{40} + x^{39} + x^{38} + x^{37} + x^{35} + x^{33} + x^{32} + x^{31} + x^{29} + x^{27} + x^{27} + x^{24} + x^{23} + x^{22} + x^{21} + x^{19} + x^{17} + x^{13} + x^{12} + x^{10} + x^{9} + x^{7} + x^{4} + x + 1\)

CRC校验的原理就是将需要校验的数据与按规则产生的数据进行异或运算,得到的余数即为校验值。进行异或的方式与实际数据传输时,高位先传还是低位先传有关,若异或从数据的高位开始,为顺序异或,若异或从数据的低位开始,则为反序异或,两种异或方式,即使对应同一个生成多项式,计算出来的结果也不相同。

  • CRC标准参数模型

CRC8、CRC16、CRC32、CRC64所要用到的标准参数如下:

表2-1 CRC标准参数

参数名

解释

CRC宽度

CRC计算结果的宽度

多项式

用于CRC算法的生成多项式

初始值

CRC算法开始时寄存器初始化的预置值

输 入数据反转

定 义了在参与CRC计算之前,每个输入字节是否需要进行位反转

输 出数据反转

定义了CRC计算结果是否需要按位反转

异或值

该 值将与寄存器中的最终值进行运算,再将异或结果作为返回值

检查值

这是作为验证CRC算法的一种较弱 的方法,当输入ASCII字符串”123456789”时,该值作为校验值

CRC功能实现

CRC功能实现分为三种方式:直接计算法、查表法、硬件实现法,分别对应配置项CrcxMode中的取值CRC_RUNTIME、CRC_TABLE和CRC_HARDWARE ,x代表CRC位宽,可为8、8H2F、16、32、32P4、64。

源文件描述

表3-1 CRC组件文件描述

文件

说明

Crc_cfg.h

定义CRC模块预编译时用到的配置参数。

Crc.h

CRC模块头文 件,包含了API函数的扩展声明并定义了端口的数据结构。

Crc.c

CRC模块源文件,包含了API函数的实现。

Crc_MemMap.h

CRC的内存映射定义

image1

图3-1 CRC组件文件交互关系图

API接口

类型定义

无。

输入函数描述

无。

静态接口函数定义

Crc_CalculateCRC8函数定义

函数名称:

Crc_CalculateCRC8

函数原型:

uint8 Crc_CalculateCRC8 ( const uint8* Crc_DataPtr, uint32 Crc_Length, uint8 Crc_StartValue8, boolean Crc_IsFirstCall )

服务编号:

0x01

同步/异步:

同步

是 否可重入:

可重入

输入参数:

Crc_DataPtr

值域:

被 计算数据的起始地址指针

Crc_Length

值域:

被计算数据的长度

Crc_StartValue8

值域:

起始值

Crc_IsFirstCall

值域:

TRUE: First call in a sequence or individual CRC calculation; start from initial value, ignore Crc_StartValue8.

FALSE: Subsequent call in a call sequence; Crc_StartValue8 is interpreted to be the return value of the previous function call.

输 入输出参数:

输出参数:

返回值:

CRC计算结果

功能概述:

提供基于SAE J1850 算 法的CRC8计算服务

Crc_CalculateCRC82F函数定义

函数名称:

Crc _CalculateCRC8H2F

函数原型:

uint8 Crc _CalculateCRC8H2F ( const uint8* Crc_DataPtr, uint32 Crc_Length, uint8 Cr c_StartValue8H2F, boolean Crc_IsFirstCall )

服务编号:

0x05

同步/异步:

同步

是 否可重入:

可重入

输入参数:

Crc_DataPtr

值域:

被 计算数据的起始地址指针

Crc_Length

值域:

被计算数据的长度

C rc_StartValue8H2F

值域:

起始值

Crc_IsFirstCall

值域:

TRUE: First call in a sequence or individual CRC calculation; start from initial value, ignore Crc_StartValue8.

FALSE: Subsequent call in a call sequence; Crc_StartValue8 is interpreted to be the return value of the previous function call.

输 入输出参数:

输出参数:

返回值:

CRC计算结果

功能概述:

提供基于使 用0x2F作为多项式 值的CRC8计算服务

Crc_CalculateCRC16函数定义

函数名称:

C rc_CalculateCRC16

函数原型:

uint16 C rc_CalculateCRC16 ( const uint8* Crc_DataPtr, uint32 Crc_Length, uint16 Crc_StartValue16, boolean Crc_IsFirstCall )

服务编号:

0x02

同步/异步:

同步

是 否可重入:

可重入

输入参数:

Crc_DataPtr

值域:

被 计算数据的起始地址指针

Crc_Length

值域:

被计算数据的长度

Crc_StartValue16

值域:

起始值

Crc_IsFirstCall

值域:

TRUE: First call in a sequence or individual CRC calculation; start from initial value, ignore Crc_StartValue16.

FALSE: Subsequent call in a call sequence; Crc_StartValue16 is interpreted to be the return value of the previous function call.

输入 输出参数:

输出参数:

返回值:

CRC计算结果

功能概述:

提供 基于CRC16计算服务

Crc_CalculateCRC32函数定义

函数名称:

C rc_CalculateCRC32

函数原型:

uint16 C rc_CalculateCRC32 ( const uint8* Crc_DataPtr, uint32 Crc_Length, uint32 Crc_StartValue32, boolean Crc_IsFirstCall )

服务编号:

0x03

同步/异步:

同步

是 否可重入:

可重入

输入参数:

Crc_DataPtr

值域:

被 计算数据的起始地址指针

Crc_Length

值域:

被计算数据的长度

Crc_StartValue32

值域:

起始值

Crc_IsFirstCall

值域:

TRUE: First call in a sequence or individual CRC calculation; start from initial value, ignore Crc_StartValue32.

FALSE: Subsequent call in a call sequence; Crc_StartValue32 is interpreted to be the return value of the previous function call.

输入 输出参数:

输出参数:

返回值:

CRC计算结果

功能概述:

提供 基于CRC32计算服务

Crc_CalculateCRC32P4函数定义

函数名称:

Crc _CalculateCRC32P4

函数原型:

uint32 Crc _CalculateCRC32P4 ( const uint8* Crc_DataPtr, uint32 Crc_Length, uint32 Crc_StartValue32, boolean Crc_IsFirstCall )

服务编号:

0x04

同步/异步:

同步

是 否可重入:

可重入

输入参数:

Crc_DataPtr

值域:

被 计算数据的起始地址指针

Crc_Length

值域:

被计算数据的长度

Crc_StartValue32

值域:

起始值

Crc_IsFirstCall

值域:

TRUE: First call in a sequence or individual CRC calculation; start from initial value, ignore Crc_StartValue32.

FALSE: Subsequent call in a call sequence; Crc_StartValue32 is interpreted to be the return value of the previous function call.

输入 输出参数:

输出参数:

返回值:

CRC计算结果

功能概述:

提 供基于CRC32计算服 务,使用0xF4ACFB13 作为多项式因子

Crc_CalculateCRC64函数定义

函数名称:

C rc_CalculateCRC64

函数原型:

uint64 C rc_CalculateCRC64 ( const uint8* Crc_DataPtr, uint32 Crc_Length, uint64 Crc_StartValue64, boolean Crc_IsFirstCall )

服务编号:

0x07

同步/异步:

同步

是 否可重入:

可重入

输入参数:

Crc_DataPtr

值域:

被 计算数据的起始地址指针

Crc_Length

值域:

被计算数据的长度

Crc_StartValue64

值域:

起始值

Crc_IsFirstCall

值域:

TRUE: First call in a sequence or individual CRC calculation; start from initial value, ignore Crc_StartValue64.

FALSE: Subsequent call in a call sequence; Crc_StartValue64 is interpreted to be the return value of the previous function call.

输入 输出参数:

输出参数:

返回值:

CRC计算结果

功能概述:

提供 基于CRC64计算服务

可配置函数定义

无。

配置

CRC配置列表

image2

图5-1 CRC容器配置图

表5‑1 CRC属性描述

UI 名称

描述

A lgorit hmCrc8

取值范围

STD_ON / STD_OFF

默认取值

STD_OFF

参数描述

Switches the Crc8 ON or OFF.

true: enabled (ON).

false: disabled (OFF).

依赖关系

当配置为OFF时,不 生成Crc8Mode相关配置

Algo rithmC rc8H2F

取值范围

STD_ON / STD_OFF

默认取值

STD_OFF

参数描述

Switches the Crc8H2F ON or OFF.

true: enabled (ON).

false: disabled (OFF).

依赖关系

当配置为OFF时,不生 成Crc8H2FMode相关配置

Al gorith mCrc16

取值范围

STD_ON / STD_OFF

默认取值

STD_OFF

参数描述

Switches the Crc16 ON or OFF.

true: enabled (ON).

false: disabled (OFF).

依赖关系

当配置为OFF时,不 生成Crc16Mode相关配置

Al gorith mCrc32

取值范围

STD_ON / STD_OFF

默认取值

STD_OFF

参数描述

Switches the Crc32ON or OFF.

true: enabled (ON).

false: disabled (OFF).

依赖关系

当配置为OFF时,不 生成Crc32Mode相关配置

Algo rithmC rc32P4

取值范围

STD_ON / STD_OFF

默认取值

STD_OFF

参数描述

Switches the Crc32P4 ON or OFF.

true: enabled (ON).

false: disabled (OFF).

依赖关系

当配置为 OFF时,不生成Crc32P4 Mode相关配置

Al gorith mCrc64

取值范围

STD_ON / STD_OFF

默认取值

STD_OFF

参数描述

Switches the Crc64 ON or OFF.

true: enabled (ON).

false: disabled (OFF).

依赖关系

当配置为OFF时,不 生成Crc64Mode相关配置

Cr c8Mode

取值范围

CRC_TABLE/CRC _RUNTIME/CRC_HARDWARE

默认取值

CRC_TABLE

参数描述

Switch to select one of the available CRC 8-bit (SAE J1850) calculation methods

依赖关系

AlgorithmCrc8为STD_ON

Crc8H 2FMode

取值范围

CRC_TABLE/CRC _RUNTIME/CRC_HARDWARE

默认取值

CRC_TABLE

参数描述

Switch to select one of the available CRC 8-bit (2Fh polynomial) calculation methods

依赖关系

Alg orithmCrc8H2F为STD_ON

Crc 16Mode

取值范围

CRC_TABLE/CRC _RUNTIME/CRC_HARDWARE

默认取值

CRC_TABLE

参数描述

Switch to select one of the available CRC 16-bit (CCITT) calculation methods

依赖关系

A lgorithmCrc16为STD_ON

Crc 32Mode

取值范围

CRC_TABLE/CRC _RUNTIME/CRC_HARDWARE

默认取值

CRC_TABLE

参数描述

Switch to select one of the available CRC 32-bit (IEEE-802.3 CRC32 Ethernet Standard) calculation methods.

依赖关系

A lgorithmCrc32为STD_ON

Crc32 P4Mode

取值范围

CRC_TABLE/CRC _RUNTIME/CRC_HARDWARE

默认取值

CRC_TABLE

参数描述

Switch to select one of the available CRC 32-bit E2E Profile 4 calculation methods

依赖关系

Alg orithmCrc32P4为STD_ON

Crc 64Mode

取值范围

CRC_TABLE/CRC _RUNTIME/CRC_HARDWARE

默认取值

CRC_TABLE

参数描述

Switch to select one of the available CRC 64-bit calculation methods.

依赖关系

A lgorithmCrc64为STD_ON