物理層主要完成裝置間的訊號傳送,把各種訊號轉換成物理訊號,並將這些訊號傳輸到其他目標裝置。在這一層中,can-bus對訊號電平、通訊時使用的電纜及聯結器等進行了詳細規定。
can-bus由iso標準化後發布了兩個標準,分別是iso11898(125kpbs~1mbps的高速通訊標準)和iso11519(小於125kpbs的低速通訊標準)。這兩個標準僅在物理層不同,在資料鏈路層是相同的。
位於can-bus物理層的器件要完成邏輯訊號與電纜上物理訊號的轉換,該器件稱為收發器。
如下圖所示為can收發器的引腳圖。
1、傳送時將邏輯訊號轉換成物理訊號,此收發器轉換得到的訊號為差分電平訊號。
2、接收時將物理訊號轉換成邏輯訊號,此收發器將差分電平訊號轉換為邏輯訊號。
can-bus使用兩根電纜進行訊號傳輸,分別為can_high和can-low(簡稱can_h和can_l)。
can收發器根據兩根電纜之間的電壓差來判斷匯流排電平,這種傳輸方式稱為「差分傳輸」。
電纜上的電平訊號只有兩種可能,分別為顯性電平(代表邏輯0)和**電平(代表邏輯1)
如下圖所示是iso11898和iso11519訊號電平的對比
訊號使用雙絞線進行傳輸,是因為雙絞線上傳輸差分訊號可以抑制共模干擾,能夠提高通訊的穩定性、可靠性和抗干擾的能力。
如下左圖為can收發器的引腳圖,其中can_h引腳在晶元裡面等效電路為如下右圖所示
can收發器開路集電極和匯流排相連通過切換開關狀態輸出高低電平。
狀態1:截止狀態,電晶體截止(開關未接合)
無源:匯流排電平=1,電阻高
狀態0:接通狀態,電晶體導通(開關已接合)
有源:匯流排電平=0,電阻低
因為所有的收發器的輸出開關都是併聯的,所以在匯流排上顯性電平具有優先權,只要有乙個單元輸出顯性電平(低電平),匯流排上即為顯性電平(低電平)。而**電平(高電平)則具有包容的意味,只有所有的單元都輸出隱性電平(高電平),匯流排上才為隱性電平(顯性電平比隱性電平更強)。
can控制器在傳送的同時,會監聽匯流排的當前電平是否與自己傳送的電平一致,如果不一致則會進行相應的處理。如果不一致發生在仲裁域,就會迫使輸出**電平的節點退出傳送;如果發生在其他區域,則會出現觸發錯誤。
通訊方式分為兩種,同步序列通訊與非同步序列通訊。can-bus屬於非同步序列通訊的方式。
非同步序列通訊的優點是減少了一根時鐘線,缺點是各接收器的時鐘不可能完全一致,總是會有偏差,有些偏快,有些偏慢,這些誤差會累積直到通訊出錯。
如下圖所示為標準波特率時採集的資料。
如下兩幅圖分別為波特率偏大20%和波特率偏小20%時取樣的資料。
由上述幾幅圖可以看出,由於各接收器的時鐘可能會存在偏差,這就導致傳輸一兩個位時,誤差可能看不出來,但是傳輸的位數變多了之後,這些誤差會累積直到通訊出錯。
那麼如何解決這個問題呢?
同步!同步序列通訊和非同步序列通訊的波形圖如下圖所示。
同步就像給鐘錶校時一樣,隔一段時間所有節點的時鐘就同步一次。這樣儘管大家的時鐘仍有誤差,但是可以消除累積誤差。
can-bus規定訊號的跳變沿時刻進行同步,因此只要訊號發生變化,節點時鐘就會被同步。如下圖所示,累積的誤差可以限制在兩個跳變沿之間,減少錯誤的發生。
然而這種同步方式又會帶來新的問題,比如說傳送多個相同位時,並無跳變沿可用於同步,這樣就會導致誤差不斷累積,最後導致通訊出錯。
那麼can-bus如何消除這種累積誤差?
can-bus通過位填充提供同步訊號,從而消除累積誤差。can-bus規定,如果傳輸的訊號連續5個位時相同的,就要插入乙個電平相反的位,這個額外插入的位稱為「填充位」。
接下來先讓我們了解一下位時間這個概念。
乙個標稱的位時間=1/波特率
STM32 CAN通訊基礎(未完)
can 是 controller area network 的縮寫 以下稱為 can 是 iso 國際標準化的序列通訊協議。can 協議具有一下特點 1 多主控制。在匯流排空閒時,所有單元都可以傳送訊息 多主控制 而兩個以上的單元同時開始傳送訊息時,根據識別符號 id 決定優先順序。id 並不是表示...
CAN匯流排基礎知識(二)
can協議已經由iso標準化,有2個版本,如iso11898和iso11519 2,它們之間在資料鏈路層沒什麼不同,但是在物理層有些區別。1 關於iso11898 這個標準用於高速can通訊。開始的時候,資料鏈路層和物理層都在標準iso11898中規定,後來被拆分為iso11898 1 僅涉及資料鏈...
React基礎內容(二)
todolist.js import react,from react import antd dist antd.css import store from strore index import from strore actioncreators import todolistui from ...