# RT-4D: DMR не передаёт на хотспот — диагноз и восстановление ## Симптом DMR-приём работает (рация принимает из хотспота), **DMR-передача не декодируется хотспотом** (в логе MMDVMHost 0 «received RF», MMDVMCal рацию не видит). Аналог RX/TX работает. Модуль отвечает в мосте, версия V1.2.0.32. Проблема одинакова на стоке и REFV. ## Корень (подтверждён реверсом + техподдержкой Radtel) **TX-частота рации смещена > ±0.2 кГц** от номинала. По Q&A Radtel даже ±0.2 кГц не даёт хотспоту синхронизироваться с передачей. Приём работает, т.к. RX-смещение в допуске. Причина смещения: заводская частотная калибровка была сброшена/затёрта, а **Radio Tuning Software «Write» залил ДЕФОЛТНЫЕ** значения смещения — неточные для конкретного экземпляра. ### Где что лежит - **Калибровка ОСНОВНОГО тракта рации** — SPI region 0x40 (0x000000, 4 КБ). Восстановлена из `radio-spi-dump.bin` → **приём заработал**. Весь codeplug тоже восстановлен из дампа. - **Частотная калибровка / DMR-девиация** — в NVRAM модуля FM100B. Команды модуля: `SPCali_FreqOpt`, `SPCali_DigMod` (цифр. модуляция), `SPCali_PowerOpt`, `ATC_RfDeviation_SetReq`. Перепрошивка кода модуля их НЕ трогает; сток при старте их НЕ шлёт → сброшенное значение держится. ### Radio Tuning Software — как устроена (reverse .NET) - Работает через **прозрачный мост** (режим МЕНЮ), маркер кадров `0xAAAA`, команды `CmdConnect / CmdOpenCal / CmdWriteAll / CmdEnd`. - Калибровка = **15 частотных смещений** `nOffset_1..15` + `num_U/V_DigFreq` (DMR-частота UHF/VHF). - Кнопки: `Read` (с рации в UI), `Write/WriteAll` (в рацию), `Save`→`.updat` файл. - **ВАЖНО:** по Q&A Radtel после калибровки жать «Finish» (сохранение). Возможно Write без этого не фиксирует. И для точной калибровки нужен **прибор** (SDR/частотомер) — крутить offset до ±0.2 кГц. ## Пути восстановления (по приоритету) 0. **⭐ AT+DMOFREQERR (скрытый ATE-интерфейс чипа) — ЛУЧШИЙ.** Опознано (24.07.2026): DMR-чип = **HF6853 / AUCTUS A6 (RDA8809)**, не SCT3258 (см. `docs/hf6853-auctus-a6.md`). У него реверснутый ATE-интерфейс с частотной калибровкой TCXO: `AT+GETFREQERR` / `AT+DMOFREQERR=`, где `offset[Гц] = -2500 + 10*N`, N=0..500, ±2500 Гц. Наше смещение ~1100 Гц — внутри диапазона, чинится одной записью. После записи сменить канал. Инструмент: `tools/a6_freqfix.py` (probe/read/write, требует SDR-измерения TX). Не требует Radtel `.updat` и Radio Tuning Software. Библиотека — `research/a6tools`. 1. **Компенсация на хотспоте (RXOffset)** — БЕЗ прибора. Если TX рации смещена на постоянный X Гц, выставить на хотспоте `RXOffset` так, чтобы приёмник поймал смещённую передачу. Перебор RXOffset в MMDVM.ini (±1000 Гц шагом ~100), рестарт MMDVMHost, при передаче рации (PTT) искать «received RF» в логе. Требует, чтобы владелец жал PTT в момент перебора. Инструмент: `tools/hotspot_rxoffset_sweep.py` (готовится). 2. **Точная калибровка частоты по прибору** — Radio Tuning Software + SDR/частотомер: Read → крутить `num_U_DigFreq`/`nOffset` до ±0.2 кГц по прибору → **Finish/Save + WriteAll**. 3. **Заводской `.updat`** — запросить у Radtel техподдержки файл калибровки для серийника, либо debug-софт. Тогда Radio Tuning: Open `.updat` → WriteAll. ## Что уже сделано - ✅ SPI-калибровка рации (region 0x40) восстановлена из эталона → приём работает. - ✅ Весь codeplug (каналы/зоны/контакты/группы/ключи/лог/SMS/FM) восстановлен из `radio-spi-dump.bin`. - ✅ Диагноз локализован: TX-частотное смещение модуля. - ⏳ Осталось: вернуть точное TX-смещение (пути 1–3 выше). ## Инструменты - `tools/spi_read.py` / `tools/spi_wr.py` — чтение/запись SPI через CPS (WSL powershell). - `tools/fm100b.py` — команды модулю через мост (режим МЕНЮ). - `tools/agent.py` — интерактивный агент (обычный режим).