新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于STM32的CAN通訊實(shí)驗(yàn)

基于STM32的CAN通訊實(shí)驗(yàn)

作者: 時(shí)間:2016-11-24 來(lái)源:網(wǎng)絡(luò) 收藏
本章我們將向大家介紹如何使用STM32自帶的CAN控制器來(lái)實(shí)現(xiàn)兩個(gè)開(kāi)發(fā)板之間的CAN通訊,并將結(jié)果顯示在TFTLCD模塊上。本章分為如下幾個(gè)部分:
30.1 CAN簡(jiǎn)介
30.2 硬件設(shè)計(jì)
30.3 軟件設(shè)計(jì)
30.4 下載驗(yàn)證

30.1 CAN簡(jiǎn)介
CAN 是Controller Area Network 的縮寫(xiě)(以下稱(chēng)為CAN),是ISO國(guó)際標(biāo)準(zhǔn)化的串行通信協(xié)議。在當(dāng)前的汽車(chē)產(chǎn)業(yè)中,出于對(duì)安全性、舒適性、方便性、低公害、低成本的要求,各種各樣的電子控制系統(tǒng)被開(kāi)發(fā)了出來(lái)。由于這些系統(tǒng)之間通信所用的數(shù)據(jù)類(lèi)型及對(duì)可靠性的要求不盡相同,由多條總線(xiàn)構(gòu)成的情況很多,線(xiàn)束的數(shù)量也隨之增加。為適應(yīng)“減少線(xiàn)束的數(shù)量”、“通過(guò)多個(gè)LAN,進(jìn)行大量數(shù)據(jù)的高速通信”的需要,1986 年德國(guó)電氣商博世公司開(kāi)發(fā)出面向汽車(chē)的CAN 通信協(xié)議。此后,CAN 通過(guò)ISO11898 及ISO11519 進(jìn)行了標(biāo)準(zhǔn)化,現(xiàn)在在歐洲已是汽車(chē)網(wǎng)絡(luò)的標(biāo)準(zhǔn)協(xié)議。   
現(xiàn)在,CAN 的高性能和可靠性已被認(rèn)同,并被廣泛地應(yīng)用于工業(yè)自動(dòng)化、船舶、醫(yī)療設(shè)備、工業(yè)設(shè)備等方面?,F(xiàn)場(chǎng)總線(xiàn)是當(dāng)今自動(dòng)化領(lǐng)域技術(shù)發(fā)展的熱點(diǎn)之一,被譽(yù)為自動(dòng)化領(lǐng)域的計(jì)算機(jī)局域網(wǎng)。它的出現(xiàn)為分布式控制系統(tǒng)實(shí)現(xiàn)各節(jié)點(diǎn)之間實(shí)時(shí)、可靠的數(shù)據(jù)通信提供了強(qiáng)有力的技術(shù)支持。
CAN 控制器根據(jù)兩根線(xiàn)上的電位差來(lái)判斷總線(xiàn)電平??偩€(xiàn)電平分為顯性電平和隱性電平,二者必居其一。發(fā)送方通過(guò)使總線(xiàn)電平發(fā)生變化,將消息發(fā)送給接收方。
CAN協(xié)議具有一下特點(diǎn):
1)多主控制。在總線(xiàn)空閑時(shí),所有單元都可以發(fā)送消息(多主控制),而兩個(gè)以上的單元同時(shí)開(kāi)始發(fā)送消息時(shí),根據(jù)標(biāo)識(shí)符(Identifier 以下稱(chēng)為 ID)決定優(yōu)先級(jí)。ID 并不是表示發(fā)送的目的地址,而是表示訪(fǎng)問(wèn)總線(xiàn)的消息的優(yōu)先級(jí)。兩個(gè)以上的單元同時(shí)開(kāi)始發(fā)送消息時(shí),對(duì)各消息ID 的每個(gè)位進(jìn)行逐個(gè)仲裁比較。仲裁獲勝(被判定為優(yōu)先級(jí)最高)的單元可繼續(xù)發(fā)送消息,仲裁失利的單元?jiǎng)t立刻停止發(fā)送而進(jìn)行接收工作。
2)系統(tǒng)的若軟性。與總線(xiàn)相連的單元沒(méi)有類(lèi)似于“地址”的信息。因此在總線(xiàn)上增加單元時(shí),連接在總線(xiàn)上的其它單元的軟硬件及應(yīng)用層都不需要改變。
3)通信速度較快,通信距離遠(yuǎn)。最高1Mbps(距離小于40M),最遠(yuǎn)可達(dá)10KM(速率低于5Kbps)。
4)具有錯(cuò)誤檢測(cè)、錯(cuò)誤通知和錯(cuò)誤恢復(fù)功能。所有單元都可以檢測(cè)錯(cuò)誤(錯(cuò)誤檢測(cè)功能),檢測(cè)出錯(cuò)誤的單元會(huì)立即同時(shí)通知其他所有單元(錯(cuò)誤通知功能),正在發(fā)送消息的單元一旦檢測(cè)出錯(cuò)誤,會(huì)強(qiáng)制結(jié)束當(dāng)前的發(fā)送。強(qiáng)制結(jié)束發(fā)送的單元會(huì)不斷反復(fù)地重新發(fā)送此消息直到成功發(fā)送為止(錯(cuò)誤恢復(fù)功能)。
5)故障封閉功能。CAN 可以判斷出錯(cuò)誤的類(lèi)型是總線(xiàn)上暫時(shí)的數(shù)據(jù)錯(cuò)誤(如外部噪聲等)還是持續(xù)的數(shù)據(jù)錯(cuò)誤(如單元內(nèi)部故障、驅(qū)動(dòng)器故障、斷線(xiàn)等)。由此功能,當(dāng)總線(xiàn)上發(fā)生持續(xù)數(shù)據(jù)錯(cuò)誤時(shí),可將引起此故障的單元從總線(xiàn)上隔離出去。
6)連接節(jié)點(diǎn)多。CAN 總線(xiàn)是可同時(shí)連接多個(gè)單元的總線(xiàn)??蛇B接的單元總數(shù)理論上是沒(méi)有限制的。但實(shí)際上可連接的單元數(shù)受總線(xiàn)上的時(shí)間延遲及電氣負(fù)載的限制。降低通信速度,可連接的單元數(shù)增加;提高通信速度,則可連接的單元數(shù)減少。
正是因?yàn)镃AN協(xié)議的這些特點(diǎn),使得CAN特別適合工業(yè)過(guò)程監(jiān)控設(shè)備的互連,因此,越來(lái)越受到工業(yè)界的重視,并已公認(rèn)為最有前途的現(xiàn)場(chǎng)總線(xiàn)之一。
CAN協(xié)議經(jīng)過(guò)ISO標(biāo)準(zhǔn)化后有兩個(gè)標(biāo)準(zhǔn):ISO11898標(biāo)準(zhǔn)和ISO11519-2標(biāo)準(zhǔn)。其中ISO11898是針對(duì)通信速率為125Kbps~1Mbps的高速通信標(biāo)準(zhǔn),而ISO11519-2是針對(duì)通信速率為125Kbps以下的低速通信標(biāo)準(zhǔn)。
本章,我們使用的是450Kbps的通信速率,使用的是ISO11898標(biāo)準(zhǔn),該標(biāo)準(zhǔn)的物理層特征如圖30.1.1所示:


圖30.1.1 ISO11898物理層特性
從該特性可以看出,顯性電平對(duì)應(yīng)邏輯0,CAN_H和CAN_L之差為2.5V左右。而隱性電平對(duì)應(yīng)邏輯1,CAN_H和CAN_L之差為0V。在總線(xiàn)上顯性電平具有優(yōu)先權(quán),只要有一個(gè)單元輸出顯性電平,總線(xiàn)上即為顯性電平。而隱形電平則具有包容的意味,只有所有的單元都輸出隱性電平,總線(xiàn)上才為隱性電平(顯性電平比隱性電平更強(qiáng))。另外,在CAN總線(xiàn)的起止端都有一個(gè)120Ω的終端電阻,來(lái)做阻抗匹配,以減少回波反射。
CAN協(xié)議是通過(guò)以下5種類(lèi)型的幀進(jìn)行的:
l數(shù)據(jù)幀
l要控幀
l錯(cuò)誤幀
l過(guò)載幀
l幀間隔
另外,數(shù)據(jù)幀和遙控幀有標(biāo)準(zhǔn)格式和擴(kuò)展格式兩種格式。標(biāo)準(zhǔn)格式有11 個(gè)位的標(biāo)識(shí)符(ID),擴(kuò)展格式有29 個(gè)位的ID。各種幀的用途如表30.1.1所示:
幀類(lèi)型
幀用途
數(shù)據(jù)幀
用于發(fā)送單元向接收單元傳送數(shù)據(jù)的幀
遙控幀
用于接收單元向具有相同 ID 的發(fā)送單元請(qǐng)求數(shù)據(jù)的幀
錯(cuò)誤幀
用于當(dāng)檢測(cè)出錯(cuò)誤時(shí)向其它單元通知錯(cuò)誤的幀
過(guò)載幀
用于接收單元通知其尚未做好接收準(zhǔn)備的幀
間隔幀
用于將數(shù)據(jù)幀及遙控幀與前面的幀分離開(kāi)來(lái)的幀
表30.1.1 CAN協(xié)議各種幀及其用途
由于篇幅所限,我們這里僅對(duì)數(shù)據(jù)幀進(jìn)行詳細(xì)介紹,數(shù)據(jù)幀一般由7個(gè)段構(gòu)成,即:
(1) 幀起始。表示數(shù)據(jù)幀開(kāi)始的段。
(2) 仲裁段。表示該幀優(yōu)先級(jí)的段。
(3) 控制段。表示數(shù)據(jù)的字節(jié)數(shù)及保留位的段。
(4) 數(shù)據(jù)段。數(shù)據(jù)的內(nèi)容,一幀可發(fā)送0~8個(gè)字節(jié)的數(shù)據(jù)。
(5) CRC段。檢查幀的傳輸錯(cuò)誤的段。
(6) ACK段。表示確認(rèn)正常接收的段。
(7) 幀結(jié)束。表示數(shù)據(jù)幀結(jié)束的段。
數(shù)據(jù)幀的構(gòu)成如圖30.1.2所示:

圖30.1.2數(shù)據(jù)幀的構(gòu)成
圖中D表示顯性電平,R表示隱形電平(下同)。
幀起始,這個(gè)比較簡(jiǎn)單,標(biāo)準(zhǔn)幀和擴(kuò)展幀都是由1個(gè)位的顯性電平表示幀起始。
仲裁段,表示數(shù)據(jù)優(yōu)先級(jí)的段,標(biāo)準(zhǔn)幀和擴(kuò)展幀格式在本段有所區(qū)別,如圖30.1.3所示:

圖30.1.3數(shù)據(jù)幀仲裁段構(gòu)成
標(biāo)準(zhǔn)格式的ID 有11 個(gè)位。從ID28 到ID18 被依次發(fā)送。禁止高7 位都為隱性(禁止設(shè)定:ID=1111111XXXX)。擴(kuò)展格式的 ID 有29 個(gè)位?;綢D 從ID28 到ID18,擴(kuò)展ID 由ID17 到ID0 表示?;綢D 和標(biāo)準(zhǔn)格式的ID 相同。禁止高7 位都為隱性(禁止設(shè)定:基本ID=1111111XXXX)。
其中RTR位用于標(biāo)識(shí)是否是遠(yuǎn)程幀(0,數(shù)據(jù)幀;1,遠(yuǎn)程幀),IDE位為標(biāo)識(shí)符選擇位(0,使用標(biāo)準(zhǔn)標(biāo)識(shí)符;1,使用擴(kuò)展標(biāo)識(shí)符),SRR位為代替遠(yuǎn)程請(qǐng)求位,為隱性位,它代替了標(biāo)準(zhǔn)幀中的RTR位。
控制段,由6個(gè)位構(gòu)成,表示數(shù)據(jù)段的字節(jié)數(shù)。標(biāo)準(zhǔn)幀和擴(kuò)展幀的控制段稍有不同,如圖30.1.4所示:

圖30.1.4數(shù)據(jù)幀控制段構(gòu)成
上圖中,r0和r1為保留位,必須全部以顯性電平發(fā)送,但是接收端可以接收顯性、隱性及任意組合的電平。DLC段為數(shù)據(jù)長(zhǎng)度表示段,高位在前,DLC段有效值為0~8,但是接收方接收到9~15的時(shí)候并不認(rèn)為是錯(cuò)誤。
數(shù)據(jù)段,該段可包含0~8個(gè)字節(jié)的數(shù)據(jù)。從最高位(MSB)開(kāi)始輸出,標(biāo)準(zhǔn)幀和擴(kuò)展幀在這個(gè)段的定義都是一樣的。如圖30.1.5所示:

圖30.1.5數(shù)據(jù)幀數(shù)據(jù)段構(gòu)成
CRC段,該段用于檢查幀傳輸錯(cuò)誤。由15個(gè)位的CRC順序和1個(gè)位的CRC界定符(用于分隔的位)組成,標(biāo)準(zhǔn)幀和擴(kuò)展幀在這個(gè)段的格式也是相同的。如圖30.1.6所示:

圖30.1.6數(shù)據(jù)幀CRC段構(gòu)成
此段CRC的值計(jì)算范圍包括:幀起始、仲裁段、控制段、數(shù)據(jù)段。接收方以同樣的算法計(jì)算 CRC 值并進(jìn)行比較,不一致時(shí)會(huì)通報(bào)錯(cuò)誤。
ACK段,此段用來(lái)確認(rèn)是否正常接收。由ACK槽(ACK Slot)和ACK界定符2個(gè)位組成。標(biāo)準(zhǔn)幀和擴(kuò)展幀在這個(gè)段的格式也是相同的。如圖30.1.7所示:

圖30.1.7數(shù)據(jù)幀CRC段構(gòu)成
發(fā)送單元的ACK,發(fā)送2個(gè)位的隱性位,而接收到正確消息的單元在ACK槽(ACK Slot)發(fā)送顯性位,通知發(fā)送單元正常接收結(jié)束,這個(gè)過(guò)程叫發(fā)送ACK/返回ACK。發(fā)送 ACK 的是在既不處于總線(xiàn)關(guān)閉態(tài)也不處于休眠態(tài)的所有接收單元中,接收到正常消息的單元(發(fā)送單元不發(fā)送ACK)。所謂正常消息是指不含填充錯(cuò)誤、格式錯(cuò)誤、CRC 錯(cuò)誤的消息。
幀結(jié)束,這個(gè)段也比較簡(jiǎn)單,標(biāo)準(zhǔn)幀和擴(kuò)展幀在這個(gè)段格式一樣,由7個(gè)位的隱性位組成。
至此,數(shù)據(jù)幀的7個(gè)段就介紹完了,其他幀的介紹,請(qǐng)大家參考光盤(pán)的CAN入門(mén)書(shū).pdf相關(guān)章節(jié)。接下來(lái),我們?cè)賮?lái)看看CAN的位時(shí)序。
由發(fā)送單元在非同步的情況下發(fā)送的每秒鐘的位數(shù)稱(chēng)為位速率。一個(gè)位可分為 4 段。
l同步段(SS)
l傳播時(shí)間段(PTS)
l相位緩沖段1(PBS1)
l相位緩沖段2(PBS2)
這些段又由可稱(chēng)為 Time Quantum(以下稱(chēng)為T(mén)q)的最小時(shí)間單位構(gòu)成。
1 位分為4 個(gè)段,每個(gè)段又由若干個(gè)Tq 構(gòu)成,這稱(chēng)為位時(shí)序。
1 位由多少個(gè)Tq 構(gòu)成、每個(gè)段又由多少個(gè)Tq 構(gòu)成等,可以任意設(shè)定位時(shí)序。通過(guò)設(shè)定位時(shí)序,多個(gè)單元可同時(shí)采樣,也可任意設(shè)定采樣點(diǎn)。各段的作用和 Tq 數(shù)如表30.1.2所示:

表30.1.2 一個(gè)位各段及其作用
1個(gè)位的構(gòu)成如圖30.1.8所示:

圖30.1.8 一個(gè)位的構(gòu)成
上圖的采樣點(diǎn),是指讀取總線(xiàn)電平,并將讀到的電平作為位值的點(diǎn)。位置在 PBS1 結(jié)束處。根據(jù)這個(gè)位時(shí)序,我們就可以計(jì)算CAN通信的波特率了。具體計(jì)算方法,我們等下再介紹,前面提到的CAN協(xié)議具有仲裁功能,下面我們來(lái)看看是如何實(shí)現(xiàn)的。
在總線(xiàn)空閑態(tài),最先開(kāi)始發(fā)送消息的單元獲得發(fā)送權(quán)。
當(dāng)多個(gè)單元同時(shí)開(kāi)始發(fā)送時(shí),各發(fā)送單元從仲裁段的第一位開(kāi)始進(jìn)行仲裁。連續(xù)輸出顯性電平最多的單元可繼續(xù)發(fā)送。實(shí)現(xiàn)過(guò)程,如圖30.1.9所示:

圖30.1.9 CAN總線(xiàn)仲裁過(guò)程
上圖中,單元1和單元2同時(shí)開(kāi)始向總線(xiàn)發(fā)送數(shù)據(jù),開(kāi)始部分他們的數(shù)據(jù)格式是一樣的,故無(wú)法區(qū)分優(yōu)先級(jí),直到T時(shí)刻,單元1輸出隱性電平,而單元2輸出顯性電平,此時(shí)單元1仲裁失利,立刻轉(zhuǎn)入接收狀態(tài)工作,不再與單元2競(jìng)爭(zhēng),而單元2則順利獲得總線(xiàn)使用權(quán),繼續(xù)發(fā)送自己的數(shù)據(jù)。這就實(shí)現(xiàn)了仲裁,讓連續(xù)發(fā)送顯性電平多的單元獲得總線(xiàn)使用權(quán)。
通過(guò)以上介紹,我們對(duì)CAN總線(xiàn)有了個(gè)大概了解(詳細(xì)介紹參考光盤(pán)的:《CAN入門(mén)書(shū).pdf》),接下來(lái)我們介紹下STM32的CAN控制器。
STM32自帶的是bxCAN,即基本擴(kuò)展CAN。它支持CAN協(xié)議2.0A和2.0B。它的設(shè)計(jì)目標(biāo)是,以最小的CPU負(fù)荷來(lái)高效處理大量收到的報(bào)文。它也支持報(bào)文發(fā)送的優(yōu)先級(jí)要求(優(yōu)先級(jí)特性可軟件配置)。對(duì)于安全緊要的應(yīng)用,bxCAN提供所有支持時(shí)間觸發(fā)通信模式所需的硬件功能。
STM32的bxCAN的主要特點(diǎn)有:
l支持CAN協(xié)議2.0A和2.0B主動(dòng)模式
l波特率最高達(dá)1Mbps
l支持時(shí)間觸發(fā)通信
l具有3個(gè)發(fā)送郵箱
l具有3級(jí)深度的2個(gè)接收FIFO
l可變的過(guò)濾器組(最多28個(gè))
在STM32互聯(lián)型產(chǎn)品中,帶有2個(gè)CAN控制器,而我們使用的STM32F103ZET6屬于增強(qiáng)型,不是互聯(lián)型,只有1個(gè)CAN控制器。雙CAN的框圖如圖30.1.10所示:

圖30.1.10 雙CAN框圖
從圖中可以看出兩個(gè)CAN都分別擁有自己的發(fā)送郵箱和接收FIFO,但是他們共用28個(gè)濾波器。通過(guò)CAN_FMR寄存器的設(shè)置,可以設(shè)置濾波器的分配方式。
STM32的標(biāo)識(shí)符過(guò)濾是一個(gè)比較復(fù)雜的東東,它的存在減少了CPU處理CAN通信的開(kāi)銷(xiāo)。STM32的過(guò)濾器組最多有28個(gè)(互聯(lián)型),但是STM32F103ZET6只有14個(gè)(增強(qiáng)型),每個(gè)濾波器組x由2個(gè)32為寄存器,CAN_FxR1和CAN_FxR2組成。
STM32每個(gè)過(guò)濾器組的位寬都可以獨(dú)立配置,以滿(mǎn)足應(yīng)用程序的不同需求。根據(jù)位寬的不同,每個(gè)過(guò)濾器組可提供:
● 1個(gè)32位過(guò)濾器,包括:STDID[10:0]、EXTID[17:0]、IDE和RTR位
● 2個(gè)16位過(guò)濾器,包括:STDID[10:0]、IDE、RTR和EXTID[17:15]位
此外過(guò)濾器可配置為,屏蔽位模式和標(biāo)識(shí)符列表模式。
在屏蔽位模式下,標(biāo)識(shí)符寄存器和屏蔽寄存器一起,指定報(bào)文標(biāo)識(shí)符的任何一位,應(yīng)該按照“必須匹配”或“不用關(guān)心”處理。
而在標(biāo)識(shí)符列表模式下,屏蔽寄存器也被當(dāng)作標(biāo)識(shí)符寄存器用。因此,不是采用一個(gè)標(biāo)識(shí)符加一個(gè)屏蔽位的方式,而是使用2個(gè)標(biāo)識(shí)符寄存器。接收?qǐng)?bào)文標(biāo)識(shí)符的每一位都必須跟過(guò)濾器標(biāo)識(shí)符相同。
通過(guò)CAN_FMR寄存器,可以配置過(guò)濾器組的位寬和工作模式,如圖30.1.11所示:

圖30.1.11 過(guò)濾器組位寬模式設(shè)置
為了過(guò)濾出一組標(biāo)識(shí)符,應(yīng)該設(shè)置過(guò)濾器組工作在屏蔽位模式。
為了過(guò)濾出一個(gè)標(biāo)識(shí)符,應(yīng)該設(shè)置過(guò)濾器組工作在標(biāo)識(shí)符列表模式。
應(yīng)用程序不用的過(guò)濾器組,應(yīng)該保持在禁用狀態(tài)。
過(guò)濾器組中的每個(gè)過(guò)濾器,都被編號(hào)為(叫做過(guò)濾器號(hào),圖30.1.11中的n)從0開(kāi)始,到某個(gè)最大數(shù)值-取決于過(guò)濾器組的模式和位寬的設(shè)置。
舉個(gè)簡(jiǎn)單的例子,我們?cè)O(shè)置過(guò)濾器組0工作在:1個(gè)32為位過(guò)濾器-標(biāo)識(shí)符屏蔽模式,然后設(shè)置CAN_F0R1=0XFFFF0000,CAN_F0R2=0XFF00FF00。其中存放到CAN_F0R1的值就是期望收到的ID,即我們希望收到的映像(STID+EXTID+IDE+RTR)最好是:0XFFFF0000。而0XFF00FF00就是設(shè)置我們需要必須關(guān)心的ID,表示收到的映像,其位[31:24]和位[15:8]這16個(gè)位的必須和CAN_F0R1中對(duì)應(yīng)的位一模一樣,而另外的16個(gè)位則不關(guān)心,可以一樣,也可以不一樣,都認(rèn)為是正確的ID,即收到的映像必須是0XFFxx00xx,才算是正確的(x表示不關(guān)心)。
關(guān)于標(biāo)識(shí)符過(guò)濾的詳細(xì)介紹,請(qǐng)參考《STM32參考手冊(cè)》的22.7.4節(jié)(431頁(yè))。接下來(lái),我們看看STM32的CAN發(fā)送和接收的流程。
上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: STM32CAN通訊實(shí)

評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉