DigiRadio v2
Il firmware della v2
La v2 ha due firmware: il programma audio che gira nel DSP ADAU1452 e il firmware dell'ESP32-S31, che comanda radio, Bluetooth e DSP.
Il programma del DSP
La v1 usa un ADAU1701, che si programma con SigmaStudio. L'ADAU1452 si programma con SigmaStudio+, che non può aprire i vecchi progetti, quindi ho rifatto il programma da zero con lo stesso percorso audio e gli stessi valori di taratura.
Il programma occupa 706 parole su 8192 di memoria di programma: l'ADAU1452 ha molto spazio libero per crescere. I filtri dell'EQ e del bass boost e la curva del compressore hanno gli stessi coefficienti della v1. Il Super Bass usa invece un altro algoritmo, quindi il suono andrà giudicato a orecchio.
Rispetto alla v1 c'è una sorgente in più, l'ESP32, e i livelli si leggono da celle del programma.
Le porte audio
Tutti i clock I²S li genera il DSP, a 48 kHz, con slot da 32 bit e dati a 24 bit. Sintonizzatore, modulo Bluetooth ed ESP32 ricevono i clock.
| Porta del DSP | Collegata a | Direzione |
|---|---|---|
| SDATA_IN0 | Si4684 | ingresso radio |
| SDATA_IN1 | FSC-BT1058 | ingresso Bluetooth |
| SDATA_IN2 | ESP32-S31 | ingresso webradio |
| SDATA_OUT0 | FSC-BT1058 | uscita Bluetooth |
| SDATA_OUT1 | ESP32-S31 | uscita verso l'ESP32 |
| S/PDIF | TOSLINK | uscita ottica |
Il firmware dell'ESP32
Tutto ciò che non dipende dalla scheda è in comune con la v1: sintonizzatore, servizi audio, web server, webradio, sveglie e aggiornamenti. La cartella della v2 contiene solo quello che cambia.
| v1 | v2 | |
|---|---|---|
| Modulo | ESP32-S3-WROOM-1 | ESP32-S31-WROOM-3-N16R16V: RISC-V, 16 MB di flash e 16 MB di PSRAM |
| Framework | ESP-IDF 5 | ESP-IDF 6.1, dove l'S31 è ancora in anteprima |
| DSP | ADAU1701 via I²C | ADAU1452 via SPI, sullo stesso bus del Si4684 |
| Bluetooth | FSC-BT1035 | FSC-BT1058, UART senza CTS e RTS |
| Firmware del Si4684 | Inviato dall'ESP32 a ogni avvio | Salvato una volta nella W25Q16 del Si4684 |
| EEPROM di identità | 24AA025E48 a 0x52 | 24AA025E64 a 0x50 |
| Alimentazione | Sempre accesa | 3V3_AUDIO comandata da ENABLE_ANALOG, batteria letta via I²C |
| Uscite audio | Bluetooth | Bluetooth e TOSLINK, generato direttamente dal DSP |
I collegamenti dell'ESP32
I pin vengono dalla netlist dello schema. Quando 3V3_AUDIO è spenta, tutti i pin verso quel dominio restano in alta impedenza, per non alimentare i chip spenti attraverso i loro diodi di protezione.
| Funzione | GPIO |
|---|---|
| SPI di controllo: SCLK, MOSI, MISO | 1, 2, 3 |
| Si4684: CS, RESET#, INT, SMODE | 21, 15, 16, 17 |
| ADAU1452: CS, RESET# | 20, 14 |
| I²S verso il DSP: BCLK, WS, uscita, ingresso | 46, 47, 48, 42 |
| BT1058: RX, TX, SYS_CTRL, RESET | 10, 11, 12, 13 |
| I²C: SCL, SDA | 50, 51 |
| ENABLE_ANALOG | 19 |
| POWER_ALERT# | 7 |
POWER_ALERT# unisce le uscite open-drain del caricabatterie BQ25896 e del misuratore MAX17048 su una sola linea con un pull-up. A ogni allarme il firmware legge entrambi i chip via I²C e azzera l'allarme del MAX17048, che altrimenti terrebbe bassa la linea nascondendo gli impulsi del BQ. La lettura periodica resta come riserva, e i valori si vedono in GET /api/health.
La sequenza di avvio
- ENABLE_ANALOG accende 3V3_AUDIO con i pin audio ancora flottanti.
- Parte per primo l'ADAU1452: reset, passaggio in modalità SPI e controllo dello stato. Finché non è in SPI scambierebbe il traffico del Si4684 per I²C.
- Se il DSP non è partito dalla EEPROM, l'ESP32 gli carica il programma via SPI.
- Il Si4684 carica la patch e controlla le immagini nella sua flash con un CRC. Se sono diverse, le riscrive.
- Il Si4684 parte dalla flash. Se la scrittura è fallita, l'ESP32 invia le immagini come sulla v1.
- Il BT1058 si avvia in background.
Un guasto del DSP non ferma l'avvio: web server e aggiornamenti restano raggiungibili.
Le due memorie al primo avvio
W25Q16, la flash del Si4684. L'ESP32 non la vede direttamente, ma il Si4684 ha dei comandi per scriverla (AN649, §6.5). Al primo avvio il firmware scrive le immagini FM e DAB verificando ogni blocco, e da lì in poi controlla il CRC a ogni avvio.
25AA1024, la EEPROM dell'ADAU1452. Anche questa è raggiungibile solo attraverso il suo chip, e i registri non bastano: i pin del master SPI, usati come uscite, li comanda il programma del DSP. Per questo c'è un piccolo programma "writer" che l'ESP32 carica nel DSP per muovere quei pin.
Manca però l'immagine da scrivere, perché SigmaStudio+ la crea solo con una scheda collegata. Quindi all'inizio la EEPROM resta vuota e l'ESP32 carica il programma via SPI a ogni accensione. Con il primo prototipo scriverò la EEPROM da SigmaStudio+, la rileggerò con il firmware e metterò l'immagine nel firmware, che da quel momento la scriverà da solo sulle altre schede.
Compilarlo
Serve ESP-IDF 6.1. Le immagini del Si4684 non sono nel repository: si recuperano con lo script descritto nella documentazione.
idf.py --preview set-target esp32s31
idf.py build
Cosa resta da provare
- Il suono, soprattutto di Super Bass e bass boost.
- L'avvio da EEPROM e la scrittura della EEPROM da parte dell'ESP32, con il programma writer.
- I comandi AT del BT1058, scritti partendo da quelli del BT1035: non ho ancora la sua guida di programmazione.
- La scrittura della W25Q16 attraverso il Si4684.
- La taratura del quarzo del Si4684, da rifare su questa scheda.
Tutto aperto
Il firmware dell'ESP32 è nella cartella Hardware-v2/firmware su GitHub, con licenza Apache 2.0, insieme all'elenco completo dei controlli da fare sul primo prototipo. Della scheda parlo nella pagina DigiRadio v2.