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

CAN 구현 및 동작 수행 7편 (CAN ACK 상세 분석)

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

안녕하세요.

오늘은 CAN ACK에 대해서 조금더 자세히 알아보는 시간을 가져보도록 하겠습니다.

 

CAN은 제어기를 설계하는데 있어서 아주 중요한 주변기기입니다.

그 다양한 산업군에서 CAN에 대한 안전성도 충분히 검증이 되었기 때문에

임베디드에서 CAN을 통해서 제어기의 정보를 송수신하는데 많이 사용합니다.

따라서 CAN의 동작상태를 자세히 알아두면

추후, 디버깅을 하실때 많이 유용하실 것입니다.

 

그 중에서도 ACK에 대해서 꼭 알아두시면 많인 도움이 되실것입니다.

이번 장에서는 CAN Frame에 마지막 부분에 위치한 ACK에 대해서 추가 정리하는 시간을 가지도록 하겠습니다.

 

지금 이 글은 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

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

https://embeddedchallenge.tistory.com/455

 

 

그러면 이어서 글을 써보도록 하겠습니다.

 

제가 ECU1과 ECU2의 CAN 라인을 끊었습니다.

지금 아래와 같이 연결되어 있는 선을 뺐다고 생각하시면 됩니다.

현재  ECU1에서 10ms 주기로 ID 0x100의 메시지를 전송하도록 코딩을 해 놓았습니다. 

그런데 아래와 같이 지금 56us 정도마다 계속 메시지를 보내고 있는것을 볼 수 있습니다.

이유는 간단합니다.

지금 ECU1이 메시지를 전송하고 있지만,

아무도 받는 곳이 없기 때문입니다.

조금더 자세히 보도록 하겠습니다.

아래 그림에서 NAK라고 적혀있죠?

위의 보라색이 ECU1의 Tx라인이고

아래 갈색이 ECU1의 Rx라인입니다.

Rx라인에서 ACK가 아래로 내려가지 않고 있습니다.

아무도 이 메시지를 받지 않았기 때문인데요.

다른 ECU가 잘 받으면 ACK를 내려줍니다.

현재 CAN라인을 ECU1이 전압을 잡아서 CAN Frame을 발사하고 있는데

이때 마지막 ACK 라인을 다른 ECU에서 내려 줄 수 있는 것입니다.

 

이유는 0이 dominant이기 때문인데요.

이 부분에서 더 궁금하신 분은 아래 Arbitraion(중재)에 대한 글을 읽어보시길 바랍니다.

https://embeddedchallenge.tistory.com/59

 

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

CAN은 Contoller Area Network의 약자로서, 제어기의 정보를 교환하는데 사용하는 통신 프로토콜입니다. 아래 그림과 같이 2개의 ECU가 존재 한다고 할때, MCU에서 해석한 정보를 서로에게 전달할 경우가

embeddedchallenge.tistory.com

이제 다시 끊어져 있던 라인을 다시 연결해 보도록 하겠습니다.

이제 ECU1에 보낸 0x100 메시지를 ECU2에서 수신하고  있습니다.

그러니까 ECU1의 Rx라인(갈색) 부분에서 값자기 ACK가 내려간 것을 확인하실 수 있습니다.

이것은 ECU1이 메시지를 수신한 ECU2에서 전압을 내려준 것입니다.

ECU1은 이렇게 Rx라인의 Ack가 내려간것을 확인하면

제대로 전송했다고 인식하기 때문에

더이상 메시지를 송신하지 않고

다음 10ms 뒤에 ECU1이 메시지를 보내게 됩니다.

0x100 메시지를 안전하게 받은 ECU들중 누구라고 0으로 내릴수가 있습니다.

만일 ECU2가 이상이 생겨서 ACK를 내려주지 않더라도

ECU3에서 제대로 전달을 받으면 ACK를 내려줍니다.

이때 ECU3가 0을 보내면 ECU2가 1을 잡고 있더라도

0이 domiant이기 때문에 0으로 내려가게 됩니다.

그러면 이번에는 ECU2라인의 Tx와 Rx 라인을 한번 찍어보도록 하겠습니다.

ECU2는 정확히 메시지를 수신하면

아래와 같이 Tx라인을 통해서 전압을 내려줍니다.

위의 데이터은 아래 카페에서 다운로드 가능합니다.

한번 Saleae 홈페이지에서 Logic Analyzer를 설치하신후 아래에서 첨부파일을 다운로드 하셔서

CAN Frame을 한번 살펴 보시면 좋을 것 같네요!!

https://cafe.naver.com/binaryembedded/138

위의 첨부파일은

ECU1과 ECU2가 서로 메세지를 1개씩 주고 받고 있는 데이터를 로깅한 것입니다.

 

이상으로 CAN ACK에 대해서 추가적인 글 쓰는 것을 마치도록 하겠습니다.

감사합니다.

반응형

댓글