Forum: Mikrocontroller und Digitale Elektronik RDS beim Si4703 FM Tuner


von Heiko H. (Gast)


Lesenswert?

Hi,
ich habe das Breakout-Board Si4703 an meinen Raspberry angeschlossen und 
ein kleines C-Programm geschrieben um Sender und Volume per Console zu 
ändern.

Alles funktioniert schon gut, nur beim readRDS() kommt nur ein leerer 
String zurück. Ich mehrere Sender versucht, aber es kommt kein RDS.

Ich verwende dieses Breakout-Board:
https://www.sparkfun.com/products/12938

Folgende Library habe ich verwendet:
https://github.com/cthoma/rpi-si4703

Hat jemand Erfahrung mit dem RDS-Empfang mit diesem Chip?

Danke!

Heiko

von Egal (Gast)


Lesenswert?

Ich weiß nicht wie der Code funktioniert mit dem RDS Empfang.

Grundsätzlich hängt der Empfang von RDS Daten auch sehr von der 
Empfangsqualität ab und kann da der Station-Name immer nur in Blöcken 
von zwei Vhars gesendet wird kann das dann schonmal dauern.
Mal paar Sekunden mal auch eine Minute.

Wenn die Funktion einen Timeout hat und blockiert ist das eigentlich 
Mist.

Es wäre besser du pollst die ganze Zeit auf neue RDS Daten im 
Hintergrund und wenn alle Informationen für den Station Name da sind 
löst du einen Event aus der dann den String ausgibt.

von Heiko H. (Gast)


Lesenswert?

Hi Egal,
ja, das ist in der Si4703_Breakout Library über einen Timeout gelöst.
Das sollte eigentlich ein Mini-Projekt werden. Bis auf RDS funktioniert 
ja alles.
Wie das readRDS() in der Lib implementiert ist, verstehe ich momentan 
noch nicht richtig.
Ich habe schon eine Schleife geschrieben um den RDS-Scan 100x zu 
starten, aber es kommt nichts zurück. Verschiedene Timeout-Zeiten habe 
ich auch schon probiert, ohne erfolg.
Ich sehe mir jetzt mal das Datenblatt an und welche Register für 
RDS-Erkennung zuständig sind. - So tief wollte ich eigentlich gar nicht 
einsteigen, aber das wurmt mich jetzt.

von Marc H. (marchorby)


Lesenswert?

Register 2 Bit 15 für den RDS-Mode richtig gesetzt?
Register 4 Bit 12 für RDS-Enabled gesetzt?
Register 4 Bit 11 auf DE?
Register A Bit 15 richtig gesetzt?
Register A Bit 11 richtig gesetzt?
Register A Bit 10 und 9 richtig gesetzt?

von W.S. (Gast)


Lesenswert?

Heiko H. schrieb:
> Hat jemand Erfahrung mit dem RDS-Empfang mit diesem Chip?

Ja.
Ich benutze ihn zusammen mit einem LPC2103 und Empfang nebst RDS geht 
prächtig.

W.S.

von Heiko H. (Gast)


Lesenswert?

Hi Mark,

hier ist ein Dump von Register 2, 4 und 10:
     FEDCBA9876543210
02 : 0100000000000001

     FEDCBA9876543210
04 : 0001100000000000

     FEDCBA9876543210
10 : 0000000000100100


Marc H. schrieb:
> Register 2 Bit 15 für den RDS-Mode richtig gesetzt?
Wieso ist das bit PowerCFG.DSMUTE wichtig? Ist bei mir 0.

> Register 4 Bit 12 für RDS-Enabled gesetzt?
SYSCONFIG1.RDS = 1

> Register 4 Bit 11 auf DE?
SYSCONFIG1.DE = 1

> Register A Bit 15 richtig gesetzt?
STATUSRSSI.RDSR = 0 : Bleibt immer auf low.
Beim RDS-Lesen polle ich auf dem RDSR-Bit:

readRegisters();
if (si4703_registers[STATUSRSSI] & (1 << RDSR)) {...
Es geht jedoch niemals auf high!


> Register A Bit 11 richtig gesetzt?
STATUSRSSI.RDSS = 0 : Doch nur für Verbose Mode, oder?

> Register A Bit 10 und 9 richtig gesetzt?
Sind auf low.

von Markus W. (naggusm)


Lesenswert?

Hallo ich bins nochmal, der "egal"

Ich habe damals als Ausgangspunkt ne Arduino Library gehabt die 
eigentlich recht gut implementiert war, bis eben auf die blockierende 
RDS Funktion was müll war.

Ich habe die dann umgeschrieben:
1
void Si4703_Breakout::readRDS(char* buffer)
2
{ 
3
  
4
  readRegisters();
5
  byte blockerrors = (si4703_registers[STATUSRSSI] & 0x0600) >> 9;
6
  if (blockerrors!=0) return;
7
  if(si4703_registers[STATUSRSSI] & (1<<RDSR)){
8
    
9
         byte Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl;
10
          Ah = (si4703_registers[RDSA] & 0xFF00) >> 8;
11
          Al = (si4703_registers[RDSA] & 0x00FF);
12
13
          Bh = (si4703_registers[RDSB] & 0xFF00) >> 8;
14
          Bl = (si4703_registers[RDSB] & 0x00FF);
15
16
          Ch = (si4703_registers[RDSC] & 0xFF00) >> 8;
17
          Cl = (si4703_registers[RDSC] & 0x00FF);
18
19
          Dh = (si4703_registers[RDSD] & 0xFF00) >> 8;
20
          Dl = (si4703_registers[RDSD] & 0x00FF);
21
22
         
23
      //Gruppe 0
24
      if ( (Bh&0xF0)==0 && (Bl&0x10)==0) {
25
        unsigned int number = (Bl&0x03);
26
        
27
        if (number==0) {
28
          buffer[0]=Dh;
29
          buffer[1]=Dl;
30
          
31
        }
32
        if (number==1) {
33
          buffer[2]=Dh;
34
          buffer[3]=Dl;
35
        }
36
        if (number==2) {
37
          buffer[4]=Dh;
38
          buffer[5]=Dl;
39
        }
40
        if (number==3) {
41
          buffer[6]=Dh;
42
          buffer[7]=Dl;
43
        }
44
          
45
      }          
46
          
47
48
      delay(40); //Wait for the RDS bit to clear
49
  }
50
  else {
51
    delay(30); //From AN230, using the polling method 40ms should be sufficient amount of time between checks
52
  }
53
  
54
55
  buffer[8] = '\0';
56
}

Diese Funktion musst du in Dauerschleife aufrufen. Sie blockiert vor 
allem nicht mehr. Der übergebene Buffer füllt sich dann mit der Zeit 
nach und nach je nachdem wie die Pakete reinkommen.
Am besten du überprüfst ob sich in dem Char-Buffer irgendwas geändert 
hat und verbindest das dann mit einem Update auf dem Display.

: Bearbeitet durch User
von Heiko H. (Gast)


Lesenswert?

Hi Egal!
Jetzt funktioniert es!
Hauptsächlich lag es wohl an dem Schlechten Empfang. Es dauert etwas, 
bis die erste Gruppe abgefüllt ist, aber ich scanne jetzt im Hintergrund 
und der RDS-Text kommt nun nach und nach.
Vielen Dank für deine Code.

Heiko

von Blue P. (bluepixel)


Lesenswert?

Hallo Markus aka Egal,

Danke für deinen Code.
Ich habe den Code in meiner Arduino Si4703 Library in den .cpp und .h 
Dateien geändert. Den Char-Buffer lasse ich zum Testen in dem Serial 
Monitor ausgeben, nur dauert es ewig, bis irgendein Buchstabe oder eine 
Zahl kommt. Und die Buchstaben, die kommen sind auch nicht wirklich 
richtig. :/
Gibt es dafür eine Lösung?
Der Empfang ist bei mir zwar nicht der Beste, aber mit dem Originalen 
Code von Sparkfun hat es meistens auch geklappt.


BluePixel

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.