Si4737 I2C Arduino Radio Breakout

Hello
I have designed breakout board for Arduino Radio based on Si4737, it's similar to Si4735 breakout but improved and using I2C. I am sure it's 101% functional but I am having difficulty to get it running, I modified two Arduino libraries of Si4735 to be compatible with my breakout and even tried to write my own code without library to power up and tune to station but having exactly the same issue:
Radio power-up command works but it won't tune, status request from Si4737 is 0x80 (clear to send) and everything seems normal except it won't tune.
When I send power-up command I hear small pop in speakers and I can read 0x80, seek to station won't work or auto seek, and no sound. Please help to get it running I got 40 of them and can't make it work, spend days to figure out, I know it's something simple, just can't find it.

To the first person that helps me solve this I will mail one of my Radio breakout boards for free as a appreciation.
Actual circuit and board shown below





Board.png

OK,

so questions : sorry if this is spoon feeding, just trying to judge the level.

Are you familiar with Rf signal lay out and requirements ?
do you have a scope and a spectrum analiser,

do you have one of the evaluation boards
http://forum.arduino.cc/index.php?topic=169899.0

do you have AN332
http://www.silabs.com/Support%20Documents/TechnicalDocs/AN332.pdf

I am not a genius in RF signal requirements or magnetics, but I do know enough to make FSK data transmitters and receivers. Overall I am really good at hardware design, I designed and build 1GHz ARM Linux boards and everything works as expected. When I look at Sparkfun Si4735 radio shield I realize that they design board ignoring RF requirements, amperage, voltage, not calculating component values, making bad copy of a component datasheet circuit.

Does it really matter if I have oscilloscope or not? At a moment NO, but I do have professional testing and re-flow equipment. My old oscilloscope died recently and didn't had a spare money to get a good one, I do know what it is and how to use it.

No, I don't buy 100+ dollar development board because it's not worth it, it's cheaper to get PDF and make one yourself if I need.

Yes, I read AN332 and understand how to send and receive commands, I am not a great programmer but I can definitely make communication code with whatever I am interfacing with.

I need to understand why radio will respond to power-up command and I tried changing volume settings and it works, I checked by getting register status, but why on earth it won't tune? When I set frequency and read back current tuned frequency it responds with 0.

Is on-board antenna trace too small? Is radio not setting frequency that I specified if there is a poor signal? Anybody had any similar experience with Si47xx series of radio chips? It just drives me nuts.

Thanks

As I implied, sorry needed to know what level to start, If I'd started to talk VSWR to a student on their first project, it would not have helped.

Ok, so :

comms. If I rember, the chip has a revision register, does that read back just fine ?
the question about the scope is because spikes on the comms lines from the closely coupled radio can cause mayhem to comms, what seems to be working at the terminal just does not get to the chip corectly.

The question about the app note was simply , its amazing how many people dont use the app notes. Well done.

Re the eval board, you see my time is worth a few dollars per hour. So a hundred for a known working demo board on which i can dev the software is to me a good bet. allows us to dev the software before I get boards back. just a suggestion. The problem you now have is , is it thee software, the compiler, the connections, the board or the understanding of how the chip works.

If you had a known good to work from then things might be easier.

Well, you are right, but even if I had a functional example it would ran of different MCU and programming environment. I need to make it run of Arduino programming environment with any of Atmel MCU's and I know nothing is wrong electronically with the board itself. I tested board again by attaching long wire for FM antenna to get better signal reception and get the same result. I will try to read revision register to see what happens.

Maybe it doesn't work because I don't have an oscilloscope. :smiley:
I have to order one and see what happens.

Thank you for trying to help me.

Well, revision register reads just fine (C40), I can set volume and read it back, set mode to FM or AM and read it back. When reading current set frequency it reads 0 all the time. I tried different board and having the same issue.

Any suggestions?

Hi

Ok well, thats good, as you say, means the comms is working.
when you get the scope, I'd just probe the comms signals to prove they are well within spec,
but sounds good so far.

can I ask why are you concerned about the antenna ?

having multiple boards doing the same does imply as you say that the hardware is all the same.
which is also good,

do you have or can you get a known good set of register settings for a particular application ?

section 5.14 of the data sheet has various dia warnings about using the comms whilst tuning,
you really need a spec analyser to look at this and check what tollerance you have on this,

the Si4737 has gpo outputs , controled by the comms, can you toggle them and monitor just to check 120 % you have good comms, whilst waiting for your scope, you could use a led / fet / resistor on on of them.

can I also suggest that instead of seek, you try setting the chip for a set frequency for a station that you know you can receive in the lab. Its amazing what electrical noise there is in most labs. In my main lab, I can only receive one or two of the 10 fm stations, and none of the am ones. even the MSF clock signal is splattered over.

one other thing I have just noticed, if your using AM,
the default channel spacing for a seek is 10 Khz, here in Europe, the AM tx spacing is 9 Khz,

Reset

have you checked out the reset conditions of the Si4737 ?

you seem to have the rst pin pulled down to ground by a 2k resistor, and to a header by a 1k resistor.

If the header is open circuit , then reset is going to be low, i.e. Si4737 in reset condition.

if the header is high, say 3v3, then the reset pin of the Si4737 is going to be just over the 1 volt level, which is well below the 0.7 * Vcc that the chip needs to be guaranteed out of reset.

There is also some horrendous requirements in the data sheet about the reset timing you will need to adhere too.

good luck, let us know how its going

The LTC4313

Ive not used it, but I[ve used similar.

The Vcc pin (8 ) is tied to 3v3,

yet the scl and sda in can be pulled up to 3v3 or 5v, dependent upon J1 position.

if they are pulled up to 5v, then I think your goign to over volt the inputs,
normally the inputs are max 0.3 volts above Vcc,

so if you want to have a variable input voltage, you need to have the Vcc variable also,

Do you want to PM us for some other comments, I think the forum is going to get a little over loaded.

I did try both commands Seek up and tune and even took radio out of the lab to see if it would get reception but it still the same. I worried about antenna because in my lab cell phones don't get good reception.

LTC4313 I used before in other projects and calculated circuit very well. It can use higher voltage pullups only on that side (It's says so in datasheet). It's really good and works over 1MHz, but increases production cost.

About reset I know it does work was calculated by me. I used resistive divider because reset pin doesn't need high frequency operation and also to make circuit smaller. I doubt it will be little over 1v on reset, look at my calculation:

Vout=(R2/(R1+R2))*Vin at 5v this would be: (2000/(1000+2000)*5 = 3.33v

and at 3.3v this would be: (2000/(1000+2000)*3.3 = 2.2v

It's plenty for reset to work at 5v and 3.3v.

Reset conditions are met and working, if it didn't then power-up command would not work.

I think I figured out problem, tho not even sure what I supposed to do to fix it.

Datasheet says that crystal is optional, also it says that it got integrated crystal. Why does AN332 page 232 says that I need to provide RCLK before any command that enables the TX carrier, including tune commands? Does it mean that I have to provide clock anyway from different source? Why?

This gets really confusing, silicon labs usually really good at describing their products, but they don't have good description or example for running without crystal oscillator.

have u checked with meter / scope the reset voltage on the Si4737 ?

your right , the 2k r6 does go to gnd, so if u have 5v on the rst in pin , then it will work as u say. is the rst making 5 volts, and for the right timing.

I've just had a look at the data sheet, the ltc4313, do you have the -1,-2 or -3 version.
fig 5 shows your system, but its with the -1 part, but as u say the i2c seems to work,

data sheets are confusing, ah.
I'd go back to first comment, "whats the eval board and software do". use that as your first example to work off.

Out of datasheet:

The LTC4313-1
and LTC4313-2 support level translation between 3.3V and
5V busses. In addition to these voltages, the LTC4313-3
also supports level translation to 1.5V, 1.8V and 2.5V.

LTC4313-1 and
2.5mA current sources in the LTC4313-2. The LTC4313-3
does not have RTAs.

I use LTC4313-3.

I think all problem is in RCLK.

Solved the mystery!!!

Datasheet failed to mention that if you don't install optional crystal oscillator you still need to feed RCLK pin from external source in order to tune or auto-seek.

I soldered short wire to RCLK pin and programmed timer 3 on atmega1280p (my other custom Sound and internet radio player project board) to set frequency to 31250 Hz with this command:

pinMode(5, OUTPUT);
TCCR3B = TCCR3B & 0b11111000 | 0x01;

Then set reference clock to 31250 Hz:

write_reg_one(0x0201, 0x7A12);

Set reference clock divider to 1
write_reg_one(0x0202, 0x1001);

Then I gave this command before 10 milliseconds before tune command:

analogWrite(5, 128);
delay(10);
write_reg(0x20, 0x00, 0x26, 0xDE, 0x00);

after Seek or Tune command complete I can shutdown to reduce noise like this:

analogWrite(5, 0);

Works like a charm.

well found
well done,

Alex_K:
Solved the mystery!!!

Datasheet failed to mention that if you don't install optional crystal oscillator you still need to feed RCLK pin from external source in order to tune or auto-seek.

Actually, what the datasheet says, is..

https://www.silabs.com/Support%20Documents/TechnicalDocs/Si4736-37-38-39-C40.pdf

page 24, left column section 5.14:

(they forgot the word "not" in the first sentence of the second paragraph), but more importantly, "This mode is enabled using the POWER_UP command". You need to TELL it to use the onboard oscillator.

However, there is a reason why they have an option for external oscillator, which is that SDIO activity can cause the onboard oscillator to jitter.

You will see the POWER_UP command described on page 12 of http://www.silabs.com/Support%20Documents/TechnicalDocs/AN332.pdf

Actually, the POWER_UP command for FM Receive is described on page 64. Page 12 is the POWER_UP command for FM Transmit. They are subtly different.

There is a huge number of different SI47xx chips, but they are all just different combinations of a set of a few, basic capabilities. The SI4737, in this case, has AM/FM/WB Receive and RDS, but no FM Transmit (and I don't think any chips in the line do AM or WB trasmit).

So, when page 12 says to set the POWER_UP command's second argument to 0x50 for Analog audio inputs, note that it says inputs, not outputs. Calling the command in this way with the SI4737 will set the ERR bit in the STATUS byte of the response.

As I found out after struggling with it for the last three days.

On page 64, you'll see that FM Receive's POWER_UP command's second argument should be set to 0x05 for Analog audio output.

Now, if I could just figure out why mine won't tune, I'd be set.

Still slightly confused. I get that Alex_K succeeded because he created a clock and hooked it up to RCLK. I ran with the same logic as doitright and configured it to use the internal clock, but it won't tune or give me any feedback. I get CTS set high and then nothing changes when I do get_int_status or fm_tune_status. Do I need to wire something to RCLK or just leave it floating?

Did seanmcbeth progress since Sept?

  • daniel