文章總列表

ELM327 OBD-II 心得 (5) ,CAN BUS塞了爛裝置會怎樣

上一篇我描述Pi-WIRE怎麼發動中間人攻擊。這篇我想聊一下製作過程踩到的坑,分析在CANBUS掛上爛東西會怎樣。用這個故事分析OBD-II Dongle(ELM327,HUD抬頭顯示器)究竟能不能用,或著注意事項

我買了4個CANBUS收發模組,每片樹莓派都放WaveShare + Niren混搭。能省則省,所以我去淘寶都找便宜的買
  • WaveShare RS485 CAN HAT * 2
  • Niren MCP2515 CAN Module * 2
    • 貪便宜模組


用已經會動的東西(ELM327)驗證不會動的東西(Pi-CAR)是重要的技巧。樹莓派接上貪便宜模組,很快就碰壁了:
  • 長封包必死
    • ELM327送0902,其實會送滿8bytes:09 02 00 00 00 00 00 00
    • 可以下ATCAF0讓ELM327不要塞滿8byte,變成短封包
  • 短封包也不一定活
    • 有時候一次OK
    • 有時候會重傳
    • 有時候就死掉了!
拿示波器查問題,檢查CAN-H信號並開了反向(inverse)。下圖包括第一次傳送,錯誤禎(Error Frame),第二次傳送

  • 第一次傳送,ELM327送出0902
    • 具體會送出0x7E8 [2] 0x09 0x02
    • 0x7E8是工業規格,ISO 15765制定的要和CANBUS當好朋友都要從這裡開始
    • 我手算過CANBUS信號,Bit stuffing是其中的眉角
      • Bit stuffing:連續5個0會安插一個1;連續5個1會安插一個0
  • 錯誤禎,貪便宜模組自我感覺不良好,要社會大眾等他
    • 整個CANBUS停了40us
  • ELM327等錯誤幀過了,重送一次,最後貪便宜模組給了回應,完成傳輸

貪便宜模組錯在哪裡?原來是石英震盪器不準,標示8M實際7.77Mhz!真的會吐血!便宜沒好貨,買開發工具回來修理我也是醉了。買新的16Mhz震盪器,修好貪便宜模組順便提升性能



親身體驗爛東西掛上CANBUS觸發錯誤禎與重傳機制也是種學習:
  • CANBUS上每個人都要監聽封包,是自己的就收下,不然丟掉
  • 貪便宜模組因為clock錯了,自我感覺不好,送出Error Frame
    • 整個CANBUS喪失40us
    • 如果每次貪便宜模組都靠腰,整個CANBUS就會完全動不了!
貪便宜模組的石英震盪器是爛的,一定還有別的問題讓CANBUS無法運作。廠商一般會小心挑選零件,不過零件終究會老化,比如高溫頻率濾會漂掉。車主只知道車子怪怪的,定位問題點卻很難(修車師傅表示:電腦車很難搞)

CANBUS重傳機制能掩蓋小錯誤,某個東西(比如HUD)放上去看起來正常,但是他搞不好上去在某些場景會狂發Error Frame搞爛CANBUS

所以我的建議是,ELM327拿來看錯誤碼可能還OK,長時間插在車上還是不要,很難保證他完全符合規範運作。車商花很多工夫驗證也不是笨蛋。我自己作完實驗,會盡量避免在OBD-II接口安插元件

話說回來,廠商究竟要怎麼保證他們的CANBUS運作正確?可能的做法是監聽CANBUS上面的Error Frame數目,在各種狀態下,都要保證這個數字是0。比如針對元件運作的溫度,老化分析。搞車用的零件,門檻真的高很多


上圖是我的Pi-WIRE,在Linux底下顯示的CANBUS狀態。裡面有一些統計的資料可以看,比如RX/TX打多少,packet數目,error有幾發。放一個這種裝置到CANBUS上收集統計數據,可能也是某種有意義的指標吧

留言

JiaPing寫道…
原來是石英震盪器的問題 學習了! 多謝您的分享

這個網誌中的熱門文章

STM32 UART + DMA,使用HAL實作TX/RX,以及不定長度接收

幼犬書桌椅選擇心得 升降桌 兒童桌椅

CANON G3000 廢墨瓶改裝