Library for interfacing with the AMICCOM A7105 2.4GHz FSK/GFSK Transceiver.

Dependents:   HubsanTX

Revision:
4:ca02a935e8eb
Parent:
3:cd7f899f155f
Child:
5:a070723fc0ed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/A7105.h	Thu Jan 01 19:13:10 2015 +0000
@@ -0,0 +1,212 @@
+#ifndef _A7105_TX_RX_H
+#define _A7105_TX_RX_H
+
+#define _WRITE(a)    ((a) & ~0x40)
+#define _READ(a)     ((a) | 0x40)
+
+/**
+ * TXRX state
+ */
+enum TXRX_State {
+    TXRX_OFF,
+    TX_EN,
+    RX_EN,
+};
+
+/**
+ * A7105 states for strobe
+ */
+enum A7105_State {
+    A7105_SLEEP     = 0x80,
+    A7105_IDLE      = 0x90,
+    A7105_STANDBY   = 0xA0,
+    A7105_PLL       = 0xB0,
+    A7105_RX        = 0xC0,
+    A7105_TX        = 0xD0,
+    A7105_RST_WRPTR = 0xE0,
+    A7105_RST_RDPTR = 0xF0,
+};
+
+/**
+ * Register addresses
+ */
+enum {
+    A7105_00_MODE         = 0x00,
+    A7105_01_MODE_CONTROL = 0x01,
+    A7105_02_CALC         = 0x02,
+    A7105_03_FIFOI        = 0x03,
+    A7105_04_FIFOII       = 0x04,
+    A7105_05_FIFO_DATA    = 0x05,
+    A7105_06_ID_DATA      = 0x06,
+    A7105_07_RC_OSC_I     = 0x07,
+    A7105_08_RC_OSC_II    = 0x08,
+    A7105_09_RC_OSC_III   = 0x09,
+    A7105_0A_CK0_PIN      = 0x0A,
+    A7105_0B_GPIO1_PIN_I  = 0x0B,
+    A7105_0C_GPIO2_PIN_II = 0x0C,
+    A7105_0D_CLOCK        = 0x0D,
+    A7105_0E_DATA_RATE    = 0x0E,
+    A7105_0F_PLL_I        = 0x0F,
+    A7105_10_PLL_II       = 0x10,
+    A7105_11_PLL_III      = 0x11,
+    A7105_12_PLL_IV       = 0x12,
+    A7105_13_PLL_V        = 0x13,
+    A7105_14_TX_I         = 0x14,
+    A7105_15_TX_II        = 0x15,
+    A7105_16_DELAY_I      = 0x16,
+    A7105_17_DELAY_II     = 0x17,
+    A7105_18_RX           = 0x18,
+    A7105_19_RX_GAIN_I    = 0x19,
+    A7105_1A_RX_GAIN_II   = 0x1A,
+    A7105_1B_RX_GAIN_III  = 0x1B,
+    A7105_1C_RX_GAIN_IV   = 0x1C,
+    A7105_1D_RSSI_THOLD   = 0x1D,
+    A7105_1E_ADC          = 0x1E,
+    A7105_1F_CODE_I       = 0x1F,
+    A7105_20_CODE_II      = 0x20,
+    A7105_21_CODE_III     = 0x21,
+    A7105_22_IF_CALIB_I   = 0x22,
+    A7105_23_IF_CALIB_II  = 0x23,
+    A7105_24_VCO_CURCAL   = 0x24,
+    A7105_25_VCO_SBCAL_I  = 0x25,
+    A7105_26_VCO_SBCAL_II = 0x26,
+    A7105_27_BATTERY_DET  = 0x27,
+    A7105_28_TX_TEST      = 0x28,
+    A7105_29_RX_DEM_TEST_I  = 0x29,
+    A7105_2A_RX_DEM_TEST_II = 0x2A,
+    A7105_2B_CPC          = 0x2B,
+    A7105_2C_XTAL_TEST    = 0x2C,
+    A7105_2D_PLL_TEST     = 0x2D,
+    A7105_2E_VCO_TEST_I   = 0x2E,
+    A7105_2F_VCO_TEST_II  = 0x2F,
+    A7105_30_IFAT         = 0x30,
+    A7105_31_RSCALE       = 0x31,
+    A7105_32_FILTER_TEST  = 0x32,
+};
+#define A7105_0F_CHANNEL A7105_0F_PLL_I
+
+enum A7105_MASK {
+    A7105_MASK_FBCF = 1 << 4,
+    A7105_MASK_VBCF = 1 << 3,
+};
+
+/**
+ * Class for interfacing with the AMICCOM A7105 2.4G FSK/GFSK Transceiver
+ *
+ * See the A7105 datasheet for complete documentation on this part
+ * http://www.avantcom.com.tw/AVANTCOM/TC/DATA/PRODUCT/SOLVE/18_3.pdf
+ *
+ *
+ * Example:
+ * @code
+ * #include "mbed.h"
+ * #include "a7105txrx.h"
+ *
+ * #define A7105_SPI_FREQUENCY  10000000 // 10MHz
+ * 
+ * A7105 txrx(D4, D5, D3, D6, A7105_SPI_FREQUENCY);
+ * 
+ * int main() {
+ *     // reset
+ *     ret = txrx.reset();
+ *     // use GPIO1 as miso
+ *     ret = txrx.writeRegister(A7105_0B_GPIO1_PIN_I, 0x19);
+ *     // set various radio options
+ *     ret = txrx.writeRegister(A7105_01_MODE_CONTROL, 0x63);
+ *     // set packet length (FIFO end pointer) to 0x0f + 1 == 16
+ *     ret = txrx.writeRegister(A7105_03_FIFOI, 0x0f);
+ *     // select crystal oscillator and system clock divider of 1/2
+ *     ret = txrx.writeRegister(A7105_0D_CLOCK, 0x05);
+ * 
+ *     // sanity check
+ *     ret = txrx.readRegister(A7105_0D_CLOCK);
+ *     if (ret != 0x05) {
+ *         // do something :)
+ *     }
+ * }
+ * @endcode
+ */
+class A7105 {
+    public:
+        /**
+         * @param mosi Pin used to transmit data to the slave
+         * @param miso Pin used to receive data from the slave
+         * @param clk Pin used for the clock
+         * @param cs Pin used for the chip select
+         * @param freqHz Frequency used to clock data in and out
+         */
+        A7105(PinName mosi, PinName miso, PinName clk, PinName cs, uint32_t freqHz);
+        ~A7105();
+        
+        /**
+         * Writes a value to the given register
+         *
+         * @param regAddr Address of the register to write to
+         * @param value Value to write into the register
+         * @return Value returned from slave when writing the register
+         */
+        uint8_t writeRegister(uint8_t regAddr, uint8_t value);
+        
+        /**
+         * Reads a value from the given register
+         *
+         * @param regAddr Address of the register to read
+         * @return The value of the register
+         */
+        uint8_t readRegister(uint8_t regAddr);
+        
+        /**
+         * Sends a strobe command to the A7105
+         *
+         * @param state Strobe command state
+         */
+        uint8_t strobe(enum A7105_State state);
+        
+        /**
+         * Send a packet of data to the A7105
+         *
+         * @param data Byte array to send
+         * @param len Length of the byte array
+         */
+        void writeData(uint8_t* data, size_t len);
+        
+        /**
+         * Read a packet of date from the A7105
+         *
+         * @param buffer Byte array to hold the incoming data
+         * @param len Length of the buffer, number of bytes to read in
+         */
+        void readData(uint8_t* buffer, size_t len);
+        
+        /**
+         * Set the A7105's ID
+         *
+         * @param id 32-bit identifier
+         */
+        void setId(uint32_t id);
+        
+        /**
+         * Set the TX power
+         *
+         * @param power Output power in dBm
+         */
+        void setPower(int32_t power);
+        
+        /**
+         * Sets the TxRx mode
+         *
+         * @aparam mode TxRx mode
+         */
+        void setTxRxMode(enum TXRX_State mode);
+        
+        /**
+         * Resets the A7105, putting it into standby mode.
+         */
+        int8_t reset();
+        
+    private:
+        SPI         _spi;
+        DigitalOut  _cs;
+};
+
+#endif  // #ifndef _A7105_TX_RX_H
\ No newline at end of file