作者根據自己的工作經驗,準備寫一個關於汽車CAN總線的系列文章。該系列文章將CAN總線在汽車電子領域的應用做一個簡單的梳理,內容包括測試和開發兩個主要方面。測試方面,主要講解關於汽車CAN總線的測試項目、標準協議、測試原理和評判依據,分享一些測試過程中開發的工具,介紹下CANoe的使用和CAPL腳本;開發方面,主要講解在單片機(以STM32F407為主)上進行CAN硬體相關的配置和報文收發、Busoff相關的處理。本系列文章,從底層硬體到CAN協議的應用,內容不少,希望自己能堅持下來,為促進國家汽車行業的發展盡一份綿薄之力吧。
點擊文末閱讀原文附上了我的系列文章的規劃。
本篇作為開篇跟大家分享第一部分基礎篇的第一節內容,歡迎大家指正。本節的主要目的是簡介CAN總線的基礎知識,大家在看後面章節的時候,可以返回來快速查閱這些基礎知識。
1.1控制器在總線的連接方式
如圖1-1是兩個控制器在同一個CAN總線上的連接情況,可以看出,CAN總線採用的是兩根線進行信號傳輸,分別叫做CANH(CAN高)和CANL(CAN低),是一對雙絞線,在汽車行業,這對雙絞線的顏色是黃色(CANH)和綠色(CANL)。
圖1-1 控制器在CAN總線的連接方式
圖1-2 CAN的雙絞線
1.2 CAN的內部連接方式
CAN總線內部模塊包括CAN控制器和CAN收發器,CAN控制器負責處理CAN總線的信號,包括判斷幀類型,控制信號的接收和發送,CAN總線的故障處理,CAN控制器和CAN收發器之間是普通的單線連接。CAN控制器通過Tx線向CAN收發器發送數據,通過Rx線從CAN收發器獲取數據;CAN收發器通過CANH和CANL雙絞線連接到CAN總線,將CAN控制器發來的數據轉換為差分信號,傳輸到CAN總線,同時將CANH和CANL這組差分信號轉換為CAN控制器可以識別的信號。
圖1-3 CAN內部連接方式
1.3 CAN的報文格式
CAN的報文格式可以概括為CANID+CANData,那擴展幀舉例,如圖1-4-1所示:
圖1-4-1 CAN報文格式
圖1-4-2 CAN報文波形
CANID裡面隱藏的信息非常豐富,一幀報文,首先是CANID,然後是CAN數據,CANID首先是幀起始,然後是RTR(表明是數據幀還是遠程幀,數據幀是帶CAN數據的,遠程幀沒有CAN數據,利用這個特性可以測試採樣點),IDE表示標準幀還是擴展幀,DLC表示CAN數據的字節數(CAN最多支持8位元組數據),CRC是對CAN數據的校驗,ACK是應答位,由總線上另外一個節點來填充此位,發送節點根據此位的值確定此幀報文是否被正確接收,如果沒有正確被接收,發送節點會發送無應答錯誤幀(Not Acknowlage),對於擴展幀,還有18位的Extended ID部分。
圖1-5 CAN報文組成
1.4 CAN的錯誤機制(Busoff)
CAN總線在使用過程中,難免遇到各種情況的錯誤,比如CAN總線突然短路,或者是CANH短電了,這些都會導致CAN控制器進入錯誤狀態,當錯誤次數過多,CAN控制器就會進入Busoff狀態。
圖1-6 CAN控制器錯誤狀態
1.5 CAN總線錯誤幀講解
目前已有的資料幾乎都只是文字性的描述錯誤幀的類型,並沒有以真實波形進行演示,本文結合示波器波形進行錯誤幀的講解,如圖1-6、圖1-7、圖1-8。錯誤幀由錯誤標誌和錯誤界定符組成,錯誤標誌分為主動錯誤標誌和被動錯誤標誌,產生錯誤的CAN控制器,先進入主動錯誤狀態,發出主動錯誤標誌,為6個連續的顯性位,總線上的其他節點對該錯誤進行認可,也發出主動錯誤標誌,所以從總線上看到的主動錯誤標誌一般在6-12個顯性位;同理,當CAN控制器進入被動錯誤狀態後,發出被動錯誤標誌,書上說被動錯誤標誌為6個連續的隱性位組成,根據示波器實測,總線上接入一個CAN控制器,連續幹擾該CAN控制器的CRC界定符,讓CAN控制器發出錯誤幀,結果顯示,CAN控制器先進入主動錯誤狀態,發出6個連續的顯性位+8個隱性位的錯誤界定符,隨著幹擾次數的增加,CAN控制器進入被動錯誤狀態,發出6個連續的隱性位+6個連續的顯性位+8個隱性位的錯誤界定符。
圖1-7 幹擾CRC界定符發出的主動錯誤標誌
圖1-8 幹擾CRC界定符發出的錯誤界定符
圖1-9 幹擾CRC界定符發出的被動錯誤標誌
圖1-10 幹擾CRC界定符發出的主動和被動錯誤標誌對比