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.
Diff: nRFBareRadio.h
- Revision:
- 0:123cac2364c4
- Child:
- 1:fd37281bcdf7
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nRFBareRadio.h Fri May 17 13:36:56 2019 +0000 @@ -0,0 +1,186 @@ +/** + * @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 \ No newline at end of file