Lior Elazary KK6BWA

...because this life is yours. Some of it was given to you, the rest you make yourself.

  • Increase font size
  • Default font size
  • Decrease font size
Home Ham Baofeng Radios Hacking the Baofeng UV5R - interfacing with the RDA5802

Hacking the Baofeng UV5R - interfacing with the RDA5802

E-mail Print PDF
Article Index
Hacking the Baofeng UV5R
Opening The Radio
Hacking the Radio
Interfacing with the voice chip
interfacing with the RDA5802
Interfacing with the RDA1846
Removing the MCU
All Pages

Interfacing with the RDA5802

I was also able to interface with the  RDA5802 chip (the FM radio receiver).

The interface is I2C, and I was able to hook up an Arduino directly. Even though the chip is 3.3, you can hook it up with two 4.7K resistors tied to the 3.3 per I2CBi-directionalLevelShifter

However, the RDA5802 datasheet does not seem to have the registers that the radio is setting. I was able to capture the basic data that the uv5r is sending and play them back.

Here is the protocol (number are in hexadicimal).
When the radio boots up it sends: i2Start 0x10 w 0xD2 0x00 STOP  i2cStart 0x10 w 0xD2 0x00 0x3D 0xD8 STOP
When the radio switches to radio FM mode is sends: i2Start 0x10 w 0x90 0x3 0x00 0x18 STOP  i2cStart 0x10 w 0xD0 0x01 0x2A 0x18 STOP
Changing the channel the radio sends: i2cStart 0x10 w 0xD0 0x01 0x27 0x98 stop //for 91.8FM
So the channels seem to be
91.7FM is 0x2758
91.8FM is 0x2798
91.9FM is 0x27D8
However, when I tuned to some channel (I dont remember which freq it was) 0x28D4 a station comes in clear, when the freq is set to 0x28D5 all you hear is static, and the same for 0x28D6 and 0x28D7. However, when the freq is set to 0x28D8 the same station comes in clear. Stepping through the numbers the same channel will come in clear but the distance between the numbers grows larger and other channels are coming in between these numbers. So it looks like the stations are interleaved with one another. Any ideas why this is so? I think it might be harmonics.
I placed a youtube video showing the results.


Here is the arduino code I was using to step though the channels
#include <Wire.h>
//  Arduino analog input 5 - I2C SCL
//  Arduino analog input 4 - I2C SDA
#define ADDRESS B0010000
void setup() {
 // ...
int ch = 0x2718; //Start at a good channel
void loop()
 if (Serial.available() > 0) {
 int in =;
 int mute = 0;
 switch (in)
 case 113:   ch++;   break;  //q
 case 97:     ch--;    break;  //a
 case 'm':     mute=1;   break;
 Serial.print("Channel: ");
 unsigned char chu = (ch >> 8) & 0xFF;
 unsigned char chl = ch&0xFF;
 Serial.println(ch, HEX);
 if (!mute)
 } else {

Last Updated on Friday, 08 March 2013 20:01