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_BOTHDataId 长度 16 bits,低字节 + 高字节都参与 CRC;DataId 不参与数据传输。
  • E2E_P01_DATAID_ALTDataId 长度 16 bits,按 Counter 奇偶交替选择参与 CRC 的字节;DataId 不参与数据传输。
    • Counter 偶数:DataId 低字节参与 CRC
    • Counter 奇数: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
  • 多项式:0x1Dx^8 + x^4 + x^3 + x^2 + 1
  • Init=0x00
  • XorOut=0x00
  • 不反射输入/输出

在这里插入图片描述

3.3 “CRC 模块口径差异”与补偿

在一些 AUTOSAR R4.x 工程中,通用 CRC 模块实现可能固定为:

  • Init=0xFF
  • XorOut=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 = BOTH
  • CRCOffset = 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 的高/低位是否一致。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐