當前位置:
首頁 > 科技 > 教你輕鬆運用CAN_BTR寄存器控制LBKM與SILM

教你輕鬆運用CAN_BTR寄存器控制LBKM與SILM

原標題:教你輕鬆運用CAN_BTR寄存器控制LBKM與SILM


CAN模式


一.工作模式 通過CAN_MCR寄存器控制INRQ和SLEEP 1.初始化INRQ=1 SLEEP=0 軟體初始化應該在硬體 2.正常INRQ=0 SLEEP=0 在初始化完成後,軟體應該讓硬體進入正常模式,以便正常接收和發送報文 3.睡眠SLEEP=1 bxCAN可工作在低功耗的


睡眠模式


二.測試模式 通過CAN_BTR寄存器控制LBKM和SILM 1. 靜默 可以接受不能發送


2. 循回 可以發送不能接受 3.環回靜默 只能自發自收



三.調試模式


STM32標識符篩選器


在CAN協議里,報文的標識符不代表節點的地址,而是跟報文的優先順序相關的。


因此,節點在接收報文時-根據標識符的值-決定軟體是否需要該報文;如果需要,就拷貝到SRAM里;如果不需要,報文就被丟棄且無需軟體的干預。


為滿足這一需求,bxCAN為應用程序提供了14個位寬可變的、可配置的過濾器組(13~0),以便只接收那些軟體需要的報文。


硬體過濾的做法節省了CPU開銷,否則就必須由軟體過濾從而佔用一定的CPU開銷。


STM32普通型晶元的 CAN 有14組過濾器組(互聯型有28組過濾器組) ,用以對接收到的幀進行過濾。

每組過濾器包括了2個可配置的32位寄存器:CAN_FxR1和 CAN_FxR2。


對於過濾器組,通過設置CAN_FM0R的FBMx位, 1.屏蔽位模式 這樣 CAN_FxR0中保存的就是標識符匹配值,CAN_FxR2中保存的是屏蔽碼,即 CAN_FxR2中如果某一位為1,則 CAN_FxR1中相應的位必須與收到的幀的標誌符中的相應位吻合才能通過過濾器。


CAN_FxR2中為0的位表示 CAN_FxR1中的相應位可不必與收到的幀進行匹配。


2.標識符列表模式 此時 CAN_FxR1和CAN_FxR2中的都是要匹配的標識符,收到的幀的標識符必須與其中的一個吻合才能通過過濾。


理解:標識符列表模式是為了過濾出一個標識符,而屏蔽位模式因為屏蔽了某些位所以可以過濾出一組標識符,對於不需要用篩選器組的應處以禁用狀態


一般我們用的都是普通型的,所以在本文中可以說 STM32有14組過濾器組。根據配置,每1組過濾器組可以有1個,2個或4個過濾器。


這些過濾器相當於關卡,每當收到一條報文時,CAN 要先將收到的報文從這些過濾器上」過」一下,能通過的報文是有效報文,收進 FIFO,不能通過的是無效報文(不是發給」我」的報文),直接丟棄。


通過對兩個可配置寄存器值得改變可以選擇過濾器的數量。在一組過濾器中,整組的過濾器都使用同一種工作模式。


另外,每組過濾器中的過濾器寬度是可變的,可以是32位或16位。按工作模式和寬度,一個過濾器組可以變成以下幾中形式之一:


(1) 1個32位的屏蔽位模式的過濾器。

(2) 2個32位的列表模式的過濾器。


(3) 2個16位的屏蔽位模式的過濾器。


(4) 4個16位的列表模式的過濾器。


所有的過濾器是並聯的,即一個報文只要通過了一個過濾器,就是算是有效的。每組過濾器組有兩個32位的寄存器用於存儲過濾用的」標準值」,分別是 FxR1,FxR2。



解讀:


1.在32位的屏蔽位模式下: 有1個過濾器。 FxR2用於指定需要關心哪些位,FxR1用於指定這些位的標準值。


2.在32位的列表模式下:


有兩個過濾器。 FxR1指定過濾器0的標準值,收到報文的標識符只有跟 FxR1完全相同時,才算通過。


FxR2指定過濾器1的標準值。

3.在16位的屏蔽位模式下: 有2個過濾器。 FxR1配置過濾器0,其中,[31-16]位指定要關心的位,[15-0]位指定這些位的標準值。


FxR2配置過濾器1,其中,[31-16]位指定要關心的位,[15-0]位指定這些位的標準值。


4.在16位的列表模式下: 有4個過濾器。 FxR1的[15-0]位配置過濾器0,FxR1的[31-16]位配置過濾器1。 FxR2的[15-0]位配置過濾器2,FxR2的[31-16]位配置過濾器3。


EN


06


10


FIFO


STM32的 CAN 有兩個 FIFO,分別是 FIFO0和 FIFO1。為了便於區分,下面 FIFO0寫作FIFO_0,FIFO1寫作 FIFO_1。


每組過濾器組必須關聯且只能關聯一個 FIFO。複位默認都關聯到 FIFO_0。所謂「關聯」是指假如收到的報文從某個過濾器通過了,那麼該報文會被存到該過濾器相連的 FIFO。從另一方面來說,每個 FIFO 都關聯了一串的過濾器組,兩個 FIFO 剛好瓜分了所有的過濾器組。每當收到一個報文,CAN 就將這個報文先與 FIFO_0關聯的過濾器比較,如果被匹配,就將此報文放入 FIFO_0中。如果不匹配, 再將報文與 FIFO_1關聯的過濾器比較, 如果被匹配, 該報文就放入 FIFO_1中。如果還是不匹配,此報文就被丟棄。


每個 FIFO 的所有過濾器都是並聯的,只要通過了其中任何一個過濾器,該報文就有效。如果一個報文既符合 FIFO_0的規定,又符合 FIFO_1的規定,顯然,根據操作順序,它只會放到 FIFO_0中。

每個 FIFO 中只有激活了的過濾器才起作用,換句話說,如果一個 FIFO 有20個過濾器,但是只激話了5個,那麼比較報文時,只拿這5個過濾器作比較。一般要用到某個過濾器時,在初始化階段就直接將它激活。


需要注意的是,每個 FIFO 必須至少激活一個過濾器,它才有可能收到報文。如果一個過濾器都沒有激活,那麼是所有報文都報廢的。


一般的,如果不想用複雜的過濾功能, FIFO 可以只激活一組過濾器組,且將它設置成 32位的屏蔽位模式,兩個標準值寄存器(FxR1,FxR2)都設置成0。這樣所有報文均能通過。


過濾器匹配序號


過濾器編號用於加速 CPU 對收到報文的處理。收到一個有效報文時, CAN 會將收到的報文 以及它所通過的過濾器編號, 一起存入接收郵箱中。


CPU 在處理時,可以根據過濾器編號,快速的知道該報文的用途,從而作出相應處理。


不用過濾器編號其實也是可以的, 這時候 CPU 就要分析所收報文的標識符, 從而知道報文的用途。由於標識符所含的信息較多,處理起來就慢一點了。



STM32使用以下規則對過濾器編號:


(1) FIFO_0和 FIFO_1的過濾器分別獨立編號,均從0開始按順序編號。

(2) 所有關聯同一個 FIFO 的過濾器,不管有沒有被激活,均統一進行編號。


(3) 編號從0開始,按過濾器組的編號從小到大,按順序排列。


(4) 在同一過濾器組內,按寄存器從小到大編號。FxR1配置的過濾器編號小,FxR2配置 的過濾器編號大。


(5) 同一個寄存器內,按位序從小到大編號。[15-0]位配置的過濾器編號小,[31-16]位 配置的過濾器編號大。


(6) 過濾器編號是彈性的。 當更改了設置時,每個過濾器的編號都會改變。 但是在設置不變的情況下,各個過濾器的編號是相對穩定的。


這樣,每個過濾器在自己在 FIFO 中都有編號。


在 FIFO_0中,編號從0 – (M-1), 其中 M 為它的過濾器總數。


在 FIFO_1中,編號從0 – (N-1),,其中 N 為它的過濾器總數。



一個 FIFO 如果有很多的過濾器,,可能會有一條報文, 在幾個過濾器上均能通過,這時 候,,這條報文算是從哪兒過來的呢? STM32在使用過濾器時,按以下順序進行過濾:

(1) 位寬為32位的過濾器,優先順序高於位寬為16位的過濾器。


(2) 對於位寬相同的過濾器,標識符列表模式的優先順序高於屏蔽位模式。


(3) 位寬和模式都相同的過濾器,優先順序由過濾器號決定,過濾器號小的優先順序高。


按這樣的順序,報文能通過的第一個過濾器,就是該報文的過濾器編號,被存入接收郵箱中。


上面的例子說明了bxCAN的過濾器規則:在接收一個報文時,其標識符首先與配置在標識符列表模式下的過濾器相比較;


如果匹配上,報文就被存放到相關聯的FIFO中,並且所匹配的過濾器的序號被存入過濾器匹配序號中。如同例子中所顯示,報文標識符跟#4標識符匹配,因此報文內容和FMI4被存入FIFO。


如果沒有匹配,報文標識符接著與配置在屏蔽位模式下的過濾器進行比較。如果報文標識符沒有跟過濾器中的任何標識符相匹配,那麼硬體就丟棄該報文,且不會對軟體有任何打擾。


發送



發送報文的流程

應用程序選擇1個空置的發送郵箱;設置標識符,數據長度和待發送數據;然後對CAN_TIxR寄存器的TXRQ位置』1』,來請求發送。


TXRQ位置』1』後,郵箱就不再是空郵箱;而一旦郵箱不再為空置,軟體對郵箱寄存器就不再有寫的許可權。 TXRQ位置1後,郵箱馬上進入挂號狀態,並等待成為最高優先順序的郵箱,參見發送優先順序。


一旦郵箱成為最高優先順序的郵箱,其狀態就變為預定發送狀態。一旦CAN匯流排進入空閑狀態,預定發送郵箱中的報文就馬上被發送(進入發送狀態)。


一旦郵箱中的報文被成功發送後,它馬上變為空置郵箱;硬體相應地對CAN_TSR寄存器的RQCP和TXOK位置1,來表明一次成功發送。如果發送失敗,由於仲裁引起的就對CAN_TSR寄存器的ALST位置』1』,由於發送錯誤引起的就對TERR位置』1』。


發送優先順序


一.標識符決定 當有超過1個發送郵箱在挂號時,發送順序由郵箱中報文的標識符決定。


根據CAN協議,標識符數值最低的報文具有最高的優先順序。如果標識符的值相等,那麼郵箱號小的報文先被發送。由發送請求次序決定。


二.由發送請求次序決定 通過對CAN_MCR寄存器的TXFP位置』1』,可以把發送郵箱配置為發送FIFO。


在該模式下,發送的優先順序由發送請求次序決定。該模式對分段發送很有用。


中止 通過對CAN_TSR寄存器的ABRQ位置』1』,可以中止發送請求。郵箱如果處於挂號或預定狀態,發送請求馬上就被中止了。

如果郵箱處於發送狀態,那麼中止請求可能導致2種結果。


如果郵箱中的報文被成功發送,那麼郵箱變為空置郵箱,並且CAN_TSR寄存器的TXOK位被硬體置』1』。


如果郵箱中的報文發送失敗了,那麼郵箱變為預定狀態,然後發送請求被中止,郵箱變為空置郵箱且TXOK位被硬體清』0』。


因此如果郵箱處於發送狀態,那麼在發送操作結束後,郵箱都會變為空置郵箱。


接受



接受流程 FIFO從空狀態開始,在接收到第一個有效的報文後, FIFO狀態變為挂號_1(pending_1),硬體相應地把CAN_RFR寄存器的FMP[1:0]設置為』01』(二進位01b)。


軟體可以讀取FIFO輸出郵箱來讀出郵箱中的報文,然後通過對CAN_RFR寄存器的RFOM位設置』1』來釋放郵箱,這樣FIFO又變為空狀態了。


如果在釋放郵箱的同時,又收到了一個有效的報文,那麼FIFO仍然保留在挂號_1狀態,軟體可以讀取FIFO輸出郵箱來讀出新收到的報文。


如果應用程序不釋放郵箱,在接收到下一個有效的報文後, FIFO狀態變為挂號_2(pending_2),硬體相應地把FMP[1:0]設置為』10』(二進位10b)。


重複上面的過程,第三個有效的報文把FIFO變為挂號_3狀態(FMP[1:0]=11b)。


此時,軟體必須對RFOM位設置1來釋放郵箱,以便FIFO可以有空間來存放下一個有效的報文;否則,下一個有效的報文到來時就會導致一個報文的丟失。


溢出


當FIFO處於挂號_3狀態(即FIFO的3個郵箱都是滿的),下一個有效的報文就會導致溢出,並且一個報文會丟失。


此時,硬體對CAN_RFR寄存器的FOVR位進行置』1』來表明溢出情況。至於哪個報文會被丟棄,取決於對FIFO的設置:


● 如果禁用了FIFO鎖定功能(CAN_MCR寄存器的RFLM位被清』0』),那麼FIFO中最後收到的報文就被新報文所覆蓋。這樣,最新收到的報文不會被丟棄掉。


● 如果啟用了FIFO鎖定功能(CAN_MCR寄存器的RFLM位被置』1』),那麼新收到的報文就被丟棄,軟體可以讀到FIFO中最早收到的3個報文。


接收相關的中斷


一旦往FIFO存入一個報文,硬體就會更新FMP[1:0]位,並且如果CAN_IER寄存器的FMPIE位為』1』,那麼就會產生一個中斷請求。


當FIFO 變 滿 時( 即 第3 個 報 文 被 存 入) , CAN_RFR 寄 存 器 的FULL 位 就 被 置』1』 , 並 且 如 果CAN_IER寄存器的FFIE位為』1』,那麼就會產生一個滿中斷請求。


在溢出的情況下, FOVR位被置』1』,並且如果CAN_IER寄存器的FOVIE位為』1』,那麼就會產生一個溢出中斷請求。


位時序



位時間特性邏輯通過採樣來監視串列的CAN匯流排,並且通過與幀起始位的邊沿進行同步,及通過與後面的邊沿進行重新同步,來調整其採樣點。


它的操作可以簡單解釋為,如下所述把名義上的每位時間分為3段:


● 同步段(SYNC_SEG):通常期望位的變化發生在該時間段內。其值固定為1個時間單元(1 xtCAN)。


● 時間段1(BS1):定義採樣點的位置。它包含CAN標準里的PROP_SEG和PHASE_SEG1。


其值可以編程為1到16個時間單元,但也可以被自動延長,以補償因為網路中不同節點的頻率差異所造成的相位的正向漂移。


● 時間段2(BS2):定義發送點的位置。它代表CAN標準里的PHASE_SEG2。其值可以編程為1到8個時間單元,但也可以被自動縮短以補償相位的負向漂移。


重新同步跳躍寬度(SJW)定義了,在每位中可以延長或縮短多少個時間單元的上限。其值可以編程為1到4個時間單元。


有效跳變被定義為,當bxCAN自己沒有發送隱性位時,從顯性位到隱性位的第1次轉變。


如果在時間段1(BS1)而不是在同步段(SYNC_SEG)檢測到有效跳變,那麼BS1的時間就被延長最多SJW那麼長,從而採樣點被延遲了。


相反如果在時間段2(BS2)而不是在SYNC_SEG檢測到有效跳變,那麼BS2的時間就被縮短最多SJW那麼長,從而採樣點被提前了。


為了避免軟體的編程錯誤,對位時間特性寄存器(CAN_BTR)的設置,只能bxCAN處於初始化狀態下進行。


中斷



● 發送中斷可由下列事件產生: ─ 發送郵箱0變為空, CAN_TSR寄存器的RQCP0位被置』1』。


─ 發送郵箱1變為空, CAN_TSR寄存器的RQCP1位被置』1』。


─ 發送郵箱2變為空, CAN_TSR寄存器的RQCP2位被置』1』。


● FIFO0中斷可由下列事件產生: ─ FIFO0接收到一個新報文, CAN_RF0R寄存器的FMP0位不再是』00』。


─ FIFO0變為滿的情況, CAN_RF0R寄存器的FULL0位被置』1』。


─ FIFO0發生溢出的情況, CAN_RF0R寄存器的FOVR0位被置』1』。


● FIFO1中斷可由下列事件產生:


─ FIFO1接收到一個新報文, CAN_RF1R寄存器的FMP1位不再是』00』。


─ FIFO1變為滿的情況, CAN_RF1R寄存器的FULL1位被置』1』。


─ FIFO1發生溢出的情況, CAN_RF1R寄存器的FOVR1位被置』1』。


● 錯誤和狀態變化中斷可由下列事件產生: ─ 出錯情況,關於出錯情況的詳細信息請參考CAN錯誤狀態寄存器(CAN_ESR)。


─ 喚醒情況,在CAN接收引腳上監視到幀起始位(SOF)。


─ CAN進入睡眠模式。


關於標識符篩選器和篩選器匹配序號的理解


這兩個概念理解起來有點麻煩下面舉個例子來理解。


面前有很多門,門上寫著不同的屬性,人得依據屬性進門,比如說小門1 小門2 中門 大門1 大門2 其中小門1要求身高恰恰等於1.87的人進入 而中門要求身高小於1.90大於1.87的人進入 這2個概念就是標誌篩選器的概念一個是標誌符列表。


另一個是屏蔽位 而進入門的人在後面的環節中 有測量身高這一環 為了快速獲知他們的身高 我們可以用他們進的門來表示,因為門實際上包含了他們的身高信息這就是篩選器匹配的概念 篩選器匹配就是在很多門中有可能同時都可以使這個人進入。


但是只有那一個門的身高和人得身高最接近 比如說人高1.70 門A要求1.68-1.12 門B要求1.70 那麼就是門B由此篩選出門B這個匹配序號 可以直接獲知這個人得身高信息。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 電子發燒友網 的精彩文章:

三星超IBM奪美國專利資產第一,華為聯想前100;阿里正式推出無人汽車售賣機……

TAG:電子發燒友網 |