Library for the nRF2401A Transceiver

Dependents:   nRF2401A_Hello_World nRF2401A_Wireless_Accelerometer_joypad nRF2401A_Gameduino_Invaders

Revision:
9:7245524e37e4
Parent:
8:fb7cb88e80a4
--- a/nRF2401A.h	Sat Oct 26 21:55:20 2013 +0000
+++ b/nRF2401A.h	Sun Mar 09 11:57:33 2014 +0000
@@ -29,15 +29,9 @@
 
 #include <mbed.h>
 #include <inttypes.h>
-#define   Ts         1     /**< Setup time from data to rising clock edge on write (accualy 500 ns). */
-#define   Th         1     /**< Hold time from rising clock to data toggle/falling clock (accualy 500 ns). */
-#define   Tcs2data   5     /**< Min delay from CS assert to data, in us. */
-#define   Tce2data   5     /**< Min delay from CE assert to data, in us. */
-#define   Td         1     /**< Minimum delay between edges (actually 50 ns). */
-#define   Tpd2cfgm   3     /**< Minimum delay from power up of tranciever to configuration. */
-#define   Tsby2txSB  195   /**< Minimum delay from tx initation to air, in us. */
-#define   Thmin      5     /**< */
-#define   Tclk2data  1     /**< */
+
+#define DATA_BUFFER_SIZE 32
+
 
 /** ISR handler prototype for receiving messages.
  * A function of this type is registered and called when the DR pin on the
@@ -48,13 +42,18 @@
 
 /** nRF2401 Class 
  *
+ *  A class supporting the nRF2401A nordic 2.4Ghz transciever
+ * Supports shock burts mode only.
+ * multi channel mode is not supported as it is not on the breakout header.
+ *
  * Example:
  * @code
  * #include "mbed.h"
  * #include "nRF2401A.h"
  * 
  * // comment these out depending on the job of the mbed. If your only using one mbed leave both uncommented. 
- * //#define TX
+ * 
+ * #define TX
  * #define RX
  * 
  * // If using the FRDM-KL25Z uncomment this line 
@@ -75,7 +74,7 @@
  * #ifdef FRDMKL25Z
  * nRF2401A    rf2(PTD0, PTD5, PTA13, PTC12, PTC13);
  * #else
- * nRF2401A    rf2(p10, p11, p12, p13, p14);
+ * nRF2401A    rf2(p25, p24, p23, p22, p21);
  * #endif
  * 
  * bool rx_recieved = false;
@@ -91,29 +90,21 @@
  *     pc.printf("Hello nRF2401A\n\r");
  *     
  * #ifdef TX  
- *     // initialise the nRF2401A with payload size, address, CRC, bit rate and channel
- *     rf1.setDataPayloadLength(4 << 3)
- *        .setAddress(0x0, 0x0, 0xa6, 0xa6, 0xa6, 3 << 3)
- *        .setCRCMode(nRF2401A::NO_CRC)
- *        .setDataRate(nRF2401A::BIT_RATE_250KBITS)
- *        .setChannel(0x02);
- *        
+ *     // initialise the nRF2401A with payload size and address 
+ *     rf1.setAddress(0x0, 0x0, 0xa6, 0xa6, 0xa6, 3 << 3);
+ *     
  *     rf1.printControlPacket(pc);
  *     rf1.flushControlPacket();
  *     
- *     // initialise variables to use for tranmission
+ *     // initialise variables to use for tranmission 
  *     nRF2401A::address_t rf2_addr = {0x0, 0x0, 0x53, 0x53, 0x53};
  *     uint8_t msg[] = {0x01, 0x01, 0x01, 0x01};
  *     uint32_t *msg32 = (uint32_t *) msg;
  * #endif
  * 
  * #ifdef RX   
- *     // initialise the nRF2401A with payload size, address, CRC, bit rate and channel 
- *     rf2.setDataPayloadLength(4 << 3)
- *        .setAddress(0x0, 0x0, 0x53, 0x53, 0x53, 3 << 3)
- *        .setCRCMode(nRF2401A::NO_CRC)
- *        .setDataRate(nRF2401A::BIT_RATE_250KBITS)
- *        .setChannel(0x02);
+ *     // initialise the nRF2401A with payload size and address  
+ *     rf2.setAddress(0x0, 0x0, 0x53, 0x53, 0x53, 3 << 3);
  *        
  *     rf2.printControlPacket(pc);
  *     rf2.flushControlPacket();   
@@ -129,7 +120,7 @@
  *         myled = 0;
  *         wait(0.25);  
  *         
- *         send the message to the nRF2401A         
+ *         // send the message to the nRF2401A 
  *         rf1.sendMsg(rf2_addr, 3 << 3, msg, 4 << 3);
  *         *msg32 += 1;
  *         
@@ -146,7 +137,7 @@
  *             
  *             // send a single byte from the read buffer to the serial port 
  *             uint8_t rx_msg = 0;
- *             rf2.readMsg_byte(&rx_msg,  0 );
+ *             rx_msg = rf2.readMsg_byte( 0 );
  *             pc.printf("\n\r%d\n\r", rx_msg);
  *             
  *             // read the read buffer , then send to the serial port 
@@ -199,17 +190,99 @@
  */
         virtual ~nRF2401A() { return; }
         
+        
+ /** CRC settings.
+ * Type covering the allowed settings for use of CRC.
+ */
+        typedef enum 
+        {
+            NO_CRC = 0x0,   /**< Do not use CRC. */
+            CRC_8 = 0x1,    /**< Use a 8-bit CRC. */
+            CRC_16 = 0x3,   /**< Use a 16-bit CRC. */
+            INVALID_CRC     /* must be last in the list for error check in setCRCMode */
+        } CRC_T;       
+         
+/** Transceiver state
+ * type covering the states of the transceiver
+ */
+        typedef enum
+        { 
+            RX,         /**< The tranceiver is in receive mode. Default mode. */
+            TX,         /**< The tranceiver is transmitting. */
+            STANDBY,    /**< The tranceiver goes into stanby mode. */
+            INVALID_STATE
+        } STATE_T;       
+               
+/** Data rate settings.
+ * Type covering the allowed settings for the tranceiver data rate.
+ */
+        typedef enum
+        {
+            BIT_RATE_250KBITS = 0x0,    /**< 250kbits data rate default */
+            BIT_RATE_1MBITS = 0x1,      /**< 1Mbit data rate */
+            INVALID_RATE                /* must be last in the list for error check on set data rate */  
+        } DATA_RATE_T;
+
+/** RF power settings
+ * Type covering the allowed settings for RF power
+ */
+        typedef enum
+        {
+            MINUS_TWENTY_DB = 0,     /**< -20dB */
+            MINUS_TEN_DB    = 1,     /**< -10dB */
+            MINUS_FIVE_DB   = 2,     /**< -5dB */
+            ZERO_DB         = 3,     /**< 0dB */
+            INVALID_POWER            /* must be last in the list for error check on set RF power */
+        } RF_POWER_T;
+
+/** Put the tranceiver into, or bring out of standby.
+ * Tx mode 10.5mA, RX mode 18mA, Standby 400nA.
+ * @param active set standby state
+ */
+        STATE_T standby_mode(bool active = true);
+        
+/**
+ *
+ */
+        typedef uint8_t address_t[5];
+        
+ /** Print control packet 
+ * Print the control packet to a serial port
+ * @param arg Pointer to the port to transmit on
+ * @return bool for correct parameters supplied
+ */          
+        bool printControlPacket(Serial& port);
+     
+/** Print data packet 
+ * Print the data packet to a serial port
+ * @param arg Pointer to the port to transmit on
+ * @return bool for correct parameters supplied
+ */  
+        bool printDataPacket(Serial& port);
+           
+/** Send the control packet to the nRF2401A.
+ * This function transfer the control packet image to the nRF2401A.
+ * @return bool for successfull flushing of the packet
+ */
+        bool flushControlPacket();
+         
+/** Register a receive action callback.
+ * Attach a callback that will be called when the tranceiver intercept a
+ * message. This callback will be called in the context of an interrupt
+ * routine and should act accordingly.
+ * @param handler The callback, of type nRF2401_rx_handler_t.
+ * @param arg Pointer to data supplied to the handler at call time.
+ * @return Reference to the invoked object (for chaining operations).
+ */     
+        bool attachRXHandler(nRF2401A_rx_handler_t handler, void *arg);
+ 
 /** Set the payload length, in bits.
  * Set the control packet field for length, in number of bits, of the message payload.
  * @param n Number of bits of the message payload.
- * @return Reference to the invoked object (for chaining operations).
+ * @return void
  */
-        nRF2401A& setDataPayloadLength(uint8_t n) 
-        { 
-            _ctrl_packet_buf.channel_1_data_payload_len = n; 
-            return *this; 
-        }
-        
+        void setDataPayloadLength(uint8_t n);
+                
 /** Set the address of channel 1.
  * The channel address is a up to 40 bit number identifying the tranceiver.
  * @param addr4 Bits 39-32 of the address.
@@ -220,105 +293,56 @@
  * @param n_bits Number of bits used in the address.
  * @return Reference to the invoked object (for chaining operations).
  */
-        nRF2401A& setAddress(uint8_t addr4, uint8_t addr3, uint8_t addr2, uint8_t addr1, uint8_t addr0, uint8_t n_bits)
-        {
-            _ctrl_packet_buf.channel_1_address[0] = addr4;
-            _ctrl_packet_buf.channel_1_address[1] = addr3;
-            _ctrl_packet_buf.channel_1_address[2] = addr2;
-            _ctrl_packet_buf.channel_1_address[3] = addr1;
-            _ctrl_packet_buf.channel_1_address[4] = addr0;
-            _ctrl_packet_buf.channel_address_len = n_bits;
-            
-            return *this;
-        }
-        
-/** CRC settings.
- * Type covering the allowed settings for use of CRC.
+        bool setAddress(uint8_t addr4, uint8_t addr3, uint8_t addr2, uint8_t addr1, uint8_t addr0, uint8_t n_bits);
+
+/** Set CRC use.
+ * Set the CRC mode field of the control packet. Defaults to no CRC.
+ * @param mode The CRC mode of choise.
+ * @return bool for correct parameter supplied
  */
-        typedef enum 
-        {
-            NO_CRC = 0x0,   /**< Do not use CRC. */
-            CRC_8 = 0x1,    /**< Use a 8-bit CRC. */
-            CRC_16 = 0x3    /**< Use a 16-bit CRC. */
-        } CRC_T;
-        typedef uint8_t read_msg;
-/** Set CRC use.
- * Set the CRC mode field of the control packet.
- * @param mode The CRC mode of choise.
- * @return Reference to the invoked object (for chaining operations).
+        bool setCRCMode(CRC_T mode); 
+ 
+ /** Set RF power use.
+ * Set the RF power field of the control packet. Defaults to full power.
+ * @param power The RF power of choice.
+ * @return bool for correct parameter supplied
  */
-        nRF2401A& setCRCMode(CRC_T mode) 
-        { 
-            _ctrl_packet_buf.crc_config = mode; 
-            return *this; 
-        }
-        
-/** Data rate settings.
- * Type covering the allowed settings for the tranceiver data rate.
- */
-        typedef enum
-        {
-            BIT_RATE_250KBITS = 0x0,    /**< */
-            BIT_RATE_1MBITS = 0x1       /**< */
-        } DATA_RATE_T;
-        
+        bool setRFpower(RF_POWER_T power); 
+ 
 /** Set tranceiver data rate.
  * Sets the data rate field to either 250 kbit/s or 1 Mbit/s data transfer rate.
+ * Defaults to 250 kbit/s.
  * @param mode The data rate of choise.
- * @return Reference to the invoked object (for chaining operations).
+ * @return bool for correct parameter supplied
  */
-        nRF2401A& setDataRate(DATA_RATE_T data_rate)
-        {
-            _ctrl_packet_buf.rf_data_rate = data_rate;
-            return *this;
-        }
+        bool setDataRate(DATA_RATE_T data_rate);
+
         
 /** Set RF channel.
  * Sets the control packet field for channel number. Channel numbers are from 0 to 127
- * representing channel frequencies equal to (2400 + channel number) MHz.
+ * representing channel frequencies equal to (2400 + channel number) MHz. Defaults to channel 1.
  * @param ch Channel number, from the range [0, 127].
- * @return Reference to the invoked object (for chaining operations).
+ * @return boolean to confirm valid parameters have been supplied
  */
-        nRF2401A& setChannel(uint8_t ch)
-        {
-            _ctrl_packet_buf.rf_channel = ch;
-            return *this;
-        }
-        
-/** Send the control packet to the nRF2401A.
- * This function transfer the control packet image to the nRF2401A.
- * @return Reference to the invoked object (for chaining operations).
- */
-        nRF2401A& flushControlPacket();
-        
-/** Put the tranceiver into, or bring out of standby.
- * Tx mode 10.5mA, RX mode 18mA, Standby 400nA.
- * @param active set standby state
- */
-        nRF2401A& standby_mode(bool active = true);
-        
-/**
- *
- */
-        typedef uint8_t address_t[5];
+        bool setChannel(uint8_t ch);
 
 /** Read a message.
  * This routine will transfer the data from the receive buffer to the buffer
  *  supplied. It will transfer a number of Bytes equal to the specified length.
  * @param msg_buf Message buffer.
- * @param msg_len Length of message,  in bits.
- * @return Reference to the invoked object (for chaining operations).
+ * @param msg_len Length of message,  in bytes.
+ * @return boolean to confirm if valid parameters have been supplied
  */
-        nRF2401A& readMsg( uint8_t *msg_buf, uint8_t msg_len );
+        bool readMsg( uint8_t *msg_buf, uint8_t msg_len );
 
 /** Read a byte from message.
  * This routine will transfer the data from the receive buffer to the buffer
  *  supplied. It will transfer one Bytes at index buf_index.
  * @param msg_buf Message body.
  * @param buf_index index of byte to be read.
- * @return Reference to the invoked object (for chaining operations).
+ * @return one Byte of the message buffer
  */
-        nRF2401A& readMsg_byte( uint8_t *msg_buf, uint8_t buf_index );
+        uint8_t readMsg_byte( uint8_t buf_index ); //uint8_t *msg_buf, 
          
 /** Send a message.
  * This routine will transfer the data from the supplied buffer and send
@@ -329,21 +353,8 @@
  * @param msg_len Length of message,  in bits.
  * @return Reference to the invoked object (for chaining operations).
  */
-        nRF2401A& sendMsg(address_t addr, uint8_t addr_len, uint8_t *msg_buf, uint8_t msg_len);
-        
-/** Register a receive action callback.
- * Attach a callback that will be called when the tranceiver intercept a
- * message. This callback will be called in the context of an interrupt
- * routine and should act accordingly.
- * @param handler The callback, of type nRF2401_rx_handler_t.
- * @param arg Pointer to data supplied to the handler at call time.
- * @return Reference to the invoked object (for chaining operations).
- */     
-        nRF2401A& attachRXHandler(nRF2401A_rx_handler_t handler, void *arg);
-        
-        void printControlPacket(Serial& port);
-        void printDataPacket(Serial& port);
-        
+        bool sendMsg(address_t addr, uint8_t addr_len, uint8_t *msg_buf, uint8_t msg_len);
+    
     private:
     
         DigitalOut      _ce;    /**< Chip Enable pin. */
@@ -352,18 +363,16 @@
         DigitalOut      _clk1;  /**< Clock 1 pin. */
         DigitalInOut    _data;  /**< Data pin. */
         
-/**
+
+/*
  *
  */
         typedef enum 
         { 
-            RX,         /**< The tranceiver is in receive mode. Default mode. */
-            TX,         /**< The tranceiver is transmitting. */
-            STANDBY     /**< The tranceiver goes into stanby mode. */
-        } STATE_T;
-        
-        STATE_T  _state;
-        
+            RX_MODE = 0x1, 
+            TX_MODE = 0x0 
+        } TXR_T;
+             
 /** Contol packet data.
  *
  */
@@ -386,32 +395,30 @@
             uint8_t     txr_switch : 1;                 /**< */
             uint8_t     rf_channel : 7;                 /**< */
             
-        }                                       _ctrl_packet_buf;   /**< */
+        }  _ctrl_packet_buf;   /**< */
         
         uint8_t         *_ctrl_packet;  /**< */
         
-        uint8_t         _data_buf[32];  /**< */       
+        uint8_t         _data_buf[DATA_BUFFER_SIZE];  /**< */       
+        
+        STATE_T  _state;
         
         nRF2401A_rx_handler_t   _rx_handler;        /**< */
         void                    *_rx_handler_arg;   /**< */
-        
+     
+         
 /** Receive ISR.
  * This handler is attached to the rising flank of the DR1 pin. It
  * will thus be called when the nRF2401A receives a packet in ShockBurst
  * mode (the mode used). It will in turn call the attached handler.
  */
         void dataReadyHandler(void);
-        
+           
 /**
  *
  */
         InterruptIn     _dr1_isr;
-        
-/*
- *
- */
-        typedef enum { RX_MODE = 0x1, TX_MODE = 0x0 } TXR_T;
-        
+  
 /** Write to the data bus.
  * Write n_bits bits on the DATA line.
  * @param buf Data buffer.