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

11 KiB
Raw Blame History

GAS 167: только M95M02

Реализован профиль GAS 167/v1 для установленной EEPROM M95M02-DR, 256 КиБ. Он предоставляет общий доступ к существующим технологическим регистрам через Modbus RTU и служебный CAN УМП. Оба транспорта используют один provider gas167.c. Состав регистров, алгоритм управления, защита, сохранение параметров и регистратор УМП сохранены.

Включение и сборка

В 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, рядом manifest с eeprom=M95M02, GAS-профилем и SHA-256. Сборка включает незакоммиченные изменения проекта; build_id содержит знак +.

Проверки на ПК:

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 и аппаратные тайминги в этой задаче не проверялись.