<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

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

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

          圖30.1.13 FIFO接收?qǐng)?bào)文
          FIFO接收到的報(bào)文數(shù),我們可以通過查詢CAN_RFxR的FMP寄存器來得到,只要FMP不為0,我們就可以從FIFO讀出收到的報(bào)文。
          接下來,我們簡(jiǎn)單看看STM32的CAN位時(shí)間特性,STM32的CAN位時(shí)間特性和之前我們介紹的,稍有點(diǎn)區(qū)別。STM32把傳播時(shí)間段和相位緩沖段1(STM32稱之為時(shí)間段1)合并了,所以STM32的CAN一個(gè)位只有3段:同步段(SYNC_SEG)、時(shí)間段1(BS1)和時(shí)間段2(BS2)。STM32的BS1段可以設(shè)置為1~16個(gè)時(shí)間單元,剛好等于我們上面介紹的傳播時(shí)間段和相位緩沖段1之和。STM32的CAN位時(shí)序如圖30.1.14所示:

          圖30.1.14 STM32 CAN位時(shí)序
          圖中還給出了CAN波特率的計(jì)算公式,我們只需要知道BS1和BS2的設(shè)置,以及APB1的時(shí)鐘頻率(一般為36Mhz),就可以方便的計(jì)算出波特率。比如設(shè)置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各位描述
          該寄存器的詳細(xì)描述,請(qǐng)參考《STM32參考手冊(cè)》22.9.2節(jié)(439頁),這里我們僅介紹下INRQ位,該位用來控制初始化請(qǐng)求。
          軟件對(duì)該位清0,可使CAN從初始化模式進(jìn)入正常工作模式:當(dāng)CAN在接收引腳檢測(cè)到連續(xù)的11個(gè)隱性位后,CAN就達(dá)到同步,并為接收和發(fā)送數(shù)據(jù)作好準(zhǔn)備了。為此,硬件相應(yīng)地對(duì)CAN_MSR寄存器的INAK位清’0’。
          軟件對(duì)該位置1可使CAN從正常工作模式進(jìn)入初始化模式:一旦當(dāng)前的CAN活動(dòng)(發(fā)送或接收)結(jié)束,CAN就進(jìn)入初始化模式。相應(yīng)地,硬件對(duì)CAN_MSR寄存器的INAK位置’1’。
          所以我們?cè)贑AN初始化的時(shí)候,先要設(shè)置該位為1,然后進(jìn)行初始化(尤其是CAN_BTR的設(shè)置,該寄存器,必須在CAN正常工作之前設(shè)置),之后再設(shè)置該位為0,讓CAN進(jìn)入正常工作模式。
          第二個(gè),我們介紹CAN位時(shí)序寄存器(CAN_BTR),該寄存器用于設(shè)置分頻、Tbs1、Tbs2以及Tsjw等非常重要的參數(shù),直接決定了CAN的波特率。另外該寄存器還可以設(shè)置CAN的工作模式,該寄存器各位描述如圖30.1.16所示:

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

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

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

          圖30.1.19 寄存器CAN_TDLxR各位描述
          該寄存器用來存儲(chǔ)將要發(fā)送的數(shù)據(jù),這里只能存儲(chǔ)低4個(gè)字節(jié),另外還有一個(gè)寄存器CAN_TDHxR,該寄存器用來存儲(chǔ)高4個(gè)字節(jié),這樣總共就可以存儲(chǔ)8個(gè)字節(jié)。CAN_TDHxR的各位描述同CAN_TDLxR類似,我們就不單獨(dú)介紹了。
          第六個(gè),我們介紹CAN接收FIFO郵箱標(biāo)識(shí)符寄存器 (CAN_RIxR) (x=0/1),該寄存器各位描述同CAN_TIxR寄存器幾乎一模一樣,只是最低位為保留位,該寄存器用于保存接收到的報(bào)文標(biāo)識(shí)符等信息,我們可以通過讀該寄存器獲取相關(guān)信息。
          同樣的,CAN接收FIFO郵箱數(shù)據(jù)長(zhǎng)度和時(shí)間戳寄存器 (CAN_RDTxR) 、CAN接收FIFO郵箱低字節(jié)數(shù)據(jù)寄存器 (CAN_RDLxR)和CAN接收FIFO郵箱高字節(jié)數(shù)據(jù)寄存器 (CAN_RDHxR) 分別和發(fā)送郵箱的:CAN_TDTxR、CAN_TDLxR以及CAN_TDHxR類似,這里我們就不單獨(dú)一一介紹了。詳細(xì)介紹,請(qǐng)參考《STM32參考手冊(cè)》22.9.3節(jié)(447頁)。
          第七個(gè),我們介紹CAN過濾器模式寄存器(CAN_FM1R),該寄存器各位描述如圖30.1.20所示:
          圖30.1.20寄存器CAN_FM1R各位描述
          該寄存器用于設(shè)置各濾波器組的工作模式,對(duì)28個(gè)濾波器組的工作模式,都可以通過該寄存器設(shè)置,不過該寄存器必須在過濾器處于初始化模式下(CAN_FMR的FINIT位=1),才可以進(jìn)行設(shè)置。對(duì)STM32F103ZET6來說,只有[13:0]這14個(gè)位有效。
          第八個(gè),我們介紹CAN過濾器位寬寄存器(CAN_FS1R),該寄存器各位描述如圖30.1.21所示:

          圖30.1.21 寄存器CAN_FS1R各位描述
          該寄存器用于設(shè)置各濾波器組的位寬,對(duì)28個(gè)濾波器組的位寬設(shè)置,都可以通過該寄存器實(shí)現(xiàn)。該寄存器也只能在過濾器處于初始化模式下進(jìn)行設(shè)置。對(duì)STM32F103ZET6來說,同樣只有[13:0]這14個(gè)位有效。
          第九個(gè),我們介紹CAN過濾器FIFO關(guān)聯(lián)寄存器(CAN_FFA1R),該寄存器各位描述如圖30.1.22所示:

          圖30.1.22 寄存器CAN_FFA1R各位描述
          該寄存器設(shè)置報(bào)文通過濾波器組之后,被存入的FIFO,如果對(duì)應(yīng)位為0,則存放到FIFO0;如果為1,則存放到FIFO1。該寄存器也只能在過濾器處于初始化模式下配置。
          第十個(gè),我們介紹CAN過濾器激活寄存器(CAN_FA1R),該寄存器各位對(duì)應(yīng)濾波器組和前面的幾個(gè)寄存器類似,這里就不列出了,對(duì)對(duì)應(yīng)位置1,即開啟對(duì)應(yīng)的濾波器組;置0則關(guān)閉該濾波器組。
          最后,我們介紹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各位描述
          每個(gè)濾波器組的CAN_FiRx都由2個(gè)32位寄存器構(gòu)成,即:CAN_FiR1和CAN_FiR2。根據(jù)過濾器位寬和模式的不同設(shè)置,這兩個(gè)寄存器的功能也不盡相同。關(guān)于過濾器的映射,功能描述和屏蔽寄存器的關(guān)聯(lián),請(qǐng)參見圖30.1.11。
          關(guān)于CAN的介紹,就到此結(jié)束了。接下來,我們看看本章我們將實(shí)現(xiàn)的功能,及CAN的配置步驟。
          本章,我們通過WK_UP按鍵選擇CAN的工作模式(正常模式/環(huán)回模式),然后通過KEY0控制數(shù)據(jù)發(fā)送,并通過查詢的辦法,將接收到的數(shù)據(jù)顯示在LCD模塊上。如果是環(huán)回模式,我們不需要2個(gè)開發(fā)板。如果是正常模式,我們就需要2個(gè)戰(zhàn)艦開發(fā)板,并且將他們的CAN接口對(duì)接起來,然后一個(gè)開發(fā)板發(fā)送數(shù)據(jù),另外一個(gè)開發(fā)板將接收到的數(shù)據(jù)顯示在LCD模塊上。
          最后,我們來看看本章的CAN的初始化配置步驟:
          1)配置相關(guān)引腳的復(fù)用功能,使能CAN時(shí)鐘。
          我們要用CAN,第一步就要使能CAN的時(shí)鐘,CAN的時(shí)鐘通過APB1ENR的第25位來設(shè)置。其次要設(shè)置CAN的相關(guān)引腳為復(fù)用輸出,這里我們需要設(shè)置PA11為上拉輸入(CAN_RX引腳)PA12為復(fù)用輸出(CAN_TX引腳),并使能PA口的時(shí)鐘
          2)設(shè)置CAN工作模式及波特率等。
          這一步通過先設(shè)置CAN_MCR寄存器的INRQ位,讓CAN進(jìn)入初始化模式,然后設(shè)置CAN_MCR的其他相關(guān)控制位。再通過CAN_BTR設(shè)置波特率和工作模式(正常模式/環(huán)回模式)等信息。最后設(shè)置INRQ為0,退出初始化模式。
          3)設(shè)置濾波器。
          本章,我們將使用濾波器組0,并工作在32位標(biāo)識(shí)符屏蔽位模式下。先設(shè)置CAN_FMR的FINIT位,讓過濾器組工作在初始化模式下,然后設(shè)置濾波器組0的工作模式以及標(biāo)識(shí)符ID和屏蔽位。最后激活濾波器,并退出濾波器初始化模式。
          至此,CAN就可以開始正常工作了。如果用到中斷,就還需要進(jìn)行中斷相關(guān)的配置,本章因?yàn)闆]用到中斷,所以就不作介紹了。
          上一頁 1 2 下一頁

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

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();