FirmGod

CAN 필터·마스크 계산기

CAN 필터와 마스크가 실제로 통과시키는 식별자를 확인하고, 원하는 ID 목록에 맞는 가장 촘촘한 필터와 함께 들어오는 불필요한 ID 수까지 계산합니다.

1 = compare this bit

공백, 쉼표, 줄바꿈으로 구분하세요. 모두를 통과시키는 가장 촘촘한 필터 하나를 계산합니다.

Filter0x100
Mask0x7FC
Exact: this filter admits your 4 identifiers and nothing else.
통과하는 식별자4
비교하는 비트9 / 11
무시하는 비트2
필터, 2진수00100000000
비교 대상 비트111111111··

Every identifier admitted (4):

0x1000x1010x1020x103

수신 필터가 하는 일

CAN 컨트롤러는 버스의 모든 프레임을 봅니다. 수신 필터는 인터럽트가 발생하기 전에, 이 프레임을 소프트웨어에 넘길 가치가 있는지 하드웨어가 판단하는 것입니다. 판단은 비교 한 번입니다.

(수신 ID XOR 필터) AND 마스크 == 0

마스크가 비교하라고 한 자리에서는 식별자가 필터와 같아야 하고, 무시하라고 한 자리는 무엇이든 됩니다. 구조는 이게 전부이고, 필터에 관한 성가신 일들은 모두 이 단순함에서 나옵니다.

마스크 해석은 통일돼 있지 않습니다

마스크 비트 1의 의미가 부품 계열마다 반대이고, 16진수 값만 봐서는 어느 쪽인지 알 수 없습니다.

  • 1이 비교 — STM32 bxCAN, MCP2515 등 대부분의 최신 컨트롤러. 마스크가 전부 1이면 식별자 하나만 통과합니다.
  • 1이 무시 — SJA1000 PeliCAN 모드와 그 계보. 마스크가 전부 1이면 전부 통과합니다.

이것 때문에 생기는 오류는 조용합니다. 잘못된 문서에서 가져온 마스크는 경고도 오류도 내지 않고, 대개 어중간하게 동작하지도 않습니다 — 전부 막히거나 전부 통과하며, 둘 다 한참 동안 배선이나 비트레이트 문제처럼 보입니다. 이 도구에서 마스크 방식을 가장 먼저 고르게 한 이유입니다.

필터 하나로 임의의 목록을 맞출 수 없는 이유

필터는 값이 아니라 비트 자리를 비교합니다. 원하는 식별자들이 모두 같은 값을 갖는 자리만 비교할 수 있고, 하나라도 다르면 그 자리는 버려야 합니다. 그래서 어떤 집합에 대한 가장 촘촘한 필터는 유일하고, 동시에 어느 정도의 낭비는 피할 수 없습니다.

0x100과 0x200을 예로 들면 두 비트가 다르므로 둘 다 버려야 하고, 두 비트를 버리면 네 개가 통과합니다 — 0x000, 0x100, 0x200, 0x300. 원하는 둘만 받고 나머지 둘을 막는 필터·마스크 조합은 존재하지 않습니다. 여분의 프레임을 받아 소프트웨어에서 버리거나, 필터 뱅크를 하나 더 쓰는 수밖에 없습니다.

연속되고 정렬된 구간은 운이 좋은 경우입니다. 0x100부터 0x103은 하위 두 비트만 다르므로, 0x100에 하위 두 비트를 버린 필터가 정확히 그 넷만 통과시킵니다. 노드에 연속된 ID 블록을 할당하는 설계가 흩어 놓는 설계보다 필터링이 쉬운 이유이고, 이것은 식별자를 아직 배정하는 단계에서 알아 두는 편이 나중보다 낫습니다.

결과를 읽는 법

중요한 숫자는 통과하는 식별자 수와 원한 수의 비교입니다. 둘을 받으려고 넷이 통과하는 것은 대개 괜찮습니다 — 주기마다 불필요한 프레임 두 개는 거의 비용이 없습니다. 다섯을 받으려고 512개가 통과한다면 그 필터는 제 역할을 못 하는 것이고, 부하가 걸린 버스에서 기능 오류가 아니라 인터럽트 부하로 드러납니다.

낭비가 너무 크면 집합을 나눠야 합니다. 비트를 공유하는 식별자끼리 묶어 각각 필터 뱅크를 주고 따로 확인하세요. 컨트롤러가 목록 모드를 지원한다면 흩어진 작은 집합은 거기에 정확히 들어가고 불필요한 통과가 전혀 없습니다.

필터는 부하 관리이지 검증이 아닙니다

필터가 무엇을 위한 것인지는 분명히 해 둘 필요가 있습니다. CPU가 들여다봐야 할 프레임을 줄이는 것이고, 바쁜 버스에서 그것은 따라가는 노드와 메시지를 놓치는 노드를 가르는 차이입니다. 안전이나 보안 경계는 아닙니다 — 통과한 것은 여전히 검사해야 하고, 악의적이거나 고장난 노드는 어떤 식별자든 송신할 수 있습니다.

회선 위의 내용도 바꾸지 않습니다. 모든 노드는 여전히 전기적으로 모든 프레임을 수신하고, 중재에 참여하며, 오류를 알립니다. 필터링은 그 모든 것이 끝난 뒤에 일어납니다.

숫자에 대해

확장 식별자에 필터를 열어 두면 536,870,912개가 통과하며, 이 페이지는 그것을 "전부"로 뭉개지 않고 그대로 적습니다. 그 수가 필터가 실제로 얼마나 제약하고 있는지를 보여 주는 정직한 척도이고, 29비트에서는 숫자가 금세 커집니다 — 열 비트만 버려도 천 개가 넘습니다. 전부 나열하는 것은 쓸모가 없으므로 앞의 서른두 개를 보여 주고 총계를 정확히 적습니다.

자주 묻는 질문

필터를 걸었더니 아무것도 안 들어옵니다.

마스크 해석 방식부터 확인하세요. bxCAN과 MCP2515에서는 마스크 비트 1이 "이 비트를 비교하라"는 뜻이고, SJA1000의 PeliCAN 모드에서는 1이 "무시하라"는 뜻입니다. 다른 데이터시트에서 가져온 마스크는 모든 비트의 의미가 뒤집혀서, 보통 전부 막히거나 전부 통과합니다.

요청하지 않은 ID가 들어옵니다.

필터 하나는 원하는 ID들이 모두 일치하는 비트만 비교할 수 있기 때문입니다. 두 ID가 어떤 비트에서 다르면 그 비트를 버려야 하고, 버린 비트 하나당 통과하는 ID가 두 배가 됩니다. k개를 버리면 2의 k제곱 개가 들어옵니다. 이 계산기가 그 수를 표시하는 이유입니다.

필터를 몇 개나 쓸 수 있나요?

컨트롤러마다 다릅니다. STM32 bxCAN은 단일 CAN 부품에서 14개, 두 인스턴스가 있으면 28개를 나눠 씁니다. MCP2515는 마스크 2개와 필터 6개를 두 수신 버퍼에 나눠 둡니다. M_CAN 계열은 표준·확장 필터 요소 수를 설정할 수 있습니다. 나누기 전에 레퍼런스 매뉴얼을 확인하세요.

하드웨어 필터를 꼭 써야 하나요?

버스 트래픽이 소프트웨어가 필요한 양보다 많다면 써야 합니다. 통과한 프레임마다 인터럽트와 버퍼가 소모되고, 바쁜 버스에서는 그것이 응답성과 프레임 손실을 가르는 차이가 됩니다. 다만 보안 수단은 아닙니다 — 부하를 줄일 뿐이고 통과한 것은 여전히 검증해야 합니다.

표준 ID와 확장 ID를 한 필터로 덮을 수 있나요?

의미 있게는 안 됩니다. 두 형식은 폭이 다르고 컨트롤러가 별도의 필터 설정으로 처리하며 IDE 비트가 어느 쪽인지를 정합니다. 표준용과 확장용을 따로 계산해야 하고, 이 도구에서 폭을 먼저 고르게 되어 있는 이유가 그것입니다.