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