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.
This commit is contained in:
2026-10-09 16:17:37 +03:00
parent c6c9128238
commit 5d9818291b
63 changed files with 2307 additions and 365 deletions

136
Doc/EEPROM_LAYOUT.md Normal file
View File

@@ -0,0 +1,136 @@
# EEPROM 167: выбор AT25256B / M95M02
Маркировка платы `ATMLH516 5EBL` определяет AT25256B: **256 Кбит**, то есть
**32 768 байт**. Расшифровка и характеристики приведены в
[даташите Microchip](https://ww1.microchip.com/downloads/aemDocuments/documents/MPD/ProductDocuments/DataSheets/AT25128B-AT25256B-128-256-Kbit-SPI-Serial-EEPROM-Industrial-Grade-Data-Sheet-DS20006193.pdf).
Константы общей разметки находятся в
[templates/include/balsam167_eeprom_layout.h](../../newProject/SETGUI/third_party/templates/c/set-protocol/include/balsam167_eeprom_layout.h).
`spise2p.h` использует их для физического размера, количества слов и длины
страницы. `message.c` — для адреса параметров. Размер массива параметров
проверяется относительно `ANSWER_LEN` на этапе компиляции.
`F28335.cmd` включает тот же заголовок и экспортирует символы `_EEPROM_*` в
`.map`. Путь к templates/c/set-protocol добавлен в search path линкера CLI и CCS.
EEPROM не стала секцией CPU MEMORY: SPI-образ загружается в RAM загрузчиком.
Расположение `.text`, `.cinit`, `.econst`, `.switch` не менялось.
| Область | Начало, байт | Конец, исключая | Размер |
|---|---:|---:|---:|
| Прошивка SCI8 | `0x0000` | `0x7EFC` | 32 508 |
| Параметры | `0x7EFC` | `0x7FFE` | 258 |
| Неиспользуемое слово | `0x7FFE` | `0x8000` | 2 |
`check_firmware.ps1` получает размер и резерв из общего заголовка и сверяет
резерв с `ANSWER_LEN`. При нестандартном checkout передайте `-TemplatesRoot`;
`build_logger.ps1` делает это автоматически. Исторические параметры не перенесены.
Чтение с платы, единицы адресов, порядок байтов и сохранение дампа описаны в
[руководстве SETGUI](../../newProject/SETGUI/docs/BALSAM167_EEPROM.md).
Для старой прошивки reader использует CMD_PEEK (2 байта за запрос).
Версия 0.1.1 также поддерживает блочное чтение FC03, регистры 0x8000..0xBFFF,
до 120 слов (240 байт) за запрос. Полный дамп требует 137 запросов.
Границы и формат заданы в templates, GUI использует тонкий Python-порт.
Блочное чтение выполняется с разрешёнными прерываниями для работы SPI Timer2.
Запись через это окно запрещена; параметры и их расположение не изменяются.
Размер каждого нового BIN проверяется при сборке; прежний вариант с одним
PEEK занимал 32 286 байт. Точный размер новой сборки указан в её manifest.
Для реального увеличения памяти потребовались бы другая микросхема, проверка
SPI-загрузчика и драйвера, а не только правка линкера.
## Выбор типа памяти (прошивка 0.1.2)
По умолчанию остаётся AT25256B. Автоматического определения ёмкости нет:
контрольные записи для определения типа не выполняются. Выбранный тип должен
совпадать с физической микросхемой до запуска программы и чтения параметров.
### CCS12
Откройте `Source/Internal/Include/eeprom_config.h`:
```c
#define EEPROM_M95M02 0 /* AT25256B, 32 КиБ */
/* Для установленной M95M02 измените значение на 1. */
```
После изменения выполните **Project → Clean**, затем **Rebuild**. Этот файл
читают драйвер, обработчик команд и F28335.cmd; post-build использует тот же
выбор. Не задавайте противоречащий ему отдельный define только компилятору CCS:
тогда компилятор, линкер и проверка BIN могут получить разные настройки.
### Сборка скриптом
```powershell
./build_logger.ps1 -Eeprom AT25256B -OutputDirectory ./Bin/EepromProfiles/AT25256B -ImageName UKSSTMS320F28335_AT25256B
./build_logger.ps1 -Eeprom M95M02 -OutputDirectory ./Bin/EepromProfiles/M95M02 -ImageName UKSSTMS320F28335_M95M02
```
Параметр скрипта передаётся компилятору, линкеру и проверке размера; исходный
config не меняется. Скрипт по умолчанию собирает AT25256B. Рядом с BIN создаются
manifest и SHA-256; поле `eeprom` в manifest различает аппаратные варианты.
UART остаётся 115200; алгоритм UART и FIFO не изменялся.
| Параметр | AT25256B | M95M02-DR |
|---|---:|---:|
| Ёмкость, байт | 32768 | 262144 |
| Адрес SPI | 2 байта | 3 байта |
| Страница записи, байт | 64 | 256 |
| Начало параметров, байт | 0x7EFC | 0x3FEFC |
| Начало параметров, слова | 0x3F7E | 0x1FF7E |
| Конец параметров, исключая | 0x7FFE | 0x3FFFE |
| Максимальная область BIN | 32508 | 261884 |
Последние два байта не используются. У M95M02 старшие адресные биты передаются
отдельным восьмибитным тактом, затем младшие 16 бит. Адреса и длины драйвера
расширены до 32 бит только в сборке M95M02. Запись делится по физическим страницам;
готовность определяется WIP в регистре состояния. На плате с новым чипом ещё
нужна проверка записи/считывания и холодного SPI boot; тесты на ПК не заменяют её.
### SETGUI
На вкладках **EEPROM 167** и **Загрузка / запуск / прошивка** есть синхронный
чекбокс **M95M02 · 256 КиБ**. Снято — AT25256B · 32 КиБ. Он выбирает протокол
и допустимый диапазон ПК, но не перепрограммирует тип EEPROM работающей платы.
Во время чтения/загрузки переключатель блокируется.
Для полного дампа нажмите «Вся EEPROM»: 32768 либо 262144 байта. Длина блока
остаётся 240 байт. M95M02 требует блочного чтения; автоматический переход на
PEEK запрещён. Неподходящая прошивка должна отклонить запрос, а не вернуть
повторяющиеся первые 32 КиБ как полный дамп. Дамп можно передать кнопкой
«Сравнить с файлом…» напрямую в сравнение BIN.
При загрузке BIN проверяется поле `eeprom`, если оно присутствует в manifest.
Старые файлы без этого поля не позволяют проверить тип. Команда «В SEEPROM»
использует отдельный подкод M95M02; старая прошивка его не исполняет. Операция
может завершиться таймаутом при несовпадении типа; это не успешная запись.
GUI ограничивает отдельную загрузку в RAM существующим пределом 199993 байт:
ёмкость EEPROM 256 КиБ сама по себе не увеличивает буфер загрузки или RAM CPU.
### Замена микросхемы и параметры
Сначала сохраните полный дамп старой EEPROM и настройки платы. После установки
M95M02 запустите её сборку через CCS, запишите соответствующий BIN и сохраните
параметры штатной командой Save. Параметры автоматически не мигрируют с 0x7EFC
на 0x3FEFC. Простое копирование старого полного дампа в начало новой памяти
не переносит настройки в их новую область и оставляет старый вариант прошивки.
### Общий протокол templates
Реализация и границы: `balsam167_eeprom_layout.h`, `balsam167_eeprom_block.h`,
`periph28335.c`. Публичные функции `*_profile` получают 0 (AT25256B) или 1
(M95M02); старые функции и структура reader из четырёх uint32_t сохранены.
Python — тонкий ctypes-порт. Профили ПМ67/2812 и STM этим выбором не изменяются.
Для M95M02 используется частное расширение окна FC03: адрес 0x8000…0xFFFF,
quantity = 0x8000 | (bank << 8) | word_count, bank 0…3, word_count 1…120.
Каждый запрос содержит свой банк 64 КиБ; общего переключаемого банкового
регистра нет. Блок не пересекает границу банка. Это не стандартное количество
регистров Modbus — пользоваться следует общим API templates.
Подкод EXTEND записи: 4 для AT25256B, 0x44 для M95M02. Адрес назначения в словах,
размер в байтах. Обе стороны проверяют границу области прошивки.
Проверки: C-тест полного дампа 256 КиБ с нечётного адреса, все переходы банков,
CRC и выход за границы; Qt-тесты выбора и запрета fallback; host-тест реального
SPI-автомата `python tests/eeprom_profiles/run_test.py`; сборка обоих вариантов TI.