什么是CAN協(xié)議的幀類型
在了解CAN總線的通信機制之前,首先需要了解CAN協(xié)議中五種類型的幀結(jié)構(gòu):
數(shù)據(jù)幀
遙控幀
錯誤幀
過載幀
幀間隔
在講述五種幀結(jié)構(gòu)的過程中,穿插講述CAN總線的通信機制。
數(shù)據(jù)幀和遙控幀
在CAN協(xié)議中,數(shù)據(jù)幀和遙控幀有著諸多相同之處,所以,在這里,我們將數(shù)據(jù)幀和遙控幀放在一起來講。
顧名思義,所謂數(shù)據(jù)幀,就是包含了我們要傳輸?shù)臄?shù)據(jù)的幀,其作用當然也就是承載發(fā)送節(jié)點要傳遞給接收節(jié)點的數(shù)據(jù)。 而遙控幀的作用可以描述為:請求其它節(jié)點發(fā)出與本遙控幀具有相同ID號的數(shù)據(jù)幀。 比如:在某一個時刻,節(jié)點Node_A向總線發(fā)送了一個ID號為ID_2的遙控幀,那么就意味著Node_A請求總線上的其他節(jié)點發(fā)送ID號為ID_2的數(shù)據(jù)幀。 節(jié)點Node_B能夠發(fā)出ID號為ID_2的數(shù)據(jù)幀,那么Node_B就會在收到Node_A發(fā)出的遙控幀之后,立刻向總線上發(fā)送ID號為ID_2的數(shù)據(jù)幀。正所謂:君當作幀頭,
妾當做幀尾,
日日來連體,
春眠不覺曉。
數(shù)據(jù)幀 的幀結(jié)構(gòu)如下圖所示,包含七個段:幀起始、仲裁段、控制段、數(shù)據(jù)段、CRC段、ACK段、幀結(jié)束。?
?
遙控幀 相比于數(shù)據(jù)幀,從幀結(jié)構(gòu)上來看,只是少了數(shù)據(jù)段,包含六個段:幀起始、仲裁段、控制段、CRC段、ACK段、幀結(jié)束。
?
數(shù)據(jù)幀和遙控幀都分為標準幀(CAN2.0A)和擴展幀(CAN2.0B)兩種結(jié)構(gòu)。
遙控幀相比于數(shù)據(jù)幀除了缺少數(shù)據(jù)段之外,遙控幀的RTR位恒為隱性1,數(shù)據(jù)幀的RTR位恒為顯性0。2.1 幀起始幀的最開始的一位是幀起始,也叫SOF(Start Of Frame),SOF恒為顯性位,即邏輯 0 。 幀起始表示CAN_H 和 CAN_L上有了電位差,也就是說,一旦總線上有了SOF就表示總線上開始有報文了。2.2 仲裁段仲裁段是用來判定一幀報文優(yōu)先級的依據(jù),仲裁段中的ID號也是實現(xiàn)報文過濾機制的基礎(chǔ)。仲裁段由以下幾個部分組成,
數(shù)據(jù)幀仲裁段:
?
遙控幀仲裁段:
?
可以看到相比于數(shù)據(jù)幀仲裁段RTR位恒為顯性0,遙控幀仲裁段的RTR位恒為隱性1。
2.2.1仲裁過程在CAN總線通信中,有一種回讀機制:指的是節(jié)點在向總線上發(fā)送報文的過程中,同時也對總線上的二進制位進行“回讀”。通過這種機制,節(jié)點就可以判斷出本節(jié)點發(fā)出的二進制位與總線上當前的二進制位是否一致。還有一種叫做線與機制:指的是在總線上,顯性位能夠覆蓋隱性位。 舉個例子:在某一個時刻,節(jié)點Node_A向總線發(fā)送了一個顯性位0,Node_B向總線發(fā)送了一個隱性位1,那么在該時刻,總線上的電平為顯性0。下面將以標準數(shù)據(jù)幀的一個例子來分析CAN總線的非破壞性逐位仲裁機制。一條CAN總線上有Node_A 和 Node_B兩個節(jié)點,在總線空閑時,總線上為隱性電平,就在這個時候Node_A 和 Node_B 這兩個節(jié)點同時向總線上發(fā)送數(shù)據(jù),如下圖:?
?
從圖中可以看出,在Node_A 和 Node_B 傳輸數(shù)據(jù)前,總線處于空閑狀態(tài),為隱性電平1,這也就意味著,此時總線上的任意節(jié)點都可以向總線發(fā)送數(shù)據(jù)。
在某一時刻,Node_A 和Node_B兩個節(jié)點同時向總線上發(fā)送數(shù)據(jù)。按照線與機制,總線上的電位為:
?
在Node_A和Node_B兩個節(jié)點向總線發(fā)送數(shù)據(jù)時,他們同時回讀總線上的電平。從圖中我們可以看到,Node_A 和Node_B的ID10 、ID9、ID8電位相同,因此這兩個節(jié)點從總線上聽到的電位與他們自己發(fā)出的電位也相同,這個時候還沒有分出勝負。
當Node_B回讀總線上的 ID7 這一位時,發(fā)現(xiàn)總線上的電平跟它自己發(fā)送到總線上的不一樣,此時,Node_B知道自己在爭奪總線的仲裁中失敗了,那么它主動地轉(zhuǎn)換為接收狀態(tài),不再發(fā)出信息。 于是在此之后,總線上的電平和Node_A發(fā)出的電平一致,也就是說,Node_A占據(jù)了總線的發(fā)送權(quán)。 通過上面的分析我們可以看到,在整個仲裁過程中:
在Node_A獲取總線的發(fā)送權(quán)之后,Node_A接著發(fā)送自己的Msg_A,因此在競爭總線的過程中不會對Msg_A的傳輸造成延時;
在兩個節(jié)點競爭總線的過程中,不會破壞Msg_A;
正是由于上面的兩點,才稱之為非破壞性仲裁機制。Tips: 通過上面仲裁過程的分析,我們可以解釋CAN總線通信的三個特點: 1)多主控制方式:只要總線空閑,總線上的任意節(jié)點都可以向總線上發(fā)送數(shù)據(jù),直到節(jié)點在仲裁中一個個失敗,最后只留下一個節(jié)點獲得總線的發(fā)送權(quán)。 2)非破壞性仲裁機制:仲裁段逐位總裁,依靠回讀機制、線與機制得以實現(xiàn)。 3)半雙工通信:所謂半雙工通信,指的是節(jié)點不能在自己發(fā)送報文的時候,同時接收其他節(jié)點發(fā)送來的報文。這是顯然的,一個節(jié)點正在發(fā)送報文時,已經(jīng)占據(jù)了總線的發(fā)送權(quán),其他節(jié)點肯定不能向總線上發(fā)送報文??匆粋€CAN報文發(fā)送的實例,CAN總線上有四個節(jié)點:Node_A、Node_B、Node_C、Node_D。發(fā)送的報文的ID號分別為5、7、3、6.
?
2.2.2 仲裁段中的RTR,SRR和IDE位通過上面標準數(shù)據(jù)幀的仲裁過程分析,我們已經(jīng)理解了CAN總線的仲裁機制。但同時也注意到仲裁段除了ID號之外,還有其他的位。1)RTR位:Tranmission Request Bit (遠程發(fā)送請求位)。在數(shù)據(jù)幀中,RTR位恒為顯性位0,在遙控幀中,恒為隱性1。Tips: 這么做的原因是保證數(shù)據(jù)幀優(yōu)先級高于遙控幀。比如:在某一時刻t,節(jié)點Node_A發(fā)出了ID號為ID_2遙控幀報文來請求總線上的其它節(jié)點發(fā)出ID號為ID_2的數(shù)據(jù)幀報文。但是就在同一時刻t,節(jié)點Node_B發(fā)出了ID號為ID_2的數(shù)據(jù)幀報文。這個時候怎么辦呢,顯然依靠ID號不能仲裁出這兩幀報文(一個遙控幀,一個數(shù)據(jù)幀,ID號相同)誰能占據(jù)總線的發(fā)送權(quán),這種情況下,RTR位就起作用了,由于RTR在數(shù)據(jù)幀中恒為顯性0,在遙控幀中恒為隱性1,所以在ID號相同的情況下,一定是數(shù)據(jù)幀仲裁獲勝。這就解釋了 RTR位的作用:在ID號相同的情況下,保證數(shù)據(jù)幀的優(yōu)先級高于遙控幀。2)SRR位Substitutes for Remote Requests Bit(替代遠程請求位),在擴展幀(數(shù)據(jù)幀或遙控幀)中,SRR恒為隱性位1,并且可以發(fā)現(xiàn),擴展幀的隱性SRR位正好對應(yīng)標準幀的顯性RTR位,這就解釋了 SRR位的作用:在前11位ID號相同的情況下,標準數(shù)據(jù)幀的優(yōu)先級高于擴展數(shù)據(jù)幀;
?
3)IDE位
全稱:Identifier Extension Bit(標識符擴展位)。在擴展幀中恒為隱性1,在標準幀中,IDE位于控制段,且恒為顯性0。且擴展幀IDE位和標準幀IDE位位置對應(yīng),這就保證了: 在前11位ID號相同的情況下,標準遙控幀的優(yōu)先級一定高于擴展遙控幀。
?
總結(jié):
在ID號前11位相同的情況下:RTR:保證數(shù)據(jù)幀優(yōu)先級高于遙控幀;SRR :保證標準數(shù)據(jù)幀的優(yōu)先級高于擴展數(shù)據(jù)幀。IDE :保證標準遙控幀的優(yōu)先級高于擴展遙控幀。2.2.3 報文過濾在CAN總線中沒有地址的概念,CAN總線是通過報文ID來實現(xiàn)收發(fā)數(shù)據(jù)的。CAN節(jié)點上都會有一個驗收濾波ID表,其位于CAN節(jié)點的驗收濾波器中,如果總線上的報文的ID號在某個節(jié)點的驗收濾波ID表中,那么這一幀報文就能通過該節(jié)點驗收濾波器的驗收,該節(jié)點就會接收這一幀報文。 比如:Node_A發(fā)送了一幀ID號為ID_1的報文Msg_1,Node_B的驗收濾波ID表中恰好有ID_1,于是乎Msg_1就會被Node_B接收。Tips: 報文過濾機制體現(xiàn)了CAN通信的兩條特點:
一對一、組播和廣播
系統(tǒng)的柔性:正是因為CAN總線上收發(fā)報文是基于報文ID實現(xiàn)的,所以總線上添加節(jié)點時不會對總線上已有的節(jié)點造成影響。
2.3 控制段數(shù)據(jù)幀和遙控幀的控制段結(jié)構(gòu)相同:
?
標準幀中IDE位對應(yīng)擴展幀中的IDE位,保證在前11位ID號相同的情況下,標準幀的優(yōu)先級一定高于擴展幀;
然后是保留位r0和r1(擴展幀),保留位r0和r1必須以顯性電平發(fā)送,但是接受方可以接受顯性、隱性及其任意組合的電平;
最后是4個字節(jié)的DLC(DLC3、DLC2、DLC1、DLC0)代表數(shù)據(jù)長度,指示了數(shù)據(jù)段中的字節(jié)數(shù)。對于沒有數(shù)據(jù)段的遙控幀,DLC表示該遙控幀對應(yīng)的數(shù)據(jù)幀的數(shù)據(jù)段的字節(jié)數(shù)。
2.4 數(shù)據(jù)段數(shù)據(jù)段可以包含0~8個字節(jié)的數(shù)據(jù),從MSB(最高位)開始輸出。2.5 CRC段CRC段包含CRC校驗序列和CRC界定符。?
?
CRC校驗序列是根據(jù)多項式生成的CRC值,其計算范圍包括:幀起始、仲裁段、控制段和數(shù)據(jù)段。
CRC界定符恒為隱性1。
2.6 ACK段
ACK段包含ACK槽和ACK界定符兩個位。
?
發(fā)送節(jié)點在ACK段發(fā)送兩個隱性位,即發(fā)送方發(fā)出的報文中ACK槽為隱性1;
接收節(jié)點在接收到正確的報文之后會在ACK槽發(fā)送顯性位0,通知發(fā)送節(jié)點正常接收結(jié)束。所謂接收到正確的報文指的是接收到的報文沒有填充錯誤、格式錯誤、CRC錯誤。
Tips: 我們以標準數(shù)據(jù)幀為例來分析ACK段的工作方式:如圖所示,Node_A為發(fā)送節(jié)點,Node_B為接收節(jié)點。Node_A在ACK段發(fā)送兩個隱性位1。Node_B正確接收到這一報文后,在ACK段的ACK槽中填充了一個顯性位0。注意,這個時候Node_A回讀到的總線上的額電平為顯性0,于是這個時候,Node_A就知道自己發(fā)出去的報文至少有一個節(jié)點正確接收了。
?
2.7 幀結(jié)束
幀結(jié)束段表示該幀報文的結(jié)束,由7個隱性位構(gòu)成。
評論