본문 바로가기
Embedded SW/Embedded SW Introduction

CAN 구현 및 동작 수행 6편 (계측된 CAN Frame을 상세 분석)

by 방구석 임베디드 2022. 9. 14.
반응형

CAN은 Controller Area Network의 약자로

ECU와 ECU가 서로 통신을 수행하는 통신방법입니다.

결국 전압을 변화시켜

다양한 비트신호를 만들고

하나의 프레임을 만들어서 

아래와 같이 전압 Package 형태로 정보를 전달합니다.

 이제 이 CAN Frame을 상세적으로 분석해 보는 시간을 가져 보도록 하겠습니다.

위키에서 가져온 CAN Frame 그림입니다.

정말 이렇게 CAN Frame이 구성되어 있는지 하나하나 확인해 보도록 하겠습니다.

이렇게 CAN Frame에 대해서 자세히 알게 되면

추후, CAN의 동작을 확인하는 과정에서 쉽게 디버깅을 할 수 있습니다.

 

그전에 이글은 CAN 관련하여 쭉 연재를 하고 있는 글입니다.

아래 글에 CAN의 개념적인 내용부터

개발하는 내용을 연재하고 있으니 

관심이 있으신 분들은 참고하여 읽으시면 될것 같습니다.

 

1) CAN이란 무엇인가?

https://embeddedchallenge.tistory.com/57

2) CAN의 CAN Controller/Transceiver 전압 레벨 (High Speed CAN)

https://embeddedchallenge.tistory.com/59

3) CAN 정보전달 방식

https://embeddedchallenge.tistory.com/60

4) CAN Frame 분석

https://embeddedchallenge.tistory.com/61

5) CAN Arbitration

https://embeddedchallenge.tistory.com/62

6) CAN 구현 및 동작 수행 1편 (TC275 MCU 예제코드 포팅)

https://embeddedchallenge.tistory.com/450

7) CAN 구현 및 동작 수행 2편 (CAN 측정 환경 및 장비 설명)

https://embeddedchallenge.tistory.com/451

8) CAN 구현 및 동작 수행 3편 (CAN 초기화 코드 분석)

https://embeddedchallenge.tistory.com/452

9) CAN 구현 및 동작 수행 4편 (ECU 2개를 이용한 Tx, Rx)

https://embeddedchallenge.tistory.com/453

10) CAN 구현 및 동작 수행 5편 (CAN Rx 구현)

https://embeddedchallenge.tistory.com/454

 

그러며 이제 CAN Frame을 하나하나 

계측해서 분석해 보도록 하겠습니다.

 

1) SOF

- Start of Frame의 약어입니다.

SOF는 메시지의 시작을 알리는 역할을 수행합니다.

아래 빨강색 박스에서 1에서 0으로 변하는 것이 보이시나요?

이제 메시지(프레임)의 시작을 알리게 됩니다.

한 비트를 사용하고 있네요~

2) Identifier

Identifier는 지금 전송하는 메시지(Frame)가

무슨 메시지인지를 알수 있도록 하는 영역입니다.

예를 들어 우리가 소포를 보낼때는 보내는이과 받는이가 있습니다.

하지만 CAN은

지금 이 소포의 이름은 신발이라고 이름을 적어 놓고

그냥 뿌립니다.

받는 사람들은 소포의 이름(신발)을 보고

내가 받아야할 이름이라고 생각하면 열어서 보고

아니면 그냥 무시합니다.

이렇게 이름의 역할을 하는것이 ID입니다.

 

CAN은 서로 메시지를 통신라인에 뿌리기 때문에

동시에 ECU가 통신라인에 뿌릴 경우가 있습니다.

이때 ID가 낮은 녀석이 먼저 뿌릴 수 있는 권한이 생깁니다.

이것을 arbitration(중재)이라고 합니다.

즉, ECU1과 ECU2가 동시에 메시지를 전달할때

ID가 낮은 메시지를 먼저 전송하게 됩니다.

Standard CAN Frame과 Extended CAN Frame이 있는데

Standard CAN Frame은 11비트로 구성이 되어 있습니다.

 

따라서

0x200의 메시지를 보낼경우에는

이진수로 010 0000 0000 을 전달해야 하는데

위의 그림에서 정확하게 ID를 전압의 행태로 전달하고 있는것을 볼 수 있습니다.

 

만일 CAN Controller에서

Extended ID로 설정하여 메시지를 전달하게 된다면

CAN Frame은 구조는 달라지게 되는데요.

ID는 29비트로 늘어나게 됩니다.

Standard는 11비트의 ID 영역을 사용하지만

Standard 메시지보다 Extended 메시지는

더 많은 메시지 비트수가 필요하게 됩니다.

참고로 x라고 되어있는 부분은 stuff bit를 의미합니다.

이 부분은 무시해도 되는 비트이지만

나름 의미가 있습니다.

지금 우리가 전달하는 CAN은 비동기방식입니다.

SPI처럼 따로 Clock을 가지고 동기를 맞추고 있지 않습니다.

따라서 전압이 5비트가 동일할때, 역으로 하나를 반대로 내려주어서

다시 동기를 찾는 역할을 수행합니다.

3) RTR

RTR은

Remote Transmission Request의 약어입니다.

이 값이 1이면 remote frame을 의미하여 CAN Frame안에 데이터를 포함시키지 않은 상태로 메시지를 전달합니다.

RTR값이 0 이면 data frame 채워서 보내는 CAN Frame이 되는 것입니다.

지금 우리가 실제로 전송하는 메시지는 Data를 넣어서 보내고 있습니다.

따라서 RTR값이 0이 되어야 합니다.

아래 그림에서 0인것을 확인하실수 있으시지요?

romote frame  또는 data frame은 CAN Controller에서 메시지를 전송할때

선택할 수 있습니다.

4) IDE (ID Extended Bit)

이 부분은 위에서 이야기한 Standard 메시지 또는 Extended 메시지를 구분할때 사용됩니다.

Standard Bit일 경우 0,

extended 경우에는 1을 채워서 전달합니다.

지금 저는 0x200을 아이디로  standatd CAN Message를 날리고 있습니다.

따라서 아래와 같이 IDE가 0 인것을 확인 할 수 있습니다.

5) r

Reserve Bit를 의미하고

r역시 0입니다.

위의 그림을 참고해 주세요.

6) DLC

DLC는 Data Length Code의 약어입니다.

DLC는 메시지안에 전달하는 Data 바이트 수를 나타내고 있습니다.

우리는 지금 데이터를 8바이트를 보내고  있기 때문에

0x8 (16진수) -> 1000 (이진수)

따라서 파란색과 같이 1000을 보내고 있습니다.

7) Data Field

Data Field는 최대 8바이트까지 보낼수 있습니다.

CAN FD의 경우에는 최대 64바이트까지 보낼수 있는데

현재 우리는 High Speed CAN만 다루고 있기 때문에 최대 8바이트입니다.

이 8바이트안 우리가 원하는 데이터를 채워서 보냅니다.

지금 아래 그림에서 8바이트의 데이터가 나가고 있는것을 확인 할 수 있습니다.

8) CRC

CRC는 Cyclic Redundancy Check의 약어입니다.

error detection을 위한 부분인데요. 이것은 우리가 직접 계산해서 메시지에 채워넣는것이 아니라

CAN Controller에서 바로 채워 전달해 줍니다.

마치 채크섬과 같은 역할을 수행합니다.

CRC는 총 15비트의 비트길이를 사용합니다.

아래 CRC영역이 보이시죠? (15비트 0x7AC4)

 

9) DEL

DEL은 Delimiter로서

영역을 나누기 위한 구분자 비트입니다.

10) ACK

ACK는 Acknowledgement로서 데이터를 잘 받으면 다른 ECU에서 0으로 전압을 내려줍니다.

따라서 ECU2에서 전송을 했다고 한다면

다른 ECU1의 TX라인 (그림의 위쪽)에서 전압을 내려주고 있는 것을 볼 수 있습니다.

잘 받았다라는 의미입니다.

즉, 메시지를 수신한 모든 CAN 컨트롤러는 메시지의 마지막에 위치한 ACK비트를 0으로 전압을 내려줍니다.

만일 아무도 저 ACK를 내려주지 않았다면 ECU2는 다시 메시지 전송을 시도할 것입니다.

조금 확대하겠습니다.

보이시나요?

지금 ECU1의 Tx, Rx Controller 라인을 찍은것인데

Rx에 ECU2가 전송해준 데이터가 들어오고 있습니다.

그리고 ECU1에서 ACK를 내려주는것이 보입니다.

CAN Frame을 ECU2를 보낸 데이터를 잘 받아서

ECU1이 내려준것입니다.

11) ITM

After Intermission로 3비트로 구성 되어 있습니다.

12) EOF

End of Frame의 약어로 EOF는프레임의 끝을 나타냅니다.

 

​휴우 길었네요.

이것으로 CAN Frame 분석을 마칠게요.

반응형

댓글