0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CAN总线报文数据一致性校验

jf_EksNQtU6 来源:古德曼汽车工业 2024-01-24 10:03 次阅读

01不安全的CAN总线

1、如何保证ECU接收到的数据是合法的?

比如ECU1接收ECU2发出的一帧0x100报文,协议层是不会区分是ECU1发的,还是非法接入OBD的CAN盒发的?如果ECU1接收到非ECU2发出的0x100报文岂不是很危险?

2、ECU如何知道另一个节点挂死

比如ECU1还是接收ECU2发出的一帧0x100报文,但是由于某些神秘原因(程序跑飞了)导致ECU2挂死或者掉线,那ECU1如何知道此时的接收到0x100无效?

CAN通讯是一种广播形式的通讯方式,自然协议层是无法做到数据合法性的校验,这部分工作需要应用层来完成。由此就出现了RollingCounter与Checksum。这两个东西好像也是功能安全的一部分,本期只是介绍这两个东西的原理,不对功能安全做过多讨论。

1e5c61b4-b9d9-11ee-8b88-92fbcf53809c.png

一个规范的CAN矩阵协议,每一帧报文都会要求有这个两个信号。如上图,从bit52到bit55是RollingCounter,取值范围0~15,ECU没发一次自动累加,满15就归零。从bit56到bit63(byte8)都是Checksum,取值范围0x00~0xFF,用来表示该条报文的校验值。

对于判断发送报文ECU有没有挂死很简单,只要在接收端对RollingCounter进行判断,几个周期内协议栈上的buff没有得到更新则就能判断为节点异常。

对于报文合法性的判断则就要负责得多,且会有各种花样

1e7fe1ca-b9d9-11ee-8b88-92fbcf53809c.png

车企制定的通讯协议时,除了制定矩阵信号外,会规定Checksum的计算方法,比如这个是采用多项式的CRC校验算法

1eac986e-b9d9-11ee-8b88-92fbcf53809c.png

并且规定出需要校验的数据,有的是对矩阵的前7个byte进行校验,有的则要增加报文ID作为校验计算的输入,各种花样都有。

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * CRC8校验子程序0x1D(x8+x4+x3+x2+1)  * * * * * * * * * * * *
* * 参数1,uint8_t *data:需要计算的数据  * * * * * * * * * * *
* * 参数1,uint16_t len:需要计算的数据字节长度 * * * * * * * *
* * 返回值,uint8_t crc8:计算出的CRC值 * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
uint8_t crc_8find(uint8_t *data, uint16_t len)
{
uint8_tcrc8=0x00;
    while( len-- ) 
    {
        crc8 = crc_table[crc8 ^ *data];
        data++;
}
    return crc8;
}

甚至贴心的给出校验计算的伪代码,这函数写法C、C++应该都可以直接运行的。理解下上面的代码!

当ECU2发出0x100之前,会对RollingCounter累加,并且通过计算包含RollingCounter的前七个字节的CRC值,填充到数据域的第8个字节;

ECU1接收到0x100的时候使用同样的校验算法,计算数据域的前7个字节,并且与第8个字节发送源计算的CRC值进行比较。如果两者相同,则数据合法。

02CANOE仿真

接下来在CANOE的CAPL进行RollingCounter与Checksum的模拟

1eddafbc-b9d9-11ee-8b88-92fbcf53809c.png

创建两个ECU节点,ECU1为发送节点,ECU2为接收节点。ECU2会对ECU1的节点做Checksum,如果非法数据会在log窗口中打印出来。ECU1会而这个IG是用来模拟非法的数据发送。

int GetCrcChecksum (int crc_position ,message *data)
{
  byte checksum;
  byte bitIndex;
  byte byteIndex;
  byte tdata;
  checksum = 0x00;
  for (byteIndex = DBLookup(data).dlc; byteIndex >= 1; byteIndex--)
  {
    if(byteIndex-1 != crc_position)
    {
      tdata = data.byte(byteIndex-1);
    }
    else
    {
      tdata = 0;
    }
    checksum ^= tdata;


    for (bitIndex = 0; bitIndex < 8; bitIndex++)
    {
      if ((checksum & 0x80) != 0)
      {
            checksum = (checksum << 1) ^ 0x1D; // cb_CRC_POLY: 0x1D
      }
      else
      {
            checksum = (checksum << 1);
      }
    }
  }
  checksum &= 0xFF;
  return (checksum);
}

CAPL计算Checksum的函数,在ECU1与ECU2里都存在

on timer Timer1
{
   Req.rollingCounter_0x100=LiveCount;
   Req.checksum_0x100=GetCrcChecksum(7,Req);
   output(Req);
   setTimer(Timer1,20);  
   LiveCount=LiveCount+1;
     if(LiveCount==16)
   {
    LiveCount=0;
   }

ECU1的定时器函数,发送前调用GetCrcChecksum函数生成Checksum

on message RCTest1
{
  if(this.checksum_0x100==GetCrcChecksum(7,this))
  {
      Rep=this;


  }else
  {
    write("Invaild Message");
  }
}

ECU2接收事件中重新计算Checksum跟发送报文里的Checksum进行比较,不同则抛出错误

1f17f62c-b9d9-11ee-8b88-92fbcf53809c.png

按F2,开始仿真,可以监控到ECU1发送出来的rollingCounter与Checksum

1f3bbb52-b9d9-11ee-8b88-92fbcf53809c.png

在Write窗口中打印ECU2接收到的数据

1f59749e-b9d9-11ee-8b88-92fbcf53809c.png

在IG节点设置一个非法的报文,rollingcounter与Checksum都设置0

1f8505a0-b9d9-11ee-8b88-92fbcf53809c.png

对非法数据进行抛出。

来源:古德曼汽车工业

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • CAN总线
    +关注

    关注

    145

    文章

    1812

    浏览量

    129592
  • 仿真
    +关注

    关注

    50

    文章

    3872

    浏览量

    132161
  • ecu
    ecu
    +关注

    关注

    14

    文章

    821

    浏览量

    53883
  • 通讯协议
    +关注

    关注

    9

    文章

    249

    浏览量

    20173

原文标题:CAN总线报文数据一致性校验

文章出处:【微信号:谈思实验室,微信公众号:谈思实验室】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    串行数据一致性测试和验证测量基础知识

    小弟这次给大家带来了串行数据一致性测试和验证测量基础知识其中提到了些高速串行信号的测试测量方法和简单的原理性介绍,适合初学者使用。PS。这其中提到的些测量设备现在已经升级为最新的仪器设备,但是测试的原理和技术还是可以让大家闲
    发表于 04-16 16:17

    一致性测试

    谁有聚星公司射频一致性测试的程序啊,求个做参考,!
    发表于 07-14 18:11

    c6678cache一致性

    专家您好!    我现在在做6678 cache一致性的东西,想请问一下一致性的维护哪些是硬件实现的,哪些需要程序员实现?谢谢!
    发表于 06-24 04:38

    CAN一致性测试—容错测试

    ,就可以进行键自动化测试,完整显示测试结果、数据、波形截图等数据内容,工程师可快速判断被测设备的CAN总线质量。 CANDT
    发表于 11-22 16:36

    Redis缓存和MySQL数据一致原因和解决方案

    高并发架构系列:Redis缓存和MySQL数据一致性方案详解
    发表于 03-27 15:55

    LTE基站一致性测试的类别

    就LTE基站而言,RF测试方法与一致性要求至为关键,然而,调变格式、带宽、资源分配与移动导致选项复杂度增加,因此优化的一致性测试配置参数组合需求更为殷切。第三代合作伙伴项目(3GPP)长期演进计划
    发表于 06-06 06:41

    高速串行总线的物理层一致性测试是什么?由来呢?

    物理层的一致性测试作为近 10 多年来示波器最主要的用途之直是产业界最常提到的名词之。本文尝试将物理层一致性测试的含义,要素与目的及
    发表于 08-12 07:17

    MIPI一致性测试

    MIPI一致性测试测试项目:> TX测试;> RX测试;> S参数和阻抗测试;> DigRF,Unipro和LLI的测试;测试环境: MIPI测试对示波器带宽的要求 >
    发表于 09-26 13:31

    什么是霍尔元件的一致性

    什么是霍尔元件的一致性?霍尔开关元件主要是通过感应磁性来进行开关机,霍尔元件本身又属于无触点开关,因此具有感应距离。霍尔开关都有个触发值和释放值,触发值是指霍尔元件表面达到参数磁性大小,霍尔元器件
    发表于 10-12 09:34

    如何解决stm32 H7 DMA串口发送数据一致性问题?

    如何解决stm32 H7 DMA串口发送数据一致性问题?
    发表于 12-06 06:05

    顺序一致性和TSO一致性分别是什么?SC和TSO到底哪个好?

    内存一致性之顺序一致性(sequential consistency)可以说,最直观的内存一致性模型是sequentially consistent(SC):内存访问执行的顺序与程序指定的顺序相同
    发表于 07-19 14:54

    请问ESP-NOW对数据的完整一致性校验吗?

    当使用ESP-NOW时,传递的数据在传输层有对数据包的完整(比如对面传给我的字节数和我收到的字节数是否相同)有底层校验吗?还有这个数据包是
    发表于 02-14 06:24

    VxWorks中主备数据一致性功能组件的设计与实现

    数据一致性是主备用系统必须解决的问题。目前主备系统的一致性都采用手工编程来实现,导致代码结构繁杂,且效率不高。利用VxWorks 的异常处理机制,结合RISC CPU 的特性,设计实
    发表于 09-22 11:32 8次下载

    P2P平台上的数据一致性研究

    P2P网络是一个自组织的动态网络,对等点可以随意的加入或者离开网络,因此如何控制数据一致性成了P2P网络平台应用扩展应用的关键点,本文引入数据一致性算法到P2P网络平台中来,
    发表于 02-25 16:06 15次下载

    电能质量监测数据一致性定义及检测方法_邱丽羚

    电能质量监测数据一致性定义及检测方法_邱丽羚
    发表于 01-08 11:07 0次下载