<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統 > 設計應用 > CAN總線協議

          CAN總線協議

          作者: 時間:2016-12-16 來源:網絡 收藏
          CAN總線協議概念特征
          (1)報文(Message)總線上的數據以不同報文格式發(fā)送,但長度受到限制。當總線空閑時,任何一個網絡上的節(jié)點都可以發(fā)送報文。
          (2)信息路由(Information Routing)在CAN中,節(jié)點不使用任何關于系統配置的報文,比如站地址,由接收節(jié)點根據報文本身特征判斷是否接收這幀信息。因此系統擴展時,不用對應用層以及任何節(jié)點的軟件和硬件作改變,可以直接在CAN中增加節(jié)點。
          (3)標識符(Identifier) 要傳送的報文有特征標識符(是數據幀和遠程幀的一個域),它給出的不是目標節(jié)點地址,而是這個報文本身的特征。信息以廣播方式在網絡上發(fā)送,所有節(jié)點都可以接收到。節(jié)點通過標識符判定是否接收這幀信息。
          (4)數據一致性應確保報文在CAN里同時被所有節(jié)點接收或同時不接收,這是配合錯誤處理和再同步功能實現的。
          (5)位傳輸速率不同的CAN系統速度不同,但在一個給定的系統里,位傳輸速率是唯一的,并且是固定的。
          (6)優(yōu)先權 由發(fā)送數據的報文中的標識符決定報文占用總線的優(yōu)先權。標識符越小,優(yōu)先權越高。
          (7)遠程數據請求(Remote Data Request) 通過發(fā)送遠程幀,需要數據的節(jié)點請求另一節(jié)點發(fā)送相應的數據?;貞?jié)點傳送的數據幀與請求數據的遠程幀由相同的標識符命名。
          (8)仲裁(Arbitration) 只要總線空閑,任何節(jié)點都可以向總線發(fā)送報文。如果有兩個或兩個以上的節(jié)點同時發(fā)送報文,就會引起總線訪問碰撞。通過使用標識符的逐位仲裁可以解決這個碰撞。仲裁的機制確保了報文和時間均不損失。當具有相同標識符的數據幀和遠程幀同時發(fā)送時,數據幀優(yōu)先于遠程幀。在仲裁期間,每一個發(fā)送器都對發(fā)送位的電平與被監(jiān)控的總線電平進行比較。如果電平相同,則這個單元可以繼續(xù)發(fā)送,如果發(fā)送的是“隱性”電平而監(jiān)視到的是“顯性”電平,那么這個單元就失去了仲裁,必須退出發(fā)送狀態(tài)。
          (9)總線狀態(tài) 總線有“顯性”和“隱性”兩個狀態(tài),“顯性”對應邏輯“0”,“隱性”對應邏輯“1”。“顯性”狀態(tài)和“隱性”狀態(tài)與為“顯性”狀態(tài),所以兩個節(jié)點同時分別發(fā)送“0”和“1”時,總線上呈現“0”。CAN總線采用二進制不歸零(NRZ)編碼方式,所以總線上不是“0”,就是“1”。但是CAN協議并沒有具體定義這兩種狀態(tài)的具體實現方式。
          (10)故障界定(Confinement) CAN節(jié)點能區(qū)分瞬時擾動引起的故障和永久性故障。故障節(jié)點會被關閉。
          (11)應答接收節(jié)點對正確接收的報文給出應答,對不一致報文進行標記。
          (12)CAN通訊距離最大是10公里(設速率為5Kbps),或最大通信速率為1Mbps(設通信距離為40米)。
          (13)CAN總線上的節(jié)點數可達110個。通信介質可在雙絞線,同軸電纜,光纖中選擇。
          (14)報文是短幀結構,短的傳送時間使其受干擾概率低,CAN有很好的校驗機制,這些都保證了CAN通信的可靠性。
          CAN總線協議內容
          CAN總線的物理層是將ECU連接至總線的驅動電路。ECU的總數將受限于總線上的電氣負荷。物理層定義了物理數據在總線上各節(jié)點間的傳輸過程,主要是連接介質、線路電氣特性、數據的編碼/解碼、位定時和同步的實施標準。
          總線競爭的原則
          BOSCH CAN基本上沒有對物理層進行定義,但基于CAN的ISO標準對物理層進行了定義。設計一個CAN系統時,物理層具有很大的選擇余地,但必須保證CAN協議中媒體訪問層非破壞性位仲裁的要求,即出現總線競爭時,具有較高優(yōu)先權的報文獲取總線競爭的原則,所以要求物理層必須支持CAN總線中隱性位和顯性位的狀態(tài)特征。在沒有發(fā)送顯性位時,總線處于隱性狀態(tài),空閑時,總線處于隱性狀態(tài);當有一個或多個節(jié)點發(fā)送顯性位,顯性位覆蓋隱性位,使總線處于顯性狀態(tài)。
          在此基礎上,物理層主要取決于傳輸速度的要求。從物理結構上看,CAN節(jié)點的構成如圖7-8所示。在CAN中,物理層從結構上可分為三層:分別是物理信號層(Physical Layer Signaling,PLS)、物理介質附件(Physical MediaAttachment,PMA)層和介質從屬接口(Media Dependent:Inter-face,MDI)層。其中PLS連同數據鏈路層功能由CAN控制器完成,PMA層功能由CAN收發(fā)器完成,MDI層定義了電纜和連接器的特性。目前也有支持CAN的微處理器內部集成了CAN控制器和收發(fā)器電路,如MC68HC908GZl6。PMA和MDI兩層有很多不同的國際或國家或行業(yè)標準,也可自行定義,比較流行的是ISOll898定義的高速CAN發(fā)送/接收器標準。
          節(jié)點數量
          理論上,CAN總線上的節(jié)點數幾乎不受限制,可達到2000個,實際上受電氣特性的限制,最多只能接100多個節(jié)點。
          CAN的數據鏈路層
          CAN的數據鏈路層是其核心內容,其中邏輯鏈路控制(Logical Link control,LLC)完成過濾、過載通知和管理恢復等功能,媒體訪問控制(Medium Access control,MAC)子層完成數據打包/解包、幀編碼、媒體訪問管理、錯誤檢測、錯誤信令、應答、串并轉換等功能。這些功能都是圍繞信息幀傳送過程展開的。
          報文傳輸
          報文類型
          在CAN2.0B的版本協議中有兩種不同的幀格式,不同之處為標識符域的長度不同,含有l(wèi)l位標識符的幀稱之為標準幀,而含有29位標識符的幀稱為擴展幀。如CAN1.2版本協議所描述,兩個版本的標準數據幀格式和遠程幀格式分別是等效的,而擴展格式是CAN2.0B協議新增加的特性。為使控制器設計相對簡單,并不要求執(zhí)行完全的擴展格式,對于新型控制器而言,必須不加任何限制的支持標準格式。但無論是哪種幀格式,在報文傳輸時都有以下四種不同類型的幀:
          幀類型
          (1)數據幀(Data ) 數據幀將數據從發(fā)送器傳輸到接收器。
          (2)遠程幀(Remote ) 總線單元發(fā)出遠程幀,請求發(fā)送具有同一標識符的數據幀。
          (3)錯誤幀(Error ) 任何單元檢測到總線錯誤就發(fā)出錯誤幀。
          (4)過載幀(Overload ) 過載幀用在相鄰數據幀或遠程幀之間提供附加的延時。
          數據幀或遠程幀與前一個幀之間都會有一個隔離域,即幀間間隔。數據幀和遠程幀可以使用標準幀及擴展幀兩種格式。
          CAN總線應用領域
          CAN總線最初是德國BOSCH為汽車行業(yè)的監(jiān)測,控制而設計的?,F已應用到鐵路、交通、國防、工程、工業(yè)機械、紡織、農用機械、數控、醫(yī)療器械機器人、樓宇、安防等方面。目前大多數CAN控制器只做到鏈路層,然而隨著CAN的發(fā)展和應用,應用層的硬件設計也成為硬件廠商的考慮范疇。


          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();