CAN에서 여러 노드가 동시에 전송을 시작했을 때 충돌 없이 우선순위를 가리는 방식 (bitwise arbitration, CSMA/CD+AMP).
원리 — 와이어드 AND
- Dominant(0) 가 Recessive(1) 를 이긴다
- 한 노드라도 0을 보내면 버스는 0
각 노드는 자기가 보낸 비트와 실제 버스 상태를 비교한다 1을 보냈는데 버스가 0이면 → "누가 나보다 우선순위가 높다" → 즉시 물러난다
동작 예
노드 A: ID 0x123 = 001 0010 0011 노드 B: ID 0x456 = 100 0101 0110
비트: 1 2 3 ...
A 송신: 0 0 1
B 송신: 1 ← 여기서 B는 1을 보냈는데 버스는 0(A 때문에)
→ B가 즉시 송신을 중단하고 수신 모드로 전환
A는 자기 비트와 버스가 일치하므로 계속 전송 → 그대로 완주
A는 자기가 경쟁했다는 사실조차 모른다. 중단 없이 그대로 보낸다.
왜 뛰어난가 — 비파괴적 중재
이더넷의 CSMA/CD 충돌 감지 → 양쪽 다 중단 → 무작위 시간 대기 → 재시도
- 대역폭 낭비, 지연이 확률적
CAN의 비트 아비트레이션 충돌 자체가 없다. 승자는 그대로 완주
- 낭비 0, 지연이 결정적
"충돌을 해결하는 것이 아니라 애초에 발생하지 않게 한다." 이것이 CAN이 실시간 제어에 쓰이는 핵심 이유다.
ID가 곧 우선순위
ID 값이 작을수록 우선순위가 높다
- 0x000 = 최고 우선순위 (앞자리가 0이 많다 = dominant가 많다)
- 0x7FF = 최저 우선순위
차량에서의 ID 할당 예
-
0x000~0x0FF : 엔진·브레이크 등 안전 관련 — (최우선) 0x100~0x2FF : 파워트레인 제어 0x300~0x5FF : 편의 장치
-
0x600~0x7FF : 진단·정보 — (최하위)
ID 설계가 곧 실시간 설계다. 나중에 바꾸기 어려우므로 시스템 설계 초기에 우선순위 체계를 확정해야 한다.
전제 조건 — 물리적 제약
아비트레이션이 성립하려면 한 비트 시간 안에 신호가 버스 양 끝을 왕복해야 한다.
- 모든 노드가 같은 비트를 동시에 보고 판단해야 하기 때문
- 전파 지연 × 2 < 비트 시간
- 이것이 "속도 × 거리가 일정"한 이유
1Mbps에서 1비트 = 1μs이고, 신호는 약 5ns/m로 전파되므로 왕복 40m가 대략 한계다.
문제 ① — 우선순위 기아
높은 우선순위 메시지가 계속 나오면 낮은 우선순위 메시지는 영영 전송되지 못할 수 있다
대응
- 버스 부하율을 30~50% 이하로 유지 (안전 관련은 30% 이하)
- 주기적 메시지의 전송 주기를 분산 (동시 발생 방지)
- 최악 응답 시간 분석(WCRT)으로 검증
버스 부하 계산이 CAN 시스템 설계의 핵심 작업이다.
문제 ② — 같은 ID를 두 노드가 쓰면
- 같은 ID로 서로 다른 데이터를 동시에 보내면
- 아비트레이션 구간을 통과한 뒤 데이터 구간에서 비트가 어긋난다
- 비트 모니터링 오류 → 에러 프레임 → 재전송 → 또 충돌
- 무한 반복 → 두 노드 모두 Bus Off
ID는 시스템 전체에서 유일해야 한다. CAN 네트워크 설계 문서(DBC 파일)로 관리하는 이유다.
RTR과 원격 프레임
RTR 비트 = 1 → "이 ID의 데이터를 보내 주세요" 라는 요청 데이터 프레임(RTR=0)이 원격 프레임(RTR=1)보다 우선한다. 같은 ID면 데이터를 가진 쪽이 이긴다. 요즘은 잘 쓰지 않는 기능이다.
CAN FD에서
아비트레이션 구간 : 기존 속도 (예: 500kbps) — 중재를 위해 느려야 한다
- 데이터 구간 — : 고속 전환 (예: 2~8Mbps) — 승자가 정해졌으니 빨라도 된다
중재가 끝난 뒤에는 경쟁이 없으므로 속도를 올릴 수 있다는 발상이다. CAN FD의 핵심 아이디어이며, 아비트레이션 원리를 이해해야 납득된다.