null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
⌂
CAN 통신 실전 입문 — 이론부터 Vector 드라이버 설정까지
Structure
can-basics
•
CAN 통신이란 — 탄생 배경과 버스 구조
bit-timing
•
CAN Bit Timing — Prescaler·SJW·BS1·BS2 계산법
transceiver
•
CAN 트랜시버 — TLE9251V로 보는 핀, 모드, 설계 포인트
vector-driver-choice
•
Vector 드라이버 선택 — XL-Driver vs PassThru
xl-driver-setup
•
Vector XL-Driver 실전 설정 — 포트, 이더넷 모드, 주의사항
troubleshooting
•
Vector 드라이버 트러블슈팅 — 버전 미스매치와 Network 모드 불가
can-hw-filter
•
CAN 하드웨어 메시지 필터 — 원하는 ID만 골라받기
dbc-file
•
DBC 파일과 CANdb++ — CAN 메시지 데이터베이스 읽기
uds-on-can
•
UDS 진단 프로토콜 — CAN 위에서 ECU를 제어하는 방법
Flow Structure
Vector 드라이버 트러블슈팅 — 버전 미스매치와 Network 모드 불가
7 / 9
DBC 파일과 CANdb++ — CAN 메시지 데이터베이스 읽기
☆ Star
↗ Full
CAN 하드웨어 메시지 필터 — 원하는 ID만 골라받기
#can
#메시지필터
#하드웨어필터
#id필터
#mcu
@devpc
|
2026-05-06 05:25:46
|
GET /api/v1/flows/28/nodes/560?fv=1&nv=1
Context:
Flow v1
→
Node v1
0
Views
1
Calls
# CAN 하드웨어 메시지 필터 — 원하는 ID만 골라받기 ## 필터가 왜 필요한가 CAN 버스는 모든 노드가 메시지를 공유한다. 버스에 100개의 CAN 메시지가 초당 수백 번 오가더라도, 내 MCU가 실제로 처리해야 할 메시지는 그 중 일부다. 필터 없이 모든 메시지를 수신하면 MCU는 자신과 무관한 메시지를 처리하느라 CPU를 낭비한다. **하드웨어 필터**는 MCU의 CAN 컨트롤러 내부에서 원하는 ID의 메시지만 수신 FIFO에 넣고, 나머지는 하드웨어 레벨에서 버린다. 소프트웨어에서 체크하기 전에 이미 걸러지므로 CPU 부하가 없다. ## 필터 모드 — Mask vs List STM32 CAN 컨트롤러를 기준으로 두 가지 필터 모드가 있다. ### Mask 모드 ID를 비트 마스크로 걸러낸다. "이 비트들만 체크하고, 나머지는 무시해라"는 방식이다. ``` 수신된 메시지 ID: 0x123 Filter ID: 0x120 Filter Mask: 0x7F8 (= 1111 1111 000, 상위 9비트만 체크) 체크 로직: (수신 ID AND Mask) == (Filter ID AND Mask) → (0x123 AND 0x7F8) == (0x120 AND 0x7F8) → 0x120 == 0x120 → 통과 ✅ ``` Mask 모드의 장점: **한 개의 필터 뱅크로 ID 범위를 커버**할 수 있다. 예를 들어 0x600~0x6FF 대역 전체를 통과시키려면: ``` Filter ID: 0x600 Filter Mask: 0x700 (상위 3비트만 체크) ``` ### List 모드 ID를 목록으로 지정한다. 목록에 있는 ID만 통과시킨다. ``` 필터 뱅크 1개로 두 ID를 지정: Filter ID 1: 0x100 Filter ID 2: 0x200 → ID가 0x100이거나 0x200인 메시지만 수신 ``` List 모드는 정확하게 지정된 ID만 받을 때 유용하다. 하지만 커버할 수 있는 ID 수가 필터 뱅크 수에 비례하므로, 많은 ID를 처리해야 할 때는 Mask 모드가 효율적이다. ## STM32 HAL로 필터 설정 ```c CAN_FilterTypeDef canFilter; /* Mask 모드 예시 — 0x100~0x1FF 대역 전체 통과 */ canFilter.FilterBank = 0; /* 필터 뱅크 번호 (0~27) */ canFilter.FilterMode = CAN_FILTERMODE_IDMASK; /* Mask 모드 */ canFilter.FilterScale = CAN_FILTERSCALE_32BIT; /* 32비트 모드 */ canFilter.FilterIdHigh = 0x0100 << 5; /* ID (Standard ID는 상위 11비트) */ canFilter.FilterIdLow = 0x0000; canFilter.FilterMaskIdHigh = 0x0700 << 5; /* Mask */ canFilter.FilterMaskIdLow = 0x0000; canFilter.FilterFIFOAssignment = CAN_FILTER_FIFO0; /* FIFO0 또는 FIFO1로 라우팅 */ canFilter.FilterActivation = ENABLE; if (HAL_CAN_ConfigFilter(&hcan1, &canFilter) != HAL_OK) { Error_Handler(); } ``` > **Standard ID 시프트**: STM32 CAN 필터 레지스터는 Standard ID를 비트 5부터 넣도록 설계됐다. 그래서 `ID << 5`를 해야 한다. Extended ID는 `ID << 3`. ## 모든 메시지 수신 (필터 OFF) 개발 초기에는 전체 수신이 편할 때가 있다. 필터를 비활성화하려면: ```c /* ID = 0, Mask = 0 → 어떤 ID든 통과 */ canFilter.FilterIdHigh = 0x0000; canFilter.FilterIdLow = 0x0000; canFilter.FilterMaskIdHigh = 0x0000; canFilter.FilterMaskIdLow = 0x0000; canFilter.FilterMode = CAN_FILTERMODE_IDMASK; canFilter.FilterActivation = ENABLE; ``` Mask가 0이면 "아무 비트도 체크 안 해라" → 전부 통과. ## 다중 필터 뱅크 활용 STM32F4 기준 CAN1은 0~13번, CAN2는 14~27번 필터 뱅크를 갖는다. 각 뱅크를 독립 설정할 수 있어 복수의 필터 조건을 동시에 적용할 수 있다. ```c /* 필터 뱅크 0: 0x100~0x1FF */ canFilter.FilterBank = 0; canFilter.FilterIdHigh = 0x0100 << 5; canFilter.FilterMaskIdHigh = 0x0700 << 5; HAL_CAN_ConfigFilter(&hcan1, &canFilter); /* 필터 뱅크 1: 0x200 정확히 */ canFilter.FilterBank = 1; canFilter.FilterMode = CAN_FILTERMODE_IDLIST; canFilter.FilterIdHigh = 0x0200 << 5; canFilter.FilterIdLow = 0x0200 << 5; HAL_CAN_ConfigFilter(&hcan1, &canFilter); ``` ## FIFO 라우팅 활용 STM32 CAN 컨트롤러는 FIFO0과 FIFO1 두 개를 갖는다. 필터별로 어느 FIFO로 라우팅할지 지정할 수 있다. 활용 예: 우선순위가 높은 메시지는 FIFO0, 낮은 메시지는 FIFO1. 인터럽트 핸들러에서 FIFO0을 먼저 처리하면 중요 메시지를 놓치지 않는다. ## 다음 챕터에서는 필터로 원하는 메시지만 받게 됐다. 그런데 그 메시지가 어떤 신호를 담고 있는지 — ID와 데이터를 해석하는 기준이 **DBC 파일**에 정의된다.
Vector 드라이버 트러블슈팅 — 버전 미스매치와 Network 모드 불가
DBC 파일과 CANdb++ — CAN 메시지 데이터베이스 읽기
// COMMENTS
Newest First
ON THIS PAGE
No content selected.