
Преамбула
В данном тексте я выполнил обзор широко известного 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 USB\VID_0C72&PID_000D&MI_00\7&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: USB\VID_0C72&PID_000D&MI_00
Outranked Drivers:
Device Updated: false
Parent Device: USB\VID_0C72&PID_000D\6&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 | |
Введение в разработку USB периферии @TimurGilfanov | |
USB in a NutShell - путеводитель по стандарту USB (начало) | https://microsin.net/programming/arm-working-with-usb/usb-in-a-nutshell-part1.html |
Репозиторий с проектом pcan_pro_x | |
CAN - BUS | |
Тестовый зажим SDK08 для LQFP микросхем | |
CAN - bus | |
USB in a NutShell Making sense of the USB standard | |
peak-system CAN adapter Female DB9 LIN Board PCAN USB to CAN terminal resistance 120 Wiring terminals |
Всё о CAN-шине и не только | |
Клоны PCAN преспокойно продают на OZON всего за 3 902 ₽ | |
Примочки для подключения логического анализатора на USB (usb test board XY-USB4) |
