E2E_P01_算法
DataIdModeDataIdMode进入 CRC 的 DataId 部分备注BOTHDataId 低字节 + 高字节(16 bit)常见默认LOW仅 DataId 低字节(8 bit)另一字节视为不参与ALT按 Counter 奇偶交替:偶数用低字节,奇数用高字节用于提高区分度/容错NIBBLEDataId 的一个 nibble(4 bit)参与 CRC,且该 nibble 还会随 PDU 一
E2E P01 算法
1. E2E Profile01
E2E Profile01 使用 8-bit SAE J1850 CRC 校验,最大受保护数据区长度为 30 Bytes。
Profile01 典型字段大小如下(以配置为准):
| 字段 | 大小 | 说明 |
|---|---|---|
Counter |
4 bits | 取值 0~15 循环;随数据传输,并参与 CRC 计算 |
DataId |
16 bits | 用于区分数据流并参与 CRC;除 NIBBLE 模式外通常不随 PDU 传输 |
CRC |
8 bits | CRC-8 SAE J1850;对 DataId_Part + Data_Protected 计算,且必须跳过 CRC 字段自身 |
DataIdMode 决定 DataId 如何参与 CRC(以及是否有部分随 PDU 传输):
E2E_P01_DATAID_BOTH:DataId长度 16 bits,低字节 + 高字节都参与 CRC;DataId不参与数据传输。E2E_P01_DATAID_ALT:DataId长度 16 bits,按Counter奇偶交替选择参与 CRC 的字节;DataId不参与数据传输。Counter偶数:DataId低字节参与 CRCCounter奇数:DataId高字节参与 CRC
E2E_P01_DATAID_LOW:高字节不使用(置0x00),等价于可用DataId长度 8 bits;仅低字节参与 CRC,且不参与数据传输。E2E_P01_DATAID_NIBBLE:高字节高 4 bit 不使用(置0x0),等价于可用DataId长度 12 bits;高字节低 4 bit(nibble)参与 CRC,且该 nibble 还会随数据一起传输,放置位置由DataIdNibbleOffset决定。
2. 配置参数
2.1 字段布局(典型)
P01 常见在 PDU 中放置:
CRC:1 byte(8 bit)Counter:4 bit(通常位于某个 byte 的高 4 位或低 4 位)Data:其余业务数据
具体位位置由配置决定:
CRCOffset:CRC 字段在 PDU 中的位置(bit offset)CounterOffset:Counter 字段在 PDU 中的位置(bit offset)
2.2 关键配置参数
| 参数 | 含义 | 典型值/说明 |
|---|---|---|
CRCOffset |
CRC 字段 bit 偏移 | 常见为 0(第 0 字节) |
CounterOffset |
Counter 字段 bit 偏移 | 常见为 8(第 1 字节的高/低 4 bit 取决于实现) |
DataLength |
受保护数据总长度 | 可能是 bit 或 byte;需统一口径 |
DataId |
16-bit 数据流标识 | 例如 0x1234 |
DataIdMode |
DataId 参与 CRC 的方式 | BOTH/LOW/ALT/NIBBLE |
DataIdNibbleOffset |
NIBBLE 模式下 DataId nibble 的放置位置 | bit offset |
MaxDeltaCounterInit |
允许的最大 Counter 跳变量(丢帧容忍) | 常见 1 |
MaxNoNewOrRepeatedData |
连续无新数据/重复数据允许次数 | 常见 15 |
3. E2E P01 CRC算法
3.1 CRC 库算法口径(AUTOSAR CRC 模块)

很多工程会直接调用 AUTOSAR CRC 模块的 Crc_CalculateCRC8() 来实现 CRC-8 SAE J1850。该 CRC 库函数的算法口径通常定义为:
| 参数 | 值 |
|---|---|
| CRC 宽度(width) | 8 bits |
| 多项式(poly) | 0x1D |
| 初始值(init) | 0xFF |
| 输入反射(RefIn) | false |
| 输出反射(RefOut) | false |
| 最终异或(XorOut) | 0xFF |
| Check(校验值) | 0x4B |
| Magic check | 0xC4 |
CRC 库(上述口径)的常见测试向量如下(输入为字节序列,输出为 CRC 结果):
| Data bytes(hex) | CRC |
|---|---|
00 00 00 00 |
0x59 |
F2 01 83 |
0x37 |
0F AA 00 55 |
0x79 |
00 FF 55 11 |
0xB8 |
33 22 55 AA BB CC DD EE FF |
0xCB |
92 6B 55 |
0x8C |
FF FF FF FF |
0x74 |
3.2 基本参数(P01 期望口径)
P01 使用 CRC-8 SAE J1850,且 RefIn=false、RefOut=false:
- 宽度:8
- 多项式:
0x1D(x^8 + x^4 + x^3 + x^2 + 1) Init=0x00XorOut=0x00- 不反射输入/输出

3.3 “CRC 模块口径差异”与补偿
在一些 AUTOSAR R4.x 工程中,通用 CRC 模块实现可能固定为:
Init=0xFFXorOut=0xFF
若直接使用该模块,结果会与 P01 期望口径不一致。为了在不修改 CRC 模块的情况下得到与 P01(0x00/0x00)等价的结果,可使用补偿法。
等价效果:对外呈现的 CRC 值与 Init=0x00, XorOut=0x00 的 P01 口径一致。

4. CRC 输入数据源与拼接规则
4.1 CRC 输入总体表达式
CRC 的输入序列由两部分顺序拼接而成:
CRC_Input = DataId_Part || Data_Protected
DataId_Part:由DataIdMode决定的 0/4/8/16-bit 逻辑输入(实现时按字节/半字节喂入 CRC)。Data_Protected:从 PDU 抽取的受保护字节序列,包含 Counter 所在 bit(因为 Counter 实际存储在 PDU 内),但必须跳过 CRC 字段自身。
4.2 跳过 CRC 字段
CRC 计算不得包含 CRC 字段自身,否则会把旧 CRC 算进去导致永久不一致。常见实现方式:
- 计算
PDU[0 .. CRC字段前] - 跳过 CRC 字段(通常 1 byte)
- 继续计算
PDU[CRC字段后 .. Data末尾]
若 CRC 字段不按整字节对齐,需要实现按 bit/byte 的抽取逻辑;为降低复杂度,工程上通常让 CRC 字段 byte 对齐。
4.3 DataIdMode 定义
DataIdMode 决定 DataId 哪些部分进入 CRC:
| DataIdMode | 进入 CRC 的 DataId 部分 | 备注 |
|---|---|---|
BOTH |
DataId 低字节 + 高字节(16 bit) | 常见默认 |
LOW |
仅 DataId 低字节(8 bit) | 另一字节视为不参与 |
ALT |
按 Counter 奇偶交替:偶数用低字节,奇数用高字节 | 用于提高区分度/容错 |
NIBBLE |
DataId 的一个 nibble(4 bit)参与 CRC,且该 nibble 还会随 PDU 一起传输 | nibble 写入位置由 DataIdNibbleOffset 决定 |
5. 示例
本示例来自 E2E Profile 01 (P01) 算法描述.md 中的计算口径整理,用于对齐实现与测试。
5.1 配置
DataId = 0x1234(高字节0x12,低字节0x34)DataIdMode = BOTHCRCOffset = 0(CRC 在 Byte0)CounterOffset = 8(Counter 在 Byte1 的某 4bit)DataLength = 64 bit(8 bytes)- 初始
Counter = 0 - 业务数据 Byte2~Byte7 全为
0x00
5.2 CRC 输入序列(示意)
按“低字节在前”的 DataId 拼接顺序:
[DataId_L=0x34, DataId_H=0x12, Data[1]=0x00, Data[2]=0x00, ... , Data[7]=0x00]
其中:
-
Byte0 为 CRC 字段,需要跳过,不参与 CRC
-
Counter 位于 Byte1 的某 4bit,示例中 Byte1 为
0x00(Counter=0 且低 4bit 数据为 0)
5.3 结果(示例给定)
- 计算得到
CRC = 0x8C - 输出 PDU(8 bytes):
8C 00 00 00 00 00 00 00
若你的实现计算结果不同,优先排查:DataId 字节拼接顺序、CRCOffset 跳过是否正确、CRC 口径是否做了补偿、Counter 的 4bit 在 Byte1 的高/低位是否一致。
更多推荐



所有评论(0)