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





