upm  0.2.0
Sensor/Actuator repository for libmraa (v0.6.1)
nrf24l01.h
1 /*
2  * Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
3  * Copyright (c) 2014 Intel Corporation.
4  * BLE Beaconing based on http://dmitry.gr/index.php?r=05.Projects&proj=11.%20Bluetooth%20LE%20fakery
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining
7  * a copy of this software and associated documentation files (the
8  * "Software"), to deal in the Software without restriction, including
9  * without limitation the rights to use, copy, modify, merge, publish,
10  * distribute, sublicense, and/or sell copies of the Software, and to
11  * permit persons to whom the Software is furnished to do so, subject to
12  * the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be
15  * included in all copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24  */
25 #pragma once
26 
27 #include <string>
28 #include <mraa/aio.h>
29 #include <mraa/gpio.h>
30 #include <mraa/spi.h>
31 #include <cstring>
32 
33 /* Memory Map */
34 #define CONFIG 0x00
35 #define EN_AA 0x01
36 #define EN_RXADDR 0x02
37 #define SETUP_AW 0x03
38 #define SETUP_RETR 0x04
39 #define RF_CH 0x05
40 #define RF_SETUP 0x06
41 #define STATUS 0x07
42 #define OBSERVE_TX 0x08
43 #define CD 0x09
44 #define RX_ADDR_P0 0x0A
45 #define RX_ADDR_P1 0x0B
46 #define RX_ADDR_P2 0x0C
47 #define RX_ADDR_P3 0x0D
48 #define RX_ADDR_P4 0x0E
49 #define RX_ADDR_P5 0x0F
50 #define TX_ADDR 0x10
51 #define RX_PW_P0 0x11
52 #define RX_PW_P1 0x12
53 #define RX_PW_P2 0x13
54 #define RX_PW_P3 0x14
55 #define RX_PW_P4 0x15
56 #define RX_PW_P5 0x16
57 #define FIFO_STATUS 0x17
58 #define DYNPD 0x1C
59 #define FEATURE 0x1D
60 
61 /* Bit Mnemonics */
62 #define MASK_RX_DR 6
63 #define MASK_TX_DS 5
64 #define MASK_MAX_RT 4
65 #define EN_CRC 3
66 #define CRCO 2
67 #define PWR_UP 1
68 #define PRIM_RX 0
69 #define ENAA_P5 5
70 #define ENAA_P4 4
71 #define ENAA_P3 3
72 #define ENAA_P2 2
73 #define ENAA_P1 1
74 #define ENAA_P0 0
75 #define ERX_P5 5
76 #define ERX_P4 4
77 #define ERX_P3 3
78 #define ERX_P2 2
79 #define ERX_P1 1
80 #define ERX_P0 0
81 #define AW 0
82 #define ARD 4
83 #define ARC 0
84 #define PLL_LOCK 4
85 #define RF_DR 3
86 #define RF_PWR 1
87 #define LNA_HCURR 0
88 #define RX_DR 6
89 #define TX_DS 5
90 #define MAX_RT 4
91 #define RX_P_NO 1
92 #define TX_FULL 0
93 #define PLOS_CNT 4
94 #define ARC_CNT 0
95 #define TX_REUSE 6
96 #define FIFO_FULL 5
97 #define TX_EMPTY 4
98 #define RX_FULL 1
99 #define RX_EMPTY 0
100 
101 /* Instruction Mnemonics */
102 #define R_REGISTER 0x00
103 #define W_REGISTER 0x20
104 #define REGISTER_MASK 0x1F
105 #define R_RX_PAYLOAD 0x61
106 #define W_TX_PAYLOAD 0xA0
107 #define FLUSH_TX 0xE1
108 #define FLUSH_RX 0xE2
109 #define REUSE_TX_PL 0xE3
110 #define NOP 0xFF
111 
112 #define RF_DR_LOW 5
113 #define RF_DR_HIGH 3
114 #define RF_PWR_LOW 1
115 #define RF_PWR_HIGH 2
116 
117 /* Nrf24l settings */
118 #define ADDR_LEN 5
119 #define _CONFIG ((1<<EN_CRC) | (0<<CRCO) )
120 
121 #define MAX_BUFFER 32
122 
123 #define HIGH 1
124 #define LOW 0
125 
126 /* BLE beaconing */
127 #define BLE_MAC_0 0xEF
128 #define BLE_MAC_1 0xFF
129 #define BLE_MAC_2 0xC0
130 #define BLE_MAC_3 0xAA
131 #define BLE_MAC_4 0x18
132 #define BLE_MAC_5 0x00
133 
134 #define BLE_PAYLOAD_OFFSET 13
135 
136 namespace upm {
137 
138 typedef void (* funcPtrVoidVoid) ();
139 
140 typedef enum {
141  NRF_250KBPS = 0,
142  NRF_1MBPS = 1,
143  NRF_2MBPS = 2,
144 } speed_rate_t;
145 
146 typedef enum {
147  NRF_0DBM = 0,
148  NRF_6DBM = 1,
149  NRF_12DBM = 2,
150  NRF_18DBM = 3,
151 } power_t;
152 
176 class NRF24L01 {
177  public:
183  NRF24L01 (uint8_t cs, uint8_t ce);
184 
188  ~NRF24L01 ();
189 
193  std::string name()
194  {
195  return m_name;
196  }
197 
204  void init (uint8_t chipSelect, uint8_t chipEnable);
205 
209  void configure ();
210 
216  void send (uint8_t * value);
217 
222  void send ();
223 
229  void setSourceAddress (uint8_t * addr);
230 
237  void setDestinationAddress (uint8_t * addr);
238 
244  void setBroadcastAddress (uint8_t * addr);
245 
251  void setPayload (uint8_t load);
252 
256  bool dataReady ();
257 
261  bool dataSending ();
262 
268  void getData (uint8_t * data);
269 
273  uint8_t getStatus ();
274 
278  bool rxFifoEmpty ();
279 
283  void rxPowerUp ();
284 
288  void rxFlushBuffer ();
289 
293  void txPowerUp ();
294 
298  void powerDown ();
299 
300  void setChannel (uint8_t channel);
301 
302  void setPower (power_t power);
303 
304  uint8_t setSpeedRate (speed_rate_t rate);
305 
309  void txFlushBuffer ();
310 
315  void pollListener ();
316 
320  mraa_result_t ceHigh ();
321 
325  mraa_result_t ceLow ();
326 
330  mraa_result_t csOn ();
331 
335  mraa_result_t csOff ();
336 
341  void setBeaconingMode ();
342 
348  void sendBeaconingMsg (uint8_t * msg);
349 
350  uint8_t m_rxBuffer[MAX_BUFFER];
351  uint8_t m_txBuffer[MAX_BUFFER];
352  uint8_t m_bleBuffer [32];
354  funcPtrVoidVoid dataRecievedHandler;
355  private:
359  void writeBytes (uint8_t * dataout, uint8_t * datain, uint8_t len);
363  void setRegister (uint8_t reg, uint8_t value);
367  uint8_t getRegister (uint8_t reg);
371  void readRegister (uint8_t reg, uint8_t * value, uint8_t len);
375  void writeRegister (uint8_t reg, uint8_t * value, uint8_t len);
379  void sendCommand (uint8_t cmd);
380 
381  void bleCrc (const uint8_t* data, uint8_t len, uint8_t* dst);
382 
383  void bleWhiten (uint8_t* data, uint8_t len, uint8_t whitenCoeff);
384 
385  void blePacketEncode(uint8_t* packet, uint8_t len, uint8_t chan);
386 
387  uint8_t swapbits (uint8_t a);
388 
389  mraa_spi_context m_spi;
390  uint8_t m_ce;
391  uint8_t m_csn;
392  uint8_t m_channel;
393  uint8_t m_power;
394  uint8_t m_ptx;
395  uint8_t m_payload;
396  uint8_t m_localAddress[5];
397 
398  mraa_gpio_context m_csnPinCtx;
399  mraa_gpio_context m_cePinCtx;
400 
401  std::string m_name;
402 };
403 
404 }
bool rxFifoEmpty()
Definition: nrf24l01.cxx:217
uint8_t m_bleBuffer[32]
Definition: nrf24l01.h:352
bool dataReady()
Definition: nrf24l01.cxx:164
void txFlushBuffer()
Definition: nrf24l01.cxx:335
void configure()
Definition: nrf24l01.cxx:92
void sendBeaconingMsg(uint8_t *msg)
Definition: nrf24l01.cxx:377
void send()
Definition: nrf24l01.cxx:137
void powerDown()
Definition: nrf24l01.cxx:243
void setBroadcastAddress(uint8_t *addr)
Definition: nrf24l01.cxx:154
void init(uint8_t chipSelect, uint8_t chipEnable)
Definition: nrf24l01.cxx:56
void rxPowerUp()
Definition: nrf24l01.cxx:223
mraa_result_t csOn()
Definition: nrf24l01.cxx:317
void getData(uint8_t *data)
Definition: nrf24l01.cxx:192
std::string name()
Definition: nrf24l01.h:193
void setDestinationAddress(uint8_t *addr)
Definition: nrf24l01.cxx:149
void rxFlushBuffer()
Definition: nrf24l01.cxx:232
mraa_result_t csOff()
Definition: nrf24l01.cxx:322
Definition: a110x.h:29
void setBeaconingMode()
Definition: nrf24l01.cxx:340
mraa_result_t ceLow()
Definition: nrf24l01.cxx:312
funcPtrVoidVoid dataRecievedHandler
Definition: nrf24l01.h:354
void setPayload(uint8_t load)
Definition: nrf24l01.cxx:159
uint8_t m_txBuffer[MAX_BUFFER]
Definition: nrf24l01.h:351
void txPowerUp()
Definition: nrf24l01.cxx:237
bool dataSending()
Definition: nrf24l01.cxx:177
C++ API for NRF24l01 transceiver module.
Definition: nrf24l01.h:176
mraa_result_t ceHigh()
Definition: nrf24l01.cxx:307
void pollListener()
Definition: nrf24l01.cxx:327
uint8_t getStatus()
Definition: nrf24l01.cxx:212
NRF24L01(uint8_t cs, uint8_t ce)
Definition: nrf24l01.cxx:34
void setSourceAddress(uint8_t *addr)
Definition: nrf24l01.cxx:142
uint8_t m_rxBuffer[MAX_BUFFER]
Definition: nrf24l01.h:350
~NRF24L01()
Definition: nrf24l01.cxx:39