CAN模式
一.工作模式 通過CAN_MCR寄存器控制INRQ和SLEEP1.初始化INRQ=1 SLEEP=0軟件初始化應(yīng)該在硬件2.正常INRQ=0 SLEEP=0在初始化完成后,軟件應(yīng)該讓硬件進入正常模式,以便正常接收和發(fā)送報文3.睡眠SLEEP=1 bxCAN可工作在低功耗的睡眠模式
二.測試模式 通過CAN_BTR寄存器控制LBKM和SILM1. 靜默 可以接受不能發(fā)送
2. 循回 可以發(fā)送不能接受3.環(huán)回靜默 只能自發(fā)自收
三.調(diào)試模式
STM32標(biāo)識符篩選器
在CAN協(xié)議里,報文的標(biāo)識符不代表節(jié)點的地址,而是跟報文的優(yōu)先級相關(guān)的。因此,節(jié)點在接收報文時-根據(jù)標(biāo)識符的值-決定軟件是否需要該報文;如果需要,就拷貝到SRAM里;如果不需要,報文就被丟棄且無需軟件的干預(yù)。為滿足這一需求,bxCAN為應(yīng)用程序提供了14個位寬可變的、可配置的過濾器組(13~0),以便只接收那些軟件需要的報文。硬件過濾的做法節(jié)省了CPU開銷,否則就必須由軟件過濾從而占用一定的CPU開銷。
STM32普通型芯片的 CAN 有14組過濾器組(互聯(lián)型有28組過濾器組) ,用以對接收到的幀進行過濾。每組過濾器包括了2個可配置的32位寄存器:CAN_FxR1和 CAN_FxR2。對于過濾器組,通過設(shè)置CAN_FM0R的FBMx位,1.屏蔽位模式這樣 CAN_FxR0中保存的就是標(biāo)識符匹配值,CAN_FxR2中保存的是屏蔽碼,即 CAN_FxR2中如果某一位為1,則 CAN_FxR1中相應(yīng)的位必須與收到的幀的標(biāo)志符中的相應(yīng)位吻合才能通過過濾器。CAN_FxR2中為0的位表示 CAN_FxR1中的相應(yīng)位可不必與收到的幀進行匹配。
2.標(biāo)識符列表模式此時 CAN_FxR1和CAN_FxR2中的都是要匹配的標(biāo)識符,收到的幀的標(biāo)識符必須與其中的一個吻合才能通過過濾。
理解:標(biāo)識符列表模式是為了過濾出一個標(biāo)識符,而屏蔽位模式因為屏蔽了某些位所以可以過濾出一組標(biāo)識符,對于不需要用篩選器組的應(yīng)處以禁用狀態(tài)
一般我們用的都是普通型的,所以在本文中可以說 STM32有14組過濾器組。根據(jù)配置,每1組過濾器組可以有1個,2個或4個過濾器。這些過濾器相當(dāng)于關(guān)卡,每當(dāng)收到一條報文時,CAN 要先將收到的報文從這些過濾器上”過”一下,能通過的報文是有效報文,收進 FIFO,不能通過的是無效報文(不是發(fā)給”我”的報文),直接丟棄。通過對兩個可配置寄存器值得改變可以選擇過濾器的數(shù)量。在一組過濾器中,整組的過濾器都使用同一種工作模式。
另外,每組過濾器中的過濾器寬度是可變的,可以是32位或16位。按工作模式和寬度,一個過濾器組可以變成以下幾中形式之一:
(1) 1個32位的屏蔽位模式的過濾器。(2) 2個32位的列表模式的過濾器。(3) 2個16位的屏蔽位模式的過濾器。(4) 4個16位的列表模式的過濾器。
所有的過濾器是并聯(lián)的,即一個報文只要通過了一個過濾器,就是算是有效的。每組過濾器組有兩個32位的寄存器用于存儲過濾用的”標(biāo)準(zhǔn)值”,分別是 FxR1,F(xiàn)xR2。
解讀:1.在32位的屏蔽位模式下:有1個過濾器。FxR2用于指定需要關(guān)心哪些位,F(xiàn)xR1用于指定這些位的標(biāo)準(zhǔn)值。
2.在32位的列表模式下:
有兩個過濾器。FxR1指定過濾器0的標(biāo)準(zhǔn)值,收到報文的標(biāo)識符只有跟 FxR1完全相同時,才算通過。
FxR2指定過濾器1的標(biāo)準(zhǔn)值。
3.在16位的屏蔽位模式下:有2個過濾器。FxR1配置過濾器0,其中,[31-16]位指定要關(guān)心的位,[15-0]位指定這些位的標(biāo)準(zhǔn)值。
FxR2配置過濾器1,其中,[31-16]位指定要關(guān)心的位,[15-0]位指定這些位的標(biāo)準(zhǔn)值。
4.在16位的列表模式下:有4個過濾器。FxR1的[15-0]位配置過濾器0,F(xiàn)xR1的[31-16]位配置過濾器1。FxR2的[15-0]位配置過濾器2,F(xiàn)xR2的[31-16]位配置過濾器3。
FIFO
STM32的 CAN 有兩個 FIFO,分別是 FIFO0和 FIFO1。為了便于區(qū)分,下面 FIFO0寫作FIFO_0,F(xiàn)IFO1寫作 FIFO_1。
每組過濾器組必須關(guān)聯(lián)且只能關(guān)聯(lián)一個 FIFO。復(fù)位默認(rèn)都關(guān)聯(lián)到 FIFO_0。所謂“關(guān)聯(lián)”是指假如收到的報文從某個過濾器通過了,那么該報文會被存到該過濾器相連的 FIFO。從另一方面來說,每個 FIFO 都關(guān)聯(lián)了一串的過濾器組,兩個 FIFO 剛好瓜分了所有的過濾器組。每當(dāng)收到一個報文,CAN 就將這個報文先與 FIFO_0關(guān)聯(lián)的過濾器比較,如果被匹配,就將此報文放入 FIFO_0中。如果不匹配, 再將報文與 FIFO_1關(guān)聯(lián)的過濾器比較, 如果被匹配, 該報文就放入 FIFO_1中。如果還是不匹配,此報文就被丟棄。
每個 FIFO 的所有過濾器都是并聯(lián)的,只要通過了其中任何一個過濾器,該報文就有效。如果一個報文既符合 FIFO_0的規(guī)定,又符合 FIFO_1的規(guī)定,顯然,根據(jù)操作順序,它只會放到 FIFO_0中。
每個 FIFO 中只有激活了的過濾器才起作用,換句話說,如果一個 FIFO 有20個過濾器,但是只激話了5個,那么比較報文時,只拿這5個過濾器作比較。一般要用到某個過濾器時,在初始化階段就直接將它激活。需要注意的是,每個 FIFO 必須至少激活一個過濾器,它才有可能收到報文。如果一個過濾器都沒有激活,那么是所有報文都報廢的。一般的,如果不想用復(fù)雜的過濾功能, FIFO 可以只激活一組過濾器組,且將它設(shè)置成 32位的屏蔽位模式,兩個標(biāo)準(zhǔn)值寄存器(FxR1,F(xiàn)xR2)都設(shè)置成0。這樣所有報文均能通過。(STM32提供的例程里就是這么做的! )
過濾器匹配序號
過濾器編號用于加速 CPU 對收到報文的處理。收到一個有效報文時, CAN 會將收到的報文 以及它所通過的過濾器編號, 一起存入接收郵箱中。CPU 在處理時,可以根據(jù)過濾器編號,快速的知道該報文的用途,從而作出相應(yīng)處理。
不用過濾器編號其實也是可以的, 這時候 CPU 就要分析所收報文的標(biāo)識符, 從而知道報文的用途。由于標(biāo)識符所含的信息較多,處理起來就慢一點了。
STM32使用以下規(guī)則對過濾器編號:
(1) FIFO_0和 FIFO_1的過濾器分別獨立編號,均從0開始按順序編號。(2) 所有關(guān)聯(lián)同一個 FIFO 的過濾器,不管有沒有被激活,均統(tǒng)一進行編號。(3) 編號從0開始,按過濾器組的編號從小到大,按順序排列。(4) 在同一過濾器組內(nèi),按寄存器從小到大編號。FxR1配置的過濾器編號小,F(xiàn)xR2配置的過濾器編號大。(5) 同一個寄存器內(nèi),按位序從小到大編號。[15-0]位配置的過濾器編號小,[31-16]位配置的過濾器編號大。(6) 過濾器編號是彈性的。 當(dāng)更改了設(shè)置時,每個過濾器的編號都會改變。但是在設(shè)置不變的情況下,各個過濾器的編號是相對穩(wěn)定的。
這樣,每個過濾器在自己在 FIFO 中都有編號。
在 FIFO_0中,編號從0 – (M-1), 其中 M 為它的過濾器總數(shù)。
在 FIFO_1中,編號從0 – (N-1),,其中 N 為它的過濾器總數(shù)。
一個 FIFO 如果有很多的過濾器,,可能會有一條報文, 在幾個過濾器上均能通過,這時候,,這條報文算是從哪兒過來的呢?STM32在使用過濾器時,按以下順序進行過濾:
(1) 位寬為32位的過濾器,優(yōu)先級高于位寬為16位的過濾器。(2) 對于位寬相同的過濾器,標(biāo)識符列表模式的優(yōu)先級高于屏蔽位模式。(3) 位寬和模式都相同的過濾器,優(yōu)先級由過濾器號決定,過濾器號小的優(yōu)先級高。
按這樣的順序,報文能通過的第一個過濾器,就是該報文的過濾器編號,被存入接收郵箱中。
上面的例子說明了bxCAN的過濾器規(guī)則:在接收一個報文時,其標(biāo)識符首先與配置在標(biāo)識符列表模式下的過濾器相比較;如果匹配上,報文就被存放到相關(guān)聯(lián)的FIFO中,并且所匹配的過濾器的序號被存入過濾器匹配序號中。如同例子中所顯示,報文標(biāo)識符跟#4標(biāo)識符匹配,因此報文內(nèi)容和FMI4被存入FIFO。如果沒有匹配,報文標(biāo)識符接著與配置在屏蔽位模式下的過濾器進行比較。如果報文標(biāo)識符沒有跟過濾器中的任何標(biāo)識符相匹配,那么硬件就丟棄該報文,且不會對軟件有任何打擾。
發(fā)送
發(fā)送報文的流程
應(yīng)用程序選擇1個空置的發(fā)送郵箱;設(shè)置標(biāo)識符,數(shù)據(jù)長度和待發(fā)送數(shù)據(jù);然后對CAN_TIxR寄存器的TXRQ位置’1’,來請求發(fā)送。 TXRQ位置’1’后,郵箱就不再是空郵箱;而一旦郵箱不再為空置,軟件對郵箱寄存器就不再有寫的權(quán)限。 TXRQ位置1后,郵箱馬上進入掛號狀態(tài),并等待成為最高優(yōu)先級的郵箱,參見發(fā)送優(yōu)先級。一旦郵箱成為最高優(yōu)先級的郵箱,其狀態(tài)就變?yōu)轭A(yù)定發(fā)送狀態(tài)。一旦CAN總線進入空閑狀態(tài),預(yù)定發(fā)送郵箱中的報文就馬上被發(fā)送(進入發(fā)送狀態(tài))。一旦郵箱中的報文被成功發(fā)送后,它馬上變?yōu)榭罩绵]箱;硬件相應(yīng)地對CAN_TSR寄存器的RQCP和TXOK位置1,來表明一次成功發(fā)送。如果發(fā)送失敗,由于仲裁引起的就對CAN_TSR寄存器的ALST位置’1’,由于發(fā)送錯誤引起的就對TERR位置’1’。
發(fā)送優(yōu)先級
一.標(biāo)識符決定當(dāng)有超過1個發(fā)送郵箱在掛號時,發(fā)送順序由郵箱中報文的標(biāo)識符決定。根據(jù)CAN協(xié)議,標(biāo)識符數(shù)值最低的報文具有最高的優(yōu)先級。如果標(biāo)識符的值相等,那么郵箱號小的報文先被發(fā)送。由發(fā)送請求次序決定。
二.由發(fā)送請求次序決定通過對CAN_MCR寄存器的TXFP位置’1’,可以把發(fā)送郵箱配置為發(fā)送FIFO。在該模式下,發(fā)送的優(yōu)先級由發(fā)送請求次序決定。該模式對分段發(fā)送很有用。
中止通過對CAN_TSR寄存器的ABRQ位置’1’,可以中止發(fā)送請求。郵箱如果處于掛號或預(yù)定狀態(tài),發(fā)送請求馬上就被中止了。如果郵箱處于發(fā)送狀態(tài),那么中止請求可能導(dǎo)致2種結(jié)果。如果郵箱中的報文被成功發(fā)送,那么郵箱變?yōu)榭罩绵]箱,并且CAN_TSR寄存器的TXOK位被硬件置’1’。如果郵箱中的報文發(fā)送失敗了,那么郵箱變?yōu)轭A(yù)定狀態(tài),然后發(fā)送請求被中止,郵箱變?yōu)榭罩绵]箱且TXOK位被硬件清’0’。因此如果郵箱處于發(fā)送狀態(tài),那么在發(fā)送操作結(jié)束后,郵箱都會變?yōu)榭罩绵]箱。
接受
接受流程FIFO從空狀態(tài)開始,在接收到第一個有效的報文后, FIFO狀態(tài)變?yōu)閽焯朹1(pending_1),硬件相應(yīng)地把CAN_RFR寄存器的FMP[1:0]設(shè)置為’01’(二進制01b)。軟件可以讀取FIFO輸出郵箱來讀出郵箱中的報文,然后通過對CAN_RFR寄存器的RFOM位設(shè)置’1’來釋放郵箱,這樣FIFO又變?yōu)榭諣顟B(tài)了。如果在釋放郵箱的同時,又收到了一個有效的報文,那么FIFO仍然保留在掛號_1狀態(tài),軟件可以讀取FIFO輸出郵箱來讀出新收到的報文。如果應(yīng)用程序不釋放郵箱,在接收到下一個有效的報文后, FIFO狀態(tài)變?yōu)閽焯朹2(pending_2),硬件相應(yīng)地把FMP[1:0]設(shè)置為’10’(二進制10b)。重復(fù)上面的過程,第三個有效的報文把FIFO變?yōu)閽焯朹3狀態(tài)(FMP[1:0]=11b)。此時,軟件必須對RFOM位設(shè)置1來釋放郵箱,以便FIFO可以有空間來存放下一個有效的報文;否則,下一個有效的報文到來時就會導(dǎo)致一個報文的丟失。
溢出
當(dāng)FIFO處于掛號_3狀態(tài)(即FIFO的3個郵箱都是滿的),下一個有效的報文就會導(dǎo)致溢出,并且一個報文會丟失。此時,硬件對CAN_RFR寄存器的FOVR位進行置’1’來表明溢出情況。至于哪個報文會被丟棄,取決于對FIFO的設(shè)置:
● 如果禁用了FIFO鎖定功能(CAN_MCR寄存器的RFLM位被清’0’),那么FIFO中最后收到的報文就被新報文所覆蓋。這樣,最新收到的報文不會被丟棄掉?!?如果啟用了FIFO鎖定功能(CAN_MCR寄存器的RFLM位被置’1’),那么新收到的報文就被丟棄,軟件可以讀到FIFO中最早收到的3個報文。
接收相關(guān)的中斷
一旦往FIFO存入一個報文,硬件就會更新FMP[1:0]位,并且如果CAN_IER寄存器的FMPIE位為’1’,那么就會產(chǎn)生一個中斷請求。
當(dāng)FIFO 變 滿 時( 即 第3 個 報 文 被 存 入) , CAN_RFR 寄 存 器 的FULL 位 就 被 置’1’ , 并 且 如 果CAN_IER寄存器的FFIE位為’1’,那么就會產(chǎn)生一個滿中斷請求。
在溢出的情況下, FOVR位被置’1’,并且如果CAN_IER寄存器的FOVIE位為’1’,那么就會產(chǎn)生一個溢出中斷請求。
位時序
位時間特性邏輯通過采樣來監(jiān)視串行的CAN總線,并且通過與幀起始位的邊沿進行同步,及通過與后面的邊沿進行重新同步,來調(diào)整其采樣點。
它的操作可以簡單解釋為,如下所述把名義上的每位時間分為3段:
● 同步段(SYNC_SEG):通常期望位的變化發(fā)生在該時間段內(nèi)。其值固定為1個時間單元(1 xtCAN)。● 時間段1(BS1):定義采樣點的位置。它包含CAN標(biāo)準(zhǔn)里的PROP_SEG和PHASE_SEG1。
其值可以編程為1到16個時間單元,但也可以被自動延長,以補償因為網(wǎng)絡(luò)中不同節(jié)點的頻率差異所造成的相位的正向漂移。
● 時間段2(BS2):定義發(fā)送點的位置。它代表CAN標(biāo)準(zhǔn)里的PHASE_SEG2。其值可以編程為1到8個時間單元,但也可以被自動縮短以補償相位的負(fù)向漂移。
重新同步跳躍寬度(SJW)定義了,在每位中可以延長或縮短多少個時間單元的上限。其值可以編程為1到4個時間單元。
有效跳變被定義為,當(dāng)bxCAN自己沒有發(fā)送隱性位時,從顯性位到隱性位的第1次轉(zhuǎn)變。如果在時間段1(BS1)而不是在同步段(SYNC_SEG)檢測到有效跳變,那么BS1的時間就被延長最多SJW那么長,從而采樣點被延遲了。相反如果在時間段2(BS2)而不是在SYNC_SEG檢測到有效跳變,那么BS2的時間就被縮短最多SJW那么長,從而采樣點被提前了。為了避免軟件的編程錯誤,對位時間特性寄存器(CAN_BTR)的設(shè)置,只能bxCAN處于初始化狀態(tài)下進行。
中斷
● 發(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)生:─ 出錯情況,關(guān)于出錯情況的詳細(xì)信息請參考CAN錯誤狀態(tài)寄存器(CAN_ESR)。─ 喚醒情況,在CAN接收引腳上監(jiān)視到幀起始位(SOF)。─ CAN進入睡眠模式。
關(guān)于標(biāo)識符篩選器和篩選器匹配序號的理解
這兩個概念理解起來有點麻煩下面舉個例子來理解。面前有很多門,門上寫著不同的屬性,人得依據(jù)屬性進門,比如說小門1 小門2 中門 大門1 大門2 其中小門1要求身高恰恰等于1.87的人進入 而中門要求身高小于1.90大于1.87的人進入 這2個概念就是標(biāo)志篩選器的概念一個是標(biāo)志符列表,另一個是屏蔽位 而進入門的人在后面的環(huán)節(jié)中 有測量身高這一環(huán) 為了快速獲知他們的身高 我們可以用他們進的門來表示,因為門實際上包含了他們的身高信息這就是篩選器匹配的概念 篩選器匹配就是在很多門中有可能同時都可以使這個人進入 但是只有那一個門的身高和人得身高最接近 比如說人高1.70 門A要求1.68-1.12 門B要求1.70 那么就是門B由此篩選出門B這個匹配序號 可以直接獲知這個人得身高信息
-
CAN
+關(guān)注
關(guān)注
57文章
2744瀏覽量
463614 -
STM32
+關(guān)注
關(guān)注
2270文章
10895瀏覽量
355729 -
過濾器
+關(guān)注
關(guān)注
1文章
428瀏覽量
19593
原文標(biāo)題:從頭到腳剖析STM32上的CAN通訊
文章出處:【微信號:weixin21ic,微信公眾號:21ic電子網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論