Pages: [1] 2   Go Down
Author Topic: Why the Sparkfun Si4735 radio shield is all wrong  (Read 10555 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Edison Member
*
Karma: 9
Posts: 1016
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

This is about the Sparkfun "SI4735 AM & FM Receiver Shield" is a FM(RDS/RBDS)/AM/SW/LW radio with the Si4735 chip.
UPDATE: Sparkfun no longer sells that shield. This post is here for reference only.

Si4735 chip: http://www.silabs.com/products/audiovideo/amfmreceivers/Pages/Si473435.aspx

This shield has known problems. But they could not explain why my reception was so poor. Most FM radio broadcast antennas are 40km away from where I live, and the shield performed less than other radios.
I had better FM reception if I connected the antenna to a certain ground point on the board. So I looked into the design of the board and found why the reception was so poor.

Known problems
  • The Si4735 has internal pull-up and pull-down resistors to make it start in I2C mode. The Sparkfun shield uses SPI mode. Because of that seven pins are needed, instead of 2 or 3 (I2C + INT). The newest version of this chip doesn't even have the SPI mode anymore.
  • Reading data from the GP01 pin is a problem for 5V Arduino boards. This can be solved by a diode from D12 to GP01. Also the software has to be changed to set the internal pullup resistor and the SPI interface has to be set to a low clock frequency to make it work.
  • The audio outputs LOUT and ROUT go to the connector without capacitor. Since they have a DC component, it could be a problem for some amplifiers.
  • The AREF is shortcut to ground, making all analog inputs on the Arduino board invalid.

Other problems
  • The FM circuit on the Sparkfun board is copied from the design guide AN383 (Rev 0.6, page 46). However that circuit is for a whip antenna with known parameters. The values for the components has to be calculated. The circuit could have a peak for the FM radio signals and a low-pass filter should not block the maximum SW frequency. Sparkfun simply copied the example values of the components, and didn't read the text with that schematic. This is a bad mistake. The signal gets lost with many sorts of antennas, and with a cable signal.
  • The FM circuit was even badly copied. The switch in the example shortcuts the 33pF if the ferrite antenne is used. The Sparkfun shield does not. Also the ESD diodes are omitted. For a well designed radio the ESD diodes must be added.
  • I can see only a few vias on the board that connects the ground planes on both sides. For a radio it must have many more.  The biggest problem is near the RFGND pin. The components (for example the crystal with the two capacitors) should be placed differently for better radio ground paths.
  • The 74HC4050 (signal level shifter) has an open input. One port is not used and the input should be tied to ground or Vcc.
  • The power for the Si4735 chip (Vio and Vdd) is an output pin of the 74HC4050. A capacitor of 10uF is used for decoupling. It is not a good design to have an digital output charge a capacitor of 10uF. Also a ceramic capacitor is missing. A capacitor of at least 22nF is recommended.
  • The 74HC4050 itself is not decoupled.
  • The 74HC4050D absolute maximum output current is 25mA. Charging the capacitor of 10uF is therefor a very bad idea. The Si4735 could require 23mA plus the current of output pins (I measured 19.3mA at 3.3V). So the output current is even not enough without the capacitor. Because of this, the Si4735 is running at 2.3V instead of 3.3V. This is the main reason that the GP01 pin can not be read by the Arduino without modification. The Vdd should be at least 2.7V, so the Si4735 is not even running at a minimum required voltage. This causes for example a bad RDS detection. This is a major mistake.
  • The digital audio output can not be used. It would be simple to have breakout pins for the digital audio.
  • Metal shielding could improve the FM radio. For example a metal shield over the radio parts, and the possibility to connect a shielded cable.

There are also problems with the software. At Arduino we have the Playground section and the forum. That way a single place for the newest software could be created. The software for the Si4735 has a few versions, each with different improvements.

A good project with the Si4735 is this one: https://umdrive.memphis.edu/tcanaday/www/Projects/Si4735_Radio/si4735.html But it lacks protection diodes and can't select ferrite antennas for AM and LW.

Question: Could I use reed relays to switch two ferrite antennas (AM and LW) ?
« Last Edit: May 17, 2013, 03:30:41 am by Krodal » Logged

São Paulo/SP/Brazil
Offline Offline
Sr. Member
****
Karma: 2
Posts: 305
Brazilian Arduino Team
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

+1... it's a shame sparkfun selling this shield as it is.

look, is all open-source. what do you think in developing our own si4735 board?

I'm not good at all designing PCB but I can help with the schematic. we can use itead studio and open source the pcb so anyone can buy.

a good start is AN383 of silabs that has some tips on design and a proposed schematic. another thing is to make a BOM on digikey and mouser to anyone can buy and solder by yourself.

I suggest using big SMD components to easy soldering.
Logged

Offline Offline
Edison Member
*
Karma: 9
Posts: 1016
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I don't know if I can make a good RF board.
If perhaps 5 people will use it, it is not worth it.

The breakout board (not the shield) of the SI4735 is good for making your own design.
The link in my first post is to someone who used the breakout board.

But the SI4735 still lacks SSB for the shortwave. And it can't receive the CB band (27Mc).

I bought a used radio with SSB and and was going to connect the buttons to an Arduino. But to do that I would have to take the radio completely apart and it still looked as if it was new. So I don't have an Arduino controlled radio at the moment.
Logged

São Paulo/SP/Brazil
Offline Offline
Sr. Member
****
Karma: 2
Posts: 305
Brazilian Arduino Team
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

The problem is sparkfun that is not selling breakout anymore. I'll have to buy an "adapter board" and solder by myself.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello Krodal and Wagner,

I'm actually trying to design my own schematic to use with the Si4735.  I'm trying to construct a single station radio using the Si4735 chip with an Atmega328 and an Analog Devices ssm2305 class d amp. The goal is to have a compact radio that can be tuned once in the coding and powers on to a specific FM station. Basically this project is coming from having used the Si4735 shield that Sparkfun was selling in this manner, but now trying to pair it down with fewer components.  I thought this would be a good place to post a picture of my current schematic for some feedback since you guys have a lot to say on the topic. 
Any comments on the design would be great! 
Thanks!


* SingleStationRadio.png (44.96 KB, 1572x1145 - viewed 355 times.)
Logged

Offline Offline
Edison Member
*
Karma: 9
Posts: 1016
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Did you read the document about the antenna circuit.
The 180nH and the 18pF are for a 'tuned' antenna circuit.
It could increase the sensitivity, but if there is a mismatch, the reception gets worse.

I would like to see protection diodes for the antenna input.

Why is the green led on the SCK pin ?
You have so many unused pins, you might as well use another.

I think that sometimes a diode is used at the reset circuit. Parallel to R1. See the schematic of the Arduino Uno.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello, I recently made radio breakout board based on si4737. It's I2C, 3.3v and 5v compatible (jumper select), it got i2c level shifter, buffer, and automatic stuck bus repair, also decoupling capacitors, power filtration and other things.
I have modified 2 arduino si4737 libraries to work with it but had not much luck, so I wrote code myself to get make it power up and set radio frequency to station but I am experiencing exactly the same issue: radio won't tune to station. I am 101% sure that circuit is perfectly functional, I even tried with Due and Mega.
When radio powers up I hear small pop in speakers, status request responded with 0x80 (clear to send), when I try to tune to specific station or seek up it just won't do it. Doesn't matter if I use library or my own code. I got 40 radio boards and all of them behave the same, sure that I am missing something in the code but can't figure out what. I am not really good at programming but I programmed I2C devices that didn't have library for Arduino before and never had a problem that I can't solve.  smiley-confuse

Please help solve this issue I will supply, schematic and all necessary information that you need.
Some info to start:
- Board doesn't have optional crystal oscillator because it's doesn't give any advantage, and occupies digital out pin.
- SEN pin is routed to pin header to select one of two I2C addresses.
- Short FM antenna trace is onboard (optionally can solder wire to it)

First person that solves problem will get my radio breakout mailed to you for free.

Logged

US
Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Can you post the schematic of your breakout board
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 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:

analogWrite(5, 0);

Works like a charm.
« Last Edit: June 05, 2013, 10:44:50 pm by Alex_K » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Greetings. I am a broadcast (and audio) engineer and may be able to help with questions concerning RF layout and design for the antenna input.
I know RF design well, but have never written a line of code in my 40 year career, so I hope you people can help me with that. I specifically am trying to learn the Arduino IDE to be able to use the Silicon Labs radio chips. When used with a decent RF input interface, these SRD chips are amazingly good radios.
To answer one question regarding switching ferrite loop antennas; reed relays are a great choice for low level RF switching. Most all of the purely electronic, non-relay, means of RF switching have issues with dynamic range and are not good design choices for one new to the art of RF design.
A pet project for me would be to get the Opus encoding codec onto a companion chip to encode compressed audio streams to play on a web page. Mp3 is plain nasty to trained ears and is wholly unacceptable for music, esp at 64 kbs, where AAC-HE and Opus rule. Opus is not as good as AAC, but beats the hell out of mPig3, and is open source.
AAC-HE is costly and unavailable to hobbits like us, but works better by far for music at 64 kbs than any other lossy codec.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi BillSacks.
What would you recommend for FM and AM antenna. I am redesigning my radio breakout board and I will manufacture them soon. They will be available on ebay as "Si4737 Radio Breakout" in approximately one month and will work with Arduino programming environment. I am using short pcb trace for FM antenna with optional solder point to attach a wire or antenna. For AM it got just a connections to solder Ferrite or Loop antenna.

Also radio analog audio output got decoupling capacitors of 2.2mf value, and they give really good result. Radio now able to directly drive small headphones or earbuds and it's easier to connect it to an amp.
Would you recommend different values or some type of ferrite bead to make audio sound crystal clear?

I want to know what you think and hear your advice.

Also if anybody reading this post is interested in this radio breakout and have any suggestions, now is a perfect time to tell me, I will accept suggestions for up to 2 weeks from today's date (June 7).
Logged

Offline Offline
Edison Member
*
Karma: 9
Posts: 1016
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I would like to tune to LW, AM, FM, SW from the Arduino.
So I want to be able to switch the antenna for FM and SW, and also switch between a AM ferrite and LW ferrite antenna. At least I want to be able to add that myself.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi Krodal.

What do you think about solder points (surface or Thru-hole) for antennas, female pinheaders, or both. do you whant to be able to disconnect short on board trace for FM antenna? Maybe install in between onboard FM antenna trace a 0 ohm smd resistor?

Also most important It will be I2C (2-wire) interface running at up to 400 KHz, I can make I2C go up to 1MHz but would cost additional $3 more in parts. Do you think slower communication but cheaper or faster but slightly more expensive?
Logged

Offline Offline
Edison Member
*
Karma: 9
Posts: 1016
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Surface solder points and surface scratchable/breakable traces are okay for me.

What about solder points for a single row header for an add-on board ?
The same way a shield is connected to an Arduino board.

The default Arduino 100kHz I2C bus is good enough. You are not going to stream audio via the I2C. Selecting a radio station is only done once, and reading RSSI a few times a second is all that is needed.

Are you going to use that tuned-antenna circuit (with the 18pF and 180nH) ? I hope not. I would like 100pF to the FM input with protection diodes, and perhaps an inductor 1u ... 4u7 as a filter for the SW.

I see many designs without a capacitor on the FM antenna, but I break too many FM modules by accidently touching the antenna with a DC voltage.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Just want to make it clear, Si4737 that being used in design got small difference between Si4735.

It doesn't have or support SW/LW Receiver, instead it got WB Receiver. Everything else is the same.

For the question if I will use tuned-antenna circuit, answer is no. I want to make it so people can install what they want there. Version 1 (previous design) just got PCB antenna trace and optional solder point for FM. AM got input capacitor built in so anybody can connect AM loop or ferrite antenna directly to it.




Logged

Pages: [1] 2   Go Up
Jump to: