2025/04/02

CAN Mask & Filter of MCP 2515 calculate

由於 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