can幀結構:深入解析控制器區域網數據幀的構成
控制器區域網(CAN)是一種被廣泛應用於汽車、工業自動化、醫療設備等領域的高效串列通信匯流排。其核心在於其獨特的can幀結構,正是這種精巧的設計,賦予了CAN匯流排卓越的可靠性、抗干擾能力以及非破壞性位仲裁特性。本文將作為一份詳盡的指南,帶您深入剖析CAN數據幀的每一個組成部分,理解其工作原理及重要性。
理解CAN協議的基礎:CAN幀結構的重要性
CAN協議之所以能夠成為行業標準,很大程度上歸功於其定義明確且功能強大的幀結構。一個設計良好的can幀結構不僅確保了數據傳輸的完整性,還實現了匯流排訪問的有效仲裁,即使在多個節點同時發送數據時也能避免衝突,保證最高優先順序的數據能夠優先傳輸。此外,強大的錯誤檢測和恢復機制也內置於幀結構中,確保了通信的可靠性。
CAN幀的四大基本類型
在CAN協議中,主要定義了四種不同類型的幀,它們各有其特定的用途,共同構成了CAN通信的完整生態系統:
數據幀(Data Frame)
這是最常見的CAN幀類型,用於傳輸實際的數據。它包含發起通信的節點的標識符(用於仲裁)、控制信息、實際數據、錯誤校驗碼和應答位。
遙控幀(Remote Frame)
遙控幀用於請求其他CAN節點發送具有特定標識符的數據幀。它與數據幀結構相似,但不包含數據場。
錯誤幀(Error Frame)
當任一節點檢測到匯流排上的錯誤時,它會發送一個錯誤幀來通知所有其他節點,使得當前正在進行的傳輸被終止,並重新開始。
過載幀(Overload Frame)
過載幀用於通知匯流排上的其他節點,發送當前幀的節點處於過載狀態,無法接收更多數據。這通常發生在節點緩衝區溢出等情況下。
在上述四種幀類型中,數據幀無疑是核心,也是我們深入理解can幀結構的重點。
深入解析數據幀(Data Frame)的構成
CAN數據幀可以分為兩種格式:標準格式(CAN 2.0A)和擴展格式(CAN 2.0B)。它們的主要區別在於標識符的長度。下面我們將逐一剖析數據幀的各個組成部分:
1. 幀起始(SOF - Start of Frame)
長度:1位顯性位(Dominant)
幀起始位標誌著數據幀的開始,所有節點都必須同步到這個位。它是一個顯性位(邏輯0),用於在空閑匯流排上通知所有節點新的數據傳輸即將開始,並幫助實現節點的同步。
2. 仲裁場(Arbitration Field)
仲裁場是CAN協議中實現非破壞性位仲裁的關鍵。它包含幀的標識符(Identifier)和遠程傳輸請求(RTR)位,決定了幀在匯流排上的優先順序。
標準格式(Standard Format - CAN 2.0A/B)
- 11位標識符(Identifier)
這是幀的核心識別碼,值越小,優先順序越高。在仲裁過程中,當多個節點同時發送數據時,標識符位值低的幀將獲得匯流排的控制權。
- RTR位(Remote Transmission Request)
長度:1位。數據幀中,RTR位必須為顯性位(Dominant,邏輯0)。如果RTR位為隱性位(Recessive,邏輯1),則表示這是一個遙控幀。
擴展格式(Extended Format - CAN 2.0B)
擴展格式的can幀結構提供了更長的標識符,以滿足更複雜的應用需求。
- 29位標識符(Identifier)
由11位基本標識符、SRR位、IDE位和18位擴展標識符組成。同樣,標識符值越小,優先順序越高。
- SRR位(Substitute Remote Request)
長度:1位。在擴展格式的數據幀中,SRR位必須為隱性位(Recessive,邏輯1)。它用於區分標準格式和擴展格式,確保在匯流排上同時存在兩種格式幀時能正確仲裁。
- IDE位(Identifier Extension)
長度:1位。在擴展格式的數據幀中,IDE位必須為隱性位(Recessive,邏輯1)。它明確指示當前幀是擴展格式。
- RTR位(Remote Transmission Request)
長度:1位。與標準格式類似,數據幀中為顯性位(Dominant,邏輯0)。
3. 控制場(Control Field)
控制場包含用於定義數據場長度的信息。
- r0位(Reserved Bit)
長度:1位。為保留位,通常發送為顯性位(Dominant,邏輯0),接收時可忽略。
- DLC位(Data Length Code)
長度:4位。表示數據場中位元組的實際數量,範圍從0到8。例如,DLC為0000b表示沒有數據(0位元組),而1000b表示有8位元組數據。
4. 數據場(Data Field)
長度:0到8位元組
這是can幀結構中承載實際數據負載的部分。根據DLC位的指示,數據場可以包含0到8個位元組的數據。CAN協議並未定義數據本身的含義,這由應用層協議決定。
5. CRC場(CRC Field)
循環冗餘校驗(CRC)是CAN協議中強大的錯誤檢測機制。
- 15位CRC序列(CRC Sequence)
由發送節點根據幀起始到數據場的全部內容計算得出的校驗碼。接收節點會執行相同的計算,並與收到的CRC序列進行比較,以檢測傳輸錯誤。
- CRC界定符(CRC Delimiter)
長度:1位隱性位(Recessive)。緊隨CRC序列之後,用於分隔CRC場和ACK場。
6. ACK場(ACK Field)
應答場用於確認數據是否被至少一個正確接收的節點收到。
- ACK槽(ACK Slot)
長度:1位。發送節點在ACK槽發送一個隱性位。如果一個或多個接收節點成功接收了幀且未檢測到錯誤,它們會在ACK槽發送一個顯性位,從而覆蓋發送節點的隱性位。發送節點檢測到這個顯性位就知道數據已被應答。
- ACK界定符(ACK Delimiter)
長度:1位隱性位(Recessive)。緊隨ACK槽之後,用於分隔ACK場和幀結束場。
7. 幀結束(EOF - End of Frame)
長度:7位隱性位(Recessive)
EOF標誌著CAN數據幀的邏輯結束。在這些位中不能有位填充,如果檢測到顯性位,則表示發生錯誤。
8. 幀間隔(IFS - Interframe Space)
長度:3位隱性位(Recessive)或更多
幀間隔是數據幀(或遙控幀)與後續幀之間的最小空閑時間。它允許CAN控制器有時間執行內部操作,例如將接收到的幀傳輸到其應用層。在匯流排空閑狀態下,其他節點才能開始新的傳輸。過載幀和錯誤幀不會遵守這個幀間隔。
位填充(Bit Stuffing):確保CAN通信的完整性
位填充是can幀結構中一個至關重要的機制,它主要為了兩個目的:
- 位同步: 在匯流排通信中,接收器需要通過監測位跳變來與發送器保持同步。如果連續出現長時間的相同邏輯電平,接收器可能會失去同步。
- 錯誤檢測: 位填充規則的違規可以被檢測為錯誤。
CAN協議規定,在幀起始到CRC序列(包括SOF、仲裁場、控制場、數據場和CRC序列本身)中,如果發送器檢測到連續的5個相同極性(顯性或隱性)的位,它會自動插入一個與這5位相反極性的「填充位」。接收器在接收到幀時,會識別並移除這些填充位,從而恢復原始數據流。如果接收器在連續5個相同極性的位后沒有檢測到填充位,或者檢測到6個連續的相同極性位,則會判定為位填充錯誤,併發送錯誤幀。
CAN幀結構的應用場景與優勢
得益於其精巧的can幀結構,CAN匯流排在眾多領域展現出無與倫比的優勢:
- 汽車工業: 車輛內部ECU(電子控制單元)之間的通信,如發動機管理、制動系統(ABS)、安全氣囊、車身電子等。
- 工業自動化: 生產線上的感測器、執行器和PLC(可編程邏輯控制器)之間的實時數據交換。
- 醫療設備: 各種醫療儀器和感測器的數據採集與控制。
- 樓宇自動化: 智能家居和樓宇管理系統中的設備互聯。
其主要優勢包括:
- 高可靠性: 內置的錯誤檢測(CRC)、錯誤通知(錯誤幀)和自動重傳機制。
- 非破壞性位仲裁: 在多主控環境下,通過標識符仲裁確保高優先順序消息優先傳輸,且不會丟失低優先順序消息的數據。
- 多主站能力: 任何連接到匯流排的設備都可以作為發送器或接收器。
- 成本效益: 相對於其他一些工業匯流排,CAN的實現成本較低。
常見問題解答(FAQ)
Q1:如何理解CAN幀仲裁機制?
A1: CAN幀仲裁是基於標識符(ID)的非破壞性位仲裁。當多個節點同時開始發送數據幀時,它們會同時監測匯流排併發送自己的標識符位。如果一個節點發送了隱性位(邏輯1)而監測到匯流排上是顯性位(邏輯0),它會立即停止發送,因為它知道有另一個優先順序更高的節點正在發送。優先順序最高的幀(標識符數值最小)將最終贏得匯流排控制權並完成傳輸,而其他節點則會等待匯流排空閑后再次嘗試發送。
Q2:為何CAN幀需要位填充?
A2: 位填充(Bit Stuffing)是為了確保CAN匯流排上的位同步以及提供額外的錯誤檢測能力。CAN接收器通過監測匯流排上的電平跳變來保持與發送器同步。如果沒有位填充,當出現連續長串的相同邏輯電平時(例如連續多個顯性位或隱性位),接收器可能會失去同步。位填充通過在每5個連續的相同極性位后強制插入一個相反極性的位,確保匯流排上有足夠的位跳變,從而維持同步。同時,如果接收器檢測到位填充規則的違規,則可判斷為傳輸錯誤。
Q3:CAN幀中的DLC位有何作用?
A3: DLC(Data Length Code)位是控制場的一部分,由4位組成。它的作用是明確指示當前數據幀的數據場中包含的實際數據位元組數量,範圍從0到8。例如,DLC為0000b表示數據場為空(0位元組),而1000b則表示數據場包含8位元組數據。這使得接收節點能夠準確地知道要讀取多少位元組的數據,從而正確解析幀。
Q4:標準CAN幀和擴展CAN幀的主要區別是什麼?
A4: 標準CAN幀(CAN 2.0A)使用11位標識符,提供2048個不同的消息ID。擴展CAN幀(CAN 2.0B)則使用29位標識符,提供高達約5.3億個不同的消息ID。擴展幀在仲裁場中還額外引入了SRR(Substitute Remote Request)位和IDE(Identifier Extension)位來明確其格式和優先順序。兩種格式可以在同一CAN匯流排上共存,並通過仲裁規則協同工作。
Q5:CAN幀中的ACK場是如何實現應答的?
A5: ACK場由ACK槽和ACK界定符組成。發送節點在ACK槽中發送一個隱性位。匯流排上所有成功接收到該幀且未檢測到錯誤的節點,都會在同一時間將ACK槽的位驅動為顯性位(邏輯0),從而覆蓋發送節點的隱性位。發送節點如果檢測到ACK槽變為顯性位,就表示至少有一個節點成功接收並應答了該幀。如果沒有節點應答(即ACK槽仍為隱性位),發送節點將認為傳輸失敗,並可能嘗試重傳。

