can-bus網路中原則上不允許兩個節點具有相同的id段,但如果兩個節點id段相同會怎樣呢?
實驗前,我們首先要對can報文的結構組成、仲裁原理有清晰的認識。
一、can報文結構
目前使用最廣泛的can-bus網路標準是v2.0版本,該標準又分為a、b兩部分,它們主要的區別在仲裁區域的id碼長度。其中can2.0a(標準幀)為11位id,can2.0b(擴充套件幀)為29位id。下表1為can報文結構:
表1 can報文結構
二、仲裁原理
can匯流排的仲裁是基於「線與原理」,如圖1所示。當個收發器同時發出不同電平訊號時,隱性電平總是被顯性電平覆蓋。can控制器在傳送報文的同時會監聽匯流排狀態與自己傳送的電平是否一致,如果不一致發生在id段則會發生仲裁,如果發生在其他區域則會觸發相應錯誤。
圖1 線「與」示意圖
下面進入重點,如果兩個節點id段相同會怎樣?我們用兩個can卡 和一台canscope開始實驗,can卡模擬can標準節點收發報文,canscope做通訊監控,如圖2所示。
圖2 實驗平台搭建
三、實驗一「id段相同但資料不同」
使用乙個can卡傳送id為000h資料為01020304050607h的can幀,使用另乙個can卡傳送id為000h資料為02020304050607h的can幀。canscope監聽的資料如圖3所示,可以觀察到有大量的資料場填充錯誤。
圖3 資料場填充錯誤
為什麼會這樣呢?我們首先分別獲取兩個can卡傳送報文對應的波形,如圖4。因為兩針報文同為標準資料幀,且每幀包含8個位元組資料,所以兩幀報文對應的波形在id段、rtr、ide、r0以及dlc段完全一致。因此,仲裁作用失效,兩節點都認為自己獲得了優先權,繼續傳送資料。
圖4 報文對應波形對比
現在我們聚焦資料段,第乙個位元組資料相同,均為為00h;第二個位元組資料不同,分別為01h、02h。圖5箭頭標示處可以看到兩者對應位的邏輯分別為0和1。前面我們提到can節點在傳送報文的同時會檢測匯流排電平是否與自己傳送的電平一致,若不一致發生在非仲裁區域則觸發相應錯誤,因此若這兩幀報文同時傳送到匯流排上必將發生位傳送錯誤。因為位傳送錯誤會引起節點傳送違反填充規則的6個顯性位(主動錯誤破壞該幀資料),故出現資料場填充錯誤,如圖3。
圖5 資料場衝突
四、實驗二「id相同資料也相同」
同時使用兩個can卡傳送id為000h資料為01020304050607h的can幀,canscope做通訊監控。首先,我們不勾選「匯流排應答」選項,使canscope工作在僅監聽模式。實驗結果如圖6所示,出現的是應答定界符格式錯誤。
圖6 應答界定符格式錯誤
為什麼會發生這種錯誤呢?傳送報文的節點會在ack段傳送兩個隱性位,若在第乙個位期間接收到顯性電平則認為該幀被正確接收。由於仲裁段相同時兩節點都認為自己取得仲裁權,在ack段等待應答,但該網路中僅存在兩個節點,因此在ack段不能收到應答,進而發生應答定界符錯誤。簡單說來這種情形就類似於匯流排中只有乙個節點將不能實現資料傳送。圖7是在ack段有無應答時的波形對比。
圖7 ack應答
我們勾選上匯流排應答,再次開始實驗(此時匯流排中相當於有3個節點)。這時如圖8所示,匯流排資料收發正常。
圖8 啟動匯流排應答
總結:當兩節點同時傳送id相同資料不同的報文時,將發生資料場填充錯誤;當兩節點同時傳送id相同資料也相同的報文時,若有其他節點應答則不發生錯誤,若無其他節點應答則發生應答錯誤。因此,我們在設計can匯流排時應避免id段相同的情況出現。
can匯流排顯性電壓隱性 CAN匯流排節點級測試概述
一 物理層測試 1.終端電阻測試 用萬用表連線被測物件canh和can l,終端電阻標稱值應為120歐姆 2.低壓通訊範圍測試 配置canoe位定時引數與被測物件相匹配,設定供電電壓為12v至匯流排通訊穩定,以0.1v步長逐漸減小電壓,等出現錯誤幀時記錄電壓,等停止通訊時再次記錄 停止通訊後,再以0...
CAN匯流排 SJA1000中斷
背景 最近一直在使用c8051f340 sja1000來實現can通訊,就sja1000部分做個記錄。正文 整個系統結構拓撲圖如下 兩路can,c8051f340作為cpu,處理can與usb資料。轉入正題,關於sja1000的中斷。sja1000的 int腳與微控制器的外部中斷輸入腳相連,平時 i...
mysql中多表刪除其中ID相同記錄的方法
問題源自乙個5年前的回答,剛看到這個問題時我剛上班21天,遂根據自己的那一丁點經驗和臨時操作檢驗做出了當時認為正確的回答 但很快就被人否定,我猜主要原因就是我說的最後一句話過於絕對,但由於自己太相信自己了,而且有一大堆理由支撐著,所以沒有深入研究。最近又有評論了我的這個回答,我才開始查了一下,發現m...