CAN 프로토콜은 1980년대 후반, 독일의 Robert Bosch 社에서 자동차 산업을 위해 개발되었다. 당시 차량에는 엔진 제어, 브레이크, 에어컨, 센서 등 다양한 전자 제어 장치들이 탑재되기 시작했으며, 이들 간의 안정적인 통신이 필수적이었다.
기존 방식처럼 유닛 간 point-to-point 통신을 구성하면 배선이 과도하게 복잡해지고, 유지보수나 확장성 측면에서 비효율적이었다. 게다가 자동차는 고속으로 이동하고 진동과 전자기 간섭이 많은 환경이기 때문에, Bluetooth, Wi-Fi, Zigbee 등 무선 기반의 통신 방식은 안정성을 담보하기 어려웠다. 왜냐하면 패킷 손실이나 지연이 발생할 경우, 차량 제어에 직접적인 악영향을 줄 수 있기 때문이다.
이를 해결하기 위해 CAN이 도입되었다. CAN은 multi-master 구조의 시리얼 통신 버스로, 하나의 버스 라인을 여러 제어 유닛이 공유하면서도 충돌 없이 통신할 수 있도록 설계되었다. ISO 표준으로 관리되며, 고속 통신(최대 1Mbit/sec), noise에 대한 높은 내성, 강력한 오류 검출 및 오류 억제(error confinement) 메커니즘을 갖추고 있다.

① Low Cost
② Extreme robustness
③ High Data Transmission Speeds(최대 1 MBit/sec)
④ Realibitliy, Excellent Error Handling and Error Confinement abilities
⑤ Automatic re-transmission of faulty messages
⑥ Automatic bus disconnection of nodes that are suspected to be physically faulty
⑦ Functional Addressing
※ identifier?
CAN 네트워크 내 nodes은 브로드캐스트 방식으로 동작한다. 즉, 어떤 CAN node가 메시지를 전송하면, 그 메시지는 네트워크 내 모든 nodes가 듣게 된다.
node마다 고유 주소가 있는 I2C와 달리, CAN에는 그러한 addressing이라는 개념이 존재하지 않는다. 대신, identifier을 사용하여 서로 다른 메시지를 구분하고, 여러 nodes가 버스를 동시에 사용하려고 할 때 우선순위를 결정하는 용도로 사용된다.
⑧ hot-pluggable

Node의 구성은 위와 같다. CAN Controller 또는 CAN peripheral이 포함되어 있는 마이크로컨트롤러가 있다. CAN Controller에서 2개의 Single-ended 디지털 핀을 출력으로 제공한다. 하나는 데이터 전송 목적인 CAN_TX, 다른 하나는 데이터 수신 목적인 CAN_RX이다.
CAN 사양 상, 이 디지털 신호를 그대로 사용하여 다른 Node와 통신할 수 없다. 대신에 차동 신호(Differential Signals)를 사용하는데, 이 신호는 마이크로컨트롤러 자체에서 만들어지지는 않는다.
이때 사용되는 것이 CAN Transceiver이다. 이것은 Digital Signals을 받아서 CANH(CAN High)와 CANL(CAN Low)라는 차동 신호로 변환한다.
※ 차동 신호?
Single-ended signal은 짧은 거리에서는 유효하지만, 자동차처럼 1 m, 2 m, 3 m, 심지어는 산업 환경에서 40 m 이상을 커버해야 하는 경우에는 부적합하다. 이러한 상황에서는 single-ended signal만으로 데이터를 안정적으로 송수신할 수 없다.
한편, 차동 신호는 noise에 더 강하고, 데이터를 훨씬 더 안정적으로 송수신할 수 있다. 그래서 single-ended signal을 차동 신호로 변환하여 Node 간 통신에 사용된다.

CAN 버스는 기본적으로 CANH 라인과 CANL 라인, 두 개의 라인으로 구성된다. 그리고 이 두 라인의 끝부분에 Termination Resistor(120 Ω)를 연결하여 마무리한다(신호 반사 방지 목적).

Single-ended Signal의 경우, 선이 HIGH을 지나면 수신기는 logic 1로 해석한다. 그리고 선이 GND()를 지나면 수신기는 logic 0으로 해석한다.
두 개의 complementary한 전압 신호를 사용하여 하나의 전송하는 Differential Signal의 경우, 신호 1과 신호 2를 각각 , 로 하여 두 신호의 전압 차 를 logic 1로 인식한다. 이때 외부 잡음이 두 신호에 똑같이 영향을 준다고 해도, 수신기는 두 신호의 차이만 보기 때문에 잡음이 자동으로 상쇄된다. 같은 원리로 logic 0을 인식하기 위해, 신호 1과 신호 2는 각각 와 여야 한다.
참고로 위 방식은 CAN에서뿐만 아니라, USB, RS-485, RS-232 같은 다양한 통신 시스템에서도 물리 계층으로 널리 사용된다.
앞에서 말했듯이, CAN Transceiver는 차동 신호인 CANH와 CANL을 만들어낸다.
그리고 이 두 신호는 서로 complementary한 관계에 있다.
Example)

① logic 1을 전송할 때
logic 1을 전송하고자 할 때, transceiver는 CANH 신호 를 약 정도로 유지한다. 그리고 이때 CANL 신호도 를 유지한다.
즉, 두 신호의 전압 차이가 가 되는데, 이 상태를 Recessive State라고 한다.
logic 1: Recessive State (CANH ≈ CANL)
② logic 0을 전송할 때
logic 0을 전송할 때는 CANH 신호가 약 가 되고, CANL 신호는 약 정도로 떨어진다. 이 경우 두 신호의 전압 차이는 약 정도로 나타난다.
이 상태는 Dominant State라고 한다.
logic 0: Dominant State (CANH > CANL)

Dominant State가 Recessive State보다 우선순위에서 앞선다. 그래서 만약 위의 예시처럼, 첫 번째 제어기와 두 번째 제어기가 동시에 각각 Dominant와 Recessive을 출력한다면, 0의 우선순위가 더 높기 때문에 Dominant에 해당하는 전압이 출력된다.
심지어, 세 번째와 네 번째 제어기까지 동시에 Recessive을 출력해도, 앞서 언급된 Dominant의 우선순위가 더 높기 때문에 그에 해당하는 전압이 출력된다.
<참고 자료>
Single ended signals Vs. Differential Signal, https://blog.naver.com/suya309/221467921826
CAN Bus signal, https://www.ti.com/document-viewer/lit/html/SSZTCN3
Kiran Nayak, Mastering Microcontroller: Timers, PWM, CAN, Low Power(MCU2), Udemy, 2025.05.
존버매니아, CAN통신 - 자동차 신입이 알아야 할 모든 것, 인프런