<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

分享一種用CAN波形的幅度和脈寬信息來精確定位錯誤幀來源的方法

832065824 ? 來源:汽車電子嵌入式 ? 作者:汽車電子嵌入式 ? 2023-10-08 15:52 ? 次閱讀

我們先從基礎的講起。CAN節點的電路一般如下圖所示,MCU內置了CAN控制器用來將MCU的數據封裝為CAN幀格式,同時它也負責CAN幀的校驗和錯誤幀的處理。

控制器封裝好的邏輯報文經TX RX送到CAN收發器,將邏輯信號轉變為真正的總線差分波形。

8d3bdf12-65ae-11ee-939d-92fbcf53809c.png

一、CAN物理層

也就是CAN收發器干了啥?

8d4930cc-65ae-11ee-939d-92fbcf53809c.png

一個典型的雙節點CAN網絡的物理層等效電路如上圖,兩顆120Ω終端電阻并聯呈現總線電阻60Ω。黑框里是A、B兩個節點的CAN收發器(Transceiver),它只負責電平轉換。當總線靜默時,收發器內部的2.5V電源經15KΩ電阻把CAN-H和CAN-L都拉到2.5V,總線這個狀態稱之為隱性。

當節點A想要驅動總線的時候(TX=0),它同時把內部的上下兩個MOS管導通,整個網絡的電流流向:節點A的5V電源經二極管、24Ω、兩顆終端電阻并聯、24Ω、二極管回到節點A的地,總線這個狀態稱之為顯性。CAN總線上的電壓實際上就是終端電阻的分壓。

從節點B來看,CAN-H就變成3.5V,CAN-L變成1.5V,拉出了總線 H - L = 2V 的差分電壓,大于0.7V的判斷閾值,節點B就認為收到了一個顯性(RX=0)。大家可以算一下分壓值以增強記憶,后邊會用到。

反直覺知識點①:總線無人驅動時,也就是各個節點都隱性時,CAN標準定義這時的TX/RX邏輯電平為1;總線有節點驅動顯性,也就是主動拉開差分電壓的時候,對應TX/RX端邏輯電平0,這個1/0的反邏輯類似I2C等OC門的驅動邏輯,努力適應一下。這么做我猜有兩個原因:一是對地邏輯的抗擾能力強一些,NPN載流能力強&回流路徑短;二是為了數學上的嚴謹性:1x1x1x1...1x0 = 0,任意節點驅動顯性0,那總線就是顯性0;所有節點隱性1,總線才是隱性1。但這樣的反邏輯帶來一個問題是,電路設計時需要尤其注意上下電時序,上電/休眠/喚醒過程中千萬不要出現MCU已下電(TX拉低)但CAN收發器還供5V電的情況。如果實在難以避免,可以試試單3.3V的CAN收發器MAX3051,它不需要5V電源,邏輯電和驅動電共用同一路3.3V,肯定不會出現電源時序問題。

反直覺知識點②:理論上CAN_L短地,或 CAN_H短路12V,因60Ω終端電阻的存在,隱性時CAN-H與CAN-L之間基本還是重合的,顯性時也能正常拉開壓差,能維持正常通信,只不過丟包率可能會大一點。大家可以算算總線電壓,示波器很容易診斷這個問題。另外,如果你看到CAN的通信電壓不是以2.5V為中心對稱的,也有可能是多個CAN線交叉錯接,比如CAN1_L錯接到了CAN2_L上。

反直覺知識點③:一個CAN網絡里,120Ω終端電阻1~4顆都能工作,少了的話 離終端電阻遠的節點 抗擾度會差,多了的話 顯性差分電壓可能無法觸發閾值。

反直覺知識點④:除了線路的最遠端,任何稍長的CAN分支都可以加1K~4.7K的支線電阻,跑點電流來改善抗擾度。只要分支別太長,大致1Mbps以內的任何總線其終端電阻都是跑電流增強抗擾的,不涉及真正的阻抗或者反射抑制,雙絞的要求也不是特別嚴格。

二、CAN鏈路層

也就是CAN控制器干了啥?

回顧完物理層,咱來看鏈路層,CAN幀的標準格式。當發送節的MCU將TX由1變0的時候,CAN收發器將CAN-H拉高&CAN-L拉低,接收節點收到了H-L>0.7V的壓差后,接收節點的CAN收發器RX輸出由1變0。下圖是一個節點接收到CAN波形后解碼出的RX邏輯。

8d5904ca-65ae-11ee-939d-92fbcf53809c.png

一幀報文里邊有比較關鍵的幾段:仲裁段、控制段 、 數據段、CRC段、ACK段。

仲裁段中的大部分是CAN報文的ID,起名為“仲裁”其實是因為這一段有優先級仲裁的功能:假設A、B兩個節點在同一時刻搶發報文,節點A要發二進制ID為001的報文,B要發010。當A、B節點都在發第一位的顯性0的時候,總線會同時被兩個節點驅動顯性,A、B節點回讀總線也都是顯性,相互之間還意識不到對方的存在。當節點A發到第二位的0,節點B發到第二位的1的時候,總線只有節點A驅動顯性0,節點B不驅動 卻發現總線被別人驅動了,此時節點B會認為CAN線上有比自己這幀010優先級更高的數據,節點B就會主動停發,讓節點A獨占總線發完。之后節點B懷揣著這幀數據再次參與總線優先級的仲裁。

反直覺知識點①:CAN作為一個對等網絡,沒有主從關系,報文全部廣播,節點本身也沒有優先級概念,只有報文ID的優先級??梢赃@么理解:CAN節點是“由事件驅動的”,比如剎車制動器,它能發高優先級的“剎車被踩下”的報文,也會發低優先級的“剎車油位正?!钡膱笪?,這些報文根據ID的大小在總線上自由競爭優先級,而不是剎車制動器這個節點的話語權一定高。這個特性就要求設計人員提前規劃好所有報文優先級和周期(即“通信矩陣”)才能保證整個CAN網絡如期運轉。如果你的CAN網絡有大量雷同節點,節點又只有一幀報文,那么ID數大(優先級低)的節點一定會在總線繁忙或干擾重發的時候"插不上話",可以試試把時間戳融合到ID里邊,確保各節點的新數據優先級最高,舊數據自然會被仲裁掉。

反直覺知識點②:在A、B節點同時驅動第一個顯性0的時候,總線被兩個節點同時驅動,電壓會顯著高于2V。示波器上會看到在仲裁段的頭部有明顯的電平凸臺,后續節點A搶占總線之后電壓會回歸正常的2V。

反直覺知識點③:各個節點的時鐘同步是把每個bit做16~20份的數字切片來實現的,這個切的份數不建議太多或太少。詳細機制請參閱 ZLG致遠電子的這篇:CAN同步機制,你真的了解嗎?

控制段中有幾個控制位,這里拿幾個常用的舉例。IDE位為擴展ID的指示。如果IDE位為隱性1,就會在后邊再續上18位的ID,共11+18=29位長度。比如0x9E就是個11位長度的ID,0x0151就是個29位的ID。R0位是CAN里邊的預留位,在CAN-FD里被用作FD幀格式的標志位FDF,這一位為隱性1就會按FD的幀格式解碼后續報文。DLC指示了后邊的數據段的長度,例如1000表示后續會有8個Byte長度的數據。CAN-FD協議只在數據段會切換成高速率,比如2Mbps/8Mbps,前后其他段的速率保持500kbps不變。

反直覺知識點①:CAN與CAN-FD除了數據段波特率的不同,幀格式也有區別,CAN-FD多了一些控制位。比如FDF(也叫EDL)位用來指示是否按FD幀格式解碼,BRS位用來指示是否需要切換高波特率,也就是說,一個FD幀可以全程500kbps不切速率的。

反直覺知識點②:CAN控制器的標準ISO11898-1里要求接收方不解讀R0位的顯隱性,所以CAN的控制器無法過濾FD幀。標準CAN網絡里邊一旦出現FD幀會因為多了BRS、ESI等控制位被認為是格式錯誤。同樣的,因為CAN 2.0時代R0/FDF幀無意義,也有一些設備把發送出去的CAN幀的R0位錯誤地置了隱性1,這樣的設備在CAN網絡里一切正常,但若進入CAN-FD網絡就會被解讀成FD幀,進而因為缺少BRS、ESI等控制位被認為是格式錯誤。所以,CAN-FD并不是真的向下兼容CAN,因為舊時代的CAN設備并沒有判別R0/FDF位的能力,一旦它進入FD網絡就會瘋狂地打斷通信。

反直覺知識點③:DLC的長度,在CAN標準里DLC可以是0000~1000之間的二進制值,可以用8421的算法直接計算出數據長度。而在CAN-FD中,1001~1111之間的值則被解讀為離散的12,16,20,24,32,48,64byte。

CRC段對于從幀頭到Data結束之間的數據,CAN協議使用了CRC15這個比較特別的多項式計算校驗,有興趣的可以手算CRC試試。CAN-FD根據數據長度的不同使用了CRC17和CRC21,這里暫不做展開。

ACK段是由收到該幀的CAN節點回復的確認(Acknowledge)。注意 發送節點在ACK位一定發的是隱性1,由接收節點回應顯性0,雙方無縫銜接才在總線上呈現出一個完整的CAN報文。

反直覺知識點①:總線上任何節點 只要認為這個幀的結構正確,都會在ACK位回顯性0,不管需不需要這一幀的ID和數據。為什么不需要的節點也會回ACK?因為等MCU算完會造成這一位的延遲,攪亂總線時序,不如只保障鏈路層本身的格式正確,純芯片數字邏輯實現無延遲。嗯,90年代的總線要求不要太高。

反直覺知識點②:發送節點若發現自己這一幀沒有ACK回應,它也會認為總線出錯,重發16次后進入Passive error狀態,有興趣的自行研究一下,這里不做展開。

三、真實CAN波形

來看一個兩節點案例:若節點A發送0x9E報文到總線,從節點B收到的總線波形和邏輯側波形如下:

8d60a5b8-65ae-11ee-939d-92fbcf53809c.png

黃線為CAN-H,綠線為CAN-L,藍線為節點B的邏輯側RX,紫線為節點B的邏輯側TX??梢钥吹?,作為接收方的節點B,總線拉差分電壓拉出顯性的時候,收發器將RX拉0給到MCU。在節點B想要回應ACK的時候,MCU將TX拉0,CAN收發器在總線上拉出了一個歪斜的顯性(歪斜是因為測量點的寄生電感影響)。RX在ACK位置的0,是收發器TX=0驅動總線顯性之后 回讀到的0。

再看一個比較真實的車上波形,CAN網絡上大于4個節點:

8d6c8234-65ae-11ee-939d-92fbcf53809c.png

黃色是CAN_H,高電平表示顯性0,綠色是我們掛示波器這個節點的邏輯側TX,低電平表示顯性0。箭頭A~D是一幀完整的CAN報文,箭頭A ~ B這個過程中,我們掛示波器的這個節點和另一個節點正在進行優先級仲裁,根據我們之前講到的物理層的分壓原理,兩個節點同時驅動電壓會高一截。在箭頭C這個bit 該節點想發隱性1但發現總線是顯性0,那就說明有另外的節點在發送更高優先級的報文,我們這個節點會主動退出發送,成為接收節點,并在箭頭D點校驗成功后回應ACK,等待報文結束后這個節點再次參與總線仲裁,成功搶占總線如E點所示。

注意波形高度,在箭頭A~B之間,差分電壓略高于2V,這是正?,F象,說明有兩個節點同時驅動總線顯性,但從邏輯看,因為H-L>0.7V所以都為顯性0,純數字邏輯的CAN控制器在箭頭A~B之間還感知不到對方的存在,箭頭C點之后才感知得到;而在箭頭D點,因為除了發送節點之外的所有節點都在同時驅動ACK,所以總線電壓比箭頭A~B之間的雙節點驅動 電壓更高。

四、錯誤幀

終于到了錯誤幀,注意,錯誤幀不是由哪個節點發出的,而是由某個接收節點認為總線錯誤,故意驅動總線打斷發送方,在總線上呈現為一個錯誤幀。也就是說錯誤幀 一定是由 一個發送節點和至少一個 認為發送方有錯的節點 共同形成的。

五、位填充

位填充規則是CAN協議的靈魂,簡單來講就幾個字:逢五補一。當發送節點想要發連續5個bit的顯性0的數據,會故意插入一個無意義的隱性1;當出現連續5個bit的隱性1,會故意插入一個無意義的顯性0,如下圖的紫色bit。如果發送節點漏填了這個0/1,或者這個0/1被干擾成了1/0,接收節點就會判定為“填充錯誤”,向總線上輸出“主動錯誤標志”——連續六個顯性0,故意破壞這一幀報文,發送節點感知到總線錯誤之后停止發送這一報文的后續部分。你說巧妙不巧妙?連續6個顯性0本身就是破壞“逢五補一”規則的,被拿來當錯誤標志回給發送節點。

8d77f63c-65ae-11ee-939d-92fbcf53809c.png

假如原始數據是0x00,二進制0000 0000,發送節點發到0000 0的時候發送節點會先插一個1,再發后續的000,成為0000 01000,共9bit長度,接收節點也會在第5bit的0之后預期一個無效的1,解碼時摳掉。

假如原始數據是0000 0100,第六位自帶1,發送節點發到00000的時候也會先插一個1,再發后續的100,成為0000 01100,共9bit長度。

六、回讀確認

發送節點發送了0或1的時候,會回讀確認總線是否和自己的發送相符,比如在仲裁段搶優先級失敗就會等下一幀再發;如果發到了數據段,按理說此時總線應該只有自己,發著發著突然發現回讀的0/1與自己發的不同,比如受到了干擾,發送節點就會輸出“主動錯誤標志”——連續6bit顯性0,來主動拋棄后續報文,同時讓接收節點知道我這一幀有誤。

在這時,接收節點收到第6bit顯性0的時候,因違背逢五補一的位填充規則,也會往總線上輸出“主動錯誤標志”,所以會在總線上看到連續12bit的顯性0,前6個來自發送節點,后6個來自接收節點。

正常情況來說,總線上的顯性不應該>5bits=10us。那么用示波器設置>11us的脈寬觸發模式就很容易定位錯誤幀的位置,不一定要用解碼示波器。

七、升維打擊

CAN網絡的幅度和電流可以為我們提供更多維度的信息,此所謂升維打擊。

我們先來看一個正常幀,我們叫它節點A吧,它內部有終端電阻,藍線為H-L的差分電壓,紫線是我們節點A的CAN-H引腳電流,輸出為正,輸入為負。

8d82bf0e-65ae-11ee-939d-92fbcf53809c.png

先看藍色的總線電壓波形,從0x83到END之間是一幀正常波形,注意看幀頭有多級臺階,幀尾ACK位置也特別高,這是正常的,可以理解 當多個節點同時驅動總線就會導致60Ω終端電阻上的分壓高于2V。從這些臺階來看,可以判斷出網絡上至少有5個節點。

為啥?先看報文中部的幅度,這肯定是只有一個節點搶占總線之后的波形,往前有兩級臺階,可以認為A、B、C三個節點同時搶占總線出現了第一個高臺,然后節點C優先級仲裁失敗退出總線,A、B節點繼續搶占出現了第二個臺階,之后節點A成功搶占到了總線優先級,發送中間的數據。最后的ACK位比3節點驅動的第一個bit更高,說明至少有4個節點在驅動ACK,再加上節點A,網絡上至少有5個節點。

再看紫色的電流波形,已知節點A自己有終端電阻,外邊有另一顆終端電阻。波形中部的數據區肯定是節點A在驅動總線,差分電壓流經外邊的終端電阻形成回路,所以我們在節點A的引腳上觀察到了輸出的正向電流;往前一個電壓臺階的位置,電流為0,是A、B兩個帶終端電阻的節點在驅動總線,所以總線電壓拉開了但電流仍是無進無出的;再往前一個臺階,A、B、C三個節點驅動,節點C的電流流入A、B的終端電阻,所以在節點A的引腳上測到了輸入的負向電流;然后幀尾的ACK位置,至少有4個節點同時驅動,流入終端電阻A和B的負向電流更大了。

八、錯誤幀實戰

這是一個兩節點網絡,一個節點發,另一個節點收,兩方都有終端電阻,發送節點用的是TJA1042,接收節點用的是單3.3V收發器MAX3051。在幀頭就發生了錯誤,這種錯誤幀一般源于時鐘偏差或采樣點過小。

我們將示波器的差分探頭和電流探頭掛在接收端,下圖黃色為H-L的差分電壓,藍色為接收節點的輸出電流,RX為收發器將H-L差分電壓轉換出的邏輯波形,MCU內部的CAN控制器會根據RX的0/1來解讀總線。TX為接收節點的發送邏輯,MCU將TX拉低的時候收發器會往總線上驅動顯性。

8d91cc24-65ae-11ee-939d-92fbcf53809c.png

我們已知500kbps的每個bit寬2us,注意上圖紫線TX在2 ~ 4箭頭之間出現了連續2us * 6=12us的顯性0,說明我們掛示波器的這個接收節點在此刻往外輸出了一個“主動錯誤標志”,那一定是接收節點在此之前認為總線出現了錯誤。我們來往前看,箭頭1~2之間總線差分電壓和RX邏輯側都只有10us/2us=5bit的顯性0,幀前邊都是長隱性1,這能有什么錯?一個可能是我們碰到了傳說中的過載幀,這個東西本應該很少見了;另一個可能是接收節點把對方來的正確報文認成了錯的,這10us被接收節點認成了6bit,錯誤的采樣點+硬同步(幀頭對齊)做得稀爛的國產MCU更容易出現這樣的幀頭報錯。

不管哪種,我們推演一下看看是否符合我們的理論,在箭頭2~3之間發送節點應該是想發送一個隱性,但這時接收節點已經覺得不對開始發“主動錯誤標志”,將總線拉成了顯性。然后發送節點讀到這一bit自己想發送隱性但總線是顯性,所以。。。仲裁區搶優先級失敗退出總線,,,怎么可能,之前有6個連續顯性呢,所以發送節點因違反“逢五補一”在箭頭3~5也輸出“主動錯誤標志”。所以就成了黃色總線波形的7個bit的“凸”型,中間的凸臺的位置總線被兩個節點驅動,電壓高起一個臺階。

再注意一個細節,凸臺的左肩膀和右肩膀高度不一樣,左肩膀是接收節點MAX3051驅動的電平,它比 右肩膀TJA1042的驅動能力弱一些,總線電平低一點。這個特性可以用來區分總線上的不同設備。

藍色線,是接收節點的輸出電流。箭頭1~2之間的負向電流為發送節點驅動總線,差分電壓流經接收節點內部的終端電阻帶來的負電流;箭頭2~3之間的正電流是接收節點驅動的主動錯誤的第一個bit;后邊3~4的凸臺兩個節點都在驅動顯性 但對應的電流也是負的,這是因為發送節點的驅動能力強過接收節點,整個網絡電流還是由發送節點灌入接收節點;再往后4~5的負電流是發送端驅動接收節點的終端電阻的電流。

下圖我標出了兩個節點的輸出bit流,紅框是“主動錯誤標志”。

8d965028-65ae-11ee-939d-92fbcf53809c.png

仍然是這個兩節點網絡,仍然是這個稀爛的國產MCU,我們來看這個錯誤幀是怎么個情況:

8da5b61c-65ae-11ee-939d-92fbcf53809c.png

這一幀的DLC=0x01,也就是只有1byte數據,數據區之后就是CRC區,我們的“主動錯誤標志”就發生在這個區,觀察又沒有填充錯誤,那就是我們掛示波器這個接收節點認為發送節點出現了CRC錯誤。但我們看到黃線在“主動錯誤標志”中間出現了凹坑,意味著發送節點還是想繼續發隱性,并不認為自己有錯,直到發現這一位被“主動錯誤標志”覆蓋為顯性才感知到位錯誤后拋棄后續報文。

原因最后定位到:過小的采樣點+過大的再同步補償寬度SJW讓時鐘誤差逐步積累,這顆國產MCU的重同步又做得稀爛,把正常報文錯讀了一位導致算CRC錯誤。最后通過調整采樣點和SJW寬度減少了這種錯誤的出現頻次,得到正常波形如下:

8db7807c-65ae-11ee-939d-92fbcf53809c.png

我們再試著從差分波形來分析一個錯誤幀:

8dd109c0-65ae-11ee-939d-92fbcf53809c.png

錯誤發生在CRC區,我們放大一下,看看各節點都發生了啥:

8dd8442e-65ae-11ee-939d-92fbcf53809c.png

從每一個臺階往前畫12us的方框,得到每個節點輸出的“主動錯誤標志”,分析可知:這是一幀節點B發送的報文,節點A認為它的CRC算錯了,節點C湊了個熱鬧,三者一起形成了這個12bits長的“主動錯誤標志”。

那,節點A為什么會認為CRC有錯呢?大概率是因為之前的數據讀錯了一位。

這么好的波形也能讀錯?是的,我們無法判斷節點A所在的位置波形有多差,可能分支上沒有終端電阻振鈴很大呢?我們只能相信節點A不會亂搞。另外,采樣點偏差會導致節點對噪聲額外地敏感。

九、CAN-FD錯誤排查

來看一個A B C三節點CAN-FD錯誤幀的案例,節點C發,節點A、B收:黃色是H-L的差分電壓,綠色是節點B的邏輯TX。0x0677和0x0176是兩個錯誤幀。FD區波特率設置為2Mbps。

8de0d7c4-65ae-11ee-939d-92fbcf53809c.png

放大0x0176幀的細節:

8de5e2be-65ae-11ee-939d-92fbcf53809c.png

標尺A B之間時間長度約0.8us,由一個2Mbps FD bit的0.5us + 一個CAN-FD的TDC(300ns)組成。

之后出現了6個FD bit(0.5us*6=3000ns)的連續顯性位,電平高度與之前相同,之后有連續2usx6=12us的顯性。

在標尺B線后12us位置出現了一個電壓跌落的小小的下降臺階,見下下圖。

綜上三條,認為節點C所在位置干擾過大/分支線路過長,節點C自己回讀↓下圖↓框出的bit位失敗,自己往總線上輸出“主動錯誤標志”(連續6bit=2usx6=12us的顯性),其他設備在接收到第6個CAN-FD的bit=0.5usx6=3us的時候就讀到了錯誤(違反FD速率的“逢五補一”規則),也往總線上疊加2us*6=12us的主動錯誤標志。然后,12us時節點C的主動錯誤標志先結束,其他節點的主動錯誤在2usx6+0.5usx6=15us后結束。至此,錯誤幀形態完成。

“逢五補一”這條規則是跟隨波特率變化的,6個連續的高波特率0或1都會觸發填充錯誤。但填充錯誤之后輸出的“主動錯誤標志”是500kbps波特率的6bit,固定長度12us。

8df0648c-65ae-11ee-939d-92fbcf53809c.png8e0bc772-65ae-11ee-939d-92fbcf53809c.png

再來一個案例:CAN-FD采樣點設置出錯導致節點B把節點A發送的CAN-FD報文當CAN來解析出錯。

黃色CAN_H,綠色CAN_L,藍色L-H反向差分電壓,紫線為節點B邏輯RX,青線為節點B邏輯TX。

8e107100-65ae-11ee-939d-92fbcf53809c.png

注意看0x00前后的數據段,這一段是CAN-FD的2Mbps速率,節點B因為采樣點設置錯誤讀錯了BRS這一波特率轉換標志,仍按照標準的500kbps去解析節點A的2Mbps速率的數據,對RX信號2us一個采樣我用黃色箭頭標出來了,可以看到這恰好是6個連續顯性0,違反“逢五補一”的規則,故而接收節點B在箭頭2~4之間發“主動錯誤標志”,打斷總線通信,告知發送節點你發錯了。

箭頭2~3之間,發送節點A恰好也要發顯性,所以節點A此時還沒感覺到不對。

箭頭3之后,節點A想要拉隱性,電壓出現一個坑,卻發現總線還是顯性,此時節點A判斷出現了“位錯誤”,開始輸出“主動錯誤標志”,想告知接收方放棄我這一幀報文。

箭頭4的位置節點B釋放“主動錯誤標志”,箭頭5的位置節點A釋放“主動錯誤標志”。

如果數據比較巧,恰好能滿足逢五補一的規則,那這種錯誤形態會在發送很多數據之后才會出現,但最晚也會被CRC攔截:

8e1a3ca8-65ae-11ee-939d-92fbcf53809c.png

補充知識:CAN-FD網絡各個節點的采樣點必須完全相同,高速率導致對時序敏感很多,這一點與CAN網絡容許一個范圍顯著不同。

上邊這一幀的BRS位怎么讀錯的呢?再一次違反直覺:CAN-FD的采樣點影響發送節點的驅動波形!用示波器可以輕松量出FD的采樣點位置。

看下圖,CAN-FD報文的控制段中的BRS位(Bit Rate Switch)明顯是短于前邊的FDF、R0位的,采樣點不匹配的話很容易讀錯。因為-FD的速率翻轉是在這一bit的采樣點位置發生的。比如采樣點80%的2Mbps CAN-FD網絡,BRS這一位的寬度為2us80%+0.5us20%=1.7us,而不是2us。接收節點的采樣點如果設置大于85%就會錯過整個BRS位(2us*85%=1.7us),從而導致如上的BRS位讀錯的問題。

8e2ff7e6-65ae-11ee-939d-92fbcf53809c.png

以上,就是示波器升維破解CAN錯誤幀/BusOff的經驗分享,總結一下:

結合已知ID是哪個節點發的先驗信息,逐個拔掉非終端節點,示波器觀察“主動錯誤標志”,就能模糊定位錯誤源頭;

如果能引出敏感設備的TX,哪個節點認為哪個節點出了什么錯就會非常清晰明了;

其次,測量CAN的輸出電流也能清楚地定位誰在驅動“錯誤標志”,進而找到故障點;

如果上述難以實現,以12us間隔拆分“錯誤標志”的電壓臺階,也能定位大部分錯誤原因;

額外關注單bit寬度的電壓臺階,能排除部分節點;





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 二極管
    +關注

    關注

    144

    文章

    9096

    瀏覽量

    162293
  • 收發器
    +關注

    關注

    10

    文章

    3068

    瀏覽量

    104969
  • 示波器
    +關注

    關注

    111

    文章

    5923

    瀏覽量

    182240
  • MOS管
    +關注

    關注

    107

    文章

    2241

    瀏覽量

    64710
  • CAN控制器
    +關注

    關注

    3

    文章

    74

    瀏覽量

    14943

原文標題:用示波器排查CAN的各種錯誤幀

文章出處:【微信號:汽車電子嵌入式,微信公眾號:汽車電子嵌入式】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    一種修正的近場聲源定位時延估計方法

    和易于實現的特點使得此方法在實際的被動聲定位系統中得到了廣泛應用。但是此方法只能在高信噪比和適度混響條件下有較好的性能。針對此問題,給出了一種修正的PHAT-GCC
    發表于 04-22 11:55

    CAN錯誤定義

    .h,錯誤標記為CAN_ID的error,錯誤類型存放在CAN_ID中,根據不同類型的錯誤,詳
    發表于 01-03 15:57

    精確測距或者精確定位

    想請教下有沒有精確測定兩者之間距離或者精確定位的方案???定位精度在1mm左右,測量范圍為5m左右。謝謝大家了!
    發表于 05-03 19:35

    DM8127動態實現方式?調試DM8127動態效果時本來25圖像開啟動態之后只有12?

    動態般的方式有兩中,一種是數字動態:a、調節gamma曲線實現;b、調節GBCE曲線實現;c、直方圖均衡化。另外
    發表于 06-16 06:30

    如何用隧道精確定位系統實現工程施工安全管理?

    `伴隨著定位技術的日漸成熟,各個行業對人員或物資定位的需求都日益增加,隧道施工行業也是如此。、為什么要使用隧道精確定位系統?近年來,我國經濟迅速發展、城市人口也急劇增長,為解決人口流
    發表于 10-24 17:54

    基于Verilog的車牌精確定位

    分割提取車牌的算法以及基于小波變換和數學形態等方法來識別車牌的位置。本文提出了一種新的基于色彩分量的灰度化方法,該方法不僅可以消除小型民用車車牌圖片的背景和車身
    發表于 03-03 17:36

    是否有一種方法來確定GPIF接口在等待GPIF主機的數據時干還是空

    GPIF作為個32位奴隸FIFO與2位尋址。我想知道是否有一種方法來確定GPIF接口在等待GPIF主機的數據時“干”還是空。 以上來自于百度翻譯 以下為原文I am using
    發表于 05-27 14:25

    CAN/CAN FD通信中有哪些循環冗余校驗(CRC)的方法?

    數據校驗是為保證數據的完整性進行的一種驗證操作。CAN通信采用CRC校驗作為一種重要的錯誤檢測手段,是節點判斷CAN
    發表于 09-11 11:51

    CRC校驗方法通過CAN總線通信實現

    檢測、格式錯誤檢測、填充錯誤檢測、應答錯誤檢測和CRC錯誤檢測。作為一種重要的錯誤檢測手段,CR
    發表于 09-25 15:41

    UWB定位系統實現精確定位原理解析

    方法,也是業內第家擁有UWB無線同步技術的廠家。當前,EHIGH恒高的時間測量精度已經達到ps級,基站與基站之間時間可達到高度同步,實現10cm精確定位。`
    發表于 03-19 17:06

    28335 ecap的功能如何檢測

    我想用28335檢測輸入的兩個周期為11us,在1.05-1.2us之間變動的波形的占空比,也就是分別確定兩個波形
    發表于 06-08 10:13

    can的五介紹

    、can的五:1.數據,包括七段,起始,仲裁段,控制段,數據段,校驗段,ACK段,結束
    發表于 08-06 09:13

    使用步進電機精確定位

    使用步進電機精確定位(使用 S7-200、EM 253 POSITION 和 FM STEPDRIVE)小型自動化解決方案
    發表于 01-09 10:20 ?58次下載

    一種由粗略到精確的瞳孔定位算法

    針對現階段實現瞳孔精確定位算法過于繁瑣的問題,提出一種由粗略到精確的瞳孔精確定位算法.首先用灰度積分算法粗略找出人眼部位在人臉上的大概位置,然后用Hough變換
    發表于 11-13 15:57 ?6次下載

    CAN總線局部錯誤及全局通知分析

    局部錯誤,全局通知是CAN總線錯誤類型中較為典型的一種,如何通過錯誤報文及波形快速
    的頭像 發表于 02-16 07:57 ?7046次閱讀
    <b class='flag-5'>CAN</b>總線局部<b class='flag-5'>錯誤</b>及全局通知分析
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>