For robots and stuff

Dependents:   Base Station

Revision:
0:c5afea7b9057
diff -r 000000000000 -r c5afea7b9057 Wireless/CC1101/CC1101.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Wireless/CC1101/CC1101.h	Sun Dec 28 06:27:18 2014 +0000
@@ -0,0 +1,343 @@
+/**
+ * @author Athanassios Mavrogeorgiadis
+ * @author TI CC1101 library  developed by Athanassios Mavrogeorgiadis (tmav Electronics) as template based on TI C8051 SOURCE CODE swrc021f
+ * @section LICENSE
+ *
+ * Copyright (c) 2010 ARM Limited
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @section DESCRIPTION
+ *
+ * CC1101 Low-Power Sub-1 GHz RF Transceiver CC1101.
+ *
+ * Datasheet:
+ *
+ * http://www.ti.com/lit/ds/symlink/cc1101.pdf
+ */
+
+
+#ifndef CC1101_H
+#define CC1101_H
+
+
+/**
+ * Includes
+ */
+#include "mbed.h"
+#include "rtos.h"
+#include "Radio.h"
+#include "CC1101-Defines.h"
+
+
+/**
+ * CC1101 Low-Power Sub-1 GHz RF Transceiver.
+ */
+class CC1101 : public Radio
+{
+public:
+
+    /**
+     * Constructor.
+     *
+     * @param mosi mbed pin to use for MOSI line of SPI interface.
+     * @param miso mbed pin to use for MISO line of SPI interface.
+     * @param clk mbed pin to use for SCK line of SPI interface.
+     * @param csn mbed pin to use for the negated chip select line of SPI interface.
+     * @param interpt pin connected to an interrupt-capable input used for signaling that new radio data has been received
+     * @param tx_led the indicator led for when data is transmitted
+     * @param rx_led the indicator led for when data is received
+     * @param xosc oscillator frequency that the CC1101 operates from. Either 26MHz or 27MHz
+     */
+    CC1101(PinName mosi, PinName miso, PinName clk, PinName csn, PinName tx_led, PinName rx_led, PinName interpt, unsigned int xosc = 27000000);
+
+
+    /**
+    * Default Constructor
+    */
+    CC1101();
+
+
+    /*
+    * Deconstructor
+    */
+    virtual ~CC1101();
+
+
+    uint16_t scan(void);
+
+    void init(void);
+
+
+    /**
+    * Get the chip's version number.
+    */
+    uint8_t version(void);
+
+    void tiny_delay(void);
+
+
+    /**
+    * Implementation of setting device address
+    */
+    virtual void address(uint8_t address);
+
+
+    /**
+    * Get the current state of the CC1101 state machine.
+    */
+    uint8_t mode(void);
+
+
+    /**
+    * Read the contents of any CC1101's status register.
+    */
+    uint8_t status(uint8_t);
+
+
+    /**
+    * Get the current setting that the CC1101 is operating in.
+    */
+    uint8_t status(void);
+
+
+    /**
+    * Perform a soft-reset for the CC1101
+    */
+    void reset(void);
+
+
+    uint8_t strobe(uint8_t);
+
+
+    /**
+     * This function returns the RSSI value based from the last packet received
+     *
+     * @return Return the RSSI value.
+     */
+    uint8_t rssi(void);
+
+
+    /**
+     * This function returns the LQI value based from the last packet received
+     *
+     * @return Return the LQI value.
+     */
+    uint8_t lqi(void);
+
+
+    /**
+     * This function reads and returns the contents of the PARTNUM register on the CC1101.
+     */
+    uint8_t partnum(void);
+
+
+    /**
+     * This function returns the operating frequency that the CC1101 is receiving/transmitting on.
+     */
+    //virtual uint32_t freq(void);
+    virtual void freq(uint32_t);
+
+
+    /**
+     * This function is used to update the operating channel of the CC1101.
+     *
+     * @param channel Desired operating channel number.
+     */
+    virtual void channel(uint8_t);
+
+
+    /**
+     * This function gets the value of a single specified CCxxx0 register.
+     *
+     * @param addr Value of the accessed CCxxx0 register
+     * @return Value of the accessed CCxxx0 register
+     */
+    uint8_t read_reg(uint8_t);
+
+
+    /**
+     * This function reads multiple CCxxx0 register, using SPI burst access.
+     *
+     * @param addr Value of the accessed CCxxx0 register
+     * @param *buffer Pointer to a byte array which stores the values read from a
+     *                corresponding range of CCxxx0 registers.
+     * @param count Number of bytes to be read from the subsequent CCxxx0 registers.
+     */
+    void read_reg(uint8_t, uint8_t*, uint8_t);
+
+
+    /**
+     * Function for writing to a single CCxxx0 register
+     *
+     * @param addr Address of the first CCxxx0 register to be accessed.
+     * @param value Value to be written to the specified CCxxx0 register.
+     */
+    void write_reg(uint8_t, uint8_t);
+
+
+    /**
+     * This function writes to multiple CCxxx0 register, using SPI burst access.
+     *
+     * @param addr Address of the first CCxxx0 register to be accessed.
+     * @param *buffer Array of bytes to be written into a corresponding range of
+     *                CCxx00 registers, starting by the address specified in _addr_.
+     * @param count Number of bytes to be written to the subsequent CCxxx0 registers.
+     */
+    void write_reg(uint8_t, uint8_t*, uint8_t);
+
+
+    /**
+     * This function can be used to transmit a packet with packet length up to 63 bytes.
+     *
+     * @param *txBuffer Pointer to a buffer containing the data that are going to be transmitted
+     * @param size The size of the txBuffer
+     */
+    virtual void put_pck(uint8_t*, uint8_t, bool = false);
+
+
+    /**
+     * This function can be used to receive a packet of variable packet length (first byte in the packet
+     * must be the length byte). The packet length should not exceed the RX FIFO size.
+     *
+     * @param *rxBuffer Pointer to the buffer where the incoming data should be stored
+     * @param *length Pointer to a variable containing the size of the buffer where the incoming data should be
+     *                stored. After this function returns, that variable holds the packet length.
+     * @return Return value is 1 if CRC OK or else 0 if CRC NOT OK (or no packet was put in the RX FIFO due to filtering)
+     */
+    virtual bool get_pck(uint8_t*, uint8_t*);
+
+
+    /**
+     * This function flushes the RX FIFO buffer.
+     */
+    void flush_rx(void);
+
+
+    /**
+     * This function flushes the TX FIFO buffer.
+     */
+    void flush_tx(void);
+
+
+    /**
+     * This function change the state of CC1101 to RX mode.
+     */
+    void rx_mode(void);
+
+
+    void tx_mode(void);
+    
+    void idle(void);
+
+    virtual void powerUp(void);
+
+protected:
+    
+    DigitalOut *_csn;
+    /*
+    DigitalOut _tx_led;
+    DigitalOut _rx_led;
+    */
+    // InterruptIn *_rx_int;
+    //RingBuffer rxBuf;
+    //Serial _pc;
+
+    void calibrate();
+
+private:
+    
+    //static void threadStarter(void const*);
+    
+    /*
+    static void led_tick(void const*);
+
+    static void transmit_thread(void const*);
+    static void receive_thread(void const*);
+    //static void get_serial_data_thread(void const*);
+    */
+
+    void rssi(uint8_t);
+/*
+    Thread _receive_thread;
+    Thread _transmit_thread;
+    Thread _tx_led_thread;
+    Thread _rx_led_thread;
+    //Thread _serial_thread;
+    */
+
+    void setup_spi(PinName = NC, PinName = NC, PinName = NC);
+    void setup_pins(PinName = NC, PinName = NC);
+    void setup_lights(void);
+    void setup_chip(void);
+
+    void assign_modem_params(void);
+    void assign_packet_params(void);
+    void assign_if_freq(uint32_t);
+    void assign_channel_spacing(uint32_t);
+    void assign_baud_rate(uint32_t);
+    void set_rf_settings(void);
+    void assign_freq_offset(uint8_t);
+
+    // ISR routine for new radio data received over the air
+    // void isr_receive(void);
+    void power_on_reset(void);
+    void put_rf_settings(void);
+    void compute_freq(void);
+
+
+    rf_settings_t rfSettings;
+    radio_state_t      _mode;
+    pck_ctrl_t  _pck_control;
+    modem_t     _modem;
+
+    uint32_t    _crystal_freq;
+    uint32_t    _carrier_freq;
+    uint8_t     _offset_freq;
+    uint32_t    _if_freq;
+
+    uint32_t    _final_freq;
+    uint32_t    _baud_rate;
+    uint32_t    _channel_spacing;
+
+    uint8_t         _lqi;
+    uint8_t         _partnum;
+    uint8_t         _chip_version;
+
+    PinName     _so;
+    PinName     _si;
+    PinName     _sck;
+    
+// Variables used to calculate RSSI
+    uint8_t rssi_dec;
+    int16_t rssi_dBm;
+    //uint8_t rssi_offset[CC_NUMBER_OF_SUB_BANDS];
+
+    int16_t rssiTable[256];
+    uint16_t channelNumber[256];
+    uint8_t carrierSenseCounter;   // Counter used to keep track on how many time CS has been asserted in one sub band
+
+    uint8_t activeBand; // After the scanFreqBands() function has run, this variable will contain the sub band where
+// the strongest signal was found
+
+    uint16_t activeChannel; // After the scanFreqBands() function has run, this variable will contain the channel number
+// where the strongest signal was found
+
+};
+#endif