CAN 통신이란?
CAN 통신(Controller Area Network)은 여러 ECU 장치들이 마스터(중앙 제어 Host) 없이 서로 통신하기 위해서 설계된 메시지 기반의 표준 통신 규격이다. = Non-Host 버스 방식의 메시지 기반 프로토콜
ㅤ
이름이 Controller Area Network 인 이유는 ECU Controller 끼리 통신하도록 구성된 네트워크이기 때문임.
ㅤ
자동차 산업에서 CAN을 쓰는 이유?
자동차 산업이 발전함에 따라서 ECU(Electronic Control Unit)들이 점점 많이 탑재되고있다. 센서 처리나 엔진, 변속기, 차제 제어 등에 사용되는 ECU들간에 서로 데이터나 신호를 주고받기 위해서 통신을 위해서 서로 연결하다보니 배선이 복잡해지고 케이블의 무게와 부피로 차량의 연비가 떨어지는 문제들이 점점 발생했다.

이를 보완하기 위해서 시리얼 통신 등을 이용하려고 했으나, 노이즈가 발생하기 쉬운 자동차 환경의 안정성 측면에서 문제가 되어 개선이 필요했다.
ㅤ
그래서 직접 ECU 끼리 서로 연결하는 방식보다 부피도 덜 차지하고 안정성도 좋은 CAN 네트워크를 많이 사용한다. 왜 안정성이 좋은지에 대해서는 아래에서 소개한다!

ㅤ
꼭 자동차 뿐만 아니라, 안정성이 필요한 산업 분야에서는 CAN 통신을 많이 사용하고 있다.
ㅤ
CAN의 특징
- 최대 1Mbps 의 속도로 데이터를 전송할 수 있다
- 장거리 통신 (1km 거리를 40Kbps로 통신 가능)
- 멀티 마스터 방식의 버스 방식 → 네트워크 구성에 유연하다
- (모든 노드가 동등함 - 마스터 슬레이브 구조가 아님)
- 차동 신호를 사용해서 노이즈에 강하다.
- 메시지 우선 순위를 지정해서 노드 간의 통신을 중재할 수 있다.
- RS485와 CAN은 유사하지만, 통신 중재가 가능하다는 점에서 CAN이 안정성이 더 높다.
- 근데 이것은 RS485는 물리적인 연결 / CAN은 프로토콜까지 포함되어 있어서 그런거 아닌가? 라는 나의 생각. 물론 개발자 입장에서는 따로 추가적인 고민을 안해도 되는 CAN이 좋긴 한 듯.
- ID 필터링을 활용해서 멀티캐스트 통신이 가능하다
- 에러 처리를 잘한다!
ㅤ
CAN의 OSI 계층
CAN 도 어찌되었든 네트워크 통신 규격 중 하나이기 때문에, CAN이 OSI Reference Model 에서 몇 번째 계층에 속하는지 한 번 알아보자.
ㅤ
CAN은 1계층과 2계층에서의 통신 규격을 정의하고있다.

여기에서 LLC, MAC, PCS는 CAN Controller가 담당하며 PMA는 CAN Transceiver가 담당한다. 컨트롤러와 트랜시버에 대해서는 바로 아래 HW 구조에서 한 번 더 다룬다. 여기에서는 컨트롤러와 트랜시버가 포함하는 각각의 요소들이 어떤 역할을 하는 계층인지만 한 번 살펴보자.
- Logic Link Control : 네트워크 계층과 데이터 링크 계층의 인터페이스. IP 주소 → MAC 주소 변환이나 필터링 등의 역할을 수행한다.
- Media Access Control : 데이터 패킷의 캡슐화와 복원. 에러 검출, 직렬화와 역직렬화 등 2계층 통신에 대해서 담당한다.
- Physical Coding Sub-layer : Bit 암호화, 복호화, 동기화(syncronization)을 담당한다.
- Physical Media Attatchment : 송수신매체의 특성에 맞게 변환을 수행한다.
ㅤ
ㅤ
여기에서 1~2계층에 대해 정의하는 CAN이 Standard CAN 이고, 상위 계층에 대해 규정하는 다양한 CAN Extension들이 있다. DeviceNET, SDS, CAL, CANOpen 등의 프로토콜들이 있는데, 얘네들은 Standard CAN 을 기반으로 해서 상위 계층들에 대해 정의하는 프로토콜이다. 그치만 표준 CAN 은 1, 2계층에 대해서만 이야기하는 것이니 헷갈리지 말자!
ㅤ
CAN 통신의 HW 구조
CAN HW의 핵심 구성
CAN 컨트롤러는 두뇌 역할을 하는 하드웨어이다. CAN 버스에 올라갈 메시지를 만들고 에러를 체크하거나 메시지를 보낼 타이밍을 결정한다. 위 OSI 그림에서 2계층의 LLC와 MAC, 1계층의 PCS 의 역할을 수행한다고 보면 된다. ISO 11898-1 표준이 CAN Controller에 대한 표준을 정의하고 있다.
ㅤ
CAN 트랜시버는 CAN 컨트롤러가 보내는 디지털 신호(0, 1)를 실제 버스 위에서의 전압 차이로 변환해주거나, 전압 차이를 다시 디지털 신호로 변환해주는 역할을 한다. OSI에서 1계층의 PMA 의 역할을 트랜시버가 맡는다. 트랜시버에는 여러가지 사양이 있는데 고속 통신 트랜시버(ISO 11898-2)를 붙이면 고속 CAN 통신이 가능해지고, 저속 통신 트랜시버(ISO 11898-3)을 붙이면 저속 통신이 가능하다.
ㅤ
종단 저항은 끝단에 닿은 전압 신호가 반사되어 돌아오면서 신호에 노이즈를 넣어버리는 것을 막기 위해서 버스의 종단에 배치하는 저항이다. 얘는 시스템에 따라서 다르지만, 대략 120$\Omega$ 을 사용한다고 한다.
ㅤ
위키를 찾아보니, 처음에 CAN 통신에 대한 공식적인 정의에서는 단순히 데이터 링크 계층(2계층)에서의 CAN 에 대해서망 정해두었었고 (이게 ISO 11898-1), 그 다음에 물리 계층(1계층)에 대한 논의가 진행되면서 전압, 전류 등에 대해서 결정(ISO 11898-2, 3)되었다. 근데 아직 CAN 통신을 위한 커넥터의 규격은 정해지지 않은 상태라서 제조사마다 다른 규격의 커넥터를 사용하고 있다고 한다. ㅤ
ㅤ
위 그림에서 Controller와 Transceiver가 결합되어서 CAN BUS와 연결되는 방식은 아래 그림과 같다.

ㅤ
여러 개의 ECU가 연결된 CAN Bus는 대략적으로 아래처럼 그려진다.

ㅤ
저속 CAN vs 고속 CAN
그런데, 또 공부를 하다보니 ISO 11898-2에서 정의하는 고속 CAN과 ISO 11898-3에서 정의하는 저속 CAN 의 전압 제어 방식이 다르다. 이에 대해 한 번 알아보자.
ㅤ
CAN Controller는 데이터를 어떻게 만들고(프레임 구성), 언제 보낼지(중재), 에러가 났을 때 어떻게 할지(에러 처리)와 같은 '논리적인 규칙'을 담당하기 때문에 데이터를 어떻게 보낼지에 대해서는 관여하지 않는다. 그래서 CAN 통신의 속도는 Transceiver가 결정한다.
ㅤ
고속 CAN
먼저 고속 CAN (ISO 11898-2) 방식부터 알아보자. 고속 CAN의 특징은 다음과 같다.
- 최대 1Mbps의 속도로 통신할 수 있다. (최고속도가 저속 CAN에 비해 8배 빠름)
- 고속으로 통신하는 경우 40m 까지 연결 가능하다.
- 네트워크의 형태(topology)는 일직선의 BUS 형태로 연결되어야 한다.
- 고속 CAN은 속도를 위해 '결함 허용(Fault-Tolerant)'을 포기했다!!!
ㅤ
고속 CAN의 토폴로지, 버스 형태

여기에서 첫 번째, 네트워크 토폴로지가 왜 무조건 BUS 형태가 되어야 하는가가 궁금했다. 애초에 버스 말고 다른 형태도 가능했다고? 라는 생각이 들었는데, 저속 CAN에서는 가능하다고 하더라.
ㅤ
고속 통신 환경에서는 노이즈로부터 견디는 것보다, 노이즈를 만들지 않는 것이 더 중요하다.
여기에 대해서 내가 이해한 바는, 저속 환경일 때는 내가 만든 일시적인 노이즈는 다음 신호가 전달되기 전까지 사라지는 환경일 가능성이 높다. 예를 들어서, ‘A’ 전송 → A로 인한 노이즈 발생 → A 노이즈가 풍화침식되어 사라짐 → ‘B’ 전송 →… 이 될 수 있는데, 고속 환경에서는 ‘A’ 전송 → 노이즈 발생 → 사라지기 전에 ‘B’ 전송 → 신호와 노이즈가 충돌! 이 될 수 있기 때문이라고 이해했다.
ㅤ
만약 네트워크에 갈림길이나 꺾인 길이 많다면 해당 위치에서 충돌이 일어나고, 이 각각의 충돌이 모두 신호에 영향을 주는 반사(메아리)를 만들어내기 때문에 노이즈가 발생하기 쉽다. 갈림길에서 충돌로 반사 일어남 + 갈림길을 통과한 신호가 다른 갈림길에서 또 반사 일어남 → 이 신호들이 합쳐지면서 복잡한 노이즈 신호가 합쳐져버린다.

ㅤ
전선을 따라서 전기가 이동하는데도 반사가 일어나나? 라고 생각했는데, 결국 구리선도 길이고 이 선을 따라서 전자들이 움직이면서 전기 신호가 전달되는 것임. 전자들이 빠른 속도로 움직이다가 갈림길에서 벽에 충돌 → 이 여파가 파동의 형태로 전달되는게 노이즈. 그러니 전선을 타고 이동할 때에도 이 반사에서 노이즈가 발생할 수 있다. 이번에도 너무 컴공스러운 마인드였다. 웁스.
ㅤ
실제로 신호에서도 종단 저항이 없거나 이러한 충돌로 인한 노이즈를 잡지 않는 경우에 신호의 파형에 노이즈가 잔뜩 끼게된다. 아래 그림은 stub에 의한 노이즈는 아니고, 전선을 타고 신호가 이동하다가 길이 끊어져서 갈 곳을 잃었을 때(open 상태일 때) 다시 반사되어 되돌아오는 노이즈 신호가 섞여있는 그래프이다. 초록색이 이상적인 신호의 형태이고, 붉은색이 수신부에서의 반사로 인해 노이즈를 확인할 수 있는 신호이다.


ㅤ
위 그림에서는 신호 간격이 넓어서 우리가 신호 그래프 상에서 저게 노이즈임을 인지를 할 수 있지만, 만약에 신호간의 간격이 짧아서 신호 전송 타이밍에 노이즈가 중첩되어 있다면? 이게 노이즈로 인해서 전압이 높아진건지, 아니면 진짜로 높은 전압의 신호를 보내는 건지 알 수 없게 된다. 그러면 이게 바로 에러가 되어버린다.
ㅤ
이러한 반사 노이즈를 회피하기 위해서 고속 CAN 에서는 중앙 BUS 를 가지는 형태의 토폴로지를 사용해야한다.
ㅤ

ㅤ
하나의 큰 버스 형태로 데이터를 전달하면서 갈림길을 없애 반사로 인해 발생할 수 있는 노이즈를 제거한다. 그리고 양 끝단에는 충분한 저항값의 종단 저항을 달아서 전선 양끝에 부딪힌 신호를 스펀지처럼 흡수하여 반사 노이즈가 발생하지 않도록 처리한다.
ㅤ
그런데 궁금한 점이 생겼다. 아니, 저기 버스에서 ECU랑 연결되는 것들도 다 갈림길일텐데, 여기에서 노이즈 끼는거 아닌가? 에 대한 해결책도 명쾌했다. 역시 석박사들이 머리를 싸매고 만들었으니, 척척학사인 나의 의심은 이미 검토가 완료되어있었다. 역시 자네야.
ㅤ
수신 장치 쪽으로 연결되는 전선에서 반사로 인한 노이즈를 최대한 줄이기 위해서 또 여러가지 전략들이 있다.
- 수신부로 연결되는 전선의 길이는 0.3m 를 넘지 않아야 한다. 이게 너무 길면 노이즈가 발생할 수 있는 듯. (아마 들어갔다가 나오는 시간 차이로 인한 문제를 없애기 위함이 아닐까 싶다)
- 수신 장치(트랜시버)의 입구는 전기적으로 저항이 매우 높게 설계되어 있어서, 메인 선을 흐르는 신호의 에너지를 거의 뺏어가지 않고 전압만 살짝 관찰만 하고 넘어갈 수 있다.
ㅤ
그렇다면 고속 CAN은 어떻게 2개의 선을 이용해서 신호를 주고받냐.

ㅤ
- 신호가 1 (Recessive = 열성) 일 때는 CAN High 선과 CAN Low 선의 신호를 동일하게 중간으로 맞춘다.
- 신호가 0 (Dominant = 우성) 일 때는 High는 끌어올리고, Low는 낮춘다.
- 수신부에서는 두 선의 전압 차이를 이용해서 신호가 0인지 1인지 파악한다.
ㅤ
여기에서 요런 생각도 들었다. “아니 이거 0V → 5V 왔다갔다 하면서 확실하게 전압 차이 벌려버리면 노이즈에 대한 내성이 더 클텐데, 왜 이만큼만 왔다갔다 하는거지?” 에 대한 것도 역시나 석박들이 다 생각이 있었다. 애초에 전기 신호는 자세히 보면 0→1→0 이렇게 딱딱 변경되는게 아니라 서서히 5V → 서서히 0V 로 변하는 것이기 때문에, 5V까지 올리고 0V까지 내리는 시간이 고속 처리를 하기에는 너무 오래걸린다. 차라리 위 그림처럼 HIGH 선은 1V 만큼만 올리고 LOW 선은 1V 만큼만 내리고, 수신부에서 두 신호의 차이가 0V인지 2V인지를 본다면 신호 전달 속도를 훨씬 더 높일 수 있다.
ㅤ
또 하나의 이유가 더 있다. 전압이 급격하게 변하면 거기에서 전자파가 발생하면서 노이즈가 생길 수 있는데, 앞서 말했던 것처럼 고속 통신 환경에서는 노이즈를 덜 발생하게 만드는게 중요하다. 전압을 최소한으로 변경시켜서 이로 인해 전자파 노이즈가 발생하는 것을 억제하기 위한 의도도 들어있다.
ㅤ
왜 고속 CAN은 근데 Fault Tolerance를 충족하지 못하냐
통신 선로에 전기적 문제가 생겼을 때 스스로 복구하거나 통신을 유지하는 하드웨어적 메커니즘이 없기 때문에 고속 CAN은 Fault Tolerance가 없다고 봐야한다. 좀 있다가 나올 저속 CAN과 비교되는 점들이다.
- 고속 CAN은 High와 Low의 전압 차이를 보고 신호가 0인지 1인지를 결정한다. 근데 만약 두 선 중 하나가 끊어졌거나 GND와 접촉해서 신호가 소실되었다면 전압 차이를 계산하지 못해서 신호를 받지 못하게 된다.
- 위 경우에 나머지 선이 살아있기는 하지만, 0과 1의 전압 차이가 작아서 데이터 해석이 어렵다. 또 이걸 처리하도록 장치를 넣으면서 최고 통신 속도가 느려지는 것보다, 차라리 안정성은 낮더라도 통신 속도를 높이는 방향으로 설계되었다.
- 버스의 중간이 끊어지게 되면 양쪽으로 종단 저항이 없는 상태가 된다. 그러면 신호에서 반사로 인해 생기는 메아리가 매우 커져서 노이즈가 잔뜩 섞인 신호가 된다. 데이터가 깨져 통신이 거의 불가능해진다.
ㅤ
따라서 마냥 CAN을 썼다고 해서 무조건 안정성이 따라오는 것은 아니다. 안정성을 높이는 부분은 저속 CAN 트랜시버에 대한 이야기이고, 고속 CAN 트랜시버를 사용한다면 안정성을 포기하고 통신 속도를 높이는 방법을 선택한 것이다.
ㅤ
저속 CAN
저속 CAN (ISO 11898-3) 방식의 특징은 다음과 같다.
- 최대 125Kbps의 속도로 통신할 수 있다.
- 최대 1km 거리까지 통신할 수 있다.
- 선 하나가 고장나더라도 정상적으로 데이터를 주고 받을 수 있다.
- 종단 저항이 모든 트랜시버에 붙어있다.
ㅤ
앞서 살펴본 고속 CAN 과의 가장 큰 차이는 Fault Tolerance 이다. 선이 하나 단선되거나 고장나더라도 내장된 복잡한 회로가 GND와 신호의 전압 차이를 이용해서 신호를 검출할 수 있도록 스스로 살려낸다. WOW 👏👏👏. 또 모든 트랜시버가 종단 저항을 가지고 있기 때문에, 중간에 통신 선이 단선된다고 하더라도 반사로 인한 노이즈를 트랜시버들이 자체적으로 흡수해서 노이즈를 견뎌낼 수 있다.
ㅤ
저속 CAN 에서는 고속의 방식과 다르게, High / Low 선에 가하는 전압을 충분히 크게 차이를 준다. 그래서 하나의 선에 문제가 있더라도 GND와의 전압 차이를 이용해서 신호를 검출해낼 수 있다.

ㅤ
물론 이러한 Fault Tolerance를 갖기 위해서 속도를 포기했다.
- 통신을 할 때 신호 전달을 위해서 0V → 3.5V → 0V 로 전압을 올리고 내려야 하기에 하나의 bit를 표현하기 위해서 1V만 움직이면 되는 고속 통신보다 조금 더 시간이 필요하다. 그치만, 그 덕에 선이 하나 단선되더라도통신이 가능하다.
- High 또는 Low가 단선되더라도 GND와의 비교를 통해 통신이 가능하도록 만들기 위해서 추가적인 복잡한 회로가 포함된다. 이로 인해서 속도를 빠르게 올릴 수는 없다.
- 메인 BUS에 종단 저항을 다는 대신에 각 트랜시버에게 모두 종단 저항을 달아주었다. 이 덕분에 전선 단선으로 인해 Open 상태로부터 발생하는 반사 노이즈에 내성이 생긴다. 대신 저항으로 인해 통신 속도가 느려진다 (기생 커패시턴스가 원인일 것 같음)
ㅤ
TRADE OFF
ㅤ
속도를 늦췄을 때 따라오는 장점들도 여럿 있다.
- 저속으로 통신을 하는 경우에는 전선 상의 갈림길(stub)에서 생기는 반사 노이즈가 그 다음 신호를 전달하는 타이밍에 소멸될 시간이 충분하다.
- 그래서 반드시 BUS 형태를 사용할 필요는 없고, 여러 갈림길을 이용한 다른 네트워크 토폴로지를 구성할 수 있다.
ㅤ

ㅤㅤ
내 생각이 완전히 틀렸었소
앞서 언급했던 것처럼, 나는 단순히 “CAN을 사용하면 외부 노이즈로부터 강인하고 통신 속도가 빨라!” 라고 생각했다. 외부의 자기장으로부터 발생하는 신호 왜곡 등에도 잘 버티니깐 이게 장점이라고 생각했는데, 완전히 모두 다 틀린 생각이였다.
ㅤ
- CAN을 사용한다고 하더라도 외부 노이즈로부터 강인한 것은 아님. 오히려 이건 그냥 UTP/STP(쌍으로 꼬인 선) 같은 선을 사용하여서 얻을 수 있는 강점이다.
- 자기장 등의 영향을 받더라도 2가닥의 선 모두 동일한 영향을 받기 때문에 외부 영향이 상쇄될 수 있다.
- 2가닥의 선이 반대 극성으로 동작하면서 서로 만들어내는 전자파 노이즈 등이 상쇄되기 때문에 다른 선에게 가하는 영향을 줄일 수 있다.
- CAN에서 말하는 Fault Tolerance는 단선, 쇼트 등의 상황으로부터 안정적이라는 것이다.
- 단선, 쇼트로부터 강인하면서 통신 속도가 빠를 수는 없다. 강인하거나, 속도가 빠르거나. 둘 중 하나를 선택해야한다.
ㅤ
그렇담 우리 팀에서 산 CAN 모듈은 뭘까
팀프로젝트를 위해서 우리도 CAN 모듈을 하나 샀다. 용도는 STM과 라즈베리파이의 CAN 통신.

ㅤ
요 녀석의 구성을 보면 종단 레지스터가 $120\Omega$ 짜리가 이렇게 붙어있다.

나는 그래서 이게 저속 CAN을 위한 트랜시버라고 생각했는데, 그게 아니였다. 사양에 보면 얘는 1Mbps 의 속도로 통신이 가능하다고 되어있고, 실제로 TJA1050의 문서에서도 High Speed CAN Transceiver 라고 명시되어 있다.

ㅤ

ㅤ
엥엥엥? 왜 저속 CAN 도 아닌데 트랜시버 쪽에 이렇게 종단 저항이 붙어있는거지? 라고 생각하면서 찾아봤는데, 이런 내용이 아래에 붙어있었다.

이 모듈에는 120Ω 종단 저항이 기본 탑재되어 있으며, 점퍼를 통해 연결 여부를 선택할 수 있습니다.
(이미 네트워크 내 다른 장치에서 종단 저항이 적용되어 있는 경우, 점퍼를 제거하여 병렬 저항에 의한 신호 왜곡을 방지해야 합니다.)
ㅤ
버스의 양 끝단에 종단 저항을 설치하는 대신에, 양 끝단에 이 모듈을 연결하면 자동으로 종단 저항을 연결한 것과 같은 효과가 난다. 버스 중간에서 신호를 송수신하도록 연결하는 경우에는 솔더브릿지를 제거해서 이 종단 저항과의 연결을 제거해서 사용하라고 되어있다. 요렇게 기본으로 달려있는 이유는 개발자들이 테스트할 때 보통 두 CAN을 E2E로 연결하기 때문에 종단 저항을 따로 연결하는 수고로움을 덜어주기 위해서라고 한다. 아주 명쾌한데?
ㅤ
사실 이거 안봤으면 저항 연결된 채로 그대로 사용할 뻔 했다. 역시 문서를 읽어야 한다. 버그가 아니라 기능이였어. 이걸 확인한 나, 아주 칭찬해.
ㅤ
샤라웃
https://www.youtube.com/watch?v=vqqha-aEFJc&list=PLTp_ZhmNQUh6GTPYNv47uZd2D2DfRtCVk&index=2
'Embedded System > MCU' 카테고리의 다른 글
| [MCU] Independent 워치독 타이머 - IWDG (0) | 2025.11.09 |
|---|---|
| [MCU] General Purpose Timer (0) | 2025.11.09 |
| [MCU] STM32F429ZIT6의 타이머들 (0) | 2025.11.07 |
| [MCU] Basic Timer (2) | 2025.11.07 |
| [MCU] SysTick 타이머 (2) | 2025.11.04 |