docs/module-cal-reference.md: карта 0xB0-0xBD, форматы read/write, band-адресация, живой снимок cal. Ключевое: девиация не сбита (0x96), DMR VCXO-трим=0x40 vs аналог=0x80. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NikMGoqQWWk9wy2ww2vJAr
3.8 KiB
3.8 KiB
RT-4D DMR-модуль (HF6853) — справочник калибровки (0x68 B-команды)
Консолидация реверса тюнера (docs/tuning-software-protocol.md) + живых чтений через мост
(tools/tuning_read.py, режим «Обновление DMR чипа»). Все кадры — 0x68, CK не проверяется,
baud 115200. Прочитано и подтверждено на реальной рации 24.07.2026.
Формат
Кадр: 68 <cmd> 01 01 00 00 <lenHi> <lenLo> <payload...> 10
Read-req: payload = 00 <band> (band: 01 или 02; 00/03 -> status 0x01 = ошибка)
Read-resp: payload = 00 <band> <val...>
Write: payload = 01 <band> <val...> (op=01)
Ответ OK: status(байт[3]) = 0x00; ошибка = 0x01
band: 01 и 02 — два поддиапазона (вероятно нижний/верхний участок UHF; VHF-вариант в SetCalFreq_V).
Команды
| cmd | имя (тюнер) | NV-элемент (прошивка) | что | формат value | живое значение (UHF) |
|---|---|---|---|---|---|
| 0xB0 | CmdOpenCal/ColseCal | — | вход/выход cal (payload 01/00) | — | OK |
| 0xB1 | SetCalFreq_U/_V | SPCaliic_FreqOpt | опорные частоты диапазона (3×4Б BE Гц) | band,N,freqs | UHF 400.125/435.125/469.975 МГц |
| 0xB2 | Set/ReadAnaVCCN | SPCali_AnaVccnOpt | аналоговый частотный трим (VCXO) | band,val8 | band1=0x80, band2=0x80 |
| 0xB4 | Set/ReadDigVCCN | (Dig VCCN) | DMR частотный трим (VCXO) | band,val8 | band1=0x3f, band2=0x40 |
| 0xB3 | SetAnaTX | — | аналог TX параметр | band,i,v | — |
| 0xB5 | SetDigTX | SPCali_DigMod1Opt? | DMR TX (несёт DetectDevice) | band,i,dev | — |
| 0xB6 | Set/ReadMod (Cal) | (девиация Mod1..3) | девиация | band,idx(1..3),val8 | все = 0x96 (дефолт, НЕ сбита) |
| 0xB7 | Set/ReadSlot (Cal) | — | тайминг/слот | band,... | 00 03 42 01 08 d9 |
| 0xB8 | Set/ReadPWR (Cal) | SPCali_PowerOpt | мощность | band,idx,val | 00 01 01 00 05 |
| 0xBD | CmdWriteAll | — | сохранить cal в NV (payload 01, БЕЗ данных) | — | — |
Пример записи DMR-трима band2: 68 b4 01 01 00 00 00 03 01 02 <val> 10 (проверено, обратимо
живьём без CmdWriteAll — откатывается при перезагрузке).
Ключевые наблюдения по «сдвигу TX»
- Девиация (Mod, 0xB6) = 0x96 по всем band/idx — дефолт, не повреждена (мои старые 0x66-эксперименты следа не оставили).
- DMR VCXO-трим (0xB4) = 0x40, аналоговый (0xB2) = 0x80. Аналог работает → его трим верен. DMR-трим — кандидат №1 на источник частотного сдвига DMR, но требует измерения (BER на MMDVM или частотомер), т.к. направление/цена деления неизвестны. Слепо не писать (см. docs/dmr-tx-recovery.md).
- Частотная калибровка штатно — ЗАМКНУТЫЙ цикл под прибор (CmdOpenCal → модуль TX несущую → крутить трим → CmdWriteAll). Один AT+DMOFREQERR-стиль «одной командой» тут не применим.
Живой снимок (research/tuning-re/module-cal-baseline.txt)
DigVCCN b1=0x3f b2=0x40 | AnaVCCN b1=b2=0x80 | Mod all=0x96 | PWR 00 01 01 00 05 | Slot 00 00 03 42 01 08 d9. Baseline для отката DMR-трима = 0x40 (band2), 0x3f (band1).