Why the Sparkfun Si4735 radio shield is all wrong

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: Skyworks | Product Specification

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) ?

+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.

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.

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

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!

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.

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

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.

Can you post the schematic of your breakout board

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);
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.

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.

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).

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.

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?

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.

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.

Well Alex, the subject of antenna matching is complex. Since your timetable is so short, perhaps its best for you to put just the required blocking capacitor and mandatory protection clipping diodes at the chip to a pin right there with a valid RF ground directly as a pair of 0.1 header pins near the IC for various antenna matching modules. Also, in addition I would recommend you provide a few pins to this proposed RF input sub board for later versions to include power and power ground along with a pair of pins that are SPI or I2C lines desired to to talk to this front end, so perhaps we can build on this and provide switching to multiple antennas or tuning a band pass filter along with the station selected using this piggy back antenna interface module. Skip holes for .3 pins before continuing along on the header for these utility pins, to give the needed space for the isolated two RF input pins providing the ant in and RF ground in addition to power ground on utility pins mentioned above.
The chip's line output is not a good headphone driver by any means. This subject could take many pages alone, but AC coupling a 32 ohm headphone with only 2.2 uF will roll off the low frequencies drastically. I think you mean 2.2 microfards, which is written as 2.2 µF, or sometimes 2.2 uF, because a 2.2 mF (millifard) capacitor might well be the size of a beer keg.
In order to have good bass response, you need a minimum of 470 uF which gives a -3 dB frequency of 10 Hz into 32 ohms; one octave below 20 Hz. Be aware most electrolydic capacitors do not sound good. Avoid them unless they are bipolar and made specifically for audio and use at least 1 uF of good film cap across them to help with high frequency distortion inherent in electolydics.
It is much preferred to use a bipolar power supply and DC couple headphones using a chip designed to drive this low Z- I'll post the part number for you- pinout is standard 8 pin opamp- use standard dual opamp dip 8 part in Eagle to layout. Please do not drive headphones with the Si chip directly. Also this allows you to put in a high impedance volume control in front of the headphone driver chip, either a regular log pot or digital volume control IC as the pot.
Also there are some details of headphone interface that will take too much space right here- no the ferite is unneeded, but an output isolation choke swamped with a resistor is nice for driving headphones as it isolates the FB loop from the low Z load at ultrasonic frequencies, but that's a whole subject alone. I use Eagle and will help you detail this. But my time is limited this next few weeks.You can never have enough time or RF ground vias...

Thank you for your response BillSacks.

I want to keep this board simple and cost efficient so I can sell it cheaper, but at a same time and don't want people to have any problems with it. I do have a question about ac coupling capacitors on analog audio output, I do know if I use low value it will filter low frequency's. Also I read all documentation on Si4737 and to get as familiar with this chip as possible. Question is why they recommend to install 0.39 uf capacitors on analog audio output instead of higher values? It's here on page 15:

I used 2.2 uf ceramic capacitors to be as small as possible and to filter out less of low frequency's, also because most of headphone amps (for example Texas Instruments) recommend to use 2.2 uf as ac coupling on their products.

Also why silicon labs recommends to put 0 ohm resistor (link) before FM antenna?

I do already have completed schematic, but still improving things. Maybe I will post it here so you can maybe suggest improvements or find mistakes if any. I do take my time to carefully check my schematics for mistakes.

Hi Alex; The Si app note is showing it as meant to be connected to a higher impedance than your headphones (which are defined as 32 ohms standard now). In order to get the same 10 Hz -3 dB point, the impedance of the (inferred) input it drives must be over 40 k ohms; you need to drive 32 ohms, and therefor, the capacitor required is 470 uF. There must be a volume control, or users can be harmed by it being too loud. The output of that chip is not likely designed to drive 32 ohm loads, and that should be evident by the 0,39 uF output capacitors which indicate a load of > 40 k being driven.
I'll help you get a headphone amp on this board if you wish, or show you how to produce a line level output for driving an outboard powered speaker or headphone amp. Include just the schematic of a proper headphone amp if the board size will not allow it.
Never ever use a ceramic capacitor to couple audio by the way, they introduce distortion and just plain sound really bad. Use films for up to 1 uF or so and bipolar elecrolydics specifically designed for audio coupling for higher values. Use Nichicon ES Audio rated bipolars and you cant go wrong- http://www.mouser.com/ds/2/293/e-es-3258.pdf
I strongly recommend a volume control into a proper headphone amplifier such as an SSM 2135 (best choice for you).
The zero ohm is just a jumper to allow flexibility. If you just put the pins as I suggested, no jumper is needed. No app note with a short antenna will apply unless you can tune the values with RF gear. If the user just puts a one meter wire to the input at the pins, the FM performance will be better than any small ant on the board- they are useless for this frequency; that's why there are not FM radios inside cell phones. FM needs a longer antenna than can be put on a little PCB
AM is another story, with an air core tuned loop being the best option, so leave that totally open with just a connection and allow people to make proper antenna or 75 ohm cable input interfaces to it.

Hello, I just want to post an update on the radio breakout board.

Board will consist of two half's, first is a main radio board, and second half is a customizable sub-board.

Main board is set to I2C mode and got a jumper for setting one of two I2C addresses, also it got built in logic level shifter for SDA, SCL, Reset, and Interrupt capable of speeds up to 400kHz selectable by jumper for 5v and 3.3v operation.Combination of 32.768 kHz crystal and inverting logic making a single pin clock generator to provide clock for CLK pin, making clock more stable and digital audio output usable. Voltage regulator to provide clean 3.3v power to the logic as well as sub-board.

Sub-board is like a plug-in shield for main board that is fully customizable for your needs, it got antenna inputs, optional FM trace, optional digital audio output, optional analog outputs, and optional headphone amp.
Headphone amp got Panasonic low ESR film decoupling capacitors on input, preset gain (volume control is inside Si4737 for I2C control), and MAXIM Integrated capacitor-less audio output architecture to keep board small size.

I am delaying for a week (in 3 weeks) release date because I am also designing other small boards for Arduino and want to put them all on the same panel.

Board will be compatible with Si4735 Arduino library with following simple modification to it:

  1. Use external clock source
  2. Set to I2C mode
  3. Interrupt pin is inverted (change interrupt trigger state)

Let me know what you people think about this Si4737 Radio Breakout (more like a shield).

Sorry for not updating status on Si4737 Radio Module, I was really busy with other things. Board was made and works flawless. Didn’t had time to write code for it, so I modified some things in sparkfun SI4735 library to make it compatible, it does need some work to make easy use of weather band. Board have all the features described in previous post. Beats hell out of sparkfun version. Here’s some pictures of the final product: