Bus Access에서 다룬 이벤트 구동 방식에서, CAN 프레임은 End of Frame(7비트)과 Intermission(3비트)까지 총 10비트의 recessive 구간으로 끝나고 그다음 비트부터 버스가 유휴(bus idle) 상태로 간주된다. 유휴 구간의 길이는 정해져 있지 않으며, 전송할 메시지가 있는 노드는 이 구간 동안 언제든 곧바로 버스에 접근할 수 있다. 반대로 다른 노드가 이미 전송을 시작해 버스가 점유된 뒤, 즉 첫 식별자 비트가 이미 실린 뒤에 도착한 요청은 그 메시지의 우선순위와 무관하게 버스가 다시 유휴 상태가 될 때까지 기다려야 한다. 전송 시작은 단일 dominant 비트인 Start of Frame(SOF)으로 표시되어, recessive로 유지되는 유휴 상태와 구별된다[1].

와이어드-AND 비교

유휴 상태에서 둘 이상의 노드가 동시에 SOF를 실어 식별자 전송을 시작하면, 각 노드는 자신이 내보낸 비트값과 버스에서 되읽은 값을 매 비트 비교한다. CAN 버스는 배선상 wired-AND로 동작해 dominant(0)를 보내는 노드가 하나라도 있으면 버스 값은 dominant가 된다. 두 값이 같으면 노드는 송신을 계속하고, recessive(1)를 보냈는데 버스에서 dominant(0)가 읽히면 그 노드는 중재에서 패배한 것이므로 그 즉시 — 추가 비트를 더 보내지 않고 — 송신을 멈추고 수신 모드로 전환하며, 버스가 다시 유휴 상태가 되면 재전송을 시도한다[1][2].

Node A 1 0 1 패배, 수신 모드로 전환 Node B 1 0 0 1 0 1 계속 전송(승자) Bus 1 0 0 1 0 1 3번째 비트에서 중재 결정: A는 recessive(1)를 보냈지만 버스는 B가 보낸 dominant(0)를 반영한다.

중재 범위와 우선순위

이 비교는 식별자(Standard Format 기준 11비트 — 29비트로 확장하는 형식은 Extended CAN Identifier 참고)뿐 아니라 그 뒤에 이어지는 RTR 비트까지 포함하는 Arbitration Field 전체에 걸쳐 이뤄지며, 그 덕분에 같은 식별자를 쓰는 Data Frame(RTR=dominant)과 Remote Frame(RTR=recessive)이 동시에 전송되더라도 Data Frame이 우선한다[1]. 메시지 우선순위는 식별자의 수치값에 반비례해, 값이 작을수록 우선순위가 높다 — 모든 비트가 0인 식별자가 버스를 가장 오래 dominant로 유지하므로 네트워크에서 가장 높은 우선순위를 갖는다[2]. 표준 11비트 식별자 필드에서 이 값은 0(0x000)부터 2047(0x7FF)까지 분포한다.

패배한 노드는 이미 보낸 비트를 무를 필요가 없고, 승자는 다른 노드가 동시에 전송을 시도했다는 사실조차 알아채지 못한 채 메시지를 이어간다 — 이 과정에서 정보도 시간도 유실되지 않는다[1][2]. Bus Access에서 다룬 CSMA/CA와 혼동하기 쉬운 지점이 바로 여기다: CSMA/CA는 충돌을 사전에 피하려 대기하지만, CAN의 비트단위 중재는 충돌이 실제로 일어난 뒤 그 자리에서 손실 없이 해소한다.

최대 8바이트로 제한된 payload와 맞물려, 중재를 포함한 프레임 하나가 버스를 점유하는 시간은 비교적 짧다[1].

참고문헌

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