Table of Contents

DAB+ Modul

Motivation

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…

Erste Versuche

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.

Lösung

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.

Serial Flash Programmer

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.

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:

DAB+ module

Das Module enthält alles für den entspannten FM/DAB+ Empfang und hat folgende Konnektivität zu bieten:

Die 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:

DAB+ module PCB

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:

 DAB+ module paste example

Ü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.

 DAB+ module soldered

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 :

DAB+ module 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.

 Test Board on top of an Arduino Uno

Software

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:

  1. DAB_modtest Hauptprogramm
  2. DAB_func Enthält alle DAB Funktionen
  3. FM_func Enthält alle FM Funktionen
  4. si4684.h Alle SI4684 Definitionen
  5. si4684_func Alle implementierten SI4684 Funktionen
  6. si4684patch.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:

  1. si468x_reset() Hard reset of SI4684
  2. si468x_load_init() Prepares the bootloader to receive a new image
  3. si468x_host_load() Loads an image from HOST over command interface
  4. si468x_load_init() Prepares the bootloader to receive a new image
  5. si468x_flash_set_property(0x0001, 5000) Sets the value of a FLASH property (SPI Clock to 10MHz)
  6. si468x_flash_load(FLASH_START_ADDR_FM) Loads an image from external FLASH over secondary SPI bus
  7. si468x_boot(&value) Boots the image currently loaded in RAM
  8. si468x_set_property(0x0000, 0x0004) INT_CTL_ENABLE RDS_INT
  9. si468x_set_property(0x0001, 0x0004) INT_CTL_REPEAT RDS_INT
  10. si468x_set_property(0x3900, 0x0001) FM_AUDIO_DE_EMPHASIS
  11. si468x_set_property(0x3C00, 0x0001) FM_RDS_INTERRUPT_SOURCE
  12. si468x_set_property(0x3C01, 0x0010) FM_RDS_INTERRUPT_FIFO_COUNT
  13. si468x_set_property(0x3C02, 0x0001) FM_RDS_CONFIG
  14. si468x_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.

Fazit

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+)

Downloads

Spenden

Wenn ihr meine Arbeit unterstützen wollt, so könnt ihr mir gerne einen Cappuccino oder so spenden: .