차량과 산업 장비에서 쓰는 다중 마스터 차동 신호 버스(Controller Area Network). 보쉬가 1986년에 발표했다.
물리 계층
CAN_H, CAN_L 두 선의 전압 차이로 신호를 표현한다
Recessive(1) : CAN_H = CAN_L = 2.5V → 차이 0V Dominant (0) : CAN_H = 3.5V, CAN_L = 1.5V → 차이 2V
차동 신호라 노이즈에 강하다 — 두 선에 같은 노이즈가 실리면 차이는 그대로이므로 상쇄된다. 차량의 열악한 전기 환경에서 필수적이다.
"dominant가 recessive를 이긴다" — 하나라도 0을 보내면 버스는 0이 된다. 이 성질이 아비트레이션의 기반이다.
프레임 구조
SOF │ ID(11 or 29비트) │ RTR │ 제어 │ 데이터(0~8B) │ CRC │ ACK │ EOF
↑ ↑ ↑
시작 식별자+우선순위 최대 8바이트
주소가 없다. 대신 메시지 ID가 있다. "누구에게 보낸다"가 아니라 "이런 종류의 데이터를 방송한다" 는 모델이다.
각 노드는 필터를 설정해 자기가 관심 있는 ID만 수신한다.
// 하드웨어 필터 — CPU 개입 없이 걸러낸다
filter.FilterIdHigh = 0x123 << 5;
filter.FilterMaskIdHigh = 0x7FF << 5;
왜 데이터가 8바이트뿐인가
- 짧은 프레임 = 짧은 전송 시간 = 높은 우선순위 메시지의 대기 시간이 짧다
- 실시간성 보장
긴 메시지 하나가 버스를 오래 점유하면 긴급 메시지가 늦어진다. 8바이트 제한은 실시간성을 위한 의도적 설계다.
더 많은 데이터가 필요하면 ISO-TP(ISO 15765-2)로 분할 전송한다. 진단 통신(UDS)이 이 방식을 쓴다.
CAN FD는 최대 64바이트까지 늘리고 데이터 구간의 속도를 높였다.
속도와 거리
1 Mbps → 40m
500 kbps → 100m ← 차량 파워트레인에서 흔함
250 kbps → 250m
125 kbps → 500m
속도 × 거리가 대략 일정하다. 신호가 버스 끝까지 갔다 오는 시간 안에 아비트레이션이 끝나야 하기 때문이다.
오류 처리 — 자동 재전송
CRC, 형식, ACK, 비트 모니터링, 비트 스터핑 — 5가지 오류 검출 오류를 감지하면 에러 프레임을 보내 모두가 그 프레임을 버리게 한다
- 송신 노드가 자동으로 재전송
에러 카운터와 상태 전이
- Error Active — → 정상. 에러 프레임을 능동적으로 보낸다
- Error Passive → 에러 카운터 128 초과. 소극적으로 동작
- Bus Off — → 256 초과. 버스에서 스스로 격리 ★
★ Bus Off가 실무에서 중요하다. 고장난 노드가 버스 전체를 마비시키는 것을 막기 위해 스스로 빠지는 것이다. 복구하려면 소프트웨어가 재초기화해야 한다.
if (hcan.Instance->ESR & CAN_ESR_BOFF) { /* 복구 절차 */ }
Bus Off가 반복되면 배선 불량이나 종단 저항 문제를 의심한다.
자주 겪는 문제
아무 통신도 안 된다
→ 종단 저항 120Ω × 2 확인 (양 끝에만)
→ 보율이 모든 노드에서 동일한가
→ CAN_H/L 이 바뀌지 않았는가
→ 트랜시버 전원, STB/EN 핀 상태
간헐적 오류
→ 종단 저항, 배선 길이, 접지 차이
→ 샘플 포인트 설정 (보통 75~87.5%)
혼자서는 송신조차 안 된다 — ACK를 줄 노드가 최소 하나는 있어야 한다. 없으면 ACK 에러로 무한 재전송하다 Bus Off가 된다. 루프백 모드로 단독 테스트할 수 있다.
비트 타이밍
1 비트 = 동기 세그먼트 + 전파 세그먼트 + 위상 세그먼트1 + 위상 세그먼트2
- 샘플 포인트 = (Sync + Prop + Phase1) / 전체
- 보통 75~87.5% 지점에서 샘플링
모든 노드의 샘플 포인트가 비슷해야 안정적이다. 계산기가 온라인에 많고, 벤더 툴(STM32CubeMX)이 계산해 준다.