안녕하세요.
오늘은 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
이제 다시 끊어져 있던 라인을 다시 연결해 보도록 하겠습니다.
이제 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에 대해서 추가적인 글 쓰는 것을 마치도록 하겠습니다.
감사합니다.
'Embedded SW > Embedded SW Introduction' 카테고리의 다른 글
elf, hex, s19 파일 생성 방법 정리 (Tasking 컴파일러, Aurix Development Studio) (0) | 2022.09.15 |
---|---|
mcu memory, section에 대한 상세 정리 (.text, .data, .bss, .rodata) (1) | 2022.09.15 |
CAN 구현 및 동작 수행 6편 (계측된 CAN Frame을 상세 분석) (0) | 2022.09.14 |
CAN 구현 및 동작 수행 5편 (CAN Rx 구현) (0) | 2022.09.14 |
CAN 구현 및 동작 수행 4편 (ECU 2개를 이용한 Tx, Rx) (0) | 2022.09.14 |
댓글