Тестирование CAN

Пересборка Rootfs

Реконфигурация

При последующей настройке скорости передачи данных CAN и режима loopback необходимо использовать команду ip. Однако при использовании команды ip, скомпилированной по умолчанию в PetaLinux, появляется следующее сообщение об ошибке:

Согласно инструкциям в справочном материале, компонент iproute2 должен быть правильно настроен в rootfs для получения полнофункциональной поддержки команды ip:

Справочный материал:

65243 - PetaLinux 2014.4 - Команда "ip" не может правильно найти устройства CAN

Компиляция и упаковка

После завершения предыдущего шага 'petalinux-config -c rootfs' используйте следующие команды для перекомпиляции и упаковки:

Обновление файловой системы на TF-карте

Очистите содержимое второго раздела TF-карты и извлеките файл ./image/rootfs.tar.gz во второй раздел TF-карты с помощью следующей команды:

Вставьте TF-карту в плату, выберите режим загрузки с SD-карты с помощью перемычки, подключите последовательный порт к плате и включите питание.

Добавление кода в проект приложения Vitis

Щелкните правой кнопкой мыши на src, чтобы создать новую папку:

image-20250710140513635

После создания соответствующих файлов .c и .h это должно выглядеть следующим образом:

image-20250714102016171

Компиляция и отладка

Добавьте папку, содержащую файлы .h, в путь:

image-20250714102318467

Тестирование с помощью команд

Откройте канал CAN и установите скорость передачи данных с помощью команд. Соответствующие команды следующие:

При изменении рабочего состояния CAN необходимо сначала выключить can0, иначе будет выведено сообщение "Device or resource busy"

image-20250714111708984

image-20250714111809960

Тестирование через проект Vitis

Система Linux управляет устройствами CAN как сетевыми устройствами и предоставляет интерфейс SocketCAN, что делает связь по шине CAN похожей на Ethernet, с более универсальными и гибкими интерфейсами для разработки приложений.

Инициализация

Инициализация и настройка CAN выполняются с помощью системного вызова system() для выполнения соответствующих команд, упомянутых ранее.

Большинство структур данных и функций в SocketCAN определены в linux/can.h, а создание сокетов шины CAN выполняется с использованием стандартных сетевых сокетов.

Передача данных

Каждый раз, когда шина CAN получает данные, они передаются в виде единиц can_frame. Эта структура определена следующим образом:

can_id — это идентификатор кадра. При отправке стандартного кадра используются младшие 11 бит can_id; если это расширенный кадр, используются биты 0-28. 29-й, 30-й и 31-й биты can_id являются битами-идентификаторами кадра, используемыми для определения типа кадра, как показано ниже:

Передача данных использует функцию write. Чтобы отправить кадр данных с идентификатором 0x123 и данными в один байт 0xAB, используется следующий метод:

При отправке удаленного кадра, frame.can_id = CAN_RTR_FLAG | 0x123

Прием данных

Прием данных использует функцию read, реализованную следующим образом:

Создание потока приема

При тестировании программ связи CAN в Linux обычно необходимо создавать поток, отвечающий за прием. Использование потоков позволяет в полной мере использовать планирование задач и повторное использование ресурсов, предоставляемые ядром Linux.