Files

4.8 KiB
Raw Permalink Blame History

UKSVEP STM32F103RC: регистровый CAN

Профиль относится к UKSVEP_ICE_22220.6: Core/Src/can.c, Core/Inc/package.h, Core/Src/message.c, Core/Src/lampa.c и main.h. Он подключён в SETGUI как отдельный эмулятор проекта «Ледокол».

Classic CAN, extended 29-битный ID, DLC=8, 250000 бит/с. DeviceID 0…15 задают J0…J3; Mode=DeviceID+1. Данные ВЭП: 0x001CE000 | DeviceID; команды ВЭП: 0x001CE020 | DeviceID. Это регистровое приложение, а не ProtoCAN Boot Type5. Broadcast из старого приложения не выдаётся этим клиентом за адресный ответ.

Payload общий с историческим balsam_can: word2, word3, адрес/маска, word1, по два байта big endian. В заголовке биты15…13 задают присутствие слов, биты12…0 — начальный адрес. uksvep_can ограничивает банк R0…R127; отсутствующие слова не должны обнулять предыдущее состояние. Маршрутизация других Balsam-плат остаётся в их собственном профиле.

Регистры Назначение
0 / 1 / 2 Входы / неисправности / аварии
8 / 9 Маски неисправностей / аварий
23 Перемычки; младший полубайт соответствует DeviceID
48 Sleep_time, секунды
100 Brightness, 0…10 тактов ШИМ
101 / 102 Cancount, быстрый / медленный период по 10 мс
125 / 126 / 127 Версия протокола / Mode / команды

Назначения входов, GPIO, команд и значения по умолчанию доступны через uksvep_field_*, uksvep_input_name, uksvep_command_name. uksvep_evaluate_inputs моделирует ReadEnteres: R0.7 никогда не является неисправностью/аварией; R0.8 всегда является неисправностью и становится аварией по Error_mask.8; R0.9 всегда является неисправностью и аварией. Вход R0.9/PB12 читается без инверсии, остальные назначенные сигналы собираются в соответствии с физической картой STM32-проекта.

Слои

SETGUI → protocan/uksvep.py (ctypes) → uksvep_can.c → общий payload balsam_can.c. Ни GPIO, ни Qt, ни часы ОС общему C-профилю не нужны; динамическая память не используется. Вычисления и wire не дублируются в Python.

Все выходные буферы принадлежат caller и имеют явную capacity:

  • uksvep_can_encode: минимум8 байтов, возвращает8 либо0;
  • uksvep_can_decode: минимум8 слов uint16 — направление, количество, затем максимум3 пары адрес/значение; возвращает число пар,0 для чужого ID, −1 для неверных аргументов/своего повреждённого кадра;
  • uksvep_field_info: минимум4 слова uint16 — адрес, максимум, default, flags;
  • uksvep_evaluate_inputs: минимум2 слова uint16 — неисправности и аварии.

Флаги полей: PARAM=1, COMMAND=2, STATE=4. GUI использует их для выбора допустимых редакторов роли. Имена возвращаются постоянными строками UTF-8; владение памятью клиенту не передаётся. Для применения RX клиент дополнительно отбрасывает STD/RTR и собственное направление/эхо. Физические уровни LED0…LED3 и PVT по текущему регистровому CAN не передаются; интерфейс не должен представлять расчётные лампы как измерение этих GPIO.

Проверки

test_uksvep_can фиксирует независимые wire-эталоны, все16 адресов, малый выходной буфер, границы R127, sparse101, неверный DLC, чужие профили, особые входы и регрессию прежнего decoder Бальзам. Python-тесты используют ту же DLL, GUI-тесты подменяют только аппаратный драйвер.