文章總列表

ESP32(5) 打通CAN Bus

這篇紀錄一般SDK會怎麼玩,原汁原味呈現一段ESP32-C3的白痴DEBUG過程


[硬體設定]

開發板作者給的硬體資料完全可以信嗎?我不確定。這顆IC只有32pins,還算可以每根review的狀態。閱讀線路圖datasheet自己整理一份。整理完會對IC和SDK更有信心

  • TYPE-C是開發板最佳定位點,標在Spreadsheet上面的位置標好


  • 不要碰的PIN標紅色
    USB+/ USB-是JTAG debugger,DONT TOUCH,碰了USB會斷線
    GPIO9/ GPIO9是BOOT/LOG,別碰,具體定義能看Datasheet
    CHIP_EN是RESET pin,除非要從外部Reset ESP32-C,不然沒必要碰
    PWB是電源元件LDO的EN pin,切斷壓低耗電到1uA,現在不用碰

  • IC上有限制的pin特別標示出來,可以選,先不碰這些pin
    ADC一般只放在特定pin
    FSPI(Fast SPI)系列,好像只有特別針腳才能用,我也不確定;先標出來

  • 最後的結果好像也沒特別精美,起碼我是有fu了



[CAN Bus踩坑]

CAN Bus就是汽車內的網路,我有寫過一些文章,撈"汽車電子"。我本來預計2小時要打通ESP32-C3的CAN bus,最後用了10個小時,桌子也變下面那樣。整個錯誤也很白癡:人家driver要你先呼叫twai_start()才可以用啊!!!




記錄一下10個鐘頭做了些什麼

  1. 研究針腳定義,先整理試算表,找出不能用的PIN。ESP32-C3的GPIO MUX可以導向CAN的TX/RX pin到任意GPIO PIN,我不要碰紅色PIN就好。這種MUX和繞線都會佔一定面積,到了40nm,把任意功能導到任意pin真的還好;先進製程萬歲!

  2. 把開發板請上麵包版,放上CAN收發晶片,加上OBD2接頭。我手邊本來就有樹莓派組好的CAN bus網路,現在網路上有封包了,就等ESP32-C3收下

  3. 閱讀SDK API文件,看起來很簡單,內容和我預期的CAN Bus差不多。文件後面似乎也有範例程式,好像也滿簡單的,開工吧。寫完以後果然不會動,難道是pin選錯嗎?換了一堆pin還是不會動

  4. CAN收發晶片MCP2551壞掉嗎?出動scope檢查信號,一切正常。不過這顆CAN收發晶片是5v,ESP32-C3是3.3v,難道電壓太高燒壞IC嗎?我手邊有TJA1042/3,可以額外輸入IO電壓位準,這樣就能降到3.3v。要Hack這片小板子有點懶... 記錄一下,以後可能用得到:左下角的pin#5是IO voltage拉3.3v,右下角是Standby pin,連到GND讓收發晶片保持啟動。施工完以後,還是不會動


  5. 是不是ESP32-C3已經被5v打壞?我也沒多的了,再去買個5片備用。ESP32被我嫌棄整組太大坨,拿來實驗吧。在PlatformIO換板子意想不到簡單,改個設定檔即可,而且ESP32/ESP32-C3的API介面長得一樣,重新編譯程式就燒進去了。嗯,還是不會動;我也換了一堆pin,這樣應該不是3.3v的問題了

  6. 他有個TWAI clock out的功能,能輸出內部的clock出來。用這個應該能檢查模組有沒有運作。結果什麼輸出都沒有!

  7. 手伸進他的SDK看看,是不是CAN bus timing錯誤?照著連結計算機弄了一組放上去跑,也不會動

  8. 假如RX不會動,純粹打TX會活嗎?不會

  9. 找一下SDK的Sample Code,裡面有啟動RTOS的tasks/ Semaphore/ Queue,我呼叫的方法看起來沒錯啊!沒有發現異狀

  10. 仔細再看一次文件,並且把標頭檔(header file)twai.h再看一次,也才300行而已,把所有公開介面再看一次,怎麼有個"twai_start()"。呼叫下去,就會動了!

  11. 開始一步一步回去測試
    TX/RX都正常
    CAN bus timing預設的,或是我塞給他的都會動
    CLK 確實有作用,能在示波器看到clock
    GPIO pin確實可以亂用,沒有問題
    5v的收發器元件,直接連ESP32-C3可以動(另外一顆沒改)

  12. 我讓樹莓派送出任意封包(cangen),ESP32收到後,把CAN-ID加1再原封不動送回網路。最後在樹莓派印出所有包封(candump)。下圖ID收到43A打回43B!看到這張圖,10個小時值了!


[結論]

SHIT,文件要讀完再動手。不過這樣就下來,我對開發板的信心上升了

ESP32-C + J-Link除錯,這套工具的USB跑在High-Speed(480Mbits/s),用起來比ESP32-C3的Full-Speed(12Mbits/s)流暢很多


[ESP32-SDK寫起來的感覺]

古早時代玩8051,以前玩ARM7/9,我都看datasheet暫存器定義寫軟體,來回在文件和code掙扎,一點一滴搞定硬體。這麼古風的開發方式,可能只在IC設計公司還有,畢竟世上最懂硬體的人,讓他們寫driver很合理吧(苦笑)

開發STM32已經有包裝好的SDK,不用刻Driver了。寫STM32看得到main()進入點,一進來看得到底層的初始化,作業系統初始化。user code進入點還是很明確,從哪裡加料都很明確。意法半導體提供CubeIDE用GUI設定SDK訂製選項,使用起來很方便

ESP32的SDK就連main()都沒看到了,直接呼叫app_main()開始進入用戶的軟體,切割的感覺更明確。他們的文件做得很不錯,好好讀文件,掌握起來還滿明快的。ESP32的SDK大概從Linux Kernel挖了menuconfig出來做為配置手段,想改設定也算好用

像我這樣等IC都出來兩年才入坑,理論上比較不會遇到問題;其他早期使用者大概難免都會遇到SDK有問題,要跟原廠合作debug


留言

這個網誌中的熱門文章

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

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

CANON G3000 廢墨瓶改裝