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

2021-09-29 05:05:35 字數 5186 閱讀 2738

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

原來can匯流排有以下特點:

主要特點:

z 支援can協議2.0a和2.0b主動模式

z 波特率最高可達1兆位/秒

z 支援時間觸發通訊功能

傳送:z 3個傳送郵箱

z 傳送報文的優先順序特性可軟體配置

z 記錄傳送sof時刻的時間戳

接收:z 3級深度的2個接收fifo

z 14個位寬可變的過濾器組-由整個can共享

z 識別符號列表

z fifo溢位處理方式可配置

z 記錄接收sof時刻的時間戳

可支援時間觸發通訊模式:

z 禁止自動重傳模式

z 16位自由執行定時器

z 定時器解析度可配置

z 可在最後2個資料位元組傳送時間戳

管理:z 中斷可遮蔽

z 郵箱占用單獨1塊位址空間,便於提高軟體效率

看完這些特點後,疑問乙個乙個地出現:

1.什麼是時間觸發功能?

2.傳送郵箱是什麼來的?

3.報文是什麼來的?

4.什麼叫時間戳?

5.什麼叫接收fifo?

6.什麼叫過濾器?

好了,帶著疑問往下看,看完一遍後,

報文:報文包含了將要傳送的完整的資料資訊

傳送郵箱:

共有3個傳送郵箱供軟體來傳送報文。傳送排程器根據優先順序決定哪個郵箱的報文先被傳送。

接收過濾器:

共有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處於初始化模式時,報文的接收和傳送都被禁止,並且cantx引腳輸出隱性位(高電平)

正常模式

在初始化完成後,軟體應該讓硬體進入正常模式,以便正常接收和傳送報文。軟體可以通過

對can_mcr暫存器的inrq位清0,來請求從初始化模式進入正常模式,然後要等待硬體對

can_msr暫存器的inak位置1的確認。在跟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位,可以配置過濾器組為識別符號列表模式或遮蔽位模式。

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

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

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

過濾器優先順序規則

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

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

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

圖128 過濾器機制的例子

上面的例子說明了bxcan的過濾器規則:在接收乙個報文時,其識別符號首先與配置在識別符號列表模式下的過濾器相比較;如果匹配上,報文就被存放到相關聯的fifo中,並且所匹配的過濾器的序號被存入過濾器匹配序號中。如同例子中所顯示,報文識別符號跟#4識別符號匹配,因此報文內容和fmi4被存入fifo。

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

接收郵箱(fifo)

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

以便為後面收到的報文留出儲存空間。

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

z 傳送中斷可由下列事件產生:

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

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

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

z fifo0中斷可由下列事件產生:

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

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

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

z fifo1中斷可由下列事件產生:

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

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

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

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

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

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

─ can進入睡眠模式。

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

好了,到讀具體實驗程式的時候了,這時候當然要開啟「stm32庫函式」的資料

因為它裡面有stm32打包好的庫函式的解釋,對讀程式很有幫組。

下面是主程式:

int main(void)

{// int press_count = 0;

char data = '0';

int sent = false;

#ifdef debug

debug();

#endif

/* system clocks configuration */

rcc_configuration();

/* nvic configuration */

STM32的can匯流排實驗心得

標籤 匯流排心得實驗 2010 09 01 21 08 工作模式 bxcan有3個主要的工作模式 初始化 正常和睡眠模式。初始化模式 軟體通過對can mcr暫存器的inrq位置1,來請求bxcan進入初始化模式,然後等待硬體對can msr暫存器的inak位置1來進行確認。軟體通過對can mcr...

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函式裡無其他要處理的。優點 簡單,適...