본문 바로가기

CAN

1. 개발환경 및 설명 방식

STM32F091RC MCU를 사용하여 실제 CAN 통신을 하는 방법을 위주로 설명을 하였고, 프로토콜의 내용은 설명 중간 중간에 삽입해 두었습니다. 이렇게 하는 이유는 CAN 프로토콜에 관해 자세히 설명되어 있는 책들이 이미 시중에 많이 나와있는 반면에, 실제로 구동해보는 내용은 찾기 어려웠기 때문입니다. CAN 프로토콜에 관해서는 특히, ‘자동차 네트워크 시스템’이라는 책을 추천드립니다. 사토 미치오라는 일본인이 쓴 책인데 CAN 프로토콜에 관해서 정말 쉽고 자세하게 설명하고 있습니다. 또 LIN과 FlexRay 통신에 대한 내용도 수록되어 있습니다. 회로에 대해 몇 개 알아볼게 있어서 관련 책을 찾다가 느낀건데 일반적으로 일본책 번역본들이 한국책보다 쉽고 자세하더라구요. 아무튼 이 글을 읽기 전에 CAN 프로토콜에 대해 전문적으로 설명하는 책이나 자료를 반드시 읽어봐야 합니다.


H/W는 STM32사의 STM32F091RC MCU를 사용한 NUCLEO-F091RC 평가보드 2개, MCP2561(CAN 트랜시버), TJA1051(CAN 트랜시버), 브래드보드를 사용하였습니다. S/W는 CAN 드라이버만 STM32사에서 제공하는 HAL 드라이버가 어떻게 동작하는지 알아보고, 나머지 페리페럴에 대해서는 HAL 드라이버를 그대로 사용하겠습니다. 그리고 저는 임베디드 공부를 할 때, 먼저 MCU를 선택하고 그 MCU 제품군의 레퍼런스 매뉴얼을 공부한 후에 HAL 드라이브 코드를 직접 분석 / 사용하여 공부했습니다. 그래서 HAL 드라이버를 여러가지 환경에서 동작시켜 보곤 했는데 대기업에서 제공하는 HAL 드라이버도 100% 완벽한 것은 아니더군요. 물론 대부분의 상황에서 잘 작동하긴 하지만, CAN HAL 드라이버를 분석하면서 발견한 몇가지 사소한 부분을 수정해 봤습니다. IDE는 keil을 사용했습니다. 종단 저항은 사용하지 않았습니다. 버스의 잡음을 제거하기 위해 사용한다는데 종단 저항을 설치했을 때 오히려 오류가 더 발생하더라구요. 버스 길이가 짧을 경우엔 오히려 없는게 더 좋다는 글을 어디선가 본 것 같습니다.


제가 STM32F 시리즈 MCU를 공부하고 있기도 했고 CAN 컨트롤러가 포함된 MCU 중 가격도 저렴해서 STM32F091RC MCU를 선택했습니다. 마우저에서 13,000원 정도에 구매할 수 있을겁니다. 그리고 2개의 CAN 트랜시버는 각각 다른 회사의 제품을 선택했습니다. 처음엔 TJA1051 트랜시버 모듈 2개를 사용했는데 VCC와 GND를 잘못 연결해서 TJA1051 트랜시버가 타버렸기 때문에, 여분으로 구매한 DIP 타입의 MCP2561을 브래드보드에 꽂아 사용했습니다. 하지만 지금 생각해보니 다른 회사의 동일한 기능을 하는 부품을 다뤄볼 수 있었기 때문에 좋은 기회가 된 것 같습니다. MCP2561 칩은 마우저에서 1,300원에 구매했고, TJA1051 모듈은 알리익스프레스에서 배송비까지 1.5달러 정도에 구매했습니다.


그림은 대부분 STM32F 시리즈의 레퍼런스 매뉴얼에 있는 그림을 가져다 수정했습니다. 제가 임베디드 공부를 처음 할 때 이 내용이 저 내용 같고 저 내용이 이 내용 같아서 많이 힘들었습니다. 그래서 가독성을 높이기 위해서 그림에 나와있는 색깔을 설명하는 부분의 글씨 색깔과 연동시켰습니다.


can stm32f091 tja1051 mcp2561


tja1051 can


mcp2561


tja1051 can high low breadboard