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