SENT&SPC协议中的CRC4校验

用到SENT&SPC难免会躲不过CRC校验的问题,通常是使用CRC4的校验方式,下面我们来详细介绍一下。

一、SENT CRC 的作用

CRC 用于:

检测通信错误

例如:

  • EMI
  • 边沿抖动
  • Tick 错误
  • 丢边沿
  • 错帧

协议难免会用到他的校验方式,通常他们都是使用CRC4的校验方式

二、SENT CRC 特点

SENT 使用:

4-bit CRC

即:

复制代码
CRC范围:
0x0 ~ 0xF

三、为什么只用 4bit

因为:

SENT:

数据量小

通常:

  • 4~6 个 nibble

因此:

4bit 足够。


四、SAE J2716 标准 CRC

最经典:

CRC4

Polynomial:

x4+x3+x2+1x^4 + x^3 + x^2 + 1x4+x3+x2+1

对应:

复制代码
0b11101

Hex:

复制代码
0x1D

五、注意:SENT CRC 和普通 CRC 不一样

这是重点。

很多人:

直接用:

  • CRC8
  • CRC16 库

结果:

全错

因为:

SENT:

是 nibble CRC

不是 byte CRC。


六、SENT CRC 的核心思想

CRC:

一个 nibble 一个 nibble 喂进去

不是:

复制代码
按字节

而是:

复制代码
按4bit

七、最经典 Fast Channel CRC 数据

假设:

字段
Status 0x2
Data1 0xA
Data2 0x5
Data3 0xC
Data4 0x1

要求:

计算 CRC


八、SENT CRC 最关键规则

标准实现通常:

CRC 不包含 Sync

也:

不包含 Pause

通常:

CRC 输入:

复制代码
Status + Data Nibbles

九、完整 CRC 输入流

即:

复制代码
2 A 5 C 1

十、CRC 真正本质

CRC:

本质:

LFSR(线性反馈移位寄存器)


十一、为什么 FPGA 很适合 CRC

因为:

CRC:

本质就是:

移位 + XOR

这是 FPGA 强项。


十二、SENT CRC 标准查表法(最常见)

真正量产 ECU:

很多:

不实时算

而是:

LUT查表

因为:

  • 更快
  • 更稳定
  • 更容易验证

十三、最经典 SENT CRC LUT

标准 LUT:

复制代码
static const uint8_t crc4_table[16] =
{
    0, 13, 7, 10,
    14, 3, 9, 4,
    1, 12, 6, 11,
    15, 2, 8, 5
};

十四、真正 CRC 计算流程(最重要)

初始化:

复制代码
crc = 0x5

注意:

SENT 常见初值是 0x5

这是经典坑。


十五、逐 nibble 运算

对于:

复制代码
2 A 5 C 1

步骤:


Step1

复制代码
crc = table[crc XOR 2]

即:

复制代码
5 XOR 2 = 7

查表:

复制代码
复制代码
table[7] = 4

因此:

复制代码
crc = 4

Step2

输入:

复制代码
A

4 XOR A = E

查表:

复制代码
table[E] = 8

得到:

复制代码
crc = 8

Step3

输入:

复制代码
5

8 XOR 5 = D

查表:

复制代码
table[D] = 2

得到:

复制代码
crc = 2

Step4

输入:

复制代码
C

2 XOR C = E

查表:

复制代码
table[E] = 8

得到:

复制代码
crc = 8

Step5

输入:

复制代码
1

8 XOR 1 = 9

查表:

复制代码
table[9] = C

最终:

CRC = 0xC


十六、STM32 最经典 CRC 代码

真正项目:

通常:

复制代码
uint8_t SENT_CRC4(
        uint8_t *data,
        uint8_t len)
{
    static const uint8_t crc4_table[16] =
    {
        0,13,7,10,
        14,3,9,4,
        1,12,6,11,
        15,2,8,5
    };

    uint8_t crc = 0x5;

    for(int i=0;i<len;i++)
    {
        crc = crc4_table[crc ^ data[i]];
    }

    return crc;
}

十七、验证 CRC

例如:

复制代码
data = {2,A,5,C,1}

结果:

复制代码
CRC = C

十八、SENT&SPC帧格式

如下所示:

关于SPC的不同帧格式,可能是3个5个6个7个nibble,校验方式仍然是CRC4,只是根据nibble的数量不同,他的左移次数也不同。

十九、其他问题记录

1.sent协议的标准同步脉冲56个tick是有一些偏差的

关键发现

  • 每帧都从同步脉冲重新校准时基
  • 前一帧的偏差不影响下一帧
  • 这是SENT在高噪声环境可靠工作的根本原因
2.nibble可变的原因

应用分类

  • 基础应用(FORMAT0):简单温度传感器、$0.15芯片
  • 诊断应用(FORMAT1\~3):需要序列号、安全校验
  • BMS应用(FORMAT4\~7):多参数、多传感器、$0.50芯片
  • 企业级(FORMAT7):ISO 26262、高可靠性
3.除CRC4外是否还有其他校验方式

Layer 1: 物理层 → 单线脉冲设计

Layer 2: 时序层 → 同步脉冲(56 ticks)

Layer 3: 数据层 → CRC4(检错率 >99%)

Layer 4A: 安全层A → D1反码(可选,100% 检测所有bit翻转)

Layer 4B: 安全层B → 滚动计数(可选,100% 检测丢帧/重复)

Layer 5: 诊断层 → Status Nibble(实时故障状态)

Layer 6: 通信层 → 网关校验和(保护串口传输)

Layer 7: 应用层 → 数据范围检查(应用级)

关键认识

  • CRC4 只是其中一层
  • 多层防护综合效果 > 99.9%
  • 应用灵活选择需要的层级
4.帧间隔不固定对读取的影响

二十、查表法

相关推荐
智者知已应修善业5 小时前
【proteus设计文氏正弦波信号发生器】2023-5-9
驱动开发·经验分享·笔记·硬件架构·proteus·硬件工程
不羁的木木6 小时前
《HarmonyOS技术精讲》四:驱动开发入门 ── 标准外设与非标USB串口
驱动开发·华为·harmonyos
董厂长2 天前
规范驱动开发(Spec-Driven Development):一个批判性审视
人工智能·驱动开发
董厂长2 天前
规范驱动开发(Spec-Driven Development)深度解析
驱动开发
楼兰公子2 天前
RK3588 Linux驱动开发大纲
linux·驱动开发
智者知已应修善业2 天前
【分立元件OCL电路】2024-5-17
驱动开发·经验分享·笔记·硬件架构·硬件工程
楼兰公子2 天前
RK3588** 平台(瑞芯微旗舰 SoC,四核 A76 + 四核 A55,Mali-G610,支持 8K 编解码)整理一份系统性的驱动开发实战指南
驱动开发
小此方3 天前
Re:Linux系统篇(二十四)进程篇·九:进程从创建到退出的底层机制与写时拷贝全解
linux·运维·驱动开发
都在酒里3 天前
Linux字符设备驱动开发(九):内核定时器——实现LED周期性闪烁与轮询驱动原理
linux·运维·驱动开发·交互