新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于STM32的CAN通訊實驗

基于STM32的CAN通訊實驗

作者: 時間:2016-11-24 來源:網(wǎng)絡 收藏

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

圖30.1.12 發(fā)送郵箱
上圖中,還包含了很多其他處理,不強制退出發(fā)送(ABRQ=1)和發(fā)送失敗處理等。通過這個流程圖,我們大致了解了CAN的發(fā)送流程,后面的數(shù)據(jù)發(fā)送,我們基本就是按照此流程來走。接下來再看看CAN的接收流程。
CAN接收流程
CAN接收到的有效報文,被存儲在3級郵箱深度的FIFO中。FIFO完全由硬件來管理,從而節(jié)省了CPU的處理負荷,簡化了軟件并保證了數(shù)據(jù)的一致性。應用程序只能通過讀取FIFO輸出郵箱,來讀取FIFO中最先收到的報文。這里的有效報文是指那些正確被接收的(直到EOF都沒有錯誤)且通過了標識符過濾的報文。前面我們知道CAN的接收有2個FIFO,我們每個濾波器組都可以設置其關聯(lián)的FIFO,通過CAN_FFA1R的設置,可以將濾波器組關聯(lián)到FIFO0/FIFO1。
CAN接收流程為:FIFO空à收到有效報文à掛號_1(存入FIFO的一個郵箱,這個由硬件控制,我們不需要理會)à收到有效報文à掛號_2à收到有效報文à掛號_3à收到有效報文à溢出。
這個流程里面,我們沒有考慮從FIFO讀出報文的情況,實際情況是:我們必須在FIFO溢出之前,讀出至少1個報文,否則下個報文到來,將導致FIFO溢出,從而出現(xiàn)報文丟失。每讀出1個報文,相應的掛號就減1,直到FIFO空。CAN接收流程如圖30.1.13所示:

圖30.1.13 FIFO接收報文
FIFO接收到的報文數(shù),我們可以通過查詢CAN_RFxR的FMP寄存器來得到,只要FMP不為0,我們就可以從FIFO讀出收到的報文。
接下來,我們簡單看看STM32的CAN位時間特性,STM32的CAN位時間特性和之前我們介紹的,稍有點區(qū)別。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節(jié)(439頁),這里我們僅介紹下INRQ位,該位用來控制初始化請求。
軟件對該位清0,可使CAN從初始化模式進入正常工作模式:當CAN在接收引腳檢測到連續(xù)的11個隱性位后,CAN就達到同步,并為接收和發(fā)送數(shù)據(jù)作好準備了。為此,硬件相應地對CAN_MSR寄存器的INAK位清’0’。
軟件對該位置1可使CAN從正常工作模式進入初始化模式:一旦當前的CAN活動(發(fā)送或接收)結束,CAN就進入初始化模式。相應地,硬件對CAN_MSR寄存器的INAK位置’1’。
所以我們在CAN初始化的時候,先要設置該位為1,然后進行初始化(尤其是CAN_BTR的設置,該寄存器,必須在CAN正常工作之前設置),之后再設置該位為0,讓CAN進入正常工作模式。
第二個,我們介紹CAN位時序寄存器(CAN_BTR),該寄存器用于設置分頻、Tbs1、Tbs2以及Tsjw等非常重要的參數(shù),直接決定了CAN的波特率。另外該寄存器還可以設置CAN的工作模式,該寄存器各位描述如圖30.1.16所示:

圖30.1.16 寄存器CAN_BTR各位描述
STM32提供了兩種測試模式,環(huán)回模式和靜默模式,當然他們組合還可以組合成環(huán)回靜默模式。這里我們簡單介紹下環(huán)回模式。
在環(huán)回模式下,bxCAN把發(fā)送的報文當作接收的報文并保存(如果可以通過接收過濾)在接收郵箱里。也就是環(huán)回模式是一個自發(fā)自收的模式,如圖30.1.17所示:

圖30.1.17 CAN環(huán)回模式
環(huán)回模式可用于自測試。為了避免外部的影響,在環(huán)回模式下CAN內(nèi)核忽略確認錯誤(在數(shù)據(jù)/遠程幀的確認位時刻,不檢測是否有顯性位)。在環(huán)回模式下,bxCAN在內(nèi)部把Tx輸出回饋到Rx輸入上,而完全忽略CANRX引腳的實際狀態(tài)。發(fā)送的報文可以在CANTX引腳上檢測到。
第三個,我們介紹CAN發(fā)送郵箱標識符寄存器(CAN_TIxR)(x=0~3),該寄存器各位描述如圖30.1.18所示:

圖30.1.18 寄存器CAN_TIxR各位描述
該寄存器主要用來設置標識符(包括擴展標識符),另外還可以設置幀類型,通過TXRQ值1,來請求郵箱發(fā)送。因為有3個發(fā)送郵箱,所以寄存器CAN_TIxR有3個。
第四個,我們介紹CAN發(fā)送郵箱數(shù)據(jù)長度和時間戳寄存器 (CAN_TDTxR) (x=0~2),該寄存器我們本章僅用來設置數(shù)據(jù)長度,即最低4個位。比較簡單,這里就不詳細介紹了。
第五個,我介紹的是CAN發(fā)送郵箱低字節(jié)數(shù)據(jù)寄存器 (CAN_TDLxR) (x=0~2),該寄存器各位描述如圖30.1.19所示:

圖30.1.19 寄存器CAN_TDLxR各位描述
該寄存器用來存儲將要發(fā)送的數(shù)據(jù),這里只能存儲低4個字節(jié),另外還有一個寄存器CAN_TDHxR,該寄存器用來存儲高4個字節(jié),這樣總共就可以存儲8個字節(jié)。CAN_TDHxR的各位描述同CAN_TDLxR類似,我們就不單獨介紹了。
第六個,我們介紹CAN接收FIFO郵箱標識符寄存器 (CAN_RIxR) (x=0/1),該寄存器各位描述同CAN_TIxR寄存器幾乎一模一樣,只是最低位為保留位,該寄存器用于保存接收到的報文標識符等信息,我們可以通過讀該寄存器獲取相關信息。
同樣的,CAN接收FIFO郵箱數(shù)據(jù)長度和時間戳寄存器 (CAN_RDTxR) 、CAN接收FIFO郵箱低字節(jié)數(shù)據(jù)寄存器 (CAN_RDLxR)和CAN接收FIFO郵箱高字節(jié)數(shù)據(jù)寄存器 (CAN_RDHxR) 分別和發(fā)送郵箱的:CAN_TDTxR、CAN_TDLxR以及CAN_TDHxR類似,這里我們就不單獨一一介紹了。詳細介紹,請參考《STM32參考手冊》22.9.3節(jié)(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個濾波器組的位寬設置,都可以通過該寄存器實現(xiàn)。該寄存器也只能在過濾器處于初始化模式下進行設置。對STM32F103ZET6來說,同樣只有[13:0]這14個位有效。
第九個,我們介紹CAN過濾器FIFO關聯(lián)寄存器(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)(互聯(lián)產(chǎn)品中i=0~27,其它產(chǎn)品中i=0~13;x=1/2)。該寄存器各位描述如圖30.1.23所示:

圖30.1.23 寄存器CAN_FiRx各位描述
每個濾波器組的CAN_FiRx都由2個32位寄存器構成,即:CAN_FiR1和CAN_FiR2。根據(jù)過濾器位寬和模式的不同設置,這兩個寄存器的功能也不盡相同。關于過濾器的映射,功能描述和屏蔽寄存器的關聯(lián),請參見圖30.1.11。
關于CAN的介紹,就到此結束了。接下來,我們看看本章我們將實現(xiàn)的功能,及CAN的配置步驟。
本章,我們通過WK_UP按鍵選擇CAN的工作模式(正常模式/環(huán)回模式),然后通過KEY0控制數(shù)據(jù)發(fā)送,并通過查詢的辦法,將接收到的數(shù)據(jù)顯示在LCD模塊上。如果是環(huán)回模式,我們不需要2個開發(fā)板。如果是正常模式,我們就需要2個戰(zhàn)艦開發(fā)板,并且將他們的CAN接口對接起來,然后一個開發(fā)板發(fā)送數(shù)據(jù),另外一個開發(fā)板將接收到的數(shù)據(jù)顯示在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設置波特率和工作模式(正常模式/環(huán)回模式)等信息。最后設置INRQ為0,退出初始化模式。
3)設置濾波器。
本章,我們將使用濾波器組0,并工作在32位標識符屏蔽位模式下。先設置CAN_FMR的FINIT位,讓過濾器組工作在初始化模式下,然后設置濾波器組0的工作模式以及標識符ID和屏蔽位。最后激活濾波器,并退出濾波器初始化模式。
至此,CAN就可以開始正常工作了。如果用到中斷,就還需要進行中斷相關的配置,本章因為沒用到中斷,所以就不作介紹了。
上一頁 1 2 下一頁

關鍵詞: STM32CAN通訊實

評論


技術專區(qū)

關閉