mbed version of the Adafruit Si4713 library (FM transmitter)
Dependents: Adafruit_Si4173_Demo Radio_Transmitter_Working
Adafruit_Si4713.h@0:6643c5542090, 2017-01-24 (annotated)
- Committer:
- JLarkin
- Date:
- Tue Jan 24 06:55:43 2017 +0000
- Revision:
- 0:6643c5542090
Translated Adafruit library from Arduino to mbed. Need extra delays between I2C commands because of mbed's faster speed.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
JLarkin | 0:6643c5542090 | 1 | /*************************************************** |
JLarkin | 0:6643c5542090 | 2 | This is a library for the Si4713 FM Radio Transmitter with RDS |
JLarkin | 0:6643c5542090 | 3 | |
JLarkin | 0:6643c5542090 | 4 | Designed specifically to work with the Si4713 breakout in the |
JLarkin | 0:6643c5542090 | 5 | adafruit shop |
JLarkin | 0:6643c5542090 | 6 | ----> https://www.adafruit.com/products/1958 |
JLarkin | 0:6643c5542090 | 7 | |
JLarkin | 0:6643c5542090 | 8 | These transmitters use I2C to communicate, plus reset pin. |
JLarkin | 0:6643c5542090 | 9 | 3 pins are required to interface |
JLarkin | 0:6643c5542090 | 10 | Adafruit invests time and resources providing this open source code, |
JLarkin | 0:6643c5542090 | 11 | please support Adafruit and open-source hardware by purchasing |
JLarkin | 0:6643c5542090 | 12 | products from Adafruit! |
JLarkin | 0:6643c5542090 | 13 | |
JLarkin | 0:6643c5542090 | 14 | Written by Limor Fried/Ladyada for Adafruit Industries. |
JLarkin | 0:6643c5542090 | 15 | BSD license, all text above must be included in any redistribution |
JLarkin | 0:6643c5542090 | 16 | ****************************************************/ |
JLarkin | 0:6643c5542090 | 17 | /*************************************************** |
JLarkin | 0:6643c5542090 | 18 | Modified to work with ARM mbed by John M. Larkin |
JLarkin | 0:6643c5542090 | 19 | January 2017 |
JLarkin | 0:6643c5542090 | 20 | ******************************************************/ |
JLarkin | 0:6643c5542090 | 21 | |
JLarkin | 0:6643c5542090 | 22 | //!Library for the Adafruit Si4713. |
JLarkin | 0:6643c5542090 | 23 | /*! |
JLarkin | 0:6643c5542090 | 24 | The Si4713 is an FM radio transmitter with RDS |
JLarkin | 0:6643c5542090 | 25 | */ |
JLarkin | 0:6643c5542090 | 26 | |
JLarkin | 0:6643c5542090 | 27 | #include "mbed.h" |
JLarkin | 0:6643c5542090 | 28 | |
JLarkin | 0:6643c5542090 | 29 | //#define SI4713_CMD_DEBUG |
JLarkin | 0:6643c5542090 | 30 | |
JLarkin | 0:6643c5542090 | 31 | #define SI4710_ADDR0 0x11<<1 // if SEN is low |
JLarkin | 0:6643c5542090 | 32 | #define SI4710_ADDR1 0x63<<1 // if SEN is high, default! |
JLarkin | 0:6643c5542090 | 33 | #define SI4710_STATUS_CTS 0x80 |
JLarkin | 0:6643c5542090 | 34 | |
JLarkin | 0:6643c5542090 | 35 | /* COMMANDS */ |
JLarkin | 0:6643c5542090 | 36 | #define SI4710_CMD_POWER_UP 0x01 |
JLarkin | 0:6643c5542090 | 37 | #define SI4710_CMD_GET_REV 0x10 |
JLarkin | 0:6643c5542090 | 38 | #define SI4710_CMD_POWER_DOWN 0x11 |
JLarkin | 0:6643c5542090 | 39 | #define SI4710_CMD_SET_PROPERTY 0x12 |
JLarkin | 0:6643c5542090 | 40 | #define SI4710_CMD_GET_PROPERTY 0x13 |
JLarkin | 0:6643c5542090 | 41 | #define SI4710_CMD_GET_INT_STATUS 0x14 |
JLarkin | 0:6643c5542090 | 42 | #define SI4710_CMD_PATCH_ARGS 0x15 |
JLarkin | 0:6643c5542090 | 43 | #define SI4710_CMD_PATCH_DATA 0x16 |
JLarkin | 0:6643c5542090 | 44 | #define SI4710_CMD_TX_TUNE_FREQ 0x30 |
JLarkin | 0:6643c5542090 | 45 | #define SI4710_CMD_TX_TUNE_POWER 0x31 |
JLarkin | 0:6643c5542090 | 46 | #define SI4710_CMD_TX_TUNE_MEASURE 0x32 |
JLarkin | 0:6643c5542090 | 47 | #define SI4710_CMD_TX_TUNE_STATUS 0x33 |
JLarkin | 0:6643c5542090 | 48 | #define SI4710_CMD_TX_ASQ_STATUS 0x34 |
JLarkin | 0:6643c5542090 | 49 | #define SI4710_CMD_TX_RDS_BUFF 0x35 |
JLarkin | 0:6643c5542090 | 50 | #define SI4710_CMD_TX_RDS_PS 0x36 |
JLarkin | 0:6643c5542090 | 51 | #define SI4710_CMD_TX_AGC_OVERRIDE 0x48 |
JLarkin | 0:6643c5542090 | 52 | #define SI4710_CMD_GPO_CTL 0x80 |
JLarkin | 0:6643c5542090 | 53 | #define SI4710_CMD_GPO_SET 0x81 |
JLarkin | 0:6643c5542090 | 54 | |
JLarkin | 0:6643c5542090 | 55 | /* Parameters */ |
JLarkin | 0:6643c5542090 | 56 | |
JLarkin | 0:6643c5542090 | 57 | #define SI4713_PROP_GPO_IEN 0x0001 |
JLarkin | 0:6643c5542090 | 58 | #define SI4713_PROP_DIGITAL_INPUT_FORMAT 0x0101 |
JLarkin | 0:6643c5542090 | 59 | #define SI4713_PROP_DIGITAL_INPUT_SAMPLE_RATE 0x0103 |
JLarkin | 0:6643c5542090 | 60 | #define SI4713_PROP_REFCLK_FREQ 0x0201 |
JLarkin | 0:6643c5542090 | 61 | #define SI4713_PROP_REFCLK_PRESCALE 0x0202 |
JLarkin | 0:6643c5542090 | 62 | #define SI4713_PROP_TX_COMPONENT_ENABLE 0x2100 |
JLarkin | 0:6643c5542090 | 63 | #define SI4713_PROP_TX_AUDIO_DEVIATION 0x2101 |
JLarkin | 0:6643c5542090 | 64 | #define SI4713_PROP_TX_PILOT_DEVIATION 0x2102 |
JLarkin | 0:6643c5542090 | 65 | #define SI4713_PROP_TX_RDS_DEVIATION 0x2103 |
JLarkin | 0:6643c5542090 | 66 | #define SI4713_PROP_TX_LINE_LEVEL_INPUT_LEVEL 0x2104 |
JLarkin | 0:6643c5542090 | 67 | #define SI4713_PROP_TX_LINE_INPUT_MUTE 0x2105 |
JLarkin | 0:6643c5542090 | 68 | #define SI4713_PROP_TX_PREEMPHASIS 0x2106 |
JLarkin | 0:6643c5542090 | 69 | #define SI4713_PROP_TX_PILOT_FREQUENCY 0x2107 |
JLarkin | 0:6643c5542090 | 70 | #define SI4713_PROP_TX_ACOMP_ENABLE 0x2200 |
JLarkin | 0:6643c5542090 | 71 | #define SI4713_PROP_TX_ACOMP_THRESHOLD 0x2201 |
JLarkin | 0:6643c5542090 | 72 | #define SI4713_PROP_TX_ATTACK_TIME 0x2202 |
JLarkin | 0:6643c5542090 | 73 | #define SI4713_PROP_TX_RELEASE_TIME 0x2203 |
JLarkin | 0:6643c5542090 | 74 | #define SI4713_PROP_TX_ACOMP_GAIN 0x2204 |
JLarkin | 0:6643c5542090 | 75 | #define SI4713_PROP_TX_LIMITER_RELEASE_TIME 0x2205 |
JLarkin | 0:6643c5542090 | 76 | #define SI4713_PROP_TX_ASQ_INTERRUPT_SOURCE 0x2300 |
JLarkin | 0:6643c5542090 | 77 | #define SI4713_PROP_TX_ASQ_LEVEL_LOW 0x2301 |
JLarkin | 0:6643c5542090 | 78 | #define SI4713_PROP_TX_ASQ_DURATION_LOW 0x2302 |
JLarkin | 0:6643c5542090 | 79 | #define SI4713_PROP_TX_AQS_LEVEL_HIGH 0x2303 |
JLarkin | 0:6643c5542090 | 80 | #define SI4713_PROP_TX_AQS_DURATION_HIGH 0x2304 |
JLarkin | 0:6643c5542090 | 81 | |
JLarkin | 0:6643c5542090 | 82 | #define SI4713_PROP_TX_RDS_INTERRUPT_SOURCE 0x2C00 |
JLarkin | 0:6643c5542090 | 83 | #define SI4713_PROP_TX_RDS_PI 0x2C01 |
JLarkin | 0:6643c5542090 | 84 | #define SI4713_PROP_TX_RDS_PS_MIX 0x2C02 |
JLarkin | 0:6643c5542090 | 85 | #define SI4713_PROP_TX_RDS_PS_MISC 0x2C03 |
JLarkin | 0:6643c5542090 | 86 | #define SI4713_PROP_TX_RDS_PS_REPEAT_COUNT 0x2C04 |
JLarkin | 0:6643c5542090 | 87 | #define SI4713_PROP_TX_RDS_MESSAGE_COUNT 0x2C05 |
JLarkin | 0:6643c5542090 | 88 | #define SI4713_PROP_TX_RDS_PS_AF 0x2C06 |
JLarkin | 0:6643c5542090 | 89 | #define SI4713_PROP_TX_RDS_FIFO_SIZE 0x2C07 |
JLarkin | 0:6643c5542090 | 90 | |
JLarkin | 0:6643c5542090 | 91 | |
JLarkin | 0:6643c5542090 | 92 | /* REGISTERS */ |
JLarkin | 0:6643c5542090 | 93 | |
JLarkin | 0:6643c5542090 | 94 | |
JLarkin | 0:6643c5542090 | 95 | int min(int a, int b); |
JLarkin | 0:6643c5542090 | 96 | |
JLarkin | 0:6643c5542090 | 97 | class Adafruit_Si4713 { |
JLarkin | 0:6643c5542090 | 98 | public: |
JLarkin | 0:6643c5542090 | 99 | //!Creates an instance of the class. |
JLarkin | 0:6643c5542090 | 100 | /*! |
JLarkin | 0:6643c5542090 | 101 | Connect module at I2C address addr using I2C port pins sda and scl. A digital output is used to reset the device. |
JLarkin | 0:6643c5542090 | 102 | TMP102 |
JLarkin | 0:6643c5542090 | 103 | \param i2c An I2C object created elsewhere |
JLarkin | 0:6643c5542090 | 104 | \param rstpin A digital out pin used to toggle the device reset. |
JLarkin | 0:6643c5542090 | 105 | \param addr The I2C address the device. |
JLarkin | 0:6643c5542090 | 106 | */ |
JLarkin | 0:6643c5542090 | 107 | Adafruit_Si4713(I2C i2c, PinName rstpin, uint8_t addr = SI4710_ADDR1); |
JLarkin | 0:6643c5542090 | 108 | bool begin(); |
JLarkin | 0:6643c5542090 | 109 | void reset(); |
JLarkin | 0:6643c5542090 | 110 | |
JLarkin | 0:6643c5542090 | 111 | void powerUp(void); |
JLarkin | 0:6643c5542090 | 112 | void configure(void); |
JLarkin | 0:6643c5542090 | 113 | uint8_t getRev(void); |
JLarkin | 0:6643c5542090 | 114 | |
JLarkin | 0:6643c5542090 | 115 | void tuneFM(uint16_t freqKHz); |
JLarkin | 0:6643c5542090 | 116 | uint8_t getStatus(void); |
JLarkin | 0:6643c5542090 | 117 | void readTuneStatus(void); |
JLarkin | 0:6643c5542090 | 118 | void readTuneMeasure(uint16_t freq); |
JLarkin | 0:6643c5542090 | 119 | void setTXpower(uint8_t pwr, uint8_t antcap = 0); |
JLarkin | 0:6643c5542090 | 120 | void readASQ(void); |
JLarkin | 0:6643c5542090 | 121 | void setProperty(uint16_t p, uint16_t v); |
JLarkin | 0:6643c5542090 | 122 | |
JLarkin | 0:6643c5542090 | 123 | // RDS stuff |
JLarkin | 0:6643c5542090 | 124 | void beginRDS(uint16_t programID = 0xADAF); |
JLarkin | 0:6643c5542090 | 125 | void setRDSstation(char *s); |
JLarkin | 0:6643c5542090 | 126 | void setRDSbuffer(char *s); |
JLarkin | 0:6643c5542090 | 127 | |
JLarkin | 0:6643c5542090 | 128 | uint16_t currFreq; |
JLarkin | 0:6643c5542090 | 129 | uint8_t currdBuV, currAntCap, currNoiseLevel, currASQ; |
JLarkin | 0:6643c5542090 | 130 | int8_t currInLevel; |
JLarkin | 0:6643c5542090 | 131 | |
JLarkin | 0:6643c5542090 | 132 | |
JLarkin | 0:6643c5542090 | 133 | void setGPIO(uint8_t x); |
JLarkin | 0:6643c5542090 | 134 | void setGPIOctrl(uint8_t x); |
JLarkin | 0:6643c5542090 | 135 | |
JLarkin | 0:6643c5542090 | 136 | private: |
JLarkin | 0:6643c5542090 | 137 | |
JLarkin | 0:6643c5542090 | 138 | void sendCommand(uint8_t len); |
JLarkin | 0:6643c5542090 | 139 | |
JLarkin | 0:6643c5542090 | 140 | I2C _i2c; |
JLarkin | 0:6643c5542090 | 141 | DigitalOut _rst; |
JLarkin | 0:6643c5542090 | 142 | char _i2ccommand[10]; // holds the command buffer |
JLarkin | 0:6643c5542090 | 143 | char _i2caddr; |
JLarkin | 0:6643c5542090 | 144 | }; |
JLarkin | 0:6643c5542090 | 145 |