- Deutsch (de)
- English (en)
Im Zeitalter des 'Musik Streamen' erscheint terrestrisches Radiohören antiquiert. Bei fehlendem WLAN oder Mobilfunk kann es aber eine Alternative darstellen mit der Welt zumindest konsumierend in Verbindung zu bleiben. Die FM (UKW) Übertragung wurde in Deutschland vor fast 100 Jahren (1925) erstmals ausprobiert. Und eigentlich sollte FM schon 2012 eingestellt werden was aber nur im Kabelnetz Wirklichkeit wurde. Zur Freude der Autofahrer mit herkömmlichen analogen Radios. Der aktuelle digitale Nachfolger DAB+ (das vorherige, inkompatible und wenig erfolgreiche DAB wurde eingestellt) ist zumindest im Markt sichtbar und es gibt eine Zahl von preiswerten DAB+ Empfängern unter 30,-€. Mein Entschluss zum Ausprobieren fiel auf ein TechniSat TECHNIRADIO RDR:
Das Radio hat alle wichtigen Funktionen zum digitalen Empfang in einem handlichen Gehäuse. Wie wäre es aber wenn man ein kleines, programmierbares FM/DAB+ Modul hätte um es beliebig in eigene Projekte einfliessen zu lassen? Ein neues Projekt ist geboren…
Die ersten DIY Versuche mit DAB+ hatte ich übrigens in 2014 mit einem Module (T2-L4A-8650C) der taiwanesischen Firma KeyStone Semiconductor. Hier der zugehörige Thread in microcontroller.net.
Im Hobbybereich ist die Auswahl allerdings immer noch sehr begrenzt. Im Pandemiejahr 2020 konnte ich nur zwei Module finden:
Allen diesen Empfängern ist gemeinsam, dass sie auf dem IC SI4684-A10 von der US Firma Skyworks Solutions Inc. (früher Silicon Labs.) beruhen der für ca. 15,-€ vereinzelt bei US Distributoren (z.B. Mouser) verfügbar ist. Der SI4684 ist ein Single-Chip FM/DAB/DAB+ Radio Receiver (Datasheet).
Um das IC für eigene Projekte einzusetzen bräuchte man das Evaluierungsboard was auch die nötige Firmware CD beinhaltet. Der Preis von über 500,-€ läßt den Maker aber etwas rat- und daher rastlos zurück. Die Firmware alleine ist leider auch nicht (mehr) online verfügbar. Eine gute Infoquelle dazu ist übrigens auch das Rundfunkforum.
Ein Blick in die Empfänger H/W zeigt, dass die Firmware in einem externen Serial FLASH Memory (typ. 25L16) residiert. Je nachdem ob FM oder DAB+ Betrieb wird ein anderer Teil daraus in den SI4684 geladen.
Damit liegt eine Lösung auf der Hand. Einfach das FLASH auslesen und für den eigenen Gebrauch kopieren. Das passende Tool ist im Fernen Osten für unter 10,-€ zu beschaffen.
Das Auslesen ist einfach, aber schwieriger wird es herauszufinden wo was steht. Nach detailliertem Studium der Datensheets, Application Notes und der Auswertung des SPI Traffic zwischen MCU und SI4684 im TechniSat Radio ergibt sich folgende Verteilung:
Start End Size Module ============================================= 0x002000 - 0x0036A1 (0x016A1) Patch016 0x004000 - 0x0056A1 (0x016A1) Patch016 0x086000 - 0x0FEE69 (0x78E69) DAB F/W V6.0.5 0x106000 - 0x187721 (0x81721) FM F/W V5.1.0
Diese Information wird später gebraucht wenn die entsprechende Firmware geladen werden soll. Doch erst brauchen wir mal eine Hardware.
Mein Ziel war es ein möglichst kleines Modul zu entwickeln, das dann überall Platz finden kann ähnlich der KeyStone Lösung. Die Application Note AN851 des Chipherstellers gibt einen Beispielschaltplan sowie einige PCB Designregeln vor. Daran haben sich auch alle Designer bei den mir vorliegenden Boards gehalten. Das hemmt Experimentierfreudigkeit:
Das Module enthält alles für den entspannten FM/DAB+ Empfang und hat folgende Konnektivität zu bieten:
3.3V/GND
- Versorgungsspannung RESB
- Reset des SI4684INTB
- Interrupt Ausgang des SI4684ROUT/LOUT/GND
- Analoger Audio Ausgang mit GND (hier kommt die Musik raus)SSB/SCLK/MOSI/MISO
- SPI Schnittstelle zur steuernden MCUSMA
- Antennenanschluss über SMA Buchse oder einfacher DrahtDie Anschlüsse sind im 2.54mm Raster und können so auch mit Stiftleisten verlötet werden. Damit alles klein bleibt sind die passiven Komponenten in SMD 0402 ausgelegt. Eine tolle Herausforderung für das manuelle Bestücken aber mit ruhiger Hand geht es (meistens).
Das PCB sieht nach dem Entflechten immer harmloser aus als während des Designvorgangs. Zur besseren Darstellung im folgenden Bild ohne ausgefüllte Masseflächen:
Damit die gewählte SMA Buchse passt sollte das PCB nur 1.0mm dick produziert werden. Mit 29x18mm wirkt das Module schon recht handlich. Bei JLCPCB hergestellt kostet es etwas mehr als üblich da ich ja Castellated Holes also halbe Löcher für die Modulanschlüsse genommen hatte. Ich empfehle auf jeden Fall ein Stencil mitzubestellen sonst wird es beim Bestücken noch spassiger. Hier das 'Paste' Ergebnis mit Stencil:
Übrigens ein Mikroskop ist beim Bestücken auch sehr hilfreich. Und nicht vergessen den FLASH Baustein besser vorher zu programmieren. Eventuell muss man mit etwas Entlötlitze nach dem Reflowlöten (mit T962) Kurzschlüsse an den Pins des SI4684 beseitigen. Die lassen sich bei einem Pin Pitch von 0.5mm nicht vermeiden.
Jetzt steht das Module für einem ersten Einsatz zur Verfügung. Damit es löttechnisch jungfräulich bleibt, habe ich mir einen Pogo-Adapter :
zum Test auf Arduino Uno Basis mit einen Standard Experimentierboard erstellt. Man kann natürlich jedes andere Evaluierungsboard nehmen was eine programmierbare SPI Schnittstelle bietet. Bitte nicht die Levelshifter vergessen da ja das DAB+ Modul mit 3.3V Signalen arbeitet. Wenn man gleich auch noch einen Verstärker (hier ein PAM8302A) mit anschliesst dann kann man den Erfolg bald auch hören.
Wie schon erwähnt wird das DAB+ Module über eine SPI Schnittstelle gesteuert. Das übernimmt der Arduino und stellt gleichzeitig ein UART Terminal (115.200 Bd) zur Verfügung mit dem man einzelne Funktionen über die serielle Schnittstelle aufrufen kann:
COMMANDS: reset -> Reset Si4684 test <fm/dab> -> Test module (FM/DAB Mode) fm -> Set FM Mode dab -> Set DAB Mode help -> display this command list DAB Mode: scan -> scan for available DAB ensembles tune <n> -> tune to frequency index service <n> -> tune to service ID info -> display the ensemble info time -> display the current DAB time version -> display DAB firmware version vol <n> -> set volume 0-63 mute <n> -> mute 0=off,1=left,2=right,3=all FM Mode: scan -> scan available FM stations tune <n> -> tune to frequency in kHz seek <up/down> -> seek to next station (up/down) info -> display signal quality and RDS data version -> display FM firmware version vol <n> -> set volume 0-63 mute <n> -> mute 0=off,1=left,2=right,3=all
Nicht vergessen eine Antenne anzuschliessen sonst bleibt es ruhig. Über den SMA Connector geht eine handelsübliche DAB+ Antenne aus dem Elektromarkt oder auch nur ein Draht in der Länge Lambda/4 (FM = ca. 80cm und DAB+ ca. 37cm).
Die Test-S/W auf dem Arduino besteht aus sechs S/W Modulen:
DAB_modtest
HauptprogrammDAB_func
Enthält alle DAB FunktionenFM_func
Enthält alle FM Funktionensi4684.h
Alle SI4684 Definitionensi4684_func
Alle implementierten SI4684 Funktionensi4684patch.h
Patch0016 Daten
Ein guter Anfang ist der test fm
der das Module vollständig initialisiert und einen FM Sender der Wahl (im Beispielcode 88MHz) auswählt. Man sollte nach erfolgreicher Ausführung das Senderprogramm aus den Lautsprechern hören. Wenn nicht dann kann der Fehlerstatus Aufschluss über das Problem geben und die H/W Fehlersuche beginnt.
Was passiert beim test fm
?
Beim test FM
wie aber auch bei jedem Start muss die folgende Sequenz an Funktionen abgearbeitet werden:
si468x_reset()
Hard reset of SI4684 si468x_load_init()
Prepares the bootloader to receive a new imagesi468x_host_load()
Loads an image from HOST over command interfacesi468x_load_init()
Prepares the bootloader to receive a new imagesi468x_flash_set_property(0x0001, 5000)
Sets the value of a FLASH property (SPI Clock to 10MHz)si468x_flash_load(FLASH_START_ADDR_FM)
Loads an image from external FLASH over secondary SPI bussi468x_boot(&value)
Boots the image currently loaded in RAMsi468x_set_property(0x0000, 0x0004)
INT_CTL_ENABLE RDS_INTsi468x_set_property(0x0001, 0x0004)
INT_CTL_REPEAT RDS_INTsi468x_set_property(0x3900, 0x0001)
FM_AUDIO_DE_EMPHASISsi468x_set_property(0x3C00, 0x0001)
FM_RDS_INTERRUPT_SOURCEsi468x_set_property(0x3C01, 0x0010)
FM_RDS_INTERRUPT_FIFO_COUNT si468x_set_property(0x3C02, 0x0001)
FM_RDS_CONFIGsi468x_fm_tune_freq(freq)
tune to FM frequency freq
Nach erfolgreichem test FM
kann man sich an einzelne Menupunkte im FM mode heranwagen oder auch den test DAB
starten. Die jetzige Software hat noch einige Lücken aber mit etwas Zeit und Muse sind RDS oder DAB+ Daten Service Funktionen auch zu implementieren.
Falls jemand Funktionen erweitern will, das SPI Protokoll ist in AN649 vom Hersteller des Chips verfügbar.
Auch wenn noch nicht alle Software Funktionen implementiert sind, ermöglicht das Modul konstruktionsbedingt die vergleichbare Performance wie ein DAB+ Seriengerät. Damit steht einer Integration in eigene Projekte nichts mehr weg.
Da die Test Software in Bangkok (während der Quarantäne) fertiggestellt wurde hier nur ein FM und DAB+ Scan als Beispiel aus dieser Stadt:
FM Freq= 88.0MHz: RSSI=26, SNR=27 00.00.0000 00:00 PI=-1 PTY=18 ps= sd=Radio Thailand F.M. 88.00 MHz. www.prd.go.th 00.00.0000 00:00 PI=-1 PTY=18 ps=NBT 88 sd=Radio Thailand F.M. 88.00 MHz. www.prd.go.th Freq= 88.5MHz: RSSI=20, SNR=20 00.00.0000 00:00 PI=0 PTY=0 ps=GOODTIME sd= Freq= 89.0MHz: RSSI=30, SNR=32 Freq= 90.5MHz: RSSI=21, SNR=19 Freq= 91.5MHz: RSSI=22, SNR=24 Freq= 92.5MHz: RSSI=17, SNR=19 Freq= 93.0MHz: RSSI=18, SNR=20 00.00.0000 00:00 PI=9483 PTY=12 ps= COOL sd= 00.00.0000 00:00 PI=9483 PTY=12 ps= COOL sd=COOLfahrenheit Freq= 93.5MHz: RSSI=21, SNR=22 Freq= 94.0MHz: RSSI=22, SNR=24 00.00.0000 00:00 PI=9485 PTY=10 ps= sd=COOLfahrenheit 00.00.0000 00:00 PI=9485 PTY=10 ps= EFM94 sd=COOLfahrenheit 00.00.0000 00:00 PI=9485 PTY=10 ps= EFM94 sd= www.efm.fm Freq= 98.0MHz: RSSI=38, SNR=27 Freq=101.5MHz: RSSI=26, SNR=28 Freq=103.5MHz: RSSI=28, SNR=26 00.00.0000 00:00 PI=0 PTY=0 ps= sd=103.5 FM ONE 00.00.0000 00:00 PI=0 PTY=0 ps= FM ONE sd=103.5 FM ONE Freq=104.5MHz: RSSI=16, SNR=17 00.00.0000 00:00 PI=11368 PTY=10 ps= FLEX sd= 00.00.0000 00:00 PI=11368 PTY=10 ps= FLEX sd= Freq=105.5MHz: RSSI=21, SNR=21 Freq=106.5MHz: RSSI=24, SNR=21 00.00.0000 00:00 PI=-24219 PTY=12 ps= sd= 00.00.0000 00:00 PI=-24219 PTY=12 ps= WAVE sd=GOOD MUSIC GOOD FEELING 00.00.0000 00:00 PI=-24219 PTY=12 ps= GREEN sd=GOOD MUSIC GOOD FEELING 00.00.0000 00:00 PI=-24219 PTY=12 ps= WAVE sd=GOOD MUSIC GOOD FEELING 00.00.0000 00:00 PI=-24219 PTY=12 ps= GREEN sd=GOOD MUSIC GOOD FEELING DAB+ Ensemble Freq 06 185.360 MHz Bangkok DAB+ Services: ID Name 0: JS.100 1: COOLfahrenheit 2: RROne FM 101 3: Thai PBS Digital 4: 103.5 dab+ RADIO 5: Looktung Network 6: FM 94(TV5) 7: KU RADIO 8: MET 107 9: RadioThailand 10: NBTCtest 11: HITZ 955 12: GreenWave 106.5 13: LTM FM 95 ALL: AM=2 BR=64 SR=48000 SM=4 (Stereo 64Kbps 48000Hz DAB+)
Wenn ihr meine Arbeit unterstützen wollt, so könnt ihr mir gerne einen Cappuccino oder so spenden: .