戰(zhàn)配置與排錯指南)
1. 項(xiàng)目概述為什么我們需要一份“總結(jié)的最好”的CAN入門教程在汽車電子、工業(yè)控制、軌道交通這些領(lǐng)域摸爬滾打十幾年我發(fā)現(xiàn)一個挺有意思的現(xiàn)象無論是剛?cè)胄械墓こ處熯€是需要跨領(lǐng)域協(xié)作的軟件開發(fā)者一提到CAN總線很多人第一反應(yīng)是“復(fù)雜”、“一堆協(xié)議”、“調(diào)試起來頭疼”。網(wǎng)上能找到的資料要么是標(biāo)準(zhǔn)協(xié)議的冰冷翻譯要么是某個特定芯片的寄存器配置手冊真正能把CAN從“是什么”、“為什么”到“怎么用”講透的少之又少。大家需要的不是一本字典而是一張清晰的地圖和一份可靠的“避坑指南”。這就是我動手整理這份教程的初衷——它不是最學(xué)術(shù)的但力求是最實(shí)用、最接地氣、最能幫你快速上手的“總結(jié)的最好一版”。CAN全稱Controller Area Network控制器局域網(wǎng)。它本質(zhì)上是一種串行通信協(xié)議但它的設(shè)計(jì)初衷決定了它的與眾不同高可靠性、多主架構(gòu)、基于優(yōu)先級的非破壞性仲裁。簡單來說它就像一個高效的會議系統(tǒng)多個設(shè)備節(jié)點(diǎn)可以隨時發(fā)言發(fā)送數(shù)據(jù)但如果有兩個人同時開口優(yōu)先級高的那個會繼續(xù)說下去優(yōu)先級低的會自動閉嘴聆聽不會發(fā)生數(shù)據(jù)碰撞和丟失。這種特性讓它在對安全性和實(shí)時性要求極高的場合比如汽車的剎車、油門控制工業(yè)機(jī)器的協(xié)同作業(yè)中成為了不可替代的“神經(jīng)系統(tǒng)”。你可能會在各種各樣的場景里遇到它在汽車?yán)锇l(fā)動機(jī)控制單元ECU和車身控制器通過CAN交換車速、轉(zhuǎn)速、車門狀態(tài)在工廠里PLC通過CAN控制一排伺服驅(qū)動器同步運(yùn)動甚至在一些無人機(jī)和機(jī)器人項(xiàng)目中主控制器和各個傳感器、執(zhí)行器之間也用它來通信。理解CAN已經(jīng)成為嵌入式、汽車電子、自動化領(lǐng)域工程師的一項(xiàng)核心技能。這份教程的目標(biāo)就是幫你繞過那些晦澀的術(shù)語和分散的知識點(diǎn)直接抓住CAN的“七寸”從理論到實(shí)踐從配置到調(diào)試構(gòu)建一個完整且堅(jiān)固的知識體系。2. CAN協(xié)議核心思想與幀結(jié)構(gòu)深度拆解要玩轉(zhuǎn)CAN死記硬背幀格式是沒用的必須理解其設(shè)計(jì)哲學(xué)。CAN協(xié)議的所有精妙之處都源于它必須在一個嘈雜、復(fù)雜、且要求極高的實(shí)時環(huán)境中可靠工作。2.1 多主與仲裁沒有“領(lǐng)導(dǎo)”的高效會議這是CAN最核心、也最反直覺的特性。我們熟悉的I2C、UART等總線通常有明確的主從之分主設(shè)備控制通信節(jié)奏。但CAN是“多主”的總線上任何一個節(jié)點(diǎn)只要檢測到總線空閑就可以主動發(fā)起通信。這就像一場沒有主持人的圓桌討論。那么問題來了如果兩個甚至多個節(jié)點(diǎn)同時開始發(fā)言怎么辦CAN用了一套極其巧妙的“非破壞性逐位仲裁”機(jī)制來解決。每個CAN數(shù)據(jù)幀都有一個標(biāo)識符ID這個ID不僅用于識別報文內(nèi)容更決定了報文的優(yōu)先級——ID值越小優(yōu)先級越高。在發(fā)送數(shù)據(jù)的同時每個節(jié)點(diǎn)也在監(jiān)聽總線電平。CAN總線使用“線與”邏輯顯性電平邏輯0會覆蓋隱性電平邏輯1。當(dāng)兩個節(jié)點(diǎn)同時發(fā)送時它們從ID的最高位開始逐位向外發(fā)送并回讀比較。一旦某個節(jié)點(diǎn)發(fā)送了隱性位1但監(jiān)聽到的是顯性位0它就立刻意識到有更高優(yōu)先級的報文在發(fā)送于是自動退出發(fā)送狀態(tài)轉(zhuǎn)為接收狀態(tài)等待總線空閑后重試。這個過程對正在發(fā)送的高優(yōu)先級報文沒有任何影響數(shù)據(jù)不會損壞。舉個例子節(jié)點(diǎn)A要發(fā)送ID為0x15A(二進(jìn)制 0001 0101 1010)節(jié)點(diǎn)B要發(fā)送ID為0x18B(二進(jìn)制 0001 1000 1011)。它們同時開始發(fā)送。前4位0001相同相安無事。到第5位A發(fā)“0”顯性B發(fā)“1”隱性。B監(jiān)聽到總線是“0”知道自己輸了立刻閉嘴。A則渾然不覺地繼續(xù)發(fā)送完整個幀。這個機(jī)制保證了最高優(yōu)先級的消息總能以最短的延遲發(fā)出這對于剎車信號、故障報警等關(guān)鍵信息至關(guān)重要。2.2 標(biāo)準(zhǔn)幀與擴(kuò)展幀如何選擇標(biāo)識符CAN幀主要分兩種標(biāo)準(zhǔn)幀CAN 2.0A和擴(kuò)展幀CAN 2.0B。它們的核心區(qū)別在于標(biāo)識符的長度。標(biāo)準(zhǔn)幀使用11位標(biāo)識符理論上可以有2048個不同的ID。它的幀結(jié)構(gòu)相對緊湊開銷小。在早期或?qū)D需求不多的網(wǎng)絡(luò)中廣泛應(yīng)用。擴(kuò)展幀使用29位標(biāo)識符ID空間高達(dá)5億多個。它兼容標(biāo)準(zhǔn)幀但幀結(jié)構(gòu)多了18位的擴(kuò)展ID和兩個替代遠(yuǎn)程請求位SRR、IDE。擴(kuò)展幀的出現(xiàn)主要是為了滿足日益復(fù)雜的網(wǎng)絡(luò)架構(gòu)比如在整車網(wǎng)絡(luò)中需要為不同供應(yīng)商、不同功能的ECU分配獨(dú)一無二且具有層次結(jié)構(gòu)的ID。如何選擇這沒有絕對答案但有幾個原則項(xiàng)目/行業(yè)規(guī)范優(yōu)先汽車行業(yè)有諸如J1939商用車、CANopen工業(yè)等高層協(xié)議它們嚴(yán)格規(guī)定了ID的分配規(guī)則包括是11位還是29位。必須遵守。網(wǎng)絡(luò)復(fù)雜度如果節(jié)點(diǎn)數(shù)量多報文種類繁雜且未來可能擴(kuò)展29位ID提供了巨大的規(guī)劃空間。帶寬考慮擴(kuò)展幀比標(biāo)準(zhǔn)幀多出幾個字節(jié)的開銷。在帶寬極其緊張如500kbps以下且報文發(fā)送頻率很高的網(wǎng)絡(luò)中使用標(biāo)準(zhǔn)幀可以節(jié)省寶貴的總線時間。控制器支持確保你使用的CAN控制器硬件同時支持兩種格式。現(xiàn)在的控制器基本都支持。注意標(biāo)準(zhǔn)幀和擴(kuò)展幀可以共存于同一網(wǎng)絡(luò)中因?yàn)樗鼈兊膸鹗糞OF和仲裁場格式不同控制器能夠正確識別。但你需要妥善規(guī)劃ID避免沖突和誤解。2.3 數(shù)據(jù)幀、遠(yuǎn)程幀、錯誤幀與過載幀詳解CAN通信不止是發(fā)送數(shù)據(jù)還有一套完整的“對話”機(jī)制。數(shù)據(jù)幀最常用的幀攜帶實(shí)際數(shù)據(jù)。它由以下字段組成幀起始SOF一個顯性位標(biāo)志幀開始同步所有節(jié)點(diǎn)。仲裁場包含標(biāo)識符ID和遠(yuǎn)程傳輸請求位RTR顯性表示數(shù)據(jù)幀。控制場包含標(biāo)識符擴(kuò)展位IDE、保留位r0和數(shù)據(jù)長度碼DLC0-8字節(jié)。數(shù)據(jù)場實(shí)際要傳輸?shù)臄?shù)據(jù)0-8字節(jié)。這是CAN幀的載荷部分。CRC場15位循環(huán)冗余校驗(yàn)碼1位CRC界定符用于接收方校驗(yàn)數(shù)據(jù)在傳輸過程中是否出錯。應(yīng)答場包括應(yīng)答間隙ACK SLOT和應(yīng)答界定符。任何正確接收到數(shù)據(jù)幀的節(jié)點(diǎn)無論是不是目標(biāo)節(jié)點(diǎn)都會在ACK SLOT位發(fā)送一個顯性位向發(fā)送節(jié)點(diǎn)確認(rèn)“我收到了”。如果發(fā)送節(jié)點(diǎn)沒收到這個確認(rèn)它會認(rèn)為傳輸失敗并啟動重發(fā)。這是一個重要的分布式錯誤確認(rèn)機(jī)制。幀結(jié)束EOF7個連續(xù)的隱性位標(biāo)志幀結(jié)束。遠(yuǎn)程幀它的作用是“請求數(shù)據(jù)”。當(dāng)一個節(jié)點(diǎn)需要另一個節(jié)點(diǎn)發(fā)送特定ID的數(shù)據(jù)時它可以發(fā)送一個遠(yuǎn)程幀。遠(yuǎn)程幀的RTR位為隱性且沒有數(shù)據(jù)場。ID指明了它希望請求的數(shù)據(jù)類型。接收到對應(yīng)遠(yuǎn)程幀的節(jié)點(diǎn)應(yīng)盡快發(fā)送一個具有相同ID的數(shù)據(jù)幀作為響應(yīng)。這在主從查詢式通信中很有用但在真正的多主CAN網(wǎng)絡(luò)中更常見的做法是節(jié)點(diǎn)周期性地主動發(fā)送數(shù)據(jù)生產(chǎn)者/消費(fèi)者模型遠(yuǎn)程幀使用較少。錯誤幀這是CAN實(shí)現(xiàn)高可靠性的關(guān)鍵。任何節(jié)點(diǎn)檢測到錯誤如位錯誤、填充錯誤、CRC錯誤、格式錯誤都會立即發(fā)送一個錯誤幀主動“打斷”當(dāng)前報文傳輸通知所有節(jié)點(diǎn)“剛才的報文有問題請丟棄”。錯誤幀由錯誤標(biāo)志6個連續(xù)的顯性或隱性位破壞幀格式和錯誤界定符8個隱性位組成。發(fā)送錯誤幀是一種負(fù)責(zé)任的行為防止錯誤數(shù)據(jù)被誤用。過載幀當(dāng)某個節(jié)點(diǎn)的接收處理速度跟不上總線速度時它可以發(fā)送過載幀請求相鄰幀之間增加額外的延遲。類似于說“等等我還沒處理完上一幀”。在實(shí)際應(yīng)用中設(shè)計(jì)良好的節(jié)點(diǎn)不應(yīng)頻繁觸發(fā)過載幀。理解這四種幀特別是數(shù)據(jù)幀的每個字段和錯誤幀的作用是進(jìn)行CAN通信和故障診斷的基礎(chǔ)。3. 物理層與網(wǎng)絡(luò)搭建從理論到接線的實(shí)戰(zhàn)指南協(xié)議棧再完美最終都要跑在物理線纜上。物理層的穩(wěn)定性直接決定了整個CAN網(wǎng)絡(luò)的通信質(zhì)量。3.1 CAN-H與CAN-L差分信號的奧秘CAN使用差分信號傳輸即用CAN-H和CAN-L兩根線的電壓差來表示邏輯狀態(tài)。隱性邏輯1CAN-H和CAN-L電壓接近差分電壓約0V。此時總線處于空閑或 recessive 狀態(tài)。顯性邏輯0CAN-H電壓拉高典型值比VCAN高CAN-L電壓拉低典型值比GND低產(chǎn)生一個大約2V的差分電壓。差分傳輸?shù)膬?yōu)勢在于強(qiáng)大的抗共模干擾能力。外部的電磁干擾EMI通常會同時、同等地影響兩根線而接收器只關(guān)心兩者的電壓差因此干擾被極大地抵消了。這就是CAN能在汽車引擎艙這種惡劣電磁環(huán)境中穩(wěn)定工作的原因。接線實(shí)操要點(diǎn)雙絞線是必須的CAN_H和CAN_L必須緊密雙絞。絞合度越高如每米33絞抗干擾能力越強(qiáng)。切勿使用平行線或網(wǎng)線中的非雙絞線對。線纜選擇推薦使用帶屏蔽層的雙絞線如CAN專用電纜。屏蔽層應(yīng)在單點(diǎn)良好接地通常選擇在網(wǎng)絡(luò)的中心點(diǎn)或主設(shè)備處接地避免形成地環(huán)路。極性不能反CAN_H和CAN_L必須正確連接。接反會導(dǎo)致無法通信因?yàn)椴罘中盘枠O性反了。3.2 終端電阻為什么是120Ω怎么接這是新手最容易出錯的地方。CAN總線兩端必須各接一個120Ω的終端電阻并聯(lián)在CAN_H和CAN_L之間。為什么信號在傳輸線末端會發(fā)生反射反射波與原始波疊加會造成信號畸變振鈴導(dǎo)致位錯誤。終端電阻的作用是阻抗匹配消除反射。雙絞線CAN總線的特征阻抗大約是120Ω在兩端并聯(lián)120Ω電阻等于在線路兩端都接上了匹配阻抗信號能量被吸收不再反射。怎么接位置必須在物理上位于總線最遠(yuǎn)的兩個末端節(jié)點(diǎn)處。如果網(wǎng)絡(luò)是直線型“手拉手”結(jié)構(gòu)那么就是第一個和最后一個節(jié)點(diǎn)。方式通常終端電阻被集成在CAN收發(fā)器模塊或開發(fā)板上通過一個跳線帽或撥碼開關(guān)來啟用/禁用。對于自己搭建的節(jié)點(diǎn)需要焊接一個120Ω1/4W精度的電阻。數(shù)量有且只有兩個網(wǎng)絡(luò)中任何其他位置都不應(yīng)再接終端電阻。我曾見過有人在中間節(jié)點(diǎn)也接了電阻導(dǎo)致總線等效電阻變?yōu)?0Ω驅(qū)動能力不足通信距離大幅縮短。測量驗(yàn)證在斷電狀態(tài)下用萬用表測量總線任意一點(diǎn)的CAN_H與CAN_L之間的電阻。如果網(wǎng)絡(luò)只有兩個終端電阻測得的電阻值應(yīng)該大約是60Ω兩個120Ω并聯(lián)。這是一個快速判斷終端電阻是否正確的有效方法。3.3 網(wǎng)絡(luò)拓?fù)洹⒉ㄌ芈逝c節(jié)點(diǎn)數(shù)限制拓?fù)浣Y(jié)構(gòu)推薦使用線性總線拓?fù)渲鞲删€支線。所有節(jié)點(diǎn)通過盡可能短的支線Stub連接到主干線上。支線長度越短越好一般建議不超過0.3米否則會引起信號反射問題。波特率與通信距離這是一對矛盾。波特率越高允許的通信距離越短對布線要求也越高。這是由信號邊沿時間和在電纜上的傳播延遲決定的。一個經(jīng)典的經(jīng)驗(yàn)關(guān)系如下僅供參考實(shí)際以控制器和收發(fā)器規(guī)格為準(zhǔn)波特率理論最大距離近似典型應(yīng)用場景1 Mbps40 米車內(nèi)高速網(wǎng)絡(luò)如發(fā)動機(jī)、變速箱500 kbps100 米車身控制、中速網(wǎng)絡(luò)250 kbps250 米工業(yè)控制、診斷接口125 kbps500 米低速車身網(wǎng)絡(luò)如舒適系統(tǒng)50 kbps1 公里大型車輛如卡車、客車節(jié)點(diǎn)數(shù)限制主要受限于CAN收發(fā)器的驅(qū)動能力和節(jié)點(diǎn)的輸入阻抗。一個標(biāo)準(zhǔn)的CAN收發(fā)器如TJA1050通常可以驅(qū)動最多110個節(jié)點(diǎn)。在實(shí)際項(xiàng)目中幾十個節(jié)點(diǎn)已經(jīng)是很龐大的網(wǎng)絡(luò)了。4. 控制器配置與軟件驅(qū)動核心要點(diǎn)理解了協(xié)議和物理層下一步就是讓微控制器MCU里的CAN控制器動起來。這里涉及到寄存器配置和驅(qū)動編寫。4.1 工作模式正常模式、只聽模式與回環(huán)模式CAN控制器通常有幾種工作模式用于不同場景正常模式控制器既能發(fā)送也能接收參與總線通信。這是常規(guī)操作模式。只聽模式控制器只接收總線上的幀不發(fā)送任何內(nèi)容包括ACK位和錯誤幀。這個模式非常有用網(wǎng)絡(luò)監(jiān)聽與分析在不干擾總線的情況下監(jiān)聽所有通信用于調(diào)試和逆向工程。“熱插拔”學(xué)習(xí)新節(jié)點(diǎn)上線前可以先在只聽模式下學(xué)習(xí)總線的波特率和報文ID再進(jìn)行配置。回環(huán)模式控制器將自己發(fā)送的幀同時回饋給自己的接收緩沖區(qū)不與外部總線交互。用于在不連接真實(shí)CAN網(wǎng)絡(luò)的情況下測試軟件發(fā)送和接收流程是否正確。注意回環(huán)模式下無法測試物理層和總線仲裁等特性。在初始化控制器時應(yīng)根據(jù)需求正確設(shè)置模式。一個穩(wěn)健的驅(qū)動初始化流程通常是進(jìn)入軟件復(fù)位或初始化模式 - 配置波特率、驗(yàn)收濾波器、工作模式 - 退出初始化模式進(jìn)入正常工作/只聽模式。4.2 波特率配置與計(jì)算BRP, SJW, TSeg1, TSeg2這是配置中最容易算錯的一步。CAN的波特率由系統(tǒng)時鐘APB Clock通過一個位時間Bit Time分頻而來。一個位時間被劃分為幾個不重疊的段同步段Sync Seg固定為1個時間份額Time Quantum, Tq。用于同步總線上的邊沿。時間段1Tseg1包括傳播段Prop Seg和相位緩沖段1Phase Seg1。用于補(bǔ)償信號在總線上的物理延遲和邊沿相位誤差。時間段2Tseg2即相位緩沖段2Phase Seg2。用于在采樣點(diǎn)后進(jìn)行微調(diào)。計(jì)算公式波特率 系統(tǒng)時鐘 / (BRP * (1 Tseg1 Tseg2))其中BRP是波特率預(yù)分頻器決定了1個Tq的時間長度。配置要點(diǎn)與經(jīng)驗(yàn)采樣點(diǎn)通常推薦采樣點(diǎn)位于一個位時間的75%-80%處。采樣點(diǎn) (1 Tseg1) / (1 Tseg1 Tseg2)。例如Tseg113, Tseg22則位時間總長度為16Tq采樣點(diǎn)在 (113)/16 87.5%。這個位置能較好地避開信號邊沿的振鈴區(qū)域保證采樣穩(wěn)定。同步跳轉(zhuǎn)寬度SJW定義了控制器在一次重新同步時可以調(diào)整的最大Tq數(shù)。通常設(shè)置為Tseg1和Tseg2中較小的那個但不超過4。一般設(shè)為1或2即可。實(shí)用方法很多MCU廠商如ST、NXP提供了圖形化的配置工具如STM32CubeMX你只需輸入期望的波特率和系統(tǒng)時鐘工具會自動計(jì)算并推薦一組合規(guī)的BRP、Tseg1、Tseg2值。對于新手強(qiáng)烈建議使用這些工具生成初始配置再對照手冊理解其含義。4.3 驗(yàn)收濾波器硬件級的報文篩選利器CAN控制器通常集成有硬件驗(yàn)收濾波器。它的作用是在報文到達(dá)CPU引發(fā)中斷之前就根據(jù)ID進(jìn)行過濾只有匹配的報文才會被存入接收郵箱FIFO并通知CPU。這能極大地減輕CPU的中斷負(fù)載。濾波器有兩種基本工作模式標(biāo)識符列表模式濾波器像一個“白名單”只接收ID與預(yù)設(shè)值完全相等的報文。標(biāo)識符掩碼模式濾波器像一個“模式匹配器”。你設(shè)置一個“驗(yàn)收碼”和一個“掩碼碼”。掩碼位為1表示對應(yīng)ID位必須與驗(yàn)收碼嚴(yán)格匹配掩碼位為0表示對應(yīng)ID位不關(guān)心可以是0或1。這允許接收一個ID范圍內(nèi)的報文。配置示例假設(shè)你想接收標(biāo)準(zhǔn)幀ID為0x123和0x124的報文。列表模式需要兩個濾波器項(xiàng)分別設(shè)為0x123和0x124。掩碼模式可以只用一個濾波器。設(shè)置驗(yàn)收碼為0x123掩碼碼為0x7FE二進(jìn)制111 1111 1110。因?yàn)?x1230001 0010 0011和0x1240001 0010 0100只有最后一位不同。掩碼碼最后一位為0表示不關(guān)心這一位從而同時匹配兩個ID。經(jīng)驗(yàn)之談合理規(guī)劃和使用濾波器是優(yōu)化CAN驅(qū)動性能的關(guān)鍵。對于高頻、關(guān)鍵的報文使用精確的列表模式。對于需要接收一組同類報文如所有溫度傳感器數(shù)據(jù)使用掩碼模式可以節(jié)省濾波器資源。務(wù)必注意擴(kuò)展幀的濾波器配置和標(biāo)準(zhǔn)幀是分開的且更復(fù)雜需要仔細(xì)查閱芯片手冊。5. 應(yīng)用層協(xié)議與數(shù)據(jù)解析讓數(shù)據(jù)有意義原始的CAN數(shù)據(jù)幀只是0-8字節(jié)的二進(jìn)制數(shù)據(jù)。如何解讀它們這就需要應(yīng)用層協(xié)議。5.1 數(shù)據(jù)打包信號、字節(jié)序與縮放一個CAN幀的8個字節(jié)可能包含了多個物理信號。例如一個幀可能同時包含車速2字節(jié)、發(fā)動機(jī)轉(zhuǎn)速2字節(jié)、水溫1字節(jié)等多個信號。這就需要定義一套“打包規(guī)則”。信號定義明確每個信號在數(shù)據(jù)場中的起始位置從哪個字節(jié)的第幾位開始、長度占多少位、數(shù)據(jù)類型無符號數(shù)、有符號數(shù)、IEEE浮點(diǎn)數(shù)。字節(jié)序即Motorola序大端序和Intel序小端序。這是最容易出錯的地方Motorola序大端序信號的高位字節(jié)存儲在低地址字節(jié)。在一個字節(jié)內(nèi)部高位MSB在位編號小的位置。這是汽車行業(yè)如J1939最常用的格式。Intel序小端序信號的低位字節(jié)存儲在低地址字節(jié)。在一個字節(jié)內(nèi)部MSB在位編號大的位置。這在PC領(lǐng)域和某些控制器中常見。 解析數(shù)據(jù)時必須嚴(yán)格按照信號定義的字節(jié)序來處理否則讀出的數(shù)值將是完全錯誤的。縮放與偏移從原始數(shù)值Raw Value到工程值Physical Value的轉(zhuǎn)換。公式通常是物理值 原始值 * 因子 偏移量。例如原始值0-255可能對應(yīng)水溫-40°C到215°C那么因子就是1偏移量就是-40。5.2 常見高層協(xié)議簡介為了標(biāo)準(zhǔn)化通信行業(yè)制定了許多基于CAN的高層協(xié)議CANopen廣泛應(yīng)用于工業(yè)自動化PLC、伺服驅(qū)動器、I/O模塊。它定義了對象字典、服務(wù)數(shù)據(jù)對象SDO、過程數(shù)據(jù)對象PDO、網(wǎng)絡(luò)管理NMT等機(jī)制功能非常完善。J1939商用車卡車、客車、工程機(jī)械的標(biāo)準(zhǔn)協(xié)議。它詳細(xì)規(guī)定了參數(shù)組編號PGN、可疑參數(shù)編號SPN、多包傳輸、車輛網(wǎng)絡(luò)管理等。DeviceNet基于CAN的工業(yè)網(wǎng)絡(luò)協(xié)議由ODVA管理常用于工廠自動化。ISO-TP用于在CAN上傳輸超過8字節(jié)的長數(shù)據(jù)是實(shí)現(xiàn)UDS診斷等服務(wù)的基礎(chǔ)。在開始一個項(xiàng)目前首先要明確是否需要遵循某個高層協(xié)議。如果只是內(nèi)部幾個設(shè)備通信可以自定義簡單的私有協(xié)議如果涉及行業(yè)設(shè)備互聯(lián)則必須采用相應(yīng)的標(biāo)準(zhǔn)協(xié)議。5.3 解析實(shí)戰(zhàn)手動解析一個CAN幀假設(shè)我們收到一個標(biāo)準(zhǔn)數(shù)據(jù)幀ID0x101數(shù)據(jù)場為0x12 0x34 0x56 0x78。 協(xié)議定義該ID幀包含兩個信號信號A無符號16位整數(shù)起始字節(jié)0起始位0Motorola序。因子0.1偏移0。單位kPa。信號B無符號16位整數(shù)起始字節(jié)2起始位0Motorola序。因子1偏移-100。單位°C。解析過程數(shù)據(jù)場Byte00x12, Byte10x34, Byte20x56, Byte30x78。解析信號AMotorola序起始字節(jié)0長度2字節(jié)。Motorola序意味著高字節(jié)在前。所以信號A的原始值 Byte0作為高8位Byte1作為低8位。原始值 0x12 * 256 0x34 0x1234 4660十進(jìn)制。物理值 4660 * 0.1 0 466.0 kPa。解析信號BMotorola序起始字節(jié)2長度2字節(jié)。原始值 Byte2 * 256 Byte3 0x56 * 256 0x78 0x5678 22136。物理值 22136 * 1 (-100) 22036 °C。顯然這個溫度值不合理可能是示例數(shù)據(jù)或需要進(jìn)一步檢查縮放因子通過這個例子可以看到?jīng)]有正確的協(xié)議定義這8個字節(jié)就是毫無意義的天書。在實(shí)際項(xiàng)目中通常會使用像Vector CANdb這樣的工具來編輯和管理數(shù)據(jù)庫文件.dbc然后通過庫函數(shù)如libcanard,CANmapping或代碼生成工具來輔助解析和打包避免手動計(jì)算出錯。6. 調(diào)試、排錯與性能優(yōu)化實(shí)戰(zhàn)經(jīng)驗(yàn)理論配置都完成了但通信不通或者時好時壞這才是工程師的日常。下面分享一些硬核的調(diào)試經(jīng)驗(yàn)和排錯思路。6.1 基礎(chǔ)檢查清單當(dāng)CAN通信不通時按照從外到內(nèi)、從硬件到軟件的順序排查物理連接線接對了嗎CAN_H、CAN_L、GND是否都正確連接終端電阻加了嗎阻值對嗎≈60Ω位置對嗎只在兩端用示波器或萬用表測量CAN_H和CAN_L對地電壓。在總線空閑時CAN_H約2.5VCAN_L約2.5V差分電壓約0V。當(dāng)發(fā)送顯性位時CAN_H會跳到~3.5VCAN_L會跳到~1.5V差分電壓約2V。如果電壓異常檢查收發(fā)器供電和接線。波特率這是最常見的“軟”錯誤。總線上所有節(jié)點(diǎn)的波特率必須嚴(yán)格一致包括BRP、Tseg1、Tseg2所有參數(shù)。哪怕有一個節(jié)點(diǎn)不同整個網(wǎng)絡(luò)就無法正常通信。可以用“只聽模式”監(jiān)聽總線看是否能收到亂碼或錯誤幀這常常是波特率不匹配的表現(xiàn)。控制器初始化是否成功進(jìn)入了初始化模式并配置了寄存器工作模式設(shè)置正確嗎正常/只聽/回環(huán)驗(yàn)收濾波器配置是否過于嚴(yán)格導(dǎo)致所有報文都被過濾掉了可以嘗試先關(guān)閉濾波器接收所有ID。軟件驅(qū)動發(fā)送函數(shù)真的被調(diào)用了嗎發(fā)送郵箱是否空閑接收中斷使能了嗎接收FIFO溢出嗎檢查芯片手冊的CAN章節(jié)是否有特殊的時鐘使能位或引腳復(fù)用配置被遺漏6.2 使用CAN分析儀進(jìn)行深度診斷一個USB-CAN分析儀如周立功、PCAN、ValueCAN是調(diào)試CAN的“眼睛”。結(jié)合上位機(jī)軟件如CANalyzer, CANoe, 或廠商自帶的工具你可以監(jiān)聽總線查看所有活動的報文確認(rèn)是否有數(shù)據(jù)在傳輸。發(fā)送報文手動構(gòu)造并發(fā)送特定ID和數(shù)據(jù)的幀用于測試單個節(jié)點(diǎn)的接收功能。統(tǒng)計(jì)信息查看錯誤幀計(jì)數(shù)、負(fù)載率等。持續(xù)出現(xiàn)的錯誤幀是排查重點(diǎn)。解碼如果導(dǎo)入了.dbc數(shù)據(jù)庫文件軟件可以將原始數(shù)據(jù)直接解析成有物理意義的信號值極大提升調(diào)試效率。一個典型診斷案例節(jié)點(diǎn)A發(fā)送節(jié)點(diǎn)B收不到。用分析儀監(jiān)聽發(fā)現(xiàn)總線上根本沒有節(jié)點(diǎn)A發(fā)出的ID的報文。問題定位在發(fā)送方。檢查節(jié)點(diǎn)A的發(fā)送代碼、波特率配置、控制器模式。發(fā)現(xiàn)其CAN控制器時鐘未使能。修復(fù)后分析儀能看到報文了但節(jié)點(diǎn)B還是收不到。分析儀顯示報文發(fā)送正常且ACK位被正確回復(fù)說明總線上至少有一個其他節(jié)點(diǎn)收到了。問題定位在接收方。檢查節(jié)點(diǎn)B的驗(yàn)收濾波器發(fā)現(xiàn)其濾波器只允許ID為0x100的報文通過而節(jié)點(diǎn)A發(fā)送的ID是0x101。修改濾波器后通信正常。6.3 總線錯誤狀態(tài)與故障處理CAN節(jié)點(diǎn)內(nèi)部有一個錯誤狀態(tài)機(jī)包含三種狀態(tài)錯誤主動節(jié)點(diǎn)正常工作可以正常發(fā)送和接收檢測到錯誤時發(fā)送主動錯誤標(biāo)志。錯誤被動節(jié)點(diǎn)發(fā)送和接收錯誤計(jì)數(shù)超過127進(jìn)入此狀態(tài)。它仍能通信但發(fā)送錯誤幀時只能發(fā)送被動的錯誤標(biāo)志連續(xù)的隱性位并且每幀之間需要等待額外時間。這是一個警告狀態(tài)。總線關(guān)閉節(jié)點(diǎn)發(fā)送錯誤計(jì)數(shù)超過255。控制器將自動斷開與總線的連接停止任何發(fā)送和接收。通常需要軟件干預(yù)或硬件復(fù)位才能恢復(fù)。常見錯誤原因及對策位錯誤發(fā)送的位與監(jiān)聽到的位不一致。可能原因波特率不匹配、總線終端電阻問題、節(jié)點(diǎn)距離過遠(yuǎn)導(dǎo)致信號邊沿畸變。填充錯誤在幀的特定字段SOF到CRC序列中出現(xiàn)了連續(xù)6個相同的位違反了位填充規(guī)則。幾乎總是由波特率嚴(yán)重不匹配或強(qiáng)烈的電磁干擾引起。CRC錯誤接收方計(jì)算的CRC與報文中的CRC不符。表明數(shù)據(jù)在傳輸過程中因干擾發(fā)生了改變。檢查布線環(huán)境加強(qiáng)屏蔽。格式錯誤幀格式不符合標(biāo)準(zhǔn)如固定格式位出現(xiàn)非法電平。可能是控制器故障或軟件配置錯誤。當(dāng)節(jié)點(diǎn)頻繁進(jìn)入錯誤被動或總線關(guān)閉狀態(tài)時必須使用分析儀檢查總線波形并系統(tǒng)性地排查物理層問題接地、屏蔽、終端電阻、線纜質(zhì)量、節(jié)點(diǎn)電源穩(wěn)定性。6.4 網(wǎng)絡(luò)負(fù)載率計(jì)算與優(yōu)化總線負(fù)載率是衡量CAN網(wǎng)絡(luò)健康度的重要指標(biāo)。負(fù)載率 (總線上傳輸所有位的時間) / (統(tǒng)計(jì)時間窗口)。負(fù)載率過高會導(dǎo)致報文延遲增加甚至丟幀。估算負(fù)載率一個簡單的估算公式是考慮最壞情況。假設(shè)總線波特率為500kbps即每比特2μs。一個標(biāo)準(zhǔn)數(shù)據(jù)幀包含填充位最長達(dá)111位遠(yuǎn)程幀最長達(dá)91位。如果有一個ID的報文以100ms周期發(fā)送那么它占用的帶寬為111 bit * 2μs/bit / 0.1s 0.222%。累加所有周期性報文的占用率再加上事件觸發(fā)報文的估算值就可以得到總負(fù)載率。優(yōu)化建議負(fù)載率目標(biāo)對于關(guān)鍵控制系統(tǒng)建議平均負(fù)載率不超過30%-40%峰值不超過70%。給總線留出處理突發(fā)事件和錯誤重發(fā)的余量。優(yōu)化手段提高波特率在距離允許的情況下使用更高的波特率可以顯著降低同一數(shù)據(jù)量的負(fù)載率。優(yōu)化發(fā)送周期非關(guān)鍵信號可以適當(dāng)降低發(fā)送頻率。合并報文將多個關(guān)聯(lián)性強(qiáng)的信號打包到同一幀中發(fā)送減少幀頭開銷。使用CAN FD如果需要傳輸大量數(shù)據(jù)考慮升級到CAN FD靈活數(shù)據(jù)速率它允許在數(shù)據(jù)段使用更高的波特率大幅提升有效數(shù)據(jù)吞吐量。7. 進(jìn)階話題與未來展望掌握了基礎(chǔ)我們可以看看更深入的話題和CAN技術(shù)的發(fā)展。7.1 CAN FD更快、更強(qiáng)的升級版CAN FDFlexible Data-rate是對經(jīng)典CAN的增強(qiáng)主要解決兩個問題數(shù)據(jù)場長度限制和帶寬瓶頸。更長的數(shù)據(jù)場數(shù)據(jù)長度可以從0字節(jié)擴(kuò)展到最多64字節(jié)滿足了現(xiàn)代汽車更多數(shù)據(jù)交換的需求如刷寫ECU軟件、傳輸大量診斷數(shù)據(jù)。可變速率采用雙波特率。仲裁段到CRC界定符之前使用標(biāo)準(zhǔn)的、較低的波特率以保證可靠的仲裁和兼容性。數(shù)據(jù)段從CRC界定符之后開始切換到更高的波特率最高可達(dá)5Mbps甚至更高從而大幅提升有效數(shù)據(jù)吞吐量。兼容性CAN FD控制器可以配置為僅以經(jīng)典CAN模式工作以兼容傳統(tǒng)網(wǎng)絡(luò)。但經(jīng)典CAN控制器無法解析CAN FD幀。升級考量升級到CAN FD需要更換支持FD的控制器和收發(fā)器并且網(wǎng)絡(luò)中的所有節(jié)點(diǎn)都需要升級。目前FD正在新一代汽車電子架構(gòu)中快速普及。7.2 CAN與汽車網(wǎng)絡(luò)安全隨著汽車網(wǎng)聯(lián)化、智能化CAN總線從封閉走向開放通過T-Box、OBD接口其安全性問題日益凸顯。經(jīng)典CAN協(xié)議本身沒有安全機(jī)制任何連接到總線上的設(shè)備都可以讀取和發(fā)送所有報文這帶來了風(fēng)險。攻擊面OBD-II接口、信息娛樂系統(tǒng)、藍(lán)牙/Wi-Fi模塊、甚至輪胎壓力監(jiān)測系統(tǒng)TPMS都可能成為入侵CAN總線的跳板。安全增強(qiáng)行業(yè)正在引入諸如CAN總線入侵檢測系統(tǒng)、報文認(rèn)證如使用MAC消息認(rèn)證碼、幀計(jì)數(shù)器防重放、總線加密等技術(shù)。AUTOSAR標(biāo)準(zhǔn)中也集成了更多的安全模塊。在設(shè)計(jì)新一代系統(tǒng)時必須將網(wǎng)絡(luò)安全納入考量。7.3 AUTOSAR中的CAN通信棧在復(fù)雜的汽車軟件架構(gòu)中CAN通信通常遵循AUTOSAR標(biāo)準(zhǔn)。AUTOSAR將CAN驅(qū)動抽象為多層CAN驅(qū)動最底層直接操作CAN控制器硬件寄存器負(fù)責(zé)幀的收發(fā)和硬件濾波。CAN接口層提供統(tǒng)一的API給上層并管理硬件接收單元HRH和硬件發(fā)送單元HTX。CAN傳輸層處理超過8字節(jié)的多包數(shù)據(jù)傳輸即ISO-TP用于診斷等。PDU路由器負(fù)責(zé)協(xié)議數(shù)據(jù)單元在不同通信總線CAN, LIN, FlexRay和上層模塊之間的路由。COM模塊提供信號級的接口負(fù)責(zé)信號的打包、解包、超時監(jiān)控等。理解AUTOSAR通信棧有助于在大型汽車軟件項(xiàng)目中定位問題。例如一個信號收不到可能是CAN驅(qū)動配置錯誤也可能是PDU路由表配置錯誤或者是COM模塊的信號組配置問題。這份“總結(jié)的最好一版”CAN教程從最底層的物理信號講到高層的應(yīng)用協(xié)議再到實(shí)際的調(diào)試排錯試圖為你串聯(lián)起一條完整的學(xué)習(xí)和實(shí)踐路徑。CAN技術(shù)本身并不神秘它的所有設(shè)計(jì)都圍繞著“可靠、實(shí)時、多主”這個核心目標(biāo)。掌握它的最好方法就是動手搭一個最小系統(tǒng)用分析儀看著波形一行行地調(diào)試代碼把理論上的每一個字段和狀態(tài)都親手驗(yàn)證一遍。過程中踩的每一個坑都會讓你對這條“汽車和工業(yè)的神經(jīng)”有更深刻的理解。