Вчера получил посылку с AliExpress, где было 2 адаптера CANable (AZSMZ-USB2CAN) [1].
Оба адаптера построены на основе STM32F042C6T6, и отличаются только коннекторами USB. С адаптерами поставляется программа CANact [7], которая позволяет конфигурировать адаптер, подключаться к нему, просматривать трафик и передавать единичные пакеты. CANtact-app это открытое ПО, предназначенное главным образом для работы с адаптерами CANable AZSMZ-USB2CAN, однако оно может работать с любым устройством, поддерживающим протокол LAWICEL (см. [8, 9, 10]).
[Перемычки]
На адаптерах есть 2 перемычки - BOOT и TERM. Перемычка BOOT разрешает обновление ПО через USB по протоколу DFU [3]. Перемычка TERM включает терминирование физической линии CAN резистором 120 Ом.
BOOT: если эта перемычка установлена ближе к коннектору CAN, то загрузчик DFU запрещен, и плата работает как обычно. Если же перемычка установлена в сторону микроконтроллера, то адаптер работает как устройство USB DFU, позволяя обновить свое программное обеспечение [3, 4].
TERM: если эта перемычка установлена ближе к коннектору CAN, то подключен терминирующий резистор 120 Ом.
[Драйвер]
Linux и Mac: для этих операционных систем драйвер не требуется. Адаптер CANable появится как устройство USB CDC: /dev/ttyACMX или /dev/ttyUSBX на Linux, или /dev/cu.usbmodemXXXX на Mac.
Windows: может понадобиться накатить .inf-файл (его можно скачать в ZIP-архиве https://canable.io/utilities/windows-driver.zip, или по ссылке [15]). Драйвер устанавливается стандартным образом, двойным кликом на inf-файле, либо через менеджер устройств, Update Driver с выбором .inf-файла. На моей системе Windows 10 Pro x64 устройство определилось сразу, установка драйвера не потребовалась.
Стоковая прошивка slcan (исходный код для неё см. по ссылке [16]) установит драйвер виртуального COM-порта (USB CDC). В менеджере устройств Windows появится новое устройство COMx.
Это GUI-утилита для Windows и Mac, написанная на Java [7]. Дает самый простой способ познакомиться с основными возможностями адаптера CANable AZSMZ-USB2CAN.
Утилита cantact-app позволяет просматривать трафик шины CAN в реальном времени и отправлять пакеты CAN. Утилита подключается напрямую с виртуальному последовательному порту (USB CDC) устройства CANable (или CANtact), и не требует никаких других драйверов.
Примечание: cantact-app запускается на Linux, но в настоящий момент не может сама обнаружить последовательные порты.
[Cangaroo]
На Windows можно использовать программу Cangaroo, если в адаптер CANable записана альтернативная прошивка candlelight [2] (см. далее). Программа позволяет принимать и передавать трафик CAN систем адресации standard и extended. Также поддерживается парсинг файла DBC, но эта функция все еще находится на стадии beta-тестирования. Cangaroo можно запустить на Linux, если Вы скомпилируете её самостоятельно.
[SocketCAN]
Эта программа работает в среде Linux через socketCAN-совместимый интерфейс, предоставляемый адаптером CANable через утилиту slcand. Это дает возможность использовать все стандартные Linux утилиты для CAN, такие как candump, cansniffer и даже wireshark. Скорость шины CAN задается параметром "-s":
Просто запустите slcand с правильными аргументами для установки скорости шины CAN, и в системе должно появиться новое устройство CAN. После запуска slcand не забудьте активировать это устройство с помощью ifconfig! Теперь можно использовать стандартные утилиты Linux CAN для взаимодействия с шиной. Убедитесь, что выбрали правильный порт TTY, что можно проверить командой dmesg после подключения в разъем USB адаптера CANable.
cansend can0 999#DEADBEEF # отправка фрейма на ID 0x999 с полезной нагрузкой 0xdeadbeef
candump can0 # показать весь трафик, принятый can0
canbusload can0 500000 # вычислить процент загрузки шины на can0
cansniffer can0 # показать трафик в стиле утилиты top
cangen can0 -D 11223344DEADBEEF -L 8 # генерация сообщений CAN с фиксированными данными
[Программирование на Python]
Существует библиотека python-can [11], позволяющая довольно просто реализовать обмен по шине CAN на языке Python. Библиотека поддерживает прямое подключение к устройствам адаптеров CANable/CANtact через последовательное соединение под управлением Windows или Linux, и также может напрямую работать с устройствами socketcan на Linux, если в них установлена прошивка candlelight.
try:
bus.send(msg)
print("Отправлено сообщение через {}".format(bus.channel_info))
except can.CanError:
print("Сообщение НЕ отправлено")
Примечание: ранее для использования вместе с CANable рекомендовалась библиотека CANard [12]. CANard все еще доступна, но в новых проектах её лучше не использовать.
[Альтернативное firmware: candleLight]
Это порт прошивки candleLight USB CAN для адаптера CANable. Порт хорошо работает в среде Linux с использованием драйвера gs_usb. Прошивка candleLight не использует последовательный протокол slcan, и поэтому не является взаимозаменяемой со стоковой прошивкой. Однако с прошивкой candleLight адаптер CANable в среде Linux появляется как родной интерфейс CAN, нормально работает в среде Windows с программой Cangaroo (см. далее), и поддерживает очень высокую загрузку шины CAN.
Обновить прошивку CANable на candlelight можно с помощью сайта CANable Updater [4]. Также см. далее раздел "Обновление прошивки".
Имейте в виду, что на ядрах Linux версии ≤ 4.9 в драйвере gs_usb есть баг. Сейчас в основной линейке ядер существует патч, однако если Вам нужно скомпилировать отдельный модуль, то можете использовать исправленную версию [13].
С прошивкой candlelight просто подключите адаптер CANable в порт USB, и устройство пройдет энумерацию как can0. Установите скорость, активируйте интерфейс следующей командой, и все будет готово к работе:
ip link set can0 up type can bitrate 500000
Правила udev. Если в одной системе используются несколько адаптеров CANable с прошивкой candleLight, то возможно понадобится настройка правил udev для привязки к каждому фиксированному имени устройства (can0, can1, и т. д.) определенного серийного номера. Это предотвратит смену имени между перезагрузками и подключениями/отключениями устройства.
Для настройки нового правила udev создайте файл наподобие следующего:
/etc/udev/rules.d/99-candlelight.rules
В этом файле будет содержаться Ваше правило привязки. Поместите в него серийный номер своего устройства (для этого просмотрите вывод команды dmesg после подключения адаптера, или используйте команду usb-devices), и используйте в этом файле нужное имя устройства. Никакие другие значения менять не нужно. Для каждого устройства, которое хотите сконфигурировать, добавьте в этот файл отдельную строку. Рекомендуется назначать имена начиная с can3 и далее, поскольку устройства без назначенных правил udev все еще будут проходить энумерацию как can0, can1, и т. д.
В адаптерах, которые я купил на AliExpress, была прошивка slcan (cantact-fw-master, https://github.com/normaldotcom/cantact-fw). В ней протокол LAWICEL реализован лишь частично. Можно даже сказать, что это своя, облегченная версия этого протокола. В ней не выдается символ перевода строки \r в ответ на посылку этого символа, не поддерживаются команды F, N, команда V выдает версию по-другому (без префикса V, и добавляется ссылка на github). Подробнее см. врезку ниже.
Этот repo (https://github.com/normaldotcom/cantact-fw) содержит исходный код slcan CANable firmware, основанный на CANtact firwmare. Это firmware все еще должно компилироваться и работать на железе CANtact.
## Поддерживаемые команды
`O` - Open channel (открыть канал CAN) `C` - Close channel (закрыть канал CAN) `S0` - Установить скорость 10k `S1` - Установить скорость 20k `S2` - Установить скорость 50k `S3` - Установить скорость 100k `S4` - Установить скорость 125k `S5` - Установить скорость 250k `S6` - Установить скорость 500k `S7` - Установить скорость 750k `S8` - Установить скорость 1M `M0` - Установить нормальный режим (по умолчанию) `M1` - Установить silent mode (только прослушка шины CAN) `A0` - Запрет автоматического повтора передачи (automatic retransmission) `A1` - Разрешение automatic retransmission (по умолчанию) `TIIIIIIIILDD...` - Передать фрейм данных (Extended ID) [ID, length, data] `tIIILDD...` - Передать фрейм данных (Standard ID) [ID, length, data] `RIIIIIIIIL` - Передать remote frame (Extended ID) [ID, length] `rIIIL` - Передать remote frame (Standard ID) [ID, length] `V` - Возвратить версию firmware и remote path в виде строки (remote path это ссылка проекта на github)
Примечание: перед открытием канала должны быть отправлены конфигурации канала (S, M, A). Перед отправкой фреймов CAN канал должен быть открыт (команда O).
Это firmware в настоящий момент не выдает обратную связь ACK/NACK для последовательных команд (приходящих через RS-232).
## Как компилировать
Сборка firmware осуществляется с помощью GCC. В частности, нужен пакет gcc-arm-none-eabi, доступный для Windows, OS X и Linux на
[Launchpad](https://launchpad.net/gcc-arm-embedded/+download). Загрузите этот тулчейн в свою систему и добавьте папку `bin` тулчейна в переменную PATH.
Ваш дистрибутив Linux может также содержать предварительно скомпилированный пакет для `arm-none-eabi-gcc`, проверьте репозитории своего дистрибутива, чтобы узнать, есть ли в там готовая сборка тулчейна.
- Если у Вас устройство CANable, то компилируйте проект командой `make`. - Если у Вас устройство CANtact, или другое устройство с внешним кварцем, то можно компилировать командой `make INTERNAL_OSCILLATOR=1`
## Прошивка с помощью Bootloader-а
Установите перемычку BOOT в соответствующее положение и подключите CANable в порт USB (на CANable Pro отпустите кнопку boot после подключения в порт USB). Затем выполните команду `make flash`, и CANable будет обновлен последним скомпилированным firmware. Отключите/подключите устройство после возврата перемычки BOOT в исходное рабочее положение, CANable запустится и начнет работать.
## Отладка
Отладка вместе с прошивкой программы может быть осуществлена на плате разработчика STM32 Discovery (она может работать и как программатор, и как отладчик st-link). Также Вы можете использовать другие инструменты/утилиты, поддерживающие SWD.
Для использования STM32 Discovery запустите [OpenOCD](http://openocd.sourceforge.net/) с использованием файла конфигурации stm32f0x.cfg: `openocd -f fw/stm32f0x.cfg`.
При запущенной системе OpenOCD для загрузки кода и отладки может использоваться arm-none-eabi-gdb.
## Разработчики
- [Ethan Zonca](https://github.com/normaldotcom) - новые функции, интеграция/обновление HAL updates, исправления Makefile, оптимизация размера кода, обновления для CANable - [onejope](https://github.com/onejope) - исправление для обработки extended ID - Phil Wise - в Makefile добавлена совместимость с утилитой dfu-util
## Лицензия
См. LICENSE.md
[Пример работы с CANable (прошивка slcan/cantact-fw) на языке C#]
Это утилита для передачи firmware загрузчику через соединение CAN на скорости 250 килобит/сек, пакетами со стандартными ID (11 бит). Утилита используется для перепрошивки систем, снабженным интерфейсом CAN и соответствующим bootloader-ом.
Алгоритм работы самый простой - нажатии на кнопку "Передать прошивку" открывается файл прошивки, и он последовательно передается пакетами по 8 байт, без всякого управления потоком и ожидания подтверждения от загрузчика. Корректность передачи проверяется по её окончании на стороне загрузчика - он проверяет контрольную сумму кода.
Утилита была создана на основе проекта http://svn.code.sf.net/p/canusb/code/trunk/, написанного на Visual Studio C# (см. папку ExampleProgram). Проект реализует стандартную, полную версию протокола LAWICEL [8], и поэтому не совместим с упрощенной версией прошивки CANable slcan/cantact-fw [16]. Для адаптации кода для работы с CANable были внесены следующие основные изменения:
1. Удалены классы, работающие с устройством виртуального последовательного порта USB CDC через драйвер/библиотеку FTDI. Все обращения к виртуальному COM-порту реализованы теперь через класс SerialPort от Microsoft. 2. Вызовы SendGenericBlockingMessage, которые ожидают подтверждения ACK/NACK от адаптера, в большинстве случаев заменены на вызовы SendMessage, которые просто посылают текстовую строку без ожидания подтверждения. 3. Переделано тело потока parserTask (процедура ReadData), чтобы обработка приходящих данных соответствовала урезанному протоколу прошивки CANable slcan/cantact-fw. 4. Кроме CANable/slcan, утилита также поддерживает адаптеры CANalyst (модуль CANalyst.cs) и CAN SYSTEC (CAN-systec.cs). Код поддержки CANable находится в модулях CANable*.cs (классы CANable.cs, CANableAdantor.cs, CANableMessage.cs, CANableQueue.cs). 5. Добавлен модуль IniFile.cs, чтобы использовать настройки в ini-файле. 6. Для отладки и диагностики добавлен вывод в файл лога (см. модуль log.cs).
[Обновление прошивки]
Переставьте перемычку BOOT в сторону микроконтроллера, и подключите адаптер CANable к компьютеру через USB.
Web App. С помощью онлайн-приложения [4] можно легко перепрограммировать адаптер CANable. На момент написания этой статьи на сайте были доступны 3 варианта прошивки: slcan (1205aa6 4/10/19), candlelight (a8a0757), slcan (1b8f8b8 4/14/20) BETA.
ST DFU Tool. Запустите на Windows утилиту [3] от компании ST, и следуйте указаниям для установки драйвера устройства DFU, генерации файла DFU и перепрошивки устройства.
dfu-util на Linux и Mac. Установите программу dfu-util с помощью менеджера пакетов Linux или из brew на OSX. Для прошивки своего устройства запустите команду:
После прошивки верните перемычку BOOT в исходное состояние (переставьте её в сторону коннектора шины CAN), отключите и снова подключите устройство.
[Ссылки]
1. Getting Started site:canable.io - быстрый старт, как работать с адаптерами CANable AZSMZ-USB2CAN. 2. candle-usb / candleLight_fw site:github.com - альтернативная прошивка для адаптеров CANable AZSMZ-USB2CAN. 3. DfuSe USB device firmware upgrade site:st.com - обновление прошивки STM32 через DFU-протокол компании ST. 4. Update your CANable site:canable.io - онлайн-утилита для обновление прошивки CANable AZSMZ-USB2CAN. 5. HubertD / cangaroo site:github.com - анализатор шины CAN с открытым исходным кодом. 6. PCAN-Basic API for connecting to CAN and CAN FD busses site:peak-system.com - библиотека для работы с адаптером CANable AZSMZ-USB2CAN. 7. linklayer / cantact-app site:github.com. 8. LAWICEL CAN232 версии 3. 9. USBTin Lawicel protocol site:barakuda62.ru. 10. autowp / arduino-canhacker site:github.com. 11. python-can site:readthedocs.io. 12. Using CANable from Python with CANard site:canable.io. 13. Fixed gs_usb driver for recent kernels site:github.com. 14. https://canable.io/builds/. 15. 200930CANable-all-in.zip - драйвер, библиотека API, документация, утилиты, прошивки. 16. normaldotcom / cantact-fw site:github.com. 17. 201008CANFWsender.zip - проект C#, обменивающийся данными с адаптером CANable (с заводской прошивкой slcan [16]).