STM32 基础系列教程 22 - CAN
前言
CAN 是Controller Area Network 的縮寫(以下稱為CAN),是ISO國(guó)際標(biāo)準(zhǔn)化的串行通信協(xié)議。在汽車產(chǎn)業(yè)中,出于對(duì)安全性、舒適性、方便性、低公害、低成本的要求,各種各樣的電子控制系統(tǒng)被開發(fā)了出來。由于這些系統(tǒng)之間通信所用的數(shù)據(jù)類型及對(duì)可靠性的要求不盡相同,由多條總線構(gòu)成的情況很多,線束的數(shù)量也隨之增加。為適應(yīng)“減少線束的數(shù)量”、“通過多個(gè)LAN,進(jìn)行大量數(shù)據(jù)的高速通信”的需要,1986 年德國(guó)電氣商博世公司開發(fā)出面向汽車的CAN 通信協(xié)議。此后,CAN 通過ISO11898 及ISO11519 進(jìn)行了標(biāo)準(zhǔn)化,在歐洲已是汽車網(wǎng)絡(luò)的標(biāo)準(zhǔn)協(xié)議。
CAN 的高性能和可靠性已被認(rèn)同,并被廣泛地應(yīng)用于工業(yè)自動(dòng)化、船舶、醫(yī)療設(shè)備、工業(yè)設(shè)備等方面。現(xiàn)場(chǎng)總線是當(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屬于現(xiàn)場(chǎng)總線的范疇,它是一種有效支持分布式控制或?qū)崟r(shí)控制的串行通信網(wǎng)絡(luò)。較之許多RS-485基于R線構(gòu)建的分布式控制系統(tǒng)而言,基于CAN總線的分布式控制系統(tǒng)在以下方面具有明顯的優(yōu)越性:
?
更多關(guān)于can持術(shù)細(xì)節(jié)(如仲載,報(bào)文格式,標(biāo)準(zhǔn)幀,擴(kuò)展幀等可查看相關(guān)技術(shù)文檔或直接查看STM32F103數(shù)據(jù)手冊(cè)CAN接口介紹篇),本文主要講解STM32平臺(tái)CAN接口的使用,學(xué)習(xí)其使用方法,實(shí)現(xiàn)數(shù)據(jù)收發(fā)。
?
示例詳解
基于硬件平臺(tái): STM32F10C8T6最小系統(tǒng)板, MCU 的型號(hào)是?STM32F103c8t6, 使用stm32cubemx 工具自動(dòng)產(chǎn)生的配置工程,使用KEIL5編譯代碼。
?
?
本示例所用的最小系統(tǒng)板原理圖:
?
?
?
設(shè)置1M的波特率,36/6=6M, 1bit = 1+2+3 =6 clk? 即 1bit = 1us,可查看下面的BIT圖,當(dāng)然不一定非要這樣才能信,理論上保證1bit = 1us 就可以了,下圖給的參數(shù)是用的較多, 且較為可靠與穩(wěn)定的一種通信方式。圖中還有很多參數(shù),如時(shí)間觸發(fā)通信模式-關(guān)、自動(dòng)總線關(guān)斷管理-關(guān)(實(shí)際工程中建議開啟)、自動(dòng)喚醒-關(guān)、不自動(dòng)重發(fā)-關(guān)、接收FIFO鎖定模式-關(guān)(新報(bào)文可覆蓋舊報(bào)文)、發(fā)送FIFO優(yōu)先級(jí)-關(guān)(實(shí)際工程可根據(jù)需要開啟),參數(shù)的具體意不懂提可以多試一下,其實(shí)熟悉了也很好理解。
????? 下圖中使用的是LoopBack(回環(huán))模式,是因?yàn)楸疚乃玫拈_發(fā)板沒有CAN收發(fā)器/驅(qū)動(dòng)器(fire),為了實(shí)驗(yàn)用回環(huán)模式來實(shí)現(xiàn)自發(fā)自收功能,實(shí)際工程中應(yīng)該是Normal模式。
關(guān)于幾種測(cè)試模式的區(qū)別,請(qǐng)下下圖:
?
?
?
STM32F103的bxCAN占用4個(gè)專用的中斷向量。通過設(shè)置CAN中斷允許寄存器(CAN_IER),每個(gè)中斷源都可以單獨(dú)允許和禁用
● 發(fā)送中斷可由下列事件產(chǎn)生:
─ 發(fā)送郵箱0變?yōu)榭?#xff0c; CAN_TSR寄存器的RQCP0位被置’1’。
─ 發(fā)送郵箱1變?yōu)榭?#xff0c; CAN_TSR寄存器的RQCP1位被置’1’。
─ 發(fā)送郵箱2變?yōu)榭?#xff0c; CAN_TSR寄存器的RQCP2位被置’1’。
● FIFO0中斷可由下列事件產(chǎn)生:
─ FIFO0接收到一個(gè)新報(bào)文, CAN_RF0R寄存器的FMP0位不再是’00’。
─ FIFO0變?yōu)闈M的情況, CAN_RF0R寄存器的FULL0位被置’1’。
─ FIFO0發(fā)生溢出的情況, CAN_RF0R寄存器的FOVR0位被置’1’。
● FIFO1中斷可由下列事件產(chǎn)生:
─ FIFO1接收到一個(gè)新報(bào)文, CAN_RF1R寄存器的FMP1位不再是’00’。
─ FIFO1變?yōu)闈M的情況, CAN_RF1R寄存器的FULL1位被置’1’。
─ FIFO1發(fā)生溢出的情況, CAN_RF1R寄存器的FOVR1位被置’1’。
● 錯(cuò)誤和狀態(tài)變化中斷可由下列事件產(chǎn)生:
─ 出錯(cuò)情況,關(guān)于出錯(cuò)情況的詳細(xì)信息請(qǐng)參考CAN錯(cuò)誤狀態(tài)寄存器(CAN_ESR)。
─ 喚醒情況,在CAN接收引腳上監(jiān)視到幀起始位(SOF)。
─ CAN進(jìn)入睡眠模式。
作為功能演示,這里我們只開啟FIFO1的接收中斷,具休配置如下:
?
?
?
?
OK,本期實(shí)驗(yàn)完成!下期見!同時(shí)如果大家有什么疑問或是有想了解的其它內(nèi)容,也歡迎大家留言!!最后喜歡這個(gè)公眾號(hào)的同學(xué)們記得加關(guān)注了,每天都會(huì)有技術(shù)干貨推出!!
?
文中資料下載,在公眾號(hào)里給十三發(fā)消息:
下載|STM32基礎(chǔ)系列教程22
?
關(guān)注十三公眾號(hào)
?
總結(jié)
以上是生活随笔為你收集整理的STM32 基础系列教程 22 - CAN的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32 基础系列教程 21 - NV
- 下一篇: STM32 基础系列教程 23 - US