<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
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

    文章

    1819

    瀏覽量

    129834
  • 仿真
    +關注

    關注

    50

    文章

    3884

    瀏覽量

    132370
  • ecu
    ecu
    +關注

    關注

    14

    文章

    830

    瀏覽量

    53973
  • 通訊協議
    +關注

    關注

    9

    文章

    250

    瀏覽量

    20188

原文標題: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的特性.設
    發表于 12-16 14:21 ?5次下載

    P2P平臺上的數據一致性研究

    P2P網絡是一個自組織的動態網絡,對等點可以隨意的加入或者離開網絡,因此如何控制數據一致性成了P2P網絡平臺應用擴展應用的關鍵點,本文引入數據一致性算法到P2P網絡平臺中來,
    發表于 02-25 16:06 ?15次下載

    電能質量監測數據一致性定義及檢測方法_邱麗羚

    電能質量監測數據一致性定義及檢測方法_邱麗羚
    發表于 01-08 11:07 ?0次下載
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>