洞察幽微 繼續(xù)談CAN總線的小門道
曾幾何時(shí),汽車這么一個(gè)夕陽產(chǎn)業(yè)突然病樹前頭萬木春,一下子成了各大技術(shù)創(chuàng)新的母體和載體。
近年來,隨著車載以太網(wǎng)的強(qiáng)勢登場,CAN總線也突然變得老土了起來。
那么,CAN總線還有用武之地嗎?還有學(xué)習(xí)的必要嗎?
且不說工控、樓宇等其它領(lǐng)域里,CAN總線依然熱火朝天。就是在不斷追求高大上的汽車行業(yè)里,車載以太網(wǎng)跟CAN總線也是大路朝天,各走一邊。
在動力控制域、車身控制域里,并不涉及大量的數(shù)據(jù)傳輸,上車載以太網(wǎng)有大材小用之嫌,這些控制器之間的通信,CAN總線也能玩得轉(zhuǎn),性價(jià)比十分亮眼。
成本才是王道!所以,貓有貓的道,狗有狗的道,說起CAN總線的壽命,它能陪你退休,伴你到老。
打消了技術(shù)過時(shí)淘汰的顧慮,下面,灑家就書接上文,再嘮一嘮CAN總線那些不為人知的小門道。
報(bào)文ID分配的學(xué)問
上文說過,RS485為每個(gè)設(shè)備分配地址,屬于“設(shè)備尋址”,CAN總線是基于ID進(jìn)行“功能尋址”。
CAN報(bào)文的ID除了內(nèi)容尋址、功能尋址外,還有競爭總線的作用,機(jī)制也很簡單,比大小。
在這個(gè)叢林社會的現(xiàn)實(shí)世界,“尊嚴(yán)只在劍鋒之上,真理只在大炮射程之內(nèi)”,換句話說,誰大誰說了算!
但是在CAN總線的世界里,卻是孔融讓梨,互相謙虛,誰小誰說了算。
誰小誰占先,這個(gè)規(guī)律擺在面前。那么,搞CAN總線開發(fā)的朋友們,如果讓你們自己來定一個(gè)CAN網(wǎng)絡(luò)的矩陣,這個(gè)網(wǎng)絡(luò)里有幾十條報(bào)文,有的是事件觸發(fā)型,有的是周期輪轉(zhuǎn)型,有的周期長,有的周期短,這里的ID分配,到底該怎么辦?
絕大部分人,可能真的沒有想到過這一點(diǎn)。
在這里跟大家分享一個(gè)來自某車廠的網(wǎng)絡(luò)矩陣表,有心的小伙伴,可以自行體會體會。
都說外行看熱鬧,內(nèi)行看門道。這張讓人有點(diǎn)眼花繚亂的圖,到底藏著哪些道道?
先說事件幀和周期幀,發(fā)現(xiàn)沒?事件幀報(bào)文的ID都小于周期幀報(bào)文。
在時(shí)間無涯的荒野里,沒有早一步,也沒有晚一步,時(shí)間一到,周期幀就按時(shí)發(fā)報(bào)。那也沒有別的話好說,它唯有輕輕地問一句:“哦?沒有事件幀哈!”
周期幀有著無垠的時(shí)間,不疾不徐,事件幀,緊急觸發(fā),風(fēng)風(fēng)火火,自然需要一個(gè)小ID,對著周期幀喊聲“對不起,請讓讓”。
那么,周期幀本身的ID呢?當(dāng)然取決于它出自哪一個(gè)節(jié)點(diǎn)。
條條大路通羅馬,有人出生在羅馬。人,生來不平等,才吶喊著、追求著“生而平等”,所以,報(bào)文ID的出身決定論,也是合理的了。
再回到上面那張圖。發(fā)動機(jī)管理單元EMS、變速器控制單元TCU,掌管汽車動力,生殺予奪,自帶豪門屬性,自然需要分配優(yōu)先級最高的ID,空調(diào)AC、儀表IC實(shí)時(shí)性要求不高,車載Tbox可有可無,自然分配優(yōu)先級最低的ID。
雖說同是汽車電子零部件,但還是要分個(gè)三六九等。其實(shí),這些電子單元,也沒必要叫屈喊冤,還有個(gè)冤大頭,在報(bào)文ID的分配里,更加沒有發(fā)言權(quán)。
這個(gè)冤大頭,叫OBD,即診斷單元。
做過診斷的朋友知道,診斷報(bào)文的ID介于0x700-0x7ff之間,細(xì)心的開發(fā)者還會發(fā)現(xiàn),通信報(bào)文從來沒有占用過這個(gè)區(qū)間,即信息控制類的報(bào)文優(yōu)先級高于診斷報(bào)文。
這說明了什么?
都說政府機(jī)關(guān)、事業(yè)單位是三分之一在干,三分之一在看,還有三分之一在搗蛋。在CAN總線的世界里,診斷單元屬于在一旁看著的工種,怎能奢望優(yōu)先級較高的ID,來給正常的通信服務(wù)搗蛋呢?
總線負(fù)載率
在CAN總線網(wǎng)絡(luò)里,還有一個(gè)經(jīng)常被大家提起的概念-總線負(fù)載率。
負(fù)載率,顧名思義,就是指這段時(shí)間內(nèi)總線上實(shí)際傳輸?shù)男畔⒘?/span>/理論上可傳輸?shù)淖畲笮畔⒘俊?/span>
不知道大家平時(shí)怎么理解一個(gè)“概念”或“定義”,灑家的小竅門是“咬文爵字”和“摳字眼”。
具體要摳哪些字眼,可以參考老羅的錘子手機(jī)原創(chuàng)、最近被微信抄了去的big bang大爆炸。這個(gè)概念里,有兩個(gè)需要重點(diǎn)理解的點(diǎn):“這段時(shí)間”、“理論最大信息量”。
“這段時(shí)間”可長可短,也意味著負(fù)載率是可變的。需要特別關(guān)注的有兩個(gè):平均負(fù)載率和峰值負(fù)載率。根據(jù)灑家多年的小經(jīng)驗(yàn),平均負(fù)載率大多低于40-50%,峰值負(fù)載率也不超過70-80%。
至于說,負(fù)載率超了會怎么樣?
也許,針對某個(gè)具體的CAN網(wǎng)絡(luò),從技術(shù)上來說,把原本30%的平均負(fù)載率提高到50%也沒啥。但是,從“行政”上來說,您這個(gè)提議提高負(fù)載率的技術(shù)人員需要寫報(bào)告,說明白為啥要提,提到50%有沒有什么風(fēng)險(xiǎn),怎么證明沒有風(fēng)險(xiǎn),有沒有理論分析,有沒有實(shí)測報(bào)告,有沒有。。。。
好吧,30%最保險(xiǎn)了~~
另一個(gè),“理論上可以傳輸?shù)淖畲笮畔⒘俊比Q于總線速率。具體來說,低速CAN為125kbps,高速CAN為500kbps,CAN-FD為2Mbps,再往上,Flexray站出來說了“此吾家事,汝不得預(yù)也!”。
在制定負(fù)載率時(shí),會牽涉到一個(gè)概念-報(bào)文時(shí)長。灑家不少同事說起報(bào)文時(shí)長來,經(jīng)常不清不楚,模模糊糊。其實(shí),真正找到關(guān)鍵,問題就很簡單了。
關(guān)鍵在哪?在計(jì)算公式:
報(bào)文時(shí)長=位時(shí)長x報(bào)文位數(shù)。
在這個(gè)公式里,位時(shí)長當(dāng)然等于速率的倒數(shù),比如125kbps的通信速率,位時(shí)長=8us。而報(bào)文位數(shù),則取決于CAN報(bào)文的結(jié)構(gòu)。報(bào)文結(jié)構(gòu)如下圖所示:
一個(gè)完整的CAN報(bào)文由七個(gè)不同的Field(場/域/段)組成:幀起始、仲裁場、控制場、數(shù)據(jù)場、CRC場、應(yīng)答場、幀結(jié)尾。
每個(gè)Field的位數(shù)相加,不就齊了?
下面就單獨(dú)就每個(gè)場進(jìn)行分析。
SOF為幀起始,標(biāo)志著數(shù)據(jù)幀和遠(yuǎn)程幀的起始,由一個(gè)單獨(dú)的“顯性”位組成。
仲裁場包括識別符和遠(yuǎn)程發(fā)送請求位(RTR)。識別符的長度為11位。
控制場由6個(gè)位組成,包括數(shù)據(jù)長度代碼和兩個(gè)將來作為擴(kuò)展用的保留位。
數(shù)據(jù)場由數(shù)據(jù)幀中的發(fā)送數(shù)據(jù)組成。它可以為0~8 個(gè)字節(jié)。
CRC場包括CRC序列(CRC SEQUENCE),其后是CRC界定符(CRC DELIMITER)。CRC序列為15位,CRC界定符包含一個(gè)單獨(dú)的“隱性”位 。
應(yīng)答場長度為2個(gè)位,包含應(yīng)答間隙(ACK SLOT)和應(yīng)答界定符(ACK DELIMITER)。
幀結(jié)尾由一標(biāo)志序列界定。這個(gè)標(biāo)志序列由7 個(gè)“隱性”位組成。
所以一個(gè)8字節(jié)的數(shù)據(jù)幀的位數(shù)為1(幀起始)+ 12(仲裁場)+ 6(控制場)+ 64(數(shù)據(jù)場)+ 16(CRC場)+ 2(應(yīng)答場)+ 7(幀結(jié)尾)= 108位。
報(bào)文之間存在幀間空間INTERFRAME SPACE。幀間包括間歇場、總線空閑的位場。間歇場包括3 個(gè)“隱性”的位??偩€空閑的(時(shí)間)長度是任意的。
所以,一個(gè)8字節(jié)的數(shù)據(jù)幀至少需要(108+3+1)* bitrate的時(shí)長,對于125kbps,需要0.896ms。
CAN總線的位定時(shí)
對一般的開發(fā)者來說,CAN總線的位定時(shí)概念并不常見。不過,如果給整車廠做過零部件,經(jīng)受過他們的CAN通信測試考驗(yàn),您可能就知道,這也是比較重要的一個(gè)知識點(diǎn)。
前文說了,CAN報(bào)文由七個(gè)不同的場/段組成。那么,具體到單個(gè)bit位呢?上一張圖,大家就有概念了。
一個(gè)位,由同步段+傳播段+相位緩沖段1+相位緩沖段2組成。
這四個(gè)段的時(shí)間均為基本時(shí)間單位“時(shí)間份額”的若干倍,時(shí)間份額Tq派生于振蕩器周期,可以由振蕩器進(jìn)行分頻。
由這張圖可以看出,在相位緩沖段1和相位緩沖段2的交接處,藏著一個(gè)“采樣點(diǎn)”,或者說“采樣時(shí)刻”,這也是CAN通信測試中比較重要的一個(gè)測試項(xiàng)。
下面這張圖,是一個(gè)CAN通信需求規(guī)范中的位定時(shí)要求。
在實(shí)際的編程開發(fā)工作中,需要根據(jù)這個(gè)位定時(shí)規(guī)范,對照MCU中CAN模塊的寄存器特點(diǎn),對寄存器進(jìn)行針對性設(shè)置。
比如飛思卡爾微控制器中的MSCAN模塊,其位定時(shí)寄存器如下所示:
在這款CAN控制器中,把CAN的位分成了三段,同步段、段1和段2。跟CAN2.0協(xié)議中定義的“同步段+傳播段+相位緩沖段1+相位緩沖段2”進(jìn)行對比,便可以發(fā)現(xiàn),MSCAN中的段1即CAN2.0協(xié)議中的“傳播段+相位緩沖段1”。
如何具體設(shè)置CAN控制器寄存器呢?
根據(jù)規(guī)范要求,一個(gè)8us的CAN比特位包含16個(gè)Tq,采樣位置在該bit位75%的時(shí)刻,所以,可以將Time Segment1 設(shè)為 11,Time Segment2 設(shè)為 4,這樣,既能保證包含16個(gè)Tq(1 + Time Segment1 + Time Segment2 = 16),又可以保證采樣時(shí)刻=(1 + Time Segment1)/16=75%。
寫在最后
CAN總線有著廣泛的應(yīng)用,也有著長久的生命周期。深入思考并鉆研CAN總線的一些小門道,可以幫助您在一些表層的知識之下加深對這門技術(shù)本質(zhì)的認(rèn)識,同時(shí),在面對一些規(guī)范要求時(shí),可以做到知其然并知其所以然,何樂而不為?
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。