CAN接收報文並過濾之識別符號過濾:(重點、難點)
在CAN協議裡,報文的識別符號不代表節點的地址,而是跟報文的內容相關的。因此,傳送者以廣播的形式把報文傳送給所有的接收者。節點在接收報文時-根據識別符號的值-決定軟體是否需要該報文;如果需要,就拷貝到SRAM裡;如果不需要,報文就被丟棄且無需軟體的干預。
為滿足這一需求,bxCAN為應用程式提供了14個位寬可變的、可配置的過濾器組(13~0),以便只接收那些軟體需要的報文。硬體過濾的做法節省了CPU開銷,否則就必須由軟體過濾從而佔用一定的CPU開銷。每個過濾器組x由2個32位暫存器,CAN_FxR0和CAN_FxR1組成。這兩個暫存器用途在下面有大用處;
可變的位寬:
每個過濾器組的位寬都可以獨立配置,以滿足應用程式的不同需求。根據位寬的不同,每個過濾器組可提供:
1個32位過濾器,包括:STDID[10:0]、EXTID[17:0]、IDE和RTR位===用於擴充套件ID(28位)和標準ID(11位)
2個16位過濾器,包括:STDID[10:0]、IDE、RTR和EXTID[17:15]位====只用於標準ID
可參見圖126
此外過濾器可配置為,遮蔽位模式和識別符號列表模式。
遮蔽位模式
在遮蔽位模式下,識別符號暫存器和遮蔽暫存器一起,指定報文識別符號的任何一位,應該按照“必須匹配”或“不用關心”處理。
識別符號列表模式
在識別符號列表模式下,遮蔽暫存器也被當作識別符號暫存器用。因此,不是採用1個識別符號加1個遮蔽位的方式,而是使用2個識別符號暫存器。接收報文識別符號的每一位都必須
跟過濾器識別符號相同。
BxCAN過濾器的編號
在stm32中,過濾器編號用於加速CPU對收到報文的處理。當受到一個有效報文時,BxCAN會將收到的報文以及它所通過的過濾器編號,一起存入郵箱中。當CPU處理時,可以根據過濾器編號,快速地知道該報文的用途,從而做出處理。其實,不用過濾器編號也是可以的,這時CPU就要分析所收到報文的識別符號,從而知道報文的用途。由於識別符號所含的資訊較多,處理起來就相對慢一些;
報文儲存
郵箱是軟體和硬體之間關於報文的介面。郵箱包含了所有跟報文有關的資訊:識別符號、資料、控制、狀態和時間戳資訊。
傳送郵箱
軟體需要在一個空的傳送郵箱中,把待傳送報文的各種資訊設定好(然後再發出傳送的請求)。傳送的狀態可通過查詢CAN_TSR暫存器獲知。
接收郵箱(FIFO)
在接收到一個報文後,軟體就可以訪問接收FIFO的輸出郵箱來讀取它。一旦軟體處理了報文(如把它讀出來),軟體就應該對CAN_RFxR暫存器的RFOM位進行置1,來釋放該報文,以便為後面收到的報文留出儲存空間。過濾器匹配序號存放在CAN_RDTxR暫存器的FMI域中。16位的時間戳存放在CAN_RDTxR暫存器的TIME[15:0]域中。
郵箱中儲存的是完整的報文資訊;解析郵箱參見手冊;
時間特性:(涉及波特率的計算)
位時間特性邏輯通過取樣來監視序列的CAN匯流排,並且通過跟幀起始位的邊沿進行同步,及通過跟後面的邊沿進行重新同步,來調整其取樣點。它的操作可以簡單解釋為,如
下所述把名義上的每位的時間分為3段:
同步段(SYNC_SEG):通常期望位的變化發生在該時間段內。其值固定為1個時間單元(1 x tCAN)。
時間段1(BS1):定義取樣點的位置。它包含CAN標準裡的PROP_SEG和PHASE_SEG1。其值可以程式設計為1到16個時間單元,但也可以被自動延長,以補償因為網路中不同節點的頻率差異所造成的相位的正向漂移。
時間段2(BS2):定義傳送點的位置。它代表CAN標準裡的PHASE_SEG2。其值可以程式設計為1到8個時間單元,但也可以被自動縮短以補償相位的負向漂移。
重新同步跳躍寬度(SJW)定義了,在每位中可以延長或縮短多少個時間單元的上限。其值可以程式設計為1到4個時間單元。