1. 程式人生 > >探討CAN總線的抗幹擾能力

探討CAN總線的抗幹擾能力

ember 問題 破壞 動態 led sam 基礎 處理機制 做的

探討CAN總線的抗幹擾能力

  CAN總線經近20年的發展已步入壯年期,它不僅在汽車領域的應用占據一定優勢,在其他工業應用上也生機勃勃、枝繁葉茂。究竟是什麽原因使它這麽成功?當人們發現它的局限性,又面臨新的總線(例如FlexRay)的挑戰時,它的地位還能維持多久?這些問題都離不開對通信技術本質和CAN總線特性的分析與理解。通信技術的不斷進步離不開應用對帶寬與抗幹擾的追求,又要快又要正確,當然關鍵點是適合當前需求的性價比最佳的技術。沒有這些追求,可能我們會一直停留在RS232的標準上。當今CAN總線的競爭對手包括以RS485為物理層的總線和FlexRay總線,這種形勢下CAN總線的生命力在於其優越的抗幹擾能力
和性價比,這些都來源於它獨特的物理層與數據鏈路層的設計。

1 物理層[13]

1.1 信號狀態

  CAN總線的信號狀態為2種:隱位與顯位。當總線上出現隱位與顯位發送的競爭時,總線上的最終結果是顯位。這種二值特性對CAN總線的可靠性與其他特性有很大貢獻。CAN總線信號的二值且“單穩態”的特性為它的數據鏈路層創造了條件,即CAN總線上可以容許多主發送、競爭占線的方式。這極大簡化了消息的調度。為使總線上的節點均有機會發送,有些總線采用“主從方式”,這種方法使總線的利用率較低,且從節點消息發送的等待時間較長。有些總線采用“令牌方式”,但令牌的丟失和重復需要特別的處理機制。

  許多總線是不容許總線上有沖突的,因為沖突發生後,不同的接收節點得到的電平結果是不同的。這使它們對總線上發生的事件在時間上與內容上產生不同的解釋,退出沖突就會有時間的先後,從而導致節點間狀態的不同步。但是由於幹擾的存在,節點可能會有誤動作,發生不希望的沖突。為此,要增加需多輔助的設備來防止沖突,例如在時間觸發協議中經常采用的總線監守。在CAN總線裏,沖突的處理由於該信號的二值且“單穩態”的特性變得簡單,報錯幀可以使所有節點(包括發生沖突的節點)容易地取得數據的一致性和節點狀態的同步。

  FlexRay總線的狀態有低功耗閑置、閑置、“0”、“1”四種。在正常工作模式時,總線接收部分只認可後3種狀態。與RS485總線不同的是,FlexRay收發器有一個判斷閑置狀態的機制。當總線電平差處於某範圍內——uBusActiveLow(最低-450 mV)~uBusActiveHigh(最高450 mV)一段時間(dIdleDetection,最小50 ns,最大250 ns)後,它就將RxEN引腳置”1”,並將RxD置”1”。當總線電平超出該範圍一段時間(dActivityDetection,最小100 ns,最大300 ns)後,就退出閑置狀態。因此它不會在閑置狀態受幹擾而輕易地誤判為新幀的開始。而總線上因幹擾而引起沖突的情形可由另設的總線監守加以防止。當然,這些功能的添加意味著成本的增加。

1.2 信號電平與共模電壓

  信號電平的高低有兩層影響: 一是閑置時有幹擾被誤認為是傳送的啟動信號;二是傳送邏輯信號時因幹擾而產生誤碼。

  RS485接收器的閾值很小,總線電壓差小於-200 mV時為“0”,大於200 mV時為“1”。因此,200 mV幅度的幹擾就可能引起誤啟動,而造成誤碼的幹擾幅度為400 mV。RS485總線的共模電壓為-7~+12 V。

  CAN只有2種狀態: 當總線電壓差小於0.5 V時,接收為隱位(即邏輯“1”);大於0.9 V時,為顯位(即邏輯“0”)。0.5~0.9 V為變化的過渡區。總線隱位電壓差的正常值為0 V,因此可能引起誤啟動的最小幹擾為0.5 V;顯位電壓差的正常值為2.0 V,合格的網絡顯位電壓差的最小值為1.2 V,引起誤碼的最小幹擾為0.3 V。CAN總線的共模電壓為-2~+7 V。

  前面已介紹了FlexRay總線在總線閑置與正常通信的過渡情況,不再重復。它的接收器邏輯“1”電平為uData1(最低150 mV,最高300 mV),邏輯“0”電平為uData0(最低-300 mV,最高-150 mV)。因此引起誤碼的最小幹擾為0.3 V。FlexRay總線的共模電壓為-10~+15 V。

1.3 采樣

  采用RS485收發器的總線往往與UART相連,它們一般在啟動電平負跳變後的1/2位處對總線的邏輯值作采樣判斷。因此,當總線閑置時,若幹擾的幅度足夠大,且持續時間大於1/2位,就可能產生誤啟動。

  CAN總線的位值一般在80%~90%位處采樣[4],因此它能容忍的誤啟動幹擾不但幅度大,而且時間長。正常傳送時,高速CAN的位采樣為1次,低速時可以有3次(例如TJA1000中由SAM位控制)。這意味著可以抵禦1次幹擾引起的錯誤,因為沒有看到這3次采樣的間隔有多大,只能估計它是以Tq為單位。高速時實現3次采樣的可能性在於廠家產品的設計,與CAN標準無關,如果以1 Mbps計算,每位分為25個Tq,那麽在3次采樣下,可以抵禦的幹擾持續時間為40 ns。

  FlexRay總線容許的誤啟動時間與位采樣點位置無關,由dActivityDetection決定,最小為100 ns。正常傳送時,根據FlexRay數據鏈路層3.2.2的規定,每一位采樣cSamplesPerBit(=8)次,將最近的cVotingSamples(=5)次按多數進行表決,即可得到當時的總線接收值(zVotedVal)。因此這種方法可以抵禦1/4位長度的幹擾,按FlexRay 10 Mbps計算,抵禦的幹擾持續時間為25 ns。

2 媒體存取與邏輯鏈路層[2,5]

2.1 位填充

  CAN總線的位填充是在以前的位填充做法的基礎上發展起來的。在高級數據鏈路控制規程(HDLC)中用01111110作報頭與報尾的標誌位;在其他部分為了不致引起誤解,采用每連續5個“1”之後填入一個“0”的辦法,接收後將填入的0去掉。CAN總線不僅在連續5個“1“之後填入一個“0“,而且在5個“0“之後填入一個“1”,接收後將填入位丟掉。CAN總線這樣做不僅為報錯機制(報錯幀)創造了條件,而且還有2個對信號傳遞有利的方面:一是為CAN總線的位同步創造了較短的同步間隔,有利於提高同步精確度;二是有利於在總線上引入適時的反向放電,減少因總線長期同一極性充電造成的物理層誤判。

  但是位填充方法減弱了CAN總線的CRC防止錯誤漏檢的能力[6]。發生在填充位的錯誤會改變位流的相位,只要有2次填充位錯就會使原來的部分位流提前或推後1位,而此時仍有CRC檢查通過的可能。通過仿真方法註入位錯,求出CRC檢查漏檢出錯的概率為1.3×10-7,而不是CAN總線聲稱的所有5位以下的錯誤均能檢出。位填充的另一個缺點是造成數據輸送率的下降以及幀長度的不確定性。FlexRay總線沒有用位填充的方法,使用其他方法實現位同步。

2.2 幀編碼與解碼

  關於CAN總線的幀已有大量文獻介紹,這裏不再贅述。FlexRay總線則復雜得多,其中對用戶安排帶寬起關鍵作用的是擴展字節的概念。根據FlexRay總線數據鏈路層3.2.1.1.3的規定,每一個字節開始處要有一個由“1”和“0”組成的字節開始序列(Byte Start Sequence,BSS),然後才是要傳送的8位數據。FlexRay容許的最大時鐘變化cClockDeviationMax為1 500×10-6(0.15%),因此收發之間可能差0.3%,每333次就可能差1次采樣。如前所述,1位要采樣8次,那麽不到44位就會差1次采樣,因此除了時鐘本身的偏移與速率要校正外,FlexRay中也有位同步的機制。

  位同步有2個條件:同步機制已使能;zVotedVal由高到低的跳變。正常傳送時,同步機制的使能發生在BSS的zVotedVal為高時。當同步時,將保存zVotedVal的cSamplesPerBit位循環計數器置2;當循環計數器計數為cStrobeOffset(=5)時,將該zVotedVal取作真正送到協議其他部分的位置。考慮到實現位同步必須有BSS這個因素,一個FlexRay信道即使不算其他開銷,至多只能傳送8 Mbps的實際數據;再加上其他的開銷,例如發送幀之間的間隔cChannelIdleDelimiter(=11位)等,有效的負載更小。

2.3 回讀

  CAN總線發送節點能夠在送出1位時又把它從總線上讀回來,其他總線沒有這個功能。這個功能提供了無損位仲裁的基礎,讓優先級高的消息獲得在總線上繼續傳送的權力;同時,增強了發送節點早一點檢測出錯誤的能力,一旦有錯就可發送報錯幀並停止原來幀的傳送,節省了出錯後無用部分的繼續傳送帶寬。

2.4 錯誤約束

  CAN總線對錯誤的檢測主要是編碼與解碼的過程,例如bit錯、填充錯、ACK錯、CRC錯和格式錯。對於時間同步,並未將其視為重要問題。例如當重同步誤差大於重同步跳躍寬度時,肯定會出現位同步的失敗,造成數據傳送的錯誤。這種錯誤會被誤認為是由其他原因引起,而不能及時發現。有時候它也成為Babbling idiot失效的原因。CAN總線對瞬態故障與永久性故障采用分類的約束辦法。有錯時收發錯計數器增加快,正常時收發錯計數器減少慢,按收發錯計數器的值把節點分為主動報錯狀態、消極報錯狀態和離線狀態。處於消極報錯狀態的節點有可能無法正確接收到幀。出錯過於頻繁時把有永久性故障傾向的節點從總線上切除,雖然被切除的節點失去了通信能力,但其他節點間的通信可能免除了騷擾,這不失為一種有效的故障時性能逐步退化的策略(scalable degradation)。

  FlexRay 總線的檢錯包括解碼過程中的錯以及時間同步過程中的錯,例如數據幀接收時是否有格式錯、CRC錯,符號(symbol)傳送時高、低的時間長度是否在範圍內。由於是時間觸發協議,通過各分散的節點預定發送時間與實際發送時間的差進行修正,建立同步時基,對發送時間的超限要求更嚴。它對時間同步中產生的問題也采取了一種逐步退化的策略。它有一個協議運行控制的機制(POC),POC有3個狀態,為POC: normal active(積極),POC: normal passive(消極)和POC: halt(停止)。其中,積極狀態下,同步處於容許界限內,不會破壞其他節點的同步;消極狀態下,同步已惡化到不能再發送的地步,若再發送就有可能超出它的窗口而與其他節點沖突,但它容許接收,以取得足夠的同步重返積極狀態。在自檢或完好性檢查(sanity check)未通過,或POC與其他核心機制發現嚴重錯,或host檢查到錯誤給出命令的情況下,POC會進入停止狀態,此時只有重新初始化了。

  從上面的簡述可見,在保證所有節點數據的一致性上,二者都是要靠其他措施的,而這些可能的措施(例如組籍算法,membership algorithm)都有待討論,對錯誤的約束僅限於逐步退化的策略。

2.5 幀出錯率

  總線傳送中的出錯來源於各種幹擾,除了前面分析的信號電平、采樣過程、共模電壓以外,來自電源的傳導幹擾也可能使通信控制器工作異常而通信失效,所以不能僅以物理層的一些指標作完整的判斷。幀的出錯概率對應用有很大影響,它涉及出錯以後該怎麽辦的問題。幀的出錯概率與幀長成比例關系,CAN2.0A的最大幀長為133位,FlexRay的最大幀長為2 625位(254字節數據+8字節開銷+5個起始/停止位,這裏1字節=10位)。假設二者的誤碼率相同,那麽FlexRay的幀出錯率PF約為CAN(PC)的20倍。雖然FlexRay幀可傳送的數據多得多,但是一個幀錯了,其中的消息便全部不能利用,這種消息捆綁在一起的特性,大大增加了出錯的機會。如果將FlexRay像CAN那樣傳送短幀,那麽幀的效率會比CAN還低,存放靜態段調度表的硬件部分更大。如果將來由於ECU內處理器更強大,一個節點發送的消息更多,那麽這種長幀有用途,但是出錯概率的增大仍是缺點。另外,用長幀傳短消息涉及消息在幀內的編排方法,這種靈活性必然要求有高級通信層的統一約束,否則會帶來修理、供貨、管理上的不便與成本的增加。這可能是漫長的路,在統一之前仍然是各汽車廠專用的封閉的高層協議,幾乎沒有留給外人插足的空間。

3 與FlexRay總線的比較

3.1 單信道應用

  出錯自動重發是CAN總線的一大特點。FlexRay協議的網絡拓撲結構包括總線方式,但是用2個信道還是1個與性能和成本關系很大。FlexRay的設計是用2個信道同時傳送來保證傳送的正確性,因為它不像CAN有出錯重發的功能。2個通道同時出錯的概率比較小,不考慮出錯重發時丟幀也不多。如果考慮2個信道同時出錯而要求重發,則必須在應用層處理,而在動態時隙中傳送請求與重發,不是一件容易的事,也推遲了送達時間。如果FlexRay只用一個信道來完成,出錯概率較大,為了簡化應用可以采用重復傳送的方法(即時間冗余),在2次或多次傳送中只要有1次成功便可。但是這樣做相當於把FlexRay的帶寬降了下來,例如減為1/2或1/3。這並不意味著2個信道時吞吐量僅為10 Mbps或更小,因為可以在其中一個信道安排較多的動態段,用於出錯消息的重發請求與重發,即僅傳送出錯的部分。

3.2 安全攸關應用的額外要求

  對FlexRay這樣的時間觸發通信協議,其錯誤約束機制中已盡量考慮了各種可能的出錯情況,防止一個節點的發送超出預定給它的時間窗口。為了提高防錯的能力,另外設計了總線監守。總線監守有自己的時鐘線路和與節點發送的調度表,它控制該節點的總線驅動器,僅在容許的時間窗口裏讓總線驅動器工作。這種機制給防止沖突構成了雙保險,但是增加了系統的成本,所以把它作為選件。在FlexRay中有2種總線監守: 一種是本地總線監守,即與節點靠近的地方,甚至是可以做在同一矽片上的總線監守;另一種是遠方的星型耦合器中的集中式總線監守。在總線式應用中有關的是本地總線監守。雖然總線監守要做的事少一些,但是它也要有時間同步的相關機制,以及啟動和從休眠中喚醒的算法。為實現這些功能,從總線上接收數據的部分就是必不可少的。由於僅少了發送部分,FlexRay甚至提到過一種可能:將控制芯片設計成可組態的,既可用作通信控制器,又可以用作總線監守。這就說明了總線監守的結構是復雜的、高成本的。有的FlexRay文獻中提到,可以將安全攸關的節點與要求稍低的節點連在同一總線上,要求低的節點可以不配總線監守。這種講法是不正確的,因為根據木桶原理,一段總線上通信的沖突可能性由最有可能引起沖突的節點決定,安全要求低的節點發送超時會引起總線上的沖突,影響安全攸關消息的傳送。

4 小結

  目前在車內總線技術的競爭方面,CAN總線的主要對手是FlexRay總線,因此與FlexRay總線在單信道應用上的比較是不可避免的。因為在一個信道上傳送FlexRay 的幀出錯率高很多,又沒有出錯自動重發的機制,所以FlexRay總線要減少出錯就必須重復發送,以時間備份的方式糾錯。經過FlexRay擴展字節與時間備份的折扣,有效的數據傳送速率已降到4 Mbps;再加上其他開銷,帶寬還會減小。另一方面,時間觸發協議的調度表的求解在負載越大時越困難,不可能用足4 Mbps。FlexRay總線的通道長度最長為24 m[3],如果CAN總線也限於24 m,則根據每米信號傳送遲後約5 ns計算,CAN位時間中傳送段的通道傳送部分為240 ns。若設計驅動器的響應時間為40 ns左右(如SJA1000),那麽CAN總線的數據傳輸速率達到2~3 Mbps也是可能的,雖然ISO118981限定1 Mbps為上限,但它並非技術的極限。

  FlexRay總線在抗共模幹擾上比CAN總線強,但是出錯並不僅由共模幹擾引起,例如來自電源的傳導幹擾也會引起包括比較器在內的的所有電路出錯,所以並不能確定FlexRay總線的硬件可靠性高於CAN總線。在保證傳送數據的一致性方面,2種協議都要有應用層的解決辦法,FlexRay總線並未提供直接可用的機制。作為通信的下層,它們都采取的是性能逐步退化的策略。也有人在研究冗余通道、星形拓撲等措施在CAN總線中如何實現,並非不可能。

  就CAN總線而言,FlexRay總線是一種挑戰,但是在單信道的總線拓撲應用中FlexRay總線並不構成威脅。由於目前高檔車內已經用了不止一個CAN總線系統,用雙信道的FlexRay取代多個CAN總線系統有可能在性價比上取得進展,但是與現在生產的應用CAN總線的ECU存在兼容問題,且成本較高,這些問題的解決還有待時日。盡管CAN總線有一定局限,甚至還有漏洞,但對CAN總線的改進還在繼續,在未來的5~10年裏CAN總線仍然有很大的性價比優勢。

探討CAN總線的抗幹擾能力