STM32的can匯流排實驗心得

2021-09-29 05:30:49 字數 3926 閱讀 4100

標籤: 匯流排心得實驗 2010-09-01 21:08

工作模式

bxcan有3個主要的工作模式:初始化、正常和睡眠模式。

初始化模式

*軟體通過對can_mcr暫存器的inrq位置1,來請求bxcan進入初始化模式,然後等待硬體對can_msr暫存器的inak位置1來進行確認。

*軟體通過對can_mcr暫存器的inrq位清0,來請求bxcan退出初始化模式,當硬體對can_msr暫存器的inak位清0就確認了初始化模式的退出。

*當bxcan處於初始化模式時,報文的接收和傳送都被禁止,並且cantx引腳輸出隱性位(高電平)。初始化can控制器,軟體必須設定can_btr和can_mcr暫存器。

正常模式

在初始化完成後,軟體應該讓硬體進入正常模式,同步can匯流排,以便正常接收和傳送報文。軟體通過對inrq位清0來請求從初始化模式進入正常模式,然後要等待硬體對inak位清0來確認。在跟can匯流排取得同步,即在canrx引腳上監測到11個連續的隱性位(等效於匯流排空閒)後,bxcan才能正常接收和傳送報文。

過濾器初值的設定不需要在初始化模式下進行,但必須在它處在非啟用狀態下完成(相應的fact位為0)。而過濾器的位寬和模式的設定,則必須在進入正常模式之前,即初始化模式下完成。

睡眠模式(低功耗)

*軟體通過對can_mcr暫存器的sleep位置1,來請求進入這一模式。在該模式下,bxcan的時鐘停止了,但軟體仍然可以訪問郵箱暫存器。

*當bxcan處於睡眠模式,軟體想通過對can_mcr暫存器的inrq位置1,來進入初始化式,那麼軟體必須同時對sleep位清0才行。

*有2種方式可以喚醒(退出睡眠模式)bxcan:通過軟體對sleep位清0,或硬體檢測can匯流排的活動。

工作流程

那麼究竟can是怎樣傳送報文的呢?

傳送報文的流程為:應用程式選擇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硬體的內部定時器被啟用,並且被用於產生時間戳,分別儲存在can_rdtxr/can_tdtxr暫存器中。內部定時器在接收和傳送的幀起始位的取樣點位置被取樣,並生成時間戳。

接著又是怎樣接收報文的呢?

接收管理

接收到的報文,被儲存在3級郵箱深度的fifo中。fifo完全由硬體來管理,從而節省了cpu的處理負荷,簡化了軟體並保證了資料的一致性。應用程式只能通過讀取fifo輸出郵箱,來讀取fifo中最先收到的報文。

根據can協議,當報文被正確接收(直到eof域的最後1位都沒有錯誤),且通過了識別符號過濾,那麼該報文被認為是有效報文。

接收相關的中斷條件

* 一旦往fifo存入1個報文,硬體就會更新fmp[1:0]位,並且如果can_ier暫存器的fmpie位為1,那麼就會產生乙個中斷請求。

* 當fifo變滿時(即第3個報文被存入),can_rfxr暫存器的full位就被置1,並且如果can_ier暫存器的ffie位為1,那麼就會產生乙個滿中斷請求。

* 在溢位的情況下,fovr位被置1,並且如果can_ier暫存器的fovie位為1,那麼就會產生乙個溢位中斷請求。

識別符號過濾

在can協議裡,報文的識別符號不代表節點的位址,而是跟報文的內容相關的。因此,傳送者以廣播的形式將報文傳送給所有的接受者。節點在接收報文時根據識別符號的值決定是否需要該報文;如果需要,就拷貝到sram裡;如果不需要,報文就被丟棄且無需軟體的干預。

為滿足這一需求,bxcan為應用程式提供了14個位寬可變的、可配置的過濾器組(13~0),以便只接收那些軟體需要的報文。硬體過濾的做法節省了cpu開銷,否則就必須由軟體過濾從而占用一定的cpu開銷。每個過濾器組x由2個32位暫存器can_fxr0和can_fxr1組成。

過濾器的模式的設定:

通過設定can_fm0r的fbmx位,可以配置過濾器組為識別符號列表模式或遮蔽位模式。

為了過濾出一組識別符號,應該設定過濾器組工作在遮蔽位模式。

為了過濾出乙個識別符號,應該設定過濾器組工作在識別符號列表模式。

應用程式不用的過濾器組,應該保持在禁用狀態。

過濾器優先順序規則:

位寬為32位的過濾器,優先順序高於位寬為16位的過濾器;

對於位寬相同的過濾器,識別符號列表模式的優先順序高於遮蔽位模式;

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

接收郵箱(fifo)

在接收到乙個報文後,軟體就可以訪問接收fifo的輸出郵箱來讀取它。一旦軟體處理了報文(如把它讀出來),軟體就應該對can_rfxr暫存器的rfom位進行置1,來釋放該報文,以便為後面收到的報文留出儲存空間。

中斷bxcan占用4個專用的中斷向量。通過設定can中斷允許暫存器can_ier ,每個中斷源都可以單獨允許和禁用。

(1)傳送中斷可由下列事件產生:

─ 傳送郵箱0變為空,can_tsr暫存器的rqcp0位被置1。

─ 傳送郵箱1變為空,can_tsr暫存器的rqcp1位被置1。

─ 傳送郵箱2變為空,can_tsr暫存器的rqcp2位被置1。

(2)fifo0中斷可由下列事件產生:

─ fifo0接收到乙個新報文,can_rf0r暫存器的fmp0位不再是『00』。

─ fifo0變為滿的情況,can_rf0r暫存器的full0位被置1。

─ fifo0發生溢位的情況,can_rf0r暫存器的fovr0位被置1。

(3)fifo1中斷可由下列事件產生:

─ fifo1接收到乙個新報文,can_rf1r暫存器的fmp1位不再是『00』。

─ fifo1變為滿的情況,can_rf1r暫存器的full1位被置1。

─ fifo1發生溢位的情況,can_rf1r暫存器的fovr1位被置1。

(4) 錯誤和狀態變化中斷可由下列事件產生:

─ 出錯情況,關於出錯情況的詳細資訊請參考can錯誤狀態暫存器(can_esr)。

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

─ can進入睡眠模式。

工作流程大概就是這個樣子,接著就是一大堆煩人的can暫存器,看了一遍總算有了大概的了解,況且這麼多的暫存器要一下子把他們都記住是不可能的。根據以往的經驗,只要用多幾次,對暫存器的功能就能記住。

好了,到讀具體實驗程式的時候了,這時候當然要開啟「stm32庫函式」的資料,因為它裡面有stm32打包好的庫函式的解釋,對讀程式很有幫助。

下面是主程式:

int main(void)

else //按鍵放開

}}前面的rcc、nvic、gpio、usart配置和之前的實驗大同小異,關鍵是分析can_configuration()

函式如下:

void can_configuration(void) //can配置函式

{ can_inittypedef can_initstructure;

can_filterinittypedef can_filterinitstructure;

STM32的can現場匯流排實驗心得

最近在搞stm32實驗板的can現場匯流排實驗,之前只是搞過stc51的串列埠通訊,相比之下,發覺can匯流排都頗為之複雜。開始時,知道自己是新手,只知道can匯流排跟序列通訊,485通訊,i2c通訊一樣都是用來傳輸資料通訊的,對其工作原理一竅不通,唉!從基礎開始看書看資料,先了解它的基本原理。原來...

STM32外部中斷詳解

一 基本概念 arm coetex m3核心共支援256個中斷,其中16個內部中斷,240個外部中斷和可程式設計的256級中斷優先順序的設定。stm32目前支援的中斷共84個 16個內部 68個外部 還有16級可程式設計的中斷優先順序的設定,僅使用中斷優先順序設定8bit中的高4位。stm32可支援...

STM32串列埠中斷接收方式詳細比較

本例程通過pc機的串列埠除錯助手將資料傳送至stm32,接收資料後將所接收的資料又傳送至pc機,具體下面詳談。例項一 void usart1 irqhandler u8 getdata 這是最基本的,將資料接收完成後又傳送出去,接收和傳送在中斷函式裡執行,main函式裡無其他要處理的。優點 簡單,適...