CAN은 Controller Area Network의 약자로 자동차 내에서 ECU간의 통신을 위한 목적으로 개발되었다.
CAN 이전에는 1:1로 연결되는 통신 방식을 많이 사용하였는데 기술의 고도화가 진행되면서 차량 내에 장착되는 센서나 제어모듈등의 전장부품(ECU)이 계속 증가하게 되었고 그에따라 point to point방식의 통신으로는 복잡한 배선, 공간, 무게를 감당하기가 어려워지게된다. 그래서 point to point방식이 아닌 데이터 BUS 시스템 방식의 통신을 개발하게 되었다. 최근에는 자동차 분야 뿐만 아니라 자동화분야 및 의료, 방산등 다양한 산업분야에서 사용되고 있다.
<CAN으로 구성되지 않은 경우과 CAN으로 구성된 시스템>
CAN 데이터 버스 시스템은 최소한 2개의 노드(node), CAN-low 배선, CAN-high 배선, 그리고 최소한 2개의 터미널 저항(terminal resistor)으로 구성된다. 버스 상의 각 노드들은 모든 메시지를 확인하고 해당 메시지가 자신과 관련된 것인지 필터링되어야 할 지 여부를 결정한다. 또한 모든 메시지는 우선 순위가 있으므로 두 개의 노드가 동시에 메시지를 전송할 경우, 우선 순위가 높은 메시지가 먼저 전송되고 낮은 우선 순위의 메시지는 전송이 연기된다.
이렇게 메세지들의 식별과 우선순위를 결정짓는 요소가 CAN ID (Identifier)인데, 11 비트로 설계된 표준 CAN(2.0 A)과 29비트로 이뤄진 확장 CAN(2.0B)이 있다.
STM32F103에 있는 CAN 기능을 하나씩 살펴보며 사용해 보고자 한다.
STM32F103은 위에 잠깐 설명한 CAN protocol version 2.0 A, B 를 모두 지원하며 최대 1 Mbit/s의 속도로 통신 할 수 있다.
아래 그림은 STM32F103 레퍼런스 매뉴얼에 나온 그림인데 CAN 통신의 개념과 구조를 잘 보여주고 있다.
STM32F103은 CAN Controller를 포함하고 있으며 MCU Application 부분에서 실제 CAN 메세지를 이용해 필요한 일들을 할것이다.
그림에서 CAN Transceiver는 CAN 버스를 구성하거나 CAN 버스에 연결되어 통신을 제어하므로써 메세지를 보내고 수신하는 역할을 담당하게 된다.
STM32F103에는 포함되어 있지않기 때문에 다른 장치(node)와 통신하기 위해선 필수적으로 있어야하는 부분이다. 하지만 이 글에서는 CAN에 대한 기본 개념과 Loop Back 모드로 간단한 테스트를 할 것이므로 당장 필요치는 않다.
<CAN Transceiver 모듈 - 저렴한 가격으로 쉽게 구매 할 수 있다.>
Loop Back 모드
<Loop back mode>
STM32F103은 CAN 통신 테스트를 위해서 Loop Back모드를 지원하는데, 이 모드는 외부 메세지를 차단하고 오직 자신이 송출하는 메세지만을 수신하도록 하는 것으로, 메세지를 검증하기 위한 Selt-test 및 debug용도로 활용하면 좋은 모드이다.
CAN bit timing register (CAN_BTR)
그렇다면 Loop Back모드로 사용하기위해 어떤 준비가 필요할까. Loop Back 모드를 사용하기 위해서는 CAN bit timing register (CAN_BTR)의 30번째(LBKM) 비트에 1값을 써줘야 한다. 반대로 0이 설정되면 Loop Back Mode를 사용하지 않는다.
아래 그림에 있는 STM32F103의 PIN정보를 살펴보면 CAN의 경우 PA11, PA12 에 지정된 것을 볼 수 있다. 다만 이 PIN이 CAN을 위해 단독으로 쓰이진 않고 다른 기능과 중복되어 있는데, 이 PIN으로 동시에 여러 기능을 사용할 수 없다는 의미이다.
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
» | STM32와 CAN(Controller Area Network) Loop Back | makersweb | 2017.01.23 | 6094 |
12 | 윈도우10에서 Prolific USB to Serial 드라이버 인식문제 | makersweb | 2016.01.24 | 23607 |
11 | AVRISP mkII 펌웨어 업그레이드 | makersweb | 2015.07.22 | 7620 |
10 | 이클립스에서 IAR프로젝트 사용방법 | makersweb | 2015.07.09 | 9340 |
9 | JFlashARM으로 MCU에 bin(바이너리)다운로드 | makersweb | 2015.06.07 | 4998 |
8 | AVR(AT90USB162)을 USB to Serial 로 이용하기 | makersweb | 2015.02.14 | 5379 |
7 | 실시간 운영 체제 또는 RTOS(Real Time Operating System) | pjk | 2014.12.02 | 6496 |
6 | 폴링(Polling), 인터럽트(Interrupt), DMA(Direct Memory Access) | pjk | 2014.10.24 | 6654 |
5 | 부트로더의 start.S 분석 | makersweb | 2014.03.23 | 4263 |
4 | 임베디드 시스템 개발 환경 선택 | makersweb | 2014.03.05 | 4129 |
3 | GNU C 레퍼런스 메뉴얼 - 부록 D | makersweb | 2014.02.28 | 5 |
2 | printk() | makersweb | 2014.02.27 | 5657 |
1 | [Uboot 명령어 및 환경 변수 요약]U-Boot에 Command 및 Parameter에 대한 설명 | pjk | 2014.01.09 | 11433 |