在我們使用CAN通信的時(shí)候,難免會(huì)因?yàn)楦鞣N各樣的情況遇到錯(cuò)誤幀,那到底什么情況會(huì)導(dǎo)致錯(cuò)誤幀呢?今天一起來分享一下。
首先我們回憶一下哪些情況會(huì)導(dǎo)致錯(cuò)誤幀。
1.CRC校驗(yàn)錯(cuò)誤。為了增加通信的準(zhǔn)確性, 保證發(fā)送節(jié)點(diǎn)發(fā)出的數(shù)據(jù)等于接收節(jié)點(diǎn)接收到的數(shù)據(jù), CAN數(shù)據(jù)幀中加入了CRC校驗(yàn)功能, 即發(fā)送節(jié)點(diǎn)對(duì)數(shù)據(jù)幀中起始段、 仲裁段、 控制端和數(shù)據(jù)段中的數(shù)據(jù)通過某種算法計(jì)算得到一個(gè)CRC值, 并將該值填入CRC段中 (CRC段由15個(gè)bit位的數(shù)值段和1個(gè)bit位的界定符組成, CAN控制器計(jì)算的CRC值就存在前15個(gè)bit位的數(shù)值段中), 然后向總線上發(fā)送, 接收節(jié)點(diǎn)收到數(shù)據(jù)后, 會(huì)對(duì)同樣數(shù)據(jù)段的數(shù)據(jù)以同樣的算法進(jìn)行CRC計(jì)算, 并將計(jì)算結(jié)果與數(shù)據(jù)幀中的CRC值進(jìn)行比對(duì), 當(dāng)接收節(jié)點(diǎn)計(jì)算得到的CRC值與發(fā)送節(jié)點(diǎn)發(fā)送的CRC值不一致時(shí)會(huì)發(fā)生CRC校驗(yàn)錯(cuò)誤,并由接收節(jié)點(diǎn)向總線發(fā)送CRC校驗(yàn)錯(cuò)誤幀, 該功能由CAN控制器自動(dòng)完成。
2.格式錯(cuò)誤。如果總線上傳輸?shù)臄?shù)據(jù)幀格式與協(xié)議規(guī)定的幀格式不符合, 就會(huì)發(fā)生格式錯(cuò)誤。比如, 在數(shù)據(jù)幀和遠(yuǎn)程幀中的CRC段、 ACK段和幀結(jié)束段EOF, 存在1個(gè)bit位的CRC界定符、 1個(gè)bit位的ACK界定符和7個(gè)bit位的幀結(jié)束符, 它們均被定義為隱性電平, 如圖2所示, 若在這些位置上出現(xiàn)顯性電平, 則視為一種格式錯(cuò)誤, 接收節(jié)點(diǎn)和發(fā)送節(jié)點(diǎn)都可能向總線發(fā)送該種類型錯(cuò)誤幀。
3.應(yīng)答錯(cuò)誤。發(fā)送節(jié)點(diǎn)向總線發(fā)送數(shù)據(jù)幀時(shí), 會(huì)在ACK段發(fā)送2個(gè)隱性位, 接收節(jié)點(diǎn)在收到CRC序列后, 如果接收過程沒有出現(xiàn)錯(cuò)誤, 接收節(jié)點(diǎn)會(huì)在ACK段的第1位發(fā)出一個(gè)顯性電平, 該顯性電平會(huì)覆蓋原來發(fā)送節(jié)點(diǎn)發(fā)出的隱性電平, 因此發(fā)送節(jié)點(diǎn)可以監(jiān)測總線上該位是否為顯性位來判斷該數(shù)據(jù)幀是否傳輸成功。如果發(fā)送節(jié)點(diǎn)在ACK段的第1位沒有監(jiān)測到接收節(jié)點(diǎn)發(fā)出的顯性電平,就意味著沒有任何節(jié)點(diǎn)接收到該幀, 此時(shí)將發(fā)生應(yīng)答錯(cuò)誤。即一個(gè)網(wǎng)絡(luò)中如果只有單個(gè)CAN節(jié)點(diǎn), 單個(gè)節(jié)點(diǎn)的CAN設(shè)備發(fā)送數(shù)據(jù)幀時(shí)將會(huì)發(fā)生該錯(cuò)誤 (沒有接收節(jié)點(diǎn),不會(huì)有節(jié)點(diǎn)對(duì)數(shù)據(jù)幀產(chǎn)生應(yīng) 答) , 并由發(fā)送節(jié)點(diǎn)向總線發(fā)出該錯(cuò)誤幀。
4.位發(fā)送錯(cuò)誤。發(fā)送節(jié)點(diǎn)向總線發(fā)送數(shù)據(jù)時(shí), 同時(shí)也會(huì)監(jiān)控發(fā)送的數(shù)據(jù)與總線上實(shí)際數(shù)據(jù)是否一致。如果發(fā)送節(jié)點(diǎn)在發(fā)送數(shù)據(jù)時(shí)發(fā)現(xiàn)總線電平與正在發(fā)送的信號(hào)電平不符, 將發(fā)生位發(fā)送錯(cuò)誤, 位發(fā)送錯(cuò)誤幀由發(fā)送節(jié)點(diǎn)向總線發(fā)出。
5.位填充錯(cuò)誤。為了使收發(fā)節(jié)點(diǎn)保持同步以便接收節(jié)點(diǎn)正確接收信號(hào), 接收節(jié)點(diǎn)需要在邊沿信號(hào)處進(jìn)行重新同步。為了避免總線上長時(shí)間不出現(xiàn)邊沿信號(hào), 協(xié)議規(guī)定發(fā)送節(jié)點(diǎn)的數(shù)據(jù)鏈路層能夠發(fā)送的連續(xù)相同位最大個(gè)數(shù)為5, 若連續(xù)相同位個(gè)數(shù)達(dá)到5個(gè), 需要在其后添加一個(gè)相反的位, 使總線上信號(hào)電平發(fā)生翻轉(zhuǎn), 從而接收節(jié)點(diǎn)得以進(jìn)行重新同步, 即位填充規(guī)則 (位填充區(qū)域包含幀起始、 仲裁域、 控制域、 數(shù)據(jù)域和15位CRC, 不包含CRC界定符、 ACK段和EOF)。如果發(fā)送節(jié)點(diǎn)向總線上傳輸信號(hào)時(shí)違反了位填充規(guī)則, 接收節(jié)點(diǎn)檢測到連續(xù)6個(gè)極性相同的位序列時(shí), 將發(fā)生位填充錯(cuò)誤, 并向總線發(fā)送錯(cuò)誤幀。
那有哪些情況會(huì)導(dǎo)致錯(cuò)誤幀呢?
1. CAN總線過長。CAN通信距離與通信速率緊密相關(guān),波特率越高,CAN通信距離越短,反之波特率越低, CAN通信距離越長。當(dāng)總線支線過長時(shí),線束的阻抗和容抗會(huì)增大, 下降沿容易產(chǎn)生彎曲現(xiàn)象,容易導(dǎo)致位寬度失調(diào),從而使接收節(jié)點(diǎn)接收數(shù)據(jù)錯(cuò)誤, 同時(shí)向總線發(fā)出錯(cuò)誤幀。為了保證正常通信,需要減小CAN終端電阻,線束越長,電阻值越小,但一般不小于30Ω,否則會(huì)使顯性位差值過小,不滿足ISO 11898要求。
2.總線電容過大。CAN收發(fā)器為了實(shí)現(xiàn)CAN的仲裁與錯(cuò)誤處理, 采用單向驅(qū)動(dòng)結(jié)構(gòu), 即CAN波形的上升沿有驅(qū)動(dòng), 而下降沿是通過整條總線與終端電阻放電產(chǎn)生的, 所以終端電阻的第一作用是放電。因此, CAN節(jié)點(diǎn)及CAN線束的電容會(huì)影響整個(gè)網(wǎng)絡(luò)的電容, 電容越大, 下降邊沿越緩, 導(dǎo)致接收節(jié)點(diǎn)發(fā)生位采樣錯(cuò)誤, 從而導(dǎo)致錯(cuò)誤幀的產(chǎn)生。一般需要保證CAN線電容在40~70pF/m范圍內(nèi)。
3.波特率配置錯(cuò)誤。為了使接收方能夠正確地解析數(shù)據(jù), 通信雙方需要提前約定波特率。軟 件 中可以直接配置相應(yīng)的寄存器即可配置波特率, 例如, 當(dāng)整車波特率為500kB時(shí) ,此時(shí)位時(shí)間為2us, 那么發(fā)送方就可以按照2us的位時(shí)間發(fā)送數(shù)據(jù), 接收方每隔2us對(duì)數(shù)據(jù)進(jìn)行采樣。因此, 如果同一CAN網(wǎng)絡(luò)中不同節(jié)點(diǎn)配置的波特率不一致, 總線會(huì)出現(xiàn)錯(cuò)誤幀, 收發(fā)節(jié)點(diǎn)是無法正常通信的。
4.采樣點(diǎn)設(shè)置錯(cuò)誤。采樣點(diǎn)是CAN控制器讀取總線電平并解釋各個(gè)比特位邏輯值的時(shí)間點(diǎn)。由于CAN報(bào)文的一個(gè)位時(shí)間由若干個(gè)Tq組成 (CAN控制器的最小時(shí)間周期稱作時(shí)間份額Tq, 它是通過對(duì)芯片晶振周期進(jìn)行分頻而得來的),通常為8~25個(gè),同時(shí)根據(jù)功能分為4個(gè)階段:同步段、 傳播段、 相位緩沖段1和相位緩沖段2。采樣點(diǎn)即為在某位時(shí)間內(nèi)讀取總線電平的時(shí)刻, 如圖6所示。采樣時(shí)刻的設(shè)置通過配置寄存器決定, 對(duì)于同一CAN整車網(wǎng)絡(luò), 各個(gè)節(jié)點(diǎn)應(yīng)該盡量使用相同的采樣點(diǎn)位置, 否則容易出現(xiàn)采樣錯(cuò)誤, 進(jìn)而使整個(gè)網(wǎng)絡(luò)的通信出現(xiàn)故障。
5.收發(fā)報(bào)文報(bào)文ID沖突。ID是數(shù)據(jù)幀中仲裁段的組成部分, ID的大小決定了總線上節(jié)點(diǎn)沖突時(shí)各節(jié)點(diǎn)發(fā)送順序, 整車上通信的報(bào)文數(shù)量級(jí)在幾十甚至上百, 如果這些報(bào)文的ID重復(fù), 總線上會(huì)出現(xiàn)錯(cuò)誤幀。
6.總線干擾過大問題。其新能源電動(dòng)汽車和發(fā)電機(jī)組等存在變頻器、 逆變器、 電機(jī)驅(qū)動(dòng)、繼電器、 電磁閥等電流劇烈變化的線纜或設(shè)備, CAN整車通信信號(hào)受到的電磁干擾尤為顯著。為此整車上往往采用提高CAN雙絞程度、 加單雙屏蔽層、 使用CAN隔離模塊、弱電遠(yuǎn)離強(qiáng)電優(yōu)化布線等方式以提高整車CAN通信抗干擾能力。此外,使用低阻抗、 低容抗的CAN線也可以提高信號(hào)品質(zhì), 提高抗干擾能力。
轉(zhuǎn)自汽車ECU開發(fā)