STM32 & Raspberry Pi CAN 통신

이전 포스트에서 MCP2515 CAN 컨트롤러와 TJA1050 트랜시버가 있는 CAN 모듈을 라즈베리파이에서 사용하는 방법은 간단히 정리하였다. 이것을 사용하여 STM32F429 데모보드와 CAN 통신을 해 보려고 한다.

 

MCP2515 & TJA1050 모듈 설정

CAN 모듈을 라즈베리파이로 검증하기 위해 CAN 컨트롤러 MCP2515와 트랜시버 TJA1050가 포함된 CAN BUS 모듈 구입하여, 라즈베리파이에 아래 이미지와 같이 연결하였다. 라즈베리파이와 CAN 버스 모듈을

memories.tistory.com

STM32은 내장 CAN 컨트롤러가 내장되어 있지만 CAN 트랜시버가 없으므로 CAN 트랜시버 모듈을 따로 구입해야 하며, 이것을 사용하여 아래 이미지와 같이 STM32 & Raspberry Pi를 CAN 버스에 연결하여 CAN 통신을 할 수 있다.

참고로, 라즈베리파이에서는 SocketCAN을 사용하여 CAN 통신을 하며, can-utils 패키지를 설치하여 CAN 버스의 raw data를 읽거나 전달할 수 있으며, 네트워크 분석도구인 WireShark으로도 가능하다.

 

STM32에서 CAN 사용 방법은 아래 유튜브 영상을 보고 예제코드를 따라하는 방식으로 해보았다. CAN 통신에서 가장 중요한 부분은 디바이스간 통신 속도가 매우 중요하며, 이것을 잘못 설정하거나 서로 맞지 않을 경우 CAN 버스에서 송수신하는 데이터에 문제가 발생한다.

위 강의에서 통신속도 설정 부분은 반드시 이해해야 한다. CAN 버스에 연결된 노드와 데이터를 송수신하기 위해서는 이것을 반드시 맞춰야 한다. 기존 코드에서 테스트를 위해 기본 클럭을 바꿔서 테스트한 코드로 CAN 테스트를 했다가 몇 시간 삽질하고 기본 클럭으로 롤백한 후 데이터가 정상적으로 송수신되는 것을 확인하였다.

STM32F429ZI의 APB1 클럭을 16MHz 기본설정 값 그대로 사용하고, 이것을 기준으로 CAN 통신의 비트타임을 설정하였다. 100Kbps를 사용하기 위해 Prescaler=8 및 BS1=14, BS2=5 설정하여 Sample Point 값을 75%로 설정하였다. 테스트 코드는 아래 GitHub에서 받을 수 있다.

 

highgon2/STM32

STM32 TestCode. Contribute to highgon2/STM32 development by creating an account on GitHub.

github.com

STM32F429 데모보드의 Blue key를 입력하면 STM32에서 라즈베리파이로 CAN 데이터를 전달하고 라즈베리파이에서 STM32로 데이터를 전달하는 것은 CAN Utils을 사용하였으며, 정상적으로 처리되었다면 아래 이미지와 같이 실행 결과를 확인할 수 있다.

라즈베리파이에서 CAN 통신 속도를 설정하려면 아래 명령어를 사용하여 변경이 가능하다. 만약 CAN 디바이스가 이미 활성화되어 있다면 아래 명령어를 사용하여 비활성화 시킬 수 있다.

$ sudo ifconfig can0 down

CAN 디바이스가 비활성화 된 상태에서 CAN 통신속도로 변경하려면 아래의 명령어를 변경이 가능하다.

$ sudo ip link set can0 up type can bitrate <your bps>

참고로, Raspberry Pi에 WireShark을 설치하여 CAN Bus의 raw data를 아래 이미지와 같이 확인할 수 있다.

CAN 통신속도 설정을 잘못하면, 데이터 송수신 인터럽트는 발생하나 잘못된 데이터가 수신되기 때문에 클럭 및 CAN 통신속도를 다시 살펴봐야 한다.