了解SPI总线CAN控制器 MCP2515配置 一文即可
?1.引言
最近工作中遇到需要6路CAN通信的情況,單片機自帶的4路已不滿足實際需求,故采用了SPI總線的CAN控制器芯片MCP2515,通過SPI通信的CAN擴展芯片最高可實現1Mbps的遵循CAN 2.0B的協議通信,配置起來也比較繁瑣,故寫誕生了這篇文章。本篇中僅對基礎功能進行測試,如有疑問可留言交流或自行查看芯片手冊。
???2.硬件連接
由于該芯片主要起到SPI轉CAN控制器的效果,還需搭配CAN收發器才能進行正常的CAN通信,這里采用的是一款國產芯片,川土微電子公司的IF1042VS,也可選用其他收發器,保證暢通即可。
?3.芯片詳情
3.1 SPI接口
MCP2515支持最高10MHz的SPI通信,可直接與微控制器上的SPI外設連接,并支持模式0和模式3,遵從SPI協議,可通過CS引腳片選的下拉開啟通信;同時應注意,在傳輸另一個指令前應將片選置高后再拉低。
3.2?工作模式
MCP2515有5種工作模式,可通過CANCTRL寄存器的REQOP設置所需模式,要注意直到所有掛起的消息傳輸完成后,模式才會實際更改。通過CANSTAT寄存器的OPMODE可讀取當前模式,建議在模式更改后再讀取一下CANSTAT寄存器,以保證寫入成功并進入預定模式。
1)配置模式:芯片在激活前必須首先進行初始化。上電、使用RESET引腳,或更改CANCTRL寄存器的REQOP<2.0>等均可進入配置模式,以下寄存器只有在配置模式下才能被更改。
| CNF1, CNF2, CNF3 | 波特率配置 |
| TXRTSCTRL | 發送引腳配置 |
| Filter registers | 過濾器配置 |
| Mask registers | 掩碼配置 |
2)睡眠模式:MCP2515具有內部睡眠模式,用于最大限度地減少設備的當前消耗。即使MCP2515處于睡眠模式,SPI接口也會保持活動狀態以便讀取。更改CANCTRL寄存器可進入睡眠模式,在寫入寄存器后應進行讀取,以確保芯片進入睡眠模式。
>>睡眠喚醒:睡眠模式下,可通過CAN總線喚醒或通過SPI切換模式。通常情況下,CAN總線喚醒為常見用法,需要配置CANINTE寄存器開啟喚醒中斷,當接收到RXCAN引腳上的電平變化,導致從睡眠模式喚醒的報文及在喚醒中接收到的報文將被忽略,同時芯片被喚醒,INT引腳能捕捉到下降沿跳變,MCP2515會自動進入僅監聽模式,此時應手動設置芯片為正常模式。
3)僅監聽模式:僅監聽模式使MCP2515 可以接收包括錯誤報文在內的所有報文。這種模式可用于總線監視應用或熱插拔狀況下的波特率檢測。
4)環回模式:環回模式允許器件內部的發送緩沖器和接收緩沖器之間進行報文的自發自收,而無需通過?CAN 總線。此模式可用于系統開發和測試。
5)正常模式:該模式為?MCP2515 的標準工作模式。器件處于此模式下,會主動監視總線上的所有報文,并產生確認位和錯誤幀等。只有在正常模式下,MCP2515才能在 CAN總線上進行報文的傳輸。
3.3?操作指令
在MCP2515中,SPI發送的首個字節即為操作指令,下圖為操作指令集。
1)復位指令:重置寄存器初始化,使得芯片進入配置模式;建議在初始化的第一步執行本指令。
2)讀指令:將CS引腳拉低后,向MCP2515依次發送讀指令和?8 位地址碼,?MCP2515 會將指定地址寄存器中的數據通過?SO引腳移出。每一數據字節移出后,器件內部的地址指針將自動加一以指向下一個地址。因此,通過持續提供時鐘脈沖,可以對下一個連續地址寄存器進行讀操作。通過該方法可以順序讀取任意個連續地址寄存器中的數據。通過拉高CS引腳電平可以結束讀操作。
?3)讀接收緩沖區指令:讀取接收信息的常用指令,與讀指令相比,省略了一個字節的地址位,同時會在CS引腳拉高后自動清零接收標志位(CANINTF.RXnIF),不用手動執行清零指令,強烈建議在讀取接收緩沖區數據時使用本指令。
?4)寫指令:將CS引腳拉低后,向MCP2515依次發送寫指令、地址碼和至少一個字節的數據(如果是多個數據,其地址是連續的)。
?5)裝載發送緩沖區指令:和讀取接收緩沖區類似,該指令也省略了一個字節的地址位,可以更快速的寫入發送幀的標志ID、拓展ID、DLC和數據幀,同樣強烈建議使用該指令裝載發送幀。
?6)請求發送指令:使用RTS命令可以啟動一個或多個發送緩沖器的報文發送,該命令的bit3-bit0顯示了哪些發送緩沖器被使能發送,該命令會將緩沖器對應的TxBnCTRL.TXREQ 位置1;如果發送的RTS命令中nnn?=000,將忽略該命令。
7)位操作指令:該指令允許對寄存器的指定位進行置“1”或清零操作,在片選拉低后,以此發送位操作指令、寄存器地址、掩碼和數據碼,其中掩碼位為“1”的允許進行更改,“0”則不允許更改;對于允許更改的位,數據碼即為寄存器將被修改的目標碼。舉例如下:
?>>注意:并非所有寄存器均支持位操作指令,只有標灰色的寄存器可進行位操作。
?8)讀狀態指令:讀狀態指令允許單條指令訪問常用的報文接收和發送狀態位。
9)RX狀態指令:RX 狀態指令用于快速確定與報文和報文類型(標準幀、擴展幀或遠程幀)相匹配的過濾器。命令字節發送后,控制器會返回包含狀態信息的?8 位數據。
3.4 錯誤檢測
?MCP2515遵循了了CAN協議的錯誤檢測機制,以下將分別展開:
1)CRC校驗錯誤:使用循環冗余校驗(CRC),發送器為從幀開始到數據字段結束的位序列計算特殊校驗位。這個CRC序列在CRC字段中傳輸,接收節點也使用相同的公式計算CRC序列,并與接收到的序列進行比較。如果檢測到不匹配,則發生CRC錯誤并生成錯誤幀,并重復發送。
2)ACK應答錯誤:在消息的ACK字段中,發送器檢查其中是否包含顯性位。如果沒有,則認為沒有其他節點正確接收到該幀。已發生確認錯誤,將生成錯誤幀,并重復發送。
3)格式錯誤:如果節點在四個段,包括幀結束、幀間空間、確認分隔符或CRC分隔符中的一個段檢測到主導位,則發生格式錯誤并生成錯誤幀,并重復發送。
4)位錯誤:如果發送器檢測到與其發送的相反的位電平(即,發送顯性并檢測到隱性,或發送隱性并檢測到顯性),則發生位錯誤。
>>例外情況:在仲裁字段和確認槽中,如果發送方發送隱性位,檢測到顯性位,則不會產生誤碼,因為正在進行正常仲裁。
5)填充錯誤:如果在幀開始和CRC分隔符之間檢測到6個具有相同極性的連續位,則違反了位填充規則。發生一個填充錯誤并生成一個錯誤幀,并重復發送。
3.4.1 錯誤狀態:
檢測到的錯誤通過錯誤幀通知給所有其他節點,錯誤消息的傳輸被終止,報文幀被盡快重復。根據內部錯誤計數器的值,MCP2515包含兩個錯誤計數器:接收錯誤計數器(REC)和發送錯誤計數器(TEC),這些計數器根據CAN總線規范遞增/遞減。每個CAN節點處于三種錯誤狀態中的一種:
1. Error-active:節點可以不受任何限制地傳輸消息和活動錯誤幀(由主導位組成)的通常狀態
? ? 如果兩個錯誤計數器都低于128,則MCP2515為Error-active
2. Error-passive:可以傳輸消息和被動錯誤幀(由隱性位組成)
? ? 如果至少有一個錯誤計數器等于或超過128,則為Error-passive
3. Bus-off(發送方):消息既不能接收也不能發送
? ??如果TEC超過255的總線關閉限制,它將進入總線關閉。設備保持這種狀態,直到接收到? ? ? ? 總線斷開恢復序列。總線斷開恢復序列由128個連續的11位隱性位組成
MCP2515的當前錯誤模式可以由MCU通過EFLG寄存器讀取,此外,如果至少有一個錯誤計數器等于或超過錯誤警告限制96,則設置錯誤狀態警告標志位(EFLG:EWARN)。如果兩個錯誤計數器都小于錯誤警告限制,則復位EWARN。
4.初始化配置
4.1 復位
MCP2515上電時自動復位,但手冊中建議在初始化之前進行復位操作,可通過兩種方法進行復位:1)硬件復位:拉低RESET引腳;2)軟件復位:執行SPI復位指令。
博主這里復位后分別讀取了CANCTRL和?CANSTAT寄存器,在復位并進入配置模式時,CANCTRL為0x87,CANSTAT為0x80。兩個寄存器的位定義如下:
?4.2 波特率設置
?CAN在通信時,總線上的波特率必須保持一致,MCP2515使用數字鎖相環DPLL,將每個位時間分解成由最小時間周期組成的多個段,這個最小時間周期稱為時間量(TQ),改變CNF1、CNF2、CNF3寄存器,可以達到設定波特率的目的,其中Normal Bit Rate為通用比特率,以下簡稱NBR。
,,,
且需要滿足以下條件:
,?,
通過以上參數可知,結合電路中的晶振頻率為8MHz,且位時間大于等于5個TQ,因此這里給出在500kbps下的波特率配置參數:SyncSeg = 1TQ,PropSeg = 2TQ,PS1 = 3TQ,PS2 = 2TQ,BPR = 0,SJW = 0。相關配置寄存器如下:
4.3 發送配置
?在MCP2515中,共有3個可配置優先級的發送緩沖區(注意次優先級是芯片內部發送的優先順序,與CAN總線仲裁優先級應進行區分),在初始化時應至少配置所需緩沖區的發送優先級、CAN-ID和數據幀長度DLC,這里給出一種配置方式。
>>TXRTSCTRL?:使能/失能TXnRTS引腳的下降沿發送請求
>>TXBnCTRL :配置發送緩沖區發送優先級
>>TXBnDLC:配置遠程幀或數據幀及幀長度
>>使用裝載緩沖區指令或通過TXBnSIDH、TXBnSIDL、TXBnEID8、TXBnEID0、? ? ? ? ? ? ? ? ? ? TXBnDm寄存器寫入寫入CAN-ID、數據幀
>>翻轉TXnRTS引腳或使用RTS請求發送指令
其中,n為0-2分別對應3個發送緩沖區,m為0-7分別對應8個字節的數據幀
?4.4 接收配置
在MCP2515中,有兩個完整的接收緩沖區RXB0和RXB1,和一個獨立的消息裝載緩沖區MAB,在收到報文后首先會進入MAB,在滿足過濾器條件后才允許進入RXB0或RXB1。
1)優先級及過濾器
RXB0是擁有更高優先級的接收緩沖區,具有一個掩碼和兩個過濾器;RXB1為較低優先級接收,具有一個掩碼和四個過濾器。要啟用RXB0的濾波器,必須將RXB0CTRL.BUKT位置“1”,此時濾波器0-1對于RXB0是可用的;在RXB0CTRL.BUKT位置“1”的狀態下,濾波器0-5對于RXB1是可用的,在RXB0CTRL.BUKT位置“0”的狀態下,濾波器2-5對于RXB1是可用的,而RXB0無對應濾波器可供使用。
對于RXBnCTRL寄存器,還可設置RXM <1:0>位選擇緩沖區接收的CAN-ID是否允許標準id和擴展id的通過,配合掩碼和過濾器可進行更加詳細的篩選。掩碼和過濾器的真值表如下:
| 0 | X | X | 接收 |
| 1 | 0 | 0 | 接收 |
| 1 | 0 | 1 | 拒絕 |
| 1 | 1 | 0 | 拒絕 |
| 1 | 1 | 1 | 接收 |
2?)接收標志
當消息被移動到任何一個接收緩沖區時,相應的CANINTF.RXnIF位被置“1”。為了允許新的消息被接收到緩沖區,這個位必須被程序手動清除。這個位提供了一個正向的鎖定,以確保在MCP2515嘗試將一個新消息加載到接收緩沖區之前,咱們的微控制器已經完成了消息處理。
如果CANINTE.RXnIE位置“1”后,將在INT引腳上產生一個中斷,以指示已接收到有效消息。此外,如果配置為接收緩沖區滿引腳,相關的RXnBF引腳產生低電平,可以在單片機把連接RXnBF引腳的GPIO設置為下降沿觸發的外部中斷,在收到報文后,將數據幀轉移到fifo中,再將標志位CANINTF.RXnIF位清零。
3)配置樣例
綜上所述,在實際工程中,接收緩沖區RXB0應具有過濾器功能,這里給出配置方式:
>>BFPCTRL:RXBn接收信息可通過 RXnBF 引腳的下降沿獲取
>>RXBnCTRL:可接受滿足過濾器的標準id和拓展id,BUKT置“1”允許RXB0使用過濾器0-1
>>配置掩碼相關寄存器RXMnSIDH、RXMnSIDL、RXMnEID8、RXMnEID0
其中,n為0-1分別對應2個接收緩沖區的掩碼,一一對應
>>配置過濾器相關寄存器RXFnSIDH、RXFnSIDL、RXFnEID8、RXFnEID0
其中,n為0-5分別對應6個過濾器
?4.5 中斷配置
MCP2515有八個中斷源,八個中斷源分別為3個發送中斷,2個接收中斷,1個消息錯誤中斷,1個總線活動中斷,一個錯誤中斷。CANINTE寄存器包含了使能各中斷源的中斷使能位。CANINTF寄存器包含了各中斷源的中斷標志位。當發生中斷時,?INT 引腳將被MCP2515拉為低電平, 并保持低電平狀態直至MCU清除中斷。注意:中斷只有在引起相應中斷的條件消失后,才會被清除。
在3.2工作模式內提到過睡眠模式和總線喚醒,需要將CANINTE.WAKIE初始化為1;接收中斷開啟后,可以代替RX0BF和RX1BF引腳,節省兩個I/O資源;同時,為實時反饋CAN總線上的錯誤情況,需要將錯誤中斷使能;實際使用中,可以配置INT引腳為外部中斷,在觸發后讀取CANINTF寄存器查詢當前中斷源,再進行進一步處理。配置如下:
>>CANINTE:使能中斷
>>CANINTF:清零中斷標志
總結
以上是生活随笔為你收集整理的了解SPI总线CAN控制器 MCP2515配置 一文即可的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用arduino D1 wifi模块(
- 下一篇: A Winged Steed