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

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

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

이제 CAN Rx 부분을 한번 구현하고 동작시켜 보도록 하겠습니다.

 

참고로 지금 이글을 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

 

그럼 계속 이어서 진도를 나가 보도록 하겠습니다.

CAN 구현 및 동작 수행 4편 (ECU 2개를 이용한 Tx, Rx)
https://embeddedchallenge.tistory.com/453

위에 글에서 ECU2에서 0x200메시지를 ECU1에게 보내고 있습니다.

이제 ECU1이 자동적으로 Ack를 내려주었지만

데이터는 획득하지 못하고 있습니다.

이제 ECU1이 데이터를 획득할수 있도록 한번 추가 설계를 해보도록 하겠습니다.

먼저 초기화 단계에서 Rx 오브젝트 등록을 해야 겠지요?

미리 만들어 놓은 오브젝트 등록 API를 이용해서 등록을 해보도록 하겠습니다.

이 코드는

ID 0x200을 CAN Controller가 수신하면

오브젝트10번에 할당한 레지스터에 값을 옮겨 담으라는 뜻입니다.

ECU2에서는 주기적으로 10ms마다 메시지를 보내고 있지만

ECU1입장에서는 Event로 메시지를 전달받고 있는 경우이기 때문에

메시지를 받으면

바로 인터럽트가 뜨도록 설정을 하여 데이터를 가지고 갈수 있도록 설계해야 합니다.

 

그러면 어느부분을 수정하여 인터럽트를 설정해 주어야 할까요?

위와 같이 설정을 추기하였습니다.

이 부분은 인터럽트를 등록하는 부분으로

추후, 어떻게 인터럽트를  설정하는지  자세하게 다루어 보도록 하겠습니다.

 

우선 간단히 설명을 드리면

Rx가 발생하면 CAN 모듈에게 알려줍니다.

그중에서도 0x200이 들어오면 CAN모듈안에 INT0에 Rx를 수신하였다고 알려줍니다.

 

위의 코드에서 SRC_CAN_CAN0_INT0 의

SRPN, TOS, SRE를 설정하는 부분으로 위와 같은 동작을 수행하기 위해서 필요한 초기화 코드입니다.

 

그러면, Interrupt router라는 주변기기는 

이 Event가 발생하면

CPU에게 알려줍니다.

 

CPU는 자신이 하던일 PC(Program Counter)를 멈추고

이 Event가 발생할때 수행해야할 코드로 점프하여 해당 코드를 실행시킵니다.

 

따라서 이 Event가 발생할때 실행할 코드를 만들어 주어야 합니다.

지금 IFX_INTERRUPT로 시작되는 부분이

인터럽트를 선언하는 부분입니다.

그리고 CAN_RxInt0Handler는

Rx Event가 발생할때 불리는 코드라고 생각하시면 됩니다.

그럼 이 코드에서 우리가 해주어야할 일은 무엇일까요?

바로, 0x200 메시지를 받으면

10번 오브젝트 레지스터에 데이터가 채워지게 되고

우리는 이 오브젝트 레지스터에서

데이터를 빼오면 되는 것입니다.

따라서 지금 u32nuTemp1, u32nuTemp2에

4바이트씩

총 8바이트를 획득하고 있는것을 볼 수 있습니다.

그렇다면 ECU1에서 정확하게 ECU2가 보낸 데이터를

잘 획득했는지 확인해 보도록 하겠습니다.

ECU2에서 전달한 데이터가 정확하게 들어온 것을 확인 할 수 있습니다.

이제 ECU1은 Tx 뿐만 아니라 Rx도 할수 있는 기능을 확보 하였습니다.

 

참고로 위의 디버깅 환경 세팅은 

인피니언사에서 제공하고 IDE를 이용하여 디버깅하고 있는 것으로

한번 쭉 개발을 하기 원하시는 분은 아래 카페에서 

쭉 한번 따라해 보시면 좋을 것 같습니다.

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

 

그렇다면 다음장에서 이제 Rx된 데이터를 

CAN 프레인 단위에서 어떻게 해석할수 있는지를 하나하나 확인해 보도록 하겠습니다.

반응형

댓글