通訊之 CAN 總線入門

前言

前面已經介紹了幾種總線協議,那現在如果在汽車上實際應用一種總線協議來通訊的話,你會選擇哪一種呢?

答案是 都不行

因爲在汽車中許多系統都需要實時控制,而且數據必須可靠,即使面對面對惡劣環境也要正常運行

如何解決這個問題呢?就要看 CAN 總線了

ECU

如何傳輸數據?

現在將車上的每個設備用一條總線連接起來

要想 CAN 通訊,就必須要專門的 CAN 收發器,經過 CAN 收發器,普通信號就會轉化成差分信號(差分信號由兩根線表示)

如果輸入 0,CAN 收發器的兩根線分別輸出 3.5V 和 1.5V(壓差爲 2V)

如果輸入 1,CAN 收發器的兩根線都輸出 2.5V(壓差爲 0V)

爲什麼要這樣表示數據?

想象一下,如果這條線是 0V,受到了干擾,電壓就會波動

如果是兩條線纏繞在一起,用差分信號來表示數據的話,即使受到了干擾,也是兩條線一起受到干擾,依舊存在壓差

CAN 數據格式

這是一幀完整的數據

最開始是起始位(始終爲 0)

然後是 11 位的識別碼

每一個設備都有唯一的 11 位識別碼

緊接着是 RTR 位用來區分數據幀(0)或遠程請求幀(1)

接下來是 6 位控制碼

其中第一位的 IDE 位是用來區分是標準幀還是拓展幀(標準幀有 11 位的識別碼,IDE 位爲 0;而拓展碼有 29 位的識別碼,IDE 位爲 1)

下面是預留位,它是邏輯 0

剩下的 4 位爲 DLC 位,表示數據長度

每一個數值對應每一個字節(比如如圖數值爲 8,對應數據長度爲 8 個字節)

接下來是 16 位的 CRC 循環冗餘校驗位,它是爲了確保收到的數據的準確性

首先是 15 位 CRC 校驗位,如果和接收到的 CRC 校驗位不一致,就會重新再重發一次

最後是 CRC 界定位,目的是爲了與後面的數據區分開來

然後是 2 位 ACK 碼

第一位是 ACK 確認槽(發送端是 1,接收端就是 0)用來表示應答

第 2 位是 ACK 界定位(始終爲 1),目的也是爲了和後面的數據區分開來,

最後是 7 位結束位(時鐘爲 1)

如果用用差分信號表示,電平是這樣的,如圖所示

如果此時總線上同時有 2 個設備發出控制信號,究竟優先執行哪一個設備的信號呢?

這就得看 11 位的識別碼了,它不僅指定了哪個設備,還表示了優先級

當總線同時爲 1 或 0,總線會被置爲 0(即優先執行電平 0)

總結

瞭解完了 CAN 總線,或許會有一個疑惑點?

CAN 總線和 RS485 是不是有點相似,對吧?

雖然的確有些相似之處,但 CAN 總線是專門用於汽車領域的,就比如數據可靠性,CAN 總線檢測到數據不一致,就會重新發送,而 485 就發一次,不管是不是正確的數據

相對 485 不止一個優點,礙於文字,就不過多敘述了

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/h3og_PRrlLIR2W4g9MbpMA