俺言語。

自分にしか理解できない言語で書かれた備忘録

【Arduino】MCP2515で受信するCAN信号のフィルタ方法 ~MaskとFilterの使用方法

MCP2515というCANコントローラは
2個の受け入れマスク(2個受信バッファがあり、各バッファに1つずつ)と
6個の受け入れフィルタがあって、これをしっかり設定しないと意図したメッセージが取得できない。

SeeedのCAN_BUS_Shieldを使う。READMEがわかりやすくていいね。
GitHub - Seeed-Studio/CAN_BUS_Shield: CAN Bus Shield - MCP2515&MCP2551

フィルタとマスクの設定方法

ライブラリでは下記のメソッドを使ってフィルタとマスクを設定する。

f:id:hukkuramamemoti:20200517005834p:plain

2番目の引数は標準IDか拡張IDかなのでほとんどのケースで標準IDの0になるかと。

マスク0はフィルタ0, 1
マスク1はフィルタ2, 3, 4, 5と組み合わせて使う。

下記の表を参考にID0x209とID0x218を受信する場合、
こんな設定になる。

f:id:hukkuramamemoti:20200517010556p:plain

マスクとフィルタ、IDを2進数で表現して各ビットを比較した時、

マスク:1 フィルタ:1 -> ID:1のみ受入れ、0は拒否
マスク:1 フィルタ:0 -> ID:0のみ受入れ、1は拒否
マスク:0 フィルタ:any -> ID:なんでもOK

となる。
f:id:hukkuramamemoti:20200517011156p:plain

f:id:hukkuramamemoti:20200517005306p:plain


ちなみに受信バッファRXB0の方がRXB1より処理の優先順位が高いようなので更新周期が早いメッセージはRXB0で
設定したほうがいいのかも。
f:id:hukkuramamemoti:20200517003824p:plain