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