В разработке электроники часто нужны переходники с 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.

JZ-F407VET6
JZ-F407VET6

Современные микроконтроллеры по памяти, частоте процессора превзошли серверные станции из 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 и скорость.

can_baud  1 500000
can_baud 1 500000

При этом все настройки желательно хранить в NVRAM, чтобы они применялись автоматически при пере сбросе электропитания.

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

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

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

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

cdf  (can_diag_filers)
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://habr.com/ru/articles/939978/

Прошивка для переходника на основе платы JZ-F407VET6

https://github.com/aabzel/Artifacts/tree/main/jz_f407vet6_can_gcc_m

ЛикБез по CAN-FD

https://habr.com/ru/articles/793966/

Обзор Переходника USB-CAN (SYS TEC USB-CANmodul1)

https://habr.com/ru/articles/794310/

Настройка ToolChain(а) для Win10+GCC+С+Makefile+ARM Cortex-Mx+GDB

https://habr.com/ru/articles/673522/

Обзор USB-CAN переходника USBCAN-II C

https://habr.com/ru/articles/794831/

Обзор Протокола ISO-TP [ISO 15765-2]

https://habr.com/ru/articles/798489/

Пример CAN трафика

https://docs.google.com/spreadsheets/d/1AGdPkWEUJpL-DqwfBiQXcp8iG4rBm2TTlbpR1-Ipi3c/edit?gid=0#gid=0

Комментарии (17)


  1. Vadim_1984
    29.01.2026 22:21

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


    1. aabzel Автор
      29.01.2026 22:21

      А с usb-serial что не получилось? "переходник с USB на RS232"

      Это следующим этапом.


  1. HardWrMan
    29.01.2026 22:21

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

    Исходя из упомянутого выше резюмирую: если вы хотите автономное но в то же время достаточно полезное устройство, то используйте тандем из обычного и мощного МК. Например, RP2040+STM407. Или любую маленькую малинку с прикрученным CAN адаптером. Там вы сможете достаточно быстро и точно по времени управлять CANом и в то же время у вас будет достаточно вычислительной мощности для анализа и накопления данных. И при этом вы никак не будете привязаны к обычному ПК, вот буквально, к малинке же можно свой монитор прикрутить, верно?


    1. NutsUnderline
      29.01.2026 22:21

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


      1. HardWrMan
        29.01.2026 22:21

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


      1. Vadim_1984
        29.01.2026 22:21

        И еще с device tree разобраться придётся))


    1. aabzel Автор
      29.01.2026 22:21

       тандем из обычного и мощного МК. Например, RP2040+STM407. Или любую маленькую малинку с прикрученным CAN адаптером. 

      Да. Видел такое решение на прошлой работе.

      Там с Raspberry PI + CAN трансивера управляли тестировочным оборудованием внутри test-jig-и (8 отдельных плат) по CAN.

      К test jig-е поочередно подключался ECU и так проверяли собранные на конвейре ECU (для управления кузовной электроникой).


      1. HardWrMan
        29.01.2026 22:21

        Ну, это как автономный программатор. Крайне полезная но в то же время нишевая вещь.


    1. aabzel Автор
      29.01.2026 22:21

      Поэтому, ваша схема интересна

      Спасибо.


  1. x89377
    29.01.2026 22:21

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


    1. aabzel Автор
      29.01.2026 22:21

      Скорее нет чем да. Однако сорцы UART-консоли я раскрыл в предыдущем тексте.


      1. x89377
        29.01.2026 22:21

        Жаль конечно. Но нет, так нет.


  1. NutsUnderline
    29.01.2026 22:21

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


  1. Antares1991
    29.01.2026 22:21

    Оффтоп-вопрос: какой можете посоветовать CAN клиент на ПК, который на клиент будет похож, а не на студенческую курсовую? Сейчас пользуюсь Cangaroo и сильно страдаю(
    Из требований: отображение трафика, возможность отправки своих пакетов (одноразово и циклически), возможность группировки и фильтрации пакетов по ID


    1. 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. А аналог хочу сделать чтобы он работал вообще с любым донглом, даже китайским.


    1. aabzel Автор
      29.01.2026 22:21

      Сейчас пользуюсь Cangaroo и сильно страдаю(

      Аналогично.


    1. NutsUnderline
      29.01.2026 22:21

      BusMuster на всякий случай. в нем есть встроенный компилятор для плагинов.