본문으로 바로가기

Understanding bxCAN acceptance filtering

CAN 메시지 수신 과정

CAN은 브로드캐스트 방식의 통신 시스템이므로, 애플리케이션이 관심 없는 메시지까지 모두 수신하면 불필요한 인터럽트가 지속적으로 발생하여 시스템의 오버헤드 증가

따라서 CAN 메시지가 CAN Rx 핀을 통해 들어오면, 수락 필터링(Acceptance Filtering) 과정에서 Filter Bank가 적용되어 수신된 메시지를 필터링

즉, 수신된 메시지는 필터링 규칙과 비교되며, 규칙을 충족하는 메시지만 FIFO에 저장

  • 필터링 규칙을 충족한 메시지는 FIFO에 저장되며, 인터럽트 발생
  • 필터링 규칙을 충족하지 못한 메시지는 CAN 컨트롤러의 수신 엔진에서 폐기, 인터럽트 발생X

 

Rx FIFO 구조

각 CAN 컨트롤러에는 2개의 수신 FIFO가 존재]

즉, CAN1에는 2개의 Rx FIFO, CAN2에도 2개의 Rx FIFO가 존재

각 FIFO에는 최대 3개의 CAN 메시지를 저장할 수 있으며, FIFO 관리는 하드웨어에 의해 자동으로 수행

 

Acceptance Filtering

CAN 컨트롤러는 기본적으로 버스에서 감지한 모든 프레임을 읽어 FIFO 메모리에 저장하고, 이를 호스트 프로세서에 알림. 하드웨어 필터링 기능을 활용하면, 특정 조건을 충족하지 않는 CAN 프레임을 무시하고 폐기

→ 불필요한 메시지를 처리할 필요가 없어 프로세서의 오버헤드 감소

  • ST bxCAN 컨트롤러에는 28개의 필터 뱅크(Filter Banks) 가 존재하며, 이는 Master 및 Slave CAN 컨트롤러가 공유
  • 각 필터 뱅크는 2개의 32비트 필터 레지스터(R1, R2) 를 포함

 

CAN Acceptance Filtering

  • 수락 필터링은 CAN 컨트롤러가 특정 조건을 충족하는 메시지만 수락하고 나머지는 폐기하도록 하는 기능
  • 필터링은 Filter Bank를 사용하여 수행되며, 각 필터 뱅크는 두 개의 32비트 레지스터(R1, R2)로 구성
  • 필터링 모드:
    • 마스크 모드: 특정 비트를 검사하도록 마스크 값을 설정하는 방식
    • 리스트 모드: 특정 ID 값만 허용하는 방식

예제 1: 상위 3비트가 1인 경우만 수락

조건: 표준 식별자(11비트)의 상위 3비트(MSB)가 1 1 1인 프레임만 수락

  1. 마스크 레지스터(R2)에 1 1 1 0 0 0 0 0 0 0 0을 설정
  2. 식별자 레지스터(R1)에 1 1 1 X X X X X X X X를 설정 (X는 무관한 값)
  3. 수신된 메시지의 상위 3비트가 1 1 1이면 수락, 그렇지 않으면 폐기

예제 2: 상위 3비트가 0이고 하위 2비트가 1인 경우만 수락

조건: 표준 식별자의 상위 3비트가 0 0 0, 하위 2비트(LSB)가 1 1인 프레임만 수락

  1. 마스크 레지스터(R2)에 1 1 1 0 0 0 0 0 0 1 1을 설정
  2. 식별자 레지스터(R1)에 0 0 0 X X X X X X 1 1을 설정
  3. 상위 3비트가 0 0 0이고 하위 2비트가 1 1이면 프레임을 수락

예제 3: 특정 ID(0x65D 또는 0x651)만 수락

조건: 표준 식별자가 0x65D 또는 0x651인 경우만 수락

 

  1. 마스크 모드가 아닌 리스트 모드(ID Mode) 사용
  2. R1에 0x65D 저장, R2에 0x651 저장
  3. 수신된 메시지의 ID가 0x65D 또는 0x651과 일치하면 수락, 그렇지 않으면 폐기

예제 4: 요청 프레임(Request Frame)만 수락

조건: 요청 프레임(RTR 비트가 1)만 수락

  1. RTR 비트가 1이면 요청 프레임, 0이면 데이터 프레임
  2. 마스크 레지스터(R2)에서 RTR 필드를 1로 설정
  3. 식별자 레지스터(R1)에서 RTR 필드를 1로 설정
  4. 수신된 메시지의 RTR 비트가 1이면 수락, 0이면 폐기

예제 5: 확장 ID(Extended ID) 프레임만 수락

조건: 확장 식별자(IDE 비트가 1) 프레임만 수락

  1. IDE 비트가 1이면 확장 ID, 0이면 표준 ID
  2. 마스크 레지스터(R2)에서 IDE 필드를 1로 설정
  3. 식별자 레지스터(R1)에서 IDE 필드를 1로 설정
  4. 수신된 메시지의 IDE 비트가 1이면 수락, 0이면 폐기

예제 6: 모든 프레임 수락

조건: 모든 CAN 메시지를 수락

  1. 필터를 설정하지 않으면 기본적으로 모든 메시지가 수락됨
  2. 단, 메시지를 어느 FIFO(First In First Out) 버퍼로 보낼지를 설정해야 함

Exploring filtering data structures

① FilterIdHigh : 32비트 설정에서 필터 식별 번호의 상위 16비트(MSB) 지정

  • 관련 레지스터: Identifier Register

② FilterIdLow : 32비트 설정에서 필터 식별 번호의 하위 16비트(LSB) 지정

③ MaskIdHigh / MaskIdLow : 필터 마스크 ID 설정 (필터링할 메시지 지정)

④ FilterFIFOAssignment : 필터 뱅크(예: 0~1)에서 수신 메시지가 어느 FIFO로 전달될지 설정

⑤ FilterBank

  • 총 28개의 필터 뱅크 사용 가능.
  • 단일 CAN 인스턴스 사용 시 0~13번까지 14개 필터 뱅크만 사용 가능

⑥ Filter Mode : Mask Mode / ID Mode

⑦ Filter Scale

  • 32비트 또는 16비트 설정 가능
  • 일반적으로 32비트 사용(레지스터를 32비트로 취급)

⑧ Filter Activation : 필터를 활성화하려면 enable 설정

⑨ SlaveStartFilterBank

  • 듀얼 CAN 사용 시만 의미 있음
  • 28개의 필터 뱅크를 CAN1과 CAN2가 공유
  • 0 ~ 13은 CAN1, 14 ~ 27은 CAN2가 사용

 

루프백(Loopback) 애플리케이션 설정

  • 모든 프레임을 수락하는 Mask Mode 사용.
  • 이 경우 설정 값:
    • FilterIdHigh = 0
    • FilterIdLow = 0
    • MaskIdHigh = 0
    • MaskIdLow = 0
    • FilterBank = 0 (0번 필터 뱅크 사용)
    • FIFO Assignment = RX FIFO 0
    • Filter Mode = Mask Mode

Exercise : CAN Tx, Rx with filter config

수신 메시지 확인

  • 데이터를 읽기 전에 해당 FIFO에 메시지가 존재하는지 확인
  • API: HAL_CAN_GetRxFifoFillLevel()
  • 역할: RX FIFO의 메시지 개수 확인
  • 반환값:
    • 0이면 수신된 메시지 없음
    • 1~3이면 메시지가 존재
void CAN1_Rx(void)
{
	CAN_RxHeaderTypeDef RxHeader;
	uint8_t message[5];
	char msg[50];

	while(HAL_CAN_GetRxFifoFillLevel(&hcan1, CAN_RX_FIFO0));
	if(HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxHeader, message)!= HAL_OK) Error_handler();

	sprintf(msg, "Message Received %s\r\n", message);
	HAL_UART_Transmit(&huart2, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY);

}
  • 메시지가 존재할 때까지 대기 (while 문 활용)
  • HAL_CAN_GetRxMessage() 호출하여 데이터를 읽음
  • 데이터를 출력(printf)하여 확인

 

CAN Filter Configuration

  • CAN Start 호출 전에 필터 설정
  • CAN Start가 실행되면 초기화 모드에서 벗어나므로, 그 전에 필터 설정을 완료
  • 필터 구성 함수 (CAN Filter Config) 생성

  • 32비트 vs 16비트 스케일
    • 32비트 스케일: ID 레지스터 R1과 R2가 32비트로 처리
    • 16비트 스케일: ID 레지스터 R1이 두 개의 16비트 레지스터로 분할
    • 대부분의 경우 32비트 스케일을 사용
반응형

'ComputerScience & Embedded > NUCLEO & CAN Tranceiver' 카테고리의 다른 글

CAN normal mode  (0) 2025.03.01
STM32 bxCAN Exercise  (0) 2025.03.01
STM32 bxCAN  (0) 2025.03.01
CAN frame formats / Bus Arbitration  (0) 2025.03.01
CAN (Controller Area Network) Fundamentals  (0) 2025.03.01