一口氣從零讀懂CAN匯流排。
上一篇文章講了CAN匯流排的歷史、標準、物理層,現在接著介紹CAN匯流排數據鏈路層,和CAN匯流排同步機制。
CAN數據鏈路層
在SPI通信中,片選、時鐘信號、數據輸入及數據輸出這四個信號都有單獨的信號線。而CAN使用的是兩條差分信號線,只能表達一個信號。簡潔的物理層決定了CAN必然要配上一套更為複雜的協議。如何用一個信號通道實現同樣甚至更強大的功能,答案就是對數據或操作命令進行打包。
通信機制
多主機(Multi-Master)
安全敏感的應用(如汽車動力)對通信系統的可靠性要求很高。將匯流排能否正常工作歸結到單一節點是非常危險的,比較合理的方案是對匯流排接入的去中心化,即每個節點都有接入匯流排的能力。這也是CAN匯流排採用多主控(Multi-Master)線性拓撲結構的原因。
在CAN匯流排上,每個節點都有往匯流排上發送消息的能力,而消息的發送不必遵從任何預先設定的時序,通信是事件驅動的。只有當有新的信息傳遞時,CAN匯流排才處於忙碌的狀態,這使得節點接入匯流排速度非常快。CAN匯流排理論最高數據傳輸速率為1Mbps,對於非同步事件反應迅速,基本對於ms級別的實時應用沒有任何問題。
定址機制
不同於其它類型的匯流排,CAN匯流排不設定節點的地址,而是通過消息的標識符(Identifier)來區別消息。這種機制雖然會增加消息的複雜度(增加標識符),但是節點在此情況下可以無需了解其他節點的狀況,而相互間獨立工作。在匯流排上增加節點時僅需關注消息類型,而非系統上其他節點的狀況。這種以消息標識符定址的方式,讓匯流排上增加節點變得更加靈活。
匯流排訪問CSMA/CD+AMP
CAN匯流排通信原理可簡單描述為多路載波偵聽+基於消息優先順序的衝突檢測和非破壞性的仲裁機制(CSMA/CD+AMP)。CSMA(Carrie
Sense Multiple Access)指的是所有節點必須都等到匯流排處於空閑狀態時才能往匯流排上發送消息;CD+AMP(CollisionDetection + Arbitration on Message Priority)指的是如果多個節點往匯流排上發送消息時,具備最高優先順序的消息獲得匯流排。- 多路載波偵聽:網路上所有節點以多點接入的方式連接在同一根匯流排上,且發送數據是廣播式的。網路上各個節點在發送數據前都要檢測匯流排上是否有數據傳輸:若網路上有數據,暫時不發送數據,等待網路空閑時再發;若網路上無數據,立即發送已經準備好的數據。
- 衝突檢測:節點在發送數據時,要不停的檢測發送的數據,確定是否與其他節點數據發送衝突,如果有衝突,則保證優先順序高的報文先發送。
- 非破壞性仲裁機制:通過ID仲裁,ID數值越小,報文優先順序越高。
發送低優先順序報文的節點退出仲裁後,在下次匯流排空閑時自動重發報文。
高優先順序的報文不能中斷低優先順序報文的發送。
報文接收過濾
CAN控制器大多具有根據ID過濾報文的功能,即只接收某些ID的報文。節點對接收到的報文進行過濾:比較消息ID與選擇器(Accepter)中和接受過濾相關位是否相同。如果相同,接收;如果不相同,則過濾。
CAN的報文種類及結構
報文的種類
在原始數據段的前面加上傳輸起始標籤、片選(識別)標籤、控制標籤,在數據的尾段加上CRC校驗標籤、應答標籤和傳輸結束標籤。把這些內容按特定的格式打包好,就可以用一個通道表達各種信號了。各種各樣的標籤,起到了協同傳輸的作用。當整個數據包被傳輸到其他設備時,只要這些設備按格式去解讀,就能還原出原始數據。類似這樣的數據包就被稱為CAN的數據幀。
為了更有效的控制通信,CAN一共規定了5中類型的幀,幀也稱為報文。
數據幀
數據幀在CAN通信中最主要,也最複雜。數據幀以一個顯性位(邏輯0)開始,以7個連續的隱性位(邏輯1)結束。CAN匯流排的數據幀有標準格式(Standard
Format)和擴展格式(ExtendedFormat)的區分。數據幀可以分為七段:
- 幀起始(SOF)
標識一個數據幀的開始,固定一個顯性位。
用於同步, 匯流排空閑期間的任何隱性到顯性的跳變都將引起節點進行 硬同步。只有匯流排在空閑期間節點才能夠發送SOF。
- 仲裁段(Arbitration Field)
仲裁段的內容主要為本數據幀的ID信息。數據幀分為標準格式和擴展格式兩種,區別就在於ID信息的長度:標準格式的ID為11位;擴展格式為29位。在CAN協議中,ID決定著數據幀發送的優先順序,也決定著其他設備是否會接收這個數據幀。
仲裁段除了報文ID外,還有RTR, IDE, SRR位。
- 控制段
在控制段,r1(reserved1)和r0(reserved0)為保留位,默認設置為顯性位。最主要的是DLC(Data Length Code)段,它是用二進位編碼表示本報文中的數據段包含多少個位元組。DLC段由4位組成,DLC3?DLC0,表示的數字為0-8.
- 數據段
數據幀的核心內容,有0-8個位元組長度,由DLC確定。
- CRC段
為了保證報文的正確傳輸,CAN的報文包含了一段15位的CRC校驗碼,一旦接收端計算出的CRC碼跟接收到的CRC碼不同,就會向發送端反饋出錯信息以及重新發送。CRC部分的計算和出錯處理一般由CAN控制器硬體完成,或由軟體控制最大重發數。
在CRC校驗碼之後,有一個CRC界定符,它為隱性位,主要作用是把CRC校驗碼與後面的ACK段隔開。
- ACK段
包含確認位(ACK slot)和界定符(Delimiter,
DEL)。ACK在發送節點發送時,為隱性位。當接收節點正確接收到報文時,對其用顯性位覆蓋。DEL界定符同樣為隱性位,用於隔開。- 幀結束段(End-of-Frame, EOF)
幀結束段由發送端發送7個隱性位表示結束。
同步
CAN匯流排使用位同步的方式來確保通信時序,以及對匯流排的電平進行正確採樣。
位時序
在講位時序之前,先介紹幾個基本概念。
Time Quantum 時間份額tQ :CAN控制器工作的最小時間單位,通常對系統時鐘分頻得到。
波特率:單位時間內(1s)傳輸的數據位,公式:1/位時間。舉個栗子,系統時鐘頻率36MHz,預分頻因子為4,則CAN時鐘頻率9MHz,則Tq=1/9M。假設一個CAN位包含10個Tq,則一個位周期T=10Tq,從而波特率為1/T=0.9MHz.
為了實現位同步,CAN協議把每一位的時序分解成下圖所示的四段。這四段的長度加起來即為一個CAN數據位的長度。一個完整的位由8-25個Tq組成。
- 同步端(SS,Synchronization Segment)
一個位的輸出從同步段開始。若匯流排的跳變沿被包含在SS段的範圍之內,則表示節點與匯流排的時序同步。節點與匯流排同步時,採樣點採集到的匯流排電平即可被確定為該電平的電位。SS段的大小為1Tq.
- ·傳播段(PTS,Propagation Time Segment)
用於補償信號在網路和節點傳播的物理延時時間,是匯流排上輸入比較器延時和輸出驅動器延時總和的兩倍。通常1-8Tq
- ·相位緩衝段1(PBS1, Phase Buffer Segment 1)
主要用於補償邊沿階段的誤差,其時間長度在重新同步時可以加長。初始大小1-8Tq.
- 相位緩衝段2(PBS2,Phase Buffer Segment 2)
也是用於補償邊沿階段的誤差,其時間長度在重新同步時可以縮短。初始大小2-8Tq.
同步
CAN同步分為硬同步和重新同步。
同步規則:
- 一個位時間內只允許一種同步方式
- 任何一個「隱性」到「顯性」的跳變都可用於同步
- 硬同步發生在SOF階段,所有接收節點調整各自當前位的同步段,使其位於發送的SOF位內。
- ·重新同步發生在一個幀的其他階段,即當跳變沿落在同步段之外。
硬同步
當匯流排上出現幀起始信號(SOF,即隱性到顯性的邊沿)時,其他節點的控制器根據匯流排上的這個下降沿對自己的位時序進行調整,把該下降沿包含到SS段內。這樣根據起始幀來進行的同步稱為硬同步。
可以看到在匯流排出現幀起始信號時,該節點原來的位時序與匯流排時序不同步,因而這個狀態的採樣點採集到的數據是不正確的。所以節點以硬同步的方式調整,把自己的位時序中的SS段平移至匯流排出現下降沿的部分,獲得同步,這時採樣點採集到的數據是正確數據。
重新同步
因為硬同步時只是在有幀起始信號時起作用,無法確保後續一連串的位時序都是同步的,所以CAN引入了重新同步的方式。在檢測到匯流排上的時序與節點使用的時序有相位差時(即匯流排上的跳變沿不在節點時序的SS段範圍),通過延長PBS1段或縮短PBS2段來獲得同步,這樣的方式稱為重新同步。
分兩種情況:第一種, 節點從匯流排的邊沿跳變中,檢測到它的時序比匯流排的時序相對滯後2個Tq,這是控制器在下一個時序中的PBS1段增加2Tq的時間長度,使得節點與匯流排時序重新同步。
第二種,節點從匯流排的邊沿跳變中,檢測到它的時序相對超前2Tq,這時控制器在前一個位時序中的PBS2段減少2Tq的時間長度,獲得同步。
在重新同步的時候,PBS1和PBS2段的允許加長或縮短的時間長度定義為,重新同步補償寬度(SJW,reSynchronization Jump Width)。這裡設置的PBS1和PBS2能夠增減的最大時間長度SJW=2Tq,若SJW設置的太小則重新同步的調整速度慢,若太大,則影響傳輸速率。
歡迎轉載
(公眾號:筆記Forever )
推薦閱讀:
※改造小米移動電源(高配版)實現FCP快充認證
※樹莓派小車——舵機
※第十二節 電子技術~PCB設計
※位同步時鐘提取電路——小結
※微分電路基本概念和電路圖解析