В этой статье я хочу поделиться своим опытом настройки подключения canbus модуля с контроллером MCP2515 к одноплатнику OrangePi 4 Pro. Дальнейшее описание основано на экспериментировании, общении с чат-ботами, и изучении руководства пользователя OrangePi_4_Pro_A733_User Manual_v1.4
Как известно в экосистеме малинки присутствует множество различных шилдов, и canbus не является исключением. На просторах сети достаточно статей на эту тему. Например здесь описано, как подружить MCP2515 CAN Bus Module с Raspberry pi zero. В нашем случае эта статья также будет полезной. Orange pi как и Raspberry GPIO оперируют 3.3V. А на MCP2515-модуле находится трансивер TJA1050, которому нужно подавать 5V. Есть уже готовые решения, но мы не ищем легкого пути, иначе бы и эта статья не появилась бы. Но основная проблема интеграции canbus-контроллера с OrangePi 4 Pro кроется в отсутствии скомпилированных драйверов для canbus в Orange pi OS для чипа Allwinner A733.
Доступно про протокол CAN можно почитать, например, в этой статье или более основательно в стандарте ИСО 11898-1.
Подготовка модуля

Для совместимости уровней напряжения GPIO с модулем необходимо заменить can-трансивер TJA1050 на аналогичный по корпусу, функционалу и распиновке, но с напряжением 3.3V. В радиомагазине был приобретен трансивер MAX3051ESA.
С помощью паяльного фена выпаивается микросхема с платы и устанавливается новый трансивер.
Подключение модуля

MCP2515 | Orange Pi 4 Pro |
|---|---|
VCC | 3.3V |
GND | GND |
SCLK | PE1 |
MOSI | PE2 |
MISO | PE3 |
CS | SPI3.0 |
INT | PD23 |

Ранее был куплен GPIO шилд для Raspberry, к нему перемычками подключается модуль MCP2515, согласно таблице выше. Смысл этого шилда в том, что его можно быстро подключить и обратно снять с гребенки как на Orange pi, так и на Raspberry pi. На фото показана дополнительная кросс-платка с разъемом DB9, но это совсем не обязательно, и используется только если необходимо подключиться кабелем DB9 - OBD2. can-шина представлена в виде скрученной бело-синей пары проводов. Справа сверху - Arduino Uno R3 плата с ELE CAN-BUS шилдом, а снизу Raspberry pi zero w c Ethernet и RS485 CAN HAT шилдами. На RS485 CAN HAT терминирующий резистор 120 Ом отключен.
Компилирование драйверов
В дальнейшем речь будет идти об операционной системе Ubuntu Jammy, т.к. она является одной из трех официально представленной для Orange Pi 4 Pro.
Для установки и настройки драйвера CAN-шины MCP2515 на Orange Pi 4 Pro (SoC Allwinner A733) под управлением Ubuntu Jammy необходимо выполнить определенные шаги, так как в официальном образе поддержка этого контроллера по умолчанию не активирована.
Вначале я решил попробовать собрать модули из репозитория orangepi-xunlong. Забегая наперед, скажу, что этот метод не сработал.
клонирование исходного код ядра (ветка для A733):
git clone --depth 1 -b orange-pi-5.15-sun60iw2https://github.com/orangepi-xunlong/linux-orangepi.настройка конфигурацию: Запустите
make menuconfigи активируйте следующие параметры:
◦CONFIG_CAN=y
◦CONFIG_CAN_RAW=y
◦CONFIG_CAN_DEV=y
◦CONFIG_CAN_MCP251X=m(собрать как модуль).
Основная проблема подхода клонирования репозитория linux-orangepiоказалось в том, что после изменения параметров конфигурации, версия ядра в конфигурации становится 5.15.147+ вместо необходимой на момент написания статьи 5.15.147-sun60iw2. И после компиляции и активировании модулей драйверов в системном логе будет такая ошибка:
orangepi@orangepi4pro:~$ sudo dmesg | grep mcp [ 7.618348] aicbt_patch_info_unpack memcpy_len:4 [ 8.153183] mcp251x: version magic '5.15.147+ SMP preempt mod_unload aarch64' should be '5.15.147-sun60iw2 SMP preempt mod_unload aarch64'
version magic. Ядро Linux крайне строго относится к совпадению версий, и имеет суффикс -sun60iw2, а скомпилированный модуль получил суффикс +.
Вторая проблема - не достаточно корректная рекомендация по активированию модулей. Не буду подробно останавливаться на всех "граблях" этого метода. Возможно те, кто глубоко знаком с особенностями компиляции, меня поправят и объяснят, как правильно можно настроить данную сборку.
Настройка kernel package
Решение нашлось в официальном руководстве OrangePi_4_Pro_A733_User Manual_v1.4 Раздел 4. Linux SDK - orangepi-build usage instructions. Этот подход оказался рабочим с первого раза. Но пришлось скомпилировать ядро Ubuntu jammy, а затем установить его. Зато can-bus драйвера автоматически расположились как надо.
В User Manual рекомендуют использовать Ubuntu 22.04 для компиляции, в моем случае вся работа выполнялась на самом Orange Pi 4 Pro. Компиляция заняла где-то чуть меньше часа времени. Orange Pi без принудительного охлаждения, только радиатор на процессоре. Температуру во время компиляции не мерял, радиатор был горячий, но компьютер справился с задачей.
Далее приведу выдержки из User Manual.
В состав Linux SDK входит код OrangePi-Build. OrangePi-Build - это модифицированная версия системы компиляции Armbian Build. С помощью OrangePi-Build можно скомпилировать
несколько версий образов Linux. Вы можете загрузить код OrangePi-Build, используя следующую команду:
git clone https://github.com/orangepi-xunlong/orangepi-build.git -b next
После загрузки orangepi-build вы получите следующие файлы и папки:
build.sh: Компиляция скрипта запуска
external: Содержит файлы конфигурации, специальные скрипты и исходный код для некоторых программ, необходимых для компиляции образа.
LICENSE: Файл лицензии GPL 2
README.md: Документация orangepi-build
scripts: Универсальный скрипт для компиляции образов Linux
Если вы скачали репозиторий orangepi-build с GitHub, вы можете заметить, что в нем отсутствуют:
Исходный код загрузчика u-boot;
Исходный код ядра Linux;
Инструменты перекрестной компиляции (toolchain).
Это абсолютно нормальная ситуация. Эти компоненты хранятся в отдельных репозиториях GitHub или на внешних серверах.
Как работает система сборки:
Конфигурация: В скриптах и конфигурационных файлах
orangepi-buildуже прописаны точные адреса всех необходимых ресурсов.Автоматизация: При запуске процесса сборки система проверяет наличие исходников и инструментов на вашем локальном компьютере.
Загрузка: Если файлы не обнаружены,
orangepi-buildавтоматически скачает нужные версии u-boot, ядра и компилятора из соответствующих источников.
Далее нужно руководствоваться разделом 4.4. Compile the Linux kernel
Запустите скрипт build.sh, перейдя в orangepi-build, и не забудьте добавить sudo.
test@test:~/orangepi-build$ sudo ./build.sh
Выберите пакет ядра и нажмите Enter.

Затем вам будет предложено выбрать, нужно ли отображать интерфейс конфигурации ядра. Если вам не нужно изменять конфигурацию ядра, выберите первый вариант. Если вам нужно изменить конфигурацию ядра, выберите второй вариант.

Затем выберите модель платы разработки.

Если на третьем шаге вы выбрали второй вариант отображения меню конфигурации ядра, появится интерфейс конфигурации ядра, открытый командой make menuconfig. В это время вы можете напрямую изменить конфигурацию ядра. После внесения изменений сохраните изменения и выйдите. После выхода исходный код ядра будет скомпилирован.

Настройка модулей драйверов
Далее я приведу скриншоты make menuconfig, где нужно включить модули драйверов MCP2515. Этого в User Manual нет, пришлось установить экспериментально, после нескольких итераций общения с LLM, последующей компиляцией и проверкой.
Первым нас встречает меню General setup

С помощью стрелок перемещаемся в Networking support и нажимаем клавишу Y или пробел. В квадратных скобках слева должна появиться звездочка.
После этого проваливаемся в этот пункт меня с помощью клавиши Enter.

Здесь мы выбираем CAN bus subsystem support, и нажимаем клавишу M, это позволит собрать драйвера в виде отдельных модулей. Убедимся в этом перейдя в само меню

На одном из этапе после изменения будет предложено сохранить конфигурацию, соглашаемся

Двигаемся в низ и переходим в меню CAN device drivers

Здесь необходимо выбрать Platform CAN devices with Netlink support и нажать M.
После этого можно будет ввойти в меню CAN SPI interfaces, что мы и делаем.

И наконец здесь активируем Microchip MCP251x SPI CAN controllers нажатием M.
С помощью клавиши Tab перемещаемся к <Save> , нажимаем Enter, и сохраняем конфигурацию.
Далее последовательно выходим из меню переходя по <Exit>.
Последующая компиляция происходит в основном автоматически. На одном из следующих шагов будет предложено сделать выбор, просто нажимаем Enter. Затем можно заниматься своими делами пока процесс не завершиться.
В итоге у нас будет скомпилировано четыре установочных файла в директории
~/orangepi-build/output/debs
-rw-r--r-- 1 root sudo 70K linux-dtb-current-sun60iw2_1.0.6_arm64.deb -rw-r--r-- 1 root sudo 12M linux-headers-current-sun60iw2_1.0.6_arm64.deb -rw-r--r-- 1 root sudo 9.8M linux-image-current-sun60iw2_1.0.6_arm64.deb -rw-r--r-- 1 root sudo 110M linux-image-current-sun60iw2-dbg_1.0.6_arm64.deb
Устанавливаем любой из образов linux-image с помощью команды dpkg -i
sudo dpkg -i linux-image-current-sun60iw2_1.0.6_arm64.deb
Драйвера canbus и MCP2515 будут установлены в директориях:
/lib/modules/$(uname -r)/kernel/net/can
/lib/modules/$(uname -r)/kernel/drivers/net/can
orangepi@orangepi4pro:~/orangepi-build/output/debs$ ls /lib/modules/$(uname -r)/kernel/drivers/net/can dev spi orangepi@orangepi4pro:~/orangepi-build/output/debs$ ls /lib/modules/$(uname -r)/kernel/drivers/net/can/spi mcp251x.ko orangepi@orangepi4pro:~/orangepi-build/output/debs$ ls /lib/modules/$(uname -r)/kernel/drivers/net/can/dev can-dev.ko orangepi@orangepi4pro:~/orangepi-build/output/debs$ orangepi@orangepi4pro:~/orangepi-build/output/debs$ orangepi@orangepi4pro:~/orangepi-build/output/debs$ orangepi@orangepi4pro:~/orangepi-build/output/debs$ ls /lib/modules/$(uname -r)/kernel/net/can can-bcm.ko can-gw.ko can.ko can-raw.ko orangepi@orangepi4pro:~/orangepi-build/output/debs$ orangepi@orangepi4pro:~/orangepi-build/output/debs$
Даже при наличии драйвера ядро не начнет работу с MCP2515, пока не получит инструкции через Device Tree. В системе Orange Pi оверлеи управляются загрузчиком через файл /boot/orangepiEnv.txt. Оверлей должен описывать подключение чипа к конкретной шине SPI и указывать параметры его работы. Важным параметром является частота кварцевого резонатора на модуле MCP2515. Большинство модулей используют 8 МГц или 16 МГц.
Device Tree Overlay
Device Tree — это механизм описания аппаратной конфигурации системы, используемый в Linux на ARM-платформах.
DTB (Device Tree Blob) — это бинарный файл, который содержит описание аппаратного обеспечения.
Overlay — это расширение базового Device Tree (DTB):
добавляет новые узлы
изменяет существующие
применяется при загрузке
Файл всегда начинается с:
/dts-v1/; /plugin/;
/plugin/ говорит ядру, что это overlay.
Структура MCP2515 overlay для Orange pi 4 pro
/dts-v1/; /plugin/; / { compatible = "allwinner,sun60i-a733"; fragment@0 { target-path = "/"; __overlay__ { can0_osc: can0_osc { compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <8000000>; }; }; }; fragment@1 { target = <&pio>; __overlay__ { mcp2515_irq_pin: mcp2515_irq_pin { pins = "PD23"; function = "irq"; bias-pull-up; }; }; }; fragment@2 { target = <&spi3>; __overlay__ { status = "okay"; #address-cells = <1>; #size-cells = <0>; mcp2515@0 { compatible = "microchip,mcp2515"; reg = <0>; spi-max-frequency = <2000000>; clocks = <&can0_osc>; pinctrl-names = "default"; pinctrl-0 = <&mcp2515_irq_pin>; interrupt-parent = <&pio>; interrupts = <3 23 8>; status = "okay"; }; }; }; };
Сохранить содержимое в файл с расширением .dts, например mcp2515.dts
fragment@0 — генератор тактов
fragment@0 { target-path = "/";
Мы добавляем узел в корень дерева.
can0_osc { compatible = "fixed-clock";
MCP2515 требует источник тактов. В SoC нет прямого подключения к кварцу модуля, поэтому создаётся виртуальный fixed-clock.
clock-frequency = <8000000>;
Значение должно соответствовать кварцу на плате MCP2515.
fragment@1 — настройка пина прерывания
target = <&pio>;
pio — контроллер GPIO Allwinner.
pins = "PD23"; function = "irq";
PD23 переводится в режим аппаратного IRQ.
bias-pull-up;
MCP2515 держит INT в LOW при событии. Подтяжка к VCC обязательна.
fragment@2 — SPI и MCP2515
target = <&spi3>;
Overlay внедряется внутрь SPI3.
#address-cells = <1>; #size-cells = <0>;
Это говорит:
дочерние устройства SPI имеют 1 поле адреса (reg)
не имеют size (SPI не memory-mapped)
Без этих строк ядро не поймёт, как интерпретировать reg.
SPI-устройства адресуются только через reg.
mcp2515@0 reg = <0>;
В SPI:
адрес = номер Chip Select
CS0 → reg=0
CS1 → reg=1
Если подключение к SPI3.0 — используется <0>.
Визуально структура выглядит так:
spi3
├── CS0 → возможное устройство@0
├── CS1 → mcp2515@1 ← наш случай
├── CS2
└── CS3
spi-max-frequency
spi-max-frequency = <2000000>;
Теоретически MCP2515 поддерживает до 10 MHz, но на A733 стабильность выше на 1–2 MHz.
Если возникают ошибки CRC или зависания — снижать частоту.
interrupts = <3 23 8>
Формат:
<bank pin type>
Для Allwinner:
Банк | Номер |
|---|---|
PA | 0 |
PB | 1 |
PC | 2 |
PD | 3 |
PE | 4 |
PD23 = банк 3, пин 23.
Последнее число — тип прерывания:
Значение | Тип |
|---|---|
1 | EDGE_RISING |
2 | EDGE_FALLING |
4 | LEVEL_HIGH |
8 | LEVEL_LOW |
MCP2515 требует LEVEL_LOW (8).
Компиляция overlay
sudo dtc -@ -I dts -O dtb -o /boot/dtb/allwinner/overlay/sun60i-a733-mcp2515.dtbo mcp2515.dts
Флаг -@ обязателен для overlay.
В результате появится sun60i-a733-mcp2515.dtbo mcp2515.dts файл в /boot/dtb/allwinner/overlay
Установка overlay
Выполнить команду:
sudo orangepi-config
Открывается меню конфигурации. Переходим в System -> Hardware. Среди интерфейсов должен появиться mcp2515. Выбираем его и сохраняем

Или альтернативный вариант. Сохраняем оверлей непосредственно в /boot/orangepiEnv.txt
В любом случае содержимое этого файла должно содержать mcp2515 оверлей
verbosity=1 bootlogo=true overlay_prefix=sun60i-a733 fdtfile=allwinner/sun60i-a733-orangepi-4-pro.dtb rootdev=UUID=dc683cb4-0847-4d2f-83f1-184d35749d4c rootfstype=ext4 overlays=mcp2515
Перезагрузка:
sudo reboot
Проверка загрузки
Проверка драйвера:
sudo dmesg | grep mcp
Должно быть:
mcp251x spi3.0 can0: MCP2515 successfully initialized
Запуск CAN
Поднять интерфейс can0 на скорости 500 Kbit/s (можно на любой скорости, главное, чтобы другие участники были настроены на то же значение):
sudo ip link set can0 up type can bitrate 500000
Отключить can0 интерфейс можно командой
sudo ip link set can0 down
Тестирование
Для тестирования can-шины необходимо установить can-utils
sudo apt-get install can-utils
Информацию по can-utils можно легко найти, например, CAN Bus Reverse Engineering, Automobile Hacking, CAN communication tutorial, или поискать на Youtube.
Включаем can-монитор командой
candump can0
Отправка сообщения:
cansend can0 123#DEADBEEF
На этом коротком видео показан пример отправки и приема can-сообщений тремя устройствами, изображенными ранее на фото. Отправка can-сообщения вначале производится с помощью утилиты CanHacker на Arduino. Затем командой cansend на Orange pi и на Raspberry pi.
Заключение
Модель Orange Pi 4 Pro, в отличие от своих предшественников на базе Rockchip, использует систему на кристалле Allwinner A733, что создает разрыв в совместимости с существующими дистрибутивами, такими как Armbian. Официальные образы Armbian, помеченные как "Orange Pi 4" или "Orange Pi 4 LTS", жестко скомпилированы под архитектуру Rockchip RK3399. Использование Armbian станет возможным только после того, как в основную ветку U-Boot и ядра Linux будут интегрированы патчи для A733, включая поддержку контроллера памяти LPDDR5 и PMIC AXP318.2 До этого момента единственным стабильным вариантом остаются официальные образы от производителя Xunlong, которые базируются на ядре 5.15.147. Шина CAN является стандартом де-факто в автомобильной и промышленной автоматизации. Поскольку SoC Allwinner A733 не имеет встроенного контроллера CAN, задача решается подключением внешнего чипа MCP2515 через интерфейс SPI. Однако, текущая сборка Ubuntu Jammy от Orange Pi поставляется с ядром, в котором поддержка CAN и SPI-драйверов MCP251x не включена в состав монолитного ядра и не собрана в виде модулей. В данной статье показан один из способов компиляции и установки необходимых драйверов для модуля MCP2515, и последующая настройка оверлея для аппаратной конфигурации.
