最近在學習CAN總線,原先一直不太明白,若有A,B2個節(jié)點同一時刻一起向總線上發(fā)送數(shù)據(jù),CAN總線是怎么仲裁的,來讓A,B其中一個節(jié)點退出,保證高優(yōu)先級的節(jié)點優(yōu)先傳輸,今天又在網(wǎng)上查了一些資料,總算搞明白了一些。在CAN總線上,若同一個時刻,既有節(jié)點向總線上發(fā)送隱形電平(1),也有節(jié)點發(fā)送顯性電平(0),那么此時總線上表現(xiàn)出來的為顯性(0)。
本文引用地址:http://m.butianyuan.cn/article/201612/330371.htm當總線空閑時,有多個節(jié)點同時需要發(fā)送報文,那么每個節(jié)點的發(fā)送器將會對發(fā)送位的電平和被監(jiān)控的總線電平做比較,如果電平相同,那么該節(jié)點可以繼續(xù)發(fā)送,如果發(fā)送的為一“隱性”電平(1),但是監(jiān)控到一“顯性”電平(0),那么該節(jié)點失去仲裁,必須退出發(fā)送狀態(tài),只到下一次總線空閑的時候在參與總線的仲裁競爭。
由以上也可以看出,當有多個節(jié)點同時爭奪總線的控制權,ID最小的那個節(jié)點將會勝出,所以在CAN總線上,節(jié)點的ID越小,優(yōu)先級越高。
先列舉2種特殊情況,根據(jù)仲裁來判斷優(yōu)先級。
1.若在同一時刻,標準格式的報文與擴展格式的報文同時搶占總線,且它們的基礎ID相同,則發(fā)標準格式的報文節(jié)點就會PK成功。這是因為擴展格式在基本ID后,緊接著是SRR位,與IDE位,且這兩位都是隱性位。而在標準格式中,這兩位分別對應的位為RTR與r1,其中RTR既可以為隱性位,也可以為顯性位,,但是r1必須為顯性位。由仲裁規(guī)則可以此時標準幀必定勝出。
2.同理,如果在同一時刻,具有相同格式,且具有相同ID的數(shù)據(jù)幀與遠程幀爭奪總線控制權,那么數(shù)據(jù)幀必定勝出。因為RTR顯性表示數(shù)據(jù)幀,隱性表示遠程幀。
今天又發(fā)現(xiàn)了一個問題,前幾天也是在21IC的論壇上看見有這樣一條帖子,上面說如果有2個節(jié)點具有相同的ID,同時向總線上發(fā)送不同的數(shù)據(jù)幀,那么這兩個節(jié)點將會繼續(xù)仲裁數(shù)據(jù)場,只到有一方退出。開始我也是這樣認為的,但是下午在看到CAN-bus規(guī)范V2.0上,關于應答場(ACK)部分的時候,想到了, 如果真是如上所述,就會出現(xiàn)一種比較奇怪的現(xiàn)象:
即如果總線上,只有A,B2個節(jié)點,當前只有A節(jié)點發(fā)送報文,B節(jié)點再接收,按照以上的觀點,那么將會發(fā)生什么呢?在應答場(ACK)應答間隙(ACK SLOT)的時候,A節(jié)點將會發(fā)送一個“隱性”位(1),但是同時,B節(jié)點卻會發(fā)送一個“顯性位”(0)來以示應答(這里假設B節(jié)點正確接收到有效的報文),那么此時總線上表現(xiàn)出來就是“顯性”(0)了。但是A卻是發(fā)送的是“隱性”(1)啊,那么按照上述說法,此時A節(jié)點就要退出總線了,也就不在發(fā)送應答界定符(ACK DELIMITER)(顯性1),了,此時總線上就會一直保持顯性(0)狀態(tài),只到位錯誤的發(fā)生。
因此,以上說法是不成立的,其實由CAN-bus規(guī)范V2.0的P8頁上有如下語句:
Arbitration
Whenever the bus is free, any unit may start to transmit a message. If 2 or more units
start transmitting messages at the same time,the bus access conflict is resolved by
bitwise arbitration using the IDENTIFIER. The mechanism of arbitration guarantees that
neither information nor time is lost. If a DATA and a REMOTE with the
same IDENTIFIER are initiated at the same time, the DATA prevails over the
REMOTE . During arbitration every transmitter compares the level of the bit
transmitted with the level that is monitored on the bus. If these levels are equal the unit
may continue to send. When a ’recessive’ level is sent and a ’dominant’ level is
monitored (see Bus Values), the unit has lost arbitration and must withdraw without
sending one more bit.
由以上紅色部分可知,參與逐位仲裁的位只有仲裁場?。?!
那么如果有2個節(jié)點具有相同的仲裁場,但是他們的數(shù)據(jù)場不同,將會發(fā)生什么呢?我感覺可能在數(shù)據(jù)場之間可能會產(chǎn)生位錯誤(Bit Error),接收完CRC序列后,可能會發(fā)生一個應答錯誤,或者一個CRC錯誤。
評論