Si4703 Digital FM Radio Receiver

General Description

The Silicon Laboratories Si 4703 is an FM radio tuner. It uses speakers to play the radio, as well as the speaker cable to pick up the radio signal. It has the ability to process Radio Data Service, allowing for Station ID and song name to be read. The Si4703 is available as an evaluation board from Sparkfun.com and has been ported over to mbed. A 3.5 mm headphone jack plug on the evaluation board is used to interface with listening devices.

https://cdn.sparkfun.com//assets/parts/9/8/6/6/12938-01.jpg

Interfacing With mbed

To communicate the breakout board allows for I2C communication through SCLK and SDIO. Detailed information can be found on the datasheet and a schematic can be found here.

Sample Program

The following program uses the si 4703 to listen to the radio. It uses push buttons to change the channel and volume and displays both to the LCD screen.

Pin Hookups

mbed to Si4703

mbedSi4703
p28sda
p27scl
p26rst
&pcSerial

mbed to TextLCD

mbedTextLCD
p16rs
p15e
p14d4
p13d5
p12d6
p11d7

Video

Code

Source: https://developer.mbed.org/users/mzcs/code/Si4703/

Import programSi4703

Si4703 sample code ECE 4180 Georgia Tech

main.cpp

#include "mbed.h"
#include "SparkFun-Si4703.h"
#include "TextLCD.h"

Serial pc(USBTX, USBRX);
Si4703_Breakout radio(p28, p27, p26, &pc); // (sda, scl, rst, Serial)
DigitalIn chanUp(p17);
DigitalIn chanDown(p18);
DigitalIn volUp(p19);
DigitalIn volDown(p20);
TextLCD lcd(p16, p15, p14, p13, p12, p11); // rs, e, d4-d7



int main(int argc, char** argv) {
    
    int chan = 901;
    int vol = 9;
    radio.powerOn();
    radio.setVolume(vol); // range: 0-15
    radio.setChannel(chan); // 90.1 WABE  
    
    lcd.cls(); 
    lcd.printf("channel = '%d'", radio.getChannel());  
    lcd.printf(" volume = '%d'\n", radio.getVolume());  
    pc.printf("channel = '%d'", radio.getChannel());  
    pc.printf(" volume = '%d'\n", radio.getVolume());  
 
    
    while(1){
        if(chanUp) {
            chan++;
            radio.setChannel(chan);
            lcd.cls();
            lcd.printf("channel = '%d'", radio.getChannel());  
            lcd.printf(" volume = '%d'\n", radio.getVolume());  
            pc.printf("channel = '%d'", radio.getChannel());  
            pc.printf(" volume = '%d'\n", radio.getVolume());  
            wait(.25);
        }
                if(chanDown) {
            chan--;
            radio.setChannel(chan);
            lcd.cls();
            lcd.printf("channel = '%d'", radio.getChannel());  
            lcd.printf(" volume = '%d'\n", radio.getVolume());  
            pc.printf("channel = '%d'", radio.getChannel());  
            pc.printf(" volume = '%d'\n", radio.getVolume());  
            wait(.25);
        }
                if(volUp && vol <= 14) {
            vol++;
            radio.setVolume(vol);
            lcd.cls();
            lcd.printf("channel = '%d'", radio.getChannel());  
            lcd.printf(" volume = '%d'\n", radio.getVolume());  
            pc.printf("channel = '%d'", radio.getChannel());  
            pc.printf(" volume = '%d'\n", radio.getVolume());  
            wait(.25);
        }
                if(volUp && vol == 15) {
            lcd.cls();
            lcd.printf("channel = '%d'", radio.getChannel());  
            lcd.printf(" Max Volume\n", radio.getVolume()); 
            pc.printf("Max Volume\n");
            wait(.25);
        }
                if(volDown && vol >= 1) {
            vol--;
            radio.setVolume(vol);
            lcd.cls();
            lcd.printf("channel = '%d'", radio.getChannel());  
            lcd.printf(" volume = '%d'\n", radio.getVolume());  
            pc.printf("channel = '%d'", radio.getChannel());  
            pc.printf(" volume = '%d'\n", radio.getVolume());  
            wait(.25);
        }
                if(volDown && vol == 0) {
            lcd.cls();
            lcd.printf("channel = '%d'", radio.getChannel());  
            lcd.printf(" Min Volume\n", radio.getVolume());  
            pc.printf("Min Volume\n");
            wait(.25);
        }

    }
}


Please log in to post comments.