對于搞汽車電子的小伙伴,應該聽過Flexray總線,相對于CAN總線,似乎談不上熟悉。隨著車載Ethernet的普及,以及CAN XL的出現,不管是成本還是接受度,Flexray的地位似乎都在經受著挑戰。但是,不管怎么說:存在即合理。既然一時半會兒,Flexray不會退出歷史舞臺,項目中如果使用到Flexray總線,那么,我們就試著去"擁抱",去適應項目,抵觸情緒并不能幫我們解決問題。對于Flexray總線,之前就有小伙伴要求分享一下。從本文開始,我會出一個Flexray系列,試圖把自己有限的理解分享給大家,而我的理解還很淺顯,難免偏頗,僅以此拋磚引玉。 如果項目中,用到Flexray總線,那么,該控制器大概率是網關節點(Gateway),也就是主干網節點,而且,需要參與總線路由。
Flexray節點的總線構成和其他總線節點類似,一般由收發器(Flexray Transceiver)、通信控制器(Flexray Commuincation Controller)、數據發送/接收主機(uC)、供電單元(SBC和Vbat)等組成,示意如下:
 如上圖,在PCB(Printed Circuit Board,印刷電路板)設計中,通常將CC集成到uC中,Transceiver獨立于uC,同時,Transceiver與Vbat常連,以便于監控喚醒事件。多個Flexray節點掛接到相同的物理鏈路時,就構成了Flexray的網絡簇,示意如下(本文不討論星型結構): 討論喚醒,我們首先需要明確喚醒方式。不管是CAN總線還是Flexray總線,喚醒方式方式一般都會分為本地喚醒和遠程喚醒。討論本地喚醒,多數是討論Transceiver的Wake Pin喚醒方式,Wake Pin是一個輸入(Input)引腳,當捕獲到一定的喚醒時序時(Wakeup Pattern)時,將INH Pin拉高,使得SBC激活,進而給Transceiver、uC等功率器件提供工作電壓,示意如下:
 但是,本地喚醒往往只是喚醒節點本身,如果要喚醒節點所在的網絡簇,那么,該節點就有一個任務:喚醒網段內的其他節點。因此,具有本地喚醒的節點也稱為主動喚醒節點。遠程喚醒,有時也稱全局喚醒。當主動喚醒節點喚醒以后,它負責發送喚醒幀(WUP,Wakeup Pattern),以便于喚醒網段內其他節點,進而實現遠程喚醒,即:局部網段內所有節點的喚醒。喚醒符(WUS,Wakeup Symbol)什么樣呢?示意如下(1):
 主動喚醒節點通過BP和BM,控制總線壓差(Vdiff),產生如上圖的WUS。當然,根據Transceiver功能,也可以設置特定幀喚醒。 理解WUS,需要理解Flexray的位流(bit stream),也就是uC如何將數字信號(0或者1)通過總線傳輸給接收節點。Flexray總線和其他總線一樣,uC將數字信號發送給收發器(Transceiver)轉換成對應的模擬電壓,發送到總線。對于Flexray,BP和BM在總線上的傳輸形式如下所示:
 Flexray類似CAN總線,通過控制一對雙絞線(BP和BM),形成不同的壓差(Vdiff)去模擬要傳輸的信息。當Vdiff(BP-BM)>600mV時,表示隱性位("1");當Vdiff(BP-BM)<-600mV時,表示顯性位("0")。
實際工程中,WUP由多個連續的WUS組成,而且,一般要求每個Flexray節點的WUS個數不同。eg:Flexray Node A的WUP有42個WUS,Flexray Node B的WUP有43個WUS。 實際的工程中,需要明確輸入WUS的WakeupSymbolTxIdle時間(eg:180 gdBit)和WakeupSymbolTxLow時間(eg:60 gdBit)。gdBit就是標準位時間(Nominal bit time),如果使用10Mhz的通信速率,gdBit = 1/10000000 = 0.1us。因此,WakeupSymbolTxIdle = 180 * 0.1 = 18us,WakeupSymbolTxLow = 60 * 0.1 = 6us。所以,一個WUS = 18us("1")+6us("0")組成。首先,WUS需要通過Flexray總線發送給接收節點的的總線驅動(BD,Bus Driver),也就是接收節點的收發器,喚醒收發器后,才能觸發SBC給功率器件提供工作電壓。注意:同一網段內的所有Flexray節點,WakeupSymbolTxIdle、WakeupSymbolTxLow需要設置一樣。 (1)TJA1081B FlexRay node transceiver.pdf
|