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的内存映射定义 |
图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配置列表
图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 |