필자가 이번에 ESP32에서 CANFD를 사용하려고 했는데. 루프백 까지만 되고, 실제 통신이 되지 않았다. 기존에사용하던 MCP2525등을 붙혀서 테스트를 하려다가 이왕 하는거 CANFD를 사용하는게 좀더 좋을 것 같아서 말이다.
어쨋거나 실제 통신이 되지 않아서 라즈베리파이에서 이 모듈이 정상적인지 아닌지 판단을 해야되는 상황에 이르러 테스트를 진행했다. 펌웨어로 동작시키는 것 보다는 훨씬 편하니까 말이다. 만약, 정상 동작이 된다면 다시 ESP32에 붙혀봐야겠다. 이런저런 것들을 해볼수 있을것 같아 기대가 크다.
자 그러면 라즈베리파이에서 정상동작을 하는지 확인해보자.
1. 준비물
라즈베리파이 2대 물론, nCS로 나누면 1개만 있어도 될것 같지만, 확실한 테스트를 위해서 2개를 준비했다. 그리고 알리에서 구매한 CAN-FD 모듈 2대씩 준비하고, 점퍼케이블은 전원포함하여 라즈베리파이당 7개가 필요하다. 그리고 양 CAN을 연결하기 위한 연선 3줄을 준비하면 되겠다.
1.1. 기본준비물
1) 라즈베리파이 2대
2) 라즈베리파이 전원 2개
3) 기타 필요한 것들...
1.2. CANFD 관련
1) CANFD 모듈 2개
2) 라즈베리파이 연결용 점퍼 14개(2세트 분량, 가능하면 동일색상 페어로 준비)
3) CAN 통신케이블 3개 (H, L, GND)
2. 모듈 연결정보
2.1. 모듈 정보
다음은 구매한 모듈의 정보이다. MCP2518FD로 검색하면 저가형은 대부분 이 제품이 나오는 것같다. 가격은.. 흉폭스럽게 11000원이 넘는다. 큼.. 테스트 하려면 2개는 사야되니까...
1) 모듈형상 및 가격

2) 얻을 수 있는 정보
얻을 수 잇는 정보는 핀 맵 정도이다.

2.2. 라즈베리파이와 모듈의 연결
라즈베리파이와 모듈은 다음과 같이 연결 하였다. 아쉽게도 구매한 모듈의 트랜시버는 5v로 동작하고, mcp2518fd 는 3.3v로 동작하기 때문에 전원을 별도로 넣어주어야 한다. 만약, 아두이노 같은 5v 전원을 사용하는 MCU등에서는 모듈의 전원공급핀(필자가 구매한 모듈의 경우 P2)는 쇼트 시키지 않아야 한다.

잘 연결했다면 CAN모듈의 입출력 터미널에서 LED가 점등이 되었다. ESP32에서 진행할 때 5V를 따로 공급하지 않아서 문제가 있었던 것 같다. 테스트 끝나면 다시 해봐야겠다.
2.3. CANFD 모듈간 연결
CANFD 모듈과 CAN 모듈은 연선을 사용하여 H/L/GND를 모두 연결해준다. 그리고 1:1로 연결하여 테스트를 진행하는 상황이면 짧은 거리면 크게 문제가 되지 않을 수 있지만 종단저항 핀(P3)를 쇼트 시켜주어야 한다.

3. 라즈베리파이 설정
라즈베리파이는 라즈베리파이 OS를 적당히설치하면 된다. 테스트를 위한 장치 2대 모두 업데이트 해두도록 하자.
3.1. 기본 업데이트
기본적인 업데이트는 해주도록 하자.
1) 업데이트 내용확인
# sudo apt update
2) 업그레이드 할것 같으면 업그레이드
# sudo apt upgrade
3.2. CAN/CANFD 관련 도구 설치
캔 모듈을 통해 간단히 테스트하기 위한 도구를 설치한다.
# sudo apt install can-utils vim
3.3. CAN 사용을 위한 라즈베리파이 환경설정
대부분 우리가 구매할 수 있는 CAN 모듈은 SPI 인터페이스를 사용한다. 따라서 SPI를 활성화 하고, CAN에 대한 환경을 설정해야 한다.
1) SPI 설정
SPI를 설정하려면, 터미널을 실행하거나 라즈베리파이 메뉴에서 raspberry pi configuration 항목을 선택하여 SPI를 On 시키면 된다. 필자가 오랜만에 확인해보니 메뉴 찾기가 귀찮아서 그냥 터미널에서 진행하였다.
# sudo raspi-config
설정 화면이 표시되면 Interface Option > SPI 를 선택하고 SPI를 Enable로 설정한다.

리부팅을 해도 되지만, 우선 수정할게 더 있으니 편하실 대로 하시고, 터미널에서 부트 설정을 수정해 주도록 하자.
2) CAN 모듈 설정
라즈베리파이에 CANFD를 알아차릴 수 있도록 설정을 추가해 주도록 하자. 예전에는 /boot/config.txt 였지만 현재에는 /boot/fimrware/config.txt를 수정해야된다. 바뀐지 1년은 넘은것 같은데... 오랜만에 해보는 독자도 있을테니, 물론 /boot/config.txt를 열면 딴데가서 수정하라는 내용이 표시되어있다. 수정 할 파일을 열어서 앞서 진행결과로 추가된 dtparam=spi=on 아래에 아래의 값을 입력한다.
dtoverlay라고 되어있으니 이 파일은 기존 라즈베리파이의 dtb에 특정 옵션을 추가하기 위해서 사용되는 파일임을 생각해볼수 있겠다. 뭐 중요한 것은 아니고, 그 아래 아래의 내용을 넣어주는데, 설명은 다음과 같다.
사용하는 칩은 mcp251xfd 칩이고, SPI0(cs도 0)이고 오실레이터는 필자가 확인한 바로는 H20.00으로 적혀있어, 20Mhz가 아닐까해서 해봤는데 잘되는걸로 봐서 맞는거 같다. 그리고 20Mhz까지 사용할 수 있을것 같은데, 필자는 점퍼 케이블을 사용했으니 안전빵으로 SPI는 10Mhz 로 설정해두었다.
dtoverlay=mcp251xfd,spi0-0,interrupt=25,oscillator=20000000,spi-max-frequency=10000000

저장하고 나와서 이제 리부팅을 하면 된다. 이 모듈을 항상 사용할 것이라면, 부트 스크립트에 넣어서 항상 초기화 되게 만들면 되고, 필자는 굳이 그럴필욘 없어서 그냥 커맨드를 입력하고 쓰기로 했다. 왜냐면 ESP32에서 사용할 녀석들이라 만ㄹ이다.
4. 통신 테스트
자 이제 사용하고자 하는 두가지 모듈을 동일하게 설정하여 테스트를 진행하면 된다. 필자가 귀차니즘으로 하나만 표시하더라도 라즈베리파이 둘 모두 동일하게 테스트 해주면 되겠다.
4.1. 링크업
리눅스에서는 CAN도 네트워크와 동일하게 처리되기 때문에 ip 명령으로 설정하고, ifconfig 명령으로 상태를 확인할 수 있다. 물론, can-utils를 더 많이 사용하겠지만 말이다.
기존에 링크를 했었다면, CAN0의 링크를 내리고, CANFD로 설정한다. 그리고 링크를 붙히면 되겠다. bitrate와 dbitrate는 테스트를 진행하면서 어느정도 까지 되는지 직접 설정해서 결과를 얻기를 바란다.
# sudo ip link set can0 down
# sudo ip link set can0 type can bitrate 500000 dbitrate 1000000 fd on
# sudo ip link set can0 up
4.2. 테스트
라즈베리파이 두 모델에서 테스트를 진행하자. 터미널 2개를 띄우고 편의상 좌, 우 터미널이라 하겠다.
1) CAN-FD의 데이터 형식
(1) 데이터 구조
예전에 cansend를 써서 테스트를 할 때는 <CAN ID>#[DATA(1~8Byte)] 형식으로 보냈다. CAN-FD에서는 다음과 같은 형식으로 데이터를 보내야 한다. DLC표기상 0~F까지로 표시할 수 있다.
<CAN_ID>##<Flag>[Data(1~8, 12(9), 16(A), 20(B), 24(C), 32(D), 48(E), 64(F) Bytes)]
따라서 데이터를 몇바이트를 통해 통신을 할 지 선택해서 통신 프로그램을 만들어야 된다.
(2) 플래그
0 - 저속 : 중재구간과 같은 속도로 데이터를 송수신하여 저속 동작
1 - BRS(Bit Rate Switch) : 중재구간과 데이터구간의 비트레이트를 다르게 사용하여 고속 동작
2 - Error Passive : 에러 상태 표시
3 - BRS + Error Passive : FD에서 고속으로 동작하고 에러상태 표시
2) 첫번째 라즈베리파이 좌측 터미널
CAN버스에 들어오는 모든 데이터를 출력하기 위해서 dump를 진행한다.
# candump can0
3) 첫번째 라즈베리파이 우측 터미널
CAN버스를 통해서 데이터를 송신하자.
# cansend can0 100##111223344556677888877665544332211
위의 명령을 실행하면 실행한쪽 좌측 터미널 candump에 보낸 데이터가 출력되고, 두번째 라즈베리파이의 candump에도 먼저보낸 데이터가 출력된다.
4) 두번째 라즈베리파이 우측 터미널에서 동일하게 입력해준다.
# cansend can0 200##188776655443322111122334455667788
위의 명령이 실행되면 두번째 라즈베리파이 좌측 터미널에는 우측터미널에서 입력한 데이터가 표시되고 첫번째 라즈베리파이 좌측 dump 터미널에 두번째 라즈베리파이가 보낸 데이터가 출력된다.
결과는 아래와 같다.
4.3. 결과
1) 라즈베리파이 1번의 좌, 우 터미널

2) 라즈베리파이 2번의 좌우 터미널

이로서 정상적으로 통신이 되는 것을 확인할 수 있다.
5. 기타 (조금 중요 ***)
만약 클래식 CAN으로만 사용하고 싶다면 다음과 같이 설정하여 사용할 수 있다.
5.1. 장치 설정
장치를 다음과 같이 설정하여 사용한다.
# sudo ip link set can0 down
# sudo ip link set can0 type can bitrate 500000 fd off
# sudo ip link set can0 up
두개의 라즈베리를 모두 동일하게 하고 명령을 존송하면 양쪽 candump에 송수신한 모든 데이터가 표시된다. 그런데 말이다. 만약 한쪽은 FD이고 다른 한쪽은 Classic이면 어떻게 될까?
5.2. 두 라즈베리파이중 하나만 Classic CAN인경우
두 장치 모두가 아닌 하나의 장치만 Classic CAN으로 설정을 하고, 동일하게 터미널 2개를 실행하여 dump와 send로 전송을 하면, CANFD에는 정상적으로 데이터가 수신되지만, 반대로 CANFD에서 CAN형식 또는 CANFD 형식으로 데이터를 보내면, Classic CAN으로 설정된 장치에는 데이터가 수신되지 않는다. 보통 우리는 이런것을 하위호환 이라고 이야기 한다.
직접한번 해보시기 바란다.




최근댓글