目錄 CAN 通訊協議
前沿:理論的協議 和 寫CAN通訊程序(收發)是兩回事,像CRC循環檢測或錯誤檢測都是硬件完成的,不需要我們再編寫,最初的時候我也是一頭霧水,
不知道該如何下手,這就是程序員和芯片設計者的不同。總之,不要以為看了協議就會寫程序,還是網上找一個對應芯片的demo,好好研究其流程及可。
1.來源與定義
2.物理構成
3.總線邏輯
4.幀的格式以及分類
5.數據競爭機制
6.錯誤類型(5種)
1.來源與定義
CAN是控制器局域網絡(Controller Area Network,CAN)上的物理層和鏈路層的協議。是由德國BOSCH公司開發,並最終成為
國際標准11898,是汽車計算機控制系統和嵌入式工業網絡控制的 現場總線。
CAN屬於現場總線范疇,她是一種有效支持分布式控制或實時控制的串行通信網絡。
協議11898.1,2,3(其中1是controor,2是高速收發器,例如檢測或控制汽車車速,3是低速收發器,例如控制雨刮器)
----------->引出疑問?
(1)什么是物理層和鏈路層?
設備之間通訊需要遵循一定的規范,物理層從硬件的角度實現鏈路層的邏輯電平。開放式系統互聯通訊參考模型(Open
system interconnection Reference Model,簡稱OSI),一種試圖將各種計算機在世界范圍內互聯的標准框架。

其中
物理層:表現電氣特性和機械特性,兩根總線加總線兩端連接120歐姆的電阻。
數據鏈接層:表現幀的格式,傳輸大小,過濾的設置。
(1)什么是分布式控制?
分布式控制就是總線空閑時間內上任意節點都可以競爭發送消息,沒有所謂的主機和從機的概念。
(3)與其他通訊協議比較?

2.物理構成
CAN總線網絡主要掛在CAN_H和CAN_L,各個節點通過兩條線實現信號的串行差分傳輸,為了避免信號的反射和干擾,
還需要在CAN_H和CAN_L之間接上120Ω的終端電阻。為什么是120歐姆,因為其電纜的阻抗特性為120Ω。具體如下圖所示。

如果進一步將信號節點剖析,就會知道下面的信息
1.設備號 host
2.控制器 controller
3.傳送器transmitter ,控制 收發,高速、低速等

3.總線邏輯
3.1顯性和隱性
CAN總線上的數據位(又稱CAN總線位數值)采用兩種互補的邏輯值,即顯性和隱性。
- 邏輯0:顯性,只要有一個節點是邏輯0,總線就是邏輯0
- 邏輯1:隱性,只要有一個節點是邏輯1,總線就是邏輯1CAN總線上的CAN信號使用差分電壓傳送,兩條信號線被稱為CAN_H和CAN_L.
3.2 差分電壓
Vdiff =CAN_H - CAN_L

其中電位差Vdiff 決定其邏輯電平的顯性和隱性。
3.3 CAN總線類型
CAN總線類型分別是 高速CAN、容錯CAN(低速CAN)、單線CAN。
不同類型的CAN總線 電位差Vdiff對應的邏輯電平不同。
- 高速CAN,只有在總線CAN_H=CAN_L,即Vdiff==0,隱性,即邏輯1。
如果有電位差且CAN_H>CAN_L,為顯性,即邏輯0

- 低速CAN,只有在CAN_L>CAN_H ,隱性,即邏輯1
只有在 CAN_L<CAN_H ,顯性,即邏輯0

- 單線CAN電平

4.幀的格式以及分類(別名又叫報文)
1)數據幀和擴展幀

數據幀包括 = SOF(1bit顯性) + 仲裁域(11bit_ID+1bit_RTR) + 控制域(12bit)+ data(8 byte) + CRC校驗(15bit數據校驗和1bit隱性位的界定值)
+相應ack(2bit)+EOF(7bit隱性)+ITM(幀間隔),其中ITM被用來判斷節點是否過載,不屬於數據幀的內容,先列出來。
------------------------------------------------------------------------------->流程
BUS idle
SOF(START OF FRAME)
1bit 顯性位
仲裁域:
數據幀的ID(標識符)就是節點的ID,只有接收方的過濾器沒有屏蔽你的ID,你發送的消息才能被接收。同理作為接受方,你沒有屏蔽對方的消息,你才能收到
數據幀。
RTR是表示數據幀和遠程幀。遠程幀沒有數據端date,是對方設備發送命令請求而已。
控制域
IDE:標准幀還是擴展幀(11bit還是29bit)
R1 過渡幀
DLC:發送數據、接收數據的長度
數據域
8byte
CRC
CRC 校驗位15bit數據校驗和1bit隱性位界定符
EOF(end of frame)
7位 隱性位
ITM :幀間隔,實際不屬於幀內的區域,必須等待幀間隔才能發送消息
正常是3bit 隱性位,如果出現過載幀就會導致出現顯性位0
BUS IDLE
---------------------------------------------------------------------------------->結束
2.遠程幀(RTR REMOTE TRANSMIT REQUEST)

3.錯誤幀:就是傳輸中出現相關錯誤

4.過載幀:過載幀是接收節點向總線上其它節點報告自身接收能力達到極限的幀。
過載幀是接收節點向總線上其它節點報告自身接收能力達到極限的幀。我接收節點Node_A已經沒有能力處理你們發來的報文了。

對於過載幀的幀結構的理解:接收節點Node_A達到接收極限時,就會發送過載幀到總線上。顯然過載標志的6個連續顯性位會屏蔽掉總線上其他節點的發送。
也就是這個時候node_A通過發送過載幀的方式來破壞其他節點的發送,這樣在Node_A發送過載幀期間,其他節點就不能成功發送報文,於是就相當於把其他節點
發送給她的報文推遲,也就是Node_A發送過載幀的這段時間得以“休息”。
有三種情況會引起過載幀:
- 接收節點自身原因。接收節點由於某種原因需要延遲接收下一個數據幀或者遙控幀。
- 在幀間隔(ITM)的間隔段的第一位和第二位檢測到一個顯性位(正常的間歇段都是隱性位)幀間隔的間隔段本應是三個連續的隱性位,如果接收節點Node_A在間隔段檢測到顯性位,那么就意味着此時有報文發向接受節點Node_A,但這個時候是不應該有報文發來的,於是Node_A發送過載幀。
- CAN節點錯誤界定符或過載界定符(8位隱性位)的第八位(最后一位)聽到一個顯性位0,節點會發送一個過載幀,且錯誤計數器不會增加。
5. 數據競爭機制
意義:解決多個節點在同一時間發消息的問題。
1)仲裁:
1.幀ID越小,優先級越高
2.數據幀優先於遠程幀

2)風險
行為:EOF節點會自動在檢測到總線空閑的第一時間再次嘗試聯系,風險:在網絡負載率很高,也就是消息很多的時候,低優先級的消息可能會延遲很久才能發送成功。
6.錯誤檢測機制
CAN總線上每個控制器都會嘗試檢測錯誤的報文。
如果發現錯誤,發現錯誤的節點會發送錯誤標志,從而中斷總線通信。其他節點會接收到錯誤標志,采取合理的措施,如丟棄報文。
存在5中錯誤幀的類型:
1)位監測
2)位填充
3)幀檢查
4)應答檢查
5)冗余檢查




未完待續
參考資料:
1.https://jingyan.baidu.com/article/46650658243a5ff548e5f873.html
2.野火STM32F10X零死角教程
3.https://blog.csdn.net/qq_40242571/article/details/118672112
4.https://blog.csdn.net/weixin_40528417/article/details/79871311(過載幀)
