본문 바로가기

CAN

4. 필터 설정 (1) 설정 방법

레퍼런스 매뉴얼에서 필터 레지스터를 보면 32비트를 모두 사용한다고 되어 있습니다. 하지만 식별자는 확장 식별자를 포함해도 최대 29비트입니다. 그럼에도 필터 레지스터가 32비트를 모두 사용하는 이유는 식별자뿐만 아니라 IDE와 RTR 비트도 검사하기 때문입니다. 따라서 사용자는 IDE와 RTR도 고려하여 필터를 설계해야 합니다. 물론 HAL 드라이버는 필터 설정 함수를 제공합니다. 하지만 필터 설정 함수도 식별자와 IDE, RTR 비트를 구분해서 정리해 주진 않습니다. 이건 사용자가 직접 계산해서 알맞은 값을 넣어야 합니다.

 

그런데 레퍼런스 매뉴얼에 뜬금없이 ‘필터 뱅크’라는 용어가 등장합니다. ‘자동차 네트워크 시스템’ 에서 CAN 프로토콜에 관한 내용을 봤을 때 언급되지 않았던 용어입니다. STM32는 32비트 필터 레지스터 2개를 하나의 필터 뱅크로 묶어서 사용합니다. 이 32비트 필터 레지스터 하나는 1개의 32비트 필터 또는 2개의 16비트 필터가 될 수 있습니다. 하지만 필터를 설정하는 최소 단위는 필터 뱅크입니다. STM32F091RC는 14개의 필터 뱅크를 제공합니다. 참고로STM32 제품군 중 다른 제품과의 연결성과 실시간 처리를 위해 특별히 설계된 connectivity line은 28개의 필터 뱅크를 제공합니다.

 

STM32 제품만의 특징인지는 모르겠지만 각 필터 뱅크를 RX FIFO 1또는 2에 배정해야 합니다. 어떤 필터를 통과한 데이터는 무작위로 RX FIFO에 들어가는 것이 아니라, 그 필터가 배정된 RX FIFO에 들어가게 됩니다.

 

필터는 필터 초기화 모드에 들어가지 않고 동적으로 활성화/비활성화 될 수 있습니다. 즉, 여러 개의 필터를 미리 입력해 놓고, 상황에 따라 필요한 필터만 켜고 끌 수 있다는 의미입니다. 그 외에 다른 설정은 CAN_FMR 레지스터의 FINIT 비트를 1로 셋하여 필터 초기화 모드로 진입한 다음에만 변경할 수 있습니다. 참고로 필터 설정 레지스터가 아닌 필터 레지스터의 내용은 초기화 모드 또는 해당 필터 레지스터가 포함된 필터 뱅크가 비활성화된 경우 모두에서 변경될 수 있습니다.

 

필터는 리스트 모드, 마스크 모드 2가지 모드와 16비트, 32비트 2가지 길이로 설정될 수 있기 때문에 조합하여 4가지 방식으로 사용될 수 있습니다. 각 모드와 길이의 특징에 대해 자세히 알아보기 전에 먼저 설정 방법에 대해 알아보겠습니다.

 

이미 언급했지만 활성화/비활성화를 제외한 모든 설정은 CAN_FMR 레지스터의 FINIT 비트를 1로 셋하여 필터 초기화 모드로 진입한 다음에만 가능합니다. 이것은 CAN_MCR의 INRQ를 1로 설정하여 컨트롤러 초기화 모드로 들어가는 것과 구분되는 것에 주의해야 합니다. 필터 설정 레지스터는 필터 초기화 모드 진입과 CAN2가 제공되는 경우 CAN2가 사용할 필터 뱅크의 범위를 지정해주는 필터 마스터 레지스터(CAN_FMR)를 제외하고 총 4개가 있습니다. 이 4개의 필터 설정 레지스터의 구성은 모두 동일합니다. 각 필터 설정 레지스터는 비트0부터 비트27까지 28개의 비트를 사용할 수 있으며, 비트 번호는 필터 뱅크 번호와 대응됩니다.

 

can_fmr can_fm1r can_fs1r can_ffa1r can_fa1r fbm fsc ffa fact can2sb

  1. CAN_FMR (Filter Master Register)
    : CAN2SB 필드는 CAN2가 있는 경우 CAN2가 사용할 필터 뱅크의 시작 번호를 나타냅니다. 리셋값은 (0b1110 =)14로 필터 뱅크0부터 필터뱅크 13까지 총 14개의 필터 뱅크를 CAN1사용하고 나머지를 CAN2가 사용한다는 의미이지만 STM32F091RC는 CAN1 밖에 없으므로 리셋값을 변경할 필요가 없습니다. 하지만 14이외의 값을 입력한다고 해도 다시 14로 돌아가기 때문에 어떠한 값을 입력해도 상관은 없습니다. 그리고 FINIT 비트를 1로 셋해야 나머지 CAN_FA1R 레지스터를 제외한 나머지 3개의 레지스터 설정이 가능합니다.
  2. CAN_FM1R (Filter Mode Regiseter)
    : 비트 번호는 필터 뱅크 번호입니다. 어떤 비트에 1을 쓰면 그 필터 뱅크안에 있는 필터 레지스터들은 리스트 모드로 동작합니다.
  3. CAN_FS1R (Filter Mode Regiseter)
    : 비트 번호는 필터 뱅크 번호입니다. 어떤 비트에 1을 쓰면 그 필터 뱅크안에 있는 필터 레지스터들은 32비트로 동작하게 됩니다.
  4. CAN_FFA1R (Filter Mode Regiseter)
    : 비트 번호는 필터 뱅크 번호입니다. 어떤 비트에 1을 쓰면 그 필터 뱅크안에 있는 필터 레지스터들은 RX FIFO1에 배정됩니다.
  5. CAN_FA1R (Filter Mode Regiseter)
    : 비트 번호는 필터 뱅크 번호입니다. 어떤 비트에 1을 쓰면 그 필터 뱅크안에 있는 필터 레지스터들은 활성화됩니다. 유일하게 필터 초기화 모드에 진입하지 않고 변경할 수 있는 레지스터입니다.

CAN_FM1RCAN_FS1R에 따라 다음의 4가지 방식의 필터를 설정할 수 있습니다.

 

 

 CAN_FM1R

 0

 1

 CAN_FS1R

 0

 16비트 마스크 모드

 16비트 리스트 모드

 1

 32비트 마스크 모드

 32비트 리스트 모드

 

참고로 레퍼런스 매뉴얼의 레지스터 맵을 보면 하나의 필터 뱅크는 필터 레지스터1과 필터 레지스터2로 나누어져 있는 것을 볼 수 있습니다. CAN_FiRx가 그것입니다. i는 필터 번호로 0부터 27까지의 값을 가질 수 있고, x는 레지스터 번호로 1또는 2가 될 수 있습니다. 즉, CAN_FiRx 레지스터는 총 (27 x 2 =)54개가 있고, (54 x 4 =)0xD8만큼의 공간을 차지합니다.