發表文章

目前顯示的是 3月, 2021的文章

文章總列表

玩CAN bus的傢伙們 (3) PEAK-CAN

圖片
前言 之前偶然看到 PEAK CAN 的解決方案,價格貴了不少,但是整套工具看來就閃閃發光 PEAK解決方案分析 這些硬體大概也是顆MCU加上CAN Transceiver,但我們相信PEAK品質好(起碼人家不是焊幾根線就上) 可能用比較好的MCU,可以在內部存更深的封包,避免掉資料  賣得時間夠長,有很多人踩過坑,品質比較穩定 軟體的差異我覺得就非常巨大了!下面的網頁是PCAN產品Download頁面所有項目。有很多問題Peak已經解過了,他們也提供API讓客人呼叫,能加快開發速度 這套PCAN-View的品質就更不用說了 一套PEAK軟硬體賣200歐元,我覺得物有所值。畢竟我們是使用工具解決問題,而不是解決工具的問題 One More Thing... 俄羅斯人照 PCAN Linux driver 編寫韌體,編譯完參考 製作candlelight ,燒進去就識別成PCAN PCAN USB (STM32F0) https://github.com/moonglow/pcan_cantact PCAN USB PRO (STM32F4) https://github.com/moonglow/pcan_pro_x

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

圖片
前言 我的CandleLight USB-CAN都是 TAOBAO 買,最早賣39RMB,後來就漲價到89RMB,早知道就多屯一些在手邊。動心起念DIY除了省錢,另一個是掌握STM32F0系列MCU開發,畢竟這款才能同時開CAN和USB 硬體材料 STM32F072最小開發版 ,一樣是買核心版,這個很好找 CAN Transceiver board 麵包版 OBD2連接器 核心版和我愛用的STM32F103C8T6線路完全一樣,只是MCU換成STM32F072C8T6;然後CAN Transceiver我隨便拿顆手邊5v的來用;講究一點要用TJA1051/3內含level shifter,可以把電壓轉3.3v和MCU對接;只是我手邊沒有就隨便拿一顆用,實測沒問題,原因如下: CAN-TX pin,收發IC內部有5v pull-up,MCU就算輸出3.3v也沒事 CAN-RX pin,MCU本來就是5v tolerant,所以灌進來也不會有事 PCB比對 & 製作硬體 比對candleLight和核心版線路圖是苦功,答案奉上:只要PB8/PB9接上CAN Transceiver即可;OBD2連接器一般是接PIN6/14,這是汽車標準的CAN bus接口 CandleLight線路圖 核心板線路圖 製作結果,4條線從主板到小板子,2條線從小板到OBD2連接器 準備韌體 & 燒錄 這個流程我操作過很多次,寫Blog順便好好記錄下來: 找一台Linux(我用Raspberry Pi)照著 CandleLight FW 的說明建構韌體。Codebase能支援不同板子(參考 config.h ),可以直接打make把所有韌體都build出來。只有candlelight_FW用STM32F072,我用這版韌體 抓 STM32-DFU 工具安裝,DFU是Device FW Upgrade縮寫 核心版斷電,調boot0設high上電啟動STM32 bootloader;驅動程式在C:\Program Files (x86)\STMicroelectronics\Software\DfuSe v3.0.6\Bin\Driver 執行DFU manager把步驟一的candlelight_fw.bin轉成DFU file,操作參考下面圖片 然後跑DfuDeDemo程式,操...

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

圖片
硬體介紹 要玩CAN bus,準備一條USB-CAN的線,搭配一台筆電就能樂無窮,我們就從這條線講起。這條線的檔次變化很大,這篇先從[最便宜]的版本說起 這上面其實就是兩樣東西 MCU:  STM32F042x6 or STM32F072RB CAN Transceiver:  NXP TJA1051/3 簡單看一下MCU的block diagram,關鍵是圖上紅框的CAN和USB介面,完成介面的轉換。我愛用的STM32 F103 C8T6也有這兩個介面,但是USB/CAN不能同時開;倒是比較低階的F0就沒這個限制 這東西的結構簡單,其實網路上很多來源都買得到這個硬體 https://github.com/HubertD/candleLight https://wiki.linklayer.com/index.php/CANtact https://canable.io/ TAOBAO 想要自己做可以參考這個 線路圖 ,很簡單 韌體介紹 最早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很滿,buff...

買書是有紀律的賠錢

圖片
多年前我讀黑天鵝這本書,作者有個策略是有紀律的賠錢, 押注市場上機率極小但賠率極高的事件 ,這個策略讓他在2008年金融海嘯大賺一筆,從此過著在咖啡館寫文章的日子。十幾年過去了,不曉得作者是否依舊愜意 2021年228連假,我正在新竹NOVA書耕吸收 宅之力 ,身上抱著一堆書,想說都看不完還是放回架上吧。突然腦袋閃過黑天鵝的例子,於是我全部都買回去 老婆幫我買了不少書,我自己也買,大多都沒看,少數只看一點,等於 買越多賠越多 。我看書不快,經常讀一讀就放著,下次再拿起來也很難繼續;我很佩服別人讀完書能寫一些note,把摘要說出來;這對我很難,我得花不少時間才能吸收(甚至根本沒吸收)。還好總有幾本有讀下去,也有幾本動手做實驗,也有幾本似乎改變想法,沒有完全虧掉 用黑天鵝的說法,買書就是有紀律的賠錢(大多都看不完),期待賠率極高的事件發生(正好看到有用的,讓自己暴露在可能的好事裡)。想通這點,買些貴森森的板子,結果沒開工,也能稍稍原諒自己了 Chipwhisperer , ChipWhisperer-Lite 32-Bit (250USD) Ultra96 board , board(249USD)+ JTAG-board(39USD) Nuvoton DEV Board , many boards (<20USD) 找個藉口(捕捉好運)來繼續買更多書,更多板子,更多玩具。買這麼多,看得完才怪 XD

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

圖片
前言 我一般用Segger-RTT來debug。不過這東西也有限制,比如MCU進出sleep mode,他的data stream就會斷掉,也是不方便 http://lihgong.blogspot.com/2016/05/segger-rtt-1.html http://lihgong.blogspot.com/2016/05/segger-rtt-2.html http://lihgong.blogspot.com/2016/05/segger-rtt-3_6.html 我不是很喜歡UART,根本原因是把他 用好 其實不容易。當年選用Segger RTT其實就是要逃避這題(笑);很多年過去了,總是要回來解決這題 STM32 HAL UART driver足足有3726Lines,這代表他的複雜度。假如UART跑在115200bps來說,傳送1byte需要約100us,假設CPU跑在16Mhz就需要1600T。簡單用Polling mode丟資料(或是接收資料)效能很悲劇;用了中斷模式會好一點,但是每個字元都來中斷,遇到高速UART其實效率也不大好;這題的根本解法是需要DMA mode 這篇我會介紹怎在使用STM32CubeIDE,把UART+DMA mode跑起來,TX/RX都有,實作我心裡最佳的框架。這篇直接講結論和步驟,原理很複雜,但是架起來卻很簡單 環境 STM32CubeIDE 你改用STM32CubeIDE了嗎?如果還沒,可以試試看;我用起來很滿意! Nucleo F411RE Board 上面有ST-LINK加開發版,帶條USB線就能出去玩;缺點是MINI-USB線有點討厭 MobaXTerm 好用的Terminal工具,可以連SSH/ RDP/ Serial Terminal UART-TX設定步驟 STM32CUBEIDE設定UART,關鍵是要打開UART中斷,以及打開TX/RX的DMA Enable UART IRQ Enable UART DMA channels 假如要傳送資料,這一段code能幫上忙。這裡面有個資料結構內藏ring-buf,每次user要寫東西就往buf[]擺,並且更新wptr;資料擺上去會呼叫UART HAL library的API來傳送;或是DMA傳送完了,也會檢查還有沒有剩下的要傳。因為有Global variabl...