02. CAN의 버스 접근 방법
CAN Bus Access
CAN은 공용의 선인 버스를 이용하여 통신하는 버스 네트워킹 방식을 사용합니다.
CAN 통신은 하나의 버스를 여러 개의 노드(제어기)가 공유하기 때문에 버스에 접근하는 규칙이 필요합니다. 2개 이상의 제어기가 버스를 이용하여 메시지를 보내려할 때 어떤 메시지를 전송할지 결정되어야 합니다.
CAN Bus Access Rules
먼저, 버스를 이용하여 메시지를 보내려는 노드는 버스가 사용중인지 확입합니다. 그리고 버스가 사용중이지 않은 IDLE 상태가 될 때까지 기다립니다. IDLE 상태 여부는 버스에 11 bit 연속으로 1이 나왔는지로 판단할 수 있습니다. 버스에 11bit 연속으로 1(Recessive bit)이 나오면 아무도 버스를 사용하지 않고 있는 IDLE 상태입니다.
네트워크의 노드는 버스가 IDLE 상태면 데이터 전송을 시작합니다. 이때 네트워크의 다른 노드도 메시지를 보내려 했다면 메시지 중 하나를 선택하는 과정이 필요합니다. CAN 통신에서 버스 접근은 우선순위에 의해 결정됩니다. 우선순위는 메시지의 ID가 작을 수록 높습니다.
그림과 같이 Node A, Node B, Node C가 동시에 메시지를 보내려고 하면 메시지의 ID가 0x1로 가장 낮은 Node A의 메시지가 전송됩니다. Node B와 Node C의 메시지는 Node A의 메시지가 다 전송되고 다시 버스가 IDLE 상태가 되기 까지 기다리고 버스가 IDLE 상태가 되면 다시 전송을 시도합니다. 이때는 우선순위가 높은 Node B의 메시지가 보내지고 Node C는 다시 버스가 IDLE 상태가 될 때 까지 기다리고 이후 IDLE 상태가 되면 데이터를 전송합니다.
Arbitration bit by bit
앞서 CAN 통신에서는 메시지의 ID가 낮을수록 우선순위가 높다고 설명드렸습니다. 이번 장에서는 어떤 과정을 통해 ID가 낮은 메시지가 버스를 점유하는지 말씀드리겠습니다.
CAN 통신은 직렬 통신 방식을 사용하여 메시지를 순차적으로 1 bit 씩 전송합니다. 여러 노드가 동시에 메시지를 보내는 경우에도 1 bit 씩 차례로 전송합니다.
각 노드가 동시에 보내려는 bit가 모두 0이면 버스에도 0이 반영됩니다. 동시에 보내려는 bit가 모두 1이면 1이 버스에 반영됩니다. 만약에 동시에 보내려는 bit가 0과 1이 함께있다면? 이때는 버스에 0이 반영됩니다. CAN 통신에서 0을 dominant(우성) bit이라 부르고 1을 recessive(열성)이라고 부르는 것도 이러한 이유에서 입니다. 우성 bit 0과 열성 bit 1을 동시에 보내려하면 0이 보내지게 됩니다.
메시지의 ID가 낮다는 건 메시지 ID 앞쪽에 0이 더 많다는 말이기도 합니다. 따라서 ID가 낮은 메시지가 1bit 씩 보내다 보면 결국 버스를 차지하게 됩니다.
노드는 자신이 보낸 bit가 버스에 잘 반영됐는지 확인합니다. 자신이 보낸 bit가 반영되지 안은 경우에는 보내는 걸 멈춥니다. 즉, 우선순위가 높은 메시지에 의해 보내지고 있다는 걸 알게되면 전송을 멈추게 됩니다.
아래 예시는 arbitration 예시입니다. Node 15와 Node 16이 동시에 메시지를 보내려고 합니다. 각 노드는 메시지를 순차적으로 보내고 ID bits의 4번 째 값에서 값이 달라지게 됩니다. Node 15는 0을, Node 16은 1을 보내려 하였고 CAN data는 dominat bit인 0이 반영됐습니다.
Node16은 자신이 보내려는 bit가 버스에 CAN data에 반영이 안된 것을 보고 전송을 멈춥니다. 그리고 우선순위가 높은 Node 15는 메시지를 계속 보냅니다. 따라서 CAN 메시지는 ID bits 왼쪽에 0이 많은 메시지가 우선순위가 높습니다. 즉, ID가 작을 수록 우선순위가 높은셈입니다.
Bus Acess 예시
다음은 4개의 노드가 동시에 메시지를 보내는 상황에 대한 예시입니다. 네모 칸은 메시지를 나타내고 메시지의 왼쪽에 적혀있는 숫자는 ID를 나타냅니다.
제일 처음 Node A가 ID 5인 메시지를 보내는 시점엔 다른 노드들은 메시지를 전송하려 하지 않으므로 그래도 ID 5인 메시지가 버스에 접근합니다. ID 5인 메시지 전송이 끝났을 때 ID 3, 7, 6인 메시지를 전송하려고 하고 이중 ID가 가장낮은 ID 3인 메시지가 버스로 전송됩니다. ID 3인 전송 끝났을 때는 ID 4, 7, 6이 arbitration을 통해 ID 4인 메시지가 전송됩니다. ID 4가 전송이 완료되면 ID 5, 7, 6 중 ID 5인 메시지가 보내지고 이후 ID 6과 ID 7이 전송됩니다.
위의 예시에서 보듯 CAN은 타임 크리티컬 하지 않습니다. Node C의 메시지는 메시지를 전송하고자 하는 이벤트 발생 후 한참 후에나 보낼 수 있었습니다. 이러한 문제를 해결하기 위해 CAN은 우선순위를 바꾸거나 네트워크를 분리하거나 최신 데이터를 보내는 방법 등을 사용합니다.