
Преамбула
В данном тексте я выполнил обзор широко известного open source проекта прошивки для PCAN-Pro. Код которой лежит на Github. Мне удалось портировать и завести прошивку на покупной учебной отладочной плате JZ-F407VET6.
В каждой разработке с CAN нужны средства отладки. Я узнал, что в интернете есть открытый проект прошивки для культового прибора PCAN и попробовал его портировать на учебную отладочную плату JZ-F407VET6.
Справка по теории
SWD— Интерфейс для программирования микроконтроллера.
Справка по USB 2.0 (Full Speed)
Конечная точка USB (Endpoint) — это конкретный буфер или канал передачи данных внутри USB-устройства, через который хост (компьютер) отправляет и получает данные, а также команды управления, сгруппированные по типу: контроль, прерывание, пакетная (bulk) или изохронная передача. Каждое устройство может иметь до 32 таких точек (по 16 для входа и выхода), которые определяют, как именно данные перемещаются между хостом и устройством (например, чтение с устройства (IN) или запись на устройство (OUT)).
USB — это последовательный двухпроводной полудуплексный способ передачи информации и электропитания на расстояние до 5 метров между электронными платами (PCB). Тип сети: точка-точка. Битовая скорость достигает 480 Mbit/s. Терминирующий резистор 90 ом. На разъёме USB 2.0 помечается черным пластиком. Кодирование битов NRZi.

Данные передаются младшим битом вперед. Для надежности используется бит стаффинг и 16битная CRC. USB работает на физическом, канальном и сетевом уровне модели OSI-7.
Справка по CAN Classic
CAN — это двухпроводный, дифференциальный, последовательный, полудуплексный интерфейс для передачи бинарных данных между электронными платами (PCB). Кодирование битов NRZ

В качестве кабеля применяют одну витую пару проводов. Битовая скорость до 1 MBit/s.
Параметр
отличие
CAN Classic
USB 2.0
Гальваническая изоляция
0
нет
нет
определяет структуру пакета
0
да
да
Сопротивления терминирующего резистора, Om
1
120
90
порядок байт
0
Litttle endian
адрес устройства, bit
11….29
Дифференциальное напряжение, V
1,48…2
разрешение коллизий
1
да
нет
Тим сети
1
общая шина
точка-точка
Расстояние
1
40
5
колич. проводов
1
2+GND
4
Битовая скорость, MBit/s
1
1
480
CRC, bit
0
15
15
Кодирование бита
1
NRZ
NRZi
бит стаффинг
1
после каждых 5ти одинаковых
каждые 6 бит
payload, byte
1
8
8<x<1024
направления
0
Half-duplex
Half-duplex
разъём
1
трапеция
прямоугольник
год появления
1
198x
2000
колич устройств на шине
1
127
2
Для работы потребуется кое-что из оборудования:
Прибор
Количество
Программатор J-Link
1
логический анализатор DS logic
1
Кабель USB-A-USB-mini
1
джамперы
2
осциллограф, кабель AC для питания осциллографа
1
Переходник с USB на RS232
1
Для портирования прошивки вам потребуется плата с STM32 и CAN. Существует широко известная, доступная в продаже (2k RUR) синяя отладочная учебно- тренировочная электронная плата JZ-F407VET6 на основе микроконтроллера STM32F407VET6. На PCB как раз STM32 два CAN, USB и светодиоды. Эта плата идеально подходит для портирования прошивки PCAN-Pro-X.

Вот ее схемотехника

и блок-схема

Прошивка настраивает USB трансивер в Full Speed режим , поэтому в электрическую цепь надо добавить программную подтяжку (1500 Om) к питанию на проводе D+ . Чтобы при подключении OS могла сразу понять тип устройства Full Speed.

Программная часть
Оригинальные исходники из которых собирается прошивка лежат на github и функционал там формально залочен. Если собрать и прошить, то операционная система Windows не увидит устройство. PCAN-View тоже проигнорирует CAN устройства.

Это проблему я смог решить при помощи ИИ.
Адаптация прошивки
Надо внести в исходники ряд изменений, чтобы просто разлочить прошивку. Первым делом надо прописать корректный VID (0x0C72) [vendor id ]. Чтобы Windows Peak-System драйвер обнаружил устройство корректно надо в коде прошивки прописать VID:0x0C72 и PID:0x000D.
#define USBD_VID 0x0C72
в
в
Cобрать прошивку в конфигурации PCAN_PRO и определить вот эти макросы:
#define USBD_PID_HS 0x000d
#define USBD_PRODUCT_STRING_HS «XCAN-USB-PRO»
#define USBD_INTERFACE_CAN_STRING_HS «XCAN-USB-PRO CAN Device»
#define USBD_INTERFACE_LIN_STRING_HS «XCAN-USB-PRO LIN Device»
внести такие изменения

внести такие изменения

Прошивку надо собрать с макросами препроцессора
Макрос
Пояснение
USB_WITHOUT_ISR=1
работать без USB прерываний
PCAN_PRO=1
PCB PCAN_PRO
INCLUDE_LIN_INTERFACE=1
активировать LIN
USB_MODULE_ID=DEVICE_FS
Высокоскоростной режим USB Full speed
В скриптах сборки Make это выглядит вот так
OPT += -DUSB_WITHOUT_ISR=1
OPT += -DPCAN_PRO=1
OPT += -DINCLUDE_LIN_INTERFACE=1
OPT += -DUSB_MODULE_ID=DEVICE_FS
После этого по крайней мере прошивка будет признаваться Windows драйвером.

После пересборки и загрузки бинаря Windows стала распознавать прибор.
Стоит отметить, что оригинальная прошивка работает абсолютно без прерываний. Все подсистемы: CAN, USB, Timer работают в режиме обыкновенного опроса.
Сопряжение с PC
Прошивка работает с версией PCAN драйвера c номером 4.2.3…..4.2.4. В случае успешного обнаружения прошивки диспетчер устройств увидит устройство

Свойства драйвера

Ключевые параметры

Диагностика драйвера
Device USBVID_0C72&PID_000D&MI_007&37ef5e6d&0&0000 was configured.
Driver Name: oem300.inf
Class Guid: {c38c9d86-471e-4d6b-9fb6-78dda20e3f70}
Driver Date: 04/08/2021
Driver Version: 4.2.3.16490
Driver Provider: PEAK-System Technik GmbH, Darmstadt, Germany
Driver Section: PkUsbPro.DeviceInstall.NT
Driver Rank: 0xFF0001
Matching Device Id: USBVID_0C72&PID_000D&MI_00
Outranked Drivers:
Device Updated: false
Parent Device: USBVID_0C72&PID_000D6&7c39754&6&3
Клиентская утилита

Основное окно утилиты

Версию прошивки можно увидеть во вкладке View —> PCAN-USB Pro

Достоинства custom прошивки для PCAN-View
1)Это дёшево. Код для устройства взят из интернета бесплатно. Покупать надо только отладочную плату с STM32, USB, 2xCAN и LEDами.
2)Вы получаете бесплатный драйвер.
3)Вы получаете бесплатную Windows клиентскую программу для прошивки PCAN-View. Вам не надо отдельно разрабатывать клиентскую утилиту. Вы просто берёте утилиту PCAN-View из драйвера версии 4.2.3.
4)Устройство может работать на относительно высоких нагрузках CAN шины. До 1Mbit/s
5)Win драйвер позволяет подключаться к прибору из нескольких приложений
Недостатки open-source прошивки PCAN
– USB не успевает отправлять набегающий с улицы поток CAN пакетов. Пошаговая отладка J-link программатором показывает, что переполняется массив на отправку в USB. Даже вопреки тому, что USB FS — это быстрый интерфейс однако сами данные в USB отправляются 12 MBit квантами с периодом отправки 1ms. Эти кванты регулирует PC, так как мастером USB шины всегда является HOST устройство. Решение сбоя: добавить таймаут проверку, которая запрещает отправку в USB первые 5-6 секунд с момента подачи на PCB питания. Эти первые 5-6 секунд необходимы, чтобы OS Windows обнаружила новое подключенное устройство. Это исправляет зависания при включении.
–В клиентской программе PcanView нет опции дозированной отправки точного количества пакетов с последующей остановкой.
–Можно заменить каскадный таймер для таймштампов (два 16 бит) на один 32 битный. На MCU как раз TIM2(32b) TIM5(32b) свободные.
–Нынешние 96MHz — это не предельная частота из которой можно тактировать CPU. Можно разогнать чип до 168MHz. Но для такой тактовой частоты надо переписывать настройку пред делителей CAN, которые сейчас прохардкожены для APB производной из 96MHz.
– оригинальная прошивка иногда зависает при пре сбросе электропитания. Отладка GPIO пином показывает, что зависание происходит внутри функции pcan_usb_device_poll, которая в свою очередь вызывает HAL_PCD_IRQHandler -> PCD_EP_OutXfrComplete_int-> HAL_PCD_DataOutStageCallback-> USBD_LL_DataOutStage-> ret = (USBD_StatusTypeDef)pdev->pClass->DataOut(pdev, epnum)-> device_data_out-> pcan_protocol_process_data-> pcan_protocol_set_baudrate-> assert( 0 ); и концы в воду. Прошивка зависает на assert( 0 ); Надо убрать все assert функции.
– В устройстве зависает USB при подключении на около предельной нагрузке в CAN шине. Пошаговая отладка J-link программатором показывает, что переполняется массив на отправку в USB. При старте USB не успевает отправлять набегающий с улицы поток CAN пакетов. Даже вопреки тому, что USB FS — это быстрый интерфейс однако сами данные в USB отправляются 12 MBit квантами с периодом отправки 1ms. Эти кванты регулирует PC, так как мастером USB шины всегда является HOST устройство. В исходную прошивку я добавил таймаут проверку, которая запрещает отправку в USB первые 7 секунд с момента подачи на PCB электропитания. Эти первые 5-6 секунд необходимы, чтобы OS Windows обнаружила новое подключенное устройство. Теперь баг исчез.
— Надо отключать CAN-периферию от шины на время инициализации.
Результат
Удалось получить полный контроль к исходникам прошивки прибора PCAN-Pro. Это открывает дорогу к использованию их готового клиентского ПО для PC PCAN-Pro-X (4.2.3).
Это бюджетное решение получить хороший переходник с USB на CAN. Достаточно просто купить отладочную плату с STM32 USB и двумя CAN и собрать для нее прошивку из репозитория. В результате вы фактически получите PCAN-Pro-X по цене отладочной платы. Плюс вам не надо писать Windows драйвер и клиент для Windows. Это уже появляется само после установки PEAK драйвера 4.2.3
Словарь
Сокращение
расшифровка
PCD
Peripheral Controller Driver
PHY
physical layer
PID
product id
VID
vendor id
ECU
Electronic control unit
MAC
medium access control
UART
Universal Asynchronous Receiver/Transmitter
PCAN
Peak CAN
CAN
Controller area network
Больше ссылок
Название
URL
электронная плата JZ-F407VET6 с STM32F407VET6
https://aliexpress.ru/item/1005012356651068.html?sku_id=12000058163717122&spm=a2g2w.productlist.search_results.1.2124d167uht7L0
Введение в разработку USB периферии @TimurGilfanov
https://habr.com/ru/articles/90774/
USB in a NutShell — путеводитель по стандарту USB (начало)
https://microsin.net/programming/arm-working-with-usb/usb-in-a-nutshell-part1.html
Репозиторий с проектом pcan_pro_x
https://github.com/moonglow/pcan_pro_x
Обзор USB-CAN переходника USB2CANFD_V1
https://habr.com/ru/articles/944112/
CAN — BUS
https://en.wikipedia.org/wiki/CAN_bus
Тестовый зажим SDK08 для LQFP микросхем
https://aliexpress.ru/item/1005008647216059.html?shpMethod=CAINIAO_STANDARD&sku_id=12000046082389639&spm=a2g2w.productlist.search_results.0.7a97630b1uMjz2
CAN — bus
https://en.wikipedia.org/wiki/CAN_bus
USB in a NutShell Making sense of the USB standard
https://www.beyondlogic.org/usbnutshell/usb1.shtml
peak-system
CAN adapter Female DB9 LIN Board PCAN USB to CAN terminal resistance 120 Wiring terminals
https://www.peak-system.com/
https://aliexpress.ru/item/1005005815716199.html?spm=a2g2w.orderdetail.0.0.53604aa6XtJmWW&sku_id=12000034448826076
Всё о CAN-шине и не только
https://t.me/All_About_CANbus
Клоны PCAN преспокойно продают на OZON всего за 3 902 ₽
https://www.ozon.ru/product/pcan-usb-sovmestimyy-peak-model-ipeh-002022-002021-2988457867/?at=WPtNQnkggtPvWDRJS1opvnlSwgGBX4uxMXvYLTrDmZGr
примочки для подключения логического анализатора на USB (usb test board XY-USB4)
https://aliexpress.ru/item/1005008003572918.html?shpMethod=CAINIAO_SUPER_ECONOMY&sku_id=12000043227631212&spm=a2g2w.productlist.search_results.1.71077fd4sYvNJv
Источник: habr.com