В разработке электроники часто нужны переходники с USB на CAN. В этом тексте я написал про то каким может быть такой переходник.
Как устроена жизнь сейчас?
В продаже есть множество переходников с USB-CAN.
Название переходника |
Клиентская утилита |
USB-CAN (SYS TEC USB-CANmodul1) |
CANinterpreter Lite for USB-CANmodul |
USBCAN-II C |
ECAN Tools |
USB2CANFD_V1 |
СanGaroo |
PCAN-PRO-X |
PCAN-View |
CAN-Hacker 3.2 |
CARBUS Analyzer |
CANTact Pro |
ETAS BUSMASTER |
canfox |
CANexplorer 4 |
CH-P |
CARBUS Analyzer |
canable v2 |
? |
cantact |
? |
kvaser |
? |
marathon |
? |
Vector |
Vector |
Все они работают по одной и той же схеме. Есть устройство, есть прошивка для устройства, драйвер для прошивки и клиентская Win утилита для драйвера. По сути три программы для работы с одним единственным устройством.
№ |
Название программы |
Назначение |
1 |
Прошивка |
для МК |
2 |
Драйвер |
для ядра OS |
3 |
Клиентская утилита |
для user space |
Это классический подход.
В чем проблема классического подхода?
Главная проблема всех покупных переходников с USB на CAN в том, что они не работают без клиентского ПО на LapTop. При этом для каждого переходника обычно свое собственное уникальное оригинальное ПО. Без этой Win утилиты сам переходник не более полезнее, чем руда цветмета.
Порой проблема в том, что вот есть устройство (переходник с USB на CAN ) с прошивкой внутри, а нет драйвера. Дистрибутив утрачен. Или есть устройство, есть драйвер и нет клиентской утилиты. Дистрибутив утрачен. Или есть всё, но новая версия ОС Windows 11 больше не запускает клиентскую утилиту (или драйвер). Или опять есть всё, но клиентская утилита тупая и не может отправлять два разных пакета с разными ID (привет СanGaroo). Или клиентская утилита бажная и не может прописать отправку payload в интервале от 1 до 7 (привет ECAN Tools ). Или клиентская утилита показывает фантомные отправки, а потом внезапно вылетает, роняя за собой Windows 11 (привет PCAN-View). Вишенка на торте в том, что со временем либо клиентская утилита, либо драйвер перестают работать из-за обновлений операционной системы Windows.
Вот такие пирожки с капустой, понимаете?
Решение проблемы
Я предлагаю разработать такую полноценную прошивку для устройства, для работы с которым не будет нужно клиентского ПО. Суть в том, чтобы выбрать какую-нибудь плату с аппаратным CAN и USB, например первую попавшуюся JZ-F407VET6 и написать для нее своеобразную прошивку, которая позволит принимать и отправлять произвольные CAN пакеты по UART-Shell или serial over USB.

Современные микроконтроллеры по памяти, частоте процессора превзошли серверные станции из 198x. А раз так, то почему бы и не насытить прошивку нормальным прикладным функционалом?
Затем на PC открывать TeraTerm (или PuTTY) и через UART-Shell отправлять и принимать пакеты.
Программная часть
Основная задумка заключается в том, чтобы взять функционал клиентского DeskTop ПО и засунуть его прямо в прошивку. Это более чем возможно ввиду того факта, что нынешние микроконтроллеры обладают большим объёмом памяти и быстрым ядром. Надо лишь забабахать UART-CLI и управлять трансивером в текстовом режиме.
Вот я и решил сварить такую тестировочную сборку и накидать туда несколько полезных CLI команд. Итак, обо всём по порядку. Тут как в медицине всё начинается со средств диагностики. Просматривать статистику переданных и принятых пакетов по конкретному отдельному CAN можно командой can_traffic (ctd). Тут видно принятые пакеты и отправляемые пакеты. Вот так:

Можно добавлять периодическую отправку CAN пакета командой can_tx_planner_set
№ |
can_tx_planner_set |
Назначение аргумента |
Единицы измерения |
1 |
N |
Номер расписания |
1 2 3 4 5 |
2 |
EN |
активировать или отключить |
0-откл; 1-вкл |
3 |
TxPeriod |
период отправки |
ms |
4 |
CANnum |
номер CAN |
1 2 3 ... |
5 |
ID val |
Значение CAN ID |
29 бит число |
6 |
ID type |
Тип CAN ID |
2-Ext; 1-Std |
7 |
Payload |
Данные в пакете |
uint64_t |
Пример команды: can_tx_planner_set 2 1 3000 1 0xc2 2 0x12345678

После этого MCU станет отправлять в CAN1 второй расширенный пакет с периодом 3000 ms и данными 0x12345678

Вот в этом отчете мы видим, что принимаются два пакета (0xC2 и 0x55), а отправляются тоже два пакета (0xc3 и 0xc2).

Через консоль можно сделать с CAN трансивером практически всё, что угодно. Нынешнюю битовую скорость можно просмотреть командой cad

Задать новую битовую скорость можно командой cb ( can_baud ) . У нее два аргумента: номер CAN и скорость.

При этом все настройки желательно хранить в NVRAM, чтобы они применялись автоматически при пере сбросе электропитания.
Можно внепланово отправить один отдельный CAN пакет командой
cse instance ExtId hex_string.
cse 1 0x123354 0x55AA55AA55AA55AA
И он в самом деле улетит в шину.

Или принимать CAN пакеты в режиме водопада

Тут же в UART-CLI можно задать конфигурацию CAN фильтрам. Это делается командой
cfims CanNum FiltNum ID Mask.

и просмотреть текущие настройки фильтров cdf (can_diag_filers).

Механизм CAN diff
В легковых автомобилях некоторые CAN пакеты просто флудят с константным ID, меняют при этом только свое содержимое во время исполнения прошивки. Протокол не известен.
При этом остается делать реверс-инжиниринг CAN шины. Для этого в переходник я добавил механизм наблюдения за конкретным CAN ID. Суть проста. Прошивка переходника сравнивает payload текущего CAN пакета с предыдущим. Вычисляет XOR и на выходе мы выявляем биты, которые меняются. Так можно установить причинно-следственную связь между входными воздействиями извне и изменением сигналов в CAN шине. Можно выявить какие битовые поля в CAN пакете отвечают например за нажатие педалей или поворот руля.
Чтобы включить этот механизм надо выполнять команду cdw ( can_diff_watch )
cdw Num CanNum CanId idType. Например cdw 1 1 0xee 2
# аргумента |
Параметр |
Пояснение |
Возможные значения |
1 |
Num |
Номер наблюдателя |
1 ; 2 ; 3; 5 |
2 |
СanNum |
Номер CAN порта |
1;2 |
3 |
CanId |
CAN ID |
0......0xFFFFFFFF |
4 |
idType |
тип CAN ID |
2-Ext; 1-Std |
Выглядит это так. В консоль на одной и той же строке снова и снова печатается payload маска, показывающая какие биты внутри CAN пакета меняются от пакета к пакету.

Или можно показать отчет таблицей набрав команду cdd (can_diff_diag)

Вот полная система CAN команд для данной прошивки.
--> h can
+-----+----------+----------------------+-------------+
| Num | Acronym | CommandName | Description |
+-----+----------+----------------------+-------------+
| 1 | ctd | can_traffic | CanDiagTraffic
| 2 | crhd | can_rx_hist_diag | CanRxHistDiag
| 3 | crhi | can_rx_hist_init | CanRxHistInit
| 4 | ctpsp | can_tx_planner_set_period | CanTxPlannerSetPeriod
| 5 | ctps | can_tx_planner_set | CanTxPlannerSet
| 6 | ctpd | can_tx_planner_diag | CanTxPlannerDiag
| 7 | ctpi | can_tx_planner_init | CanTxPlannerInit
| 8 | cdw | can_diff_watch | CanDiffSetWatch
| 9 | cdd | can_diff_diag | CanDiffDiag
| 10 | cdi | can_diff_init | CanDiffInit
| 12 | cs | can_send | CanSendHexStr
| 13 | cse | can_send_ext | CanSendExtHexStr
| 14 | cshl | can_hi_load | CanSendHiLoad
| 15 | clbi | can_test_loopback_id | CanTestLoopBackId
| 16 | cdf | can_diag_filers | CanDiagFilters
| 17 | cdc | can_diag_custom | CanDiagCustom
| 18 | cdtm | can_diag_tx_mailbox | CanDiagTxMailBox
| 19 | candl | can_diag_low_level | CanDiagLowLevel
| 20 | canra | can_raw_reg | CanDiagRawReg
| 21 | cani | can_interrupt | CanInterrupt
| 22 | cad | can_diag | CanDiag
| 23 | cfim | can_filter_diag | CanDiagFilterIdAndMask
| 24 | cadi | can_diag_interrupt | CanDiagInterrupt
| 25 | cimid | can_is_my_id | CanDiagIsMyId
| 26 | cmb | can_mesg_buff | CanDiagMesgBuf
| 27 | cb | can_baud | CanBaud
| 28 | cra | can_rx_all | CanRxAll
| 29 | cfims | can_filter_set | CanFilterSet
| 30 | ci | can_init | CanInit
| 31 | ccbr | can_calc_bit_rate | CanCalcBitRate
| 32 | clb | can_loopback | CanLoopBack
| 33 | clbm | can_loopback_mode | CanLoopBackMode
| 34 | crfm | can_rx_frame_manual | CanRxFrameManual
+-----+----------+----------------------+-------------+
Если у вас есть эта отладка можете и сами погонять эту прошивку. Вам понадобится переходник с USB на RS232, чтобы подключиться к консоли на UART1.
Что можно улучшить?
Вообще с платой на которой два CAN порта можно делать достаточно много полезных устройств:
1--Добавить поддержку ISO-TP. Отправлять текстовые сообщения по протоколу ISO-TP.
2--Добавить поддержку UDS клиента. Это позволит проверять автомобили.
3--Сделать CAN GateWay. Перекладывать пакеты из одного CAN в другой через каждые 40 метров. Это позволит удлинить CAN шину при сохранении высокой битовой скорости (1MBit/s).
4--Сделать CAN FireWall. Это позволит из одной CAN сети в другую пропускать только определенное множество ID.
Итоги
Удалось написать прошивку для широко распространенной учебно-тренировочной электронной платы JZ-F407VET6, которая позволяет использовать отладочную плату как переходник с USB на CAN. Это открывает дорогу для использования платы JZ-F407VET6 как отладочное оборудования для диагностики CAN сетей.
В результате всё, что вам надо - это купить плату JZ-F407VET6 (2k RUR), переходник с USB на RS232, программатор J-link (или ST-Link), накатить на JZ-F407VET6 мою прошивку и можно смело подключаться к CAN сетям, смотреть, что там происходит и, по мере надобности, пулять произвольные CAN пакеты на разных битовых скоростях.
Акронимы
Акроним |
Расшифровка |
CAN |
Controller Area Network |
PC |
personal computer |
USB |
Universal Serial Bus |
MAC |
medium access control |
PHY |
physical layer |
Ссылки
Name |
URL |
CAN-шина (Теория) |
|
https://github.com/aabzel/Artifacts/tree/main/jz_f407vet6_can_gcc_m |
|
ЛикБез по CAN-FD |
|
Обзор Переходника USB-CAN (SYS TEC USB-CANmodul1) |
|
Настройка ToolChain(а) для Win10+GCC+С+Makefile+ARM Cortex-Mx+GDB |
|
Обзор USB-CAN переходника USBCAN-II C |
|
Обзор Протокола ISO-TP [ISO 15765-2] |
|
Пример CAN трафика |
https://docs.google.com/spreadsheets/d/1AGdPkWEUJpL-DqwfBiQXcp8iG4rBm2TTlbpR1-Ipi3c/edit?gid=0#gid=0 |
Комментарии (17)

HardWrMan
29.01.2026 22:21Клиент на ПК для этих переходников используется для того, чтобы иметь достаточную вычислительную мощность, чтобы обрабатывать входящий и/или исходящий поток в режиме реального времени + его накапливать. На МК такое сделать проблематично. А файл с записью может быть легко более гигабайта за 1 сессию. Особенно в случае с FD и/или работе с целой сетью CAN, например, у автомобиля, где постоянно общаются десяток устройств. Поэтому, ваша схема интересна, но чтобы она имела хотя-бы какой-то практический смысл нужно как минимум добавлять ОЗУ (FSMC позволит вам прикрутить дешёвую и ёмкую SDRAM), прикручивать серьёзный скоростной накопитель (хотя-бы скоростную uSD, SDIO вам поможет) и плотно изучить набортное оборудование МК, чтобы разрулить все пути данных внутри по шинам под управлением DMA, высвобождая само ядро на, собственно, обработку данных и общение с пользователем.
Исходя из упомянутого выше резюмирую: если вы хотите автономное но в то же время достаточно полезное устройство, то используйте тандем из обычного и мощного МК. Например, RP2040+STM407. Или любую маленькую малинку с прикрученным CAN адаптером. Там вы сможете достаточно быстро и точно по времени управлять CANом и в то же время у вас будет достаточно вычислительной мощности для анализа и накопления данных. И при этом вы никак не будете привязаны к обычному ПК, вот буквально, к малинке же можно свой монитор прикрутить, верно?

NutsUnderline
29.01.2026 22:21поскольку некоторые пытаются использовать малинки и репки как десктоп, а can бывает интегрирован в чипсет то это уже даже и сделано. только linux очень хочет видеть can как сетевой адаптер то некоторая сокетная прослойка все таки возникает

HardWrMan
29.01.2026 22:21Ну вот. Я думаю, что видимость как сетевой интерфейс тоже решаемо. Если уж закапываться в линукс, то по любому разбираться в этих ядерных модулях.

aabzel Автор
29.01.2026 22:21тандем из обычного и мощного МК. Например, RP2040+STM407. Или любую маленькую малинку с прикрученным CAN адаптером.
Да. Видел такое решение на прошлой работе.
Там с Raspberry PI + CAN трансивера управляли тестировочным оборудованием внутри test-jig-и (8 отдельных плат) по CAN.
К test jig-е поочередно подключался ECU и так проверяли собранные на конвейре ECU (для управления кузовной электроникой).
HardWrMan
29.01.2026 22:21Ну, это как автономный программатор. Крайне полезная но в то же время нишевая вещь.

x89377
29.01.2026 22:21А исходные файлы будут опубликованы ?
https://github.com/aabzel/Artifacts/tree/main/jz_f407vet6_can_gcc_m

NutsUnderline
29.01.2026 22:21кстати вспомнил из предыдущих обсуждений вообще esp32 с веб интерфейсом предлагали для такого, типа еще удобнее, нужен только смартфон. но через wifi/bt можно и обычную консоль

Antares1991
29.01.2026 22:21Оффтоп-вопрос: какой можете посоветовать CAN клиент на ПК, который на клиент будет похож, а не на студенческую курсовую? Сейчас пользуюсь Cangaroo и сильно страдаю(
Из требований: отображение трафика, возможность отправки своих пакетов (одноразово и циклически), возможность группировки и фильтрации пакетов по ID
HardWrMan
29.01.2026 22:21Я пользуюсь аскетическим CANary, который в статье не заявлен. Он использует свои донглы, но я научился ими притворяться, поэтому делаю себе клоны сам.
Картинки
У него простой и понятный бинарный файл лога, который можно посмотреть родным же анализатором.
CANalyzer
Только вот он тормозной жутко почему-то. Учитывая, что софт канарейки может писать более 100МБ данных на диск, а анализатор даже 5МБ файл кубатурит минут 5, а если там много ID то и того дольше я тупо перестал использовать канализатор и написал свой.
Мой анализатор
Он умеет всё, что умеет CANalyzer, только открывает файлы логов почти всех самых известных CAN логгеров, грузит быстро лог даже под гигабайт размером, быстро работает GUI, количество цветов ID не ограничено (в оригинале только 4 ID можно раскрасить), добавил дельту времени, причём учитывается дельта между отображаемыми (отфильтрованными) ID. Есть сборщик пакетов KWP2000, UDS и т.д. Ну и я всегда могу туда что угодно добавить. Работает без установки.
По хорошему, нужно написать аналог и самого CANary, но пока времени нет. Дело в том, что CANary фильтрует устройства по издателю драйвера. Учитывая, что канарейка собрана на STM32F1, то фильтруются только vCOM от STMicrielectronics. А аналог хочу сделать чтобы он работал вообще с любым донглом, даже китайским.

NutsUnderline
29.01.2026 22:21BusMuster на всякий случай. в нем есть встроенный компилятор для плагинов.
Vadim_1984
У меня есть такая плата, на ней я реализовал gateway can/ethernet для специфических девайсов. Как раз давеча потерял свой canable 2.0, прекрасно служивший мне для моих утилит под python, открывающийся как /dev/cu.тырыпыры последовательный порт, в общем, и мучался с canable 1.0, вроде я его прошивал чем-то под can<->usb-serial, а сегодня не смог её найти, и сайт canable.io чёт не работает. Попробую завтра вашу. А с usb-serial что не получилось? "переходник с USB на RS232"
aabzel Автор
Это следующим этапом.