RDA5807M module wrong frequancy

Hi there,
I've been using this module for some time now and had no issue.
But recently it started giving me an issue where is does not tune to a correct frequency.
I do my testing using a RSSI strong station (106.5Mhz), At times it tunes to 106.5 but I can here only the white noise. Now it only tunes to 189.30 and here no white noise. I tried another same module. Same result.

The libraries I'm using are below;
radio.cpp (6.9 KB)
radio.h (3.6 KB)

My test code;

#include <Wire.h>
#include "radio.h";

Radio radio;

void setup() {
  Serial.begin(9600);
  
	if (!radio.init()) {
		Serial.println("Radio error!    ");
		while(true);
	}

	radio.tuneTo(106.5);
	radio.setVolume(10);
	radio.setBassBoost(true);
	radio.setMute(false);
}

void loop() {
  radio.updateStatus();
  Serial.println(radio.state.frequency);
  delay(10);
}

Schematic;

Why do you use level shifters.
If you disable internal pull up to 5volt in software, then you don't need them.

Did you check if the module has pull up to 3.3volt?

I don't see you using other FM frequencies,
so why update/print radio status 100 times a second.
Shouldn't you do that only once, by moving those commands to setup() (empty loop).
Leo..

Thanks for your reply.

Arduino Pro Mini is a 5v and Radio module 3.3v.

Yes I see 3.3v in both I2C lines.

Done that already. Same outcome.

You are correct. Done that already. Same outcome.

I know that, and I gave you a solution without having to use level shifters.
I2C is open collector/drain, and logic voltage depends on where you connect the pull up to.
If you disable internal pull up, there is no 5volt pull up on an Uno/ProMini.
Google something like "Arduino disable internal pull up".
This has of course nothing to do with your problem.
Did you try code from other sites.
Did the library come with examples.
Leo..

1 Like

Sorry I'm still learning things.

So is this mean that if I'm to use pull-up resistors in both sides (3.3v and 5v sides) of the I2C line, I should only consider a level shifting and or else disable Atmel328p input pull-ups of I2C lines and use without pull-up resistors and level shifters?

Is my understanding correct?

Correct.

1 Like

Thanks.
Few questions,

  1. Are the pull-up resistors enabled by default for I2C ports of Atmel328p?
  2. As a best design practice, should I use pull-up resistors with a level shifting?

Did you Google it?
The Wire.h library enables software pull up by default.
You can modify that core library, or disable pull up in radio.cpp, right after Wire.begin.

digitalWrite(A4, LOW);
digitalWrite(A5, LOW);

That said, internal pull up is weak and might not do any harm if you leave it enabled.

Level shifters are needed if you have mixed logic on the I2C bus, but you have only one device.
Leo..

1 Like