1. CAN 개요
1.1 CAN이란?
- CAN(Controller Area Network)이란, 차량 내에서 호스트 컴퓨터 없이 마이크로 컨트롤러나 장치들이 서로 통신하기 위해 설계된 표준 통신 규격
- 차량 내 ECU(Electronic control unit)들은 CAN 프로토콜을 사용하여 통신
- 초기에는 차량 네트워크용으로 개발되었으나 최근에는 차량뿐만 아니라 산업 전 분야레 폭넓게 적용
1.2 특징 및 장점
CAN 통신은 여러 개의 ECU를 병렬로 연결하여 데이터를 주고받는 통신방법이다. 즉, CAN 버스를 통해 통신선 상에 데이터를 띄워놓고 필요한 데이터에 접근(Access)한다.
- 메시지 지향성 프로토콜(Message-Oriented Protocol)
- CAN은 노드의 주소에 의해 데이터가 교환되는 것이 아니라 메시지의 우선순위에 따라 ID(Identifier)를 할당하고, 이 ID를 이용해 메시지를 구별하는 방식을 사용
- 즉, 임의의 한 노드 A가 메시지를 전송했다면, A를 제외한 나머지 노드들은 A가 전송한 메시지가 자신에게 필요한 메시지인지를 판단(ID기반 판단)
- 이 때, 자신에게 필요하다면 받아들이고, 아니라면 무시한다.
- 주소가 아닌 ID 값으로 메시지 내용과 우선순위가 결정되며 이는 시스템 제어 속도와 안전성을 향상할 수 있으며 특히 BUS를 이용하므로 연결선 수를 대폭 줄일 수 있다.
- 보완적인 에러 감지 메커니즘
- CAN은 다양한 에러 감지 메커니즘이 상호 보완적으로 에러를 감지 => 높은 안정성 보장
- 메시지 전송 시, 에러가 감지되면 자동적으로 해당 메시지를 즉시 재전송하는 기능이 있기 때문에 다른 프로토콜에 비해 에러 회복 시간이 짧음
- 멀티 마스터 능력
- CAN을 기반으로 한 네트워크에는 버스를 점유하기 위한 Bus master가 필요없음
- 즉, 모든 버스가 버스 마스터가 되어 버스가 비어 있을 때(idle)라면 언제든지 메시지 전송이 가능
- 모든 노드는 버스가 비워지는 즉시 메시지 전송을 시작
- 만약 CAN 버스에서 두 개의 노드에서 메시지를 동시에 전송하려고 하더라도, 우선순위(식별자, ID)에 따라 각각 전송이 된다.
- 즉, 우선 순위가 높은 메시지(더 낮은 ID 번호가 더 높은 우선 순위를 가짐)가 먼저 전송
- 결점 있는 노드의 감지와 비활성화
- CAN은 버스의 상태를 항상 모니터링하기 때문에 실시간으로 결함이 있는 노드를 감지해 해당 노드를 비활성화함으로써 네트워크의 신뢰성을 보장
- 전기적 노이즈에 강함
- 꼬인 2선(Twist Pair Wire, CAN_H, CAN_L)을 이용하여 전기적으로 차별되는 통신을하여 전기적 노이즈에 매우 강함
- PLUG & PLAY 기능
- PLUG & PLAY 기능을 제공해서 CAN 제어기(controller)를 버스에서 간편하게 연결하고 끊을 수가 있어서, 여러 장치를 추가하고 제거하기가 매우 쉬움
1.3 등장 배경
초기에는 다양한 모듈(ECU)들이 서로 통신하기 위해 비동기 직렬 통신 방식인 UART(Universal Asynchronous Receiver/Transmitter)를 사용했다. 그러나 UART의 통신은 각 모듈들이 1:1 통신을 해서 모듈이 추가될 때마다 더 많은 연결선이 필요하게 되었고, 배선의 증가로 인한 유지 보수, 무게 증가 등의 문제가 발생하여 등장한 것이 CAN 통신이다.
메르세데스-벤츠는 이런 문제를 해결하기 위해 보쉬(Bosch)에 차량용 네트워크를 만들어달라고 의뢰하였고, 1985년에 CAN을 개발하였다. 여러 개의 CAN Device가 서로 통신할 수 있으며, 하나의 CAN 인터페이스로 여러 개의 모듈을 제어할 수 있어서 연결선 수의 감소, 무게 경감뿐만 아닌 효율적 시스템 제어가 가능해졌고 1993년에는 ISO가 국제 표준 규격으로 제정하였다.
1.4 CAN BUS 네트워크 동작원리
- CAN 통신은 다중통신망(Multi Master Network)이며 CSMA/CD+AMP(Carrier Sense Multiple Access/Collision Detection with Arbitration on Message Priority) 방식을 이용
- 우선 CAN 노드에 메시지를 보내기 전에 CAN 버스 라인이 사용 중인지 파악한 후 메시지 간 충돌 검출을 수행
- 이 때, 어떠한 노드로부터 보내진 메시지는 송신측이나 수신측이나 주소를 포함하지 않음
- 즉, 주소지정방식으로 통신하는 것이 아닌
- 메시지의 처음 부분에 CAN 네트워크상에서 각각의 노드를 식별할 수 있도록 각 노드마다 유일한 식별자(ID-11bits 또는 29bits)를 가지고 통신
- 네트워크상에 연결된 모든 노드는 네트워크상에 있는 메시지를 수신한 후 자신이 필요로 하는 식별자의 메시지인 경우에만 받아들이고, 그렇지 않은 경우의 메시지는 무시함
- 여러 노드의 데이터들이 동시에 사용자가 필요로 하는 노드로 유입되는 경우 => 식별자의 숫자를 비교, 먼저 받아들일 메시지의 우선순위에 따라 수신 (식별자의 숫자가 낮을수록 우선순위가 높음)
- 낮은 순위의 메시지는 자동적으로 다음 버스 사이클에 재전송
- 각 CAN 메시지는 11비트의 식별자(CAN 2.0A) 또는 29비트의 식별자(CAN 2.0B)를 가지며, CAN 메시지의 맨 처음 시작부분에 위치
2. CAN 통신 프로토콜
2.1 CAN 프로토콜 규격
식별자(ID)의 길이에 따라 두 가지 모드로 구분
- 표준 CAN(버전 2.0A): 11비트 식별자
- 확장 CAN(버전 2.0B): 29비트 식별자
ISO 규격에 따라 두 가지로 구분되며 통신 속도에서의 차이
- ISO 11898: 1Mbps 이상의 고속 통신 가능
- ISO 11519: 125Kbps 까지의 통신 가능
대부분의 CAN 2.0A 컨트롤러는 오직 표준 CAN 포맷의 메시지만 전송 및 수신이 가능하며, 확장 CAN 포맷(CAN 2.0B)의 메시지를 수신하더라도 무시
즉, CAN 2.0A 컨트롤러에서 보내온 메시지 데이터만 유효하지만, CAN 2.0B 컨트롤러는 양쪽 메시지 포맷에 대해 모두 송수신이 가능
2.2 CAN 메시지 포맷(구조)
CAN에서는 아래 4가지 프레임 타입을 정의하고 있음
- 데이터 프레임(data frame) : 데이터 전송에 사용
- 리모트 프레임(remote frame) : 수신할 노드에서 원하는 메시지를 전송할 수 있는 송신 노드에게 전송을 요청할 때 사용
- 에러 프레임(error frame) : 메시지의 에러가 감지되었을 때 시스템에 알릴 목적으로 사용
- 오버로드 프레임(overload frame) : 메시지의 동기화를 목적으로 사용
CAN 통신에서 데이터 송수신은 메시지 프레임을 사용하여 이루어지며 아래와 같이 구성되어 있음
- SOF(Start Of Frame)
- 한 개의 dominant 비트로 구성되어 있으며, 메시지의 처음을 지시하고 모든 노드의 동기화를 위해 사용
- Arbitration Field(중재 필드)
- 11비트 또는 29비트의 크기를 갖는 ID와 1비트의 RTR(Remote Transmission Request) 비트로 구성된다.
- 이 영역은 둘 이상의 노드에서 메시지의 전송이 동시에 일어날 경우 발생하는 메시지 간의 충돌을 조정하는데 사용
- RTR 비트의 값은 데이터 프레임인자('d'), 리모트 프레임인자('r')를 결정하는데 사용
- Control Field(제어 필드)
- 2비트의 IDE(IDentifier Extension) 비트, 4비트의 데이터 길이 코드 (DLC, Data Length Code)로 구성됨
- R0는 Reserved 비트(Extended CAN 2.0B R0, R1)이다.
- Data Field(데이터 필드)
- 8bytes까지 사용 가능하며, 데이터를 저장하는 데 사용된다.(특정한 노드에서 다른 노드로 전송하는 데이터를 포함)
- CRC(Cyclic Redundancy Check) 필드
- SOF에서부터 데이터 필드까지의 비트열을 이용해 생성한 15비트의 CRC 시퀀스와 하나의 'r'비트의 CRC 델리미터로 구성
- 메시지 상의 에러 유무를 검사하는데 사용
- ACK(ACKnowledge) 필드
- 한 비트의 ACK 슬롯과 하나의 ACK 델리미터('d')로 구성
- 임의의 노드에서 올바른 메시지를 수신하게 되면 ACK 필드를 받는 순간 ACK 슬롯의 값을 'd'로 설정해 버스 상에서 계속 전송
- EOF(End of Frame, 프레임종료)
- 7개의 'r'비트로 구성되어 메시지의 끝을 알리는 목적으로 사용