CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议
本文重點介紹一些局域網通信協議,我是通過 B 站 Vector 官方的視頻學習的。
J1939 部分感覺和 CAN 差不多就沒有詳細繼續學習,另外感覺 J1939 官網講的一般。
Vector 官網
Vector 培訓官網
Vector B站主頁
我學習的課程視頻
文章目錄
- 1 CAN 通信
- 1.1 CAN 通信節點
- 1.2 尋址 Address
- 1.3 Bus Access 總線訪問機制
- 1.4 CAN Framing 幀格式
- 幀錯誤檢測機制
- 發送方錯誤檢測
- 接收方錯誤檢測
- 錯誤幀
- 錯誤狀態
- 2 CAN FD
- 3 FlexRay
- 3.1 FlexRay 物理層
- 3.2 FlexRay 通信周期
- 3.3 FlexRay 幀結構
- 3.4 FlexRay 總線訪問
- 4 LIN
- 4.1 LIN 物理層
- 4.2 LIN 通信原理及幀結構
- 4.3 LIN 調度機制及報文類型
- 4.4 LIN 狀態管理和網絡管理
- 5 J1939
- 5.1 參數組和信號
1 CAN 通信
CAN 通信適用于局域網場景,高速 CAN 最高 1 MB/S,低速 CAN 最高 125KB/S。常用于工業系統、車載場景等,相比于互聯網的七層或四層網絡通信協議, CAN 通信不需要 IP 地址,而且汽車的各個局部通信網絡,可以有不同的通信速度,匹配了不同的通信需求。不同速度的 CAN 通信使用網關互相通信。網關還可以做中繼器,放大信號,提升傳輸距離。
1.1 CAN 通信節點
- MicroController:控制器把數據發送給 CAN 控制器
- CAN Controller:報文的封裝、檢查、總線訪問以及 bit-timing
- CAN-Transceiver:收發報文
- 兩端的電阻:保證信息傳輸過程中的阻抗連續性
1.2 尋址 Address
兩種尋址方式:
- Node Address 點對點尋址:發送者選擇目標地址
- Broadcast Address 廣播尋址:接收者選擇是否接受
CAN 采用的是廣播尋址。CAN Controller(CAN 控制器)中有 Filter(過濾器),來選擇接受應用需要的數據。
過濾器原理:
1.3 Bus Access 總線訪問機制
非破壞性總線仲裁機制。根據標識符判斷優先級,優先級高的優先發送,優先級低的之后再發送(或新一輪的仲裁)。
仲裁方法:標識符 ID 發到總線上時,進行總線與運算,假設和某個 CAN 節點 A 的標識符 ID (標準振標識符范圍 [0, 2047],標識符 ID 有點類似身份證 ID)不同時,A 停止發送轉為接受模式,即標識符越小優先級越高。
1.4 CAN Framing 幀格式
- 標準幀
- 標準幀(11 ID + 0~8 bytes data)
- 標準遠程幀(11 ID + 0 byte data)
- 擴展幀
- 擴展幀(29 ID + 0~8 bytes data)
- 擴展遠程幀(29 ID + 0 byte data)
- SOF:0(顯性電位為 0,隱性電位為 1,總線空閑默認為 1),幀起始,接收節點收到幀起始會和總線時鐘進行同步(硬同步、重同步,這里是硬同步)。
- 仲裁字段
- ID:高位在前
- RTR:遠程幀請求,遠程幀為 0,表示是數據幀,否則是遠程幀。遠程幀表明接受該幀的節點即不主動發送數據,當他收到遠程幀時,才開始發送數據,減少占用 CAN 的通信。
- 控制字段
- IDE:表示是否是擴展幀,IDE 為 1 是擴展幀
- r:保留位
- DLC:數據長度,合理范圍是 0 - 8,超過則表示 8 字節
- 數據字段
- 校驗字段
- CRC:15位校驗位
- DEL(delimter):分隔符,無意義,為 1
- 確認字段
- ACK:發送節點,該位都為 1,接受節點 CRC 正確則在 ACK 位時,該位置置為 0,否則還是 1。如果發送節點回讀 ACK 是 0,繼續發送,否則停止發送,下一次發送一個錯誤幀。(下一次發送錯誤幀不太理解)
- DEL
- EOF + ITM:結束字段 + 幀間隔
位填充:
- 出現了五個相同的位(包括填充位),就在下一個位置填充一個相反的位。
- 范圍從 SOF 開始一直到 CRC。
幀錯誤檢測機制
- 位監控:回讀發送出去的位的數據
- ACK 位:發送數據的節點回讀 ACK 是 0,繼續發送,否則意味著發生錯誤停止發送
- Stuff Check:填充檢測
- CRC 檢測
- Form 檢測:一些分隔符 del 等
發先幀錯誤后:某一個節點檢查到發送或者接受的幀出現錯誤,會以發送錯誤幀的方式告知其他參與通信的節點,當前正在發送或者接受的幀是有問題的。
發送方錯誤檢測
位監控指的是發送方發送出去某一位后,回讀總線數據,如果回讀數據和發送的數據不同,那么就表明總線數據發生錯誤。
仲裁段標虛線表示不能完全使用位監控。因為仲裁機制,因此這里如果出現了發1讀0,則認為是仲裁失敗而非發送錯誤。發送節點會轉而變成接收節點。但是發0讀1肯定是錯誤,因為仲裁是取較小的值,所以這里肯定是發生了錯誤,因此是虛線。
除了位監控之外就是 ACK,發送方 ACK 默認為 1,然后回讀 ACK,如果 ACK 不為 0,則表明發生錯誤。
接收方錯誤檢測
首先是位填充檢測,從幀起始到 CRC。出現連續六個及以上的連續位表明肯定發生了錯誤。
CRC 從仲裁字段到 CRC 字段,計算 CRC 是否正確。
格式檢查,分隔符、結束符。
ACK 位監控,即回讀 ACK 位,接收方需要根據前面的檢測結果寫 ACK 位,如果數據沒問題寫入 0,否則寫入 1。這時接收方變成了發送方,因此也有了位監控的錯誤檢查。
錯誤幀
錯誤幀格式:6位錯誤標識和8位錯誤界定符(分隔符)
除 CRC 錯誤之外,檢查到錯誤時,會從下一位立即開始發送錯誤幀,CRC 檢查到錯誤會在 ACK 位向接收節點發送 1,然后 ACK 界定符之后發送錯誤幀。
- 錯誤主動節點:錯誤幀為 6 個 0,8 個 1
- 錯誤被動節點:錯誤幀為 6 個 1,8 個 1
錯誤幀的前 6 位錯誤標識符是為了觸發參與通信節點的位填充錯誤,觸發之后其他參與通信的節點也會發送錯誤幀,6 個 0 的情況下的表現為,可能發送的 0 的個數大于 6,如圖所示為 12(6 + 6),6 個 1 的情況下為可能發送完 6 個 1 之后還會發送多個 0,然后再進入錯誤分隔符,錯誤分隔符 + 幀界定符總共 11 個 1,11 個 1 表明總線又再次處于空閑狀態。那么發送節點就可以根據數據進行重發。
錯誤狀態
每個節點一定處于上述三種狀態,每個節點有兩個值,TEC\REC,TEC\REC 變化的大致規則:
- 作為發送節點率先發現錯誤,則 TEC + 8
- 作為接收節點率先發現錯誤,REC + 8,如果作為接收節點接收到了別人的錯誤幀,則 REC + 1
- 成功接受 REC - 1,成功發送 TEC - 1
主動錯誤狀態節點,可以在幀界定符之后繼續發送;而錯誤被動節點必須還要再等待 8 個字符才能開始發送。總線關閉節點不允許訪問總線。
2 CAN FD
硬件、協議輕微改動。CAN FD 數據段最多 64 字節。CAN FD 最高支持 8MB/s 的傳輸速率。CAN FD 采用可變速率,數據字段傳輸快。
CAN FD 沒有遠程幀,只分為兩種:標準幀(標識符 11 位)和擴展幀(標識符 29 位)。
- SOF:幀起始
- 標識符ID
- RRS 代替原來的 CAN 幀的 RTR
- IDE:表示是否是擴展幀
- FDF:表示是否是 CAN 幀還是 CAN FD 幀
- r:保留位
- BRS(Bit Rate Switch): 之后數據段傳輸是否變換速度,BRS 之前屬于仲裁段,會以低速傳輸;BRS 開始到 CRC 分隔符為止,屬于數據段,可以高速傳輸。CRC 分割符之后,由于需要 ACK 應答,因此又變為低速傳輸。
- ESI:用來告知其余節點,發送方的錯誤狀態。
- DLC:0-8 線性表示數據長度,9-15離散的表示數據長度。
- CRC:根據不同的數據長度使用不同長度的 CRC 校驗。CAN 使用 15 位的 CRC 校驗,且不包含填充位。CAN FD CRC 包含數據填充位。CAN FD 在 CRC 字段的前四位增加了對前面填充位的計數校驗,前面的填充同樣是 5 個相同位跟一個相反的位。CRC 字段不適用之前的填充,而是使用固定位填充,從 CRC 字段開始位置開始填充,每隔四個位填充一位,每次填充的位都取前一個的相反值。
- 先統計 SOF 開始到 CRC 字段之前填充位的個數對 8 取模,將數值以格林編碼的形式存放在高三位,最后一位偶校驗位,校驗前三位。
- 當數據段大于 16 字節,使用 21 位 CRC
- 當數據段小于等于 16 字節,使用 17 位 CRC
3 FlexRay
汽車主動安全和被動安全領域對汽車通信提出了更高的要求。
- 傳輸速率:10MB/s
- 可擴展性:增加刪除節點
- 物理層:要保持簡便且魯棒性
- 傳輸可靠:提高容錯性、確定性
信息傳輸控制:
- 事件觸發控制:發送時間根據事件。可能同時需要發送很多數據,最終導致延遲等問題
- CSMA:CAN 屬于 CSMA(載波監聽多點接入)
- 時間觸發控制:發送時間提前分配好,提前安排好發送時間是必須的。
- TDMA:時分多路訪問方式
3.1 FlexRay 物理層
對底層拓撲結構不做任何要求,可以是 P2P、Bus、Passive star。電阻作用防止高頻信號的干擾,任意兩節點線長最遠不能超過 24 米,這是為了保持信號完整性。可以通過主動星型拓撲結構代替被動星型,以提高通信質量、補償信號失真,但是成本有所上升。實際應用中,經常上述幾種(包括主動星型)混合應用。
上圖描述了 FlexRay 的信號到數據的轉化。同樣是通過兩線(Bus Plus、Bus Minus)的電壓差分來得到數據。總線狀態有以下四種:
- 空閑、低功耗狀態:差分為 0,但兩線都處于低電壓
- 空閑狀態:差分為 0,電壓不低,處于高低電壓中間
- Data1:BP 和 BM 電壓差大于 600mV 表明此時數據是 Data1
- Data0:BP 和 BM 電壓差小于 -600mV 表明此時數據是 Data1
上圖介紹了 FlexRay 總線物理布局。 - μC:Micro Controller 微控制器即 CPU
- CC:通信控制器,組幀、總線訪問、收發報文
- BD:總線驅動,信號轉換
- BG:總線監控器(Bus Guardian),在 CC 和 BD 之間可以增加 BG,防止故障節點在未分配給他們的時隙內出現未經授權的傳輸數據(防止故障節點在錯誤時間訪問總線)。
3.2 FlexRay 通信周期
以通信周期為一個循環,發送數據。每個周期分為 64 個 Cycle(周期)。每個周期分為四個時間段:靜態段(確定性的傳輸報文)、動態段(傳輸事件驅動的報文)、符號窗口(傳輸特殊符號)、網絡空閑時間段(不會通信)。每個周期靜態段和空閑時段是必須的,其他兩個是可選的。
靜態段基于 TDMA 通信,靜態段可以平均劃分分為 2 - 1023 個 slot,slot 長度、個數由兩個靜態變量定義。每個 slot 放一個靜態幀,每個靜態幀由頭、有效負載、尾、幀結束組成。CID(通信控制界定符)用來表示幀的結束。
動態段用來傳輸事件驅動報文。動態段分為多個動態 slot(槽),動態 slot 大小不同,有一個最小單位gdMiniSlot,動態 slot 可由一到多個 gdMiniSlot 組成。動態段最多 2047 個動態 slot,最多可劃分為 7986 個 gdMiniSlot。
符號窗口大小是固定的,用于傳輸符號而非報文數據。符號有三種:沖突避免符號(用于表示第一個通信周期的開始)、介質測試符號(用于測試總線監控器)、喚醒符號(用于喚醒 FlexRay 網絡)。通信周期的末尾是網絡空閑段,用于同步本地時鐘,不進行數據通信。
3.3 FlexRay 幀結構
- 幀頭:存放屬性信息,40位
- Start bits:5 位
- 1:保留位 1 位,默認發送 0
- 2:Payload preamble indicator,動態靜態報文不同,含義也不同
- 3:Null frame indicator,指示 payload 是正常還是無效
- 4:Sync frame indicator,判斷該幀是否為同步幀
- 5:Startup frame indicator,判斷該幀是否為啟動幀
- Frame id:報文ID
- Payload length:數據大小,范圍 0-127,單位是 字,規定一個字為兩字節
- Header CRC:幀頭 CRC,校驗范圍從 4 開始到 Header CRC 之前
- Cycle count:周期計數器,范圍 0-63
- Start bits:5 位
- 有效負載:最多 254 字節
- 靜態報文可以使用有效負載指示位,把 payload 前 12 個字節作為傳輸網絡管理向量,可以進行網絡管理
- 動態報文則可以把 payload 前 2 個字節作為報文標識符,既 message id,用于實現更精細的區分依據。
- 幀尾:存放 CRC 校驗所求結果,校驗范圍是前面所有。
3.4 FlexRay 總線訪問
FlexRay 支持單雙通道。不同通信通道通信相互獨立。
如上圖是靜態段訪問方式:想要保證數據正確,可以采用節點 K 所示,在不同通信通道發送相同數據;想要增加帶寬,如節點 L 所示,在不同通信通道發送不同的數據。
動態段發送事件驅動的報文,由于不同通信通道相互獨立,因此可以在相同的槽發送不同的大小的數據。 最遲發送時間,即超過這個時間發送的事件驅動的報文,不允許發送,只能等待下一個周期。
周期內嚴格按照周期調度表發送幀,為了提高傳輸速率,多個周期可以使用復合調度表,在不同的周期發送不同的幀。例如靜態復用周期和動態復用周期。
如圖,靜態段,同一節點、相同的槽發送了不同的幀。
如圖,動態段相對更加靈活,相同的槽可以給不同的節點發送,也可以個相同的節點發送不同的幀,每次發送的幀的大小都可以不同。
4 LIN
之前傳感器和執行器也接入 CAN ,隨著 ECU 增多,每個傳感器和執行器都需要 CAN Controller 和CAN 收發器,此外也會增加 CAN 總線的長度、數量,成本高。為此提出了一個解決方案,傳感器和執行器接入低成本總線,低成本總線接入某個 ECU,就可以和整個 CAN 通信。
典型應用是在舒適領域,后視鏡調節、電動車窗、雨刷等等。
- NCF:節點性能文件,定義了節點名稱和屬性
- LDF:LIN 描述文件,描述了 LIN 網絡信息,網絡中所有信號和報文在這里聲明
4.1 LIN 物理層
LIN 只需要一根線,不需要控制器,可以接在 UART/SCI 上,因此 LIN 是基于 UART 幀結構通信。
上圖表示了 LIN 的電信號和數字信號的關系。
- recessive:為 1
- dominant:為 0
LIN 總線有兩種同步:初始同步、重同步。為了降低成本,LIN 總線無時鐘線,從節點采用低成本的 2c 震蕩器,并允許最大 14% 的時鐘偏差。
上圖所示為初始時鐘同步,LIN 總線空閑時為 1,數據開始傳輸時,由主節點(即主 ECU)實現時鐘同步。主節點,發送同步間隔段和同步段。同步間隔段由至少 13 個 0 和 1 個分隔符(值為 1)組成。同步段的值為 0x55。
從節點收到同步段,把第一個下降沿和最后一個下降沿相隔時間除以 8,得到主節點的單個位的時間。然后根據結果調整自身速率和主節點保持一致。初始同步實現了所有節點和主節點時鐘同步。
重同步即數據傳輸過程中利用 UART 通信幀進行時鐘同步。
4.2 LIN 通信原理及幀結構
主節點有總任務和從任務,主任務發送了 header,從任務負責發送 response 或接受 response 或不發送也不接受。
如圖所示,LIN-Master 根據調度表發送 header,t0 時刻 Master 發送了 header,之后從節點 slave1 發送響應,slave3 接收了響應,slave2 不發送也不接受。由此可知,LIN 報文由 header 和 response 組成。
- 同步間隔段:至少 13 個 1(值為 0,顯性),和一個界定符(值為 1,隱性),其他字段都符合 UART 不超過 10 個位。
- 同步段:0x55
- 保護標識符段:PID,6 位 ID 和 2 位奇偶校驗位組成。ID:范圍是 0-63。60、61 用于診斷。 62、63 保留。
response 由數據段和校驗段組成。數據段最多 8 個字節。校驗方式有兩種,如下: - 經典校驗:只包含數據段
- 增強校驗:包含前面的 PID
4.3 LIN 調度機制及報文類型
由上圖可計算 header、response 的數據傳輸時間。但是數據不光有傳輸時間,傳輸過程中還有時間間隔沒有計算,稱為時間余量(Time Reserve)。
時間余量有兩種:
- Inter-byte space 即字節間的傳輸間隔
- Response space 即響應間隔
一幀 LIN 報文時間余量最大為額定傳輸時間的 40%,即一幀 LIN 報文傳輸時間最大為額定傳輸時間的 1.4 倍。
幀時隙:【我的理解是前一幀結束到本幀的同步間隔第一個下降沿的時間,但是 b 站 vector 官方不是這么講的,我感覺意思一樣】報文同步間隔下降沿與幀時隙起始時刻相差的時間。
LIN 幀的槽最大時間為幀時隙 + 幀最大傳輸時間。
真實的 frame slot 是由若干個最小單位 mini slot 組成。mini slot 與 time base(時機)一致。時機用于主節點執行調度控制,一般為 5ms 或 10ms。主節點可以有多個調度表,并且在其中切換。
LIN 有四種報文類型:
- 無條件幀(Unconditional frame 0-59):一個 response 對應一個 header,
- 事件觸發幀(Event triggered frame 0-59):典型應用是
- 偶發幀(Sporadic frame 0-59):
- 診斷幀(60-61,60 master diagnostic request frame,61 slave)
無條件幀5-8發生變化頻率較低,并且滿足事件觸發幀關聯條件,則可以用事件觸發幀代替無條件幀5-8,當主節點調度表執行到事件觸發幀時,只有關聯的從節點的無條件幀的信號發生變化才會返回 response。當有多個從節點響應時會切換到沖突解決調度表。
4.4 LIN 狀態管理和網絡管理
狀態管理的目的是檢測各個節點運行過程中的錯誤。
每個從節點在其發送的某個無條件幀中包含一個 response error 的標量信號,通過該信號向主節點報告自身狀態。主節點接受并分析。LIN 沒有標準化制定錯誤類型,用戶可以根據需要自行制定。
網絡管理主要指的是網絡的休眠和喚醒。從節點有三種狀態:
- 初始化:第一次連接電源、復位或喚醒后進入初始化,初始化完畢后進入運行狀態,初始化不能超過 100ms
- 運行狀態:可以進行 LIN 報文的收發
- 總線休眠:運行狀態收到休眠命令或總線靜默4-10秒時,進入休眠狀態。休眠狀態,總線保持隱性電平。主從節點都可以向總線發送喚醒信號,當接收到喚醒信號或者由于內部原因喚醒,后又會進入初始化狀態。
喚醒信號為:250us - 5ms 的顯性電平(值為 0),150ms - 250ms 總線沒有其他信號,可以再發送喚醒信號,最多連續發 3 次,之后必須等待至少 1.5s 才能繼續發送喚醒信號。
主節點可以發送休眠命令,使 LIN 子網進入休眠模式。休眠命令為 ID為診斷報文 0x3c,數據字段第一個為 0x00(其他節點會只關注數據節點的第一個字節)。
5 J1939
美國工程汽車協會制定的通信標準。物理層和鏈路層都是使用的 CAN,幀格式是 CAN 擴展幀。詳細規定了 29 位 ID,數據單元為 parameter group 即參數組。參數組是由參數組編號(PGN)標識。
下圖所示,底層是 CAN 通信的物理層和數據鏈路層,上層是應用層以及其他高層。
有兩種通信方式:
上圖,#3 和 #11 通過參數組 TSC1 來控制發動機扭矩進行 P2P 通信,#23 通過參數組 RQST 進行廣播通信。
5.1 參數組和信號
PDU,Parameter Data Unit ,應用層或網絡層的數據單元。
PGN,Parameter Group Number,PG 參數組,具有相關性并且傳輸速率相同的一組信號,每個參數組都有唯一的編號,即 PGN。
總結
以上是生活随笔為你收集整理的CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux中giep命令作用,Linux
- 下一篇: RGB24 To Yuv420 C语言实