diff options
Diffstat (limited to 'peripheral/libupm/src/nrf24l01/nrf24l01.h')
-rw-r--r-- | peripheral/libupm/src/nrf24l01/nrf24l01.h | 431 |
1 files changed, 431 insertions, 0 deletions
diff --git a/peripheral/libupm/src/nrf24l01/nrf24l01.h b/peripheral/libupm/src/nrf24l01/nrf24l01.h new file mode 100644 index 0000000..0a468b8 --- /dev/null +++ b/peripheral/libupm/src/nrf24l01/nrf24l01.h @@ -0,0 +1,431 @@ +/* + * Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com> + * Copyright (c) 2014 Intel Corporation. + * BLE Beaconing based on http://dmitry.gr/index.php?r=05.Projects&proj=11.%20Bluetooth%20LE%20fakery + * + * 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. + */ +#pragma once + +#include <string> +#include <mraa/aio.hpp> +#include <mraa/common.hpp> + +#include <mraa/gpio.hpp> + +#include <mraa/spi.hpp> +#include <cstring> + +#if defined(SWIGJAVA) || defined(JAVACALLBACK) +#include "Callback.h" +#endif + +/* Memory Map */ +#define CONFIG 0x00 +#define EN_AA 0x01 +#define EN_RXADDR 0x02 +#define SETUP_AW 0x03 +#define SETUP_RETR 0x04 +#define RF_CH 0x05 +#define RF_SETUP 0x06 +#define STATUS 0x07 +#define OBSERVE_TX 0x08 +#define CD 0x09 +#define RX_ADDR_P0 0x0A +#define RX_ADDR_P1 0x0B +#define RX_ADDR_P2 0x0C +#define RX_ADDR_P3 0x0D +#define RX_ADDR_P4 0x0E +#define RX_ADDR_P5 0x0F +#define TX_ADDR 0x10 +#define RX_PW_P0 0x11 +#define RX_PW_P1 0x12 +#define RX_PW_P2 0x13 +#define RX_PW_P3 0x14 +#define RX_PW_P4 0x15 +#define RX_PW_P5 0x16 +#define FIFO_STATUS 0x17 +#define DYNPD 0x1C +#define FEATURE 0x1D + +/* Bit Mnemonics */ +#define MASK_RX_DR 6 +#define MASK_TX_DS 5 +#define MASK_MAX_RT 4 +#define EN_CRC 3 +#define CRCO 2 +#define PWR_UP 1 +#define PRIM_RX 0 +#define ENAA_P5 5 +#define ENAA_P4 4 +#define ENAA_P3 3 +#define ENAA_P2 2 +#define ENAA_P1 1 +#define ENAA_P0 0 +#define ERX_P5 5 +#define ERX_P4 4 +#define ERX_P3 3 +#define ERX_P2 2 +#define ERX_P1 1 +#define ERX_P0 0 +#define AW 0 +#define ARD 4 +#define ARC 0 +#define PLL_LOCK 4 +#define RF_DR 3 +#define RF_PWR 1 +#define LNA_HCURR 0 +#define RX_DR 6 +#define TX_DS 5 +#define MAX_RT 4 +#define RX_P_NO 1 +#define TX_FULL 0 +#define PLOS_CNT 4 +#define ARC_CNT 0 +#define TX_REUSE 6 +#define FIFO_FULL 5 +#define TX_EMPTY 4 +#define RX_FULL 1 +#define RX_EMPTY 0 + +/* Instruction Mnemonics */ +#define R_REGISTER 0x00 +#define W_REGISTER 0x20 +#define REGISTER_MASK 0x1F +#define R_RX_PAYLOAD 0x61 +#define W_TX_PAYLOAD 0xA0 +#define FLUSH_TX 0xE1 +#define FLUSH_RX 0xE2 +#define REUSE_TX_PL 0xE3 +#define NOP 0xFF + +#define RF_DR_LOW 5 +#define RF_DR_HIGH 3 +#define RF_PWR_LOW 1 +#define RF_PWR_HIGH 2 + +/* Nrf24l settings */ +#define ADDR_LEN 5 +#define _CONFIG ((1<<EN_CRC) | (0<<CRCO) ) + +#define MAX_BUFFER 32 + +#define HIGH 1 +#define LOW 0 + +/* BLE beaconing */ +#define BLE_MAC_0 0xEF +#define BLE_MAC_1 0xFF +#define BLE_MAC_2 0xC0 +#define BLE_MAC_3 0xAA +#define BLE_MAC_4 0x18 +#define BLE_MAC_5 0x00 + +#define BLE_PAYLOAD_OFFSET 13 + +namespace upm { + +#if defined(SWIGJAVA) || defined(JAVACALLBACK) +typedef void (* funcPtrVoidVoid) (Callback *); +#else +typedef void (* funcPtrVoidVoid) (); +#endif + +typedef enum { + NRF_250KBPS = 0, + NRF_1MBPS = 1, + NRF_2MBPS = 2, +} speed_rate_t; + +typedef enum { + NRF_0DBM = 0, + NRF_6DBM = 1, + NRF_12DBM = 2, + NRF_18DBM = 3, +} power_t; + +/** + * @brief NRF24L01 Transceiver library + * @defgroup nrf24l01 libupm-nrf24l01 + * @ingroup seeed sparkfun spi wifi + */ +/** + * @library nrf24l01 + * @sensor nrf24l01 + * @comname NRF24L01 Transceiver + * @type wifi + * @man seeed sparkfun + * @web http://www.seeedstudio.com/depot/nRF24L01Module-p-1394.html + * @con spi + * + * id + * @brief API for the NRF24L01 Transceiver Module + * + * This module defines the NRF24L01 interface for libnrf24l01 + * + * @image html nrf24l01.jpg + * @snippet nrf24l01-receiver.cxx Interesting + * @snippet nrf24l01-transmitter.cxx Interesting + * @snippet nrf24l01-broadcast.cxx Interesting + */ +class NRF24L01 { + public: + /** + * Instantiates an NRF24l01 object + * + * @param cs Chip select pin + */ + NRF24L01 (uint8_t cs, uint8_t ce); + + /** + * Returns the name of the component + */ + std::string name() + { + return m_name; + } + + /** + * Initializes needed GPIO pins and SPI + * + * @param chipSelect Sets up the chip select pin + * @param chipEnable Sets up the chip enable pin + */ + void init (uint8_t chipSelect, uint8_t chipEnable); + + /** + * Configures the NRF24L01 transceiver + */ + void configure (); + + /** + * Sends the buffer data + * + * @param *value Pointer to the buffer + */ + void send (uint8_t * value); + + /** + * Sends the data located in an inner bufer; the user must fill the + * m_txBuffer buffer + */ + void send (); + + /** + * Sets a receiving address of the device + * + * @param addr 5-byte address + */ + void setSourceAddress (uint8_t * addr); + + /** + * Sets a recipient address. The nrfSend method sends the data buffer + * to this address + * + * @param addr 5-byte address + */ + void setDestinationAddress (uint8_t * addr); + + /** + * Sets a broadcasting address + * + * @param addr 5-byte address + */ + void setBroadcastAddress (uint8_t * addr); + + /** + * Sets the payload size + * + * @param load Size of the payload (MAX 32) + */ + void setPayload (uint8_t load); + +#if defined(SWIGJAVA) || defined(JAVACALLBACK) + /** + * Sets the handler to be called when data has been + * received + * @param call_obj Object used for callback - Java + */ + void setDataReceivedHandler (Callback *call_obj); +#else + /** + * Sets the handler to be called when data has been + * received + * @param handler Handler used for callback + */ + void setDataReceivedHandler (funcPtrVoidVoid handler); +#endif + /** + * Checks if the data has arrived + */ + bool dataReady (); + + /** + * Checks if the transceiver is in the sending mode + */ + bool dataSending (); + + /** + * Sinks all the arrived data into a provided buffer + * + * @param load Size of the payload (MAX 32) + */ + void getData (uint8_t * data); + + /** + * Checks the transceiver state + */ + uint8_t getStatus (); + + /** + * Checks if the receive stack is empty + */ + bool rxFifoEmpty (); + + /** + * Powers the receiver up + */ + void rxPowerUp (); + + /** + * Flushes the receive stack + */ + void rxFlushBuffer (); + + /** + * Powers the transmitter up + */ + void txPowerUp (); + + /** + * Powers everything down + */ + void powerDown (); + + void setChannel (uint8_t channel); + + void setPower (power_t power); + + uint8_t setSpeedRate (speed_rate_t rate); + + /** + * Flushes the transmit stack + */ + void txFlushBuffer (); + + /** + * Pulling the method listening for the arrived data, + * dataRecievedHandler is triggered if data arrives + */ + void pollListener (); + + /** + * Sets the chip enable pin to HIGH + */ + mraa::Result ceHigh (); + + /** + * Sets the chip enable pin to LOW + */ + mraa::Result ceLow (); + + /** + * Sets the chip select pin to LOW + */ + mraa::Result csOn (); + + /** + * Sets the chip select pin to HIGH + */ + mraa::Result csOff (); + + /** + * Configures the NRF24L01 transceiver to behave as a BLE + * (Bluetooth Low Energy) beaconing devcie. + */ + void setBeaconingMode (); + + /** + * Beacons the provided message to BLE scanners. + * + * @param msg Beacons the provided message (max length is 16 bytes) + */ + void sendBeaconingMsg (uint8_t * msg); + + uint8_t m_rxBuffer[MAX_BUFFER]; /**< Receive buffer */ + uint8_t m_txBuffer[MAX_BUFFER]; /**< Transmit buffer */ + uint8_t m_bleBuffer [32]; /**< BLE buffer */ + + private: +#if defined(SWIGJAVA) || defined(JAVACALLBACK) + /**< Callback object to use for setting the handler from Java */ + Callback *callback_obj; +#endif + funcPtrVoidVoid dataReceivedHandler; /**< Data arrived handler */ + + /** + * Writes bytes to an SPI device + */ + void writeBytes (uint8_t * dataout, uint8_t * datain, uint8_t len); + /** + * Sets the register value on an SPI device [one byte] + */ + void setRegister (uint8_t reg, uint8_t value); + /** + * Gets the register value from an SPI device [one byte] + */ + uint8_t getRegister (uint8_t reg); + /** + * Reads an array of bytes from the given starting position in NRF24L01 registers + */ + void readRegister (uint8_t reg, uint8_t * value, uint8_t len); + /** + * Writes an array of bytes into NRF24L01 registers + */ + void writeRegister (uint8_t reg, uint8_t * value, uint8_t len); + /** + * Sends a command to NRF24L01 + */ + void sendCommand (uint8_t cmd); + + void bleCrc (const uint8_t* data, uint8_t len, uint8_t* dst); + + void bleWhiten (uint8_t* data, uint8_t len, uint8_t whitenCoeff); + + void blePacketEncode(uint8_t* packet, uint8_t len, uint8_t chan); + + uint8_t swapbits (uint8_t a); + + mraa::Spi m_spi; + uint8_t m_ce; + uint8_t m_csn; + uint8_t m_channel; + uint8_t m_power; + uint8_t m_ptx; + uint8_t m_payload; + uint8_t m_localAddress[5]; + + mraa::Gpio m_csnPinCtx; + mraa::Gpio m_cePinCtx; + + std::string m_name; +}; + +} |