Root cause of FM/DAB "stonata" audio: xtalCtun=31/nominal XTAL_FREQ defaults were never measured against this board's actual crystal (Abracon ABM8-19.200MHZ-10-1-U-T, CL=10pF, two external 15pF load caps). Fixed via CTUN trim by ear (31->0) plus a new live calibration loop that reads the Si4684's own FM_RSQ FREQOFF field (broadcast carriers are GPS-locked, so it's a free precision frequency reference) to trim XTAL_FREQ with no lab equipment. Converged to CTUN=0, XTAL_FREQ=19199750 Hz, residual -3/-4 ppm cross-checked on two stations. New tools/infrastructure (kept, not one-off): - Si4684Driver::recalibrateXtal() + POST /api/tuner/xtal-calibrate: live crystal re-trim without an ESP32 reflash. - FM_RSQ FREQOFF exposed as "freqoff_ppm" in GET /api/tuner/status. - tools/si4684_xtal_calibration.py: automates the trim loop. - tools/si4684_antenna_calibration.py: AN851 Appendix A ANTCAP/VARM/VARB sweep tool (same session, separate calibration). - CONFIG_ESP32_I2S_TEST_TONE (off by default): isolates Si4684-specific audio issues from shared-downstream ones by writing a tone directly over the I2S bus the Si4684 also uses. - SIGMA_WRITE_REGISTER_BLOCK/sigma_safeload_block now retry on NACK and verify via read-back instead of firing I2C writes blind. - FM de-emphasis set to European 50us (was left at the US 75us default). - DAB_ACF_ENABLE restored to its previous 0x0000 with a citation explaining why (tested the datasheet default of 0x0003, made things audibly worse). See docs/si4684-rf-investigation-report.md's 2026-08-23 entry for the full elimination chain and docs/TODO.md for follow-up work (persisting calibration results to EEPROM instead of requiring a firmware edit). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
29 lines
990 B
C++
29 lines
990 B
C++
/**
|
|
* @file esp32_i2s_test_tone.hpp
|
|
* @brief Continuous sine tone over the shared ESP32 -> ADAU1701 I2S TX
|
|
* channel, for isolating ADAU1701 I2S-input problems from the
|
|
* Si4684 specifically.
|
|
*
|
|
* DigiRadio firmware — https://github.com/manvalan/DigiRadio
|
|
*
|
|
* Copyright 2026 Michele Bigi
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
#pragma once
|
|
|
|
namespace esp32_i2s_test_tone {
|
|
|
|
/**
|
|
* Generate and write a sine-wave tone over esp32_i2s_sink forever. Intended
|
|
* to run as its own FreeRTOS task (never returns). Unlike the ADAU1701's
|
|
* internal Beep cell (POST /api/audio/beep), this tone travels over the
|
|
* physical SDATA_IN1 wire and the shared BCLK/LRCLK the Si4684 also uses on
|
|
* SDATA_IN0 -- if it sounds clean while FM/DAB is distorted, the problem is
|
|
* specific to the Si4684 side, not the ADAU1701's I2S input path in general.
|
|
*
|
|
* @param freqHz Tone frequency in Hz.
|
|
*/
|
|
[[noreturn]] void run(float freqHz);
|
|
|
|
} // namespace esp32_i2s_test_tone
|