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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > (八)STM32的CAN模塊實驗

          (八)STM32的CAN模塊實驗

          作者: 時間:2016-11-23 來源:網(wǎng)絡 收藏
          bxCAN是基本擴展CAN(Basic Extended CAN)的縮寫,它支持CAN協(xié)議2.0A和2.0B。它的設計目標是,以最小的CPU負荷來高效處理大量收到的報文。它也支持報文發(fā)送的優(yōu)先級要求(優(yōu)先級特性可軟件配置)。
          主要特點
          *****; 支持CAN協(xié)議2.0A和2.0B主動模式
          *****; 波特率最高可達1兆位/秒
          *****; 支持時間觸發(fā)通信功能
          發(fā)送
          *****;3個發(fā)送郵箱
          *****; 發(fā)送報文的優(yōu)先級特性可軟件配置
          *****;記錄發(fā)送SOF時刻的時間戳
          接收
          *****; 3級深度的2個接收FIFO
          *****; 14個位寬可變的過濾器組-由整個CAN共享
          *****; 標識符列表
          *****;FIFO溢出處理方式可配置
          *****; 記錄接收SOF時刻的時間戳
          可支持時間觸發(fā)通信模式
          *****; 禁止自動重傳模式
          *****; 16位自由運行定時器
          *****; 定時器分辨率可配置
          *****; 可在最后2個數(shù)據(jù)字節(jié)發(fā)送時間戳
          管理
          *****; 中斷可屏蔽
          *****; 郵箱占用單獨1塊地址空間,便于提高軟件效率
          看完這些特點后,疑問一個一個地出現(xiàn),
          1. 什么是時間觸發(fā)功能?
          2. 發(fā)送郵箱是什么來的?
          3. 報文是什么來的?
          4. 什么叫時間戳?
          5. 什么叫接收FIFO?
          6. 什么叫過濾器?
          好了,解釋來了。。。
          報文:
          報文包含了將要發(fā)送的完整的數(shù)據(jù)信息
          發(fā)送郵箱:
          共有3個發(fā)送郵箱供軟件來發(fā)送報文。發(fā)送調(diào)度器根據(jù)優(yōu)先級決定哪個郵箱的報文先被發(fā)送。
          接收過濾器:
          共有14個位寬可變/可配置的標識符過濾器組,軟件通過對它們編程,從而在引腳收到的報文中選擇它需要的報文,而把其它報文丟棄掉。
          接收FIFO
          共有2個接收FIFO,每個FIFO都可以存放3個完整的報文。它們完全由硬件來管理
          工作模式
          bxCAN有3個主要的工作模式:初始化、正常和睡眠模式。
          初始化模式
          *軟件通過對CAN_MCR寄存器的INRQ位置1,來請求bxCAN進入初始化模式,然后等待硬件對CAN_MSR寄存器的INAK位置1來進行確認
          *軟件通過對CAN_MCR寄存器的INRQ位清0,來請求bxCAN退出初始化模式,當硬件對CAN_MSR寄存器的INAK位清0就確認了初始化模式的退出。
          *當bxCAN處于初始化模式時,報文的接收和發(fā)送都被禁止,并且CANTX引腳輸出隱性位(高電平)
          正常模式
          在初始化完成后,軟件應該讓硬件進入正常模式,以便正常接收和發(fā)送報文。軟件可以通過對CAN_MCR寄存器的INRQ位清0,來請求從初始化模式進入正常模式,然后要等待硬件對CAN_MSR寄存器的INAK位置1的確認。在跟CAN總線取得同步,即在CANRX引腳上監(jiān)測到11個連續(xù)的隱性位(等效于總線空閑)后,bxCAN才能正常接收和發(fā)送報文。
          過濾器初值的設置不需要在初始化模式下進行,但必須在它處在非激活狀態(tài)下完成(相應的FACT位為0)。而過濾器的位寬和模式的設置,則必須在初始化模式下,進入正常模式前完成。
          睡眠模式(低功耗
          *軟件通過對CAN_MCR寄存器的SLEEP位置1,來請求進入這一模式。在該模式下,bxCAN的時鐘停止了,但軟件仍然可以訪問郵箱寄存器。
          *當bxCAN處于睡眠模式,軟件想通過對CAN_MCR寄存器的INRQ位置1,來進入初始化式,那么軟件必須同時對SLEEP位清0才行
          *有2種方式可以喚醒(退出睡眠模式)bxCAN:通過軟件對SLEEP位清0,或硬件檢測CAN總線的活動。
          工作流程
          那么究竟can是怎樣發(fā)送報文的呢?
          發(fā)送報文的流程為:
          應用程序選擇1個空發(fā)送郵箱;設置標識符,數(shù)據(jù)長度和待發(fā)送數(shù)據(jù);
          然后對CAN_TIxR寄存器的TXRQ位置1,來請求發(fā)送。TXRQ位置1后,郵箱就不再是空郵箱;而一旦郵箱不再為空,軟件對郵箱寄存器就不再有寫的權限。TXRQ位置1后,郵箱馬上進入掛號狀態(tài),并等待成為最高優(yōu)先級的郵箱,參見發(fā)送優(yōu)先級。一旦郵箱成為最高優(yōu)先級的郵箱,其狀態(tài)就變?yōu)轭A定發(fā)送狀態(tài)。一旦CAN總線進入空閑狀態(tài),預定發(fā)送郵箱中的報文就馬上被發(fā)送(進入發(fā)送狀態(tài))。一旦郵箱中的報文被成功發(fā)送后,它馬上變?yōu)榭锗]箱;硬件相應地對CAN_TSR寄存器的RQCP和TXOK位置1,來表明一次成功發(fā)送。
          如果發(fā)送失敗,由于仲裁引起的就對CAN_TSR寄存器的ALST位置1,由于發(fā)送錯誤引起的
          就對TERR位置1。
          原來發(fā)送的優(yōu)先級可以由標識符和發(fā)送請求次序決定:
          由標識符決定
          當有超過1個發(fā)送郵箱在掛號時,發(fā)送順序由郵箱中報文的標識符決定。根據(jù)CAN協(xié)議,標識符數(shù)值最低的報文具有最高的優(yōu)先級。如果標識符的值相等,那么郵箱號小的報文先被發(fā)送。
          由發(fā)送請求次序決定
          通過對CAN_MCR寄存器的TXFP位置1,可以把發(fā)送郵箱配置為發(fā)送FIFO。在該模式下,發(fā)送的優(yōu)先級由發(fā)送請求次序決定。
          該模式對分段發(fā)送很有用。
          時間觸發(fā)通信模式
          在該模式下,CAN硬件的內(nèi)部定時器被激活,并且被用于產(chǎn)生時間戳,分別存儲在
          CAN_RDTxR/CAN_TDTxR寄存器中。內(nèi)部定時器在接收和發(fā)送的幀起始位的采樣點位置被采樣,并生成時間戳(標有時間的數(shù)據(jù))。
          接著又是怎樣接收報文的呢?
          接收管理
          接收到的報文,被存儲在3級郵箱深度的FIFO中。FIFO完全由硬件來管理,從而節(jié)省了CPU
          的處理負荷,簡化了軟件并保證了數(shù)據(jù)的一致性。應用程序只能通過讀取FIFO輸出郵箱,來讀取FIFO中最先收到的報文。
          有效報文
          根據(jù)CAN協(xié)議,當報文被正確接收(直到EOF域的最后1位都沒有錯誤),且通過了標識符
          過濾,那么該報文被認為是有效報文。
          接收相關的中斷條件
          * 一旦往FIFO存入1個報文,硬件就會更新FMP[1:0]位,并且如果CAN_IER寄存器的FMPIE位為1,那么就會產(chǎn)生一個中斷請求。
          * 當FIFO變滿時(即第3個報文被存入),CAN_RFxR寄存器的FULL位就被置1,并且如果CAN_IER寄存器的FFIE位為1,那么就會產(chǎn)生一個滿中斷請求。
          * 在溢出的情況下,F(xiàn)OVR位被置1,并且如果CAN_IER寄存器的FOVIE位為1,那么就會產(chǎn)生一個溢出中斷請求
          標識符過濾
          在CAN協(xié)議里,報文的標識符不代表節(jié)點的地址,而是跟報文的內(nèi)容相關的。因此,發(fā)送者以廣播的形式把報文發(fā)送給所有的接收者。(注:不是一對一通信,而是多機通信)節(jié)點在接收報文時-根據(jù)標識符的值-決定軟件是否需要該報文;如果需要,就拷貝到SRAM里;如果不需要,報文就被丟棄且無需軟件的干預。
          為滿足這一需求,bxCAN為應用程序提供了14個位寬可變的、可配置的過濾器組(13~0),以便只接收那些軟件需要的報文。硬件過濾的做法節(jié)省了CPU開銷,否則就必須由軟件過濾從而占用一定的CPU開銷。每個過濾器組x由2個32位寄存器,CAN_FxR0和CAN_FxR1組成。
          過濾器的模式的設置
          通過設置CAN_FM0R的FBMx位,可以配置過濾器組為標識符列表模式或屏蔽位模式。
          為了過濾出一組標識符,應該設置過濾器組工作在屏蔽位模式。
          為了過濾出一個標識符,應該設置過濾器組工作在標識符列表模式。
          應用程序不用的過濾器組,應該保持在禁用狀態(tài)。
          過濾器優(yōu)先級規(guī)則
          1位寬為32位的過濾器,優(yōu)先級高于位寬為16位的過濾器
          2對于位寬相同的過濾器,標識符列表模式的優(yōu)先級高于屏蔽位模式
          3位寬和模式都相同的過濾器,優(yōu)先級由過濾器號決定,過濾器號小的優(yōu)先級高
          在接收一個報文時,其標識符首先與配置在標識符列表模式下的過濾器相比較;如果匹配上,報文就被存放到相關聯(lián)的FIFO中,并且所匹配的過濾器的序號被存入過濾器匹配序號中。
          如果沒有匹配,報文標識符接著與配置在屏蔽位模式下的過濾器進行比較。
          如果報文標識符沒有跟過濾器中的任何標識符相匹配,那么硬件就丟棄該報文,且不會對軟件有任何打擾。
          接收郵箱(FIFO)
          在接收到一個報文后,軟件就可以訪問接收FIFO的輸出郵箱來讀取它。一旦軟件處理了報文(如把它讀出來),軟件就應該對CAN_RFxR寄存器的RFOM位進行置1,來釋放該報文,以便為后面收到的報文留出存儲空間。
          中斷
          bxCAN占用4個專用的中斷向量。通過設置CAN中斷允許寄存器(CAN_IER),每個中斷源都可以單獨允許和禁用。
          發(fā)送中斷可由下列事件產(chǎn)生:
          ─ 發(fā)送郵箱0變?yōu)榭?,CAN_TSR寄存器的RQCP0位被置1。
          ─ 發(fā)送郵箱1變?yōu)榭?,CAN_TSR寄存器的RQCP1位被置1。
          ─ 發(fā)送郵箱2變?yōu)榭?,CAN_TSR寄存器的RQCP2位被置1。
          FIFO0中斷可由下列事件產(chǎn)生:
          ─ FIFO0接收到一個新報文,CAN_RF0R寄存器的FMP0位不再是‘00’。
          ─ FIFO0變?yōu)闈M的情況,CAN_RF0R寄存器的FULL0位被置1。
          ─ FIFO0發(fā)生溢出的情況,CAN_RF0R寄存器的FOVR0位被置1。
          FIFO1中斷可由下列事件產(chǎn)生:
          ─ FIFO1接收到一個新報文,CAN_RF1R寄存器的FMP1位不再是‘00’。
          ─ FIFO1變?yōu)闈M的情況,CAN_RF1R寄存器的FULL1位被置1。
          ─ FIFO1發(fā)生溢出的情況,CAN_RF1R寄存器的FOVR1位被置1。
          錯誤和狀態(tài)變化中斷可由下列事件產(chǎn)生:
          ─ 出錯情況,關于出錯情況的詳細信息請參考CAN錯誤狀態(tài)寄存器(CAN_ESR)。
          ─ 喚醒情況,在CAN接收引腳上監(jiān)視到幀起始位(SOF)。
          ─ CAN進入睡眠模式。
          工作流程大概就是這個樣子,接著就是一大堆煩人的can寄存器,看了一遍總算有了大概的了解,況且這么多的寄存器要一下子把他們都記住是不可能的。根據(jù)以往的經(jīng)驗,只要用多幾次,對寄存器的功能就能記住。


          關鍵詞: STM32CAN模塊實

          評論


          技術專區(qū)

          關閉
          看屁屁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); })();