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