르네사스 타겟 보드를 이용한 CAN통신(4)

4. CAN 모듈 시험

CAN 모듈을 시험하기 위해서 우리는 르네사스 사의 타겟 보드 2개를 준비하여 각각 다른 프로그램을 탑재하여 버스 구성을 하고 시험하였으며, PC와 통신 시험을 하기 위해 Seeed Studio 사의 USB-CAN 분석기를 USB 포트를 통해 PC에 연결하였다. 시험을 위한 CAN 버스의 구성은 그림 24와 같다.

그림 24. 시험 구성

4.1 CAN 분석기

CAN 분석기는 Seeed Atudio 사의 USB-CAN 분석기 V8.0을 사용하였으며 구동 소프트웨어의 GUI는 그림 25에 나타내었다.[5]
그림 25의 GUI에서 COM Configuration 창에서 COM port 설정 및 연결이 가능하며, CAN Configuration 창에서 CAN 모드, 통신 속도등을 설정할 수 있다. 그리고, 메시지를 편집하여 메시지를 전송할 수 있으며 메시지 수신 창을 통해 수신되는 메시지를 모니터링 할 수 있다.
CAN 버스의 종단 저항 120Ω의 저항도 연결되어 있어서 단말 들을 버스에 연결하면 별도의 종단 저항 없이 데이터를 송 수신 할 수 있다.

그림 25. USB-CAN Analyzer 구동 소프트웨어

4.2 CANtest1
CANtest1은 MCU의 RTC(Real Time Clock) 기능을 활성화하고, 0.5초 간격으로 인터럽트가 발생하게 하여 현재 시각을 메시지로 CAN 버스를 통해 전달하게 하고, CAN 버스로부터 Remote 메세지를 수신하면 다시 그때의 현재 시각을 전송하게 하고, CAN 버스로부터 Data 메시지를 수신하면 RTC의 시간을 설정하는 함수를 구동하여 RTC 시간을 설정하도록 하였다.

4.2.1 RTC 설정
RTC 설정은 CS+의 Code Generator의 Real-time Clock을 클릭하여 그림 26과 같이 설정한다. 인터럽트는 0.5초 간격으로 발생하게 설정하고, 우선순위는 Low로 설정한다.
Code Generator에서 “Generate Code” 버튼을 클릭하면 r_cg_rtc.c와 r_cg_rtc_user.c 파일이 활성화되는데, r_cg_user.c 파일을 열어 인터럽트 서비스 루틴에 서비스 처리 코드를 다음과 같이 추가한다. 그러면 RTC 모듈에서 0.5초마다 TX_rtc_value() 함수를 호출하게 된다.

그림 26. Code Generator의 RTC 설정



4.2.2 TX_rtc_value 함수
TX_rtc_value 함수는 다음과 같이 작성하여 추가한다.
TX_rtc_value 함수에서는 현재의 RTC 값을 읽어와서 년, 월, 일, 요일, 시각, 분, 초 값을 데이터에 입력한 뒤 4절에서 설명한 메시지 송신 함수를 호출한다.
호출할 때 ID는 0x123, 메시지 크기는 7로 호출한다.
시험을 해보면 CAN 분석기의 메시지 창에 그림 27과 같이 메시지가 수신됨을 확인 할 수 있다.
그림 27. CANtest1 시험 결과

4.2.3 RX_data_process 함수
RX_data_process를 다음과 같이 작성하여 추가한다.

위 코드를 살펴보면 2가지 메시지를 수신하여 처리하는데 그중 하나는 ID가 0x10인 Remote 프레임을 수신하여 현재의 시간을 다시 읽어서 그 값을 다시 전송하는 것으로 되어 있고, 나머지 하나는 ID가 0x15인 데이터 프레임을 수신하여 현재의 시간을 설정하는 함수로 되어 있다. 그림 28에는 시간 설정 시험 결과를 나타내었다. 그림 28을 보면 ID가 0x15인 메시지를 전달하기 전에서는 23시 24분 39초 였는데, 이후에는 23시 45분 0초 인 것을 확인할 수 있다. 여기서 23시는 RTC가 12시간 단위로 설정 되어 있을 때 오후 3시를 의미하는 BCD 코드 이다.

그림 28. 시간 설정 시험 결과

그림 29에는 Remote 프레임 시험 결과를 나타내었다. 그림 29를 보면 ID가 0x10인 Remote 프레임이 전달되면 단말에서 ID가 0x10인 Data 프레임으로 응답하는 것을 확인 할 수 있다.

그림 29. Remote Frame 시험 결과

이 2개의 메시지를 수신하기 위해서는 4장에서 설명한 수신 규칙 등록 함수에서 다음과 같이 설정하여야 한다.


4.3 CANtest2
CANtest2는 별도로 제작한 온습도계를 이용하여 온습도 센서에서 읽은 온도/습도를 지속적으로 CAN 버스에 전송하는데 온도와 습도의 상한값과 하한값을 설정하여 하한값 이하이면 상태가 1, 하한값과 상한값 사이이면 2, 상한값 이상이면 상태를 3으로 전송하고, Remote 프레임을 수신하면 현재의 상한값과 하한값을 전송하고, Data 프레임을 수신하면 상한값과 하한값을 변경하도록 구성하였다.

4.3.1 TX_sensor_value 함수
기제작된 온습도계 프로그램에서 LCD에 온습도 그래프를 그리는 함수에 TX_sensor_value 함수를 호출하도록 추가하고 TX_sensor_value 함수를 다음과 같이 추가한다.
TX_sensor_value 함수를 살펴보면 메시지의 일련번호를 메시지에 추가하기 위해 데이터에 tcnt 값을 입력하고, 온도와 습도, 또한 상태 값을 데이터에 입력하고 4장에서 설명한 메시지 전송 함수를 호출한다. 이때 메시지의 ID는 0x128이고 메시지 길이는 6인 것을 알 수 있다.


온습도 전송 시험 결과를 그림 30에 나타내었다. 결과를 보면 4.3절에서 설명한 시간 데이터 사이에 메시지 ID가 0x128인 메시지가 들어가 있으며 메시지 일련 번호는 0x004e, 온도는 0x1b(27°C), 온도 상태는 2, 습도는 0x42(66%), 습도의 상태는 2인 것을 알 수 있다.

그림 30. 온습도 데이터 전송 시험 결과

4.3.2 RX_data_process 함수
RX_data_process 함수를 다음과 같이 작성하여 추가한다.


위 코드를 살펴보면 2가지 메시지를 수신하여 처리하는데 그중 하나는 ID가 0x20인 Remote 프레임을 수신하여 온습도의 상한값과 하한값을 전송하는 것으로 되어 있고, 나머지 하나는 ID가 0x25인 데이터 프레임을 수신하여 온습도의 상한값과 하한값을 설정하는 함수로 되어 있다. 그림 31에는 Remote 프레임 수신시험을 수행한 결과를 나나내었다. 그림을 보면 중간에 메시지 ID가 0x20인 Remote 프레임을 수신하여 역시 ID가 0x20인 데이터 프레임으로 응답하는 것을 볼 수 있으며, 현재의 온도 상한값은 0x64(100°C), 하한값은 0x0a(10°C)로 설정되어 있고, 습도 상한값은 0x50)(80%), 하한값은 0x0a(10%)로 설정되어 있음을 볼 수 있다.

그림 31. Remote Frame 수신 시험

그림 32에는 온습도 상하한값 변경 시험 결과를 나타내었다. 그림의 중간에 메시지 ID0x25인 메시지가 전송되었음을 알 수 있는데 여기서 데이터를 보면 온도 상한값을 0x55(85°C), 하한값을 0x20(32°C)로 변경하라는 것이고, 습도의 상한값을 0x30)(48%), 하한값을 0x0a(10%)로 변경하라는 것이다.

그림 32. 상하한값 변경 시험

이 메시지가 전송된 후에 수신된 ID 0x128 메시지를 보면 온도와 습도는 그림 30에 나타낸 값과 같지만, 상태가 온도는 하한값 이하이기 때문에 0x01, 습도는 상한값 이상이기 때문에 상태가 0x03으로 변경되었음을 확인할 수 있다.

이 2개의 메시지를 수신하기 위해서는 4장에서 설명한 수신 규칙 등록 함수와 같이 설정하면 된다.

댓글

이 블로그의 인기 게시물