由於 CAN Bus 的 Receiver ID - MCP-2515 具有 2個Mask & 6個Filter
我們可以善加利用,過濾掉許多不需要的 Message,大大減少 MCP的負擔
但是,市面上討論 Mask & Filter 的文章超級少,這邊做個紀錄
◎ 首先, 先理解 Mask & Filter 的功能 :
1. MCP-2515 有兩個 Mask + 六個Filter , 但是 依據文件說明,並非一個 Mask配三個Filter!
而是:
* Mask0 配 Filter0 & Filter1 僅有兩個,使用 Buffer0
* Mask1 配 Filter2 ~ Filter5 共有四個,使用 Buffer1
由於 ext flag 是分開的, 若有使用 ext的需求,甚至是混合使用的需求的,可以一個mask使用ext=1,另一個使用 ext=0;
ID使用量大的 用Mask1,使用量小的 用Mask0
2. Mask & Filter 計算式:
當 CAN Bus 收到一 Frame Message, #ID & Mask & Filter 間的關係 計算式:
( #ID & Mask ) ?= ( Filter & Mask )
當等式成立時,後端MCU方能順利收到 該條 Message !
◎ 再來, 嘗試依據我們需要收到的 Message ID 反推 需要設定的 Mask & Filter :
1. 當 需求 ID 僅一個的時候:
Mask = 0x7ff(ext=0, 11 bits) -or- Mask = 0x1FFFFFFF(ext=1,29 bits)
Filter = #ID
2. 當 需求 ID 僅兩個的時候:
我們只需要知道 兩個 ID之間 沒有變動的 bits, 作為 Mask 即可
- 期望收到 CAN #ID1 & #ID2 :
( ( #ID1 | #ID2 ) & Mask ) ?= ( Filter & Mask )
Mask := NOT ( ID1 xor ID2 )
Filter := ID1 -or- Filter := ID2
3. 當 需求 ID 超過兩個的時候:
- 目標: 找出各ID間 重複出現 0 & 1 的 bits 作為Mask
重複出現 1 的 bit
Mask1 := ( #ID1 and #ID2 and #ID3 and ... )
重複出現 0 的 bit
Mask0 := not ( #ID1 or #ID2 or #ID3 or ... )
重複出現 0 & 1 的 bits
MASK := Mask1 or Mask0 := ( #ID1 and #ID2 and #ID3 and ... ) or ( not ( #ID1 or #ID2 or #ID3 or ... ) )
FILTER := #IDx and MASK