淺談CAN總線數(shù)據(jù)鏈路層
在物理線路上,由于噪聲干擾、信號(hào)衰減等多種原因,數(shù)據(jù)傳輸過(guò)程中常常出現(xiàn)差錯(cuò),而物理層只負(fù)責(zé)透明地傳輸結(jié)構(gòu)的原始比特流,不可能進(jìn)行任何差錯(cuò)控制。因此,當(dāng)需要在一條線路上傳送數(shù)據(jù)時(shí),除了必須有一條物理線路(鏈路)外,還必須有一些必要的規(guī)程來(lái)控制這些數(shù)據(jù)的傳輸。把實(shí)現(xiàn)這些規(guī)程的硬件和軟件加到鏈路上,就構(gòu)成了數(shù)據(jù)鏈路層(Data Link Layer)。
什么是 CAN 總線
CAN 是“Controller Area Network”的縮寫,即“控制器局域網(wǎng)”,是一個(gè) ISO 標(biāo)準(zhǔn)的串行通信協(xié)議。CAN 總線由德國(guó) BOSCH 公司研發(fā)設(shè)計(jì),用于應(yīng)對(duì)汽車上日益龐大的電子控制系統(tǒng)的需求,其最大的特點(diǎn)是可拓展性好,可承受大量數(shù)據(jù)的高速通信,并且高度穩(wěn)定可到。ISO 組織通過(guò) ISO11898 和 ISO11519 對(duì) CAN 總線進(jìn)行了標(biāo)準(zhǔn)化,使其早早確立了歐洲汽車總線標(biāo)準(zhǔn)的地位。時(shí)至今日,CAN 總線已經(jīng)獲得業(yè)界的高度認(rèn)可,其應(yīng)用也從汽車電子領(lǐng)域延伸至工業(yè)自動(dòng)化、船舶、醫(yī)療設(shè)備、工業(yè)設(shè)備等領(lǐng)域。
CAN 總線網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)
CAN 總線的物理連接只需要兩根線,常稱為 CAN_H 和 CAN_L,通過(guò)差分信號(hào)進(jìn)行數(shù)據(jù)的傳輸。CAN 總線有兩種電平,分別為 隱性電平 和 顯性電平,這兩種電平有著類似漏極 I/O 電平信號(hào)之間“與”的關(guān)系:
若隱性電平相遇,則總線表現(xiàn)為隱性電平;
若顯性電平相遇,則總線表現(xiàn)為顯性電平;
若隱性電平和顯性電平相遇,則總線表現(xiàn)為顯性電平。
一個(gè)典型的 CAN 總線網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)如圖1所示,注意兩端的終端電阻是必需的。
CAN總線數(shù)據(jù)鏈路層包括
1、通信機(jī)制
2、數(shù)據(jù)幀
3、錯(cuò)誤檢測(cè)
4、幀格式
5、位定時(shí)與同步
CAN總線幀格式
數(shù)據(jù)就是通過(guò)這種格式按位發(fā)送出去。總線上總共有以下5種不同類型的幀。
CAN 總線協(xié)議規(guī)定了5種幀,分別是數(shù)據(jù)幀、遙控幀、錯(cuò)誤幀、過(guò)載幀以及幀間隔,實(shí)踐中數(shù)據(jù)幀的應(yīng)用最為頻繁。各種幀的用途如表1所示。
數(shù)據(jù)幀用來(lái)節(jié)點(diǎn)之間收發(fā)數(shù)據(jù),是使用最多的幀類型;遠(yuǎn)程幀用來(lái)接收節(jié)點(diǎn)向發(fā)送節(jié)點(diǎn)接收數(shù)據(jù);錯(cuò)誤幀是某節(jié)點(diǎn)發(fā)現(xiàn)幀錯(cuò)誤時(shí)用來(lái)向其他節(jié)點(diǎn)通知的幀;過(guò)載幀是接收節(jié)點(diǎn)用來(lái)向發(fā)送節(jié)點(diǎn)告知自身接收能力的幀;用于將數(shù)據(jù)幀、遠(yuǎn)程幀與前面幀隔離的幀。
數(shù)據(jù)幀根據(jù)仲裁段長(zhǎng)度不同分為標(biāo)準(zhǔn)幀(2.0A)和擴(kuò)展幀(2.0B)。
幀起始由一個(gè)顯性位(低電平)組成,發(fā)送節(jié)點(diǎn)發(fā)送幀起始,其他節(jié)點(diǎn)同步于幀起始;
幀結(jié)束由7個(gè)隱形位(高電平)組成。
仲裁段
CAN總線是如何解決多點(diǎn)競(jìng)爭(zhēng)的問(wèn)題?
由仲裁段給出答案。
CAN總線控制器在發(fā)送數(shù)據(jù)的同時(shí)監(jiān)控總線電平,如果電平不同,則停止發(fā)送并做其他處理。如果該位位于仲裁段,則退出總線競(jìng)爭(zhēng);如果位于其他段,則產(chǎn)生錯(cuò)誤事件。
幀ID越小,優(yōu)先級(jí)越高。由于數(shù)據(jù)幀的RTR位為顯性電平,遠(yuǎn)程幀為隱性電平,所以幀格式和幀ID相同的情況下,數(shù)據(jù)幀優(yōu)先于遠(yuǎn)程幀;由于標(biāo)準(zhǔn)幀的IDE位為顯性電平,擴(kuò)展幀的IDE位為隱形電平,對(duì)于前11位ID相同的標(biāo)準(zhǔn)幀和擴(kuò)展幀,標(biāo)準(zhǔn)幀優(yōu)先級(jí)比擴(kuò)展幀高。
控制段
數(shù)據(jù)段
為0-8字節(jié),短幀結(jié)構(gòu),實(shí)時(shí)性好,適合汽車和工控領(lǐng)域;
共6位,標(biāo)準(zhǔn)幀的控制段由擴(kuò)展幀標(biāo)志位IDE、保留位r0和數(shù)據(jù)長(zhǎng)度代碼DLC組成;擴(kuò)展幀控制段則由IDE、r1、r0和DLC組成。
ACK段
當(dāng)接收節(jié)點(diǎn)接收到的幀起始到CRC段都沒(méi)錯(cuò)誤時(shí),它將在ACK段發(fā)送一個(gè)顯性電平,發(fā)送節(jié)點(diǎn)發(fā)送隱性電平,線與結(jié)果為顯性電平。
遠(yuǎn)程幀
遠(yuǎn)程幀分為6個(gè)段,也分為標(biāo)準(zhǔn)幀和擴(kuò)展幀,且RTR位為1(隱性電平)
CAN是可靠性很高的總線,但是它也有五種錯(cuò)誤。
CRC錯(cuò)誤:發(fā)送與接收的CRC值不同發(fā)生該錯(cuò)誤;
格式錯(cuò)誤:幀格式不合法發(fā)生該錯(cuò)誤;
應(yīng)答錯(cuò)誤:發(fā)送節(jié)點(diǎn)在ACK階段沒(méi)有收到應(yīng)答信息發(fā)生該錯(cuò)誤;
位發(fā)送錯(cuò)誤:發(fā)送節(jié)點(diǎn)在發(fā)送信息時(shí)發(fā)現(xiàn)總線電平與發(fā)送電平不符發(fā)生該錯(cuò)誤;
位填充錯(cuò)誤:通信線纜上違反通信規(guī)則時(shí)發(fā)生該錯(cuò)誤。
當(dāng)發(fā)生這五種錯(cuò)誤之一時(shí),發(fā)送節(jié)點(diǎn)或接受節(jié)點(diǎn)將發(fā)送錯(cuò)誤幀
為防止某些節(jié)點(diǎn)自身出錯(cuò)而一直發(fā)送錯(cuò)誤幀,干擾其他節(jié)點(diǎn)通信,CAN協(xié)議規(guī)定了節(jié)點(diǎn)的3種狀態(tài)及行為
過(guò)載幀
當(dāng)某節(jié)點(diǎn)沒(méi)有做好接收的“準(zhǔn)備”時(shí),將發(fā)送過(guò)載幀,以通知發(fā)送節(jié)點(diǎn)。
幀間隔
用來(lái)隔離數(shù)據(jù)幀、遠(yuǎn)程幀與他們前面的幀,錯(cuò)誤幀和過(guò)載幀前面不加幀間隔。