当前位置:首页 > 汽车电子 > 汽车电子
[导读]传感器信号(轮速、踏板行程、转向角)进动力域MCU后,CAN/LIN底层CRC只保护“这段链路没错位”,不保证数据没被重放、插帧、寻址错。E2E做的是应用层端到端守护:发送端加Counter+CRC+Data ID,接收端四项全过才用数据。


传感器信号(轮速、踏板行程、转向角)进动力域MCU后,CAN/LIN底层CRC只保护“这段链路没错位”,不保证数据没被重放、插帧、寻址错。E2E做的是应用层端到端守护:发送端加Counter+CRC+Data ID,接收端四项全过才用数据。

一、Profile选型与字段布局

车载MCU最常用Profile 1:CRC-8 SAE J1850(多项式0x1D)、4bit计数器(0~14,0xF保留)、16bit Data ID。

典型布局(Variant 1A):

Byte0:CRC

Byte1低4位:Counter

Byte1高4位+后续:信号数据

CRC计算范围=Data ID + Counter + 数据域(不含CRC字节本身)。Data ID不显式发也行,靠隐式参与CRC防伪装。

二、发送端Protect

typedef struct {

   uint16_t data_id;

   uint8_t  cnt;          // 0..14

   uint8_t  tx[8];

} e2e_ctx_t;


void e2e_protect(e2e_ctx_t*c, uint8_t*data, uint8_t len){

   c->cnt = (c->cnt>=14)?0:(c->cnt+1);

   c->tx[0] = 0;                       // CRC先留空

   c->tx[1] = (data[0] & 0xF0) | c->cnt;

   memcpy(&c->tx[2], data, len);


   uint8_t crc = Crc_CalculateCRC8(0x00,

       (uint8_t*)&c->data_id, 2, 0x00);          // DataID先入

   crc = Crc_CalculateCRC8(crc, &c->tx[1], len+1, 0x00);

   c->tx[0] = crc ^ 0x00;

}

Counter每发一次+1,不在中断里重置;Data ID大小端发送端接收端必须一致。

三、接收端Check

四道闸:CRC→Counter→Data ID匹配→超时。

typedef enum { E2E_OK, E2E_CRC_ERR,

   E2E_SEQ_ERR, E2E_TIMEOUT } e2e_st_t;


e2e_st_t e2e_check(e2e_ctx_t*c, uint8_t*rx,

                   uint8_t len, uint32_t now){

   uint8_t crc = Crc_CalculateCRC8(0x00,

       (uint8_t*)&c->data_id,2,0x00);

   crc = Crc_CalculateCRC8(crc,&rx[1],len,0x00);

   if(crc != rx[0]) return E2E_CRC_ERR;


   uint8_t cnt = rx[1] & 0x0F;

   int diff = (cnt - c->last_cnt + 15) % 15;   // 允许回绕

   if(diff==0) return E2E_SEQ_ERR;             // 重复帧

   if(diff > MAX_DELTA) return E2E_SEQ_ERR;    // 跳变过大

   c->last_cnt = cnt;


   if(now - c->last_rx > TIMEOUT_MS)

       return E2E_TIMEOUT;                      // 周期×3~5

   c->last_rx = now;

   return E2E_OK;

}

MAX_DELTA一般取3,偶发丢一帧不报故障;连续错才进安全态。

四、故障处理:不更新即安全

E2E不是“校验错了打个日志”,动力域必须配合安全反应:

if(e2e_check(&ctx, frame, len, now)==E2E_OK){

   wheel_speed = decode(frame);

   use_value = 1;

}else{

   use_value = 0;           // 不刷新控制变量

   Dem_SetEventStatus(WHEEL_E2E_FAIL, FAILED);

   apply_safe_substitute(); // 上一有效值/默认0/降级扭矩

}

状态机分INIT/VALID/INVALID/SOME_LOST:首帧冷启动不立即报错,连续N帧有效才进VALID;连续错误超阈值才INVALID。

五、传感器场景落坑

轮速类高频信号:Counter跳变容忍别设1,总线抖动会误报;设3较稳

Data ID别复用:不同传感器信号必须唯一,否则网关转发会伪装

CRC参数对齐:多项式0x1D、初值0x00,和CAN硬件CRC不是一套,别混用

SPI外置传感器:E2E同样适用,MCU收SPI后按同逻辑校验,不只信片选

多接收方:P2C场景用Profile 3/6,各ECU可配不同Data ID

ASIL等级:动力域信号常ASIL C/D,E2E+WdgM+DEM联动,单靠CRC不够

别当加密用:E2E防随机故障和重放,不防主动攻击,密钥场景走SecOC

六、调度位置

Classic AUTOSAR里E2E Library在RTE/COM与PduR之间调用,保护I-PDU;裸机MCU就在接收任务里调e2e_check后再进控制算法。要点是“校验通过才写全局变量”,控制回路读的是已认证值。

按“Data ID绑定信号源+Counter防重放丢帧+CRC-8校验完整性+超时丢弃+错误走安全替代值”五件落地,传感器信号在MCU里就不会出现“CRC过了但数据是旧帧/插帧”的隐患。E2E本身不重,重的是状态机容错和故障反应链路——这也是ISO 26262通信条款真正卡的点。



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭