STM32內建已經有CANBus了~這篇主要是練習SPI並透過MCP2515去實現CanBus通訊!
先來介紹一下MCP2515模組,他已經將MCP2515與TJA1050整合起來了,可以直接透過SPI去做驅動!
接下來我們來先看一下這塊模組的DataSheet看看到底要如何使用它來實現CANBus通訊!
這一段提到在發送之前至少需要將TxBnSIDH、TxBnSIDL、TxBnDLC寫入對應位元,假設有資料要發送則需要將TxBnDm填入要發送的資料,同時將TXBnSIDL.EXIDE設為1。
下方的Note則提到發送之前需要將TXBnCTRL.TXREQ設為0(代表目前沒有正在等待發送的資料)
接下來看看有關於傳送到底有那些暫存器吧~
再MCP2515當中有兩個接收Buffer,分別是RXB0跟RXB1會優先使用RXB0來做接收。
上方圖片為手冊當中說明如何接收,當接收到資料時會將CANINTF.RXnIF位設置為1,代表著接收到訊息並觸發中斷,這部分必須要由MCU再次將它設置為0才可以接收下一筆訊息。
接著同樣來看看與接收相關的暫存器有哪些吧!
前一篇文有提到CANBus在接收訊息時會需要驗證ID、Mask與Filter來確定資料是否接收。
在MCP2515當中同樣需要去做設定~建議在做測試時將Mask通通設定為0即可!
Mask Bit n | Filter Bit n | Message Identifier Bit | Accept or Reject Bit n |
---|---|---|---|
0 | x (任意值) | x (任意值) | Accept |
1 | 0 | 0 | Accept |
1 | 0 | 1 | Reject |
1 | 1 | 0 | Reject |
1 | 1 | 1 | Accept |
CANBus當中所有節點都必須以相同的Nominal Bit rate進行通訊,但不是所有的節點設備都具有相同的系統時鐘頻率,所以需要去Prescaler去對單位時間(TQ)做調整已達到相同的Nominal Bit rate。
PropSeg : 補償節點間的物理傳輸延遲時間,可設定1-8TQ
PS1與PS2 : 補償Bus上的邊緣相位誤差,其中PS1可設定1-8TQ PS2可設置2-8TQ
BRP : Bit rate 預分頻器
1.可以得知tbit = 1/125kpbs = 8us(SyncSeg + PropSeg + PS1 +PS2 = 8TQ)
2.TQ = 2 * (7+1) / 16M = 1us (這時則會在CNF1中填入0x07)
接著CNF2當中的bit 7 (BTLMODE)選擇1,也就是由CNF3去決定PS2長度
3.SyncSeg固定為1TQ 而PropSeg也選擇 1TQ,這時已有2TQ則代表PS1與PS2共為6TQ,希望採樣點落在大約60~90%之間,可以選擇PS1為3 or 4TQ。
假設為3則是(1+1+3)/8TQ=62.5% ; 4則為(1+1+4)/8TQ = 75%。
4.若選擇PS1 = 3TQ則CNF2應該填入0x90
5.根據上方Sync = 1 Prop = 1 PS1 = 3,所以PS2 = 3。這時CNF3可以填入0x02
有五種工作模式分別為設置、正常、休眠、監聽、環回
當需要對ID Mask Filter做設置時,一定要進入設置模式才可以做修改,修改完畢後需要退出設置模式。手邊有兩組設備的話可以透過正常模式去做測試與接收,只有一組可以利用環回模式進行測試。
這邊介紹幾個較常使用的SPI指令,其餘可以參考手冊當中說明。
這一篇主要介紹MCP2515 如何去做使用以及詳細的設置說明,下一篇會介紹如何撰寫MCP2515的程式碼~
以上參考資料來源 : MCP2515 DataSheet