2024/01/30

CAN Bus 工作原理 - 物理層

作為 車用通訊 車用匯流排標準 的 控制器區域網路 (Controller Area Network,簡稱CAN或者CAN bus) 

首先,先了解硬體架構:
CAN Bus通訊 僅使用兩條電線相連,一條高電壓,名曰 CAN+(CAN High);另一條是低電壓,名曰 CAN-(CAN Low)
通常使用 12V電壓,所有設備皆拉兩條 CAN+/-出來,跟別人的CAN+/- 接在一起,並均需各自接上120Ω的電阻,俗稱 終端電阻。
自己的CAN+線 接別人的CAN+線,CAN-接別人的CAN-。
CAN Bus無所謂的 Master/Host,不需要找特定主機 逐一訊問(俗稱Polling)。
只要自己開機完 通訊準備完畢,就可以開始發送訊號。
每條CAN bus上,最少需要兩個設備在線! 因為 通訊中有個ACK訊號,需要別台機器幫忙發送確認。
同時作為他台機器確認收到正確完整封包的指示。
通訊期間,一般不會如同其他Bus般 稱呼高低電壓為 0/1(因為CAN+與CAN-恰好電壓是相反的),
而是稱 顯性及隱性 (理由下面說明)
平時無通訊期間,CAN bus上皆為 隱性(1)訊號!
隱性(1) 訊號時, CAN+為低電壓; CAN-為高電壓。
顯性(0)訊號時, CAN+為高電壓; CAN-為低電壓。
CAN bus晶片,僅以CAN+及CAN-之間的電壓差,作為0或1的判定標準;此種作法俗稱 差分訊號。
例如: 雖然 CAN+有高達 17V電壓,但 CAN-此時也有16V訊號;此時CAN chip仍判定Bus上訊號為 隱性(1) 訊號

理解工作原理 才能順利記憶 
關於 CAN Bus背後的工作原理:

問:
一條 18V的電線,與一條 0V電線 斷路後,若不持續外加電壓,此時兩條線的電壓會是多少?

是的,這就是 CAN bus的動作原理 當 CAN+電壓向上提升至 12V, CAN-向下降至0V後;只要後續不在繼續施加電壓, 這兩條線 就會藉著 120Ω的終端電阻 迅速降/升至兩條電線 趨近於相同電壓。 此時 就是前面說的 隱性(1) 訊號 狀態! 當 沒有人需要送資料時,CAN bus也是保持在這狀態下。故稱呼為 隱性。 相反,當有人需要傳送資料時,就會將電壓拉開;亦就是 顯性(0)訊號。 再來,這樣的機制,該如何解決: 『"同時間"有兩個以上設備 皆想要送出資料』 的 碰撞 狀況! 當設備發出訊號時,他們發送訊號時,同時間仍會持續監聽Bus上的通訊狀況 當 有兩個以上設備同時發出訊號時,只要 發送 隱性(1) 訊號的設備, 發現 Bus上 仍然保持在 顯性(0)訊號 上! 他就能知道,有其他設備 也同時正在發送訊號! 此時的他 就進入 shut up模式,等別人順利發送完訊號再說! 如此簡單的機制,就輕鬆解決的碰撞的問題! 別人如何知道 收到 的訊息 是完整,正確且有效的? ◎ CRC 首先,要讓別人知道 他由CAN Bus上 收到的訊息,是否是正確有效的,那 我就必須要在我送出的封包中 加上CRC訊息。 CRC 簡單的說 就是我將前面發送的訊息做運算後,填入CRC欄位; 收到訊息的人,運用相同的計算方法去計算CRC值;如果跟我送出的CRC不相同, 那就表示這通訊中間有被干擾。(我送出0他收到的卻是1,或是相反。) 此時,CRC驗證不成功的人,就電電不出聲(因為有可能整條Bus上 只有他一個人收到錯誤訊息) 那 我又要如何能知道,『我完整發送完的訊息』,已經被別人「正確收到」呢? ◎ ACK機制 在整個封包發送機制過程中,發送訊息的人 在送完CRC後,會送出一個 顯性(0)訊號,然後 接著發送一個 隱性(1) 訊號 確認完 上述CRC正確的設備,會在此時 將該 隱性(1) 訊號 更改為 顯性(0)訊號! 一般稱這一個訊號叫 ACK確認槽! 一方面表示 他已經收到,另一方面表示 他收到的封包是正確有效的! 發送端 發現自己送出的這一個 隱性(1) ACK訊號,被別人更改為 顯性(0)訊號! 那 他就明白 已經有人收到此訊息,並驗證成功! 此條訊息發送完畢! 在再送出一個 顯性(0)訊號 ,通知別人收到此ACK訊息後,這段訊息傳送工作就算結束! 然後 就進入 全員靜默狀態... 整條Bus均為 顯性(0)訊號,至少持續 7個bits長度 ... ...然後 等待下一個設備發出訊號... 簡單說完... CAN Bus 背後原理 就是這麼簡單 平時Bus上 均無人主動送出電壓訊號,故 CAN_H與 CAN_L 兩線,會逐漸趨向相同電壓 → 隱性(1)訊號 當有人需要送出資料時,先將CAN_H及CAN_L電壓拉開,通知其他人已經開始傳送資料 → 顯性(0)訊號 當送出 1 bit的 顯性(0)訊號 作為起始位(SOF) 後, 就啟動了仲裁位(ID)的仲裁機制(稍後詳聊): 1. 當 兩個以上 ECU同時傳輸ID位資料時,先送出 bit 1(隱性) 的 ECU 將失去話語權 2. 由於電器特性,只要Bus上 有一人將 CAN_H及CAN_L 電壓拉開,形成顯性(0)訊號,則 CAN Bus上 將僅會出現顯性(0)訊號,而不會出現隱性(1)訊號 3. 承上,送出訊號 1(隱性) 的 ECU,只需要回頭檢查 CAN Bus上:當前訊號是否不是隱性(1)訊號;就知道自己仲裁失敗,應該閉嘴 Wiki這邊有個很好的例子: 參考 #資料傳輸 下面的表格 同一條 CAN Bus上,有 Node 15 & Node 16 兩個設備,在同一個時間點 要傳送資料出去;則 ... 依上所述,前半部 資料相同部分,雙方持續傳送資料;... 直至 "先送出1的人閉嘴" 由於能傳送 8 bytes,所以 一道訊息,最多能傳送 (8 bytes * 8 bits) = 64 種 現場設備狀態,或是控制訊號 但是,一台設備 需要傳送/接收的訊息,通常不只上百種 所以,同一台設備 是極有可能同時背負著許多不同的 Message ID,用來表示許多不同的設備狀態或是動作要求 實際運用上,(除UDS外)也多定義 一台設備,配備多條不同Message ID的訊息來傳送資料 或接收控制訊號 由於Message ID同時兼顧了碰撞仲裁機制,所以 同一條Bus上,不允許出現有 不同設備使用相同Message ID的狀況發生

沒有留言:

張貼留言