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.
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
mbed | Si4703 |
p28 | sda |
p27 | scl |
p26 | rst |
&pc | Serial |
mbed to TextLCD
mbed | TextLCD |
p16 | rs |
p15 | e |
p14 | d4 |
p13 | d5 |
p12 | d6 |
p11 | d7 |
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.