Select Page

想做一個有關CAN Bus的專案已經有一段時間,在學校雖然有學過相關的理論知識,知道汽車內大部分ECU之間的溝通都是通過CAN,一直疑惑到底實際上是怎麼實現的。在這個Project中,兩個Tiva C Launchpad(TM4C123G)透過CAN Bus傳輸資訊。並使用UART和電腦通訊做監控。程式碼可以在我的github上找到。

電路

硬體能否透過CAN Bus通訊取決於是否有內建的CAN Moudule,如果沒有內建(eg. Arduino)則需外接,可以使用MCP2515這個IC。我使用的TM4C123G是有內建CAN Moudule的,但即使如此,CAN Bus的通訊需要24V,所以還是需要MCP2551這個CAN Tranciever才行。電路參考dronespersonalizados的接法。

canbus-schematic

Stellaris是舊款的產品,不過和Tiva系列相容。我自己的接法如下:

Hardware.jpg

會有Arduino完全只是因為MCP2551需要5V的供電,而Tiva上面只有3.3V。一堆電阻也是因為身邊沒有剛好120歐姆的電阻所以用湊的。兩塊板子都使用PE4的腳位當作CAN0Rx,PE5的腳位當作CAN0Tx,並透過MCP2551和CAN_H、CAN_L連接。

軟體

德州儀器針對Tiva系列產品提供了函式庫Tivaware,來讓使用者可以簡單存取各種通訊界面。使用的方法可以參考這篇文章。有兩個部份需要特別注意,predefined symbol的部分使用TARGET_IS_TM4C123_RA1;專案要額外加入uartstdio.c到path,軟體大部分使用Ohm Ninja的程式碼,但他使用的兩塊板子分別是TM4C123G和TM4C1294,而我使用兩塊TM4C123G,因為TM4C123G只有一個CAN的接口,所以在這部分做了修改。完整程式碼可以在我的github上找到。

測試

經過了漫長的debug後總算可以成功運作。使用putty來透過UART監控收發的狀態。

Master_sendSlave_receive

可以看到接收端正確收到發送端的訊息,不過中間也有一次CAN Bus Error的情況。