遇到的問題
問題的發現
最近在開發Canopen項目中,進行一主多從設備通信時,主站發送同步幀,兩個從站往往只有幀ID優先級高的設備可以讓主站接收到數據,而另一個從設備的數據往往接收不到。但當我關閉其中一個can從設備,另一個就可以和主站設備通信正常。經過排查發現,是由于Can的沖突解決機制的問題。
在CAN多機通信中,兩個設備同時發送數據,幀ID優先級高的CAN設備會“搶占”總線,而另外的設備需要選擇沖突解決策略。
CAN總線的一般沖突機制
- 非破壞性搶占機制(Non-Destructive Arbitration): CAN 使用一種非破壞性的仲裁機制,這意味著當兩個節點同時發送消息時,通過識別消息標識符中的位的值來確定哪個消息具有更高的優先級。具體來說,CAN總線上的每個節點都會根據其消息標識符的比特值來判斷是否能夠“搶占”總線。
- 標識符比較: 在CAN總線上,每個節點在發送消息之前會監測總線上的信號電平。如果一個節點正在發送1,而另一個節點正在發送0,那么正在發送1的節點會發現沖突,并會停止發送消息。這種標識符比較機制有助于節點在發送消息時檢測沖突并進行沖突解決。
- 仲裁場(Arbitration Field): CAN消息包含一個仲裁場,它包含消息標識符。在這個字段中,CAN節點通過比較消息標識符中的位來決定哪個節點具有更高的優先級。較低優先級的節點將會自動停止發送,并等待較高優先級的節點完成其消息的發送。
- 回退機制: 如果多個節點嘗試同時發送消息,沖突解決后,較低優先級的節點會等待一段隨機時間后重新嘗試發送消息。這種回退機制有助于減少沖突的再次發生,提高總線的效率。
總的來說,CAN總線的沖突機制通過使用非破壞性的仲裁和標識符比較,以及回退機制,確保了多個節點之間的有序通信,使得總線上的消息能夠按照優先級順序進行傳輸。這種設計使得CAN總線非常適用于要求實時性和可靠性的應用,例如汽車控制系統。
STM32中的CAN沖突機制
我們在進行CAN的多機通信時,往往希望不會丟幀。遇到CAN總線沖突時,受阻的CAN從設備進行自動回傳是我們需要的。而打開沖突回傳只需要在CAN初始時對AutoRetransmission 進行使能。
hcan1.Init.AutoRetransmission = ENABLE;
AutoRetransmission 是用于配置CAN控制器的自動重傳(Automatic Retransmission)功能。在CAN通信中,當節點發送消息但未收到確認時,可以選擇是否自動進行重傳。當 AutoRetransmission 被啟用(ENABLE)時,如果CAN控制器未收到確認,則會自動重傳先前的消息。這有助于提高消息的可靠性,特別是在有可能發生干擾或沖突的環境中。當 AutoRetransmission 被禁用(DISABLE)時,如果發送的消息未收到確認,控制器將不會自動進行重傳。在這種情況下,需要由軟件來處理重傳邏輯,開發者可以通過程序來控制何時以及如何進行重傳。
-
CAN總線
+關注
關注
145文章
1936瀏覽量
130628 -
CAN
+關注
關注
57文章
2715瀏覽量
463365 -
通信
+關注
關注
18文章
5969瀏覽量
135850 -
STM32
+關注
關注
2266文章
10871瀏覽量
354789
發布評論請先 登錄
相關推薦
評論