1. 程式人生 > >【CAN總線】CAN代碼相關問題和註釋(1) ------------4.6更新

【CAN總線】CAN代碼相關問題和註釋(1) ------------4.6更新

配置 註釋 一次 保護 tex 擴展 控制 xca 比較

前言:

  在看如何用FPGA實現can_controller ,本來想把代碼上傳上來的,結果沒成功。如果有意向研究的,可以自己去下載 pudn就有。can tb有點問題,我也只是在剛剛研究,如果有意向可以和我交流, 歡迎大家討論吶。【PS:堅決抵制伸手黨】

本文為整理總結,參考文檔如下:

《STM32中文參考手冊2010》

----------------------------------------------------我是正文分界線-----------------------------------------

1 CAN IP有提到Wishbone,是總線的一種。它通過在IP核之間建立一個通用接口完成互連。可以用於在軟核、固核以及硬核之間進行互聯。

2 CAN_IP 需要初始化的寄存器,或者初始化方式可以參考百度文庫700多頁的手冊,22章就是關於can的初始化。我看完了也會整理一下。

3 CAN的工作模式:初始化模式、正常模式、睡眠模式。分別對應不同的寄存器配置。

4 bxCAN(基本擴展CAN)功能描述

1 發送處理

設置標識符,數據長度和待發送數據;

然後對CAN_TIxR寄存器的TXRQ位置’1’,來請求發送。TXRQ位置’1’後,郵箱就不再是空郵箱;而一旦郵箱不再為 空置,軟件對郵箱寄存器就不再有寫的權限。TXRQ位置1後,郵箱馬上進入 掛號狀態,並等待成為最高優先級的郵箱,參見 發送優先級 。一旦郵箱成為最高優先級的郵箱,其狀態就變為 預定發送狀態。一旦CAN總線進入空閑狀態,預定發送郵箱中的報文就馬上被發送(進入 發送狀態)。一旦郵箱中的報文被成功發送後,它馬上變為 空置郵箱;硬件相應地對CAN_TSR寄存器的RQCP和TXOK位置1,來表明一次成功發送。如果發送失敗,由於仲裁引起的就對CAN_TSR寄存器的ALST位置’1’,由於發送錯誤引起的就對TERR位置’1’。

--------------------------------------------------我是16.4.6更新分界線---------------

3 接收管理

根據CAN協議, 當報文被正確接收(直到EOF域的最後一位都沒有錯誤), 且通過了標識符過濾,那麽該報文被認為是有效報文。

4 標識符過濾

在CAN協議裏,報文的標識符不代表節點的地址,而是跟報文的內容相關的。因此,發送者以廣播的形式把報文發送給所有的接收者。節點在接收報文時-根據標識符的值-決定軟件是否需要該報文;如果需要,就拷貝到SRAM裏;如果不需要,報文就被丟棄且無需軟件的幹預。

過濾器可配置為,屏蔽位模式和標識符列表模式。

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

如果沒有匹配,報文標識符接著與配置在屏蔽位模式下的過濾器進行比較。

如果報文標識符沒有跟過濾器中的任何標識符相匹配,那麽硬件就丟棄該報文,且不會對軟件有任何打擾。

5 報文存儲

郵箱是軟件和硬件之間傳遞報文的接口。郵箱包含了所有跟報文有關的信息**:標識符**、數據、控制、狀態和時間戳信息。

發送郵箱:

接收郵箱(FIFO):在接收到一個報文後,軟件就可以訪問接收FIFO的輸出郵箱來讀取它。一旦軟件處理了報文(如把它讀出來),軟件就應該對CAN_RFxR寄存器的RFOM位進行置’1’,來釋放該報文,以便為後面收到的報文留出存儲空間。過濾器匹配序號存放在CAN_RDTxR寄存器的FMI域中。16位的時間戳存放在CAN_RDTxR寄存器的TIME[15:0]域中。

6 出錯管理

7 位時間特性(重要)

(1 )位時間特性邏輯通過采樣來監視串行的CAN總線,並且通過與幀起始位的邊沿進行同步,及通過與後面的邊沿進行重新同步,來調整其采樣點。

(2)名義上的每位時間分為3段:

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

● 時間段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處於初始化狀態下進行。

8 bxCAN中斷

9 CAN寄存器描述

9.1寄存器訪問保護

軟件只能在CAN處於初始化模式時修改CAN_BTR寄存器。

軟件只能在發送郵箱為空的狀態改變它。

過濾器的數值只能在關閉對應過濾器組的狀態下,或設置FINIT位為’1’後才能改。此外,只有在設置整個過濾器為初始化模式下(即FINIT=1),才能修改過濾器的設置,即修改CAN_FMxR,CAN_FSxR和CAN_FFAR寄存器。

9.2 CAN控制和狀態寄存器

CAN 主控制寄存器 (CAN_MCR)

CAN 主狀態寄存器 (CAN_MSR)

CAN 發送狀態寄存器 (CAN_TSR)

CAN 接收FIFO 0 寄存器 (CAN_RF0R)

CAN 接收FIFO 1 寄存器(CAN_RF1R)

CAN 中斷使能寄存器 (CAN_IER)

CAN 錯誤狀態寄存器 (CAN_ESR)

CAN 位時序寄存器 (CAN_BTR)

9.3CAN郵箱寄存器

9.4CAN過濾器寄存器

CAN 過濾器主控寄存器 (CAN_FMR)

CAN 過濾器模式寄存器 (CAN_FM1R)

CAN 過濾器位寬寄存器 (CAN_FS1R)

CAN 過濾器FIFO 關聯寄存器 (CAN_FFA1R)

CAN 過濾器激活寄存器 (CAN_FA1R)

CAN 過濾器組i 的寄存器x (CAN_FiRx)

【CAN總線】CAN代碼相關問題和註釋(1) ------------4.6更新