CAN은 여러 ECU가 하나의 매체를 공유하는 멀티마스터 버스이므로, 둘 이상의 노드가 동시에 송신을 시작하면 버스 접근이 충돌한다. CAN은 이 충돌을 재전송이 필요한 파괴적 충돌로 다루는 대신, 프레임의 식별자(identifier) 필드를 비트 단위로 비교해 가장 우선순위가 높은 노드만 남기는 중재(arbitration)로 해소한다[1].

중재가 시작되는 조건

노드는 버스가 유휴(idle) 상태일 때만 새 프레임의 송신을 시작할 수 있다. 프레임 끝의 ACK 구분자(1비트)·EOF(7비트)·Intermission(3비트)이 모두 recessive로 전송되므로, 마지막 dominant 비트 이후 연속된 recessive 비트 11개가 지나야 버스가 유휴로 판정되고 새 전송이 허용된다[1].

두 노드의 송신 요청이 서로 다른 시점에 도착한 경우, 먼저 시작한 노드의 식별자 비트가 이미 버스에 실리고 있다면 나중에 도착한 요청은 우선순위와 무관하게 버스가 다시 유휴 상태가 될 때까지 기다려야 한다. 즉 식별자 기반 중재는 둘 이상의 노드가 같은 유휴 구간에서 동시에 송신을 시작했을 때만 일어난다[1].

비트 단위 중재 메커니즘

동시에 송신을 시작한 노드들은 식별자 비트를 한 개씩 내보내면서, 동시에 버스에 실제로 나타난 값을 읽어 자신이 보낸 값과 비교한다[2]. CAN 버스는 두 논리 레벨을 와이어드-AND로 결합한다 — dominant(논리 0)와 recessive(논리 1)이며, 어느 한 노드라도 dominant를 실으면 recessive를 실은 다른 노드를 덮어쓴다[1].

어떤 노드가 recessive 비트를 보냈는데 버스에서 dominant가 관측되면, 그 노드는 중재에서 진 것이므로 그 즉시(추가 비트를 내보내지 않고) 송신을 멈추고 수신 모드로 전환한다[1]. 진 노드는 버스가 다시 유휴 상태가 되면 같은 메시지의 송신을 재시도한다[2].

이 과정에서 이긴 노드는 다른 노드가 있었다는 사실조차 알아채지 못하며, 지연이나 데이터 손실 없이 전송을 계속한다. 그래서 이 방식을 무손실(lossless)·비파괴적(non-destructive) 중재라 부른다[1].

아래는 세 노드가 동시에 송신을 시작했을 때의 예시다. 식별자를 한 비트씩 비교하다가 recessive를 보냈지만 버스에서 dominant가 관측되는 시점에 해당 노드가 탈락한다.

Node A (01101) Node B (01011) Node C (01010) Bus 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 A 탈락 B 탈락

식별자와 우선순위

식별자의 수치 값이 낮을수록 프레임의 우선순위가 높다. 표준(11비트) 식별자 형식에서는 0(0x000)이 가장 높은 우선순위를, 2047(0x7FF)이 가장 낮은 우선순위를 갖는다. 식별자 상위 비트가 0(dominant)일수록 버스를 더 오래 dominant로 점유하므로, 식별자가 전부 0인 프레임은 항상 다른 모든 프레임에 우선한다[2].

CAN은 이 중재 메커니즘 덕분에 별도의 중앙 조정자 없이도 결정론적으로 우선순위 높은 메시지를 지연 없이 전송할 수 있다.

참고문헌

[1]
Robert Bosch GmbH, “CAN Specification, Version 2.0”, 1991.
[2]
S. Corrigan, “SLOA101B — Introduction to the Controller Area Network (CAN)”, 2016.