2020年3月9日 星期一

車用電子漫談(二)--- 在STM32 上實現車用常用的匯流排CAN Bus

要說車用電子,就不得不說到車用系統所常用的一種通訊協定:CAN Bus 。

我之前已經在一些文章有稍微帶到關於 CAN Bus 的一些概念:

USB DIY--自學計畫_CAN Bus Application (一) --- 前言




不過,可能大家只要看到標題: USB DIY ,就可能認為這個東西應該還是屬於

USB 的系統應用範疇,或是認為這些平台離我真的太遠了,我可能真的用不到了。

這一點我也得承認,在第一篇文章中,我用了我常用的USB 控制IC 來外接一顆

 CAN Controller:MCP2515 ,其實我後來也有整合做了一塊PCB :


但這一種做法,真的不太親民了。為什麼?來看看我跟我在大陸朋友的微信:



我也知道我在系統應用上,早晚還是會碰到 32 bits 的MCU 的。--- 尤其是 STM32 。

就在前天,我終於向現實低頭了:開始架設 STM32 。並不是我要排斥 32 bits MCU,

而是真的要在系統應用上,真的需要才有必要啊。否則幹嘛給自己添麻煩呢?

我不是也沒有用過其他的 32 bits MCU 啊。做車用的 32 bits MCU 還有一款:


一樣是 ST 產品,只不過,人家真的是真正車用的 32 bits MCU : SPC560 系列。

所以我其實已經在這兩種不同平台上去實現 CAN Bus 的系統應用開發。

只不過,要在 STM32 上再搞一次而已。對我們來說:上手一顆MCU 需要很久時間嗎?

有時真的不是我們不想碰,而是真的要看到真正的應用才有用啊,要不然搞這麼多MCU

要玩死自己嗎?好吧,既然人家都勸我說了,真的現在一顆 STM32F103 便宜到、

或是說或多到滿街都是了。那幹嘛還要那麼堅持呢?那就開幹了囉:



就去新竹光復路的電子材料行直接去買一片帶有CAN Bus 的 STM32 平台的板子吧。

也不用再洗PCB ,就可以直接架起來開始寫程式了吧:


套一句上述微信中朋友所說的:現在搞 MCU 平台最簡單了啊:只要在網路上搜尋一下

Open Source 範例,抓下來稍微改寫編譯一下就可以搞定了。


這也沒啥大學問的,主要還是在於系統的Debug 與驗證吧。這時候可能還是需要周邊

的一些輔助環境,其實 CAN Bus 在車用系統的標準接頭是就是傳統RS232 用的DB9 接頭:


幸好這個接頭在這個領域裡還有一些系統應用,否則早在PC 周邊市場裡,已經不知道

早就被USB淘汰多久了啊。


基本上,CAN Bus ,只需要 CANH 及 CANL 即可,不太需要有GND,但我們有時為了

量測訊號檢測時,還是會需要GND 的,所以我們一般還是會接上GND 的。

接下來就是系統程式驗證了:
---


-----
----


其實這個程式很簡單,就是固定的送 8 組資料數據,然後最後一筆加入滾動效果,

以便我們觀察數據的動態傳輸。就這樣子,兩天就可以搞定一個新的MCU 系統

開發平台,並把我們所需要的介面打通。

其實,後續才是我們在系統應用上的挑戰,因為這些屬於 MCU 基礎應用對我們

這一種老鳥工程師,真的沒甚麼困難的。而是你要在系統上如何去發揮這個

CAN Bus 在車用系統上的功能,包括了其實在車用系統上,也是可以透過CAN Bus

來進行所謂的 IAP (In Application Programming) 的。這一點大家可是比較陌生的。

這在ISO(SAE 規範中是有定義的:)


這個我在另一篇文章中有稍微提過:他在規範中的命令組也是有定義的:

其實這些都是在車用電子系統開發中,都是很重要的規範依據的。所以搞MCU 程式開發

都只是很基礎功力而已,主要還是要如何在真正車用系統中如何發揮而已:

最後我就用一小段利用CAN Bus 在實際機車控制系統中開發的影片作為結尾:


-----

---

結語:在不同的MCU 平台上去開發系統,寫韌體程式,這些都不難,只要時間就可以了,

有經驗的,進入時間短,沒經驗就需要多一點時間磨練。

車用系統需要一些特殊經驗的累積,也不是光靠自己想像就可以,這些東西在全球車用

系統中,都有其規範可以依循,這也都需要時間去研讀與實現。

搞車用系統沒有捷徑,道理就是那麼簡單而已。

========================

PS : 關於CAN Bus 的技術內容,因為他的規範標準已經出來超過二十幾年了,

(都比USB 早很久),市面上或網路中,也有很多文章內容可以參考,有沒有特別

需要留意的地方?我個人認為應該沒有。

在MCU 的技術應用領域中,常用的連結介面有:I2C、SPI、UART、USB 及CAN 。

I2C 及 SPI 是屬於比較是小範圍,IC 與IC 或小模組之間的連結, 它們有主從觀念,

而且一開始就得要定義明確,傳輸內容沒有任何資料檢查機制。

UART (延伸常用的有RS232、RS485 及DMX512 等),也沒有很強的資料檢查機制,

對於內容格式也沒有一定的規範,沒有主從觀念,他只能算一種很基礎的連結介面。

至於USB 及CAN 都是屬於差動訊號的連結,對於惡劣環境來說都有一定的抵抗

能力,所以在使用上就一定得要用 Transceiver,而一般來說,USB 的Transceiver都是

內建在芯片中;但CAN 不是,他的Transceiver 是要額外外掛的。

USB 及CAN 的通訊都沒有帶有時脈(clock) 同步機制,它們完全是靠定義的Baudrate 

來決定的,USB 一般是固定的Baudrate ,無法調整,但CAN 可以視使用條件調整。

這兩者在資料傳輸封包中都已經含有資料檢查機制,都是屬於CRC 方式。

USB 有主從觀念,也是一開始就得要定義清楚,是固定的沒辦法改的。他的通訊內容

與封包應該是這些介面裡最嚴謹的,所以它的系統完善工夫也最大,維護也不容易,

所以一般人真的不容易維護,但她卻是對於與PC 之間的連結最成熟也成為最大宗

應用市場。所以在應用上跟PC 端的應用軟體有很大的關聯性。

CAN 有主從觀念,但不是一開始就定義的,主從觀念是視應用條件而改變,增加了

在系統之間使用彈性,CAN 只有定義封包格式,對資料內容沒有強制的要求與規範,

從這一點可以說是介於 USB 及 UART之間,所以他在韌體系統尚不需要有額外的

維護能力,但這個介面也不太可能能像UART 用韌體程式來模擬的。所以CAN 的介面

就得要倚賴MCU 芯片商來提供了,但我我認為市面上在不同的IC (芯片)中 的CAN

的定義都是一樣的。因為CAN Bus 這個東西的IP 智權是屬於 BOSCH 的,

您會發現市面上所有帶有CAN 的 MCU 之暫存器(Register) 的定義幾乎一樣的。

所以只要你懂了某一個IC 的CAN Bus 實現功能,對於其他平台的CAN Bus 介面

應該都是大同小異的。關於CAN 使用環境從小到兩個MCU之間,大可以到整個工廠

自動化,如果你沒機會體會CAN 在系統使用上的優點的話,真的就比較難接觸到

此一介面,但在車用應用系統中,他真的有其獨特的使用條件,他所延伸的周邊系統

,包括著軟硬體與許多設備,已經儼然是一個完整又成熟的產業標準了。

所以人家之所以會把CAN 納入新一代 32 bits MCU ,尤其是STM32 這樣大宗MCU

市場中,還是提供了CAN 介面,或許也是一個道理吧。

關於車用電子應用系統,有一塊很重要的系統驗證領域工作,測試是非常倚賴系統

中MCU 與外界之連結工作,這一部分CAN 就扮演著非常重要的角色,也幾乎說:

沒有了CAN ,還真的不知道怎麼搞車用電子系統?

在這一部分只要你有機會接觸到這方面的系統時,你大概就會體會得到。

從以前、目前與未來來說:人家CAN 能在這一塊領域站穩這一個領先地位不是沒有

道理的,主要還是在於你要怎麼用CAN Bus 吧。

這是我的經驗,分享給各位。

謝謝

(待續)

沒有留言:

張貼留言