# Настройка 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="/files/TmRGFJ3Rl0pPmxsS6PSL" 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="/files/8YvM7YCvdSHhTfb5qFd4" alt=""><figcaption></figcaption></figure>

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

```
sudo reboot
```

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

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

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

<figure><img src="/files/RIrGfyiXl96PqxoOKhpQ" alt=""><figcaption></figcaption></figure>

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://voltbro.gitbook.io/vbcores/nastroika-po/nastroika-can-na-rpi.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
