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
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.
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.
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?
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.
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.