1. 程式人生 > >CAN通信詳解

CAN通信詳解

target 互聯 jta 多個 技術支持 0kb div body 濾波器

30.1 CAN簡介

30.2 硬件設計

30.3 軟件設計

30.4 下載驗證

CAN 是Controller Area Network 的縮寫(以下稱為CAN),是ISO國際標準化的串行通信協議。在當前的汽車產業中,出於對安全性、舒適性、方便性、低公害、低成本的要求,各種各樣的電子控制系統被開發了出來。由於這些系統之間通信所用的數據類型及對可靠性的要求不盡相同,由多條總線構成的情況很多,線束的數量也隨之增加。為適應“減少線束的數量”、“通過多個LAN,進行大量數據的高速通信”的需要,1986 年德國電氣商博世公司開發出面向汽車的CAN 通信協議。此後,CAN 通過ISO11898 及ISO11519 進行了標準化,現在在歐洲已是汽車網絡的標準協議。   

現在,CAN 的高性能和可靠性已被認同,並被廣泛地應用於工業自動化、船舶、醫療設備、工業設備等方面。現場總線是當今自動化領域技術發展的熱點之一,被譽為自動化領域的計算機局域網。它的出現為分布式控制系統實現各節點之間實時、可靠的數據通信提供了強有力的技術支持。

CAN 控制器根據兩根線上的電位差來判斷總線電平。總線電平分為顯性電平和隱性電平,二者必居其一。發送方通過使總線電平發生變化,將消息發送給接收方。

CAN協議具有一下特點:

1) 多主控制。在總線空閑時,所有單元都可以發送消息(多主控制),而兩個以上的單元同時開始發送消息時,根據標識符(Identifier 以下稱為 ID)決定優先級。ID 並不是表示發送的目的地址,而是表示訪問總線的消息的優先級。兩個以上的單元同時開始發送消息時,對各消息ID 的每個位進行逐個仲裁比較。仲裁獲勝(被判定為優先級最高)的單元可繼續發送消息,仲裁失利的單元則立刻停止發送而進行接收工作。

2) 系統的若軟性。與總線相連的單元沒有類似於“地址”的信息。因此在總線上增加單元時,連接在總線上的其它單元的軟硬件及應用層都不需要改變。

3) 通信速度較快,通信距離遠。最高1Mbps(距離小於40M),最遠可達10KM(速率低於5Kbps)。

4) 具有錯誤檢測、錯誤通知和錯誤恢復功能。所有單元都可以檢測錯誤(錯誤檢測功能),檢測出錯誤的單元會立即同時通知其他所有單元(錯誤通知功能),正在發送消息的單元一旦檢測出錯誤,會強制結束當前的發送。強制結束發送的單元會不斷反復地重新發送此消息直到成功發送為止(錯誤恢復功能)。

5) 故障封閉功能。CAN 可以判斷出錯誤的類型是總線上暫時的數據錯誤(如外部噪聲等)還是持續的數據錯誤(如單元內部故障、驅動器故障、斷線等)。由此功能,當總線上發生持續數據錯誤時,可將引起此故障的單元從總線上隔離出去。

6) 連接節點多。CAN 總線是可同時連接多個單元的總線。可連接的單元總數理論上是沒有限制的。但實際上可連接的單元數受總線上的時間延遲及電氣負載的限制。降低通信速度,可連接的單元數增加;提高通信速度,則可連接的單元數減少。

正是因為CAN協議的這些特點,使得CAN特別適合工業過程監控設備的互連,因此,越來越受到工業界的重視,並已公認為最有前途的現場總線之一。

CAN協議經過ISO標準化後有兩個標準:ISO11898標準和ISO11519-2標準。其中ISO11898是針對通信速率為125Kbps~1Mbps的高速通信標準,而ISO11519-2是針對通信速率為125Kbps以下的低速通信標準。

本章,我們使用的是450Kbps的通信速率,使用的是ISO11898標準,該標準的物理層特征如圖30.1.1所示:

技術分享圖片

圖30.1.1 ISO11898物理層特性

從該特性可以看出,顯性電平對應邏輯0,CAN_H和CAN_L之差為2.5V左右。而隱性電平對應邏輯1,CAN_H和CAN_L之差為0V。在總線上顯性電平具有優先權,只要有一個單元輸出顯性電平,總線上即為顯性電平。而隱形電平則具有包容的意味,只有所有的單元都輸出隱性電平,總線上才為隱性電平(顯性電平比隱性電平更強)。另外,在CAN總線的起止端都有一個120Ω的終端電阻,來做阻抗匹配,以減少回波反射。

CAN協議是通過以下5種類型的幀進行的:

l 數據幀

l 要控幀

l 錯誤幀

l 過載幀

l 幀間隔

另外,數據幀和遙控幀有標準格式和擴展格式兩種格式。標準格式有11 個位的標識符(ID),擴展格式有29 個位的ID。各種幀的用途如表30.1.1所示:

幀類型

幀用途

數據幀

用於發送單元向接收單元傳送數據的幀

遙控幀

用於接收單元向具有相同 ID 的發送單元請求數據的幀

錯誤幀

用於當檢測出錯誤時向其它單元通知錯誤的幀

過載幀

用於接收單元通知其尚未做好接收準備的幀

間隔幀

用於將數據幀及遙控幀與前面的幀分離開來的幀

表30.1.1 CAN協議各種幀及其用途

由於篇幅所限,我們這裏僅對數據幀進行詳細介紹,數據幀一般由7個段構成,即:

(1) 幀起始。表示數據幀開始的段。

(2) 仲裁段。表示該幀優先級的段。

(3) 控制段。表示數據的字節數及保留位的段。

(4) 數據段。數據的內容,一幀可發送0~8個字節的數據。

(5) CRC段。檢查幀的傳輸錯誤的段。

(6) ACK段。表示確認正常接收的段。

(7) 幀結束。表示數據幀結束的段。

數據幀的構成如圖30.1.2所示:

技術分享圖片


圖30.1.2 數據幀的構成

圖中D表示顯性電平,R表示隱形電平(下同)。

幀起始,這個比較簡單,標準幀和擴展幀都是由1個位的顯性電平表示幀起始。

仲裁段,表示數據優先級的段,標準幀和擴展幀格式在本段有所區別,如圖30.1.3所示:

技術分享圖片

圖30.1.3 數據幀仲裁段構成

標準格式的ID 有11 個位。從ID28 到ID18 被依次發送。禁止高7 位都為隱性(禁止設定:ID=1111111XXXX)。擴展格式的 ID 有29 個位。基本ID 從ID28 到ID18,擴展ID 由ID17 到ID0 表示。基本ID和標準格式的ID 相同。禁止高7 位都為隱性(禁止設定:基本ID=1111111XXXX)。

其中RTR位用於標識是否是遠程幀(0,數據幀;1,遠程幀),IDE位為標識符選擇位(0,使用標準標識符;1,使用擴展標識符),SRR位為代替遠程請求位,為隱性位,它代替了標準幀中的RTR位。

控制段,由6個位構成,表示數據段的字節數。標準幀和擴展幀的控制段稍有不同,如圖30.1.4所示:

技術分享圖片

圖30.1.4 數據幀控制段構成

上圖中,r0和r1為保留位,必須全部以顯性電平發送,但是接收端可以接收顯性、隱性及任意組合的電平。DLC段為數據長度表示段,高位在前,DLC段有效值為0~8,但是接收方接收到9~15的時候並不認為是錯誤。

數據段,該段可包含0~8個字節的數據。從最高位(MSB)開始輸出,標準幀和擴展幀在這個段的定義都是一樣的。如圖30.1.5所示:

技術分享圖片

圖30.1.5 數據幀數據段構成

CRC段,該段用於檢查幀傳輸錯誤。由15個位的CRC順序和1個位的CRC界定符(用於分隔的位)組成,標準幀和擴展幀在這個段的格式也是相同的。如圖30.1.6所示:

技術分享圖片

圖30.1.6 數據幀CRC段構成

此段CRC的值計算範圍包括:幀起始、仲裁段、控制段、數據段。接收方以同樣的算法計算 CRC 值並進行比較,不一致時會通報錯誤。

ACK段,此段用來確認是否正常接收。由ACK槽(ACK Slot)和ACK界定符2個位組成。標準幀和擴展幀在這個段的格式也是相同的。如圖30.1.7所示:

技術分享圖片

圖30.1.7 數據幀CRC段構成

發送單元的ACK,發送2個位的隱性位,而接收到正確消息的單元在ACK槽(ACK Slot)發送顯性位,通知發送單元正常接收結束,這個過程叫發送ACK/返回ACK。發送 ACK 的是在既不處於總線關閉態也不處於休眠態的所有接收單元中,接收到正常消息的單元(發送單元不發送ACK)。所謂正常消息是指不含填充錯誤、格式錯誤、CRC 錯誤的消息。

幀結束,這個段也比較簡單,標準幀和擴展幀在這個段格式一樣,由7個位的隱性位組成。

至此,數據幀的7個段就介紹完了,其他幀的介紹,請大家參考光盤的CAN入門書.pdf相關章節。接下來,我們再來看看CAN的位時序。

由發送單元在非同步的情況下發送的每秒鐘的位數稱為位速率。一個位可分為 4 段。

l 同步段(SS)

l 傳播時間段(PTS)

l 相位緩沖段1(PBS1)

l 相位緩沖段2(PBS2)

這些段又由可稱為 Time Quantum(以下稱為Tq)的最小時間單位構成。

1 位分為4 個段,每個段又由若幹個Tq 構成,這稱為位時序。

1 位由多少個Tq 構成、每個段又由多少個Tq 構成等,可以任意設定位時序。通過設定位時序,多個單元可同時采樣,也可任意設定采樣點。各段的作用和 Tq 數如表30.1.2所示:

技術分享圖片

表30.1.2 一個位各段及其作用

1個位的構成如圖30.1.8所示:

技術分享圖片

圖30.1.8 一個位的構成

上圖的采樣點,是指讀取總線電平,並將讀到的電平作為位值的點。位置在 PBS1 結束處。根據這個位時序,我們就可以計算CAN通信的波特率了。具體計算方法,我們等下再介紹,前面提到的CAN協議具有仲裁功能,下面我們來看看是如何實現的。

在總線空閑態,最先開始發送消息的單元獲得發送權。

當多個單元同時開始發送時,各發送單元從仲裁段的第一位開始進行仲裁。連續輸出顯性電平最多的單元可繼續發送。實現過程,如圖30.1.9所示:

技術分享圖片

圖30.1.9 CAN總線仲裁過程

上圖中,單元1和單元2同時開始向總線發送數據,開始部分他們的數據格式是一樣的,故無法區分優先級,直到T時刻,單元1輸出隱性電平,而單元2輸出顯性電平,此時單元1仲裁失利,立刻轉入接收狀態工作,不再與單元2競爭,而單元2則順利獲得總線使用權,繼續發送自己的數據。這就實現了仲裁,讓連續發送顯性電平多的單元獲得總線使用權。

通過以上介紹,我們對CAN總線有了個大概了解(詳細介紹參考光盤的:《CAN入門書.pdf》),接下來我們介紹下STM32的CAN控制器。

STM32自帶的是bxCAN,即基本擴展CAN。它支持CAN協議2.0A和2.0B。它的設計目標是,以最小的CPU負荷來高效處理大量收到的報文。它也支持報文發送的優先級要求(優先級特性可軟件配置)。對於安全緊要的應用,bxCAN提供所有支持時間觸發通信模式所需的硬件功能。

STM32的bxCAN的主要特點有:

l 支持CAN協議2.0A和2.0B主動模式

l 波特率最高達1Mbps

l 支持時間觸發通信

l 具有3個發送郵箱

l 具有3級深度的2個接收FIFO

l 可變的過濾器組(最多28個)

在STM32互聯型產品中,帶有2個CAN控制器,而我們使用的STM32F103ZET6屬於增強型,不是互聯型,只有1個CAN控制器。雙CAN的框圖如圖30.1.10所示:

技術分享圖片

圖30.1.10 雙CAN框圖

從圖中可以看出兩個CAN都分別擁有自己的發送郵箱和接收FIFO,但是他們共用28個濾波器。通過CAN_FMR寄存器的設置,可以設置濾波器的分配方式。

STM32的標識符過濾是一個比較復雜的東東,它的存在減少了CPU處理CAN通信的開銷。STM32的過濾器組最多有28個(互聯型),但是STM32F103ZET6只有14個(增強型),每個濾波器組x由2個32為寄存器,CAN_FxR1和CAN_FxR2組成。

STM32每個過濾器組的位寬都可以獨立配置,以滿足應用程序的不同需求。根據位寬的不同,每個過濾器組可提供:

● 1個32位過濾器,包括:STDID[10:0]、EXTID[17:0]、IDE和RTR位

● 2個16位過濾器,包括:STDID[10:0]、IDE、RTR和EXTID[17:15]位

此外過濾器可配置為,屏蔽位模式和標識符列表模式。

在屏蔽位模式下,標識符寄存器和屏蔽寄存器一起,指定報文標識符的任何一位,應該按照“必須匹配”或“不用關心”處理。

而在標識符列表模式下,屏蔽寄存器也被當作標識符寄存器用。因此,不是采用一個標識符加一個屏蔽位的方式,而是使用2個標識符寄存器。接收報文標識符的每一位都必須跟過濾器標識符相同。

通過CAN_FMR寄存器,可以配置過濾器組的位寬和工作模式,如圖30.1.11所示:

技術分享圖片

圖30.1.11 過濾器組位寬模式設置

為了過濾出一組標識符,應該設置過濾器組工作在屏蔽位模式。

為了過濾出一個標識符,應該設置過濾器組工作在標識符列表模式。

應用程序不用的過濾器組,應該保持在禁用狀態。

過濾器組中的每個過濾器,都被編號為(叫做過濾器號,圖30.1.11中的n)從0開始,到某個最大數值-取決於過濾器組的模式和位寬的設置。

舉個簡單的例子,我們設置過濾器組0工作在:1個32為位過濾器-標識符屏蔽模式,然後設置CAN_F0R1=0XFFFF0000,CAN_F0R2=0XFF00FF00。其中存放到CAN_F0R1的值就是期望收到的ID,即我們希望收到的映像(STID+EXTID+IDE+RTR)最好是:0XFFFF0000。而0XFF00FF00就是設置我們需要必須關心的ID,表示收到的映像,其位[31:24]和位[15:8]這16個位的必須和CAN_F0R1中對應的位一模一樣,而另外的16個位則不關心,可以一樣,也可以不一樣,都認為是正確的ID,即收到的映像必須是0XFFxx00xx,才算是正確的(x表示不關心)。

關於標識符過濾的詳細介紹,請參考《STM32參考手冊》的22.7.4節(431頁)。接下來,我們看看STM32的CAN發送和接收的流程。

CAN發送流程

CAN發送流程為:程序選擇1個空置的郵箱(TME=1)à設置標識符(ID),數據長度和發送數據à設置CAN_TIxR的TXRQ位為1,請求發送à郵箱掛號(等待成為最高優先級)à預定發送(等待總線空閑)à發送à郵箱空置。整個流程如圖30.1.12所示:

技術分享圖片

圖30.1.12 發送郵箱

上圖中,還包含了很多其他處理,不強制退出發送(ABRQ=1)和發送失敗處理等。通過這個流程圖,我們大致了解了CAN的發送流程,後面的數據發送,我們基本就是按照此流程來走。接下來再看看CAN的接收流程。

CAN接收流程

CAN接收到的有效報文,被存儲在3級郵箱深度的FIFO中。FIFO完全由硬件來管理,從而節省了CPU的處理負荷,簡化了軟件並保證了數據的一致性。應用程序只能通過讀取FIFO輸出郵箱,來讀取FIFO中最先收到的報文。這裏的有效報文是指那些正確被接收的(直到EOF都沒有錯誤)且通過了標識符過濾的報文。前面我們知道CAN的接收有2個FIFO,我們每個濾波器組都可以設置其關聯的FIFO,通過CAN_FFA1R的設置,可以將濾波器組關聯到FIFO0/FIFO1。

CAN接收流程為:FIFO空à收到有效報文à掛號_1(存入FIFO的一個郵箱,這個由硬件控制,我們不需要理會)à收到有效報文à掛號_2à收到有效報文à掛號_3à收到有效報文à溢出。

這個流程裏面,我們沒有考慮從FIFO讀出報文的情況,實際情況是:我們必須在FIFO溢出之前,讀出至少1個報文,否則下個報文到來,將導致FIFO溢出,從而出現報文丟失。每讀出1個報文,相應的掛號就減1,直到FIFO空。CAN接收流程如圖30.1.13所示:

技術分享圖片

圖30.1.13 FIFO接收報文

FIFO接收到的報文數,我們可以通過查詢CAN_RFxR的FMP寄存器來得到,只要FMP不為0,我們就可以從FIFO讀出收到的報文。

接下來,我們簡單看看STM32的CAN位時間特性,STM32的CAN位時間特性和之前我們介紹的,稍有點區別。STM32把傳播時間段和相位緩沖段1(STM32稱之為時間段1)合並了,所以STM32的CAN一個位只有3段:同步段(SYNC_SEG)、時間段1(BS1)和時間段2(BS2)。STM32的BS1段可以設置為1~16個時間單元,剛好等於我們上面介紹的傳播時間段和相位緩沖段1之和。STM32的CAN位時序如圖30.1.14所示:

技術分享圖片

圖30.1.14 STM32 CAN位時序

圖中還給出了CAN波特率的計算公式,我們只需要知道BS1和BS2的設置,以及APB1的時鐘頻率(一般為36Mhz),就可以方便的計算出波特率。比如設置TS1=6、TS2=7和BRP=4,在APB1頻率為36Mhz的條件下,即可得到CAN通信的波特率=36000/[(7+8+1)*5]=450Kbps。

接下來,我們介紹一下本章需要用到的一些比較重要的寄存器。首先,來看CAN的主控制寄存器(CAN_MCR),該寄存器各位描述如圖30.1.15:

技術分享圖片

圖30.1.15 寄存器CAN_MCR各位描述

該寄存器的詳細描述,請參考《STM32參考手冊》22.9.2節(439頁),這裏我們僅介紹下INRQ位,該位用來控制初始化請求。

軟件對該位清0,可使CAN從初始化模式進入正常工作模式:當CAN在接收引腳檢測到連續的11個隱性位後,CAN就達到同步,並為接收和發送數據作好準備了。為此,硬件相應地對CAN_MSR寄存器的INAK位清’0’。

軟件對該位置1可使CAN從正常工作模式進入初始化模式:一旦當前的CAN活動(發送或接收)結束,CAN就進入初始化模式。相應地,硬件對CAN_MSR寄存器的INAK位置’1’。

所以我們在CAN初始化的時候,先要設置該位為1,然後進行初始化(尤其是CAN_BTR的設置,該寄存器,必須在CAN正常工作之前設置),之後再設置該位為0,讓CAN進入正常工作模式。

第二個,我們介紹CAN位時序寄存器(CAN_BTR),該寄存器用於設置分頻、Tbs1、Tbs2以及Tsjw等非常重要的參數,直接決定了CAN的波特率。另外該寄存器還可以設置CAN的工作模式,該寄存器各位描述如圖30.1.16所示:

技術分享圖片

圖30.1.16 寄存器CAN_BTR各位描述

STM32提供了兩種測試模式,環回模式和靜默模式,當然他們組合還可以組合成環回靜默模式。這裏我們簡單介紹下環回模式。

在環回模式下,bxCAN把發送的報文當作接收的報文並保存(如果可以通過接收過濾)在接收郵箱裏。也就是環回模式是一個自發自收的模式,如圖30.1.17所示:

技術分享圖片

圖30.1.17 CAN環回模式

環回模式可用於自測試。為了避免外部的影響,在環回模式下CAN內核忽略確認錯誤(在數據/遠程幀的確認位時刻,不檢測是否有顯性位)。在環回模式下,bxCAN在內部把Tx輸出回饋到Rx輸入上,而完全忽略CANRX引腳的實際狀態。發送的報文可以在CANTX引腳上檢測到。

第三個,我們介紹CAN發送郵箱標識符寄存器(CAN_TIxR)(x=0~3),該寄存器各位描述如圖30.1.18所示:

技術分享圖片

圖30.1.18 寄存器CAN_TIxR各位描述

該寄存器主要用來設置標識符(包括擴展標識符),另外還可以設置幀類型,通過TXRQ值1,來請求郵箱發送。因為有3個發送郵箱,所以寄存器CAN_TIxR有3個。

第四個,我們介紹CAN發送郵箱數據長度和時間戳寄存器 (CAN_TDTxR) (x=0~2),該寄存器我們本章僅用來設置數據長度,即最低4個位。比較簡單,這裏就不詳細介紹了。

第五個,我介紹的是CAN發送郵箱低字節數據寄存器 (CAN_TDLxR) (x=0~2),該寄存器各位描述如圖30.1.19所示:

技術分享圖片

圖30.1.19 寄存器CAN_TDLxR各位描述

該寄存器用來存儲將要發送的數據,這裏只能存儲低4個字節,另外還有一個寄存器CAN_TDHxR,該寄存器用來存儲高4個字節,這樣總共就可以存儲8個字節。CAN_TDHxR的各位描述同CAN_TDLxR類似,我們就不單獨介紹了。

第六個,我們介紹CAN接收FIFO郵箱標識符寄存器 (CAN_RIxR) (x=0/1),該寄存器各位描述同CAN_TIxR寄存器幾乎一模一樣,只是最低位為保留位,該寄存器用於保存接收到的報文標識符等信息,我們可以通過讀該寄存器獲取相關信息。

同樣的,CAN接收FIFO郵箱數據長度和時間戳寄存器 (CAN_RDTxR) 、CAN接收FIFO郵箱低字節數據寄存器 (CAN_RDLxR)和CAN接收FIFO郵箱高字節數據寄存器 (CAN_RDHxR) 分別和發送郵箱的:CAN_TDTxR、CAN_TDLxR以及CAN_TDHxR類似,這裏我們就不單獨一一介紹了。詳細介紹,請參考《STM32參考手冊 》22.9.3節(447頁)。

第七個,我們介紹CAN過濾器模式寄存器(CAN_FM1R),該寄存器各位描述如圖30.1.20所示:

技術分享圖片

圖30.1.20 寄存器CAN_FM1R各位描述

該寄存器用於設置各濾波器組的工作模式,對28個濾波器組的工作模式,都可以通過該寄存器設置,不過該寄存器必須在過濾器處於初始化模式下(CAN_FMR的FINIT位=1),才可以進行設置。對STM32F103ZET6來說,只有[13:0]這14個位有效。

第八個,我們介紹CAN過濾器位寬寄存器(CAN_FS1R),該寄存器各位描述如圖30.1.21所示:

技術分享圖片

圖30.1.21 寄存器CAN_FS1R各位描述

該寄存器用於設置各濾波器組的位寬,對28個濾波器組的位寬設置,都可以通過該寄存器實現。該寄存器也只能在過濾器處於初始化模式下進行設置。對STM32F103ZET6來說,同樣只有[13:0]這14個位有效。

第九個,我們介紹CAN過濾器FIFO關聯寄存器(CAN_FFA1R),該寄存器各位描述如圖30.1.22所示:

技術分享圖片

圖30.1.22 寄存器CAN_FFA1R各位描述

該寄存器設置報文通過濾波器組之後,被存入的FIFO,如果對應位為0,則存放到FIFO0;如果為1,則存放到FIFO1。該寄存器也只能在過濾器處於初始化模式下配置。

第十個,我們介紹CAN過濾器激活寄存器(CAN_FA1R),該寄存器各位對應濾波器組和前面的幾個寄存器類似,這裏就不列出了,對對應位置1,即開啟對應的濾波器組;置0則關閉該濾波器組。

最後,我們介紹CAN的過濾器組i的寄存器x(CAN_FiRx)(互聯產品中i=0~27,其它產品中i=0~13;x=1/2)。該寄存器各位描述如圖30.1.23所示:

技術分享圖片

圖30.1.23 寄存器CAN_FiRx各位描述

每個濾波器組的CAN_FiRx都由2個32位寄存器構成,即:CAN_FiR1和CAN_FiR2。根據過濾器位寬和模式的不同設置,這兩個寄存器的功能也不盡相同。關於過濾器的映射,功能描述和屏蔽寄存器的關聯,請參見圖30.1.11。

關於CAN的介紹,就到此結束了。接下來,我們看看本章我們將實現的功能,及CAN的配置步驟。

本章,我們通過WK_UP按鍵選擇CAN的工作模式(正常模式/環回模式),然後通過KEY0控制數據發送,並通過查詢的辦法,將接收到的數據顯示在LCD模塊上。如果是環回模式,我們不需要2個開發板。如果是正常模式,我們就需要2個戰艦開發板,並且將他們的CAN接口對接起來,然後一個開發板發送數據,另外一個開發板將接收到的數據顯示在LCD模塊上。

最後,我們來看看本章的CAN的初始化配置步驟:

1)配置相關引腳的復用功能,使能CAN時鐘。

我們要用CAN,第一步就要使能CAN的時鐘,CAN的時鐘通過APB1ENR的第25位來設置。其次要設置CAN的相關引腳為復用輸出,這裏我們需要設置PA11為上拉輸入(CAN_RX引腳)PA12為復用輸出(CAN_TX引腳),並使能PA口的時鐘

2)設置CAN工作模式及波特率等。

這一步通過先設置CAN_MCR寄存器的INRQ位,讓CAN進入初始化模式,然後設置CAN_MCR的其他相關控制位。再通過CAN_BTR設置波特率和工作模式(正常模式/環回模式)等信息。 最後設置INRQ為0,退出初始化模式。

3)設置濾波器。

本章,我們將使用濾波器組0,並工作在32位標識符屏蔽位模式下。先設置CAN_FMR的FINIT位,讓過濾器組工作在初始化模式下,然後設置濾波器組0的工作模式以及標識符ID和屏蔽位。最後激活濾波器,並退出濾波器初始化模式。

至此,CAN就可以開始正常工作了。如果用到中斷,就還需要進行中斷相關的配置,本章因為沒用到中斷,所以就不作介紹了。

30.2 硬件設計

本章要用到的硬件資源如下:

1) 指示燈DS0

2) KEY0和WK_UP按鍵

3) TFTLCD模塊

4) CAN

5) CAN收發芯片JTA1050

前面3個之前都已經詳細介紹過了,這裏我們介紹STM32與TJA1050連接關系,如圖30.2.1所示:

技術分享圖片

圖30.2.1 STM32與TJA1050連接電路圖

從上圖可以看出:STM32的CAN通過P13的設置,連接到TJA1050收發芯片,然後通過接線端子(CAN)同外部的CAN總線連接。圖中可以看出,在戰艦STM32開發板上面是帶有120Ω的終端電阻的,如果我們的開發板不是作為CAN的終端的話,需要把這個電阻去掉,以免影響通信。

這裏還要註意,我們要設置好開發板上P13排針的連接,通過跳線帽將PA11和PA12分別連接到CRX(CAN_RX)和CTX(CAN_TX)上面,如圖30.2.2所示:

技術分享圖片

圖30.2.2 硬件連接示意圖

最後,我們用2根導線將兩個開發板CAN端子的CAN_L和CAN_L,CAN_H和CAN_H連接起來。這裏註意不要接反了(CAN_L接CAN_H),接反了會導致通訊異常!!

CAN通信詳解