iT邦幫忙

0

STM32-13 透過SPI驅動MCP2515實現CAN(上)

  • 分享至 

  • xImage
  •  

STM32內建已經有CANBus了~這篇主要是練習SPI並透過MCP2515去實現CanBus通訊!

先來介紹一下MCP2515模組,他已經將MCP2515與TJA1050整合起來了,可以直接透過SPI去做驅動!
https://ithelp.ithome.com.tw/upload/images/20220318/20146325YJuiWKDGzK.png
接下來我們來先看一下這塊模組的DataSheet看看到底要如何使用它來實現CANBus通訊!


傳送

https://ithelp.ithome.com.tw/upload/images/20220318/20146325Z8aGufuh50.png
這一段提到在發送之前至少需要將TxBnSIDH、TxBnSIDL、TxBnDLC寫入對應位元,假設有資料要發送則需要將TxBnDm填入要發送的資料,同時將TXBnSIDL.EXIDE設為1。

下方的Note則提到發送之前需要將TXBnCTRL.TXREQ設為0(代表目前沒有正在等待發送的資料)

接下來看看有關於傳送到底有那些暫存器吧~

  1. TXBnCTRL :發送緩衝器n控制暫存器,MCP2515具有3個發送緩衝器(TxB0-TxB2),主要設置優先權與觸發傳送。可以看到當中bit3為TXREQ再傳送時須將此位設1,並在發送後會自動清0。
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325Ky4kTww7sg.png
  2. TXBnSIDH/TXBnSIDL/TXBnEID8/TXBnEID0 : 這邊則是設置ID的部分拉,也就是上一篇所提到仲裁碼設置,SIDH與SIDL是標準格式(CAN2.0A)的ID設置,假設要使用擴展格式(CAN2.0B)則將SIDL當中EXIDE位設置為1,並將後續EID8與EID0填入資料就可以拉~
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325Ee7w4khbBR.png
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325cp3lNBuwCM.png
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325AGOSTZyVl2.png
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325Cn8OvEMkPG.png
  3. TXBnDLC : 資料長度暫存器用來寫入資料長度or是否為遠端框架。依據後續data資料選擇填入對應的資料長度,若為遠端框架則將RTR位設置為1。
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325z5gQ3sX4Sl.png
  4. TXBnDm0-TXBnDm7 : 傳送資料暫存器,如果傳送訊息中帶有資料,則將所要傳送的資料寫入此暫存器,並將對應資料量填入上方DLC當中。
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325fwbwSsOnh2.png

接收

再MCP2515當中有兩個接收Buffer,分別是RXB0跟RXB1會優先使用RXB0來做接收。
https://ithelp.ithome.com.tw/upload/images/20220318/20146325ZbGUNz1ZOm.png
上方圖片為手冊當中說明如何接收,當接收到資料時會將CANINTF.RXnIF位設置為1,代表著接收到訊息並觸發中斷,這部分必須要由MCU再次將它設置為0才可以接收下一筆訊息。

接著同樣來看看與接收相關的暫存器有哪些吧!

  1. RXB0CTRL : 接收緩衝控制暫存器,用來設定接收訊息的條件與是否可接受滾存。(滾存為當RXB0已存在訊息時,下一條訊息不管條件為何皆由RXB1先接收)
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325vUWqIQ83oC.png
  2. RXBnSIDH/RXBnSIDL/RXBnEID8/RXBnEID0 : 接收仲裁碼暫存器,當接收訊息時會將該訊息的ID寫入,依照標準與擴展格式分別填入。要注意這四個Register只提供讀而已!
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325XuddwRQeQj.png
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325gee2yqPXNb.png
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325qzTr7Eb1uH.png
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325E71sqMvLPG.png
  3. RXBnDLC :接收資料長度暫存器,同樣只能做讀取,在接收到資料時可以依照此暫存器查看是否會RTR以及該筆訊息所帶資料長度。
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325tCnPPw5pGz.png
  4. RXBnDm: 接收資料暫存器,當有資料接收時依照上方DLC長度來將資料陸續寫入此暫存器,同樣僅提供讀取而已。
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325gajWjTqCDM.png

Mask 與 Filter設置

前一篇文有提到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

Filter相關暫存器

  1. RXFnSIDH/RXFnSIDL/RXFnEID8/RXFnEID0 : 同樣依照是選擇標準格式還是擴展格式來選填,標準格式只需填入RXFnSIDH/RXFnSIDL擴展格式則須寫入4個暫存器。
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325h09o6haevG.png
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325YBB8tBuaTx.png
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325kVvihz9A1Y.png
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325fZdIEgb0WH.png

Mask相關暫存器

  1. RXMnSIDH/RXMnSIDL/RXMnEID8/RXMnEID0 : 與上方Filter設定方式相同,建議在Mask當中填入0去做測試,方便接收所有ID訊息。
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325ibGboOBWGM.png
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325NQa6AslJJ7.png
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325g9SaDqKXRD.png
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325ANZo35zmRr.png

BIT TIMING

CANBus當中所有節點都必須以相同的Nominal Bit rate進行通訊,但不是所有的節點設備都具有相同的系統時鐘頻率,所以需要去Prescaler去對單位時間(TQ)做調整已達到相同的Nominal Bit rate。
https://chart.googleapis.com/chart?cht=tx&chl=NBR%20%3D%20fbit%20%3D%201%20%2Ftbit
https://chart.googleapis.com/chart?cht=tx&chl=tbit%20%3D%20tsyncSeg%20%2B%20tPropSeg%20%2B%20tPS1%20%2B%20tPS2
https://ithelp.ithome.com.tw/upload/images/20220318/2014632575xFcOIrSx.png
PropSeg : 補償節點間的物理傳輸延遲時間,可設定1-8TQ

PS1與PS2 : 補償Bus上的邊緣相位誤差,其中PS1可設定1-8TQ PS2可設置2-8TQ

如何計算TQ

https://chart.googleapis.com/chart?cht=tx&chl=TQ%20%3D%202%20*%20BRP%20*%20TOSC%20%3D%202%20*%20%20(BRP%2B1)%20%2F%20FOSC
BRP : Bit rate 預分頻器

同步

  1. 硬同步 : Bus在空閒狀態時發生1→0的跳變邊沿狀況時進行應同步
  2. 再同步 : 可能會導致PS1延長orPS2縮短,由SJW(同步跳轉寬度)決定,會有以下三種情況(PS1 = PS1+SJW PS2 = PS2-SJW),SJW可設定1-4TQ
  • 不發生再同步 : 當Input Single 發生跳變(1→0)在同步區段當中(SyncSeg),則無相位誤差無須調整。
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325mRZAJ40NWR.png
  • 與較慢的發送設備再同步 : 當Input Single 發生跳變(1→0)大於同步區段(SyncSeg)且誤差為正,則PS1加上SJW。
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325fV4vVyoLj5.png
  • 與較快的發送設備再同步 : 當Input Single 發生跳變(1→0)大於同步區段(SyncSeg)且誤差為負時,則PS2減去SJW。
    https://ithelp.ithome.com.tw/upload/images/20220318/201463255bCfvwJJIM.png

設置時間段時應注意

  1. PropSeg + PS1 ≥ PS2
  2. PropSeg + PS2 ≥Tdelay
  3. PS2>SJW

相關暫存器設置

  1. CNF1 : bit6-7為同步跳轉寬度(SJW),通常設置為1-2TQ bit5-0則為預分頻係數設置。
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325rGEBa0mBtW.png
  2. CNF2 : 設置PropSeg 、PS1與採樣位置,當SAM設置為0採樣一次1則為3次採樣點位置應該位於60%-90%
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325HlcTCnze17.png
  3. CNF3 : 設置SOF與PS2
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325aas6n4T3Iv.png
    EX : 假如FOSC = 16M BRP=7 且希望得到BRT為125kbps

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


中斷

  1. CANINTE 中斷致能暫存器 : 可以選擇開啟哪一類型中斷,0位禁止1為開啟。在測試時我們會使用RXB0去做接收,可以開啟RXB0接收中斷。
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325yuo7PBFwgX.png
  2. CANINTF 中斷旗標暫存器 : 當觸發中斷後會將該對應中斷設為1表示出發中斷,當處理完後需要手動設置為0清除中斷旗標,以RXB0來說當接收完畢訊息需要在手動清0。
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325oMUZakjrPX.png

工作模式

有五種工作模式分別為設置、正常、休眠、監聽、環回

當需要對ID Mask Filter做設置時,一定要進入設置模式才可以做修改,修改完畢後需要退出設置模式。手邊有兩組設備的話可以透過正常模式去做測試與接收,只有一組可以利用環回模式進行測試。

  1. CANCTRL : CAN控制暫存器用來設置工作模式
    https://ithelp.ithome.com.tw/upload/images/20220318/201463255k1WE0y79j.png
  2. CANSTAT : CAN狀態暫存器,可以用來查看目前所屬工作模式與中斷狀況
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325j0EpORLWsj.png

SPI 指令

這邊介紹幾個較常使用的SPI指令,其餘可以參考手冊當中說明。
https://ithelp.ithome.com.tw/upload/images/20220318/20146325QvLYHrnTGm.png

  1. Reset : 直接透過SPI發送0xC0即可進入配置模式
  2. Read : 可以看到下圖優先將CS拉低後,透過MOSI傳送0x03(讀指令)接著接上要讀取的暫存器地址,即可透過MISO獲得該暫存器資料。
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325OKTFV3Fcop.png
  3. BYTE WRITE : 向指定暫存器寫入一個byte,指令後方接上寫入地址與寫入資料
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325H84B5fmluT.png
  4. REQUEST-TO-SEND (RTS) :請求發送指令,當資料裝載完畢後透過此指令可以發送訊息,其中T2 T1 T0分別為對應3個TxBuffer。
    https://ithelp.ithome.com.tw/upload/images/20220318/20146325wx32Goh7d0.png

這一篇主要介紹MCP2515 如何去做使用以及詳細的設置說明,下一篇會介紹如何撰寫MCP2515的程式碼~
以上參考資料來源 : MCP2515 DataSheet


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言