Hi all,
First off, these questions are for an "RDS expert".
I don't need a link to a Google search for "RDS". Been there, done that already.
Does anyone know of RDS (Radio Data System) decoder code to extract type 2A and 2B (radiotext) data from the RDS data words?
I have found lots of code written in C and Java and tried to port the code to the Arduino. In all cases, I can't get it to work reliably.
First of all, the specs say that Block B, bit 5 (text A/B flag) will change from a 1 to 0 or 0 to 1 to indicate when the RDS display (like an LCD) should be cleared. Yet, it seems all the stations here set the bit to 1 and never change it.
Secondly, the specs say that a text block is complete when text segment zero is sent. So I read all the registers, if it's text (group 2A or 2B), put the appropriate data into the appropriate places in the buffer (specified by text segment). When I detect text segment zero a SECOND time, the loop breaks. This (supposedly) insures that I've gotten at least one loop through all the text data being sent.
Also, despite the decoder chip (Silicon Labs Si4703) supposedly setting the RDSR (rds data ready) bit only when VALID corrected data has been received, errors (gibberish in the text) still appear on the display.
Various permutations of the code attempts all seem to produce the same (sub-desirable) results. My code works, but it displays gibberish text 25% of the time, and it's slow (takes several seconds to acquire text and display it).
I know that the RIGHT code will work (that is, quickly produce a text result and without any errors) because cheap radios and car radios display RDS radiotext from local stations flawlessly.
I've got the documentation for the standard, I've tried several different methods of decoding the text, I (think) I understand quite clearly how it works, yet I can't seem to make it work properly.
My only hunch so far is that maybe sending the commands to the chip in itself corrupts the text data, because I can hear a faint "burst" of a hissing sound each time chip I/O is performed. I tried bypassing the VCC and GROUND pins of the FM radio board with a 0.1uF ceramic cap, I tried to "smooth the edges" of the digital data going to the chip by inserting 1K resistors in series with each data, clock and chip select pin. Nothing works.
Anyone have any ideas?
For anyone who wants to know "what did I do so far?", I did this (pseudo code):
while (1) {
while rds not available {
read chip
}
get group type
if grouptype == 2 {
get text segment
read RDSC into buffer [segment + offset] // if group type A
read RDSD into buffer [segment + offset] // group A or B
if textsegment == 0 (twice) {
break // all done, got text data in buffer
}
}
}
Thanks!
-- Roger