can總線仲裁機(jī)制詳解
掃描二維碼
隨時(shí)隨地手機(jī)看文章
CAN總線是一種基于優(yōu)先級(jí)的串行通信網(wǎng)絡(luò),采用載波監(jiān)聽多路轉(zhuǎn)換沖突避免協(xié)議,CAN總線中傳輸?shù)臄?shù)據(jù)幀的起始部分為數(shù)據(jù)的標(biāo)識(shí)符,標(biāo)識(shí)符可以區(qū)分消息又可以表示消息的優(yōu)先級(jí)(0 的優(yōu)先級(jí)最高)。
CAN總線為多主工作方式,網(wǎng)絡(luò)上任意一節(jié)點(diǎn)均可在任意時(shí)刻主動(dòng)向網(wǎng)絡(luò)上的其它節(jié)點(diǎn)同時(shí)發(fā)送消息。若兩個(gè)或兩個(gè)以上的節(jié)點(diǎn)同時(shí)開始傳送報(bào)文,就會(huì)產(chǎn)生總線訪問沖突,根據(jù)逐位仲裁原則,借助幀開始部分的標(biāo)識(shí)符,優(yōu)先級(jí)低的節(jié)點(diǎn)主動(dòng)停止發(fā)送數(shù)據(jù),而優(yōu)先級(jí)高的節(jié)點(diǎn)繼續(xù)發(fā)送信息。在仲裁期間,CAN總線作“與”運(yùn)算,每一個(gè)節(jié)點(diǎn)都對(duì)節(jié)點(diǎn)發(fā)送的電平與總線電平進(jìn)行比較,如果電平相同,則節(jié)點(diǎn)可以繼續(xù)發(fā)送。如規(guī)定0 的優(yōu)先級(jí)高,當(dāng)某一個(gè)節(jié)點(diǎn)發(fā)送1而檢測(cè)到0 時(shí),此節(jié)點(diǎn)知道有更高優(yōu)先級(jí)的信息在發(fā)送,它就停止發(fā)送消息,直到再一次檢測(cè)到網(wǎng)絡(luò)空閑。
CAN,總線采用的是一種叫做“載波監(jiān)測(cè), 多主掌控/沖突避免”(CSMA/CA) 的通信模式。這種總線仲裁方式允許總線上的任何一個(gè)設(shè)各都有機(jī)會(huì)取得總線的控制權(quán)并向外發(fā)送數(shù)據(jù)。如果在同一時(shí)刻有2 個(gè)或2 個(gè)以上的設(shè)各要求發(fā)送數(shù)據(jù),就會(huì)產(chǎn)生總線沖突,CAN總線能夠?qū)崟r(shí)地檢測(cè)這些沖突并對(duì)其進(jìn)行仲裁,從而使具有高優(yōu)先級(jí)的數(shù)據(jù)不受任何損壞地傳輸。
當(dāng)總線處于空閑狀態(tài)時(shí)呈隱性電平,此時(shí)任何節(jié)點(diǎn)都可以向總線發(fā)送顯性電平作為幀的開始。如果2個(gè)或2個(gè)以上同時(shí)發(fā)送就會(huì)產(chǎn)生競(jìng)爭(zhēng)。CAN總線解訣競(jìng)爭(zhēng)的方法同以太網(wǎng)的CSMA/CD (Carrier Sense MulTIple Access with Collislon DetecTIon) 方法基本相似,如圖1所示。此外,CAN,總線做了改進(jìn)并采用CSMA/CA (Carrier Sense MulTIple Access withCollision Avoidance) 訪問總線,按位對(duì)標(biāo)識(shí)符進(jìn)行仲裁。各節(jié)點(diǎn)在向總線發(fā)送電平的同時(shí),也對(duì)總線上的電平讀取,并與自身發(fā)送的電平進(jìn)行比較,如果電平相同繼續(xù)發(fā)送下一位,不同則停止發(fā)送退出總線競(jìng)爭(zhēng)。剩余的節(jié)點(diǎn)繼續(xù)上述過程,直到總線上只剩下1個(gè)節(jié)點(diǎn)發(fā)送的電平, 總線競(jìng)爭(zhēng)結(jié)束,優(yōu)先級(jí)高的節(jié)點(diǎn)獲得總線的控制權(quán)。
CAN總線以報(bào)文為單位進(jìn)行數(shù)據(jù)傳輸,報(bào)文的優(yōu)先級(jí)結(jié)合在44 位標(biāo)識(shí)符中(擴(kuò)展幀 的標(biāo)識(shí)符29 位),具有最小二進(jìn)制數(shù)的標(biāo)識(shí)符的節(jié)點(diǎn)具有最高的優(yōu)先級(jí)。這種優(yōu)先級(jí)一旦 在系統(tǒng)設(shè)計(jì)時(shí)確定就不能隨意地更改,總線讀取產(chǎn)生的沖突主要靠這些位仲裁解訣。之所以 CAN總線不采用以太網(wǎng)使用的延時(shí)避免沖突,主要是為了保證具有更高優(yōu)先級(jí)的節(jié)點(diǎn)能夠完整地實(shí)時(shí)傳輸,而且CSMA/CA 可以有效地避免沖突。
如圖2所示,節(jié)點(diǎn)A和節(jié)點(diǎn)B的標(biāo)識(shí)符的第10、9、8位電平相同,因此兩個(gè)節(jié)點(diǎn)偵聽到的信息和它們發(fā)出的信息相同。第7 位節(jié)點(diǎn)B 發(fā)出一個(gè)“1”,但從節(jié)點(diǎn)上接收到的消息卻是“O“,說明有更高優(yōu)先級(jí)的節(jié)點(diǎn)占用總線發(fā)送消息。節(jié)點(diǎn)B會(huì)退出發(fā)送處于單純監(jiān)聽方式而不發(fā)送數(shù)據(jù); 節(jié)點(diǎn)A成功發(fā)送仲裁位從而獲得總線的控制權(quán),繼而發(fā)送全部消息??偩€中信號(hào)持續(xù)跟蹤最后獲得總線控制權(quán)發(fā)出的報(bào)文,本例中節(jié)點(diǎn)A 的報(bào)文將被跟蹤。這種非破壞性位仲裁方法的優(yōu)點(diǎn)在于,在網(wǎng)絡(luò)最終確定哪個(gè)節(jié)點(diǎn)被傳送前,報(bào)文的起始部分 已經(jīng)在網(wǎng)絡(luò)中傳輸了,因此具有高優(yōu)先級(jí)的節(jié)點(diǎn)的數(shù)據(jù)傳輸沒有任何延時(shí)。在獲得總線控制 權(quán)的節(jié)點(diǎn)發(fā)送數(shù)據(jù)過程中,其他節(jié)點(diǎn)成為報(bào)文的接收節(jié)點(diǎn),并且不會(huì)在總線再次空閑之前發(fā)送報(bào)文。
CAN非破壞性逐位仲裁示意圖
圖3 為CAN總線上節(jié)點(diǎn)的電平邏輯,總線上的節(jié)點(diǎn)電平對(duì)于總線電平而言是相與的關(guān)系,只有當(dāng)3 個(gè)節(jié)點(diǎn)的電壓都等于1(隱性電平),總線才會(huì)保持在vcc (隱性電平) 狀態(tài)。
只要有1個(gè)節(jié)點(diǎn)切換到0狀態(tài)(顯性電平),總線就會(huì)被強(qiáng)制在顯性狀態(tài)(0)。這種避免總線沖突的仲裁方式能夠使具有高優(yōu)先級(jí)的消息沒有延時(shí)地占用總線傳輸。
按位仲裁是CAN總線特有的仲裁方式,顯性位覆蓋隱性位。優(yōu)先級(jí)高的報(bào)文根據(jù)此機(jī) 制搶占總線,優(yōu)先級(jí)低的報(bào)文退出競(jìng)爭(zhēng)。正因?yàn)镃AN 有這樣的仲裁機(jī)制,它難以抵抗高優(yōu) 先級(jí)攻擊和重發(fā)報(bào)文攻擊。
舉例:
1〉因?yàn)镃AN 的模塊在發(fā)送數(shù)據(jù)的時(shí)候,也同時(shí)會(huì)對(duì)總線進(jìn)行監(jiān)聽,假設(shè)兩個(gè)節(jié)點(diǎn)同時(shí)發(fā)送數(shù)據(jù),A節(jié)點(diǎn)發(fā)送的前3 個(gè)位是100,B節(jié)點(diǎn)為101,在前2 個(gè)位發(fā)送完畢的時(shí)候,兩個(gè)節(jié)點(diǎn)都會(huì)認(rèn)為自己發(fā)送成功,但是當(dāng)發(fā)送到第三個(gè)位的時(shí)候,B 節(jié)點(diǎn)會(huì)失去仲裁,因?yàn)? 的優(yōu)先級(jí)高于1的優(yōu)先級(jí),B 節(jié)點(diǎn)監(jiān)聽到總線上不是1,因此失去仲裁,等待重新發(fā)送數(shù)據(jù)。CAN 節(jié)點(diǎn)在仲裁丟失后,根據(jù)CAN2.0B 協(xié)議規(guī)范,會(huì)自動(dòng)重發(fā)。如果高優(yōu)先級(jí)的報(bào)文一直占用著總線,則其他低優(yōu)先級(jí)的報(bào)文將無法獲得仲裁,但是會(huì)嘗試重新發(fā)送。只有當(dāng)高優(yōu)先級(jí)報(bào)文不再占用總線時(shí),低優(yōu)先級(jí)的報(bào)文才可能發(fā)送成功。否則低優(yōu)先級(jí)報(bào)文會(huì)出現(xiàn)“假餓死”狀態(tài)。(例如在CAN_ NM 的邏輯環(huán)網(wǎng)絡(luò)管理中,利用T_ max,T_ type 等定時(shí)器來防止報(bào)文假餓死)
2〉如果在某一時(shí)刻CAN總線上的多個(gè)單元同時(shí)向總線發(fā)送數(shù)據(jù),優(yōu)先級(jí)高的繼續(xù)發(fā)送,那么怎樣保證優(yōu)先級(jí)低的數(shù)據(jù)不丟失呢? 如果整個(gè)can 網(wǎng)絡(luò)都是自己管理的,那么可以通過應(yīng)用層協(xié)議來調(diào)整每個(gè)節(jié)點(diǎn)的發(fā)送時(shí)間,無論優(yōu)先級(jí)高低,如果發(fā)送時(shí)間過長(長短程度這個(gè)根據(jù)您的項(xiàng)目來把握) 則暫停發(fā)送,讓其他節(jié)點(diǎn)發(fā)送?;蛘呙總€(gè)節(jié)點(diǎn)都在某個(gè)特定時(shí)間觸發(fā)發(fā)送,以便每個(gè)節(jié)點(diǎn)都有機(jī)會(huì)。總的意思就是一定要做時(shí)間管理。如果項(xiàng)目不是像你說的優(yōu)先級(jí)高占用帶寬那么嚴(yán)重,就采用(非實(shí)時(shí)信息空閑時(shí)候) 輪詢+ (實(shí)時(shí)信息) 主動(dòng)發(fā)送的方式管理網(wǎng)絡(luò)。