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

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