nRFBareRadio is a library to use the Radio peripheral in a nRF51 or nRF52 Nordic microcontroller in "bare" mode transmitting raw packets, instead of the usual BLE protocols.

nRFBareRadio.h

Committer:
fbcosentino
Date:
2019-05-17
Revision:
0:123cac2364c4
Child:
1:fd37281bcdf7

File content as of revision 0:123cac2364c4:

/** 
 *  @file nRFBareRadio.h
 *  @brief nRFBareRadio is a library to use the Radio peripheral in a 
 *  nRF51 or nRF52 Nordic microcontroller in "bare" mode transmitting
 *  raw packets, instead of the usual BLE protocols.
 * 
 *  @author Fernando Cosentino
 *  @author Uses some code from a version by Manuel Caballero
 *  (https://os.mbed.com/users/mcm/)
 */

#ifndef __NRFBARERADIO
#define __NRFBARERADIO

#include "mbed.h"

#define RADIO_MODE_RX 0
#define RADIO_MODE_TX 1

#define RADIO_RATE_1M   RADIO_MODE_MODE_Nrf_1Mbit
#define RADIO_RATE_2M   RADIO_MODE_MODE_Nrf_2Mbit
#define RADIO_RATE_250K RADIO_MODE_MODE_Nrf_250Kbit

#define RADIO_WHITENING    RADIO_PCNF1_WHITEEN_Enabled
#define RADIO_NO_WHITENING RADIO_PCNF1_WHITEEN_Disabled

#define RADIO_LITTLEENDIAN RADIO_PCNF1_ENDIAN_Little
#define RADIO_BIGENDIAN    RADIO_PCNF1_ENDIAN_Big

#define RADIO_TX_0dBm     RADIO_TXPOWER_TXPOWER_0dBm
#define RADIO_TX_N4dBm    RADIO_TXPOWER_TXPOWER_Neg4dBm
#define RADIO_TX_N12dBm   RADIO_TXPOWER_TXPOWER_Neg12dBm
#define RADIO_TX_N20dBm   RADIO_TXPOWER_TXPOWER_Neg20dBm
#define RADIO_TX_N40dBm   RADIO_TXPOWER_TXPOWER_Neg40dBm
#define RADIO_TX_P4dBm    RADIO_TXPOWER_TXPOWER_Pos4dBm // WARNING: 
                             // +4dBm could be against regulations in some areas


/**
 *  RadioAddress is a struct type for storing transmit and receive addresses,
 *  being used as argument to configure a radio.
 */
typedef struct RadioAddress {
    unsigned char A0;
    unsigned char A1;
    unsigned char A2;
    unsigned char A3;
    unsigned char A4;
} RadioAddress;

/**
 *  RadioConfig holds various setup parameters, being used as argument to 
 *  configure a radio. All have default values, so you can get a radio up and 
 *  running without touching anything.
 */
class RadioConfig {
public:
    RadioConfig();
    
    /** Center frequency the radio will operate at in MHz, with 2400MHz offset
     *  (that is, a value of 35 means the radio will operate at 2435MHz).
     *  Must be in range 0-100 and defaults to 2 (2402MHz). */
    int frequency;
    
    /** Data rate (band width around the center frequency) in MHz.
     *  Possible values are RADIO_RATE_1M, RADIO_RATE_2M (default) 
     *  or RADIO_RATE_250K (deprecated). */
    int rate;
    
    /** Packet payload size in bytes, must be in the range 0-32. This library
     *  uses static payload size only. If your payload varies, use the largest
     *  possible length and leave unused bytes in the packet. */
    int data_length;
    
    /** Length of the address field in bytes, must be in the range 3-5. This
     *  library supports one endpoint only (logic address 0). */
    int address_length;
    
    /** Power level used in transmit mode. Possible values are
     *  RADIO_TX_0dBm (default) for 0dBm, 
     *  RADIO_TX_N4dBm for -4dBm,
     *  RADIO_TX_N12dBm for -12 dBm,
     *  RADIO_TX_N20dBm for -20 dBm,
     *  RADIO_TX_N40dBm for -40 dBm,
     *  RADIO_TX_P4dBm for +4dBm,
     *  or any constant from the nRF SDK 
     *  (example: RADIO_TXPOWER_TXPOWER_Neg8dBm). */
    int tx_power;
    
    /** Either to use data whitening or not. Possible values are RADIO_WHITENING
     *  or RADIO_NO_WHITENING (default). Data whitening is not compatible to 
     *  nRF24 chipsets. */
    int use_whitening;
    
    /** Data endianness for both the address and payload. Possible values are
     *  RADIO_LITTLEENDIAN or RADIO_BIGENDIAN (default). For nRF24 compatibility
     *  it must be RADIO_BIGENDIAN. */
    int endianness;
    
    /** CRC polynomial, fixed at a 16bit length in this library. Default 0x1021
     *  (compatible to nRF24). */
    unsigned int crc_poly;
    
    /** CRC initial value, fixed at a 16bit length in this library.
     *  Default 0xFFFF (compatible to nRF24). */
    unsigned int crc_init;
};

/** 
 *  BareRadio represents and controls the RADIO peripheral in a nRF51 or nRF52
 *  Nordic microcontroller. Should be initialised with a RadioAddress and a
 *  RadioConfig objects.
 */
class BareRadio {
public:
    /** Initialises a BareRadio instance. */
    BareRadio();
    
    /** Configures the high speed clock. You don't have to call this manually
     *  since it's called by the constructor on instantiation. 
     *
     *  @returns 1 if the clock was successfully configured, 0 on task timeout.
     */
    int ConfigClock();
    
    /** Configures the radio at either a transmitter or a receiver,
     *  using a supplied address and configuration objects.
     *
     *  @param mode The radio mode, either RADIO_MODE_RX or RADIO_MODE_TX
     *  @param address A RadioAddress object previously filled
     *  @param config A RadioConfig object previously configured
     */
    void Setup(int mode, RadioAddress address, RadioConfig& config);
    
    /** Transmits a packet using data from a supplied buffer, which must be 
     *  at least as long as the data length configured.
     *
     *  @param data The buffer as array of char or array of unsigned char
     */
    void Transmit(char * data);
    void Transmit(unsigned char * data);
    
    /** Checks if a packet was received, and if received fills the supplied
     *  buffer with the corresponding data. If no packet was received, the
     *  the buffer is kept unchanged.
     *
     *  @param data The buffer to be filled as array of char or array of
     *  unsigned char
     *  @returns 1 if a packet was received and the buffer was changed, 
     *  0 otherwise
     */
    int Receive(char * data);
    int Receive(unsigned char * data);
    

private:
    unsigned char packet[32];
    int data_len;
};


























#endif