AMP, Bit Timing, Re Synchronization, ID Filter, Fault Confinement 등에 대한 구체적인 추가 상세 내용들은
정리가 부족하여 우선 비공개로 작성 하였습니다.
🚗CAN 통신이란?
차량 내 각종 장치(e.g. 센서, 액추에이터 등) 간의 통신을 위해 만들어진 통신이며 효율성, 안정성, 신뢰성을 추구함
(※ CAN 통신 개발 전에는 N:N UART 통신을 사용하여 배선 연결 관리 및 시스템 제어가 매우 복잡하였다.)
- 차량 내 제어기와 진단 장치는 ECU가 포함되어 있으며 센서, 엑추에이터 등에개 명령을 내리거나 정보를 수집
- ECU 내부에 MCU라는 미니컴퓨터에 연결되어 있어 개발자는 MCU를 통해 여러 기능을 정의하고
ECU에게 기능 수행 명령을 전달할 수 있다.
특 징 | ECU | MCU |
용 도 | 자동차 제어 | 다양한 분야의 제어 |
구 성 | MCU, 주변 장치 | CPU, 메모리, 입출력 장치 |
기 능 | 엔진, 제동, 변속, 에어컨, 에어백 등 시스템 제어 |
제어, 계측, 통신 등 기능 수행 |
크 기 | 대형 | 소형 |
가 격 | 고가 | 저가 |
종 류 | 엔진 ECU, 변속기 ECU, ABS ECU, 에어백 ECU ESC ECU, 차체제어 ECU |
Renesas R-Car, NXP i.MX, Ti AM335x, Infineon TriCore, STM32 |
🚗CAN 통신 구조
전체 구조
아래와 같은 구조를 Bus형 토폴로지 구조라고 부르며 해당 구조는 2개의 케이블에 모든 제어기(노드)가 연결되어 있다.
장점 : 배선 비용 절감, 설치가 간편, 노드의 추가 및 제거가 간편
단점 : 케이블이 단선과 같은 장애 발생 시 모든 네트워크가 중단되어 데이터 충돌이 발생할 수 있음
- 1) Node : CAN 버스에 연결된 장치를 의미(제어기, 센서, 액추에이터 등)
- 2) Bus : 연결 케이블을 의미, 노드 하나당 2개의 Bus와 2개의 Bus가 존재
(※ 2개씩인 이유는 CAN_H : 데이터 송신용 버스, CAN_L 데이터 수신용 버스가 연결되기 때문이다.) - 3) 저항 : 잔류 전류 및 잔여 신호를 저항을 통해 소모시켜 신호 왜곡을 방지한다.
- 4) D-Sub 9pin 커넥터 : CAN 통신에서 Bus와 노드 간 연결할 때 호환성을 위해 모두 동일한 커넥터를 사용한다.
(※ 2번은 CAN-Low에 7번은 CAN-High 등 연결 규정 존재)
노드 구조
ECU가 있는 노드(제어기)의 구조이며 CAN 통신은 데이터 송/수신 시 전기 신호(전압)를 통해 통신하기 때문에
CAN Node에는 전기 신호 <-> 디지털 신호 변환 장치인 CAN Transceiver와
전기 신호 또는 디지털 신호 전송 장치인 CAN Controller가 존재한다.
※ CAN Controller
CAN Controller는 MCU의 내장 주변장치(peripheral)로 구성되며
- MCU에서 Bus로부터 데이터를 받을 때 CAN Transceiver에서 전달받은 디지털 데이터를 저장 후 MCU에 보내고
- MCU에서 Bus에 데이터를 보낼 때 MCU에 전달받은 디지털 데이터를 CAN Transceiver로 보낸다.
- CAN 메시지를 만드는 작업
- 이 외에도 bus에 다른 제어기가 메시지를 보내고 있는지 여부 확인 작업, CAN 관련 에러 처리 작업을 수행한다.
※ CAN Transceiver
- Bus로부터 전달받은 전기신호를 디지털 신호로 변환하여 CAN Controller에 보내거나
- CAN Controller로부터 전달받은 디지털 신호를 전기신호로 변환하여 Bus에 보낸다.
- CAN FD(고속 모드), Listen only, Low Power, Sleep 등 제품별로 사용가능한 모드 설정을 할 수 있다.
- STB_N, EN을 통해 트랜시버의 동작을 제어하고 ERR_N을 통해 에러 상태를 확인한다.
- 이 외에도 전원 관리, 열 관리, EMC 보호, 각종 보안 기능을 수행한다.
🚗CAN의 종류
데이터 전송 속도에 따라서 나뉘며 차량에서의 통신과 같이 빠른 전송 속도가 필요한 경우 CAN FD, High Speed CAN을 사용하며 느린 데이터 전송 속도만으로 충분한 응용 분야에는 Low Speed CAN이 쓰인다.
(※ CAN FD 이후에 새로 나온 bxCAN도 있으며 따로 공부 예정)
항 목 | Low Speed CAN | High Speed CAN | CAN FD |
데이터 전송 속도 | 125Kbps | 1Mbps | 1Mbps ~ 10 Mbps |
전압 차 | 0.2V ~ 2V | 0.9V ~ 5V | 1.2V ~ 5V |
노이즈 내성 | High | Low | High |
전송 거리 | 100m | 40m | 100m |
응용 분야 | 의료, 가전 | 자동차, 산업용 제어 | 자동차, 산업용 제어, 가전 |
종단 저항 연결 | Bus의 한쪽 끝에만 연결 트랜시버에 저항 연결 |
Bus의 양 끝단에 저항 연결 | Bus의 양 끝단에 저항 연결 |
종단 저항 연결 이유 | 전력 소모를 줄이기 위해 한쪽에만 연결 |
빠를수록 신호 반사가 커 양 끝단에 사용 필수 |
빠를수록 신호 반사가 커 양 끝단에 사용 필수 |
🚗메시지 전송
메시지 전송 방식
네트워크를 통해 메시지를 전송할 때 주로 사용하는 방식은 유니캐스트, 멀티캐스트, 브로드캐스트 방식이 있으며
CAN 통신은 ECU 간 통신 시 멀티 캐스트와 브로드 캐스트 방식을 사용한다.
1. 브로드캐스트
무조건 네트워크상 연결된 모든 장비들에게 메시지를 보내는 통신이기 때문에 목적지, 도착지 설정 필요가 없으며
수신 ECU에서는 일단 수신받은 후 CAN-ID를 통해 본인에게 해당하는 메시지만 수용한다.
2. 멀티캐스트
한 그룹 또는 한 장비에게 메시지를 보내는 통신 CAN-ID에 도착지 정보를 포함하여 메시지를 송신한다.
메시지 전송 과정
1. ECU에서 전송할 데이터를 CAN Controller를 통해 CAN 메시지로 생성 후 CAN Transceiver에 전달
(※ CAN 메시지는 CAN Frame 이라고 하는 포맷을 따른다.)
- CAN Standard Frame
Standard Frame 외에도 Extended Frame, Remote Frame 등이 있으며 데이터 크기 등의 필요한 조건에 맞는 Frame을 소프트웨어(코딩)을 통해 선택해 사용한다.
- SOF (Start of Frame) : 프레임의 시작을 나타내는 비트
- ID(Identifier) : 식별자를 나타내는 비트
- RTR : 데이터를 요청하는 데 사용되는 비트
- IDE : 비트를 확장하는데 사용하는 비트(CAN_FD 모드에서만 사용)
- R : RTR 비트와 IDE 비트를 하나의 비트로 결합한 비트(CAN_FD 모드에서만 사용)
- DLC : Data Field의 길이를 나타내는 비트
- Data Field : 데이터를 나타내는 비트
- CRC : 프레임의 오류를 검사하는 데 사용하는 비트
- DEL : 프레임의 시작과 끝을 구분하는 비트
- ACK : 프레임이 수신되었음을 나타내는 비트
- EOF(End of Frame) : 프레임의 끝을 나타내는 비트
- CAN-ID
메시지의 송신, 수신 제어기 확인을 위한 ID
ID 별로 메시지의 이름을 붙이고 다음과 같이 CAN DB에 정의한다.
캔 메시지는 ID의 길이에 따라 아래 2가지 타입의 포맷이 있다.
Standard Format : 11bit
Extended Format : 29bit메시지 ID 메시지 이름 데이터 길이 송신 제어기 수신 제어기 0x123 배터리 상태 4
(전압, 용량, 전류)BMS 엔진 제어기,
에어백0x500 엔진제어 상태 8 엔진 제어기 BMS, 램프 0x507 에어백 정보 4 에어백 제어기 BMS, 엔진 0x785 헤드램프 정보 5 램프 제어기 에어백 제어기 - Factor & Offset
- Factor
Factor가 2이면 기본 8bit에서 16bit가 된다. - Offset
Offset가 1이면 데이터의 위치가 한 칸 앞으로 이동하고 -1이면 한 칸 뒤로 이동한다.
서로 약속한 대로 데이터를 이동시켜 구분하기 편하게 한다.
- Factor
2. Transceiver를 통해 CAN 메시지(디지털 신호)를 CAN_H, CAN_L 전기 신호로 변경
- CAN_H, CAN_L 전기 신호로 변경하는 이유
전기 신호 특성상 외부적인 환경에 의해 변형된 전압이 나타날 수 있다. 이를 위해
전기 신호를 CAN_H, CAN_L로 만들고 둘의 차이를 계산하여 차이가 크면 노이즈로 인식하고 이를 무시한다 - 0일 때
CAN_H와 CAN_L의 전압을 동일하게 설정 - 1일 때
CAN_H와 CAN_L의 전압을 서로 다르게 설정(e.g. CAN_H : 2.5V, CAN_L : 0V)
3. D-Sub 커넥터를 통해 Bus에 해당 전기 신호를 흘려보냄
- Bus Load (단위 : %)
Bus에서 전력 소모와 전송되는 신호의 양을 의미하며 노드의 개수, 케이블의 길이 등에 따라 달라진다.
(e.g. 5초 중 1초 동안 Bus에서 메시지가 왔다 갔다 했을 경우 Bus Load : 20%)
특히 우선순위가 높은 메시지 들이 많이 있으면 신규 메시지 처리가 지연된다. 아래 방법으로 이를 해소한다.
- 제조사에서 제공하는 CAN 컨트롤러 또는 CAN 트렌시버 툴을 통해 점유율에 대한 제한을 설정
- 개발자가 API를 통해(※ SetBusLoadLimit) CAN 컨트롤러 또는 CAN 트랜시버에 점유율에 대한 제한을 설정
- 시그널 (단위 : byte)
Bus에서 전송되는 데이터를 의미하며 Dominant와 Recessive 상태를 가진다.
1~8 byte를 담을 수 있으며 DLC(Data Length Code)에 몇 byte의 데이터가 담겨 있는지 표시하고
CAN DB안에 각각의 메시지 안에 어떤 시그널이 들어있는지 담겨있어 시그널을 통해 정보를 구분할 수 있다.
4. 수신 노드에서 Bus에서 해당 전기 신호를 받음
5. 수신 노드에서 트랜시버를 통해 전기 신호를 다시 디지털 신호로 변환
- Sampling Point (단위 : %)
CAN Voltage는 0 또는 1의 디지털 신호가 전기 신호로 변환된 값이다. 따라서 0 또는 1의 값을 가지고 있다.
0일 때와 1일 때는 아래와 같이 구분된다.
※ 1일 때
Sync 구간: 0V에서 5V로 상승 (※CAN 신호의 시작을 나타내는 구간)
TSEG_1 구간: 5V 유지 (※데이터를 전송하는 구간)
TESG_2 구간: 5V에서 0V로 하강 (※데이터를 수신하는 구간)
※ 0일 때
Sync 구간: 0V에서 5V로 상승
TSEG_1 구간: 5V 유지
TESG_2 구간: 5V 유지
Sampling point는 위와 같은 값들을 가지고 있는 CAN Voltage에서 전압 값을 읽어 디지털 값을 읽을 때
어느 간격으로 읽을 것인지를 정하는 역할을 하며 Sampling point에 따라 값이 달라진다.
Samping Point 설정을 통해 빠르게 값을 뽑아낼 수 있어 전송속도와 관련이 있다.
전송 속도 = 1 / (Sampling Point + TSEG_1 + TSEG_2)
- Synchronization
서로 다른 노드에 있는 2개 이상의 트랜시버가 동시에 같은 신호를 읽을 때 각 노드에 있는 ECU Clock에 오차가 생겨
싱크가 맞지 않으면 서로 다른 값을 수신할 수 있다.
- CAN 트랜시버를 통해 먼저 Sync 구간에 있는 전압값을 디지털 신호로 변환
- 해당 디지털 신호를 클럭 신
- 해당 클럭 신호를 사용하여 Sampling Point를 설정하여 데이터를 디지털 신호로 변환
6. 변환된 디지털 신호를 CAN Controller를 통해 ECU에 전달
메시지 전송 우선순위
- High Speed CAN & CAN FD
두 노드가 서로 다른 데이터를 동시에 전달했을 때 전압 차가 더 큰 쪽이 먼저 전송되고
(Dominant >> Recessive) 전압 차가 동일할 경우 데이터 ID가 작은 데이터가 먼저 전송된다.
Dominant : CAN High - Low = 0.9V ~ 5V
Recessive : CAN High - Low = -0.1V ~ 0.5V - Low Speed CAN
High Speed CAN일 때와 같으며 두 노드가 서로 다른 데이터를 동시에 전달했을 때 전압 차가 더 큰 쪽이 먼저
전송되고(Dominant >> Recessive) 전압 차가 동일할 경우 데이터 ID가 작은 데이터가 먼저 전송된다.
Dominant : CAN High - Low = 0.2V ~ 2V
Recessive :CAN High - Low = -0.2V ~ 0.2V
🚗에러 처리
CAN 통신은 신뢰성을 확보하기 위하여 아래 5가지의 에러와 에러를 감지했을 때 동작을 정의하고 있다.
3개의 State 존재 → Error Active, Error Passive, Bus Off
2개의 카운터 존재 → TEC, REC 고장을 감지하면 카운터가 증가, 정상적인 메시지 송수신하면 카운터 감소
카운터값에 의해 State 변환됨
- Bit Error 에러
에러 내용 : ECU에서 데이터(Bit) 전송 직후, 일정 시간 후, 다른 ECU에 수신 후에 노드 ID와 데이터를 체크하여
다르면 에러로 감지한다.
처리 방법 : ECC(데이터 수정 코드)를 사용하여 Single-bit error를 수정 및 수정할 수 없는 경우, 메시지 재전송을 요구
※ 예외) Arbitration 과정에서는 우선순위에 따라 다른 노드 ID 값이 확인될 수 있으나 데이터를 값을 주고
받은 것은 아니기 때문에 에러도 아니고 아무 문제가 없다. - Stuff Error 에러
에러 내용 : 메시지에서 6개 연속으로 같은 bit가 나오는 에러
(※ 6개 연속으로 같은 bit가 나오면 오류를 검출하는 과정에서 에러가 발생한다.)
처리 방법 : 수신받은 ECU에서 송신 측에 에러 프레임 전송 및 메시지 재전송 요청 - Acknowlege 에러
에러 내용 : 수신 측에서 ACK 프레임을 전송하지 않는 경우 발생
ACK bit에 Recessive(1) bit를 담아서 보내면 메시지를 정상적으로 수신한 ECU는 Dominant(0) bit로 응답
처리 방법 : 수신 측에서 데이터를 재전송 - CRC 에러
에러 내용 : CRC 값( 데이터가 전송되는 과정에서 오류가 발생했는지 확인하기 위한 값)에서 오류가 검출되었을 때
Transmitter에서 CRC 코드를 생성하고 Receiver에서 받은 CRC 패킷을 다시 계산해 일치 여부 확인
(e.g. CRC = x ^ (x >> 1) ^ (x >> 2) ^ (x >> 4) ^ (x >> 8) ^ (x >> 16), x값은 데이터의 한 비트)
처리 방법 : 수신받은 ECU에서 송신 측에 에러 프레임 전송 및 메시지 재전송 요청 - Structure Error
에러 내용 : 수신 시 해당 데이터가 올바르지 않은 형식일 때
(※ CRC Del, Ack Del, EOF 형식이 일치하지 않을 때)
처리 방법 : 데이터 구조 검사 후 송신 측에 다시 데이터 송신 요청 - Bus Off
고장이 나 잘못된 메시지(전기 신호)를 내보낼 때 해당 제어기를 Bus Off 상태로 하여 통신에 참여하지 않도록 한다.
[참고]
https://en.wikipedia.org/wiki/CAN_bus
'embedded' 카테고리의 다른 글
[protocol] bxCAN 이론 정리 (0) | 2023.10.29 |
---|---|
[device] CAN Gateway 이론 정리 (0) | 2023.10.26 |
[protocol] UDS 이론 정리 (0) | 2023.10.13 |
[stm32] Bluetooth 이론 및 실습 (0) | 2023.10.11 |
[stm32] RTOS 실습 (0) | 2023.09.18 |