mbed version of the Adafruit Si4713 library (FM transmitter)

Dependents:   Adafruit_Si4173_Demo Radio_Transmitter_Working

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?

UserRevisionLine numberNew 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