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