Brett Wilson
/
Si4735
Si4735 Radio Library
Revision 0:42c032fc907a, committed 2011-10-12
- Comitter:
- bwilson30
- Date:
- Wed Oct 12 17:01:38 2011 +0000
- Commit message:
Changed in this revision
diff -r 000000000000 -r 42c032fc907a Si4735.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Si4735.cpp Wed Oct 12 17:01:38 2011 +0000 @@ -0,0 +1,271 @@ +/* mbed Si4735 Library + * Brett Wilson and Brett Berry + * Georgia Tech ECE 4180 + * Note: this code has only been tested for FM. + * Ported from ... + + * Arduino Si4735 Library + * Written by Ryan Owens for SparkFun Electronics + * 5/17/11 + * + * This library is for use with the SparkFun Si4735 Shield + * Released under the 'Buy Me a Beer' license + * (If we ever meet, you buy me a beer) + * + * See the header file for better function documentation. + * + * See the example sketches to learn how to use the library in your code. +*/ + +#include "Si4735.h" +#include "mbed.h" + +//This is just a constructor. +Si4735::Si4735(PinName sda, PinName scl, PinName RST_) : + _RST_(RST_) { + i2c_ = new I2C(sda, scl); + i2c_->frequency(100000); +} + + +void Si4735::begin(char mode){ + _mode = mode; + //Set the initial volume level. + _currentVolume=63; + + // Reset the Si4735 + _RST_ = 0; + wait(.2); + _RST_ = 1; + wait(.2); + + + //Send the POWER_UP command + switch(_mode){ + case FM: + sprintf(command, "%c%c%c", 0x01, 0x10, 0x05); + break; + case AM: + case SW: + case LW: + sprintf(command, "%c%c%c", 0x01, 0x11, 0x05); + break; + default: + return; + } + sendCommand(command, 3); + wait(.2); + + // Set the RCLK to 32768Hz + sprintf(command, "%c%c%c%c%c%c", 0x12, 0x00, 0x02, 0x01, 0x80, 0x00); + sendCommand(command, 6); + wait(.2); + + // Set default frequency to 99.7 MHz FM + sprintf(command, "%c%c%c%c", 0x20, 0x00, 0x26, 0xF2); + sendCommand(command, 4); + wait(.2); + + //Set the volume to the current value. + sprintf(command, "%c%c%c%c%c%c", 0x12, 0x00, 0x40, 0x00, 0x00, _currentVolume); + sendCommand(command, 6); + wait(.2); + + //Disable Mute + sprintf(command, "%c%c%c%c%c%c", 0x12, 0x00, 0x40, 0x01, 0x00, 0x00); + sendCommand(command, 6); + wait(.2); + + //Set the seek band for the desired mode (AM and FM can use default values) + switch(_mode){ + case SW: + //Set the lower band limit for Short Wave Radio to 2300 kHz + sprintf(command, "%c%c%c%c%c%c", 0x12, 0x00, 0x34, 0x00, 0x08, 0xFC); + sendCommand(command, 6); + wait(.001); + //Set the upper band limit for Short Wave Radio to 23000kHz + sprintf(command, "%c%c%c%c%c%c", 0x12, 0x00, 0x34, 0x01, 0x59, 0xD8); + sendCommand(command, 6); + wait(.001); + break; + case LW: + //Set the lower band limit for Long Wave Radio to 152 kHz + sprintf(command, "%c%c%c%c%c%c", 0x12, 0x00, 0x34, 0x00, 0x00, 0x99); + sendCommand(command, 6); + wait(.001); + //Set the upper band limit for Long Wave Radio to 279 kHz + sprintf(command, "%c%c%c%c%c%c", 0x12, 0x00, 0x34, 0x01, 0x01, 0x17); + sendCommand(command, 6); + wait(.001); + break; + default: + break; + } + +} + +/* +* Description: Tunes the Si4735 to a frequency +* +* Params: int frequency - The desired frequency in kHz +* +* Returns: True if tune was successful +* False if tune was unsuccessful +*/ +bool Si4735::tuneFrequency(int frequency){ + //Split the desired frequency into two character for use in the + //set frequency command. + char highByte = frequency >> 8; + char lowByte = frequency & 0x00FF; + + //Depending on the current mode, set the new frequency. + switch(_mode){ + case FM: + sprintf(command, "%c%c%c%c", 0x20, 0x00, highByte, lowByte); + break; + case AM: + case SW: + case LW: + sprintf(command, "%c%c%c%c", 0x40, 0x00, highByte, lowByte); + break; + default: + break; + } + sendCommand(command, 4); + wait(.1); + + return true; +} + +//This function does not work unless you bypass the buffer chip! +int Si4735::getFrequency(void){ + char data[8]; + int freq = 0; + // FM only + i2c_->start(); + i2c_->write(address_write); + i2c_->write(0x22); + i2c_->write(0x00); + i2c_->stop(); + i2c_->start(); + i2c_->write(address_read); + for (int i=0; i<8; i++) + data[i] = i2c_->read(1); + //i2c_->read(address_read, data, 8, false); + i2c_->stop(); + freq = data[2]; + freq = (freq << 8) | data[3]; + return freq; +} + +bool Si4735::seekUp(void){ + //Use the current mode selection to seek up. + switch(_mode){ + case FM: + sprintf(command, "%c%c", 0x21, 0x0C); + sendCommand(command, 2); + break; + case AM: + case SW: + case LW: + sprintf(command, "%c%c%c%c%c%c", 0x41, 0x0C, 0x00, 0x00, 0x00, 0x00); + sendCommand(command, 6); + break; + default: + break; + } + wait(.001); + return true; +} + +bool Si4735::seekDown(void){ + //Use the current mode selection to seek down. + switch(_mode){ + case FM: + sprintf(command, "%c%c", 0x21, 0x04); + sendCommand(command, 2); + break; + case AM: + case SW: + case LW: + sprintf(command, "%c%c%c%c%c%c", 0x41, 0x04, 0x00, 0x00, 0x00, 0x00); + sendCommand(command, 6); + break; + default: + break; + } + wait(.001); + return true; +} + +void Si4735::volumeUp(void){ + //If we're not at the maximum volume yet, increase the volume + if(_currentVolume < 63){ + _currentVolume+=1; + //Set the volume to the current value. + sprintf(command, "%c%c%c%c%c%c", 0x12, 0x00, 0x40, 0x00, 0x00, _currentVolume); + sendCommand(command, 6); + wait(.01); + } +} + +void Si4735::volumeDown(void){ + //If we're not at the maximum volume yet, increase the volume + if(_currentVolume > 0){ + _currentVolume-=1; + //Set the volume to the current value. + sprintf(command, "%c%c%c%c%c%c", 0x12, 0x00, 0x40, 0x00, 0x00, _currentVolume); + sendCommand(command, 6); + wait(.01); + } +} + +void Si4735::mute(void){ + //Disable Mute + sprintf(command, "%c%c%c%c%c%c", 0x12, 0x00, 0x40, 0x01, 0x00, 0x03); + sendCommand(command, 6); + wait(.001); +} + +void Si4735::unmute(void){ + //Disable Mute + sprintf(command, "%c%c%c%c%c%c", 0x12, 0x00, 0x40, 0x01, 0x00, 0x00); + sendCommand(command, 6); + wait(.001); +} + +/*char Si4735::getStatus(void){ + char response; + bool ack1, ack2; + i2c_->start(); + ack1 = i2c_->write(address_); //Send i2c address and wait for ack (true) to proceed + response = spi_->write(0xA0); //read a single byte + _cs_ = 1; + wait(.001); + return response; +}*/ +/*void Si4735::getResponse(char * response){ + +}*/ + +void Si4735::end(void){ + sprintf(command, "%c", 0x11); + sendCommand(command, 1); + wait(.001); +} + +/******************************************* +* +* Private Functions +* +*******************************************/ + +void Si4735::sendCommand(char * command, int length){ + //ack = i2c_->write(address_write, command, length, false); + i2c_->start(); + bool ack = i2c_->write(address_write); + for(int i=0; i<length; i++) + ack = i2c_->write(command[i]); + char CTS = i2c_->read(1); + i2c_->stop(); + }
diff -r 000000000000 -r 42c032fc907a Si4735.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Si4735.h Wed Oct 12 17:01:38 2011 +0000 @@ -0,0 +1,190 @@ +/* mbed Si4735 Library + * Brett Wilson and Brett Berry + * Georgia Tech ECE 4180 + * Ported from ... + + * Arduino Si4735 Library + * Written by Ryan Owens for SparkFun Electronics + * 5/17/11 + * + * This library is for use with the SparkFun Si4735 Shield + * Released under the 'Buy Me a Beer' license + * (If we ever meet, you buy me a beer) + * + * See the example sketches to learn how to use the library in your code. +*/ + +#include "mbed.h" + +#ifndef Si4735_h +#define Si4735_h + +//Assign the radio pin numbers +#define POWER_PIN 8 +#define RADIO_RESET_PIN 9 +#define INT_PIN 2 + +//Define the SPI Pin Numbers +#define DATAOUT 11 //MOSI +#define DATAIN 12 //MISO +#define SPICLOCK 13 //sck +#define SS 10 //ss + +//List of possible modes for the Si4735 Radio +#define AM 0 +#define FM 1 +#define SW 2 +#define LW 3 + +#define ON true +#define OFF false + +#define address_write 34 +#define address_read 35 + +class Si4735 +{ + public: + //This is just a constructor. + Si4735(PinName sda, PinName scl, PinName RST_); + /* + * Description: + * Initializes the Si4735, powers up the radio in the desired mode and limits the bandwidth appropriately. + * This function must be called before any other radio command. + * The bands are set as follows: + * FM - 87.5 - 107.9 MHz + * AM - 520 - 1710 kHz + * SW - 2300 - 23000 khz + * LW - 152 - 279 kHz + * Parameters: + * mode - The desired radio mode. Use AM(0), FM(1), SW(2) or LW(3). + */ + void begin(char mode); + /* + * Description: + * Used to send an ascii command string to the radio. + * Parameters: + * myCommand - A null terminated ascii string limited to hexidecimal characters + * to be sent to the radio module. Instructions for building commands can be found + * in the Si4735 Programmers Guide. + */ + void sendCommand(char * myCommand); + /* + * Description: + * Used to to tune the radio to a desired frequency. The library uses the mode indicated in the + * begin() function to determine how to set the frequency. + * Parameters: + * frequency - The frequency to tune to, in kHz (or in 10kHz if using FM mode). + * Returns: + * True + * TODO: + * Make the function return true if the tune was successful, else return false. + */ + bool tuneFrequency(int frequency); + /* + * Description: + * This function currently does not work! + * TODO: + * Make this function work. + */ + int getFrequency(void); + /* + * Description: + * Commands the radio to seek up to the next valid channel. If the top of the band is reached, the seek + * will continue from the bottom of the band. + * Returns: + * True + * TODO: + * Make the function return true if a valid channel was found, else return false. + */ + bool seekUp(void); + /* + * Description: + * Commands the radio to seek down to the next valid channel. If the bottom of the band is reached, the seek + * will continue from the top of the band. + * Returns: + * True + * TODO: + * Make the function return true if a valid channel was found, else return false. + */ + bool seekDown(void); + /* + * Description: + * Increasese the volume by 1. If the maximum volume has been reached, no increase will take place. + */ + void volumeUp(void); + /* + * Description: + * Decreases the volume by 1. If the minimum volume has been reached, no decrease will take place. + */ + void volumeDown(void); + /* + * Description: + * Mutes the audio output + */ + void mute(void); + /* + * Description: + * Disables the mute. + */ + void unmute(void); + /* + * Description: + * Gets the current status of the radio. Learn more about the status in the Si4735 datasheet. + * Returns: + * The status of the radio. + */ + char getStatus(void); + /* + * Description: + * Gets the long response (16 characters) from the radio. Learn more about the long response in the Si4735 datasheet. + * Parameters: + * response - A string for the response from the radio to be stored in. + */ + void getResponse(char * response); + /* + * Description: + * Powers down the radio + */ + void end(void); + + private: + // Pointer for the SPI bus + I2C* i2c_; + // Declare digital out pins + DigitalOut _RST_; + /* + * A variable that is assigned the current mode of the radio (AM, FM, SW or LW) + */ + char _mode; + /* + * A variable the keeps the current volume level. + */ + char _currentVolume; + /* + * Command string that holds the binary command string to be sent to the Si4735. + */ + char command[9]; + /* + * Description: + * Sends a binary command string to the Si4735. + * Parameters: + * command - Binary command to be sent to the radio. + * length - The number of characters in the command string (since it can't be null terminated!) + * TODO: + * Make the command wait for a valid CTS response from the radio before releasing control of the CPU. + */ + void sendCommand(char * command, int length); + /* + * Description: + * Sends/Receives a character from the SPI bus. + * Parameters: + * value - The character to be sent to the SPI bus. + * Returns: + * The character read from the SPI bus during the transfer. + */ + char spiTransfer(char value); + +}; + +#endif \ No newline at end of file
diff -r 000000000000 -r 42c032fc907a mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Wed Oct 12 17:01:38 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/63bcd7ba4912