洞察幽微 初探CAN總線(xiàn)的一些小門(mén)道
在這個(gè)“網(wǎng)文”興盛的時(shí)代,單純的技術(shù)帖越來(lái)越不招人喜歡了。
怎樣才能既傳遞技術(shù)的干貨,又不至于陷入專(zhuān)業(yè)概念的漩渦?或者說(shuō),能不能像東方臻選的董宇輝那樣,既賣(mài)了貨,還能雙語(yǔ)授課?
灑家思索再三,唯一的方法也許是走下專(zhuān)業(yè)的神壇,拋開(kāi)拗口的概念,靠著(zhù)侵淫多年的思考把背后的原理講得有趣、直白又簡(jiǎn)單。
今天講的是在工業(yè)自動(dòng)化、汽車(chē)等領(lǐng)域應用很廣泛的CAN總線(xiàn)。
CAN總線(xiàn)的多主結構和內容尋址
上個(gè)世紀七八十年代超大規模集成電路的發(fā)展,開(kāi)啟了汽車(chē)行業(yè)轟轟烈烈延續至今的電子化進(jìn)程。
各種電子控制單元(ECU)的出現,讓ECU之間的信息交互變得越來(lái)越普遍。在ECU交互比較簡(jiǎn)單時(shí),最直接也最簡(jiǎn)單的方案便是一個(gè)信號一根線(xiàn)。
一支穿云箭,千軍萬(wàn)馬來(lái)相見(jiàn)。但在沒(méi)有CAN總線(xiàn)的年代里,一根實(shí)體線(xiàn),只能單個(gè)信號來(lái)見(jiàn)面。
毫無(wú)疑問(wèn),這種方式會(huì )導致線(xiàn)束數量不斷翻番,實(shí)在不是一個(gè)好方案,于是乎,汽車(chē)專(zhuān)家們把目光投向了串行總線(xiàn)。
當時(shí),RS232-RS422-RS485總線(xiàn)已經(jīng)將觸角延伸到了工業(yè)自動(dòng)化領(lǐng)域,其中,RS485總線(xiàn)采用雙絞線(xiàn)差分傳輸,支持多節點(diǎn)數據通信,似乎到上車(chē)只差臨門(mén)一腳。但是,RS485采取主從結構以及分配設備地址這兩大缺陷,使得汽車(chē)專(zhuān)家決定另起爐灶,開(kāi)發(fā)新的串行總線(xiàn)。
新的串行總線(xiàn)-CAN,沒(méi)有主從的概念,以ID而非設備地址進(jìn)行尋址,完美克服了這倆在汽車(chē)應用中格格不入的缺陷。
愛(ài)思考的小伙伴,端起了大蒲扇,主從結構怎么就成了缺點(diǎn)?為不同節點(diǎn)分配各自的設備地址,又存在什么缺陷?
要搞明白第一點(diǎn),需要先看看主從結構的特點(diǎn),至于第二點(diǎn),需要對照一下汽車(chē)應用的要求來(lái)看看。
武林至尊,寶刀屠龍,號令天下,莫敢不從。在主從結構里,一主多從,主節點(diǎn)不發(fā)號令,從節點(diǎn)便永遠沒(méi)有參與通信的可能。
在主子“翻牌子”之前,從節點(diǎn)唯一能做的便是洗得白白凈凈,耐心坐等!
據說(shuō),這種方式主要是為了防止多個(gè)節點(diǎn)向總線(xiàn)上發(fā)送數據導致的錯亂。
在沒(méi)有更好的方法解決大家同時(shí)訪(fǎng)問(wèn)總線(xiàn)的挑戰之前,這種主從結構似乎是唯一的答案,但是,它的缺點(diǎn)顯而易見(jiàn)!
首先,從節點(diǎn)沒(méi)有主動(dòng)發(fā)送數據的權力,主機一旦癱瘓,整個(gè)網(wǎng)絡(luò )就玩完。
其次,由于不能同時(shí)競爭總線(xiàn),通信效率也只能維持在較低的區間,對于有高速和實(shí)時(shí)要求的應用場(chǎng)合,這種方式怎么玩得轉?
你就說(shuō),在汽車(chē)的總線(xiàn)通信網(wǎng)絡(luò )里面,行車(chē)安全、動(dòng)力操控、告警顯示相關(guān)的那些小主兒,哪個(gè)能坐等?
所以,必須拋棄主從結構,尋找一種新的解決方案。競爭和仲裁就是CAN總線(xiàn)標準給出的答案。
再來(lái)看分配設備地址的缺點(diǎn)。
汽車(chē)電子化是隨著(zhù)半導體技術(shù)的發(fā)展而不斷升級的一個(gè)進(jìn)程,主機廠(chǎng)為了保持產(chǎn)品的競爭力或者滿(mǎn)足用戶(hù)的期待,會(huì )引入新的ECU,加入新的功能,在這種升級、擴展需求面前,固定設備地址等于自套枷鎖,給掛接新節點(diǎn)的網(wǎng)絡(luò )升級帶來(lái)困難。
CAN總線(xiàn),通過(guò)報文ID這種內容性的尋址,解決了升級擴展的挑戰。
最后總結一下CAN總線(xiàn)的突出特點(diǎn):
不分主從,可自由競爭總線(xiàn);
通過(guò)ID“尋址”,可以靈活擴展。
CAN總線(xiàn)的競爭和仲裁
說(shuō)到對資源的競爭,灑家總會(huì )想起電影《1942》里頭,那些饑餓的難民拿著(zhù)耙子、鐵鍬、木棍攻打大地主家,以爭奪糧食這個(gè)能活命的資源的畫(huà)面。
資源,有時(shí)候就是生命線(xiàn)!
不過(guò),計算機的世界很體面,盡管CAN總線(xiàn)只有兩根線(xiàn)(CANH和CANL),沒(méi)有了主節點(diǎn)這個(gè)“話(huà)事人”在中間調度轉圜,但是,博世的天才工程師們依然想出了方法,可以避免沒(méi)高沒(méi)低的節點(diǎn)對總線(xiàn)資源的爭搶。
將一頭大象放進(jìn)冰箱需要三步,博世解決CAN節點(diǎn)競爭總線(xiàn)的方案卻只需要兩步。
第一步,只有在總線(xiàn)空閑時(shí),才開(kāi)始發(fā)送報文;
第二步,如果大家同時(shí)開(kāi)始發(fā)送報文,則在仲裁場(chǎng)一決勝負。
為了講明白這一點(diǎn),需要先給出CAN總線(xiàn)的報文格式,或者說(shuō)幀結構,如下圖所示。
關(guān)于第一步,需要著(zhù)重搞清楚的是何謂“總線(xiàn)空閑”,以及,為什么總線(xiàn)空閑能有效避免大家伙一哄而上地搞亂了總線(xiàn)。
總線(xiàn)空閑
在CAN總線(xiàn)標準里,將總線(xiàn)上出現連續11個(gè)位的隱性電平定義為總線(xiàn)空閑。
隱性電平即CAN總線(xiàn)上數據為1時(shí)對應的總線(xiàn)電平(數據為0時(shí)便是顯性電平),這里的總線(xiàn)電平,可以認為是CANH和CANL上各自的電壓,也可以認為是兩者的電壓差。
至于具體什么樣的電壓水平,ISO11898-2和3中分別給出了高速CAN和低速CAN的電壓標準。
這里,以ISO11898-2為例進(jìn)行說(shuō)明。
CANH對地3.5V,CANL對地1.5V時(shí),總線(xiàn)電平為顯性電平,對應數據0。
CANH對地2.5V,CANL對地2.5V時(shí),總線(xiàn)電平為隱性電平,對應數據1。
或者說(shuō),電壓差在2V左右時(shí),對應數據1,電壓差在0V左右時(shí),對應數據0。
這里面,大家經(jīng)常搞混淆的便是顯性電平對應數據0,隱性電平對應數據1。因為,根據大家的“直覺(jué)”,道生一,一生萬(wàn)物,沒(méi)有前面的1,后面隱藏了多少0也無(wú)濟于事,所以,本該顯性為1、隱性為0的嘛。
據說(shuō),女孩子的“直覺(jué)”很準,不過(guò)好在,這個(gè)世界,不講直覺(jué),講科學(xué)!
CAN總線(xiàn)之所以把0定義為顯性,是因為CAN總線(xiàn)執行“線(xiàn)與”機制,0&1還是0,所以,在0面前,1自動(dòng)隱身,總線(xiàn)上顯出來(lái)的是0,故顯性為0,隱性為1。
在顯性面前,1是默默含藏的,1是甘愿隱身的,正是因為1有了這種包容的精神,才能1生萬(wàn)物!
至于為何連續11個(gè)隱性位代表總線(xiàn)空閑,這一點(diǎn)可以從幀格式里找到答案。
首先,CAN總線(xiàn)是半雙工通信,半雙工的特點(diǎn)是節點(diǎn)可發(fā)送可接收,但是不能同時(shí)發(fā)送。在CAN通信中對應的情況便是,當一個(gè)節點(diǎn)占據了總線(xiàn)并發(fā)送報文時(shí),其它節點(diǎn)只能處于接收狀態(tài)。
那么,最有效率的半雙工通信做法是什么?等待發(fā)送報文的節點(diǎn)接收完報文后就馬上發(fā)送報文!
其次,CAN通信里有一個(gè)位填充機制,不允許在報文的SOF、仲裁場(chǎng)、控制場(chǎng)、數據場(chǎng)、CRC場(chǎng)中連續出現6個(gè)相同的邏輯位,換句話(huà)說(shuō),在CAN報文傳輸的主要過(guò)程(即上述那幾個(gè)場(chǎng),有的技術(shù)帖稱(chēng)之為“域”或“段”,對應的英文為Field)中,不可能出現11個(gè)位的隱性電平。
但是,為了保證總線(xiàn)通信的效率,允許在EOF場(chǎng)(End Of Frame)和IFS(Inter Frame Space)中出現。
根據CAN幀結構,報文結尾的EOF場(chǎng)和IFS場(chǎng)為連續7+3=10個(gè)隱性位,那么,為了讓等待發(fā)送報文的節點(diǎn)可以在確認總線(xiàn)空閑的第一時(shí)間啟動(dòng)報文發(fā)送,是不是11個(gè)隱性位正好合適?
在外行的眼里,上個(gè)報文的結尾10個(gè)隱性位,總線(xiàn)空閑定義為11個(gè)隱性位,簡(jiǎn)直巧的不能再巧。
可在內行者的眼中,這是設計上的巧妙,是嚴絲合縫的獨到,是天才的光芒,在灼灼閃耀!
競爭與仲裁
在人類(lèi)社會(huì )中,看到他人在忙就不打擾是一種基本的素養,如前所述,CAN節點(diǎn)也是這樣有涵養的謙謙君子。
但,君子待時(shí)而動(dòng),順勢而為,CAN節點(diǎn)一邊監聽(tīng)總線(xiàn)是否空閑,一邊在確認總線(xiàn)空閑的第一時(shí)間去競爭寶貴的總線(xiàn)資源。
CAN節點(diǎn)通過(guò)SOF,打響了爭奪總線(xiàn)資源的第一槍。
顯然,為了避免混亂,需要有一種合適的手段,盡快地仲裁出答案,決定自己是繼續占有還是放棄對總線(xiàn)的主權。
博世的科學(xué)家們,引入了一種非破壞性仲裁的方案。
即,各個(gè)節點(diǎn)在仲裁場(chǎng)里拿出報文ID,通過(guò)比大小的方式公平競爭。
在這里,ID越小,優(yōu)先級越高,其競爭總線(xiàn)的勝率也就越高。
之所以如此,還要回到前面講解顯性電平和隱性電平的“線(xiàn)與”機制。
圖例中,節點(diǎn)A的報文ID最大,節點(diǎn)C的報文ID最小。節點(diǎn)A、B、C在未決出勝負之前,都一邊向總線(xiàn)發(fā)送報文ID里的數據位,一邊監聽(tīng)總線(xiàn)。
因為總線(xiàn)的線(xiàn)與機制,節點(diǎn)A發(fā)出的1和節點(diǎn)B/C發(fā)出的0進(jìn)行“與運算”之后,總線(xiàn)上的數據位依然為0。節點(diǎn)A監測到自己發(fā)送了1卻回讀到0后,自動(dòng)退出總線(xiàn)競爭,轉入接受模式,同理,節點(diǎn)B也在隨后退出了對總線(xiàn)的競爭,ID最小的節點(diǎn)C最終奪魁。
比大小,這個(gè)人類(lèi)社會(huì )解決分歧的最原始、最有效的方式,竟然在CAN總線(xiàn)這么一個(gè)高大上的地方找到了用武之地。
只能感嘆,這個(gè)世界真奇妙!
CAN總線(xiàn)的門(mén)道還很多,且等咱家慢慢跟你聊~~
文:三德子
*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。