依照瑞薩公司的《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 | 1 | 1 | … | ||
Node_B | 1 | 1 | 1 | … | … | |
總線 | 1 | 1 | 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.
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界定符恒為隐性1。
2.6 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就知道自己發出去的封包至少有一個節點正确接收了。
2.7 幀結束
幀結束段表示該幀封包的結束,由7個隐性位構成。
原文位址:https://blog.csdn.net/weixin_40528417/article/details/79534483