基于STM32的CAN通訊實驗
30.1 CAN簡介
30.2 硬件設(shè)計
30.3 軟件設(shè)計
30.4 下載驗證
30.1 CAN簡介
CAN 是Controller Area Network 的縮寫(以下稱為CAN),是ISO國際標(biāo)準(zhǔn)化的串行通信協(xié)議。在當(dāng)前的汽車產(chǎn)業(yè)中,出于對安全性、舒適性、方便性、低公害、低成本的要求,各種各樣的電子控制系統(tǒng)被開發(fā)了出來。由于這些系統(tǒng)之間通信所用的數(shù)據(jù)類型及對可靠性的要求不盡相同,由多條總線構(gòu)成的情況很多,線束的數(shù)量也隨之增加。為適應(yīng)“減少線束的數(shù)量”、“通過多個LAN,進行大量數(shù)據(jù)的高速通信”的需要,1986 年德國電氣商博世公司開發(fā)出面向汽車的CAN 通信協(xié)議。此后,CAN 通過ISO11898 及ISO11519 進行了標(biāo)準(zhǔn)化,現(xiàn)在在歐洲已是汽車網(wǎng)絡(luò)的標(biāo)準(zhǔn)協(xié)議。
現(xiàn)在,CAN 的高性能和可靠性已被認(rèn)同,并被廣泛地應(yīng)用于工業(yè)自動化、船舶、醫(yī)療設(shè)備、工業(yè)設(shè)備等方面?,F(xiàn)場總線是當(dāng)今自動化領(lǐng)域技術(shù)發(fā)展的熱點之一,被譽為自動化領(lǐng)域的計算機局域網(wǎng)。它的出現(xiàn)為分布式控制系統(tǒng)實現(xiàn)各節(jié)點之間實時、可靠的數(shù)據(jù)通信提供了強有力的技術(shù)支持。
CAN 控制器根據(jù)兩根線上的電位差來判斷總線電平。總線電平分為顯性電平和隱性電平,二者必居其一。發(fā)送方通過使總線電平發(fā)生變化,將消息發(fā)送給接收方。
CAN協(xié)議具有一下特點:
1) 多主控制。在總線空閑時,所有單元都可以發(fā)送消息(多主控制),而兩個以上的單元同時開始發(fā)送消息時,根據(jù)標(biāo)識符(Identifier 以下稱為 ID)決定優(yōu)先級。ID 并不是表示發(fā)送的目的地址,而是表示訪問總線的消息的優(yōu)先級。兩個以上的單元同時開始發(fā)送消息時,對各消息ID 的每個位進行逐個仲裁比較。仲裁獲勝(被判定為優(yōu)先級最高)的單元可繼續(xù)發(fā)送消息,仲裁失利的單元則立刻停止發(fā)送而進行接收工作。
2) 系統(tǒng)的若軟性。與總線相連的單元沒有類似于“地址”的信息。因此在總線上增加單元時,連接在總線上的其它單元的軟硬件及應(yīng)用層都不需要改變。
3) 通信速度較快,通信距離遠。最高1Mbps(距離小于40M),最遠可達10KM(速率低于5Kbps)。
4) 具有錯誤檢測、錯誤通知和錯誤恢復(fù)功能。所有單元都可以檢測錯誤(錯誤檢測功能),檢測出錯誤的單元會立即同時通知其他所有單元(錯誤通知功能),正在發(fā)送消息的單元一旦檢測出錯誤,會強制結(jié)束當(dāng)前的發(fā)送。強制結(jié)束發(fā)送的單元會不斷反復(fù)地重新發(fā)送此消息直到成功發(fā)送為止(錯誤恢復(fù)功能)。
5) 故障封閉功能。CAN 可以判斷出錯誤的類型是總線上暫時的數(shù)據(jù)錯誤(如外部噪聲等)還是持續(xù)的數(shù)據(jù)錯誤(如單元內(nèi)部故障、驅(qū)動器故障、斷線等)。由此功能,當(dāng)總線上發(fā)生持續(xù)數(shù)據(jù)錯誤時,可將引起此故障的單元從總線上隔離出去。
6) 連接節(jié)點多。CAN 總線是可同時連接多個單元的總線。可連接的單元總數(shù)理論上是沒有限制的。但實際上可連接的單元數(shù)受總線上的時間延遲及電氣負載的限制。降低通信速度,可連接的單元數(shù)增加;提高通信速度,則可連接的單元數(shù)減少。
正是因為CAN協(xié)議的這些特點,使得CAN特別適合工業(yè)過程監(jiān)控設(shè)備的互連,因此,越來越受到工業(yè)界的重視,并已公認(rèn)為最有前途的現(xiàn)場總線之一。
CAN協(xié)議經(jīng)過ISO標(biāo)準(zhǔn)化后有兩個標(biāo)準(zhǔn):ISO11898標(biāo)準(zhǔn)和ISO11519-2標(biāo)準(zhǔn)。其中ISO11898是針對通信速率為125Kbps~1Mbps的高速通信標(biāo)準(zhǔn),而ISO11519-2是針對通信速率為125Kbps以下的低速通信標(biāo)準(zhǔn)。
本章,我們使用的是450Kbps的通信速率,使用的是ISO11898標(biāo)準(zhǔn),該標(biāo)準(zhǔn)的物理層特征如圖30.1.1所示:
圖30.1.1 ISO11898物理層特性
l 數(shù)據(jù)幀
l 要控幀
l 錯誤幀
l 過載幀
l 幀間隔
另外,數(shù)據(jù)幀和遙控幀有標(biāo)準(zhǔn)格式和擴展格式兩種格式。標(biāo)準(zhǔn)格式有11 個位的標(biāo)識符(ID),擴展格式有29 個位的ID。各種幀的用途如表30.1.1所示:
幀類型 | 幀用途 |
數(shù)據(jù)幀 | 用于發(fā)送單元向接收單元傳送數(shù)據(jù)的幀 |
遙控幀 | 用于接收單元向具有相同 ID 的發(fā)送單元請求數(shù)據(jù)的幀 |
錯誤幀 | 用于當(dāng)檢測出錯誤時向其它單元通知錯誤的幀 |
過載幀 | 用于接收單元通知其尚未做好接收準(zhǔn)備的幀 |
間隔幀 | 用于將數(shù)據(jù)幀及遙控幀與前面的幀分離開來的幀 |
表30.1.1 CAN協(xié)議各種幀及其用途
(1) 幀起始。表示數(shù)據(jù)幀開始的段。
(2) 仲裁段。表示該幀優(yōu)先級的段。
(3) 控制段。表示數(shù)據(jù)的字節(jié)數(shù)及保留位的段。
(4) 數(shù)據(jù)段。數(shù)據(jù)的內(nèi)容,一幀可發(fā)送0~8個字節(jié)的數(shù)據(jù)。
(5) CRC段。檢查幀的傳輸錯誤的段。
(6) ACK段。表示確認(rèn)正常接收的段。
(7) 幀結(jié)束。表示數(shù)據(jù)幀結(jié)束的段。
數(shù)據(jù)幀的構(gòu)成如圖30.1.2所示:
圖30.1.2
圖中D表示顯性電平,R表示隱形電平(下同)。
幀起始,這個比較簡單,標(biāo)準(zhǔn)幀和擴展幀都是由1個位的顯性電平表示幀起始。
仲裁段,表示數(shù)據(jù)優(yōu)先級的段,標(biāo)準(zhǔn)幀和擴展幀格式在本段有所區(qū)別,如圖30.1.3所示:
圖30.1.3 數(shù)據(jù)幀仲裁段構(gòu)成
標(biāo)準(zhǔn)格式的ID 有11 個位。從ID28 到ID18 被依次發(fā)送。禁止高7 位都為隱性(禁止設(shè)定:ID=1111111XXXX)。擴展格式的 ID 有29 個位?;綢D 從ID28 到ID18,擴展ID 由ID17 到ID0 表示?;綢D 和標(biāo)準(zhǔn)格式的ID 相同。禁止高7 位都為隱性(禁止設(shè)定:基本ID=1111111XXXX)。
其中RTR位用于標(biāo)識是否是遠程幀(0,數(shù)據(jù)幀;1,遠程幀),IDE位為標(biāo)識符選擇位(0,使用標(biāo)準(zhǔn)標(biāo)識符;1,使用擴展標(biāo)識符),SRR位為代替遠程請求位,為隱性位,它代替了標(biāo)準(zhǔn)幀中的RTR位。
控制段,由6個位構(gòu)成,表示數(shù)據(jù)段的字節(jié)數(shù)。標(biāo)準(zhǔn)幀和擴展幀的控制段稍有不同,如圖30.1.4所示:
圖30.1.4 數(shù)據(jù)幀控制段構(gòu)成
數(shù)據(jù)段,該段可包含0~8個字節(jié)的數(shù)據(jù)。從最高位(MSB)開始輸出,標(biāo)準(zhǔn)幀和擴展幀在這個段的定義都是一樣的。如圖30.1.5所示:
圖30.1.5 數(shù)據(jù)幀數(shù)據(jù)段構(gòu)成
圖30.1.6 數(shù)據(jù)幀CRC段構(gòu)成
圖30.1.7 數(shù)據(jù)幀CRC段構(gòu)成
發(fā)送單元的ACK,發(fā)送2個位的隱性位,而接收到正確消息的單元在ACK槽(ACK Slot)發(fā)送顯性位,通知發(fā)送單元正常接收結(jié)束,這個過程叫發(fā)送ACK/返回ACK。發(fā)送 ACK 的是在既不處于總線關(guān)閉態(tài)也不處于休眠態(tài)的所有接收單元中,接收到正常消息的單元(發(fā)送單元不發(fā)送ACK)。所謂正常消息是指不含填充錯誤、格式錯誤、CRC 錯誤的消息。
幀結(jié)束,這個段也比較簡單,標(biāo)準(zhǔn)幀和擴展幀在這個段格式一樣,由7個位的隱性位組成。
由發(fā)送單元在非同步的情況下發(fā)送的每秒鐘的位數(shù)稱為位速率。一個位可分為 4 段。
l 同步段(SS)
l 傳播時間段(PTS)
l 相位緩沖段1(PBS1)
l 相位緩沖段2(PBS2)
這些段又由可稱為 Time Quantum(以下稱為Tq)的最小時間單位構(gòu)成。
1 位分為4 個段,每個段又由若干個Tq 構(gòu)成,這稱為位時序。
1 位由多少個Tq 構(gòu)成、每個段又由多少個Tq 構(gòu)成等,可以任意設(shè)定位時序。通過設(shè)定位時序,多個單元可同時采樣,也可任意設(shè)定采樣點。各段的作用和 Tq 數(shù)如表30.1.2所示:
表30.1.2 一個位各段及其作用
圖30.1.8 一個位的構(gòu)成
在總線空閑態(tài),最先開始發(fā)送消息的單元獲得發(fā)送權(quán)。
當(dāng)多個單元同時開始發(fā)送時,各發(fā)送單元從仲裁段的第一位開始進行仲裁。連續(xù)輸出顯性電平最多的單元可繼續(xù)發(fā)送。實現(xiàn)過程,如圖30.1.9所示:
圖30.1.9 CAN總線仲裁過程
STM32的bxCAN的主要特點有:
l 支持CAN協(xié)議2.0A和2.0B主動模式
l 波特率最高達1Mbps
l 支持時間觸發(fā)通信
l 具有3個發(fā)送郵箱
l 具有3級深度的2個接收FIFO
l 可變的過濾器組(最多28個)
在STM32互聯(lián)型產(chǎn)品中,帶有2個CAN控制器,而我們使用的STM32F103ZET6屬于增強型,不是互聯(lián)型,只有1個CAN控制器。雙CAN的框圖如圖30.1.10所示:
圖30.1.10 雙CAN框圖
STM32每個過濾器組的位寬都可以獨立配置,以滿足應(yīng)用程序的不同需求。根據(jù)位寬的不同,每個過濾器組可提供:
● 1個32位過濾器,包括:STDID[10:0]、EXTID[17:0]、IDE和RTR位
● 2個16位過濾器,包括:STDID[10:0]、IDE、RTR和EXTID[17:15]位
此外過濾器可配置為,屏蔽位模式和標(biāo)識符列表模式。
在屏蔽位模式下,標(biāo)識符寄存器和屏蔽寄存器一起,指定報文標(biāo)識符的任何一位,應(yīng)該按照“必須匹配”或“不用關(guān)心”處理。
而在標(biāo)識符列表模式下,屏蔽寄存器也被當(dāng)作標(biāo)識符寄存器用。因此,不是采用一個標(biāo)識符加一個屏蔽位的方式,而是使用2個標(biāo)識符寄存器。接收報文標(biāo)識符的每一位都必須跟過濾器標(biāo)識符相同。
通過CAN_FMR寄存器,可以配置過濾器組的位寬和工作模式,如圖30.1.11所示:
圖30.1.11 過濾器組位寬模式設(shè)置
為了過濾出一組標(biāo)識符,應(yīng)該設(shè)置過濾器組工作在屏蔽位模式。
為了過濾出一個標(biāo)識符,應(yīng)該設(shè)置過濾器組工作在標(biāo)識符列表模式。
應(yīng)用程序不用的過濾器組,應(yīng)該保持在禁用狀態(tài)。
過濾器組中的每個過濾器,都被編號為(叫做過濾器號,圖30.1.11中的n)從0開始,到某個最大數(shù)值-取決于過濾器組的模式和位寬的設(shè)置。
關(guān)鍵詞:
STM32CAN通訊實
評論