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

 3. RL78/F13 CAN Module

본 절에서는 르네사스사의 MCU인 RL78/F13의 CAN 모듈의 사용법과 설정하는 과정에 대해 설명한다.

3.1 CAN 모듈 개요

RL78/F13는 ISO11898-1 사양에 맞는 CAN 모듈 하나를 제공한다. 그림 9에는 CAN 모듈 블록 다이어그램을 나타냈으며, 표는 CAN 모듈의 사양을 나타내었다.[3]

그림 9. CAN 모듈 블록 다이어그램

표 4. CAN 모듈 사양


3.2 환경 설정

본 절에서는 타겟보드의 환경을 설정하는 과정을 살펴본다. 르네사스 사의 개발환경(CS+)을 이용한 상세한 환경 설정 과정은 참고문헌[4]를 참조하면 되고, 여기에서는 CAN 모듈을 구동하기 위해 특별히 유의해야 할 것만 설명한다.

먼저 클럭 설정은 타겟보드의 외부 클럭 X1이 4MHz의 발진기를 갖고 있기 때문에 4MHz로 설정하여 주면 되고, High-speed OCO clock을 24MHz로 설정하여야 한다.(그림 10 참조)

그림 10. CAN 모듈 사용을 위한 Clock 설정

그리고 그림 2에 나타낸 회로도를 살펴보면, CAN 트랜시버의 TX 핀이 MCU의 P10에 연결되어 있고, RX 핀은 MCU의 P11, MCU의 P12가 트랜시버의 S 핀에 연결되어 있다. S 핀은 트랜시버의 제어 신호로 LOW가 입력되면 정상 통신 모드이고, HIGH가 되면 Silence Mode로 CAN 버스에 아무런 신호를 전달하지 않기 위한 제어 신호이다. 따라서 P10은 출력, P11은 입력, P12는 출력으로 설정하여야 하며, P10은 기본 출력을 HIGH로, P12는 기본 출력은 LOW로 설정하여야 한다.(그림 11참조)

그림 11. Port1 설정

3.3 CAN 모듈 구동 소프트웨어

본 절에서는 CAN 모듈을 구동하기 위한 초기화과정, 메시지 송신 모듈, 메시지 수신 모듈 소프트웨어에 대해 살펴본다.


3.3.1 CAN 모듈 초기화

CAN 모듈 초기화 프로그램은 다음과 같다.



먼저 CAN 모듈을 활성화하기 위해 PER2(Peripheral Enable Registers 2) 레지스터의 CAN0EN 비트를 1로 설정한다. PER2 레지스터의 형식은 그림 14와 같고, CAN0EN 비트를 1로 설정하여야 CAN 모듈에 클럭이 공급되면서 CAN 모듈이 활성화 된다.

그림 14. PER2 레지스터의 형식

[참고] 이 프로그램에서 사용된 레지스터 명칭은 르네사스 사의 CS+ 개발환경을 사용하면 iodefine.h 파일에 모두 정의 되어 있으므로 그대로 사용하면 된다.

다음으로 CAN 모듈에서 사용하기 위한 클럭 소스를 설정하기 위해 CANCKSEL 레지스터를 설정한다. CANCKSEL 레지스터의 형식은 그림 15와 같고, CAN0MCKE를 1로 설정하여 X1 클럭이 CAN 모듈에 공급되도록 설정하여 준다.


그림 15. CANCKSEL 레지스터 형상

이제 CAN 모듈의 초기화가 완료되었는지 확인하기 위해 GSTS(CAN Global Status Register) 레지스터를 확인하여 Global RAM이 초기화 완료될 때까지 기다린다. 즉 그림 16에 나타낸 GSTS 레지스터에서 GRAM INIT 비트가 0이 될 때까지 기다린다.


그림 16. GSTS 레지스터 형식

Global RAM의 초기화가 완료되면 Global Reset 모드로 전환하기 위해 GCTRL(CAN Global Control Register) 레지스터를 설정한다. GCTRL 레지스터의 형식은 그림 17에 나타내었으며 GSLPR 비트를 0으로 설정하면 Global Reset 모드로 전환된다. CAN 모듈의 Global Mode는 Stop Mode, Reset Mode, Operating Mode, Test Mode 등이 있으며 CAN 모듈의 초기화 과정은 모두 Reset 모드에서 설정하여야 한다. (자세한 모드의 설명 및 상태 천이는 RL78 MCU 하드웨어 사용설명서 참조)


그림 17. GCTRL 레지스터 형식

Global Reset 모드로 천이가 완료되면 이제 CAN Channel 모드를 Reset 모드로 전환하기 위해 C0CTRL(CAN I Control Register L) 레지스터(그림 18 참조)의 CSLPR 비트를 0으로 설정한다.


그림 18/ C0CTRL 레지스터 형식

CAN Channel 모드가 Reset 모드로 천이되었는지 확인한 뒤, CAN 모듈의 동작환경을 설정하기 위해 GCFG(CAN Global Configuration Register) 레지스터를 설정한다. GCFG 레지스터는 여러 가지 기능을 설정하도록 되어 있는데 여기서는 Time Stamp의 Clock을 CAN Clock을 사용하는 것으로 GCFGL을 설정하였고, 전송 간격타이머를 설정하였다.

그림 19. GCFGL 레지스터 형식

그림 20. GCFGH 레지스터 형식

CAN Channel 운용환경을 설정하기 위해 C0CFG(CAN Channel I Configuration Register)을 설정한다. C0CFGH 레지스터는 통신 속도를 설정하기 위한 레지스터로 SJW, TSEG2 TSEG1을 설정한다. 여기서는 SJW는 0, TSEG2는 5, TSEG1은 6으로 설정하였으며, 이는 CAN 통신 속도를 1Mbps로 설정하는 것이다.

그림 21. C0CFGL 레지스터 형식

그림 22. C0CFGH 레지스터 형식


다음은 수신 규칙을 설정하고, 송수신 버퍼를 설정하는데 이는 다음절에서 설명한다.
그리고, Global 인터럽트와 Channel 인터럽트를 설정하고, Global 모드와 Channel 모드를 Operation 모드로 설정한 뒤, 수신 FIFO 0와 1을 활성화 한다.
그리고, 그림 23에 나타낸 인터럽트 마스크 플래그를 설정한다. 여기서는 CAN0 Wakeup 인터럽트 마스크는 비활성화 상태로 설정하고, CAN Global Error Mask, CAN Global Receive Frame Mask, CAN Channel 0 송신 Mask 등 나머지 Mask는 활성화 상태로 설정한다.

그림 23. Interrupt Mask Flag Register 2 형식

3.3.2 수신 규칙 설정

수신 규칙을 설정하는 프로그램은 다음과 같다.


수신 규칙은 최대 16개를 설정할 수 있으며, 먼저 GAFLCFG 레지스터에 등록하기 위한 수신 규칙 수를 설정한다. 여기서는 2개로 설정하였다.
자세한 수신 규칙을 설정하기 위해서는 MCU의 CAN RAM을 설정하여야 하는데 RAM에 데이터를 쓰기 위해서는 GRWCR 레지스터를 0으로 설정하고 데이터를 써야 한다.
수신 규칙을 설정하는 레지스터는 GAFLIDLn, GAFLIDHn, GAFLMLn, GAFLMHn, GAFLPLn, GAFLPHn 있으며 여기서 n은 0~15의 값을 갖는다. 
GAFLIDLn은 수신 ID 값을 설정하는 레지스터이고, GAFLIDHn은 수신 프레임이 Remote 프레임인지, Data 프레임인지 그리고 Standard 프레임인지, Extended 프레임인지와 Extended ID를 설정하는 레지스터이다. GAFLMLn과 GAFLMHn는 GAFLIDLn과 GAFLIDHn에 등록한 ID를 검사를 할 것인지 아닌지를 정하는 레지스터이고 1로 세트 된 비트는 비교 검사를 수행하는 비트이고, 0으로 세트 된 비트는 검사를 수행하지 않는 비트로 등록된다. GAFLPLn는 필터를 통과한 메시지를 저장하는 버퍼를 지정하는 것으로 버퍼는 4가지 종류가 있는데, 여기서는 수신 FIFO0을 사용하는 것으로 지정하였다. GAFLPHn는 여러 가지 설정에 관여하는데 여기서는 DLC(Data Length Code)에대한 검사를 수행하지 않는 것으로 설정하였다. DLC 검사를 하는 경우에는 등록된 DLC보다 큰 값을 갖는 메시지만 필터를 통과하여 버퍼에 저장된다.

3.3.3 버퍼 설정함수
버퍼를 설정하기 위한 프로그램은 다음과 같다.
먼저 RMNB 레지스터에 수신 버퍼로 사용하기 위한 수신 FIFO의 크기를 설정한다. 여기서는 FIFO의 크기를 16개로 설정하였다. RFCCn은 수신 FIFO의 인터럽트 레벨을 설정하는 레지스터이고 n은 0과 1 두값을 갖는다. RFCC0는 수신 FIFO0에 대해 설정하는 것이고, RFCC1은 수신 FIFO1에 대해 설정하는 것이다. 여기서는 FIFO에 메시지가 입력되면 인터럽트를 발생시키는 것으로 설정하였다.
CFCCL0, CFCCH0는 송수신 FIFO를 어떻게 사용할 것인지를 설정하는 레지스터로 여기서는 사용하지 않는 것으로 설정하였다.
THLCC0는 메시지 송수신 기록을 남기는 버퍼를 어떻게 사용할 것인지를 설정하는 레지스터로 여기서는 사용하지 않는 것으로 설정하였다.

3.3.4 인터럽트 처리 함수
인터럽트 처리 함수의 프로그램은 다음과 같다.

먼저 인터럽트 벡터 6개에 대해 서비스 루틴 함수를 등록하였다. 인터럽트 소스는 Channel Error, Channel Wake Up, Channel Receive, Channel Transmit, Global Error, Global Receive 등의 6개가 있어서 모두 등록하였고, 각각의 서비스 루틴에 대해 등록하였다. 그런데 시험을 해보니 Channel Wake Up 인터럽트는 메시지가 송수신 될 때마다 발생하여서 앞절의 초기화 과정에서 마스크를 시켜 발생하지 않게 하였으며, 메시지 송수신 시험을 해보니 Global Receive 인터럽트만 정상적으로 발생하여 처리 루틴에서 데이터 수신하는 함수를 호출하도록 설정하였다. 나머지 인터럽트는 왜 발생하지 않는지 검토가 더 필요하다.

3.3.5 메시지 송신 함수
메시지 송신 함수는 다음과 같다.

송신 함수는 송신 버퍼 4개중에 버퍼 0를 사용하여 메시지를 송신하는 절차를 나타내었다. 먼저 이전에 송신하고 있는 메시지가 있는지 TMSTS0 레지스터를 확인하여 상태를 확인하고, 송신 버퍼에 데이터를 써주기 위해 GRWCR 레지스터를 1로 설정한뒤, TMIDL0와 TMIDH0 레지스터에 ID를 써준다. 여기서는 Standard 프레임의 ID를 사용하는 것으로 설정하였고, 데이터 프레임임을 나타내는 비트를 0으로 설정하여 데이터 프레임만 전송하는 절차를 나타내었다. DLC는 TMPTR0 레지스터의 비트 15~12에 써준다. 그리고, 송신하고자 하는 데이터는 TMDF00, TMDF10, TMDF20, TMDF30에 써준다. 다시 GEWCR에 0을 설정하여 메모리에 써주는 모드에서 나온뒤 TMC0 레지스터의 비트에 전송 요구를 세트하여 메시지 전송요구를 하고 송신버퍼 상태를 확인하여 메시지 전송이 완료되었는지 검사한 뒤 전송이 완료되면 전송이 완료된 것을 세팅함으로써 메시지 전송을 완료한다.

3.3.6 메시지 수신 함수
메시지 수신 함수는 다음과 같다.
이 함수에서는 수신 FIFO0와 수신 FIFO1에 메시지가 수신되었을 때 처리하는 함수를 보여 주고 있다. 먼저 RFSTSn을 검사하여 수신 FIFOn에 저장되어 있는 메시지의 개수를 확인하고 해당 FIFO의 메시지가 1개 이상 있으면 ID와 DLC 그리고 데이터 8바이트를 읽고 메시지를 처리하는 함수를 호출 하는 것으로 구성되어 있다. 여기서 데이터를 읽은 뒤에서 RFPCTRn 레지스터에 0x00ff를 써주어야 다음 FIFO로 넘어가는 것을 주의하여야 한다. 여기서 n은 0 또는 1이다.

댓글

이 블로그의 인기 게시물