文章總列表

玩CAN bus的傢伙們 (1) CandleLight-based USB-CAN

硬體介紹

要玩CAN bus,準備一條USB-CAN的線,搭配一台筆電就能樂無窮,我們就從這條線講起。這條線的檔次變化很大,這篇先從[最便宜]的版本說起


這上面其實就是兩樣東西

簡單看一下MCU的block diagram,關鍵是圖上紅框的CAN和USB介面,完成介面的轉換。我愛用的STM32F103C8T6也有這兩個介面,但是USB/CAN不能同時開;倒是比較低階的F0就沒這個限制


這東西的結構簡單,其實網路上很多來源都買得到這個硬體

想要自己做可以參考這個線路圖,很簡單


韌體介紹

最早Geschwister Schneider Technologie生產USB-CAN裝置(以下簡稱gs_usb),他的Linux kernel driver已經合入公版,各大Linux版本可以直接使用。驅動程式揭漏gs_usb通訊協定,於是有高手仿照通訊協定寫了CandleLight FW,燒入MCU後,電腦就認為這是gs_usb!

分析一下FW的效能,這些介面轉換的東西,不掉封包是基本的需求。STM32F0的記憶體不大,只有16K,他的source code宣告QUEUE深度是64層

假設我們的封包都是8byte放到滿(沒放到滿時case,狀況更差了),不同CAN bus速度能承受的時間如下

  • 1000Kbps, 1us per bit, ~100bit per packet = 100us, 64x = 6.4ms
  • 500Kbps, 2us per bit, ~100bit per packet = 200us, 64x = 12.8ms
  • 125Kbps, 8us per bit, ~100bit per packet = 800us, 64x = 25.6ms
USB是主機主機端定期詢問裝置是否有封包要傳送,如果電腦USB很忙,比如正在傳輸檔案,能分到的頻寬就變少;或是CAN bus很滿,buffer很快就塞滿;所以上述64層是稍微有些疑慮。實際應用下的CAN bus沒那麼滿,也許這題就還好

換顆記憶體大一點的MCU也許更可靠


韌體介紹 (SLCAN版本)
CANable有兩種韌體可用,一種是上述的candlelight_fw,另一種是Serial Line CAN。SLCAN把USB-port變成COM-port在上面傳字串,所以1-byte資料需要2-byte才能發送,而且轉字串成資料結構也要額外的運算。SLCAN也可以接上SocketCAN,用起來沒差

我個人會避開SLCAN,主要是速度砍半;


軟體介紹,Linux
  • Linux kernel標準的CAN bus處理框架叫SocketCAN,這東西基本上已經統一江湖,無數工具都基於這個開發
  • CAN-Utils是bosch編寫的開源工具,candump,cangen,cansend,非常實用
  • Python-CAN,把SocketCAN封裝起來,非常友善的Python library
  • Wireshark,大名鼎鼎的網路封包分析工具也支援SocketCAN

軟體介紹,Windows
  • cangaroo提供GUI介面,可以顯示封包和傳輸資料
工具總評 & 專業的駭客工具
  1. 大家都想用GUI,舒舒服服的做事。後面PCAN-View軟體看起來很Sexy吧!用它來看封包或錄Log很方便;如果要收到某個封包,處理一下送出另一個封包,最後還是得寫程式。這時候建議就走Linux的SocketCAN,走這條路投下去的時間比較不會浪費;在Windows上微軟沒有公版API,目前是各家adaptor走各自的API
  2. 寫這篇Blog時,偶然發現Savvycan,這套工具集逆向工程需要的傢伙於一身,而且還是跨平台的!這套軟體日後我一定試用後會回來寫心得,這裡先簡單列幾個連結




留言

這個網誌中的熱門文章

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

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

CANON G3000 廢墨瓶改裝