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