3.25. CAN 버스 기초

CAN(Controller Area Network)은 자동차의 모든 전자 제어 장치를 하나의 짧은 공유 버스로 연결하기 위해 1980년대에 Bosch가 처음 설계했습니다. 지금도 자동차 와이어 하네스를 장악하고 있지만, 동일한 견고성, 실시간 동작 특성, 멀티 마스터 설계 덕분에 자동화, 로보틱스, 농업 및 온갖 종류의 산업 장비에서 기본 필드 버스로 자리 잡았습니다.

CAN은 SPI나 I2C처럼 단일 “컨트롤러”와 일련의 “주변장치”를 두는 방식이 아닙니다. 버스의 모든 노드는 동등한 피어이며, 어떤 노드든 버스가 유휴 상태일 때마다 송신할 수 있습니다. 이를 확장 가능하게 만드는 것은 버스의 중재 기반 브로드캐스트(broadcast-with-arbitration) 설계입니다.

3.25.1. 우선순위 중재가 있는 브로드캐스트

CAN 버스의 모든 메시지는 식별자(identifier)를 가지며, 기존 표준 프레임에서는 11비트, 확장 변형에서는 29비트입니다. 이 식별자는 주소가 아니라 메시지가 무엇에 관한 것인지를 나타냅니다(엔진 RPM, 브레이크 페달 위치, 배터리 전압 등). 노드가 어떤 값을 보내려고 할 때는 해당하는 식별자를 태그로 붙여 브로드캐스트하며, 버스에 연결된 모든 노드가 그 브로드캐스트를 봅니다. 각 수신기는 하드웨어에서 버스를 필터링하여 자신이 관심 있는 ID만 골라냅니다.

두 노드가 동시에 송신하려고 하면, 버스의 전기적 설계 덕분에 숫자상 더 낮은 식별자를 가진 메시지가 단 하나의 비트도 잃지 않고 승리합니다.

핵심은 버스의 두 가지 전기적 상태입니다: 우세(dominant)(논리적으로 0)와 열세(recessive)(논리적으로 1). CAN 배선은 아무 노드도 통신하지 않을 때 종단 저항에 의해 하이(열세) 상태로 유지됩니다. 어떤 노드든 트랜시버를 통해 전류를 흘려 배선을 로우(우세)로 끌어내릴 수 있습니다. 그 결과는 와이어드 AND(wired-AND)입니다. 즉 단 하나의 노드라도 버스를 우세로 구동하면 라인은 우세로 읽히고, 모든 노드가 해제했을 때에만 열세로 읽힙니다. 우세가 항상 승리합니다. (일부 자료에서는 “우세”를 열세 비트의 AND가 아니라 어서트된 신호로 보고 동일한 구성을 와이어드 OR(wired-OR)라고 부르기도 합니다. 어느 쪽이든 물리적 동작은 동일합니다.)

종단 저항으로 Vcc에 의해 하이로 유지되는 단일 버스 라인. 세 개의 노드(A, B, C)가 버스에 매달려 있습니다. 각 노드의 출력단은 접지로 향하는 스위치와 직렬로 연결된 다이오드입니다. 다이오드는 버스에서 스위치 쪽으로 향하므로, 스위치를 닫으면 다이오드를 통해 버스를 로우로 끌어내리지만 어떤 노드도 버스를 하이로 구동할 수는 없습니다.

개념 형태로 표현한 와이어드 AND. 실제 CAN은 동일한 로직을 차동 쌍(CAN_H / CAN_L) 위에서 실행하며, 트랜시버와 종단 저항이 두 배선에 나뉘어 배치됩니다. 그러나 버스에서의 규칙은 동일합니다. 어떤 노드든 우세로 끌어내릴 수 있고, 모든 노드가 해제했을 때에만 열세로 읽힙니다.

중재는 이 비대칭성을 직접 활용합니다. 송신하는 모든 노드는 자신의 ID를 한 번에 한 비트씩 MSB부터 보내면서, 송신하는 동안 버스를 관찰합니다. 열세 비트를 배선에 올렸는데 우세로 되읽히는 노드는, 동일한 순간에 더 낮은 ID를 가진 다른 노드가 송신 중이며 그 비트 위치를 이긴 것임을 압니다. 이 노드는 즉시 버스 구동을 멈추고 듣기 모드로 전환합니다. 한편 승리한 노드는 자신의 비트가 변경 없이 나가는 것을 보므로, 그 관점에서는 특이한 일이 전혀 일어나지 않은 셈입니다. 숫자가 낮은 ID가 승리하는 이유는, 그 우세 비트가 같은 위치에서 숫자가 높은 ID가 보냈을 열세 비트를 덮어쓰기 때문입니다.

패배한 노드는 그런 다음 버스가 유휴 상태가 되기를 기다렸다가 자동으로 재시도합니다. 충돌도, 손실 메시지도 없으며 오직 결정론적인 우선순위 순서만 존재합니다.

이것이 바로 CAN을 대규모로 동작하게 만드는 발행/구독(publish/subscribe) 방식입니다. 누구나 말할 수 있고 누구나 들을 수 있으며, ID가 디스패치를 암묵적으로 처리합니다.

3.25.2. 물리적 버스

MCU의 CAN 컨트롤러는 버스를 직접 구동하지 않습니다. 컨트롤러는 두 개의 3.3 V CMOS 핀만 노출합니다. 즉 TX(보내려는 비트)와 RX(버스에서 보이는 비트)이며, 이 핀들은 CAN 트랜시버(transceiver) 또는 PHY라고 불리는 별도의 칩으로 연결됩니다. 트랜시버는 컨트롤러와 실제 CAN 배선 사이에 위치하며, 버스와 통신하는 방법을 아는 부분입니다.

버스 자체는 5 V 차동 쌍입니다:

  • CAN_H – 쌍에서 “하이” 배선.

  • CAN_L – “로우” 배선.

열세 상태에서는 두 배선 모두 대략 2.5 V(버스의 5 V 전원 중간점)에 위치합니다. 우세 상태에서는 트랜시버가 CAN_H를 약 3.5 V로 끌어올리고 CAN_L을 약 1.5 V로 끌어내려, 쌍 양단에 약 2 V의 차동 전압을 만듭니다. 수신기는 두 배선 간의 차이를 샘플링하므로, 긴 케이블 구간에서 유입되는 공통 모드 노이즈에 신호가 영향을 받지 않습니다.

트랜시버의 양방향 역할:

  • TX 측에서는 컨트롤러의 3.3 V 단일 종단 TX 핀을 읽어, 우세를 위해 CAN_H와 CAN_L을 벌리거나 열세를 위해 둘 다 해제합니다.

  • RX 측에서는 차동 CAN_H / CAN_L 쌍을 읽어, RX 핀에서 단일 종단 3.3 V 레벨을 컨트롤러로 다시 보고합니다.

두 개의 120옴 종단 저항은 케이블의 각 물리적 끝에 하나씩 위치하며, 아무 노드도 구동하지 않을 때 버스를 열세 중간점으로 유지하고, 긴 구간에서 차동 신호를 손상시킬 수 있는 반사를 감쇠시킵니다.

3.25.3. 데이터 프레임

표준 CAN 데이터 프레임은 배선 상에서 다음과 같이 보입니다:

여덟 개의 필드가 순서대로 그려져 있습니다: SOF(1비트), ID(11비트), RTR(1비트), 제어(6비트), 데이터 (0 -- 8바이트), CRC(16비트), ACK(2비트), EOF(7비트).

표준 CAN 데이터 프레임: SOF, ID, RTR, 제어, 데이터, CRC, ACK, EOF 필드.

각 필드는 특정 역할을 합니다:

  • SOF (start of frame). 새 프레임이 시작됨을 알리고 모든 노드의 비트 클록을 동기화하는 하나의 dominant 비트입니다.

  • ID (identifier). 버스가 중재(arbitration)에 사용하는 11비트 식별자입니다. 숫자가 작을수록 우선순위가 높습니다.

  • RTR (remote transmission request). 데이터의 전달이 아니라 데이터에 대한 요청일 때 설정됩니다. 일치하는 ID를 가진 수신기가 직접 데이터를 보내 응답합니다.

  • 제어(Control). 데이터 길이(DLC)와 몇 가지 관리용 비트를 인코딩하는 6비트 필드입니다.

  • 데이터(Data). 0에서 8바이트의 페이로드(CAN Classic. CAN FD는 이를 64바이트로 확장).

  • CRC. 총 16비트: 앞선 필드들에 대한 15비트 CRC와 1비트 CRC 구분자입니다.

  • ACK. 총 2비트. 첫 번째 비트인 ACK 슬롯에서 송신기가 라인을 해제하면, 프레임을 정확히 수신한 노드가 라인을 로우로 끌어내립니다. 두 번째 비트는 열세 구분자입니다. ACK가 없다는 것은 어떤 노드도 프레임을 듣지 못했으므로 다시 시도해야 함을 송신기에 알려줍니다.

  • EOF (end of frame). 프레임을 닫는 7개의 recessive 비트입니다.

이 모든 것은 CAN 컨트롤러가 하드웨어에서 생성하고 디코딩합니다. 소프트웨어는 ID, 데이터, 그리고 몇 개의 플래그만 봅니다.

3.25.4. CAN의 위치

CAN의 설계 선택이 그 영역을 결정합니다:

  • 견고함. 꼬임쌍(twisted pair)의 차동 신호, 내장 오류 검출, 결정론적 우선순위 중재, 자동 재시도 덕분에 CAN은 UART나 SPI라면 데이터가 손상될 전기적으로 시끄러운 환경에서도 살아남습니다.

  • 멀티 마스터. 어떤 노드든 언제든 통신할 수 있습니다. 중앙 컨트롤러가 필요 없고 어떤 노드도 단일 장애점이 되지 않습니다.

  • 대역폭 제한. 고전적 CAN은 약 1 Mbit/s에서 최대치에 도달합니다. CAN FD는 이를 확장합니다. CAN은 링크가 보드나 모듈 사이에 있고, 종종 수 미터의 케이블에 걸쳐 있으며, 신뢰성이 최우선일 때 적합한 답입니다.

  • 상위 계층 프로토콜. 맨 CAN 버스 자체는 ID가 무엇을 의미하는지, 긴 메시지를 어떻게 조각으로 나누는지 정하지 않습니다. CANopen, J1939, ISO-TP/UDS, NMEA 2000 같은 애플리케이션 계층 프로토콜이 그러한 규칙을 그 위에 얹습니다. 알아둘 만한 별개의 항목으로 DBC 파일이 있습니다. 이는 특정 차량이나 시스템에서 어떤 ID가 어떤 비트 레벨 신호를 담는지 기록하는 벤더별 텍스트 형식입니다. DBC 파일은 한 버스의 메시지 레이아웃을 설명하는 메타데이터 형식이며, 그 자체로 프로토콜은 아닙니다.

코드로 보는 CAN 버스의 드라이버는 배선 레벨의 CAN 프레임을 처리합니다. ID를 의미에 매핑하는 것은 애플리케이션의 몫입니다.