Files
Balsam_167/Doc/GAS_167_M95M02.md
Andrey 5d9818291b feat: add M95M02-only GAS and EEPROM profiles
Expose the existing registers through Modbus and service CAN using one GAS provider only in M95M02 builds.
Include the EEPROM layout/driver, LOAD protection and calibration, firmware identity and shared CCS build workflow.
Add transport/profile and SCI8 validation tests, documentation and the checked M95M02 firmware image.
2026-10-09 16:17:37 +03:00

98 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# GAS 167: только M95M02
Реализован профиль GAS **167/v1** для установленной EEPROM **M95M02-DR, 256 КиБ**. Он предоставляет общий доступ к существующим технологическим регистрам через Modbus RTU и служебный CAN УМП. Оба транспорта используют один provider [gas167.c](../Source/Internal/gas167.c). Состав регистров, алгоритм управления, защита, сохранение параметров и регистратор УМП сохранены.
## Включение и сборка
В [eeprom_config.h](../Source/Internal/Include/eeprom_config.h) сейчас выбран **EEPROM_M95M02=0** (AT25256B). Для установленной M95M02 выбрать **1**. GAS включается только этим аппаратным выбором; отдельного runtime-переключателя нет. Для AT25256B установить **0**, затем выполнить **Clean/Rebuild**. В этой сборке отсутствуют GAS-код и дополнительные регионы.
Новый файл gas167.c подключён к CCS через .project. После обновления проекта выполнить Clean/Rebuild, чтобы CCS добавил его в сборку. Конфигурацию памяти менять не требуется: код продолжает загружаться в прежнюю RAM.
CLI define EEPROM_M95M02 должен передаваться и компилятору, и линкеру. Значение в заголовке теперь находится внутри ifndef, поэтому override не переопределяется обратно на 1. Выбор должен соответствовать установленной микросхеме.
## Карта адресов
Адреса ниже относятся к профилю конкретного устройства **167/v1**. Они не назначают новые универсальные значения нормативному XLSX ОАП и не совместимы по смыслу с экспериментальным профилем GAS-логгера ПМ35.
| GAS | Штатный адрес / источник | Назначение | Доступ |
|---|---|---|---|
| 0x5000…0x507F | 0x0000…0x007F, modbus[128] | Те же 128 технологических регистров; GAS = 0x5000 + индекс | Как штатный Modbus; ограничения LOAD ниже |
| 0x5050 | 0x0050 | Задание ЦАП | RW, штатный raw |
| 0x5051 | 0x0051 | Штатный регистр останова | RW |
| 0x5052 | 0x0052 | CAN timeout LOAD, мс | RW; для LOAD 1…60000 |
| 0x507C | 0x007C | LOAD_STATUS | Только чтение для LOAD |
| 0x507D | 0x007D | LOAD_ATTEMPTS | Только чтение для LOAD |
| 0x507E | 0x007E | LastMode | Как штатный регистр |
| 0x507F | 0x007F | Commands, битовая маска | RW; штатная фиксация команды |
| 0x5F00…0x5F07 | Константы GAS-профиля | Сигнатура, версия, возможности | Только чтение |
Один регистр — **16 бит raw**. Битовые маски, знаковость и масштаб отдельных параметров сохраняют смысл существующего проекта; преобразование в физические величины выполняет клиент. Отдельной копии значений, нового массива логгера и новых сохранённых параметров нет.
Прежние адреса 0x0000…0x007F, УМП 0x1000…0x117B, паспорта 0x1200…0x120B, защиты 0x1300…0x1307 и EEPROM 0x8000…0xFFFF продолжают обслуживаться своими обработчиками. Дополнительные окна GAS не пересекают их.
## Обнаружение профиля
Прочитать **8 слов с 0x5F00**. Перед записью клиент проверяет сигнатуру, версию, номер профиля и аппаратный вариант.
| Адрес | Значение | Смысл |
|---|---:|---|
| 0x5F00 | 0x4741 | Сигнатура GA |
| 0x5F01 | 0x5331 | Сигнатура S1 |
| 0x5F02 | 1 | Версия контракта профиля |
| 0x5F03 | 167 | Профиль устройства |
| 0x5F04 | 0x5000 | Начало технологических регистров |
| 0x5F05 | 128 | Количество технологических регистров |
| 0x5F06 | 7 | Бит 0: RTU; бит 1: служебный CAN; бит 2: запись FC06 |
| 0x5F07 | 1 | EEPROM M95M02 |
В сборке AT25256B эти адреса отклоняются как недопустимые; сигнатуру GAS она не возвращает.
## Modbus RTU и служебный CAN
**Modbus:** FC03 читает 1…124 слова, FC06 записывает одно слово. Блок целиком находится в одном регионе. Ответ FC06 возвращает исходный GAS-адрес. GAS использует обычный ответ расширения без исторических хвостовых нулей; штатные низкие адреса сохраняют прежний формат.
Примеры: FC03(0x5F00, 8) — профиль; FC03(0x5000, 124) и FC03(0x507C, 4) — все технологические слова; FC06(0x5052, 1000) — штатный timeout LOAD.
**CAN:** используется существующий служебный запрос УМП с маркером 0x1F00, ненулевым token и функцией 3/6. Прикладной provider тот же, что у RTU. Для MBOX1 поля запроса: MDL = (GAS_address << 16) | quantity_or_value; MDH = 0x1F000000 | (token << 8) | function. Extended CAN ID запроса/ответа, порядок упаковки C28x и планировщик MBOX2 остаются штатными.
Чтение CAN допускает **2…124 слова, чётное количество**: один ответный фрагмент содержит два слова. Запись возвращает пару GAS_address/value и код результата, token сохраняется. Ответы передаются из снимка; изменение RAM между фрагментами не меняет уже захваченный блок. Для одного слова читать допустимую пару и выбрать нужное слово. Если пара вышла бы за границу региона, начать её на один адрес раньше.
Нативный ProtoCAN MsgType=0x3 не добавлялся. Для подключения SETGUI/другого клиента нужно использовать этот профиль и существующий служебный транспорт УМП, а не кодировку экспериментального pcan_gas.
## Проверки доступа
| Условие | Результат |
|---|---|
| Функция отличается от 3/6 | Код 1, illegal function |
| Адрес вне региона; блок пересекает границу; запись паспорта GAS | Код 2, illegal address |
| FC03 quantity = 0 или >124; нечётное количество CAN | Код 3, illegal value |
| LOAD: запись 0x507C или 0x507D | Код 2; значения не меняются |
| LOAD: запись timeout 0 или >60000 в 0x5052 | Код 3; значение не меняется |
| Запись 0x507F | Штатная запись Commands и вызов ump_log_rs, как при FC06(0x007F) |
Валидация блока выполняется до чтения. Параметр modbus[128] вне опубликованных 128 слов не раскрывается. Чтение и запись GAS выполняются под существующей короткой IRQ-блокировкой main loop; EEPROM SPI остаётся вне этой блокировки.
## Проверенная сборка
TI C2000 22.6.0.LTS, -O2, speed=0, gen_func_subsections=on, FPU32/COFF. Версия из пользовательского firmware_version.h: **1.1.2**. Загрузочный образ проверен как SCI8: заголовок, полные блоки, завершающее слово, адреса RAM и entry point.
| Сборка | Без GAS, байт | С GAS, байт | Добавлено | Лимит прошивки | Свободно |
|---|---:|---:|---:|---:|---:|
| AT25256B | 32472 | **32472** | **0** | 32508 | 36 |
| M95M02 | 32764 | **33174** | **410** | 261884 | **228710** |
AT25256B сравнен с исходниками до добавления GAS при одинаковых параметрах и generated identity: BIN совпадает **побайтно и по SHA-256**. GAS-символов в его MAP нет. У M95M02 остаётся 0x033F слов (1662 физических байта) свободной RAML0; секции и данные прежнего логгера не увеличены.
Готовый образ: [GAS M95M02 BIN](../Bin/GAS_M95M02/UKSSTMS320F28335_GAS_M95M02.bin), рядом manifest с eeprom=M95M02, GAS-профилем и SHA-256. Сборка включает незакоммиченные изменения проекта; build_id содержит знак +.
Проверки на ПК:
~~~powershell
python tests/gas167/run_test.py
python tests/gas167/check_image.py Bin/GAS_M95M02/UKSSTMS320F28335_GAS_M95M02.bin --eeprom M95M02
~~~
Тест использует production GAS provider, фактические тела обработчиков Modbus и UMP_CAN_service, общую сериализацию CRC/CAN и аппаратные mocks. Проверены обе конфигурации, адреса/границы, запреты записи, 124-словный RTU-ответ и полный CAN-снимок в 62 фрагментах. Числовая ABI GCC адаптирована к 16-битным словам C28x; целевая компиляция дополнительно проверена TI.
Загрузка на плату, холодный SPI boot и аппаратные тайминги в этой задаче не проверялись.