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個時間單元。