1. 程式人生 > >ADAS/AD開發07

ADAS/AD開發07

前言

CAN通訊模組對於汽車ECU來講,算是最基本的模組了。與CAN通訊模組同樣基本的模組還有:基於CAN通訊的UDS診斷模組、基於CAN通訊的BootLoader刷寫模組、基於CAN通訊的EOL/Service/Online標定模組等。注意限定詞“基於CAN通訊的XXX”。

記得在德爾福工作時,問軟體工程師都做什麼樣的高階程式設計工作,對方吐槽曰:“汽車軟體三件套:診斷、標定、PBL”。一時語塞。冷靜下來想想,其實也對。在外企上班,國內引用的技術都是在國外開發,到了國內都是平臺化的技術,改的最多的也就剩診斷、標定、PBL了。注:PBL - Primary Bootloader,對應的還有SBL - Second BootLoader。

CAN通訊

CAN的通訊是通過CAN匯流排實現的。老東家博世公司發明的(PS:汽車工業哪都有他)。CAN通訊都是以廣播的形式傳送接收訊息的。不面向連線,不握手。

a. CAN匯流排中的OSI層:

按照OSI的七層架構物理層、資料鏈路層、網路層、傳輸層、會話層、表示層和應用層來分配的話,CAN匯流排只實現了物理層、資料鏈路層和應用層3層。原因是:CAN匯流排作為工業測控的底層網路,其資訊傳輸量相對較少,網路連線方式相對簡單,但是資訊傳輸的實時性和可靠性非常高。

資料鏈路層在CAN匯流排中有分為邏輯鏈路控制(LLC)子層,和媒體訪問控制(MAC)子層。邏輯鏈路控制子層的功能主要是報文濾波、超載通知和reset管理。媒體訪問控制子層功能主要是傳送規則,即控制幀結構、執行仲裁、錯誤檢測、出錯標定和故障界定。物理層功能主要定義訊號傳輸方式、完成電氣連線、實現收發器特性。

b. CAN匯流排的硬體:

CAN匯流排的硬體主要由MCU(微控制器)、CAN控制器、CAN收發器(也叫CAN驅動器)、CAN高CAN低雙絞線構成。其中,MCU負責實現應用層、CAN控制器實現資料鏈路層、CAN收發器和雙絞線實現物理層。實際產品中,一般的車用MCU中會整合CAN控制器模組。所以實際上只有帶CAN控制器的MCU+CAN收發器+雙絞線三種物理實體(如果你非要把連線雙絞線與ECU主機板之間的聯結器也作為CAN匯流排實體的一部分,那就算四種物理實體吧...)。注意,這裡的MCU就是前面系統架構和軟體架構中提到的那個微控制器(Host)哦!車載MCU裡能放程式碼的晶片也就那幾種,MCU是主要型別之一。

其中,CAN控制器主要用於生成CAN幀,並以二進位制碼流的方式傳送;在此過程中進行位填充、新增CRC校驗、應答檢測等操作;將將接收到的二進位制碼流進行解析並存儲,在此過程中進行收發對比、去位填充、執行CRC校驗等操作。此外,還需要進行衝突判斷、錯誤處理等諸多工。

CAN收發器則主要將來自CAN控制器的二進位制碼流轉換為差分訊號,向CAN高CAN低雙絞線上傳送;也將雙絞線上的差分訊號轉換為二進位制碼流接收,並轉給CAN控制器。

最後是CAN高和CAN低這對雙絞線。一般CAN高這條線是黃色的,CAN低這條線是綠色的。CAN高和CAN低這兩條線的電平在靜止狀態(default狀態)時都為2.5V,這個電平也叫作隱性電平。當傳送訊號時,CAN高會產生電平跳變,往高了跳,這個高電平一般為3.5V;而CAN低則會非常對稱、互補的(要不然怎麼叫差分訊號呢!)往低了跳,這個低電平一般為1.5V。

c. 資料鏈路層的CAN報文(也叫“CAN幀”):

先捋下對應關係:CAN幀-對應-資料鏈路層-對應-CAN控制器。

CAN幀有兩種格式,標準的和長的。也叫標準幀(11位識別符)和擴充套件幀(對應29位識別符)。

CAN幀除了格式不同,還分為4中不同用途的幀型別:分別是資料幀、遠端幀、錯誤幀和過載幀。其中資料幀負責傳輸資料;遠端幀一般用於連線不同CAN網路的閘道器,在接收某個網路的訊息後,再指定打包成另一個CAN網路上的訊息轉發出去;錯誤幀,任何節點檢測到匯流排錯誤就發出錯誤幀;過載幀,用於已在先行的後續資料幀(或遠端幀)之間提供一個附加的延時。

每個幀的結構一般是由以下幾各段構成的:

1) 幀起始。表示資料幀開始的段;

2) 仲裁段。表示該幀的優先順序的段;

3) 控制段。表示資料的位元組數及保留位資訊的段;

4) 資料段。資料的內容,一幀可傳送0到8個位元組的資料;

5) CRC段。檢查幀的傳輸錯誤的段;

6) ACK段。表示確認正常接收的段;

7) 幀結束。 表示資料幀結束的段。

CAN幀的位時序。位速率:由傳送單元在非同步的情況下發送的每秒鐘的位數稱為位速率。一個位可分為 4 段,包括同步段(SS)、傳播時間段(PTS)、相位緩衝段1(PBS1)和相位緩衝段2(PBS2)。這些段又由可稱為 Time Quantum(以下稱為Tq)的最小時間單位構成。1 位分為4 個段,每個段又由若干個Tq 構成,稱為位時序。

d. 應用層的CAN訊息(CAN Message,簡寫Msg):

實際上,對於大部分汽車工程師,日常工作中接觸最多的關於CAN的內容,就屬於CAN Message了,純程式碼實現的一種資料結構。底層的東西,看一遍熟悉下就夠了。CAN訊息一般都是在MCU等晶片中實現的,其實就實現在Host應用軟體中,是Host-SW中的一部分(可以參考前面關於軟體架構的文章)。

既然CAN訊息大家都用,那一定就不是簡單的理論知識了,必須要有工具才能講“使用”。在汽車行業,工程師接觸到最多的CAN工具就是Vector的CANoe。本章節就結合CANoe的使用,來直觀的介紹應用層的CAN訊息。

CAN訊息矩陣一般是主機廠的網路架構組來負責,是一個巨大的Excel檔案,裡面的各種sheet定義了不同的CAN訊息列表,便於更新維護,類似於圖1。

圖1 某主機廠某款車型的AD_CAN矩陣中名字為“ACC1”的CAN訊息截圖

dbc是按照CAN矩陣建立的可以作為CANoe軟體的CAN訊息資料庫使用的一種檔案,所謂的dbc其實也就是DataBase of CAN的意思,如圖2。

圖2 一些dbc檔案

所謂的CAN訊息是怎樣一種存在呢?如圖3所示。

實際上每個CAN訊息都對應一個本CAN網路內的唯一ID,如下圖中的ABM2訊息,對應的ID就是小括號內的0x245,。需要說明一點,ABM2其實就是整車上ABM安全氣囊控制器ECU發的一個訊息,且訊息ID是16進位制的,0x代表16進位制,245是ID號。裡面有一堆的訊號,其中的Checksum訊號、RollingCounter訊號為ABM2這個訊息的安全相關訊號,其他的訊號為代表不同實際意義的訊號。

圖3 某主機廠某款車型的dbc的CAN訊息和訊息內承載的訊號

需要注意的是,這裡的訊息(Message)其實只是一艘船,一個載體;裡面承載的訊號(Signals)才是真正有意義的資訊。那麼訊息(Message)與訊號(Signal)的關係是什麼呢?請看下圖。

圖4 訊號在訊息中的layout

一條訊息一般有8個Byte位元組(0~7byte),每個Byte又有8個bit位(0~7bit)。就這樣形成一個8x8的矩陣,每個矩陣小框代表一個bit。每個訊號佔用多少bit(位),佔用了8*8矩陣(訊息的layout矩陣)的哪幾個bit,通過上圖,可以看得清清楚楚。上圖中不同顏色的條狀物,即代表一個訊號(signal)。例如,藍色部分,代表Checksum訊號,它佔用了整個Byte0(0~7位)的空間;橘色部分,代表WehDynYawRateValid訊號,它佔用了第7個byte的第5位(bit)的空間,也就是說,ABM2這條訊息的第7Byte的第5bit,表示WehDynYawRateValid訊號。WehDynYawRateValid實際是車輛動態Yawrate有效性的意思,是個bool值。Yawrate搞自動駕駛的都知道,是車輛偏航角速率的意思。

e. 整車CAN網路架構

整車一般不止一個CAN網路,一般會分為動力CAN、車身CAN、底盤CAN、舒適CAN、多媒體CAN、診斷CAN等等。CAN網路裡有各種各樣的ECU節點,例如上文提到的ABM安全氣囊控制器模組,就屬於動力CAN(當然,這完全有OEM根據自身架構自己定義的)網路上,而IFC智慧前視攝像頭模組,就在AD_CAN上。CAN網路與CAN網路之間如果需要通訊,就需要搞一個閘道器(Gateway)來轉發訊號,當然這個閘道器,你可以專門搞一個控制器做閘道器,也可以拿其他有既有功能的ECU做閘道器(只要實現閘道器的功能,硬體上也有兩路CAN的收發器,兩路CAN也都接線接好了),比如說BCM車身控制器,經常就充當閘道器使用。再提一點,在這裡,遠端幀的意義就在於此了。為什麼有遠端幀,就是因為多個CAN網路的存在,閘道器需要轉發message。假設A網路有個a控制器,B網路有個b控制器,a控制器想聯絡b控制器,就需要發個遠端幀給閘道器,告訴閘道器在B網路裡b的ID,閘道器會按照a發的遠端幀的資訊,將訊息向B網路轉發(這次轉發就是普通的資料幀,不再是遠端幀了),傳遞給b控制器。最後,貼一張某主機廠某個車型的CAN網路拓撲圖,自己體會吧~

圖5 網路拓撲圖

f. CAN通訊常見配置引數彙總:

總結

綜上,介紹CAN通訊最主要的意義,其實是為了引出CAN訊息和訊號,這些訊息和訊號才是ADAS/AD開發人員感興趣的領域。本文主要是寫給一些對車輛不太瞭解的人,每當討論到自動駕駛系統從車上獲取相關訊號、併發出相關訊號的時候,讓人能夠有一定畫面感,即這個訊號到底是以哪種方式進行傳播的。