arbitration. 충돌을 감지해 재전송하는 것이 아니라, 애초에 지지 않는 쪽만 계속 보낸다.
어떻게 가능한가
CAN 버스는 한쪽이 우세하다.
0 = dominant (우세) 누군가 0을 내면 버스는 0이 된다
1 = recessive (열세) 모두가 1을 내야 버스가 1이 된다
각 노드는 자기가 낸 비트와 버스에 실제로 나타난 비트를 비교한다.
노드 A: ID 0x100 → ... 1 ...
노드 B: ID 0x0F0 → ... 0 ...
버스 : 0 (0이 이긴다)
A 는 자기가 1을 냈는데 0이 보이므로 "졌다" 를 알고 즉시 송신을 멈춘다
B 는 그대로 이어서 프레임을 끝까지 보낸다
결과
- 데이터가 손상되지 않는다. 진 쪽은 프레임을 망치지 않고 물러난다
- ID 가 곧 우선순위다. 작은 ID 가 급한 메시지다
- 진 노드는 버스가 비면 자동으로 재시도한다
이 성질 덕분에 CAN 은 최악 지연을 계산할 수 있다 — 안전 관련 통신에 쓰이는 근거다.