Jednou z velkých výhod komunikace po CAN sběrnici je existence masek a filrů, které slouží k filtrování přijatých rámců/zpráv. Tato filtrace probíhá na hardwarové úrovni přímo v řadiči CANu, o filtraci se tak nemusí starat firmware v MCU a může se věnovat jiné činnosti. Dostane ke zpracování z CAN řadiče jen ty zprávy, které projdou akceptací pomocí těchto filtrů. Filtry a masky fungují podle této tabulky:
Tedy platí že zpráva je přijata, v případě že bity identifikátoru odpovídají filtru pokud má odpovídajíci bit masky hodnotu 1.
Příklad: Id 1548 dekadicky
110 0000 1100 - Id 000 1111 1111 - Maska 000 0000 1100 - Zpráva je přijata pokud filtr má tuto hodnotu
Jsou tak přijaty všechny zprávy, kde je hodnota dolních 8 bitů 0000 1100. Horní 3 bity mohou mít jakoukoliv hodnotu.
Za zmínku stojí že, existují řadiče, kde funkce masky je obrácená. Tedy jsou porovnávány bity filtru pokud je hodnota bitu masky 0.
Řadic CANu obvykle obsahuje více masek a filtrů. Na každou zprávu jsou aplikovány postupně všechny nastavené páry masky a filtru, dokud některá kombinace masky a filtru neprojde nebo nejsou otestovány všechny. Je li nalezena kombinace která projde, je zpráva přijata a je pak dále zpracovávána ve firmware MCU. Pokud nevyhovuje žádnému nastavenému páru masky a filtru, řadič ji ignoruje a firmware ji nemusí zpracovávat.
Jak ale postupovat, pokud potřebujeme číst z CAN sběrnice více různých rámců než je možné nastavit párů masek a filrů? Existuje jednoduchá metoda. V příkladu si situaci zjednodušíme pouze 5 bitovým identifikátorem.
Příklad: potřebujeme nastavit jeden filtr a masku tak aby akceptoval Id 10, 11 a 12 dekadicky.
0 1010 - Id 10 0 1011 - Id 11 0 1100 - Id 12 0 1000 - AND všech Id, tedy HODNOTA FILTRU -------------- 0 1111 - OR všech Id 0 1000 - vypočtená hodnota FILTRU 0 0111 - XOR předchozího OR a vypočtené hodnoty FILTRU -------------- 1 1000 - negace výsledku XOR, tedy HODNOTA MASKY
Hodnota filtru je tedy 0 1000 a hodnota masky je 1 1000 binárně.
Hodnota filtru = AND všech ID které chci příjímat
Hodnota masky = NEG ((OR všech ID které chci příjímat) XOR hodnota filtru)
Z výsledku je zřejmé, že budou přijaty i některé další zprávy, například bude přijata zpráva s Id 01111, nicméně pořád bude velká část zpráv odfiltrována hardwarově a firmware tak bude provádět mnohem méně porovnávání a zpracování zpráv a bude tak šetřen jeho strojový čas. I v tomto případě si lze ještě vypomoci aby se zjednodušilo porovnávání jak a zda vůbec zprávu zpracovat. Stačí porovnávání rozdělit dle toho, jaký filtr reagoval. Tato informace je často k dispozici jako součást přijaté zprávy. Případně v jakém bufferu je přijatá zpráva uložena.