Reverse Engineering RRD-102 V2.0 FM Radio Module With RDS decoding capability
posts reverse engineeringTo solve the issue of not knowing what song was playing over the radio, I am looking to create an FM display that shows a log of the (Radio Data System) RDS signal that is included in all broadcast FM stations (Incidentally short news, song title, station names, can be found via RDS). Looking at ebay for a cheap radio module, I came across this radio module ( PCB model RRD-102 V2.0) that breaks out the relevant pins of the RDA5807M Broadcast FM radio tuner IC. I chose this chip because it has RDS decoding capability baked into the device itself already (greatly reducing the amount of work needed to decode the RDS signal).
Unfortunately like many things in life, you do get what you pay for. This module did not come with any documentations (unlike the TEAxxx module which cost a bit more, but have bigger community support around it). At the very least, the datasheet for this device can be found (you can contact me for it, or check if I included it in this page), which shows the pinout of the actual chip itself.
Using the pinouts from the datasheet, I was able to trace out which wires goes where, and below you can see the resulting pinout for this module. I am also able to confirm that the I2C pins labels are correct, as I am able to interface with it via the BUS_PIRATE electronic tool.
If you are looking for the pinout, you can find it here below. Do note that SDIO==SDA and SCLK==SCK (since they are both I2C pins). Also make sure to place a pull up resistor for each I2C pins. Lastly note that this is a 3.0V device (so 3.3V VCC input will work well, but a 5V input will kill it)
Next step now, is to communicate with the module, but that is a story for another time.
Please comment below or email me if you found this useful!
note: N/C ~= Unconnected Pins
{FRONT}
-------------------------------------
| |
| |
1)-SDIO FM-Aerial-(10
| | | | | | |
| ----------------- |
2)-SCLK | | N/C-(9
| | RDA5807M | |
| | Broadcast | |
3)-N/C | FM Tuner | ROUT-(8
| ----------------- |
| | | | | | |
4)-N/C LOUT-(7
| |
| --------------------- |
5)-VCC | 32.768Mhz Crystal | GND-(6
| --------------------- |
| |
-------------------------------------
{BACK}
-------------------------------------
| |
| |
) (
| RRD-102 |
| |
) (
| Ver: 2.01 |
| |
) (
| |
| |
) (
| |
| --------------------- |
) | 32.768Mhz Crystal | (
| --------------------- |
| |
-------------------------------------
Bus Pirate Log
?
General Protocol interaction
---------------------------------------------------------------------------
? This help (0) List current macros
=X/|X Converts X/reverse X (x) Macro x
~ Selftest [ Start
# Reset the BP ] Stop
$ Jump to bootloader { Start with read
&/% Delay 1 us/ms } Stop
a/A/@ AUXPIN (low/HI/READ) "abc" Send string
b Set baudrate 123
c/C AUX assignment (aux/CS) 0x123
d/D Measure ADC (once/CONT.) 0b110 Send value
f Measure frequency r Read
g/S Generate PWM/Servo / CLK hi
h Commandhistory \ CLK lo
i Versioninfo/statusinfo ^ CLK tick
l/L Bitorder (msb/LSB) - DAT hi
m Change mode _ DAT lo
o Set output type . DAT read
p/P Pullup resistors (off/ON) ! Bit read
s Script engine : Repeat e.g. r:10
v Show volts/states ; Bits to read/write e.g. 0x55;2
w/W PSU (off/ON) <x>/<x= >/<0> Usermacro x/assign x/list all
HiZ>P
Command not used in this mode
HiZ>m4
Set speed:
1. ~5KHz
2. ~50KHz
3. ~100KHz
4. ~400KHz
(1)>1
Ready
I2C>0
WRITE: 0x00 ACK
(1)>3
Display format set
I2C>(1)
Searching I2C address space. Found devices at:
Warning: *Short or no pull-up
I2C>P
Pull-up resistors ON
Warning: no voltage on Vpullup pin
I2C>(1)
Searching I2C address space. Found devices at:
Warning: *Short or no pull-up
I2C>P
Pull-up resistors ON
Warning: no voltage on Vpullup pin
I2C>v
Pinstates:
1.(BR) 2.(RD) 3.(OR) 4.(YW) 5.(GN) 6.(BL) 7.(PU) 8.(GR) 9.(WT) 0.(Blk)
GND 3.3V 5.0V ADC VPU AUX SCL SDA - -
P P P I I I I I I I
GND 0.00V 0.00V 0.00V 0.00V L L L L L
I2C>P
Pull-up resistors ON
Warning: no voltage on Vpullup pin
I2C>?
General Protocol interaction
---------------------------------------------------------------------------
? This help (0) List current macros
=X/|X Converts X/reverse X (x) Macro x
~ Selftest [ Start
# Reset the BP ] Stop
$ Jump to bootloader { Start with read
&/% Delay 1 us/ms } Stop
a/A/@ AUXPIN (low/HI/READ) "abc" Send string
b Set baudrate 123
c/C AUX assignment (aux/CS) 0x123
d/D Measure ADC (once/CONT.) 0b110 Send value
f Measure frequency r Read
g/S Generate PWM/Servo / CLK hi
h Commandhistory \ CLK lo
i Versioninfo/statusinfo ^ CLK tick
l/L Bitorder (msb/LSB) - DAT hi
m Change mode _ DAT lo
o Set output type . DAT read
p/P Pullup resistors (off/ON) ! Bit read
s Script engine : Repeat e.g. r:10
v Show volts/states ; Bits to read/write e.g. 0x55;2
w/W PSU (off/ON) <x>/<x= >/<0> Usermacro x/assign x/list all
I2C>W
POWER SUPPLIES ON
I2C>v
Pinstates:
1.(BR) 2.(RD) 3.(OR) 4.(YW) 5.(GN) 6.(BL) 7.(PU) 8.(GR) 9.(WT) 0.(Blk)
GND 3.3V 5.0V ADC VPU AUX SCL SDA - -
P P P I I I I I I I
GND 3.24V 4.80V 0.00V 3.22V L H H H H
I2C>v
Pinstates:
1.(BR) 2.(RD) 3.(OR) 4.(YW) 5.(GN) 6.(BL) 7.(PU) 8.(GR) 9.(WT) 0.(Blk)
GND 3.3V 5.0V ADC VPU AUX SCL SDA - -
P P P I I I I I I I
GND 3.29V 4.80V 0.00V 3.31V L H H H H
I2C>(1)
Searching I2C address space. Found devices at:
0b00100000(0b00010000 W) 0b00100001(0b00010000 R) 0b00100010(0b00010001 W) 0b00100011(0b00010001 R) 0b11000000(0b01100000 W) 0b11000001(0b01100000 R)
Extra Resources
Since we got the pinouts, we could perhaps use these ready made libs etc...
- https://github.com/Seeed-Studio/I2C_FM_Receiver
- https://github.com/mathertel/Radio - An Arduino library to control radio chips like SI4703, RDA5807M (With RDS parsers included)