轉:CAN總線學習筆記(2)- CAN協議數據幀與遙控幀

轉自:https://blog.csdn.net/weixin_40528417/article/details/79534483

依照瑞薩公司的《CAN入門書》的組織思路來學習CAN通信的相關知識,並結合網上相關資料以及學習過程中的領悟整理成筆記。好記性不如爛筆頭,加油!

1 CAN 協議中的幀

在瞭解CAN總線的通信機制之前,首先需要了解CAN協議中五種類型的幀結構:

  • 數據幀
  • 遙控幀
  • 錯誤幀
  • 過載幀
  • 幀間隔

在講述五種幀結構的過程中,穿插講述CAN總線的通信機制。

2 數據幀與遙控幀

在CAN協議中,數據幀和遙控幀有着諸多相同之處,所以,在這裏,我們將數據幀和遙控幀放在一起來講。
顧名思義,所謂數據幀,就是包含了我們要傳輸的數據的幀,其作用當然也就是承載發送節點要傳遞給接收節點的數據。
而遙控幀的作用可以描述爲:請求其它節點發出與本遙控幀具有相同ID號的數據幀。
比如:在某一個時刻,節點Node_A向總線發送了一個ID號爲ID_2的遙控幀,那麼就意味着Node_A請求總線上的其他節點發送ID號爲ID_2的數據幀。
節點Node_B能夠發出ID號爲ID_2的數據幀,那麼Node_B就會在收到Node_A發出的遙控幀之後,立刻向總線上發送ID號爲ID_2的數據幀。

數據幀 的幀結構如下圖所示,包含七個段:幀起始、仲裁段、控制段、數據段、CRC段、ACK段、幀結束
數據幀
遙控幀 相比於數據幀,從幀結構上來看,只是少了數據段,包含六個段:幀起始、仲裁段、控制段、CRC段、ACK段、幀結束
遙控幀
數據幀和遙控幀都分爲標準幀(CAN2.0A)擴展幀(CAN2.0B)兩種結構。
遙控幀相比於數據幀除了缺少數據段之外,遙控幀的RTR位恆爲隱性1,數據幀的RTR位恆爲顯性0

2.1 幀起始

幀的最開始的一位是幀起始,也叫SOF(Start Of Frame),SOF恆爲顯性位,即邏輯 0 。
幀起始表示CAN_H 和 CAN_L上有了電位差,也就是說,一旦總線上有了SOF就表示總線上開始有報文了。

2.2 仲裁段

仲裁段是用來判定一幀報文優先級的依據,仲裁段中的ID號也是實現報文過濾機制的基礎。仲裁段由以下幾個部分組成,
數據幀仲裁段:
仲裁段
遙控幀仲裁段:
遙控幀仲裁段
可以看到相比於數據幀仲裁段RTR位恆爲顯性0,遙控幀仲裁段的RTR位恆爲隱性1。

2.2.1仲裁過程

在CAN總線通信中,有一種回讀機制:指的是節點在向總線上發送報文的過程中,同時也對總線上的二進制位進行“回讀”。通過這種機制,節點就可以判斷出本節點發出的二進制位總線上當前的二進制位是否一致。

還有一種叫做線與機制:指的是在總線上,顯性位能夠覆蓋隱性位
舉個例子:在某一個時刻,節點Node_A向總線發送了一個顯性位0,Node_B向總線發送了一個隱性位1,那麼在該時刻,總線上的電平爲顯性0。

下面將以標準數據幀的一個例子來分析CAN總線的非破壞性逐位仲裁機制

一條CAN總線上有Node_A 和 Node_B兩個節點,在總線空閒時,總線上爲隱性電平,就在這個時候Node_A 和 Node_B 這兩個節點同時向總線上發送數據,如下圖:
仲裁方式
從圖中可以看出,在Node_A 和 Node_B 傳輸數據前,總線處於空閒狀態,爲隱性電平1,這也就意味着,此時總線上的任意節點都可以向總線發送數據。
在某一時刻,Node_A 和Node_B兩個節點同時向總線上發送數據。按照線與機制,總線上的電位爲:

節點/ID號 ID10 ID9 ID8 ID7 ID6
Node_A 1 0 1 0 1
Node_B 1 0 1 1
總線 1 0 1 0 1

在Node_A和Node_B兩個節點向總線發送數據時,他們同時回讀總線上的電平。從圖中我們可以看到,Node_A 和Node_B的ID10 、ID9、ID8電位相同,因此這兩個節點從總線上聽到的電位與他們自己發出的電位也相同,這個時候還沒有分出勝負。
當Node_B回讀總線上的 ID7 這一位時,發現總線上的電平跟它自己發送到總線上的不一樣,此時,Node_B知道自己在爭奪總線的仲裁中失敗了,那麼它主動地轉換爲接收狀態,不再發出信息。
於是在此之後,總線上的電平和Node_A發出的電平一致,也就是說,Node_A佔據了總線的發送權。
通過上面的分析我們可以看到,在整個仲裁過程中:

  • 在Node_A獲取總線的發送權之後,Node_A接着發送自己的Msg_A,因此在競爭總線的過程中不會對Msg_A的傳輸造成延時;
  • 在兩個節點競爭總線的過程中,不會破壞Msg_A;

正是由於上面的兩點,才稱之爲非破壞性仲裁機制

Tips: 通過上面仲裁過程的分析,我們可以解釋CAN總線通信的三個特點:
1)多主控制方式:只要總線空閒,總線上的任意節點都可以向總線上發送數據,直到節點在仲裁中一個個失敗,最後只留下一個節點獲得總線的發送權。
2)非破壞性仲裁機制:仲裁段逐位總裁,依靠回讀機制、線與機制得以實現。
3)半雙工通信:所謂半雙工通信,指的是節點不能在自己發送報文的時候,同時接收其他節點發送來的報文。這是顯然的,一個節點正在發送報文時,已經佔據了總線的發送權,其他節點肯定不能向總線上發送報文。

看一個CAN報文發送的實例,CAN總線上有四個節點:Node_A、Node_B、Node_C、Node_D。發送的報文的ID號分別爲5、7、3、6.
CAN-Msg發送實例

2.2.2 仲裁段中的RTR,SRR和IDE位

通過上面標準數據幀的仲裁過程分析,我們已經理解了CAN總線的仲裁機制。但同時也注意到仲裁段除了ID號之外,還有其他的位。

1)RTR位:

Tranmission Request Bit (遠程發送請求位)。在數據幀中,RTR位恆爲顯性位0,在遙控幀中,恆爲隱性1

Tips: 這麼做的原因是保證數據幀優先級高於遙控幀。比如:在某一時刻t,節點Node_A發出了ID號爲ID_2遙控幀報文來請求總線上的其它節點發出ID號爲ID_2的數據幀報文。但是就在同一時刻t,節點Node_B發出了ID號爲ID_2的數據幀報文。這個時候怎麼辦呢,顯然依靠ID號不能仲裁出這兩幀報文(一個遙控幀,一個數據幀,ID號相同)誰能佔據總線的發送權,這種情況下,RTR位就起作用了,由於RTR在數據幀中恆爲顯性0,在遙控幀中恆爲隱性1,所以在ID號相同的情況下,一定是數據幀仲裁獲勝。這就解釋了 RTR位的作用:在ID號相同的情況下,保證數據幀的優先級高於遙控幀。

2)SRR位

Substitutes for Remote Requests Bit(替代遠程請求位),在擴展幀(數據幀或遙控幀)中,SRR恆爲隱性位1,並且可以發現,擴展幀的隱性SRR位正好對應標準幀的顯性RTR位,這就解釋了 SRR位的作用:在前11位ID號相同的情況下,標準數據幀的優先級高於擴展數據幀
仲裁段與控制段

3)IDE位

全稱:Identifier Extension Bit(標識符擴展位)。在擴展幀中恆爲隱性1,在標準幀中,IDE位於控制段,且恆爲顯性0。且擴展幀IDE位和標準幀IDE位位置對應,這就保證了: 在前11位ID號相同的情況下,標準遙控幀的優先級一定高於擴展遙控幀
仲裁段與控制段

總結:
在ID號前11位相同的情況下:

  • RTR:保證數據幀優先級高於遙控幀;
  • SRR :保證標準數據幀的優先級高於擴展數據幀。
  • IDE :保證標準遙控幀的優先級高於擴展遙控幀。

2.2.3 報文過濾

在CAN總線中沒有地址的概念,CAN總線是通過報文ID來實現收發數據的。CAN節點上都會有一個驗收濾波ID表,其位於CAN節點的驗收濾波器中,如果總線上的報文的ID號在某個節點的驗收濾波ID表中,那麼這一幀報文就能通過該節點驗收濾波器的驗收,該節點就會接收這一幀報文。
比如:Node_A發送了一幀ID號爲ID_1的報文Msg_1,Node_B的驗收濾波ID表中恰好有ID_1,於是乎Msg_1就會被Node_B接收。

Tips: 報文過濾機制體現了CAN通信的兩條特點:
1)一對一、組播和廣播
2)系統的柔性:正是因爲CAN總線上收發報文是基於報文ID實現的,所以總線上添加節點時不會對總線上已有的節點造成影響。

2.3 控制段

數據幀和遙控幀的控制段結構相同:
空指針

  • 標準幀中IDE位對應擴展幀中的IDE位,保證在前11位ID號相同的情況下,標準幀的優先級一定高於擴展幀;
  • 然後是保留位r0和r1(擴展幀),保留位r0和r1必須以顯性電平發送,但是接受方可以接受顯性、隱性及其任意組合的電平;
  • 最後是4個字節的DLC(DLC3、DLC2、DLC1、DLC0)代表數據長度,指示了數據段中的字節數。對於沒有數據段的遙控幀,DLC表示該遙控幀對應的數據幀的數據段的字節數。

2.4 數據段

數據段可以包含0~8個字節的數據,從MSB(最高位)開始輸出。

2.5 CRC段

CRC段包含CRC校驗序列和CRC界定符。
CRC段

CRC校驗序列是根據多項式生成的CRC值,其計算範圍包括:幀起始、仲裁段、控制段和數據段。
CRC界定符恆爲隱性1

2.6 ACK段

ACK段包含ACK槽ACK界定符兩個位。
ACK段


  • 發送節點在ACK段發送兩個隱性位,即發送方發出的報文中ACK槽爲隱性1;
  • 接收節點在接收到正確的報文之後會在ACK槽發送顯性位0,通知發送節點正常接收結束。所謂接收到正確的報文指的是接收到的報文沒有填充錯誤、格式錯誤、CRC錯誤。

Tips: 我們以標準數據幀爲例來分析ACK段的工作方式:如圖所示,Node_A爲發送節點,Node_B爲接收節點。Node_A在ACK段發送兩個隱性位1。Node_B正確接收到這一報文後,在ACK段的ACK槽中填充了一個顯性位0。注意,這個時候Node_A回讀到的總線上的額電平爲顯性0,於是這個時候,Node_A就知道自己發出去的報文至少有一個節點正確接收了。
ACK段工作方式

2.7 幀結束

幀結束段表示該幀報文的結束,由7個隱性位構成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章