В разработке электроники часто нужны переходники с 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 ). Или клиентская утилита запускается, пишет лог, отражается в диспетчере задач, но не разворачивает свой GUI (зависла в инициализации). Или клиентская утилита показывает фантомные отправки, а потом внезапно вылетает, роняя за собой Windows 11 (привет PCAN-View). Знакома ситуация?

Ситуация осложняется ещё и тем, что в клиентских утилитах часто просто нет необходимого функционала. Например дозированной отправки точного количества специфических CAN пакетов c конкретным периодам, или вычисления diff между текущим пакетом и предыдущим. Вишенка на торте в том, что со временем либо клиентская утилита, либо драйвер просто берут и перестают работать из-за обновлений операционной системы Windows или самой клиентской утилиты.

Доходит до того, что в каждой компании отбрасывают в сторону клиентскую утилиту от вендора и просто пишут заново свою отдельную клиентскую Win утилиту (на QT C++ или .NET C#) для покупного CAN переходника, чтобы хоть как-то можно было тестировать CAN шину.

Вот такие вот пирожки с капустой, понимаете?

Решение проблемы

Я предлагаю разработать такую полноценную прошивку устройства, для работы с которым не будет нужно клиентского ПО вообще! Суть в том, чтобы выбрать какую-нибудь отладочную плату с аппаратным CAN и USB, например первую попавшуюся JZ-F407VET6 и написать для нее своеобразную прошивку, которая позволит принимать и отправлять произвольные CAN пакеты по UART-Shell или serial over USB.

JZ-F407VET6
JZ-F407VET6

Современные микроконтроллеры по памяти, частоте процессора превзошли серверные станции из 198x. А раз так, то почему бы и не насытить прошивку нормальным прикладным функционалом? Затем на LapTop 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_hi_load. Она отправляет пакет 0x55 с payload 0x5555555555555555 N раз с интервалом P ms
cshl Num N P

#

Имя аргумента

Пояснение

1

Num

Номер CANа

2

N

Количество пакетов что надо отправить

3

P

Пауза между пакетами в ms

К слову, функционала дозированной отправки нет ни в одной известной мне клиентской утилите для работы с CAN!

Само собой можно принимать 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 mini кабель, чтобы подключиться к консоли на VCOM.

Что можно улучшить?

Вообще с платой на которой два 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 mini кабель, программатор 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

Ссылки

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
У Вас есть плата JZ-F407VET6?
16.67%да4
83.33%нет20
Проголосовали 24 пользователя. Воздержался 1 пользователь.