0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

CAN總線報文數(shù)據(jù)一致性校驗

jf_EksNQtU6 ? 來源:古德曼汽車工業(yè) ? 2024-01-24 10:03 ? 次閱讀

01不安全的CAN總線

1、如何保證ECU接收到的數(shù)據(jù)是合法的?

比如ECU1接收ECU2發(fā)出的一幀0x100報文,協(xié)議層是不會區(qū)分是ECU1發(fā)的,還是非法接入OBD的CAN盒發(fā)的?如果ECU1接收到非ECU2發(fā)出的0x100報文豈不是很危險?

2、ECU如何知道另一個節(jié)點(diǎn)掛死

比如ECU1還是接收ECU2發(fā)出的一幀0x100報文,但是由于某些神秘原因(程序跑飛了)導(dǎo)致ECU2掛死或者掉線,那ECU1如何知道此時的接收到0x100無效?

CAN通訊是一種廣播形式的通訊方式,自然協(xié)議層是無法做到數(shù)據(jù)合法性的校驗,這部分工作需要應(yīng)用層來完成。由此就出現(xiàn)了RollingCounter與Checksum。這兩個東西好像也是功能安全的一部分,本期只是介紹這兩個東西的原理,不對功能安全做過多討論。

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

一個規(guī)范的CAN矩陣協(xié)議,每一幀報文都會要求有這個兩個信號。如上圖,從bit52到bit55是RollingCounter,取值范圍0~15,ECU沒發(fā)一次自動累加,滿15就歸零。從bit56到bit63(byte8)都是Checksum,取值范圍0x00~0xFF,用來表示該條報文的校驗值。

對于判斷發(fā)送報文ECU有沒有掛死很簡單,只要在接收端對RollingCounter進(jìn)行判斷,幾個周期內(nèi)協(xié)議棧上的buff沒有得到更新則就能判斷為節(jié)點(diǎn)異常。

對于報文合法性的判斷則就要負(fù)責(zé)得多,且會有各種花樣

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

車企制定的通訊協(xié)議時,除了制定矩陣信號外,會規(guī)定Checksum的計算方法,比如這個是采用多項式的CRC校驗算法。

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

并且規(guī)定出需要校驗的數(shù)據(jù),有的是對矩陣的前7個byte進(jìn)行校驗,有的則要增加報文ID作為校驗計算的輸入,各種花樣都有。

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * CRC8校驗子程序0x1D(x8+x4+x3+x2+1)  * * * * * * * * * * * *
* * 參數(shù)1,uint8_t *data:需要計算的數(shù)據(jù)  * * * * * * * * * * *
* * 參數(shù)1,uint16_t len:需要計算的數(shù)據(jù)字節(jié)長度 * * * * * * * *
* * 返回值,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;
}

甚至貼心的給出校驗計算的偽代碼,這函數(shù)寫法C、C++應(yīng)該都可以直接運(yùn)行的。理解下上面的代碼!

當(dāng)ECU2發(fā)出0x100之前,會對RollingCounter累加,并且通過計算包含RollingCounter的前七個字節(jié)的CRC值,填充到數(shù)據(jù)域的第8個字節(jié);

ECU1接收到0x100的時候使用同樣的校驗算法,計算數(shù)據(jù)域的前7個字節(jié),并且與第8個字節(jié)發(fā)送源計算的CRC值進(jìn)行比較。如果兩者相同,則數(shù)據(jù)合法。

02CANOE仿真

接下來在CANOE的CAPL進(jìn)行RollingCounter與Checksum的模擬

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

創(chuàng)建兩個ECU節(jié)點(diǎn),ECU1為發(fā)送節(jié)點(diǎn),ECU2為接收節(jié)點(diǎn)。ECU2會對ECU1的節(jié)點(diǎn)做Checksum,如果非法數(shù)據(jù)會在log窗口中打印出來。ECU1會而這個IG是用來模擬非法的數(shù)據(jù)發(fā)送。

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的函數(shù),在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的定時器函數(shù),發(fā)送前調(diào)用GetCrcChecksum函數(shù)生成Checksum

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


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

ECU2接收事件中重新計算Checksum跟發(fā)送報文里的Checksum進(jìn)行比較,不同則拋出錯誤

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

按F2,開始仿真,可以監(jiān)控到ECU1發(fā)送出來的rollingCounter與Checksum

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

在Write窗口中打印ECU2接收到的數(shù)據(jù)

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

在IG節(jié)點(diǎn)設(shè)置一個非法的報文,rollingcounter與Checksum都設(shè)置0

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

對非法數(shù)據(jù)進(jìn)行拋出。

來源:古德曼汽車工業(yè)

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • CAN總線
    +關(guān)注

    關(guān)注

    145

    文章

    1908

    瀏覽量

    130501
  • 仿真
    +關(guān)注

    關(guān)注

    50

    文章

    3995

    瀏覽量

    133223
  • ecu
    ecu
    +關(guān)注

    關(guān)注

    14

    文章

    865

    瀏覽量

    54331
  • 通訊協(xié)議
    +關(guān)注

    關(guān)注

    10

    文章

    265

    瀏覽量

    20294

原文標(biāo)題:CAN總線報文數(shù)據(jù)一致性校驗

文章出處:【微信號:談思實驗室,微信公眾號:談思實驗室】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    CAN一致性測試內(nèi)容及解決方案

    新能源汽車行業(yè)的迅速發(fā)展,CAN總線問題日益突出,總線故障潛在問題極其嚴(yán)重。那么,如何保證CAN總線穩(wěn)定,為何主機(jī)廠愈來愈重視
    的頭像 發(fā)表于 05-29 09:14 ?2.1w次閱讀
    <b class='flag-5'>CAN</b><b class='flag-5'>一致性</b>測試內(nèi)容及解決方案

    CANDT一致性測試系統(tǒng)發(fā)布 保障CAN總線安全

    CAN總線已經(jīng)成為新能源汽車、軍工、航空等行業(yè)的主控系統(tǒng)應(yīng)用總線,ZLG致遠(yuǎn)電子致力于構(gòu)建CAN總線安全保障體系,震撼發(fā)布CANDT
    的頭像 發(fā)表于 08-29 09:54 ?6439次閱讀

    串行數(shù)據(jù)一致性測試和驗證測量基礎(chǔ)知識

    小弟這次給大家?guī)砹舜?b class='flag-5'>數(shù)據(jù)一致性測試和驗證測量基礎(chǔ)知識其中提到了些高速串行信號的測試測量方法和簡單的原理性介紹,適合初學(xué)者使用。PS。這其中提到的些測量設(shè)備現(xiàn)在已經(jīng)升級為最新的儀器設(shè)備,但是測試的原理和技術(shù)還是可以讓大家閑
    發(fā)表于 04-16 16:17

    CAN一致性測試—容錯測試

    ,就可以進(jìn)行鍵自動化測試,完整顯示測試結(jié)果、數(shù)據(jù)、波形截圖等數(shù)據(jù)內(nèi)容,工程師可快速判斷被測設(shè)備的CAN總線質(zhì)量。 CANDT
    發(fā)表于 11-22 16:36

    如何解決stm32 H7 DMA串口發(fā)送數(shù)據(jù)一致性問題?

    如何解決stm32 H7 DMA串口發(fā)送數(shù)據(jù)一致性問題?
    發(fā)表于 12-06 06:05

    VxWorks中主備數(shù)據(jù)一致性功能組件的設(shè)計與實現(xiàn)

    數(shù)據(jù)一致性是主備用系統(tǒng)必須解決的問題。目前主備系統(tǒng)的一致性都采用手工編程來實現(xiàn)。導(dǎo)致代碼結(jié)構(gòu)繁雜,且效率不高。利用VxWorks的異常處理機(jī)制,結(jié)合RISC CPU的特性.設(shè)
    發(fā)表于 12-16 14:21 ?5次下載

    VxWorks中主備數(shù)據(jù)一致性功能組件的設(shè)計與實現(xiàn)

    數(shù)據(jù)一致性是主備用系統(tǒng)必須解決的問題。目前主備系統(tǒng)的一致性都采用手工編程來實現(xiàn),導(dǎo)致代碼結(jié)構(gòu)繁雜,且效率不高。利用VxWorks 的異常處理機(jī)制,結(jié)合RISC CPU 的特性,設(shè)計實
    發(fā)表于 09-22 11:32 ?8次下載

    VxWorks中主備數(shù)據(jù)一致性功能組件的設(shè)計與實現(xiàn)

    數(shù)據(jù)一致性是主備用系統(tǒng)必須解決的問題。目前主備系統(tǒng)的一致性都采用手工編程來實現(xiàn)。導(dǎo)致代碼結(jié)構(gòu)繁雜,且效率不高。利用VxWorks的異常處理機(jī)制,結(jié)合RISC CPU的特性.設(shè)計
    發(fā)表于 11-28 16:47 ?11次下載

    P2P平臺上的數(shù)據(jù)一致性研究

    P2P網(wǎng)絡(luò)是個自組織的動態(tài)網(wǎng)絡(luò),對等點(diǎn)可以隨意的加入或者離開網(wǎng)絡(luò),因此如何控制數(shù)據(jù)一致性成了P2P網(wǎng)絡(luò)平臺應(yīng)用擴(kuò)展應(yīng)用的關(guān)鍵點(diǎn),本文引入數(shù)據(jù)一致性算法到P2P網(wǎng)絡(luò)平臺中來,
    發(fā)表于 02-25 16:06 ?15次下載

    電能質(zhì)量監(jiān)測數(shù)據(jù)一致性定義及檢測方法_邱麗羚

    電能質(zhì)量監(jiān)測數(shù)據(jù)一致性定義及檢測方法_邱麗羚
    發(fā)表于 01-08 11:07 ?0次下載

    分布式系統(tǒng)的CAP和數(shù)據(jù)一致性模型

    CAP理論的核心思想是任何基于網(wǎng)絡(luò)的數(shù)據(jù)共享系統(tǒng)最多只能滿足數(shù)據(jù)一致性(Consistency)、可用(Availability)和網(wǎng)絡(luò)分區(qū)容忍(Partition Tolerance)三個特性中的兩個。
    的頭像 發(fā)表于 05-05 23:20 ?2217次閱讀

    AMAZINGIC晶焱科技CAN 總線收發(fā)器一致性測試

    AMAZINGIC晶焱科技CAN 總線收發(fā)器一致性測試
    的頭像 發(fā)表于 05-26 15:49 ?805次閱讀
    AMAZINGIC晶焱科技<b class='flag-5'>CAN</b> <b class='flag-5'>總線</b>收發(fā)器<b class='flag-5'>一致性</b>測試

    AMAZINGIC晶焱科技CAN 總線收發(fā)器一致性測試

    AMAZINGIC晶焱科技CAN 總線收發(fā)器一致性測試
    的頭像 發(fā)表于 08-29 15:36 ?667次閱讀
    AMAZINGIC晶焱科技<b class='flag-5'>CAN</b> <b class='flag-5'>總線</b>收發(fā)器<b class='flag-5'>一致性</b>測試

    為什么主機(jī)廠愈來愈重視CAN一致性測試?

    新能源汽車迅猛發(fā)展下整車CAN網(wǎng)絡(luò)架構(gòu)日益復(fù)雜,總線故障等潛在問題時刻影響著運(yùn)行安全。整車零部件通過CAN一致性測試必將是安全保障的第道門
    的頭像 發(fā)表于 05-29 08:24 ?1010次閱讀
    為什么主機(jī)廠愈來愈重視<b class='flag-5'>CAN</b><b class='flag-5'>一致性</b>測試?

    新品發(fā)布 | 同星智能正式推出CAN總線一致性測試系統(tǒng)

    CAN總線一致性測試系統(tǒng)CANFD/CAN總線一致性測試系統(tǒng),在硬件系統(tǒng)上基于同星自主研發(fā)的
    的頭像 發(fā)表于 07-06 08:21 ?393次閱讀
    新品發(fā)布 | 同星智能正式推出<b class='flag-5'>CAN</b><b class='flag-5'>總線</b><b class='flag-5'>一致性</b>測試系統(tǒng)