CAN 통신에 대해 공부하기 위해 작성하였음.
기술의 발전으로 인하여 자동차에 다양한 모듈(ECU)들이 생겨났고, 이러한 모듈들이 서로 통신하기 위하여 비동기 직렬 통신 방식인 UART(Universal Asynchronous Receiver/Transmitter)를 사용하였다.
ECU(Electronic Control Unit) : 자동차의 다양한 장치(기기)를 제어하는 역할을 하는 전자제어 장치. 자동차에 들어있는 ECU를 간단하게 살펴보면 ACU(Airbag Control Unit), BCM(Body Control Unit), ECU(Engine Control Unit), TCU(Transmission Control Unit), ABS(Anti-lock Braking System)이 있음
그러나, UART의 통신은 각 모듈이 1:1 통신을 하여 모듈이 추가될 때마다 더 많은 연결선이 필요해졌다. 연결선이 많아질 수록 자동차의 공간을 더 많이 차지하게 되었고 이는 자동차 무게를 증가시키고 원가를 상승시키는 결과를 초래하였음.
메르세데스 - 벤츠(Mercedes - Benz)는 이러한 문제점을 해결하기 위해서 보쉬(Bosch)에 차량용 네트워크를 만들어 달라고 의뢰를 하였고, 1985년에 보쉬는 CAN을 개발하였음.
여러 개의 CAN 장치가 서로 통신할 수 있으며, 하나의 CAN 인터페이스로 여러 개의 모듈을 제어할 수 있어서 연결선 수의 감소, 자동차 무게의 경감, 원가 하락 뿐만 아니라 효율적으로 시스템 제어가 가능해졌다.
CAN 통신은 여러 개의 ECU를 병렬로 연결하여 데이터를 주고받는 통신 방법이다. CAN 버스를 통해서 통신선 상에 데이터를 띄어 놓고 필요한 데이터에 접근(Access)한다.
CAN 버스는 다중 주인(Multi Master) 방식으로 통신하기 때문에 통신 버스를 여러 노드(node)들이 공유하면서 언제든지 버스를 사용할 수 있음
CAN 통신은 CAN_high, CAN_low 두 개의 신호로 통신하기 때문에 단 2개의 선만 있으면 된다. 그렇기 때문에 많은 모듈이 추가되더라도 추가되는 선의 양이 적다. 전선의 전압차를 통하여 데이터를 전송한다.
CAN BUS는 Twist Pair 2선으로 되어 있어 전기적 잡음(noise)에 강해 메시지를 보호할 수 있음.
자동차의 ECU들은 고유한 ID 값을 가지고 있다. ID 값은 낮을 수록 우선순위가 높은데, CAN에서는 여과 과정(filtering)을 통하여 설정된 ID 값을 수신해 우선 순위를 결정한다. 주소가 아닌 ID 값으로 메시지 내용과 우선 순위가 결정되며, 이는 시스템 제어 속도와 안전성을 향상할 수 있음. 특히 BUS를 이용하기 때문에 연결선 수를 대폭 줄일 수 있으며, 이는 자동차의 무게와도 직결되므로 매우 중요함.
CAN 통신은 최대 1Mbps에 달하는 고속 통신을 제공하며, 보통 일반적인 통신 속도가 500k ~ 1Mbps 속도로 CAN 통신이 가능하다. 또한 최대 1,000m까지 원거리 통신이 가능함.
PLUG & PLAY 기능을 제공해서 CAN 제어기(Controller)를 버스에 간편하게 연결하고 끊을 수 있어서, 여러 장치를 추가하고 제거하기가 매우 쉬움.
CAN 통신은 프레임이라고 하는 패킷(packit)으로 데이터를 전송한다. 프레임이란 하나의 메시지를 이루는 필드 또는 bits의 집합을 말하며, CAN 프레임은 다음과 같은 분할 구역(section)으로 구성되어 있음.
메시지의 시작을 의미하는 주요한 비트로 버스의 노드(node)를 동기화 하기 위해 사용함.
식별자로서 메시지의 내용을 식별하고 메시지의 우선 순위를 부여함. CAN 메시지에 있는 ID의 길이에 따라서 표준 CAN과 확장 CAN 두 가지 양식(mode)으로 구분됨. 표준 CAN은 11비트 식별자이며, 확장 CAN은 29비트 식별자로 구분됨.
데이터의 길이(DLC)를 의미함.
전달하고자 하는 내용을 의미함.
프레임의 송신 오류 및 오류 검출에 사용됨
오류가 없는 메시지가 전송되었다는 것을 의미하는 비트로서, CAN 제어기는 메시지를 정확하게 수신했다면 ACK(Acknowledgement) 비트를 전송한다. 전송 노드는 버스 상에서 ACK 비트의 유무를 확인하고 만약 ACK 비트가 발견되지 않는다면 재전송을 시도함.
프레임의 끝을 나타내고 종료를 의미함.
CAN 버스에는 전체 노드를 제어하는 주인(Master)이 없어 CAN 버스에서 데이터를 쉽게 접근할 수 있음. 우선 CAN 제어기는 CAN 버스 선이 다른 제어기에 의해서 사용중인지 확인을 한다. 만약 CAN 버스 선이 사용중이지 않다면, 모든 노드는 ID 값을 통해서 자신에게 필요한 메시지를 확인한다. 이때 불필요한 메시지를 무시하게 되고 자신에게 필요한 메시지만 수신하게 된다. 다중 노드가 동시에 메시지를 CAN 버스에 전송하려는 경우에는 가장 낮은 ID 값을 가진 최우선 노드가 자동으로 버스에 접근하게 됨. 우선순위가 높은 메시지가 CAN 버스의 사용 권한을 보장받을 수 있으며 낮은 순위의 다른 노드들은 대기해야 하며, 자동으로 다음 버스 사이클에서 재전송을 수행함.
https://blog.naver.com/suresofttech/220793847337
https://jdselectron.tistory.com/36
https://www.andymark.com/products/can-bus-cable-10ft
https://support.squarell.com/index.php?/knowledgebase/article/view/94/0/can-high--can-low
https://www.javatpoint.com/can-protocol
https://blog.naver.com/ehdwnd02/221645841696