diff --git a/NEW_PROJECT.md b/NEW_PROJECT.md index c3aeb12..7701a24 100644 --- a/NEW_PROJECT.md +++ b/NEW_PROJECT.md @@ -84,7 +84,7 @@ STM32F103RC, STM32F103ZE и STM32G474CE объявляют поддержку з возвращают `PNAND_ERROR_WRITE_PROTECTED`, пока плата и порт не доработаны. Рабочий пример полноценного G474-порта находится в соседнем проекте -`candleLight_fw`: `src/device/device_g4.c` отвечает за clock/GPIO, +`CANdle_stm32` (candleLight): `src/device/device_g4.c` отвечает за clock/GPIO, `src/can/m_can.c` — за FDCAN, а `include/config.h` — за привязку платы STM32G474VET6. Эти файлы остаются в прошивке, поскольку зависят от STM32 HAL, USB gs_usb и конкретной разводки адаптера; переносимая логика протоколов diff --git a/README.md b/README.md index 0c1001c..3ac3239 100644 --- a/README.md +++ b/README.md @@ -40,9 +40,10 @@ templates/ | [`c/set-protocol/ports/stm32f407-devboard-v1`](c/set-protocol/ports/stm32f407-devboard-v1) | доступ SETGUI к Modbus-регистрам F407 через CAN485 DevBoard_V1 | `pcan_modbus_server`, STM32 HAL CAN | bxCAN FIFO0 и callbacks карты регистров | | [`c/set-protocol/ports/stm32-bxcan`](c/set-protocol/ports/stm32-bxcan) | порт прикладного ProtoCAN для STM32, бывший SETCAN; сохранён API `PROTOCAN_*` | STM32 HAL CAN/RTC/TIM + общее ядро `pcan_id` | classic bxCAN; настройки платы предоставляет прошивка | | [`c/set-protocol/ports/tms320f2812`](c/set-protocol/ports/tms320f2812) | SETProtocol v2 firmware service по segmented classic CAN | `set_protocol`, `set_can`, `set_firmware` | CAN TX, Flash erase/write/read, optional signature policy и reboot | -| [`c/protocan-boot`](c/protocan-boot) | адресная прошивка по ProtoCAN: A/B-слоты, сессия, CRC32, verify и rollback-контракт | C99 | CAN TX, erase/write Flash, boot metadata, проверка образа и reboot | +| [`c/protocan-boot`](c/protocan-boot) | адресная прошивка по ProtoCAN: A/B-слоты, сессия, CRC32, verify и rollback-контракт | C99 | **STM32F103C8/F407VE/G474VE и TMS320F2812/F28335-порты в комплекте**; проекты STM32 подключены через templates, есть boot main и вход из приложения | | [`c/rs485-boot`](c/rs485-boot) | прошивка по RS-485 в формате SETGUI v1: потоковый parser, CRC32 и resume | C99 | UART TX/RX, DE, Flash — **порты STM32F103 и STM32G474VET в комплекте** | | [`c/rtc-service`](c/rtc-service) | RTC с резервированным backup-томом | `stdint.h` | доступ к RTC и backup-памяти — **порт K1921VK028 в комплекте** | +| [`c/global-time`](c/global-time) | программные часы 1 мс, ProtoCAN RTCSETUP, готовность платы и атомарная метка логгера | C99 | IRQ lock, CAN TX, такт 1 мс — **порт TMS320F28335 eCAN-A / CPU Timer2 в комплекте** | | [`c/firmware-info`](c/firmware-info) | SemVer, build stamp и git build ID работающего образа | C99 | config-порты STM32F1/F4/G4 и К1921ВК028; упаковка для Modbus/SETGUI | | [`c/parallel-nand`](c/parallel-nand) | parallel NAND x8: raw read/program/erase, профили Micron MT29F1G08 и Hynix HY27UF084G2M, bad-block marker и банковое окно GAS для SETGUI | C99, опционально `set-protocol/pcan_gas` | **порты TMS320F2812, STM32F103RC/ZE, STM32F407VE и STM32G474CEU6; запись требует управляемого WP#** | @@ -64,6 +65,7 @@ templates/ | Инструмент | Что делает | |---|---| +| [`tools/firmware-build/fpga`](tools/firmware-build/fpga/README.md) | общий итератор версии и HDL-паспорт для Xilinx ISE, Vivado и Altera/Intel Quartus; контроль `.bit`/`.sof`, manifest, SHA-256 и архив | | [`tools/firmware-publish`](tools/firmware-publish) | единый BAT и конфигурации для проверки и публикации `.hex` Keil / `.bin` CCS 12 в каталоге SETGUI | Общие тренды для Android GUI и SETGUI: [формат JSON, C99-ядро и адаптеры](c/set-protocol/docs/GUI_TRENDS.md). @@ -118,7 +120,7 @@ git subtree pull --prefix lib/templates https://git.rd12.ru/Andrey/templates.git | `KONOR_ds18b20` | st7789, keypad, menu, eeprom-ft24c256, can-sensor, ds18b20, firmware-info | | `OpticalTester` | st7789, keypad, menu, eeprom-ft24c256 | | `CAN_to_RS485` | set-protocol legacy transport, python/protocan | -| `candleLight_fw` | эталон разделения общей логики и G431/G474 FDCAN-порта; общий ProtoCAN Boot переносится по контракту `protocan-boot` | +| `CANdle_stm32` (candleLight) | G431/G474 FDCAN board-support; CAN/UART-загрузчик G474 и вход из приложения подключены к `protocan-boot/ports/stm32g474` через templates | | `SETGUI` | python/protocan | | `SETGUI`, Android GUI и новые устройства SET | set-protocol | | `k1921vk028` | rtc-service | diff --git a/doc/setcan/ALTERA_LOGIC_STREAM.md b/doc/setcan/ALTERA_LOGIC_STREAM.md index 13b6078..acf8e55 100644 --- a/doc/setcan/ALTERA_LOGIC_STREAM.md +++ b/doc/setcan/ALTERA_LOGIC_STREAM.md @@ -1,5 +1,7 @@ # Altera Logic — ONLINE через SETCAN / GAS / UART +> GAS `0x3` использует адреса отдельных 16-битных регистров. GAS SLOT `0x4` — отдельный сервис с маской в Word0 и тремя значениями Word1…Word3. Спецификация: `doc/setcan/protocan/OAP.md`; адреса этого документа остаются регистровыми. + Версия профиля: **1**. Реализация, порты и тесты принадлежат `templates`. Это профиль существующего classic SETCAN/ProtoCAN с 29-битным ID; он не подменяется кадром SETP v2 и не использует старые команды `A5 CMD` FPGA. diff --git a/doc/setcan/DEVICE_REGISTRY.md b/doc/setcan/DEVICE_REGISTRY.md index f25a2cd..c9dc88e 100644 --- a/doc/setcan/DEVICE_REGISTRY.md +++ b/doc/setcan/DEVICE_REGISTRY.md @@ -7,10 +7,24 @@ Device Name — отображаемое имя адреса, а не допол | DeviceType | DeviceID | Device Name | Назначение | |---|---|---|---| | `0x0` | существующие | Верхний уровень | Существующие адреса исходной таблицы | -| `0x6` | `0xE` | **Altera Logic** | Онлайн-анализатор 16 цифровых каналов | +| `0x1` | `0x0…0xF` | PERIPH 0–15 | Первая группа периферии по обновлённому листу «Интерфейс протокола» | +| `0x2` | `0x0…0xF` | PERIPH 16–31 | Вторая группа; номер PERIPH = 16 + DeviceID | +| `0x1` | `0x5` | **УМП1** | PERIPH 5, собственный адрес обычного обмена ProtoCAN и загрузчика | +| `0x1` | `0x6` | УМП2 | PERIPH 6, GAS 0x3 — регистры; GAS SLOT 0x4 — слоты 0x0600…0x0642 | +| `0x6` | `0xE` | Altera Logic | Отдельный существующий потоковый профиль FE00/FF00 | | `0x7` | `0xD` | configurator | Существующий конфигуратор | +| `0x7` | `0xE` | **STM Invertor** | Самостоятельный ПЧ STM32G474VET6; отдельный GAS-профиль на 250 слотов 0x4, 750 значений; Word0 — маска | | `0x7` | `0xF` | KONOR / SETTINGS | Существующий профиль SETCAN и привязка датчиков | +Источник PERIPH: [Протокол CAN и ОАП.xlsx](Протокол%20CAN%20и%20ОАП.xlsx), +лист «Интерфейс протокола», A44:F79. Формула: Type = 1 + ID PERIPH / 16 +(целая часть), DeviceID = ID PERIPH mod 16. Зарезервированные номера не получают +назначений по аналогии со старым Бальзам CAN. Общий Boot-адрес `3/7` отменён. +В ПМ35 приложение использует аппаратный Mode, постоянный загрузчик читает те же +GPIO21/20/22/51; на существующей плате четыре перемычки задают номера 1–16. +Для номеров 0 и 17–31 требуется соответствующий источник аппаратного номера. +Старые CAN ID `0x00BA0007`/`0x00BA0017` задатчика остаются отдельным legacy-форматом. + Для Altera Logic выбран предпоследний тип `0x6` и предпоследний экземпляр `0xE`: эта пара не была назначена в проверенных локальных таблицах и исходниках. Тип `0x7` уже используется. Наличие другого физического узла с тем же адресом @@ -19,3 +33,9 @@ Device Name — отображаемое имя адреса, а не допол Числовые константы устройства: `c/set-protocol/include/altera_stream.h`. Отображаемые имена: `python/protocan/protocan.py`. Контракт потока: [ALTERA_LOGIC_STREAM.md](ALTERA_LOGIC_STREAM.md). + +## Mode и два типа GAS + +Таблица назначений и правила: [OAP.md](protocan/OAP.md). Mode 1/2 — трансформаторы; 3/4 — силовые узлы; 5/6 — УМП; 7 — ENG1; 8 — задатчик/пульт (`adr_PULT`); 9 — шкаф. 10 и 11 — служебные роли общего адреса и терминала. Остальные назначения не выводятся по аналогии со старым Бальзам CAN. + +GAS 0x3 адресует отдельные регистры 0…65535. GAS SLOT 0x4: `Slot=(mode<<8)|LocalSlot`, LocalSlot `0x00…0x42`; Word0 — маска, Word1…Word3 — значения. На mode сохранены 200 значений; последний слот содержит два. Прибор 5 не обслуживает страницу 0x06xx. diff --git a/doc/setcan/README.md b/doc/setcan/README.md index 734ab80..e6987ea 100644 --- a/doc/setcan/README.md +++ b/doc/setcan/README.md @@ -36,3 +36,7 @@ - [Реестр устройств SETCAN](DEVICE_REGISTRY.md). - [ONLINE-поток Altera Logic через GAS и UART](ALTERA_LOGIC_STREAM.md). + +## GAS: регистры 0x3 и слоты 0x4 + +[Адресация GAS](protocan/OAP.md): `0x3` — отдельные 16-битные регистры `0…65535`, запись 1…4 слов. `0x4` — слот с Word0-маской и тремя значениями; PERIPH сохраняет 200 слов в 67 слотах `0xMM00…0xMM42`. Формат определяется MsgType, без настройки профиля. diff --git a/doc/setcan/index.html b/doc/setcan/index.html index bc83213..c455bb1 100644 --- a/doc/setcan/index.html +++ b/doc/setcan/index.html @@ -168,7 +168,7 @@ Priority Route DeviceType DeviceID MsgType MsgBody 1 бит 1 бит 3 бита 4 бита 4 бита 16 бит
Многобайтовые значения payload передаются little-endian. Разметка ID через C bit-fields требует проверки при смене компилятора или ABI.

Реестр MsgType

- +
КодТипНазначениеСтатус
0x0BROADCASTОбщие команды всем устройствамstable
0x1DISCRETEСостояния, команды, флагиstable
0x2ANALOGДатчики U / I / T и универсальные данныеstable
0x3GASОбщее 16-битное адресное пространствоstable
0x4…0x7MODBUSCoil, Discrete, Holding, Inputstable
0x8ERRORКод ошибки и дополнительная информацияstable
0x9…0xDBOOTУправление, блоки A/B, статус, discoverydraft
0xESETTINGSПривязка 1-Wire ROM к локации Z/Ystable
0xFPULSEПрисутствие устройстваstable
0x0BROADCASTОбщие команды всем устройствамstable
0x1DISCRETEСостояния, команды, флагиstable
0x2ANALOGДатчики U / I / T и универсальные данныеstable
0x3GASОбщее 16-битное адресное пространствоstable
0x4GAS SLOTWord0 — маска битов 1…3, Word1…Word3 — три значенияstable
0x5…0x7MODBUSDiscrete, Holding, Inputstable
0x8ERRORКод ошибки и дополнительная информацияstable
0x9…0xDBOOTУправление, блоки A/B, статус, discoverydraft
0xESETTINGSПривязка 1-Wire ROM к локации Z/Ystable
0xFPULSEПрисутствие устройстваstable
@@ -300,8 +300,8 @@ if (PROTOCAN_SEND(id, tx) != PROTOCAN_OK) {

Документация ProtoCAN

Статус комплекта: Draft
-Версия комплекта: 1.0
-Дата редакции: 2026-08-29
+Версия комплекта: 2.1
+Дата редакции: 2026-10-23
Транспорт: Classic CAN 2.0B, Extended ID, DLC 0…8

Этот каталог разделяет нормативное описание протокола, загрузчик и реестр общего адресного пространства. Большой исходный документ @@ -364,10 +364,12 @@ if (PROTOCAN_SEND(id, tx) != PROTOCAN_OK) {

Все документы и тестовые векторы включаются в единый файл doc/setcan/index.html. Скрипт не изменяет исходные Markdown/XLSX и пригоден для запуска в CI.

+

GAS: регистры 0x3 и слоты 0x4

+

Адресация GAS: 0x3 — отдельные 16-битные регистры 0…65535, запись 1…4 слов. 0x4 — слот с Word0-маской и тремя значениями; PERIPH сохраняет 200 слов в 67 слотах 0xMM00…0xMM42. Формат определяется MsgType, без настройки профиля.

ProtoCAN — базовый протокол

Статус: Stable с зарезервированным загрузочным расширением
-Версия: 1.0
+Версия: 2.1: GAS 0x3 и масочный GAS SLOT 0x4
Порядок байтов payload: little-endian, если явно не указано иное

Назначение

ProtoCAN — прикладной протокол поверх classic CAN 2.0B. Используются только @@ -502,14 +504,14 @@ Priority Route DeviceType DeviceID MsgType MsgBody GAS оба 0/2/4/6/8 -stable +регистры 0…65535 0x4 -MODBUS_COIL +GAS_SLOT оба -0…8 -stable +0/8 +Word0 — маска, Word1…Word3 — значения 0x5 @@ -613,10 +615,14 @@ Priority Route DeviceType DeviceID MsgType MsgBody начальный адрес [15:4], количество [3:0] -GAS +GAS 0x3 адрес первого 16-битного регистра [15:0] +GAS SLOT 0x4 +адрес слота [15:0]; маска — в Word0 payload, значения — Word1…Word3 + + error дополнительная информация [15:8], код [7:0] @@ -634,7 +640,11 @@ Priority Route DeviceType DeviceID MsgType MsgBody +

Контракт обоих GAS: OAP.md. Тип 0x3 адресует отдельные слова; тип 0x4 имеет маску битов 1…3 в Word0 и три значения. Для PERIPH 0x4 используются 67 слотов 0xMM00…0xMM42, последний содержит два значения. Старый Coil 0x4 заменён; формат определяется MsgType.

Общие правила обмена

+

Профиль синхронизации часов и сообщения платы о завершении инициализации: +GLOBAL_TIME.md. Он сохраняет штатный BROADCAST RTCSETUP +и определяет общий пакет готовности поверх DISCRETE/FLAGS.

-

Общее адресное пространство

-

Статус: Stable, данные ведутся в XLSX
-Порядок значений: 16-битные регистры, little-endian в CAN payload

-

Редактируемый источник реестра: -Протокол CAN и ОАП.xlsx.

-

Просматриваемая большая таблица находится в -Протокол CAN и ОАП.html и -Протокол CAN и ОАП.md.

-

Назначение

-

ОАП связывает 16-битный адрес регистра с его типом, назначением, доступом и -масштабом. В ProtoCAN используется MsgType=0x3, а MsgBody содержит адрес -первого регистра.

-

Обязательные поля реестра

+

Общее адресное пространство: GAS и GAS SLOT

+

Дата редакции: 2026-10-23. Номер типа однозначно определяет единицу адресации:

- - + + + + - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + +
ПолеТребованиеMsgTypeИмяMsgBodyPayload
AddressHex0x0000…0xFFFF, уникальное значение0x3GASадрес первого 16-битного регистра1…4 последовательных регистра, DLC 2/4/6/8
AddressDecдесятичный эквивалент AddressHex
Groupфункциональная группа
Nameоднозначное имя параметра
Typeu16, i16, u32, i32, float32, bitmap или массив
Registersчисло занятых 16-битных регистров
AccessR, W или RW
Unitфизическая единица либо —
Scaleмножитель/делитель представления
Defaultзначение после сброса, если применимо
Descriptionсемантика, диапазон и особые значения0x4GAS SLOTадрес слотаWord0 — маска; Word1…Word3 — три значения; DLC 8
-

Правила ведения

+

В обоих случаях запрос чтения — extended data frame с DLC=0, Route=0. +Ответ имеет Route=1, тот же узел и адрес. Прикладного ACK записи нет; +успех применения уставки проверяется прикладным ответом или последующим чтением. +RTR, error frame, стандартный 11-битный ID и нечётные длины не исполняются.

+

GAS 0x3: отдельные регистры

+

MsgBody=RegisterAddress[15:0]. Адреса 0…65535 (0x0000…0xFFFF) +обозначают 65 536 отдельных 16-битных регистров, логически 128 КиБ на узел. +Это адреса протокола, а не указатели RAM MCU; provider подключает только существующие регионы.

+

Payload содержит значения с адресов addr, addr+1, addr+2, addr+3 +в порядке little-endian. Количество равно DLC/2, допускаются DLC 2, 4, 6, 8. +Для изменения одной уставки по адресу 0x0001 на 0x1234 передаются +MsgBody=0x0001, DLC=2, Data=34 12; соседние слова не изменяются. +Чтение возвращает до четырёх существующих последовательных регистров, +останавливаясь на первом недоступном адресе или границе 0xFFFF. +Запись, пересекающая 0xFFFF, отвергается до изменения данных.

+

Регионы карты, права и значения проверяет pcan_gas; callback остаётся +ответственностью приложения. Блочная запись может остановиться на первом отказе provider: +атомарность нескольких регистров не обещается. Связанные u32/float32 и команды +требуют согласованной прикладной операции. Основной контракт: c/set-protocol/docs/legacy/GAS.md. +GAS 167/v1, GAS Logger, GAS_WATCH2, NAND и Altera Logic сохраняют регистровые адреса. +Номер mode задаёт адрес узла; его нельзя автоматически прибавлять к адресу регистра.

+

GAS SLOT 0x4: маска в Word0

+

MsgBody=SlotAddress[15:0]. Восемь октетов имеют фиксированное расположение:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ОктетыWire-словоНазначение
0…1Word016-битная маска, little-endian
2…3Word1первое значение
4…5Word2второе значение
6…7Word3третье значение
+

Биты маски 1, 2, 3 соответствуют Word1, Word2, Word3. Бит 0 и биты 4…15 +зарезервированы и должны быть нулевыми. Маска непустая; все допустимые маски: +0x0002, 0x0004, 0x0006, 0x0008, 0x000A, 0x000C, 0x000E. +При записи отмеченные значения применяются, неотмеченные позиции игнорируются +и сохраняют текущие значения устройства. Нули не являются специальными маркерами. +При чтении маска ответа отмечает достоверные/доступные значения.

+

Например, изменить только Word2 на 0x1234: Data=04 00 00 00 34 12 00 00. +Word1 и Word3 сохраняются. Полная запись трёх значений использует маску 0x000E. +Передаются всегда восемь октетов, кроме пустого запроса чтения. Сжатия или сегментации нет. +Provider проверяет все выбранные права и значения до первого изменения, затем применяет +выбранные слова под общей блокировкой. Невыбранные readonly-поля не записываются. +Ядро не выполняет опасное чтение-изменение-запись слота на стороне клиента.

+

Полное пространство 0x4 содержит 65 536 слотов × 3 значения = 196 608 слов = 384 КиБ. +Word0 — метаданные кадра, не четвёртый хранимый регистр. Координата значения — +(SlotAddress, WordIndex), где WordIndex=1…3. Любой узел поддерживается общими +pcan_gas_slot_id() и pcan_gas_slot_handle_address(); адрес слота не ограничен страницами PERIPH. +Тип 0x4 MODBUS_COIL заменён этим сервисом. Modbus 0x5/0x6/0x7 сохраняет номера. +Старое оборудование с Coil 0x4 требует согласованного обновления; автоопределения формата нет.

+

PERIPH: проекция 200 слов на слоты 0x4

+

mode=0…31; DeviceType=1+mode/16, DeviceID=mode mod 16. +SlotAddress=(mode<<8)|LocalSlot. Маски не занимают места в карте значений. +На mode сохранены 200 слов, поэтому используются 67 слотов LocalSlot=0x00…0x42: +66 полных слотов и два значения последнего. В последнем разрешена только маска +из битов 1/2 (0x0002, 0x0004, 0x0006); Word3 не существует. +LocalSlot=0x43…0xFF — резерв. Узел и старший октет слота должны совпадать.

+

Смещение технологического слова: n=3*LocalSlot+(WordIndex-1). +Обратное преобразование: LocalSlot=n/3, WordIndex=1+n mod 3. +Соседние native-сервисы могут оказаться в одном слоте, поэтому provider проверяет +доступ и наличие каждой отмеченной позиции отдельно.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
modeНазначениеDeviceType / DeviceIDСлоты 0x4Запрос первого слота
0Резерв0x01 / 0x000x0000…0x00420x11040000
1Трансформатор 10x01 / 0x010x0100…0x01420x11140100
2Трансформатор 20x01 / 0x020x0200…0x02420x11240200
3Силовой узел 10x01 / 0x030x0300…0x03420x11340300
4Силовой узел 20x01 / 0x040x0400…0x04420x11440400
5УМП10x01 / 0x050x0500…0x05420x11540500
6УМП20x01 / 0x060x0600…0x06420x11640600
7ENG10x01 / 0x070x0700…0x07420x11740700
8Задатчик / пульт0x01 / 0x080x0800…0x08420x11840800
9Шкаф0x01 / 0x090x0900…0x09420x11940900
10Общий адрес: служебная роль0x01 / 0x0A0x0A00…0x0A420x11A40A00
11Терминал: служебная роль0x01 / 0x0B0x0B00…0x0B420x11B40B00
12Резерв назначения0x01 / 0x0C0x0C00…0x0C420x11C40C00
13Резерв назначения0x01 / 0x0D0x0D00…0x0D420x11D40D00
14Резерв назначения0x01 / 0x0E0x0E00…0x0E420x11E40E00
15Резерв назначения0x01 / 0x0F0x0F00…0x0F420x11F40F00
16Резерв назначения0x02 / 0x000x1000…0x10420x12041000
17Резерв назначения0x02 / 0x010x1100…0x11420x12141100
18Резерв назначения0x02 / 0x020x1200…0x12420x12241200
19Резерв назначения0x02 / 0x030x1300…0x13420x12341300
20Резерв назначения0x02 / 0x040x1400…0x14420x12441400
21Резерв назначения0x02 / 0x050x1500…0x15420x12541500
22Резерв назначения0x02 / 0x060x1600…0x16420x12641600
23Резерв назначения0x02 / 0x070x1700…0x17420x12741700
24Резерв назначения0x02 / 0x080x1800…0x18420x12841800
25Резерв назначения0x02 / 0x090x1900…0x19420x12941900
26Резерв назначения0x02 / 0x0A0x1A00…0x1A420x12A41A00
27Резерв назначения0x02 / 0x0B0x1B00…0x1B420x12B41B00
28Резерв назначения0x02 / 0x0C0x1C00…0x1C420x12C41C00
29Резерв назначения0x02 / 0x0D0x1D00…0x1D420x12D41D00
30Резерв назначения0x02 / 0x0E0x1E00…0x1E420x12E41E00
31Резерв назначения0x02 / 0x0F0x1F00…0x1F420x12F41F00
+

Назначения mode из periph_28335

+

Источники: 28335_periph/Source/Internal/Include/package.h, peripher.c:get_Mode(), cntrl_adr.c. Код платы Desk не участвует в вычислении адреса.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
modeНазначениеИсходный символ
0РезервПеремычками текущей платы не задаётся
1 / 2Трансформаторные узлы 1 / 2adr_TRN1 / adr_TRN2
3 / 4Силовые узлы 1 / 2adr_POW1 / adr_POW2
5 / 6УМП1 / УМП2adr_LOA1 / adr_LOA2, Desk=dsk_LOAD=6
7ENG1adr_ENG1
8Задатчик / пультadr_PULT; имя «Задатчик» принято в реестре PERIPH
9Шкафadr_SHKF
10Общий адрес, служебная рольCNTRL_ADDR_UNIVERSAL, ADDR_FOR_ALL; не отдельная плата
11Терминал, служебная рольADDR_TERMINAL; не доказательство отдельной платы
12…31Резерв назначенияПеремычки текущей платы дают только 1…16
+

Соответствия native-сервисам PERIPH

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Смещение nNative-адресНазначениеДоступ
0…1270x0000…0x007Fтехнологические данные, уставки, командыпо provider
128…1430x1000…0x100Fстатус регистратора УМПR
144…1550x1200…0x120Bпаспорт прошивкиR
156…1630x1300…0x1307защита УМПW только 0x1302/0x1303
164…1670x1000…0x1003команды регистраторапо операции
168…199нетрезервотказ
+

pcan_gas_slot_native() принимает WordIndex=1…3; WordIndex=0 является маской +и не переводится в регистр. Наличие сервиса, права и блокировку проверяет приложение. +GAS 0x3 сохраняет собственные адреса подключённых регионов; эта проекция относится только к 0x4. +Архив УМП, окна 120/124 слова и физическая EEPROM сохраняют native-контракты.

+

Реализация и реестр

    -
  • Адрес не переиспользуется с другим смыслом после выпуска стабильной версии.
  • -
  • Многорегистровое значение занимает непрерывный диапазон.
  • -
  • Порядок 16-битных слов для 32-битного значения фиксируется в строке типа.
  • -
  • Резервные диапазоны явно отмечаются и не используются без изменения версии.
  • -
  • Удалённый параметр помечается deprecated, а не исчезает молча.
  • -
  • Изменение адреса, типа или масштаба отражается в CHANGELOG.md.
  • +
  • GAS 0x3: pcan_gas.h/.c, существующие ABI и клиенты.
  • +
  • GAS SLOT 0x4: pcan_gas_slot.h/.c; тонкие Python GasSlots и Android/JNI GasSlots.
  • +
  • Формат определяется MsgType, параметр gas_profile не используется.
  • +
  • C28x хранит wire-октеты в uint_least8_t; DLC измеряется октетами линии.
  • +
  • Перенос в другую единицу адресации или fallback после отказа запрещены.
-

Экспорт

-

Для программной генерации каталог следует экспортировать из XLSX в CSV с -UTF-8 и фиксированными английскими именами колонок. CSV должен проверяться на:

-
    -
  • уникальность адресов;
  • -
  • пересечение многорегистровых значений;
  • -
  • допустимые типы и права доступа;
  • -
  • равенство шестнадцатеричного и десятичного адреса;
  • -
  • попадание адреса в диапазон 0x0000…0xFFFF.
  • -
-

До появления автоматического экспортёра нормативным источником адресов -остаётся XLSX, а HTML/Markdown считаются представлением.

+

XLSX «Интерфейс протокола» содержит оба типа; «Общее адресное пространство» — +проекцию 0x4 и native-адреса её значений; «ОАП legacy» сохраняет исходный словный реестр 0x3. +Уникальный ключ реестра включает узел, MsgType, адрес и для 0x4 WordIndex. +Права, тип, единица, масштаб и порядок слов u32/float32 задаются явно. +Эталоны: examples/gas-slot-vectors.json; регистровые проверки — test_gas_register.c.

История изменений ProtoCAN

Формат основан на Keep a Changelog. Версия относится к спецификации, а не к версии прошивки отдельного прибора.

[Unreleased]

+

Changed — 2026-10-23

+
    +
  • GAS 0x3 возвращён к адресации отдельных 16-битных регистров 0…65535, DLC 0/2/4/6/8.
  • +
  • Слотный GAS перенесён на 0x4 вместо MODBUS_COIL; Word0 содержит маску битов 1…3, Word1…Word3 — значения.
  • +
  • PERIPH сохраняет 200 значений на mode в 67 слотах; последний содержит два значения.
  • +
  • Формат выбирается номером MsgType; Python/JNI, STM32, Modbus routing, тесты, XLSX и HTML согласованы.
  • +

Added

  • Структурированный комплект документации doc/setcan/protocan.
  • diff --git a/doc/setcan/protocan/CHANGELOG.md b/doc/setcan/protocan/CHANGELOG.md index 73c921e..827ff7a 100644 --- a/doc/setcan/protocan/CHANGELOG.md +++ b/doc/setcan/protocan/CHANGELOG.md @@ -5,6 +5,13 @@ ## [Unreleased] +### Changed — 2026-10-23 + +- GAS 0x3 возвращён к адресации отдельных 16-битных регистров 0…65535, DLC 0/2/4/6/8. +- Слотный GAS перенесён на 0x4 вместо MODBUS_COIL; Word0 содержит маску битов 1…3, Word1…Word3 — значения. +- PERIPH сохраняет 200 значений на mode в 67 слотах; последний содержит два значения. +- Формат выбирается номером MsgType; Python/JNI, STM32, Modbus routing, тесты, XLSX и HTML согласованы. + ### Added - Структурированный комплект документации `doc/setcan/protocan`. diff --git a/doc/setcan/protocan/OAP.md b/doc/setcan/protocan/OAP.md index 28918bf..9bab425 100644 --- a/doc/setcan/protocan/OAP.md +++ b/doc/setcan/protocan/OAP.md @@ -1,56 +1,162 @@ -# Общее адресное пространство +# Общее адресное пространство: GAS и GAS SLOT -Статус: **Stable, данные ведутся в XLSX**
    -Порядок значений: **16-битные регистры, little-endian в CAN payload** +Дата редакции: **2026-10-23**. Номер типа однозначно определяет единицу адресации: -Редактируемый источник реестра: -[`Протокол CAN и ОАП.xlsx`](../Протокол%20CAN%20и%20ОАП.xlsx). +| MsgType | Имя | MsgBody | Payload | +|---|---|---|---| +| `0x3` | GAS | адрес первого 16-битного регистра | 1…4 последовательных регистра, DLC 2/4/6/8 | +| `0x4` | GAS SLOT | адрес слота | Word0 — маска; Word1…Word3 — три значения; DLC 8 | -Просматриваемая большая таблица находится в -[`Протокол CAN и ОАП.html`](../Протокол%20CAN%20и%20ОАП.html) и -[`Протокол CAN и ОАП.md`](../Протокол%20CAN%20и%20ОАП.md). +В обоих случаях запрос чтения — extended data frame с `DLC=0`, `Route=0`. +Ответ имеет `Route=1`, тот же узел и адрес. Прикладного ACK записи нет; +успех применения уставки проверяется прикладным ответом или последующим чтением. +RTR, error frame, стандартный 11-битный ID и нечётные длины не исполняются. -## Назначение +## GAS 0x3: отдельные регистры -ОАП связывает 16-битный адрес регистра с его типом, назначением, доступом и -масштабом. В ProtoCAN используется `MsgType=0x3`, а `MsgBody` содержит адрес -первого регистра. +`MsgBody=RegisterAddress[15:0]`. Адреса `0…65535` (`0x0000…0xFFFF`) +обозначают **65 536 отдельных 16-битных регистров**, логически 128 КиБ на узел. +Это адреса протокола, а не указатели RAM MCU; provider подключает только существующие регионы. -## Обязательные поля реестра +Payload содержит значения с адресов `addr`, `addr+1`, `addr+2`, `addr+3` +в порядке little-endian. Количество равно `DLC/2`, допускаются DLC 2, 4, 6, 8. +Для изменения одной уставки по адресу `0x0001` на `0x1234` передаются +`MsgBody=0x0001`, `DLC=2`, Data=`34 12`; соседние слова не изменяются. +Чтение возвращает до четырёх существующих последовательных регистров, +останавливаясь на первом недоступном адресе или границе `0xFFFF`. +Запись, пересекающая `0xFFFF`, отвергается до изменения данных. -| Поле | Требование | -|---|---| -| AddressHex | `0x0000…0xFFFF`, уникальное значение | -| AddressDec | десятичный эквивалент AddressHex | -| Group | функциональная группа | -| Name | однозначное имя параметра | -| Type | `u16`, `i16`, `u32`, `i32`, `float32`, bitmap или массив | -| Registers | число занятых 16-битных регистров | -| Access | `R`, `W` или `RW` | -| Unit | физическая единица либо `—` | -| Scale | множитель/делитель представления | -| Default | значение после сброса, если применимо | -| Description | семантика, диапазон и особые значения | +Регионы карты, права и значения проверяет `pcan_gas`; callback остаётся +ответственностью приложения. Блочная запись может остановиться на первом отказе provider: +атомарность нескольких регистров не обещается. Связанные `u32/float32` и команды +требуют согласованной прикладной операции. Основной контракт: `c/set-protocol/docs/legacy/GAS.md`. +GAS 167/v1, GAS Logger, GAS_WATCH2, NAND и Altera Logic сохраняют регистровые адреса. +Номер mode задаёт адрес узла; его нельзя автоматически прибавлять к адресу регистра. -## Правила ведения +## GAS SLOT 0x4: маска в Word0 -- Адрес не переиспользуется с другим смыслом после выпуска стабильной версии. -- Многорегистровое значение занимает непрерывный диапазон. -- Порядок 16-битных слов для 32-битного значения фиксируется в строке типа. -- Резервные диапазоны явно отмечаются и не используются без изменения версии. -- Удалённый параметр помечается deprecated, а не исчезает молча. -- Изменение адреса, типа или масштаба отражается в `CHANGELOG.md`. +`MsgBody=SlotAddress[15:0]`. Восемь октетов имеют фиксированное расположение: -## Экспорт +| Октеты | Wire-слово | Назначение | +|---|---|---| +| 0…1 | Word0 | 16-битная маска, little-endian | +| 2…3 | Word1 | первое значение | +| 4…5 | Word2 | второе значение | +| 6…7 | Word3 | третье значение | -Для программной генерации каталог следует экспортировать из XLSX в CSV с -UTF-8 и фиксированными английскими именами колонок. CSV должен проверяться на: +Биты маски 1, 2, 3 соответствуют Word1, Word2, Word3. Бит 0 и биты 4…15 +зарезервированы и должны быть нулевыми. Маска непустая; все допустимые маски: +`0x0002`, `0x0004`, `0x0006`, `0x0008`, `0x000A`, `0x000C`, `0x000E`. +При записи отмеченные значения применяются, неотмеченные позиции игнорируются +и сохраняют текущие значения устройства. Нули не являются специальными маркерами. +При чтении маска ответа отмечает достоверные/доступные значения. -- уникальность адресов; -- пересечение многорегистровых значений; -- допустимые типы и права доступа; -- равенство шестнадцатеричного и десятичного адреса; -- попадание адреса в диапазон `0x0000…0xFFFF`. +Например, изменить только Word2 на `0x1234`: Data=`04 00 00 00 34 12 00 00`. +Word1 и Word3 сохраняются. Полная запись трёх значений использует маску `0x000E`. +Передаются всегда восемь октетов, кроме пустого запроса чтения. Сжатия или сегментации нет. +Provider проверяет все выбранные права и значения до первого изменения, затем применяет +выбранные слова под общей блокировкой. Невыбранные readonly-поля не записываются. +Ядро не выполняет опасное чтение-изменение-запись слота на стороне клиента. -До появления автоматического экспортёра нормативным источником адресов -остаётся XLSX, а HTML/Markdown считаются представлением. +Полное пространство 0x4 содержит **65 536 слотов × 3 значения = 196 608 слов = 384 КиБ**. +Word0 — метаданные кадра, не четвёртый хранимый регистр. Координата значения — +`(SlotAddress, WordIndex)`, где `WordIndex=1…3`. Любой узел поддерживается общими +`pcan_gas_slot_id()` и `pcan_gas_slot_handle_address()`; адрес слота не ограничен страницами PERIPH. +Тип `0x4 MODBUS_COIL` заменён этим сервисом. Modbus `0x5/0x6/0x7` сохраняет номера. +Старое оборудование с Coil 0x4 требует согласованного обновления; автоопределения формата нет. + +## PERIPH: проекция 200 слов на слоты 0x4 + +`mode=0…31`; `DeviceType=1+mode/16`, `DeviceID=mode mod 16`. +`SlotAddress=(mode<<8)|LocalSlot`. Маски не занимают места в карте значений. +На mode сохранены 200 слов, поэтому используются 67 слотов `LocalSlot=0x00…0x42`: +66 полных слотов и два значения последнего. В последнем разрешена только маска +из битов 1/2 (`0x0002`, `0x0004`, `0x0006`); Word3 не существует. +`LocalSlot=0x43…0xFF` — резерв. Узел и старший октет слота должны совпадать. + +Смещение технологического слова: `n=3*LocalSlot+(WordIndex-1)`. +Обратное преобразование: `LocalSlot=n/3`, `WordIndex=1+n mod 3`. +Соседние native-сервисы могут оказаться в одном слоте, поэтому provider проверяет +доступ и наличие каждой отмеченной позиции отдельно. + +| mode | Назначение | DeviceType / DeviceID | Слоты 0x4 | Запрос первого слота | +|---:|---|---|---|---| +| 0 | Резерв | `0x01 / 0x00` | `0x0000…0x0042` | `0x11040000` | +| 1 | Трансформатор 1 | `0x01 / 0x01` | `0x0100…0x0142` | `0x11140100` | +| 2 | Трансформатор 2 | `0x01 / 0x02` | `0x0200…0x0242` | `0x11240200` | +| 3 | Силовой узел 1 | `0x01 / 0x03` | `0x0300…0x0342` | `0x11340300` | +| 4 | Силовой узел 2 | `0x01 / 0x04` | `0x0400…0x0442` | `0x11440400` | +| 5 | УМП1 | `0x01 / 0x05` | `0x0500…0x0542` | `0x11540500` | +| 6 | УМП2 | `0x01 / 0x06` | `0x0600…0x0642` | `0x11640600` | +| 7 | ENG1 | `0x01 / 0x07` | `0x0700…0x0742` | `0x11740700` | +| 8 | Задатчик / пульт | `0x01 / 0x08` | `0x0800…0x0842` | `0x11840800` | +| 9 | Шкаф | `0x01 / 0x09` | `0x0900…0x0942` | `0x11940900` | +| 10 | Общий адрес: служебная роль | `0x01 / 0x0A` | `0x0A00…0x0A42` | `0x11A40A00` | +| 11 | Терминал: служебная роль | `0x01 / 0x0B` | `0x0B00…0x0B42` | `0x11B40B00` | +| 12 | Резерв назначения | `0x01 / 0x0C` | `0x0C00…0x0C42` | `0x11C40C00` | +| 13 | Резерв назначения | `0x01 / 0x0D` | `0x0D00…0x0D42` | `0x11D40D00` | +| 14 | Резерв назначения | `0x01 / 0x0E` | `0x0E00…0x0E42` | `0x11E40E00` | +| 15 | Резерв назначения | `0x01 / 0x0F` | `0x0F00…0x0F42` | `0x11F40F00` | +| 16 | Резерв назначения | `0x02 / 0x00` | `0x1000…0x1042` | `0x12041000` | +| 17 | Резерв назначения | `0x02 / 0x01` | `0x1100…0x1142` | `0x12141100` | +| 18 | Резерв назначения | `0x02 / 0x02` | `0x1200…0x1242` | `0x12241200` | +| 19 | Резерв назначения | `0x02 / 0x03` | `0x1300…0x1342` | `0x12341300` | +| 20 | Резерв назначения | `0x02 / 0x04` | `0x1400…0x1442` | `0x12441400` | +| 21 | Резерв назначения | `0x02 / 0x05` | `0x1500…0x1542` | `0x12541500` | +| 22 | Резерв назначения | `0x02 / 0x06` | `0x1600…0x1642` | `0x12641600` | +| 23 | Резерв назначения | `0x02 / 0x07` | `0x1700…0x1742` | `0x12741700` | +| 24 | Резерв назначения | `0x02 / 0x08` | `0x1800…0x1842` | `0x12841800` | +| 25 | Резерв назначения | `0x02 / 0x09` | `0x1900…0x1942` | `0x12941900` | +| 26 | Резерв назначения | `0x02 / 0x0A` | `0x1A00…0x1A42` | `0x12A41A00` | +| 27 | Резерв назначения | `0x02 / 0x0B` | `0x1B00…0x1B42` | `0x12B41B00` | +| 28 | Резерв назначения | `0x02 / 0x0C` | `0x1C00…0x1C42` | `0x12C41C00` | +| 29 | Резерв назначения | `0x02 / 0x0D` | `0x1D00…0x1D42` | `0x12D41D00` | +| 30 | Резерв назначения | `0x02 / 0x0E` | `0x1E00…0x1E42` | `0x12E41E00` | +| 31 | Резерв назначения | `0x02 / 0x0F` | `0x1F00…0x1F42` | `0x12F41F00` | + +## Назначения mode из periph_28335 + +Источники: `28335_periph/Source/Internal/Include/package.h`, `peripher.c:get_Mode()`, `cntrl_adr.c`. Код платы `Desk` не участвует в вычислении адреса. + +| mode | Назначение | Исходный символ | +|---:|---|---| +| 0 | Резерв | Перемычками текущей платы не задаётся | +| 1 / 2 | Трансформаторные узлы 1 / 2 | `adr_TRN1 / adr_TRN2` | +| 3 / 4 | Силовые узлы 1 / 2 | `adr_POW1 / adr_POW2` | +| 5 / 6 | УМП1 / УМП2 | `adr_LOA1 / adr_LOA2`, `Desk=dsk_LOAD=6` | +| 7 | ENG1 | `adr_ENG1` | +| 8 | Задатчик / пульт | `adr_PULT`; имя «Задатчик» принято в реестре PERIPH | +| 9 | Шкаф | `adr_SHKF` | +| 10 | Общий адрес, служебная роль | `CNTRL_ADDR_UNIVERSAL`, `ADDR_FOR_ALL`; не отдельная плата | +| 11 | Терминал, служебная роль | `ADDR_TERMINAL`; не доказательство отдельной платы | +| 12…31 | Резерв назначения | Перемычки текущей платы дают только 1…16 | + +## Соответствия native-сервисам PERIPH + +| Смещение n | Native-адрес | Назначение | Доступ | +|---|---|---|---| +| 0…127 | `0x0000…0x007F` | технологические данные, уставки, команды | по provider | +| 128…143 | `0x1000…0x100F` | статус регистратора УМП | R | +| 144…155 | `0x1200…0x120B` | паспорт прошивки | R | +| 156…163 | `0x1300…0x1307` | защита УМП | W только `0x1302/0x1303` | +| 164…167 | `0x1000…0x1003` | команды регистратора | по операции | +| 168…199 | нет | резерв | отказ | + +`pcan_gas_slot_native()` принимает WordIndex=1…3; WordIndex=0 является маской +и не переводится в регистр. Наличие сервиса, права и блокировку проверяет приложение. +GAS 0x3 сохраняет собственные адреса подключённых регионов; эта проекция относится только к 0x4. +Архив УМП, окна 120/124 слова и физическая EEPROM сохраняют native-контракты. + +## Реализация и реестр + +- GAS 0x3: `pcan_gas.h/.c`, существующие ABI и клиенты. +- GAS SLOT 0x4: `pcan_gas_slot.h/.c`; тонкие Python `GasSlots` и Android/JNI `GasSlots`. +- Формат определяется MsgType, параметр `gas_profile` не используется. +- C28x хранит wire-октеты в `uint_least8_t`; DLC измеряется октетами линии. +- Перенос в другую единицу адресации или fallback после отказа запрещены. + +XLSX «Интерфейс протокола» содержит оба типа; «Общее адресное пространство» — +проекцию 0x4 и native-адреса её значений; «ОАП legacy» сохраняет исходный словный реестр 0x3. +Уникальный ключ реестра включает узел, MsgType, адрес и для 0x4 WordIndex. +Права, тип, единица, масштаб и порядок слов u32/float32 задаются явно. +Эталоны: `examples/gas-slot-vectors.json`; регистровые проверки — `test_gas_register.c`. diff --git a/doc/setcan/protocan/PROTOCOL.md b/doc/setcan/protocan/PROTOCOL.md index aea4627..644c707 100644 --- a/doc/setcan/protocan/PROTOCOL.md +++ b/doc/setcan/protocan/PROTOCOL.md @@ -1,7 +1,7 @@ # ProtoCAN — базовый протокол Статус: **Stable с зарезервированным загрузочным расширением**
    -Версия: **1.0**
    +Версия: **2.1: GAS 0x3 и масочный GAS SLOT 0x4**
    Порядок байтов payload: **little-endian**, если явно не указано иное ## Назначение @@ -59,8 +59,8 @@ can_id = | `0x0` | `BROADCAST` | ПМ → все | зависит от команды | stable | | `0x1` | `DISCRETE` | оба | 0…8 | stable | | `0x2` | `ANALOG` | оба | 0…8 | stable | -| `0x3` | `GAS` | оба | 0/2/4/6/8 | stable | -| `0x4` | `MODBUS_COIL` | оба | 0…8 | stable | +| `0x3` | `GAS` | оба | 0/2/4/6/8 | регистры 0…65535 | +| `0x4` | `GAS_SLOT` | оба | 0/8 | Word0 — маска, Word1…Word3 — значения | | `0x5` | `MODBUS_DISCRETE` | оба | 0…8 | stable | | `0x6` | `MODBUS_HOLDING` | оба | 0…8 | stable | | `0x7` | `MODBUS_INPUT` | оба | 0…8 | stable | @@ -82,14 +82,21 @@ can_id = | broadcast | команда `[15:4]`, параметр `[3:0]` | | discrete/analog | подтип `[15:12]`, значение/адрес `[11:0]` | | Modbus | начальный адрес `[15:4]`, количество `[3:0]` | -| GAS | адрес первого 16-битного регистра `[15:0]` | +| GAS 0x3 | адрес первого 16-битного регистра `[15:0]` | +| GAS SLOT 0x4 | адрес слота `[15:0]`; маска — в Word0 payload, значения — Word1…Word3 | | error | дополнительная информация `[15:8]`, код `[7:0]` | | settings | номер сборки `[15:8]`, позиция `[7:0]` | | boot control/status | `SessionID[15:8]`, команда `[7:0]` | | boot data | `BlockIndex[15:0]` | +Контракт обоих GAS: [OAP.md](OAP.md). Тип 0x3 адресует отдельные слова; тип 0x4 имеет маску битов 1…3 в Word0 и три значения. Для PERIPH 0x4 используются 67 слотов `0xMM00…0xMM42`, последний содержит два значения. Старый Coil 0x4 заменён; формат определяется MsgType. + ## Общие правила обмена +Профиль синхронизации часов и сообщения платы о завершении инициализации: +[GLOBAL_TIME.md](GLOBAL_TIME.md). Он сохраняет штатный BROADCAST RTCSETUP +и определяет общий пакет готовности поверх DISCRETE/FLAGS. + - Многобайтовые значения в `DATA` передаются little-endian. - Узел игнорирует адресованные кадры с чужим `DeviceType/DeviceID`. - Прибор принимает команды ПМ с `Route=0`; ПМ принимает ответы с `Route=1`. diff --git a/doc/setcan/protocan/README.md b/doc/setcan/protocan/README.md index 841978e..b696bdb 100644 --- a/doc/setcan/protocan/README.md +++ b/doc/setcan/protocan/README.md @@ -1,8 +1,8 @@ # Документация ProtoCAN Статус комплекта: **Draft**
    -Версия комплекта: **1.0**
    -Дата редакции: **2026-08-29**
    +Версия комплекта: **2.1**
    +Дата редакции: **2026-10-23**
    Транспорт: **Classic CAN 2.0B, Extended ID, DLC 0…8** Этот каталог разделяет нормативное описание протокола, загрузчик и реестр @@ -41,3 +41,7 @@ Все документы и тестовые векторы включаются в единый файл `doc/setcan/index.html`. Скрипт не изменяет исходные Markdown/XLSX и пригоден для запуска в CI. + +## GAS: регистры 0x3 и слоты 0x4 + +[Адресация GAS](OAP.md): `0x3` — отдельные 16-битные регистры `0…65535`, запись 1…4 слов. `0x4` — слот с Word0-маской и тремя значениями; PERIPH сохраняет 200 слов в 67 слотах `0xMM00…0xMM42`. Формат определяется MsgType, без настройки профиля. diff --git a/doc/setcan/Протокол CAN и ОАП.html b/doc/setcan/Протокол CAN и ОАП.html index e4c7fbc..2c53c82 100644 --- a/doc/setcan/Протокол CAN и ОАП.html +++ b/doc/setcan/Протокол CAN и ОАП.html @@ -1,32 +1,259 @@ - - - - - -Протокол CAN и ОАП - - -

    Протокол CAN и ОАП

    +ProtoCAN — GAS 0x3 и GAS SLOT 0x4

    Протокол CAN и ОАП

    Таблицы перенесены из Протокол CAN и ОАП.xlsx. Цвета, объединённые ячейки и структура листов сохранены средствами HTML внутри Markdown.

    +

    Адреса PERIPH обновлены по листу «Интерфейс протокола», A44:F79: +Type 0x01 содержит PERIPH 0–15, Type 0x02 — PERIPH 16–31; +Device ID равен младшим четырём битам номера PERIPH. +УМП1 — 0x01/0x05, УМП2 — 0x01/0x06, задатчик — 0x01/0x08. +Назначения остальных mode уточнены по periph_28335: 1/2 — трансформаторы, 3/4 — силовые узлы, 7 — ENG1, 9 — шкаф; 10/11 — служебные роли. Общий Boot-адрес 0x03/0x07 отменён. +Полный реестр назначений применяется и к загрузчику, и к GUI.

    -

    +

    +

    +

    GAS: регистры 0x3 и масочные слоты 0x4

    +

    Нормативная спецификация: OAP.md. GAS 0x3: адрес первого регистра 0…65535, DLC 0/2/4/6/8. GAS SLOT 0x4: Word0 — маска битов 1…3, Word1…Word3 — три значения, DLC 0/8. PERIPH сохраняет 200 значений в 67 слотах; последний содержит два. Словный реестр ниже сохраняет адреса GAS 0x3.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    modeНазначениеType / IDСлоты 0x4CAN запрос
    0Резерв0x01 / 0x000x0000…0x00420x11040000
    1Трансформатор 10x01 / 0x010x0100…0x01420x11140100
    2Трансформатор 20x01 / 0x020x0200…0x02420x11240200
    3Силовой узел 10x01 / 0x030x0300…0x03420x11340300
    4Силовой узел 20x01 / 0x040x0400…0x04420x11440400
    5УМП10x01 / 0x050x0500…0x05420x11540500
    6УМП20x01 / 0x060x0600…0x06420x11640600
    7ENG10x01 / 0x070x0700…0x07420x11740700
    8Задатчик / пульт0x01 / 0x080x0800…0x08420x11840800
    9Шкаф0x01 / 0x090x0900…0x09420x11940900
    10Общий адрес: служебная роль0x01 / 0x0A0x0A00…0x0A420x11A40A00
    11Терминал: служебная роль0x01 / 0x0B0x0B00…0x0B420x11B40B00
    12Резерв назначения0x01 / 0x0C0x0C00…0x0C420x11C40C00
    13Резерв назначения0x01 / 0x0D0x0D00…0x0D420x11D40D00
    14Резерв назначения0x01 / 0x0E0x0E00…0x0E420x11E40E00
    15Резерв назначения0x01 / 0x0F0x0F00…0x0F420x11F40F00
    16Резерв назначения0x02 / 0x000x1000…0x10420x12041000
    17Резерв назначения0x02 / 0x010x1100…0x11420x12141100
    18Резерв назначения0x02 / 0x020x1200…0x12420x12241200
    19Резерв назначения0x02 / 0x030x1300…0x13420x12341300
    20Резерв назначения0x02 / 0x040x1400…0x14420x12441400
    21Резерв назначения0x02 / 0x050x1500…0x15420x12541500
    22Резерв назначения0x02 / 0x060x1600…0x16420x12641600
    23Резерв назначения0x02 / 0x070x1700…0x17420x12741700
    24Резерв назначения0x02 / 0x080x1800…0x18420x12841800
    25Резерв назначения0x02 / 0x090x1900…0x19420x12941900
    26Резерв назначения0x02 / 0x0A0x1A00…0x1A420x12A41A00
    27Резерв назначения0x02 / 0x0B0x1B00…0x1B420x12B41B00
    28Резерв назначения0x02 / 0x0C0x1C00…0x1C420x12C41C00
    29Резерв назначения0x02 / 0x0D0x1D00…0x1D420x12D41D00
    30Резерв назначения0x02 / 0x0E0x1E00…0x1E420x12E41E00
    31Резерв назначения0x02 / 0x0F0x1F00…0x1F420x12F41F00

    Прошивка приборов по CAN

    -

    Ниже зафиксирован формат планируемого загрузочного сервиса. Значения -MsgType=0x9..0xD зарезервированы в протоколе, но обработчики загрузчика в -текущих protocan.c/.h ещё не реализованы.

    +

    Загрузчик MsgType=0x9…0xD реализован в c/protocan-boot. Актуальные команды, A/B и single-slot: BOOTLOADER.md. Ниже сохранена историческая таблица; при расхождении применяется актуальная спецификация.

    Загрузчик работает поверх classic CAN 2.0B с Extended ID. Управляющий модуль использует Route=0, прибор отвечает с Route=1. Команды стирания и записи всегда должны быть адресованы конкретной паре DeviceType/DeviceID; @@ -704,8 +931,8 @@ DATA[4..7] RunningCRC32, uint32 little-endian 0x1. Стандартный 0х1. Устройство -0x1 -0x0 - 0xF устройств +0x01 PERIPH +0x0–0xF; PERIPH 0–15
    0x5: УМП1; 0x6: УМП2; 0x8: Задатчик 0x1. Запрос на вкл/выкл Выбор "страницы" из 64 устройств (Битовые флаги в Data)   @@ -716,8 +943,8 @@ DATA[4..7] RunningCRC32, uint32 little-endian     -0x2 -0x0 - 0xF устройств +0x02 PERIPH +0x0–0xF; PERIPH 16–31 0x2. Рестарт устройств Выбор "страницы" из 64 устройств (Битовые флаги в Data)   @@ -955,14 +1182,14 @@ DATA[4..7] RunningCRC32, uint32 little-endian     0x3. Общее адресное пространство -Адрес регистра (Стартовый адрес, если DLC COUNT > 2) (0, 0x0000 - 65535, 0xFFFF) +GAS: адрес первого 16-битного регистра 0x0000…0xFFFF; до четырёх последовательных значений.   0/2/4/6/8   -Четвёртый регистр -Третий регистр -Второй регистр -Первый регистр +Регистр addr+3 +Регистр addr+2 +Регистр addr+1 +Регистр addr+0   @@ -971,13 +1198,12 @@ DATA[4..7] RunningCRC32, uint32 little-endian       -0x4. Modbus Coil -Стартовый адрес регистра (0x0 - 0xFFF) -Кол-во регистров (0-15) +0x4. GAS SLOT +Адрес слота 0x0000…0xFFFF   -  +0/8   -NULL +Word3 | Word2 | Word1 | Word0: маска битов 1…3   @@ -1421,8 +1647,8 @@ DATA[4..7] RunningCRC32, uint32 little-endian

-

-

Лист «Общее адресное пространство»

+

+

Исторический лист «ОАП legacy»: адреса регистров

Таблица прокручивается по горизонтали; длинный лист ограничен по высоте окна.

@@ -13399,6 +13625,4 @@ DATA[4..7] RunningCRC32, uint32 little-endian
- - - + \ No newline at end of file diff --git a/doc/setcan/Протокол CAN и ОАП.md b/doc/setcan/Протокол CAN и ОАП.md index da42337..11c9aee 100644 --- a/doc/setcan/Протокол CAN и ОАП.md +++ b/doc/setcan/Протокол CAN и ОАП.md @@ -2,16 +2,61 @@ Таблицы перенесены из `Протокол CAN и ОАП.xlsx`. Цвета, объединённые ячейки и структура листов сохранены средствами HTML внутри Markdown. +Адреса PERIPH обновлены по листу «Интерфейс протокола», A44:F79: +Type `0x01` содержит PERIPH 0–15, Type `0x02` — PERIPH 16–31; +Device ID равен младшим четырём битам номера PERIPH. +УМП1 — `0x01/0x05`, УМП2 — `0x01/0x06`, задатчик — `0x01/0x08`. +Назначения остальных mode уточнены по periph_28335: 1/2 — трансформаторы, 3/4 — силовые узлы, 7 — ENG1, 9 — шкаф; 10/11 — служебные роли. Общий Boot-адрес `0x03/0x07` отменён. +Полный [реестр назначений](DEVICE_REGISTRY.md) применяется и к загрузчику, и к GUI. + - [Интерфейс протокола](#sheet-protocol) - [Общее адресное пространство](#sheet-oap) - [Прошивка приборов по CAN](#can-firmware) + +## GAS: регистры 0x3 и масочные слоты 0x4 + +Нормативная спецификация: [OAP.md](protocan/OAP.md). GAS 0x3: адрес первого регистра 0…65535, DLC 0/2/4/6/8. GAS SLOT 0x4: Word0 — маска битов 1…3, Word1…Word3 — три значения, DLC 0/8. PERIPH сохраняет 200 значений в 67 слотах; последний содержит два. Словный реестр ниже сохраняет адреса GAS 0x3. + +| mode | Назначение | Type / ID | Слоты 0x4 | CAN запрос | +|---:|---|---|---|---| +| 0 | Резерв | `0x01 / 0x00` | `0x0000…0x0042` | `0x11040000` | +| 1 | Трансформатор 1 | `0x01 / 0x01` | `0x0100…0x0142` | `0x11140100` | +| 2 | Трансформатор 2 | `0x01 / 0x02` | `0x0200…0x0242` | `0x11240200` | +| 3 | Силовой узел 1 | `0x01 / 0x03` | `0x0300…0x0342` | `0x11340300` | +| 4 | Силовой узел 2 | `0x01 / 0x04` | `0x0400…0x0442` | `0x11440400` | +| 5 | УМП1 | `0x01 / 0x05` | `0x0500…0x0542` | `0x11540500` | +| 6 | УМП2 | `0x01 / 0x06` | `0x0600…0x0642` | `0x11640600` | +| 7 | ENG1 | `0x01 / 0x07` | `0x0700…0x0742` | `0x11740700` | +| 8 | Задатчик / пульт | `0x01 / 0x08` | `0x0800…0x0842` | `0x11840800` | +| 9 | Шкаф | `0x01 / 0x09` | `0x0900…0x0942` | `0x11940900` | +| 10 | Общий адрес: служебная роль | `0x01 / 0x0A` | `0x0A00…0x0A42` | `0x11A40A00` | +| 11 | Терминал: служебная роль | `0x01 / 0x0B` | `0x0B00…0x0B42` | `0x11B40B00` | +| 12 | Резерв назначения | `0x01 / 0x0C` | `0x0C00…0x0C42` | `0x11C40C00` | +| 13 | Резерв назначения | `0x01 / 0x0D` | `0x0D00…0x0D42` | `0x11D40D00` | +| 14 | Резерв назначения | `0x01 / 0x0E` | `0x0E00…0x0E42` | `0x11E40E00` | +| 15 | Резерв назначения | `0x01 / 0x0F` | `0x0F00…0x0F42` | `0x11F40F00` | +| 16 | Резерв назначения | `0x02 / 0x00` | `0x1000…0x1042` | `0x12041000` | +| 17 | Резерв назначения | `0x02 / 0x01` | `0x1100…0x1142` | `0x12141100` | +| 18 | Резерв назначения | `0x02 / 0x02` | `0x1200…0x1242` | `0x12241200` | +| 19 | Резерв назначения | `0x02 / 0x03` | `0x1300…0x1342` | `0x12341300` | +| 20 | Резерв назначения | `0x02 / 0x04` | `0x1400…0x1442` | `0x12441400` | +| 21 | Резерв назначения | `0x02 / 0x05` | `0x1500…0x1542` | `0x12541500` | +| 22 | Резерв назначения | `0x02 / 0x06` | `0x1600…0x1642` | `0x12641600` | +| 23 | Резерв назначения | `0x02 / 0x07` | `0x1700…0x1742` | `0x12741700` | +| 24 | Резерв назначения | `0x02 / 0x08` | `0x1800…0x1842` | `0x12841800` | +| 25 | Резерв назначения | `0x02 / 0x09` | `0x1900…0x1942` | `0x12941900` | +| 26 | Резерв назначения | `0x02 / 0x0A` | `0x1A00…0x1A42` | `0x12A41A00` | +| 27 | Резерв назначения | `0x02 / 0x0B` | `0x1B00…0x1B42` | `0x12B41B00` | +| 28 | Резерв назначения | `0x02 / 0x0C` | `0x1C00…0x1C42` | `0x12C41C00` | +| 29 | Резерв назначения | `0x02 / 0x0D` | `0x1D00…0x1D42` | `0x12D41D00` | +| 30 | Резерв назначения | `0x02 / 0x0E` | `0x1E00…0x1E42` | `0x12E41E00` | +| 31 | Резерв назначения | `0x02 / 0x0F` | `0x1F00…0x1F42` | `0x12F41F00` | + ## Прошивка приборов по CAN -Ниже зафиксирован формат планируемого загрузочного сервиса. Значения -`MsgType=0x9..0xD` зарезервированы в протоколе, но обработчики загрузчика в -текущих `protocan.c/.h` ещё не реализованы. +Загрузчик `MsgType=0x9…0xD` реализован в `c/protocan-boot`. Актуальные команды, A/B и single-slot: [BOOTLOADER.md](protocan/BOOTLOADER.md). Ниже сохранена историческая таблица; при расхождении применяется актуальная спецификация. Загрузчик работает поверх classic CAN 2.0B с Extended ID. Управляющий модуль использует `Route=0`, прибор отвечает с `Route=1`. Команды стирания и записи @@ -576,8 +621,8 @@ CRC32 обнаруживает случайное повреждение, но 0x1. Стандартный 0х1. Устройство -0x1 -0x0 - 0xF устройств +0x01 PERIPH +0x0–0xF; PERIPH 0–15
0x5: УМП1; 0x6: УМП2; 0x8: Задатчик 0x1. Запрос на вкл/выкл Выбор "страницы" из 64 устройств (Битовые флаги в Data)   @@ -588,8 +633,8 @@ CRC32 обнаруживает случайное повреждение, но     -0x2 -0x0 - 0xF устройств +0x02 PERIPH +0x0–0xF; PERIPH 16–31 0x2. Рестарт устройств Выбор "страницы" из 64 устройств (Битовые флаги в Data)   @@ -827,14 +872,14 @@ CRC32 обнаруживает случайное повреждение, но     0x3. Общее адресное пространство -Адрес регистра (Стартовый адрес, если DLC COUNT > 2) (0, 0x0000 - 65535, 0xFFFF) +GAS: адрес первого 16-битного регистра 0x0000…0xFFFF; до четырёх последовательных значений.   0/2/4/6/8   -Четвёртый регистр -Третий регистр -Второй регистр -Первый регистр +Регистр addr+3 +Регистр addr+2 +Регистр addr+1 +Регистр addr+0   @@ -843,13 +888,12 @@ CRC32 обнаруживает случайное повреждение, но       -0x4. Modbus Coil -Стартовый адрес регистра (0x0 - 0xFFF) -Кол-во регистров (0-15) +0x4. GAS SLOT +Адрес слота 0x0000…0xFFFF   -  +0/8   -NULL +Word3 | Word2 | Word1 | Word0: маска битов 1…3   @@ -1294,8 +1338,8 @@ CRC32 обнаруживает случайное повреждение, но - -## Лист «Общее адресное пространство» + +## Исторический лист «ОАП legacy»: адреса регистров

Таблица прокручивается по горизонтали; длинный лист ограничен по высоте окна.

diff --git a/doc/setcan/Протокол CAN и ОАП.xlsx b/doc/setcan/Протокол CAN и ОАП.xlsx index 7ddba5f..f8c0b58 100644 Binary files a/doc/setcan/Протокол CAN и ОАП.xlsx and b/doc/setcan/Протокол CAN и ОАП.xlsx differ diff --git a/tools/firmware-build/README.md b/tools/firmware-build/README.md index b86b63e..7e9a7b2 100644 --- a/tools/firmware-build/README.md +++ b/tools/firmware-build/README.md @@ -1,7 +1,57 @@ # Подключение precompile и postcompile из templates +Для проектов ПЛИС используйте [шаблон Xilinx ISE, Vivado и Altera/Intel Quartus](fpga/README.md): +общий сохраняемый итератор, паспорт на Verilog/VHDL, полная сборка `.bit`/`.sof`, +manifest, SHA-256 и архив выпуска. + +## Единая подготовка C2000 для 166/167 и Публикатора SETGUI + +Общая точка входа — `c/firmware-info/tools/c2000_build.py` с командами +`prepare` и `build`. CCS и совместимые `ccs/precompile.bat --identity` / +`ccs/postcompile.bat --identity` вызывают один процесс подготовки. + +`prepare` сохраняет JSON-счётчик старых проектов 166 либо читает ручную версию +из заголовка, заданного в `firmware_build_profile.json` проекта 167. Аппаратный +профиль содержит пути C-заголовков, имена макросов EEPROM и допустимые RAM-адреса +в 16-битных словах C28x. Ёмкость и размер SCI8 выражены в октетах. + +`build` проверяет встроенный паспорт, границу EEPROM, MAP, SHA-256, полноту +SCI8, Flash LOAD/RUN и точное соответствие Flash OUT ↔ Flash RS BIN до сохранения +постоянного выпуска. Проектный `build_flash.py` остаётся аппаратным сборщиком; +общих проверок или сетевых операций в нём нет. + +В текущей 167 каталог результата задан как `Debug/firmware/prepared` либо +`Release/firmware/prepared`; в остальных проектах он задаётся аргументом `--output`. +В этом каталоге создаётся папка +`HASH_дата_UTC+3` с RAM BIN, исходным RAM OUT, `*_flash.out` для JTAG, +`*_flash_rs.bin` для RS, картами, manifest и SHA-256. Flash-файлы создаются +только при наличии проектного `build_flash.py`. `latest_build.json` рядом +с папками указывает точную папку и основной manifest последнего успешного выпуска. + +Дальнейшая публикация выполняется в SETGUI: **Сервис → Прошивка → Публикатор → +Из папки postbuild / manifest → Импорт папки postbuild**. Выбирайте папку одной +сборки, указанную в `latest_build.json`. Для Flash по RS выбирайте manifest +`*_flash_rs.bin.manifest.json`; для JTAG можно выбрать основной RAM BIN manifest, +поскольку полный комплект содержит подписанный Flash OUT. Публикатор выбирает +Flash OUT по `execution=FLASH` и `image_format=COFF`, сохраняя соседний RAM OUT. +Проверьте назначение загрузчика и предпросмотр, затем публикуйте через штатное +хранилище Публикатора. Команды подготовки сами не создают сетевой выпуск. + +Ниже сохранены команды подключения старых проектов. Дополнительный аргумент +`export` остаётся совместимым локальным копированием; новые проекты могут +передавать готовый комплект прямо Публикатору без этого аргумента. + ## Пути на этом компьютере +Самостоятельные постоянные CAN-загрузчики **F28335_CAN_AB** и **F2812_CAN_NOR** +имеют собственные prebuild/postbuild в Debug и Release. Они вызывают общий +`c/protocan-boot/projects/build.py`, проверяют Flash COFF через TI `ofd2000` и +автоматически копируют OUT/MAP, manifest, SHA-256 и метаданные в +`SETGUI/..periph_28335/firmware/periph28335/balzam167/canboot/28335/HASH_дата_UTC+3` +и `.../canboot/2812/HASH_дата_UTC+3` соответственно. +Команды, переопределение пути и структура результата описаны в +[инструкции CCS-проектов ProtoCAN Boot](../../c/protocan-boot/projects/README.md#prebuildpostbuild-и-копирование-в-setgui). + | Назначение | Полный путь | |---|---| | Корень общей библиотеки templates | `K:\git_project\newProject\templates` | @@ -307,3 +357,46 @@ firmware/ ## Совместимость со старыми проектами Вызовы BAT без `--identity` сохранены для уже настроенных проектов: прежний precompile генерирует только build ID, прежний postcompile запускает SETGUI preflight по release-конфигурации. Эта отдельная схема описана в [инструкции публикатора](../firmware-publish/README.md). Для новых CCS и Keil используйте приведённые выше команды с `--identity`. + +## Автоматический CAN BIN вместе с Flash + +Защищённый `c/firmware-info/tools/c2000_build.py build`, вызываемый из CCS +postbuild и `postcompile.bat --identity`, дополнительно создаёт CAN-вариант, +если проект явно задаёт `can_boot_profile` равным `f28335-m95m02-ab` +в `firmware_build_profile.json` и выбрана EEPROM M95M02. +Для AT25256B этот A/B-профиль отключён. Старые проекты без поля сохраняют +прежний состав выпуска. Изменение CAN-профиля требует нового prebuild и сборки. + +В одном выпуске сохраняются: + +| Файл | Назначение | +|---|---| +| `eeprom/_.bin` | Основной SCI8 RAM/EEPROM-образ | +| `can/__can.bin` | ProtoCAN Boot, M95M02 A/B, RAM-приложение | +| `flash/_flash.out` | Внутренняя Flash через JTAG, если проект имеет build_flash.py | +| `rs/_flash_rs.bin` | Обновление внутренней Flash по RS из того же Flash OUT | + +CAN BIN содержит точные байты проверенного RAM SCI8. Отдельно проверяются +предел 130560 октетов, максимум 64 секции, адреса RAM `[0x8000,0xE000)`, +entry, встроенный паспорт и экспортированные CAN hooks Init/Ready/Service/RxISR +в загружаемом payload. Flash-таблица не допускается как CAN BIN. +Каждый вариант получает собственные manifest и SHA-256. CAN-файл и оба +sidecar добавляются в тот же архив сборки и проходят штатный экспорт в GUI. +При отказе проверки CAN или обязательного Flash-варианта новая попытка +не копируется в постоянный output/export. Сетевая публикация и запись платы +этой командой не выполняются. + +Защищённый C2000 postbuild располагает образы, их manifest, SHA-256 и карты +в папках `eeprom`, `flash`, `can`, `rs` как непосредственно в `--output`, так +и внутри архива `HASH_дата_UTC+3`. При `--export` весь архив переносится +в SETGUI с той же структурой. Общий `firmware_identity.json` остаётся +в корне архива; `latest_build.json` указывает manifest с относительным +путём `eeprom/_.bin.manifest.json`. Папка +неподдержанного варианта не создаётся. Низкоуровневые конверторы и другие +семейства MCU сохраняют прежний контракт своих результатов. + +В SETGUI можно импортировать корень одной сборки или выбрать её папку +`eeprom`, `can`, `rs`. Основной BIN определяется выбранным паспортом, +а ZIP сохраняет все назначения этой компиляции. Для JTAG выберите +совместимый загрузчик полного комплекта: он возьмёт подписанный OUT +из `flash`. Старые плоские комплекты также поддерживаются.