01 首語
隨著人們對汽車功能需求越來越多樣化、智能化,汽車的零部件(ECU,Electronic Control Unit)的數量也越來越多、越來越復雜,像自動駕駛、主動安全等功能加入,普通汽車搭載ECU數量大約為50-100個,而豪華智能汽車的ECU數量平均可達到300個以上。在如此龐大數量的ECU的汽車中,各個ECU之間是如何進行信息交換、共同協作,以及ECU是如何完成在線升級(OTA,On The Air)的呢?本文將介紹汽車電子中常用的通信協議——控制器局部網(CAN,Controller Area Network)。
02 CAN基礎概念介紹
CAN通信技術是由博世(BOSCH)公司于1986 年開發出面向汽車的一種通信協議,隨后通過ISO-11898和ISO-11519對其進行標準化:
1、ISO-11898:定義了通信速率為 125 kbps~1 Mbps 的高速 CAN 通信標準,屬于閉環總線,傳輸速率可達1Mbps,總線長度 ≤ 40米。
2、ISO-11519:定義了通信速率為 10~125 kbps 的低速 CAN 通信標準,屬于開環總線,傳輸速率為40kbps時,總線長度可達1000米。
CAN通信網絡是歐洲汽車網絡的標準協議,在發展過程中,其高性能和可靠性被廣泛認可,所以也會被使用在工業自動化、船舶、醫療設備、工業設備中。
CAN是異步通信,與I2C、SPI這類具有時鐘信號線的同步通信協議不同,CAN通信只有兩根信號線CAN_HIGH和CAN_LOW來組成一對差分信號線,下圖是在汽車電子中常見的ECU在CAN網絡的連接圖:

圖1 ECU連接圖
差分信號
差分信號又稱差模信號,與傳統使用單根信號線電壓表示邏輯的方式有區別,晶體管-晶體管邏輯電平(TTL)信號就是用的單根信號線的電壓值來表示邏輯值,其電平信號規定:+5V等價于邏輯1,0V等價于邏輯0。而使用差分信號傳輸時,需要兩根信號線,這兩個信號線的振幅相等,相位相反,通過兩根信號線的電壓差值(Vdiff,Voltage Difference)來表示邏輯0和邏輯1,Vdiff=CAN_H-CAN_L。CAN差分信號如下圖所示。

圖2 差分信號
CAN總線為隱性電平時代表邏輯1,CAN_H和CAN_L的電平為2.5V(電位差Vdiff為0V);
CAN總線為顯性電平時代表邏輯0,CAN_H和CAN_L的電平分別是3.5V和1.5V(電位差Vdiff為2.0V左右)。
位時序
前面提到CAN是一種異步通信,沒有時鐘信號線,其通信過程類似串口通信(Serial Communications),CAN控制器之間通過事先約定好的時序進行通信,但CAN通信還會采用位同步(Bit Synchronization)的方式來抗干擾、吸收誤差,從而使得CAN控制器可以對總線信號進行正確采樣,保證正常通信。
CAN 協議把每一個數據位的時序分解成如圖3所示的 Sync_Seg 段、Prop_Seg 段、Phase_Seg1 段、Phase_Seg2 段,這四段的長度加起來為一個 CAN 數據位的長度。最小的時間單位是 Tq(Time Quantum),一個完整的位由 8-25 個 Tq 組成。

圖3 位時間
Sync_Seg(同步段)
若通訊節點檢測到總線上信號的跳變沿被包含在 Sync_Seg段的范圍之內,則表示節點與總線的時序是同步的,當節點與總線同步時,采樣點(Sampling Point)采集到的總線電平可被認為該位的電平。Sync_Seg的大小固定為 1Tq。
Prop_Seg(傳播時間段)
這個時間段是用于補償網絡的物理延時時間。是總線上輸入比較器延時和輸出驅動器延時總和的兩倍。Prop_Seg段的大小可以為 1-8Tq。
Phase_Seg1(相位緩沖段1)
這個時間段主要用來補償邊沿階段的誤差,它的時間長度在重新同步的時候可以加長。Phase_Seg1段的初始大小可以為 1-8Tq。
Phase_Seg2(相位緩沖段2)
這個時間段也是用來補償邊沿階段誤差的,它的時間長度在重新同步時可以縮短。Phase_Seg2段的初始大小可以為 2-8Tq。
CAN收發器
ECU需要從總線中獲取CAN幀中的信號電平,轉化為邏輯電平,也就是將圖2 差分信號中的顯性電平和隱性電平轉換為對應的邏輯電平0和邏輯電平1,這樣在總線中的CAN幀就被轉換成程序中使用的CAN報文了。
這個步驟就是由CAN收發器(CAN Transceiver)來完成的,如圖1 ECU連接圖所示,其位于MCU和CAN Network之間,接收CAN總線上的CAN幀相關的信號電平并將其轉化為邏輯信息電平轉發給CAN控制器,并且也接收從CAN控制器傳輸過來的邏輯電平信息并將其轉化為信號電平傳從到CAN總線上。
03 CAN幀
CAN有五種幀的類型:數據幀(Data Frame)、遠程幀(Remote Frame)、錯誤幀(Error Frame)、間隔幀(Can Interval Frame)和過載幀(Overload Frame) ,其中最復雜的幀類型為數據幀,其作用是傳輸數據,數據長度是可變的,一個經典CAN(Classical CAN)數據幀可傳輸0-8個字節的數據(數據內容長度,不含CAN幀的控制信息),而一個CAN FD(CAN with Flexible Data rate)的可傳輸的數據長度可達64個字節,后文提到的CAN為經典CAN。CAN幀會因其ID位數的不同而不同,以ID位數分為兩類:標準幀(11位CAN Identifier)和擴展幀(29位CAN Identifier)。
標準幀
如圖4所示,一個帶有11位CAN Identifier的幀以SOF(Start Of Frame)開始,以EOF(End Of Frame)結束,其中包含五個區域,分別為仲裁區(Arbitration Field)、控制區(Control Field)、數據區(Data Field)、校驗區(CRC Field)、應答區(ACK Field)。

圖4 標準數據幀
仲裁區
這個區域包含CAN Identifier的[28:18],總共11位,其范圍為0x000-0x7FF,CAN Identifier的值越小會在CAN總線仲裁時擁有更高的優先級(Priority)。RTR位用來指示該幀是否位遠程幀(用來區分沒有數據的數據幀和遠程幀)。
控制區
IDE位用來指示該幀是否為擴展幀;r0為保留位;DLC指示該幀數據區的長度。
數據區
這里放著0-8個字節需要傳輸的數據。
校驗區
CRC(Cyclic Redundancy Check):循環冗余校驗;Delimiter:分隔符。
應答區
ACK SLOT:應答槽,發送方會將此位作為隱性電平發送,接收方成功接收后會將此位重寫,以此來讓發送方知道此幀是否被成功發送。
擴展幀
設計擴展幀的目的是為了完成對更長的CAN Identifier的傳輸,所以擴展幀中的CAN Identifier使用到了ID[28:0],一共是29位,如圖5所示,擴展幀和標準幀大致相同,只有幾個地方有一些小的區別。

圖5 擴展數據幀
SRR位(Substitute Remote Request):替代遠程請求位
r0/r1位:保留位
04 CAN控制器
雖然有相應的標準來規范CAN通信,但是不同的芯片廠商對其功能的具體實現卻各不相同,不同點主要在CAN外設在芯片中的寄存器設計,各自驅動程序自然也有區別,但在CAN總線上發出和接收的CAN幀都和標準規定的一致。下面是一些具體的例子來描述CAN控制器的大致工作機制。
Cypress Traveo II系列芯片是英飛凌專為汽車應用設計的32位MCU,其CAN控制器支持經典CAN和CAN FD(ISO 11898-1:2015)。收發CAN幀時支持多種模式,給應用帶來更多可能,方便實現不同的場景需要。
消息區
Traveo II系列MCU的CAN控制器具有一塊消息區(MRAM,Message RAM),其地址范圍與程序運行時使用的RAM地址范圍是隔離的,也就是說CAN控制器用來存儲接收/發送的CAN幀以及自身的配置信息的MRAM和程序規定的堆、棧等RAM區域是不沖突的,這樣也可以有效避免程序的可能存在的錯誤導致CAN幀的數據被篡改。圖6是Trave II MRAM中關于CAN的配置。

圖6 MRAM包含的區域
從圖中可以看出,Traveo II 的CAN控制器的MRAM的地址是以32位對齊的,從上向下看,首先是CAN ID的配置信息,根據配置CAN控制器中相關寄存器,可將CAN ID初始化為11位或29位,并將不同的CAN ID寫入不同的區域。
接下來是存儲CAN幀的關鍵區域,這里存著CAN控制器從總線接收到符合上面已經配置好的CAN ID的CAN幀、即將要發送的CAN幀,從圖中可以看出接收/發送時可以使用FIFO(實際也有Queue)模式和Buffer模式,后面會詳細介紹不同的模式的工作方式以及CAN幀的內部構造。
接收
前面提到接收有兩種工作模式,分別是FIFO(Queue)和Buffer,Buffer模式工作過程簡單,一旦有CAN幀被CAN控制器存入Buffer內,相應的中斷處理函數就會被觸發來處理對應的CAN幀。而FIFO和Queue模式就復雜一些,如圖7所示,這是一個擁有8個Rx CAN幀塊(英飛凌Traveo II官方手冊中稱為Rx Element)的FIFO區域,不難看出,有兩個關鍵的標志Get Pos和Put Pos,分別用來指示當前CAN幀獲取位置和下一個CAN幀存放位置。此時FIFO區域中已經存在了3個CAN幀等待讀取,當驅動程序將CAN幀從MRAM中讀取完畢時,會設置對應寄存器來通知CAN控制器,然后Get Pos和Put Pos會指向同一個CAN幀塊(為空狀態)。

圖7RxFIFO
如圖8所示,這是一個由CAN控制器從CAN收發器上傳來的CAN幀的內部構造,這里還是把它稱作Rx CAN幀塊,其內容包含了一些前面講到的CAN數據幀的一些控制位、數據位,還有一些是為了兼容CAN FD所預留的,這里只介紹和經典CAN的相關內容,CAN FD的大同小異。

圖8 Rx CAN幀塊
XTD位:指示該幀為標準幀還是擴展幀,若此位為0則該幀是標準幀,ID中[28:18]是有效CAN ID,即該幀CAN ID為11位;若此位為1則該幀是擴展幀,ID中[28:0]全部是有效CAN ID內容,即該幀CAN ID為29位。
RTR位:用來區分該幀為遠程請求幀還是數據幀,若此位為0則該幀是數據幀,若此位為1則該幀是遠程請求幀。
DLC[3:0]:此4位數據用來指示該幀含有的數據的字節數,本文只討論經典CAN,所以DLC規定的范圍應該在0-8字節。
R2-R3:這兩行數據就是數據幀中的數據域中的內容,經典CAN最多傳輸8個字節數據,從圖中可以看出,這樣一個CAN幀塊最大支持8個字節的數據,DB0-DB7。
發送
CAN控制發送過程就相對復雜一些,因為上層應用可能需要發多種CAN ID報文,其報文優先級有高有低,高優先級需要盡快發出,低優先級則可以在緩沖區中等待優先級更高的CAN幀發送完,再發出。

圖9 同時使用Tx Buffer和Tx FIFO
如圖9所示,當同時使用Tx Buffer和Tx FIFO時,CAN控制器每次都會掃描這些區域,當前狀態下,Tx Buffer中一個CAN ID為2的CAN幀等待發送,因為它是Tx Buffer區域中CAN ID最小的,并且比Tx FIFO中處于Get Pos的這一幀(CAN ID為4)小,所以它擁有最高優先級,這一幀將會最先被發出去,第二次CAN控制器再次掃描這些區域,發現處于Tx FIFO中Get Pos的這一幀(CAN ID為4)是這些區域中最小的(包括Tx Buffer),所以第二次將會發送CAN ID為4的這一幀,如此往復,直到這些區域內的所有Tx CAN幀塊被全部通過CAN收發器轉換為信號電平發送到總線上。

圖10 Tx Element
如圖10所示,與Rx Element類似,XTD、RTR、ID、DLC以及DB0-DB7的用法與Rx Element一致,只有部分內容有不同。
MM[7:0]:Message Marker,這是一個與發送事件(Tx Event)相關的信息。
EFC(Event FIFO Control)位:該位表示該幀是否有將發送事件存在對應的MRAM中。
FDF位:此位用來標識該幀是否為一個CAN FD幀。
BRS(Bit Rate Switching)位:當該幀位CAN FD幀(即FDF為1時),此位才有效,決定該幀在發送時是否啟用速率切換(Rate Switching),以更高的速度傳輸。
更多與Traveo II發送和接收CAN幀相關的細節,大家可以去查閱英飛凌提供的技術手冊TRM。
05 總結
CAN通信已經存在了相當長的時間了,其強大的性能和相對高的穩定性讓其不僅在汽車領域大顯身手,還被廣泛用在各種有性能和穩定性有要求的領域,但在人民日益增長的需求下,其缺點被逐漸放大,例如其每一幀的數據負載量較小(每一幀都需要帶有CANID和一些控制信息)、速率有限,好在CANFD的出現,將每一幀可傳輸的字節數增加至64字節,并增加了波特率,極大的改進了經典CAN通信。
隨著時代的變化,大家對新能源車的要求越來越高,更復雜的娛樂功能、高級輔助駕駛、自動駕駛功能等等,CAN通信在這些功能的就有點力不從心了,現在出現FlexRay、車載以太網等一些新的通信技術,隨著這些有趣的技術快速發展,讓我們來看看會發生什么。
電子發燒友App
















評論