# Настройка CAN на RPI

Для работы с CAN необходимо установить CAN-utils - набор полезных и удобных инструментов отладки, использующих интерфейс SocketCAN. Для установки их на Raspberry, используйте следующую команду:

```
sudo apt-get install can-utils 
```

CAN-utils содержат следующие полезные инструменты:

* **candump -** позволяет отображать, фильтровать и записывать CAN пакеты
* **canplayer -** воспроизводит записанные CAN пакеты
* **cansend -** отправляет один CAN пакет
* **cangen** - генерирует случайные пакеты
* **canbusload -** отображение текущей нагрузки на шину CAN

В данной инструкции будут рассмотрены утилиты *candump* и *cansend*, потому что ими мы и будем чаще всего пользоваться. С остальными утилитами мы предлагаем читателю ознакомиться  самостоятельно на [страничке](https://github.com/linux-can/can-utils) github.

Чтобы запустить интерфейс для работы с CAN на Raspberry вводим команду

```
sudo ip link set can0 up txqueuelen 65535 type can bitrate 1000000
```

Если у вас вышла **ошибка "Cannot find device "can0""**, сделайте следующее:

```
sudo nano /boot/firmware/config.txt
```

Если файл окажется пустым, то, возможно, у вас старая ОС.

Тогда используйте `sudo nano /boot/config.txt`

В конец открывшегося файла добавьте строчку

```
dtoverlay=seeed-can-fd-hat-v2
```

<figure><img src="https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2FYHDEyA6N8TralEimDG3x%2Fimage.png?alt=media&#x26;token=eb6aefa0-06d7-4f53-b49a-e2675b232c53" alt=""><figcaption></figcaption></figure>

Сохраните (Ctrl+S) и закройте(Ctrl+X) файл. Перезагрузите raspberry:

```
sudo reboot
```

Сообщения, получаемые и отправляемые через CAN - это некоторое количество байтов. Чтобы посмотреть что в CAN посылаются пакеты мы используем утилиту *candump:*

```
candump can0
```

Введя эту команду, мы увидим абсолютно все пакеты, передаваемые по CAN. Если нам нужно посмотреть сообщения, имеющие определенный ID, например 100, мы переводим ID в 16-ричную систему счисления (в нашем примере 100=0х64) и выполняем команду `candump can0,ID:7ff` Для ID 100 она выглядит слующим образом:

```
candump can0,064:7ff
```

Используем утилиту *cansend* для отправки сообщения (4 байта DE AD BE EF) в CAN, ID сообщения 100 (0х64):

```
cansend can0 00000064#DEADBEEF
```

Команда отключения интерфейса:

```
sudo ifconfig can0 down
```

## **CAN-FD**

Шина CAN-FD – это следующий этап развития классической шины CAN. CAN-FD обеспечивает более высокую скорость передачи данных и больший объем передаваемых данных в одном кадре. Если вы проделали все шаги по установке CAN-utils, описанные выше, ничего дополнительно устанавливать не придется. Отличаться будет только команда запуска интерфейса:

```
sudo ip link set can0 up txqueuelen 65535 type can bitrate 1000000 dbitrate 8000000 fd on
```

Далее мы будем использовать CAN-FD, с точки зрения использования утилит, ничего не поменяется. Прочитать подробнее о различиях CAN и CAN-FD можно [здесь](https://canhacker.ru/what-is-can-fd/).

Удобно, чтобы не включать интерфейс для общения с CAN-FD каждый раз, настроить автозапуск CAN-utils. Для этого создадим небольшой скрипт canup.sh в домашней дирректории и пропишем туда команду запуска CAN-FD

```
sudo nano canup.sh
#!/bin/sh
sudo ip link set can0 up txqueuelen 65535 type can bitrate 1000000 dbitrate 8000000 fd on
```

Сделаем файл исполняемым:

```
sudo chmod +x canup.sh
```

Добавим созданный скрипт в автозапуск. Чтобы запустить программу при запуске Raspberry Pi, вам просто нужно изменить файл `/etc/rc.local` на SD-карте (с Pi или путем изменения файла `/etc/rc.local` в счете `rootfs` с карты, подключенной к вашему ПК).

```
sudo nano /etc/rc.local
```

Должен открыться файл в редакторе nano. Чтобы поставить в автозапуск программу canup.sh, просто найдите строку

```
exit 0
```

в файле и добавьте командную строку, вызывающую вашу программу, ***перед*** строкой `exit:`

```
sudo bash /home/pi/canup.sh
```

<figure><img src="https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2FrHoDJEb9Z32uHMHr4Y2Z%2Fimage.png?alt=media&#x26;token=846243cd-8463-4923-b4fd-f2956637e109" alt=""><figcaption></figcaption></figure>

Сохраняем Ctrl + S и закрываем Ctrl + X файл. Перезагружаем Raspberry

```
sudo reboot
```

Полезно знать команду

```
ip -details link show can0
```

Эта команда позволяет получить информацию об интерфейсе can0. Отметим, что, если при получении и отправке сообщений не возникает никаких ошибок, то в записи об ошибках вы увидите 0, как показано ниже

<figure><img src="https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2FmuIMEnTgWPUQq3d0irA3%2Fimage.png?alt=media&#x26;token=d568e8f5-03ef-4dea-8bd4-a34acd859531" alt=""><figcaption></figcaption></figure>

В данном разделе было описано как установить CAN-utils для взаимодействия с CAN и CAN-FD на Raspberry Pi 4, а также установки включения этого интерфейса в автозапуск. Далее разберем примеры получения и отправки сообщений по CAN-FD на низком уровне с помощю Arduino.
