stable library for the Nordic NRF24L01+ radio transciever
nrf24l01p.h@0:795de307e97f, 2016-11-21 (annotated)
- Committer:
- emoninet2
- Date:
- Mon Nov 21 19:39:46 2016 +0000
- Revision:
- 0:795de307e97f
ported NRF24L01P library for the mbed after converting to c++ class
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
emoninet2 | 0:795de307e97f | 1 | /* |
emoninet2 | 0:795de307e97f | 2 | * nrf24l01p.h |
emoninet2 | 0:795de307e97f | 3 | * |
emoninet2 | 0:795de307e97f | 4 | * Created: 29-Mar-16 10:57:14 PM |
emoninet2 | 0:795de307e97f | 5 | * Author: emon1 |
emoninet2 | 0:795de307e97f | 6 | */ |
emoninet2 | 0:795de307e97f | 7 | |
emoninet2 | 0:795de307e97f | 8 | |
emoninet2 | 0:795de307e97f | 9 | #ifndef __NRF24L01P_H__ |
emoninet2 | 0:795de307e97f | 10 | #define __NRF24L01P_H__ |
emoninet2 | 0:795de307e97f | 11 | |
emoninet2 | 0:795de307e97f | 12 | #include "mbed.h" |
emoninet2 | 0:795de307e97f | 13 | //#include "nrf24l01p_arch_driver.h" |
emoninet2 | 0:795de307e97f | 14 | |
emoninet2 | 0:795de307e97f | 15 | |
emoninet2 | 0:795de307e97f | 16 | |
emoninet2 | 0:795de307e97f | 17 | #define _nrf24l01p_delay_us wait_us |
emoninet2 | 0:795de307e97f | 18 | #define _nrf24l01p_delay_ms wait_ms |
emoninet2 | 0:795de307e97f | 19 | |
emoninet2 | 0:795de307e97f | 20 | |
emoninet2 | 0:795de307e97f | 21 | #define set_bit(reg,bit) reg|= (1<<bit) |
emoninet2 | 0:795de307e97f | 22 | #define clr_bit(reg,bit) reg&= ~(1<<bit) |
emoninet2 | 0:795de307e97f | 23 | #define tgl_bit(reg,bit) reg^= (1<<bit) |
emoninet2 | 0:795de307e97f | 24 | |
emoninet2 | 0:795de307e97f | 25 | |
emoninet2 | 0:795de307e97f | 26 | #define _NRF24L01P_TX_FIFO_COUNT 3 |
emoninet2 | 0:795de307e97f | 27 | #define _NRF24L01P_RX_FIFO_COUNT 3 |
emoninet2 | 0:795de307e97f | 28 | |
emoninet2 | 0:795de307e97f | 29 | #define _NRF24L01P_TX_FIFO_SIZE 32 |
emoninet2 | 0:795de307e97f | 30 | #define _NRF24L01P_RX_FIFO_SIZE 32 |
emoninet2 | 0:795de307e97f | 31 | |
emoninet2 | 0:795de307e97f | 32 | #define _NRF24L01P_SPI_MAX_DATA_RATE 10000000 |
emoninet2 | 0:795de307e97f | 33 | |
emoninet2 | 0:795de307e97f | 34 | |
emoninet2 | 0:795de307e97f | 35 | |
emoninet2 | 0:795de307e97f | 36 | #define _NRF24L01P_EN_AA_NONE 0 |
emoninet2 | 0:795de307e97f | 37 | #define _NRF24L01P_EN_RXADDR_NONE 0 |
emoninet2 | 0:795de307e97f | 38 | #define _NRF24L01P_SETUP_AW_AW_MASK (0x3<<0) |
emoninet2 | 0:795de307e97f | 39 | |
emoninet2 | 0:795de307e97f | 40 | #define _NRF24L01P_MIN_RF_FREQUENCY 2400 |
emoninet2 | 0:795de307e97f | 41 | #define _NRF24L01P_MAX_RF_FREQUENCY 2525 |
emoninet2 | 0:795de307e97f | 42 | #define _NRF24L01P_DUMMYBYTE 0x65 |
emoninet2 | 0:795de307e97f | 43 | |
emoninet2 | 0:795de307e97f | 44 | |
emoninet2 | 0:795de307e97f | 45 | /** @name NRF24L01+ commands |
emoninet2 | 0:795de307e97f | 46 | * These are the commands |
emoninet2 | 0:795de307e97f | 47 | */ |
emoninet2 | 0:795de307e97f | 48 | /**@{*/ |
emoninet2 | 0:795de307e97f | 49 | #define _NRF24L01P_SPI_CMD_RD_REG 0x00 |
emoninet2 | 0:795de307e97f | 50 | #define _NRF24L01P_SPI_CMD_WR_REG 0x20 |
emoninet2 | 0:795de307e97f | 51 | #define _NRF24L01P_SPI_CMD_RD_RX_PAYLOAD 0x61 |
emoninet2 | 0:795de307e97f | 52 | #define _NRF24L01P_SPI_CMD_WR_TX_PAYLOAD 0xa0 |
emoninet2 | 0:795de307e97f | 53 | #define _NRF24L01P_SPI_CMD_FLUSH_TX 0xe1 |
emoninet2 | 0:795de307e97f | 54 | #define _NRF24L01P_SPI_CMD_FLUSH_RX 0xe2 |
emoninet2 | 0:795de307e97f | 55 | #define _NRF24L01P_SPI_CMD_REUSE_TX_PL 0xe3 |
emoninet2 | 0:795de307e97f | 56 | #define _NRF24L01P_SPI_CMD_R_RX_PL_WID 0x60 |
emoninet2 | 0:795de307e97f | 57 | #define _NRF24L01P_SPI_CMD_W_ACK_PAYLOAD 0xa8 |
emoninet2 | 0:795de307e97f | 58 | #define _NRF24L01P_SPI_CMD_W_TX_PYLD_NO_ACK 0xb0 |
emoninet2 | 0:795de307e97f | 59 | #define _NRF24L01P_SPI_CMD_NOP 0xff |
emoninet2 | 0:795de307e97f | 60 | /**@}*/ |
emoninet2 | 0:795de307e97f | 61 | |
emoninet2 | 0:795de307e97f | 62 | /** @name NRF24L01+ register address |
emoninet2 | 0:795de307e97f | 63 | * These are the registers |
emoninet2 | 0:795de307e97f | 64 | */ |
emoninet2 | 0:795de307e97f | 65 | /**@{*/ |
emoninet2 | 0:795de307e97f | 66 | #define _NRF24L01P_REG_CONFIG 0x00 |
emoninet2 | 0:795de307e97f | 67 | #define _NRF24L01P_REG_EN_AA 0x01 |
emoninet2 | 0:795de307e97f | 68 | #define _NRF24L01P_REG_EN_RXADDR 0x02 |
emoninet2 | 0:795de307e97f | 69 | #define _NRF24L01P_REG_SETUP_AW 0x03 |
emoninet2 | 0:795de307e97f | 70 | #define _NRF24L01P_REG_SETUP_RETR 0x04 |
emoninet2 | 0:795de307e97f | 71 | #define _NRF24L01P_REG_RF_CH 0x05 |
emoninet2 | 0:795de307e97f | 72 | #define _NRF24L01P_REG_RF_SETUP 0x06 |
emoninet2 | 0:795de307e97f | 73 | #define _NRF24L01P_REG_STATUS 0x07 |
emoninet2 | 0:795de307e97f | 74 | #define _NRF24L01P_REG_OBSERVE_TX 0x08 |
emoninet2 | 0:795de307e97f | 75 | #define _NRF24L01P_REG_RPD 0x09 |
emoninet2 | 0:795de307e97f | 76 | #define _NRF24L01P_REG_RX_ADDR_P0 0x0a |
emoninet2 | 0:795de307e97f | 77 | #define _NRF24L01P_REG_RX_ADDR_P1 0x0b |
emoninet2 | 0:795de307e97f | 78 | #define _NRF24L01P_REG_RX_ADDR_P2 0x0c |
emoninet2 | 0:795de307e97f | 79 | #define _NRF24L01P_REG_RX_ADDR_P3 0x0d |
emoninet2 | 0:795de307e97f | 80 | #define _NRF24L01P_REG_RX_ADDR_P4 0x0e |
emoninet2 | 0:795de307e97f | 81 | #define _NRF24L01P_REG_RX_ADDR_P5 0x0f |
emoninet2 | 0:795de307e97f | 82 | #define _NRF24L01P_REG_TX_ADDR 0x10 |
emoninet2 | 0:795de307e97f | 83 | #define _NRF24L01P_REG_RX_PW_P0 0x11 |
emoninet2 | 0:795de307e97f | 84 | #define _NRF24L01P_REG_RX_PW_P1 0x12 |
emoninet2 | 0:795de307e97f | 85 | #define _NRF24L01P_REG_RX_PW_P2 0x13 |
emoninet2 | 0:795de307e97f | 86 | #define _NRF24L01P_REG_RX_PW_P3 0x14 |
emoninet2 | 0:795de307e97f | 87 | #define _NRF24L01P_REG_RX_PW_P4 0x15 |
emoninet2 | 0:795de307e97f | 88 | #define _NRF24L01P_REG_RX_PW_P5 0x16 |
emoninet2 | 0:795de307e97f | 89 | #define _NRF24L01P_REG_FIFO_STATUS 0x17 |
emoninet2 | 0:795de307e97f | 90 | #define _NRF24L01P_REG_DYNPD 0x1c |
emoninet2 | 0:795de307e97f | 91 | #define _NRF24L01P_REG_FEATURE 0x1d |
emoninet2 | 0:795de307e97f | 92 | #define _NRF24L01P_REG_ADDRESS_MASK 0x1f |
emoninet2 | 0:795de307e97f | 93 | /**@}*/ |
emoninet2 | 0:795de307e97f | 94 | |
emoninet2 | 0:795de307e97f | 95 | |
emoninet2 | 0:795de307e97f | 96 | |
emoninet2 | 0:795de307e97f | 97 | /** @name NRF24L01+ config address |
emoninet2 | 0:795de307e97f | 98 | * These are the congig registers |
emoninet2 | 0:795de307e97f | 99 | */ |
emoninet2 | 0:795de307e97f | 100 | /**@{*/ |
emoninet2 | 0:795de307e97f | 101 | #define _NRF24L01P_CONFIG_PRIM_RX (1<<0) |
emoninet2 | 0:795de307e97f | 102 | #define _NRF24L01P_CONFIG_PWR_UP (1<<1) |
emoninet2 | 0:795de307e97f | 103 | #define _NRF24L01P_CONFIG_CRC0 (1<<2) |
emoninet2 | 0:795de307e97f | 104 | #define _NRF24L01P_CONFIG_EN_CRC (1<<3) |
emoninet2 | 0:795de307e97f | 105 | #define _NRF24L01P_CONFIG_MASK_MAX_RT (1<<4) |
emoninet2 | 0:795de307e97f | 106 | #define _NRF24L01P_CONFIG_MASK_TX_DS (1<<5) |
emoninet2 | 0:795de307e97f | 107 | #define _NRF24L01P_CONFIG_MASK_RX_DR (1<<6) |
emoninet2 | 0:795de307e97f | 108 | #define _NRF24L01P_CONFIG_CRC_MASK (_NRF24L01P_CONFIG_EN_CRC|_NRF24L01P_CONFIG_CRC0) |
emoninet2 | 0:795de307e97f | 109 | /**@}*/ |
emoninet2 | 0:795de307e97f | 110 | |
emoninet2 | 0:795de307e97f | 111 | |
emoninet2 | 0:795de307e97f | 112 | /** @name NRF24L01+ setup register |
emoninet2 | 0:795de307e97f | 113 | * These are bits of the setup register |
emoninet2 | 0:795de307e97f | 114 | */ |
emoninet2 | 0:795de307e97f | 115 | /**@{*/ |
emoninet2 | 0:795de307e97f | 116 | #define _NRF24L01P_RF_SETUP_RF_PWR_MASK (0x3<<1) |
emoninet2 | 0:795de307e97f | 117 | #define _NRF24L01P_RF_SETUP_RF_DR_HIGH_BIT (1 << 3) |
emoninet2 | 0:795de307e97f | 118 | #define _NRF24L01P_RF_SETUP_RF_DR_LOW_BIT (1 << 5) |
emoninet2 | 0:795de307e97f | 119 | #define _NRF24L01P_RF_SETUP_RF_DR_MASK (_NRF24L01P_RF_SETUP_RF_DR_LOW_BIT|_NRF24L01P_RF_SETUP_RF_DR_HIGH_BIT) |
emoninet2 | 0:795de307e97f | 120 | /**@}*/ |
emoninet2 | 0:795de307e97f | 121 | |
emoninet2 | 0:795de307e97f | 122 | |
emoninet2 | 0:795de307e97f | 123 | |
emoninet2 | 0:795de307e97f | 124 | |
emoninet2 | 0:795de307e97f | 125 | /** @name NRF24L01+ status register |
emoninet2 | 0:795de307e97f | 126 | * These are bits of the status register |
emoninet2 | 0:795de307e97f | 127 | */ |
emoninet2 | 0:795de307e97f | 128 | /**@{*/ |
emoninet2 | 0:795de307e97f | 129 | #define _NRF24L01P_STATUS_TX_FULL (1<<0) |
emoninet2 | 0:795de307e97f | 130 | #define _NRF24L01P_STATUS_RX_P_NO (0x7<<1) |
emoninet2 | 0:795de307e97f | 131 | #define _NRF24L01P_STATUS_MAX_RT (1<<4) |
emoninet2 | 0:795de307e97f | 132 | #define _NRF24L01P_STATUS_TX_DS (1<<5) |
emoninet2 | 0:795de307e97f | 133 | #define _NRF24L01P_STATUS_RX_DR (1<<6) |
emoninet2 | 0:795de307e97f | 134 | /**@}*/ |
emoninet2 | 0:795de307e97f | 135 | |
emoninet2 | 0:795de307e97f | 136 | /** @name NRF24L01+ observe register |
emoninet2 | 0:795de307e97f | 137 | * These are bits of the observe register |
emoninet2 | 0:795de307e97f | 138 | */ |
emoninet2 | 0:795de307e97f | 139 | /**@{*/ |
emoninet2 | 0:795de307e97f | 140 | #define _NRF24L01P_OBSERVE_TX_ARC_CNT_BP 0 |
emoninet2 | 0:795de307e97f | 141 | #define _NRF24L01P_OBSERVE_TX_ARC_CNT_MASK 0x0F |
emoninet2 | 0:795de307e97f | 142 | #define _NRF24L01P_OBSERVE_TX_PLOS_CNT_BP 4 |
emoninet2 | 0:795de307e97f | 143 | #define _NRF24L01P_OBSERVE_TX_PLOS_CNT_MASK 0xF0 |
emoninet2 | 0:795de307e97f | 144 | /**@}*/ |
emoninet2 | 0:795de307e97f | 145 | |
emoninet2 | 0:795de307e97f | 146 | |
emoninet2 | 0:795de307e97f | 147 | /** @name NRF24L01+ fifo status register |
emoninet2 | 0:795de307e97f | 148 | * These are bits of the fifo status register |
emoninet2 | 0:795de307e97f | 149 | */ |
emoninet2 | 0:795de307e97f | 150 | /**@{*/ |
emoninet2 | 0:795de307e97f | 151 | #define _NRF24L01P_FIFO_STATUS_RX_EMPTY (1<<0) |
emoninet2 | 0:795de307e97f | 152 | #define _NRF24L01P_FIFO_STATUS_RX_FULL (1<<1) |
emoninet2 | 0:795de307e97f | 153 | #define _NRF24L01P_FIFO_STATUS_TX_EMPTY (1<<4) |
emoninet2 | 0:795de307e97f | 154 | #define _NRF24L01P_FIFO_STATUS_TX_FULL (1<<5) |
emoninet2 | 0:795de307e97f | 155 | #define _NRF24L01P_FIFO_STATUS_RX_REUSE (1<<6) |
emoninet2 | 0:795de307e97f | 156 | /**@}*/ |
emoninet2 | 0:795de307e97f | 157 | |
emoninet2 | 0:795de307e97f | 158 | |
emoninet2 | 0:795de307e97f | 159 | /** @name NRF24L01+ feature register |
emoninet2 | 0:795de307e97f | 160 | * These are bits of the feature register |
emoninet2 | 0:795de307e97f | 161 | */ |
emoninet2 | 0:795de307e97f | 162 | /**@{*/ |
emoninet2 | 0:795de307e97f | 163 | #define _NRF24L01_FEATURE_EN_DPL (1<<2) |
emoninet2 | 0:795de307e97f | 164 | #define _NRF24L01_FEATURE_EN_ACK_PAY (1<<1) |
emoninet2 | 0:795de307e97f | 165 | #define _NRF24L01_FEATURE_EN_DYN_ACK (1<<0) |
emoninet2 | 0:795de307e97f | 166 | /**@}*/ |
emoninet2 | 0:795de307e97f | 167 | |
emoninet2 | 0:795de307e97f | 168 | |
emoninet2 | 0:795de307e97f | 169 | |
emoninet2 | 0:795de307e97f | 170 | #define _NRF24L01P_RX_PW_Px_MASK 0x3F |
emoninet2 | 0:795de307e97f | 171 | |
emoninet2 | 0:795de307e97f | 172 | |
emoninet2 | 0:795de307e97f | 173 | /** @name NRF24L01+ config register |
emoninet2 | 0:795de307e97f | 174 | * These are bits of the config register |
emoninet2 | 0:795de307e97f | 175 | */ |
emoninet2 | 0:795de307e97f | 176 | /**@{*/ |
emoninet2 | 0:795de307e97f | 177 | #define _NRF24L01P_TIMING_PowerOnReset_ms 100 // 100mS |
emoninet2 | 0:795de307e97f | 178 | #define _NRF24L01P_TIMING_Tundef2pd_us 100000 // 100mS |
emoninet2 | 0:795de307e97f | 179 | #define _NRF24L01P_TIMING_Tstby2a_us 130 // 130uS |
emoninet2 | 0:795de307e97f | 180 | #define _NRF24L01P_TIMING_Thce_us 10 // 10uS |
emoninet2 | 0:795de307e97f | 181 | #define _NRF24L01P_TIMING_Tpd2stby_us 4500 // 4.5mS worst case |
emoninet2 | 0:795de307e97f | 182 | #define _NRF24L01P_TIMING_Tpece2csn_us 4 // 4uS |
emoninet2 | 0:795de307e97f | 183 | /**@}*/ |
emoninet2 | 0:795de307e97f | 184 | |
emoninet2 | 0:795de307e97f | 185 | |
emoninet2 | 0:795de307e97f | 186 | /** @name NRF24L01+ default values |
emoninet2 | 0:795de307e97f | 187 | * These are bits of the default values |
emoninet2 | 0:795de307e97f | 188 | */ |
emoninet2 | 0:795de307e97f | 189 | /**@{*/ |
emoninet2 | 0:795de307e97f | 190 | #define DEFAULT_NRF24L01P_ADDRESS ((unsigned long long) 0xE7E7E7E7E7 ) |
emoninet2 | 0:795de307e97f | 191 | #define DEFAULT_NRF24L01P_ADDRESS_WIDTH 5 |
emoninet2 | 0:795de307e97f | 192 | #define DEFAULT_NRF24L01P_CRC NRF24L01P_CRC_8_BIT |
emoninet2 | 0:795de307e97f | 193 | #define DEFAULT_NRF24L01P_RF_FREQUENCY (NRF24L01P_MIN_RF_FREQUENCY + 2) |
emoninet2 | 0:795de307e97f | 194 | #define DEFAULT_NRF24L01P_DATARATE NRF24L01P_DATARATE_1_MBPS |
emoninet2 | 0:795de307e97f | 195 | #define DEFAULT_NRF24L01P_TX_PWR NRF24L01P_TX_PWR_ZERO_DB |
emoninet2 | 0:795de307e97f | 196 | #define DEFAULT_NRF24L01P_TRANSFER_SIZE 4 |
emoninet2 | 0:795de307e97f | 197 | /**@}*/ |
emoninet2 | 0:795de307e97f | 198 | |
emoninet2 | 0:795de307e97f | 199 | |
emoninet2 | 0:795de307e97f | 200 | /** |
emoninet2 | 0:795de307e97f | 201 | * @brief pipe address datatype |
emoninet2 | 0:795de307e97f | 202 | * data type for the pipe address |
emoninet2 | 0:795de307e97f | 203 | */ |
emoninet2 | 0:795de307e97f | 204 | #define pipeAddrType_t uint64_t |
emoninet2 | 0:795de307e97f | 205 | |
emoninet2 | 0:795de307e97f | 206 | /** |
emoninet2 | 0:795de307e97f | 207 | * @brief CRC options |
emoninet2 | 0:795de307e97f | 208 | * camn be 8 bit or 16 bit CRC |
emoninet2 | 0:795de307e97f | 209 | */ |
emoninet2 | 0:795de307e97f | 210 | typedef enum _nrf24l01p_crc_enum{ |
emoninet2 | 0:795de307e97f | 211 | _NRF24L01P_CONFIG_CRC_NONE = (0), |
emoninet2 | 0:795de307e97f | 212 | _NRF24L01P_CONFIG_CRC_8BIT = (_NRF24L01P_CONFIG_EN_CRC), |
emoninet2 | 0:795de307e97f | 213 | _NRF24L01P_CONFIG_CRC_16BIT = (_NRF24L01P_CONFIG_EN_CRC|_NRF24L01P_CONFIG_CRC0), |
emoninet2 | 0:795de307e97f | 214 | }_nrf24l01p_crc_t; |
emoninet2 | 0:795de307e97f | 215 | |
emoninet2 | 0:795de307e97f | 216 | /** |
emoninet2 | 0:795de307e97f | 217 | * @brief address width options |
emoninet2 | 0:795de307e97f | 218 | * address width can be 3 , 4 or 5 bytes |
emoninet2 | 0:795de307e97f | 219 | */ |
emoninet2 | 0:795de307e97f | 220 | typedef enum _nrf24l01p_aw_enum{ |
emoninet2 | 0:795de307e97f | 221 | _NRF24L01P_SETUP_AW_AW_3BYTE = (0x1<<0),/**< 3 bytes address width */ |
emoninet2 | 0:795de307e97f | 222 | _NRF24L01P_SETUP_AW_AW_4BYTE = (0x2<<0),/**< 4 bytes address width */ |
emoninet2 | 0:795de307e97f | 223 | _NRF24L01P_SETUP_AW_AW_5BYTE = (0x3<<0),/**< 5 bytes address width */ |
emoninet2 | 0:795de307e97f | 224 | }_nrf24l01p_aw_t; |
emoninet2 | 0:795de307e97f | 225 | |
emoninet2 | 0:795de307e97f | 226 | /** |
emoninet2 | 0:795de307e97f | 227 | * @brief rf power enumeration |
emoninet2 | 0:795de307e97f | 228 | * antenna power options |
emoninet2 | 0:795de307e97f | 229 | */ |
emoninet2 | 0:795de307e97f | 230 | typedef enum _nrf24l01p_RF_power_enum{ |
emoninet2 | 0:795de307e97f | 231 | _NRF24L01P_RF_SETUP_RF_PWR_0DBM = (0x3<<1), |
emoninet2 | 0:795de307e97f | 232 | _NRF24L01P_RF_SETUP_RF_PWR_MINUS_6DBM = (0x2<<1), |
emoninet2 | 0:795de307e97f | 233 | _NRF24L01P_RF_SETUP_RF_PWR_MINUS_12DBM = (0x1<<1), |
emoninet2 | 0:795de307e97f | 234 | _NRF24L01P_RF_SETUP_RF_PWR_MINUS_18DBM = (0x0<<1), |
emoninet2 | 0:795de307e97f | 235 | }_nrf24l01p_RFpower_t; |
emoninet2 | 0:795de307e97f | 236 | |
emoninet2 | 0:795de307e97f | 237 | /** |
emoninet2 | 0:795de307e97f | 238 | * @brief data rate enumeration |
emoninet2 | 0:795de307e97f | 239 | * choose data rate between 250kbps, 1mbps or 2mbps |
emoninet2 | 0:795de307e97f | 240 | */ |
emoninet2 | 0:795de307e97f | 241 | typedef enum _nrf24l01p_datarate_enum{ |
emoninet2 | 0:795de307e97f | 242 | _NRF24L01P_RF_SETUP_RF_DR_250KBPS = (_NRF24L01P_RF_SETUP_RF_DR_LOW_BIT), |
emoninet2 | 0:795de307e97f | 243 | _NRF24L01P_RF_SETUP_RF_DR_1MBPS = (0), |
emoninet2 | 0:795de307e97f | 244 | _NRF24L01P_RF_SETUP_RF_DR_2MBPS = (_NRF24L01P_RF_SETUP_RF_DR_HIGH_BIT), |
emoninet2 | 0:795de307e97f | 245 | }_nrf24l01p_datarate_t; |
emoninet2 | 0:795de307e97f | 246 | |
emoninet2 | 0:795de307e97f | 247 | /** |
emoninet2 | 0:795de307e97f | 248 | * @brief pipe numbers enumeration |
emoninet2 | 0:795de307e97f | 249 | * these are the available pipe numbers |
emoninet2 | 0:795de307e97f | 250 | */ |
emoninet2 | 0:795de307e97f | 251 | typedef enum _nrf24l01p_pipe_enum{ |
emoninet2 | 0:795de307e97f | 252 | _NRF24L01P_PIPE_P0 = 0,/**< Pipe 0 */ |
emoninet2 | 0:795de307e97f | 253 | _NRF24L01P_PIPE_P1 = 1,/**< Pipe 1 */ |
emoninet2 | 0:795de307e97f | 254 | _NRF24L01P_PIPE_P2 = 2,/**< Pipe 2 */ |
emoninet2 | 0:795de307e97f | 255 | _NRF24L01P_PIPE_P3 = 3,/**< Pipe 3 */ |
emoninet2 | 0:795de307e97f | 256 | _NRF24L01P_PIPE_P4 = 4,/**< Pipe 4 */ |
emoninet2 | 0:795de307e97f | 257 | _NRF24L01P_PIPE_P5 = 5,/**< Pipe 5 */ |
emoninet2 | 0:795de307e97f | 258 | }_nrf24l01p_pipe_t; |
emoninet2 | 0:795de307e97f | 259 | |
emoninet2 | 0:795de307e97f | 260 | |
emoninet2 | 0:795de307e97f | 261 | /** |
emoninet2 | 0:795de307e97f | 262 | * @brief this is brief enum. |
emoninet2 | 0:795de307e97f | 263 | * brief enum continued. |
emoninet2 | 0:795de307e97f | 264 | * |
emoninet2 | 0:795de307e97f | 265 | * expect detailed enum here. |
emoninet2 | 0:795de307e97f | 266 | * @note can also have note.wow |
emoninet2 | 0:795de307e97f | 267 | */ |
emoninet2 | 0:795de307e97f | 268 | typedef enum { |
emoninet2 | 0:795de307e97f | 269 | _NRF24L01P_MODE_UNKNOWN,/**< NRF24L01+ unknown mode */ |
emoninet2 | 0:795de307e97f | 270 | _NRF24L01P_MODE_POWER_DOWN,/**< NRF24L01+ Power Down mode */ |
emoninet2 | 0:795de307e97f | 271 | _NRF24L01P_MODE_STANDBY,/**< NRF24L01+ Standby mode */ |
emoninet2 | 0:795de307e97f | 272 | _NRF24L01P_MODE_RX,/**< NRF24L01+ RX mode */ |
emoninet2 | 0:795de307e97f | 273 | _NRF24L01P_MODE_TX,/**< NRF24L01+ TX mode */ |
emoninet2 | 0:795de307e97f | 274 | } nRF24L01P_Mode_Type; |
emoninet2 | 0:795de307e97f | 275 | |
emoninet2 | 0:795de307e97f | 276 | |
emoninet2 | 0:795de307e97f | 277 | class nrf24l01p |
emoninet2 | 0:795de307e97f | 278 | { |
emoninet2 | 0:795de307e97f | 279 | //variables |
emoninet2 | 0:795de307e97f | 280 | public: |
emoninet2 | 0:795de307e97f | 281 | protected: |
emoninet2 | 0:795de307e97f | 282 | private: |
emoninet2 | 0:795de307e97f | 283 | SPI spi_; |
emoninet2 | 0:795de307e97f | 284 | DigitalOut nCS_; |
emoninet2 | 0:795de307e97f | 285 | DigitalOut ce_; |
emoninet2 | 0:795de307e97f | 286 | InterruptIn nIRQ_; |
emoninet2 | 0:795de307e97f | 287 | |
emoninet2 | 0:795de307e97f | 288 | nRF24L01P_Mode_Type _nrf24l01p_mode;/**< state of the radio */ |
emoninet2 | 0:795de307e97f | 289 | //functions |
emoninet2 | 0:795de307e97f | 290 | public: |
emoninet2 | 0:795de307e97f | 291 | nrf24l01p(); |
emoninet2 | 0:795de307e97f | 292 | |
emoninet2 | 0:795de307e97f | 293 | nrf24l01p(PinName mosi, PinName miso, PinName sck, PinName csn, PinName ce, PinName irq = NC); |
emoninet2 | 0:795de307e97f | 294 | void arch_nrf24l01p_ce_pin(bool state); |
emoninet2 | 0:795de307e97f | 295 | void arch_nrf24l01p_csn_pin(bool state); |
emoninet2 | 0:795de307e97f | 296 | void arch_nrf24l01p_initialize(); |
emoninet2 | 0:795de307e97f | 297 | void arch_spi_master_transcieve(uint8_t *data, int len); |
emoninet2 | 0:795de307e97f | 298 | |
emoninet2 | 0:795de307e97f | 299 | |
emoninet2 | 0:795de307e97f | 300 | /** |
emoninet2 | 0:795de307e97f | 301 | * @brief CE Pin |
emoninet2 | 0:795de307e97f | 302 | * this function handles the CE pin value_com |
emoninet2 | 0:795de307e97f | 303 | * @param state logic high or low |
emoninet2 | 0:795de307e97f | 304 | */ |
emoninet2 | 0:795de307e97f | 305 | void ce_pin(bool state); |
emoninet2 | 0:795de307e97f | 306 | /** |
emoninet2 | 0:795de307e97f | 307 | * @brief CSN Pin |
emoninet2 | 0:795de307e97f | 308 | * this function handles the CE pin value_com |
emoninet2 | 0:795de307e97f | 309 | * @param state logic high or low |
emoninet2 | 0:795de307e97f | 310 | */ |
emoninet2 | 0:795de307e97f | 311 | void csn_pin(bool state); |
emoninet2 | 0:795de307e97f | 312 | /** |
emoninet2 | 0:795de307e97f | 313 | * @brief Read Registers |
emoninet2 | 0:795de307e97f | 314 | * this function reads the registers |
emoninet2 | 0:795de307e97f | 315 | * @param address address of the register to read |
emoninet2 | 0:795de307e97f | 316 | * @param dataout address of array to read into |
emoninet2 | 0:795de307e97f | 317 | * @param len number of bytes to read |
emoninet2 | 0:795de307e97f | 318 | * @return none. |
emoninet2 | 0:795de307e97f | 319 | */ |
emoninet2 | 0:795de307e97f | 320 | void read_register(uint8_t address, uint8_t *dataout, int len); |
emoninet2 | 0:795de307e97f | 321 | /** |
emoninet2 | 0:795de307e97f | 322 | * @brief Write Registers |
emoninet2 | 0:795de307e97f | 323 | * this function writes into the registers |
emoninet2 | 0:795de307e97f | 324 | * @param address address of the register to write into |
emoninet2 | 0:795de307e97f | 325 | * @param dataout address of array which holds data to write |
emoninet2 | 0:795de307e97f | 326 | * @param len number of bytes to write |
emoninet2 | 0:795de307e97f | 327 | * @return none. |
emoninet2 | 0:795de307e97f | 328 | */ |
emoninet2 | 0:795de307e97f | 329 | void write_register(uint8_t address, uint8_t *datain, int len); |
emoninet2 | 0:795de307e97f | 330 | /** |
emoninet2 | 0:795de307e97f | 331 | * @brief Read RX payload |
emoninet2 | 0:795de307e97f | 332 | * this function reads the payload from the RX FIFO |
emoninet2 | 0:795de307e97f | 333 | * @param dataout address of array to read payload data into |
emoninet2 | 0:795de307e97f | 334 | * @param paylen number of bytes to read from the payload |
emoninet2 | 0:795de307e97f | 335 | * @return none. |
emoninet2 | 0:795de307e97f | 336 | */ |
emoninet2 | 0:795de307e97f | 337 | void read_rx_payload(uint8_t *dataout, int pay_len); |
emoninet2 | 0:795de307e97f | 338 | /** |
emoninet2 | 0:795de307e97f | 339 | * @brief Write RX payload |
emoninet2 | 0:795de307e97f | 340 | * this function writes the payload into TX FIFO |
emoninet2 | 0:795de307e97f | 341 | * @param datain address of array containing the data to write |
emoninet2 | 0:795de307e97f | 342 | * @param paylen number of bytes to write into the payload |
emoninet2 | 0:795de307e97f | 343 | * @return none. |
emoninet2 | 0:795de307e97f | 344 | */ |
emoninet2 | 0:795de307e97f | 345 | void write_tx_payload(uint8_t *datain, int pay_len); |
emoninet2 | 0:795de307e97f | 346 | /** |
emoninet2 | 0:795de307e97f | 347 | * @brief Flush TX |
emoninet2 | 0:795de307e97f | 348 | * this function flushes the TX FIFO buffer |
emoninet2 | 0:795de307e97f | 349 | */ |
emoninet2 | 0:795de307e97f | 350 | void flush_tx(); |
emoninet2 | 0:795de307e97f | 351 | /** |
emoninet2 | 0:795de307e97f | 352 | * @brief Flush RX |
emoninet2 | 0:795de307e97f | 353 | * this function flushes the TX FIFO buffer |
emoninet2 | 0:795de307e97f | 354 | */ |
emoninet2 | 0:795de307e97f | 355 | void flush_rx(); |
emoninet2 | 0:795de307e97f | 356 | /** |
emoninet2 | 0:795de307e97f | 357 | * @brief Reuse TX |
emoninet2 | 0:795de307e97f | 358 | * this function reuses the last data in the TX FIFO |
emoninet2 | 0:795de307e97f | 359 | * |
emoninet2 | 0:795de307e97f | 360 | * if the FIFO buffer is not flushed, this command resends the payload |
emoninet2 | 0:795de307e97f | 361 | * can be used by software when failed to recieve ACK from receiver |
emoninet2 | 0:795de307e97f | 362 | * saves CPU time since the payload need not be written all over again |
emoninet2 | 0:795de307e97f | 363 | */ |
emoninet2 | 0:795de307e97f | 364 | void reuse_tx_payload(); |
emoninet2 | 0:795de307e97f | 365 | /** |
emoninet2 | 0:795de307e97f | 366 | * @brief Read payload width |
emoninet2 | 0:795de307e97f | 367 | * reads the number of byte in the last FIFO payload |
emoninet2 | 0:795de307e97f | 368 | * |
emoninet2 | 0:795de307e97f | 369 | * can only be used if dynamic payload is enabled in FEATURE register |
emoninet2 | 0:795de307e97f | 370 | * @see _nrf24l01p_enable_dynamic_payload() |
emoninet2 | 0:795de307e97f | 371 | */ |
emoninet2 | 0:795de307e97f | 372 | int read_rx_payload_width(); |
emoninet2 | 0:795de307e97f | 373 | /** |
emoninet2 | 0:795de307e97f | 374 | * @brief write ACK payload |
emoninet2 | 0:795de307e97f | 375 | * payload data to send along with ack |
emoninet2 | 0:795de307e97f | 376 | * |
emoninet2 | 0:795de307e97f | 377 | * this is done prior to recieving data on a pipe. |
emoninet2 | 0:795de307e97f | 378 | * when an ack payload is written for a specific pipe |
emoninet2 | 0:795de307e97f | 379 | * and that pipe is enabled and auto ack is enableds as well |
emoninet2 | 0:795de307e97f | 380 | * on receiving a data on that pipe, it will send this data |
emoninet2 | 0:795de307e97f | 381 | * on the payload along with an ack. If nothing is written on |
emoninet2 | 0:795de307e97f | 382 | * this payload, then it will send 0 bytes along with the ack |
emoninet2 | 0:795de307e97f | 383 | * @param pipe pipe number agains which the ack payload is written |
emoninet2 | 0:795de307e97f | 384 | * @param datain address of array containing the data to write |
emoninet2 | 0:795de307e97f | 385 | * @param paylen number of bytes to write into the payload |
emoninet2 | 0:795de307e97f | 386 | */ |
emoninet2 | 0:795de307e97f | 387 | void write_ack_payload(_nrf24l01p_pipe_t pipe, uint8_t *datain, int pay_len); |
emoninet2 | 0:795de307e97f | 388 | /** |
emoninet2 | 0:795de307e97f | 389 | * @brief write ACK no payload |
emoninet2 | 0:795de307e97f | 390 | * payload data to send without an ACK |
emoninet2 | 0:795de307e97f | 391 | * |
emoninet2 | 0:795de307e97f | 392 | * @param datain address of array containing the data to write |
emoninet2 | 0:795de307e97f | 393 | * @param paylen number of bytes to write into the payload |
emoninet2 | 0:795de307e97f | 394 | */ |
emoninet2 | 0:795de307e97f | 395 | void write_tx_payload_noack(uint8_t *datain, int pay_len); |
emoninet2 | 0:795de307e97f | 396 | /** |
emoninet2 | 0:795de307e97f | 397 | * @brief Get Status |
emoninet2 | 0:795de307e97f | 398 | * reads the status of the NRF24L01+ |
emoninet2 | 0:795de307e97f | 399 | * @return status of the NRF24L01+ |
emoninet2 | 0:795de307e97f | 400 | */ |
emoninet2 | 0:795de307e97f | 401 | int get_status(); |
emoninet2 | 0:795de307e97f | 402 | |
emoninet2 | 0:795de307e97f | 403 | |
emoninet2 | 0:795de307e97f | 404 | |
emoninet2 | 0:795de307e97f | 405 | /**@}*/ |
emoninet2 | 0:795de307e97f | 406 | |
emoninet2 | 0:795de307e97f | 407 | |
emoninet2 | 0:795de307e97f | 408 | |
emoninet2 | 0:795de307e97f | 409 | |
emoninet2 | 0:795de307e97f | 410 | |
emoninet2 | 0:795de307e97f | 411 | |
emoninet2 | 0:795de307e97f | 412 | |
emoninet2 | 0:795de307e97f | 413 | |
emoninet2 | 0:795de307e97f | 414 | |
emoninet2 | 0:795de307e97f | 415 | |
emoninet2 | 0:795de307e97f | 416 | /** |
emoninet2 | 0:795de307e97f | 417 | * @name NRF24L01+ register control functions |
emoninet2 | 0:795de307e97f | 418 | */ |
emoninet2 | 0:795de307e97f | 419 | /**@{*/ |
emoninet2 | 0:795de307e97f | 420 | void power_up(); |
emoninet2 | 0:795de307e97f | 421 | void power_down(); |
emoninet2 | 0:795de307e97f | 422 | void rx_mode(); |
emoninet2 | 0:795de307e97f | 423 | void tx_mode(); |
emoninet2 | 0:795de307e97f | 424 | void set_CRC(_nrf24l01p_crc_t opt); |
emoninet2 | 0:795de307e97f | 425 | |
emoninet2 | 0:795de307e97f | 426 | void enable_auto_ack(_nrf24l01p_pipe_t pipe); |
emoninet2 | 0:795de307e97f | 427 | void disable_auto_ack(_nrf24l01p_pipe_t pipe); |
emoninet2 | 0:795de307e97f | 428 | void disable_auto_ack_all_pipes(); |
emoninet2 | 0:795de307e97f | 429 | |
emoninet2 | 0:795de307e97f | 430 | void enable_rx_on_pipe(_nrf24l01p_pipe_t pipe); |
emoninet2 | 0:795de307e97f | 431 | void disable_rx_on_pipe(_nrf24l01p_pipe_t pipe); |
emoninet2 | 0:795de307e97f | 432 | |
emoninet2 | 0:795de307e97f | 433 | void set_address_width(_nrf24l01p_aw_t width); |
emoninet2 | 0:795de307e97f | 434 | _nrf24l01p_aw_t get_address_width(); |
emoninet2 | 0:795de307e97f | 435 | |
emoninet2 | 0:795de307e97f | 436 | void set_auto_retransmission_count(uint8_t count); |
emoninet2 | 0:795de307e97f | 437 | uint8_t read_auto_retransmission_count(); |
emoninet2 | 0:795de307e97f | 438 | void set_auto_retransmission_delay(uint8_t times250us); |
emoninet2 | 0:795de307e97f | 439 | uint8_t read_auto_retransmission_delay(); |
emoninet2 | 0:795de307e97f | 440 | |
emoninet2 | 0:795de307e97f | 441 | void set_frequency_offset(uint8_t offset); |
emoninet2 | 0:795de307e97f | 442 | uint8_t get_frequency_offset(); |
emoninet2 | 0:795de307e97f | 443 | |
emoninet2 | 0:795de307e97f | 444 | void set_DataRate(_nrf24l01p_datarate_t DataRate); |
emoninet2 | 0:795de307e97f | 445 | _nrf24l01p_datarate_t get_DataRate(); |
emoninet2 | 0:795de307e97f | 446 | void set_RF_Power(_nrf24l01p_RFpower_t RFpower); |
emoninet2 | 0:795de307e97f | 447 | _nrf24l01p_RFpower_t get_RF_Power(); |
emoninet2 | 0:795de307e97f | 448 | |
emoninet2 | 0:795de307e97f | 449 | bool get_tx_fifo_full_flag(); |
emoninet2 | 0:795de307e97f | 450 | bool get_max_retry_flag(); |
emoninet2 | 0:795de307e97f | 451 | void clear_max_retry_flag(); |
emoninet2 | 0:795de307e97f | 452 | bool get_data_sent_flag(); |
emoninet2 | 0:795de307e97f | 453 | void clear_data_sent_flag(); |
emoninet2 | 0:795de307e97f | 454 | bool get_data_ready_flag(); |
emoninet2 | 0:795de307e97f | 455 | void clear_data_ready_flag(); |
emoninet2 | 0:795de307e97f | 456 | _nrf24l01p_pipe_t get_rx_payload_pipe(); |
emoninet2 | 0:795de307e97f | 457 | |
emoninet2 | 0:795de307e97f | 458 | uint8_t get_arc_count(); |
emoninet2 | 0:795de307e97f | 459 | uint8_t get_plos_count(); |
emoninet2 | 0:795de307e97f | 460 | void clear_plos_count(); |
emoninet2 | 0:795de307e97f | 461 | bool get_rpd(); |
emoninet2 | 0:795de307e97f | 462 | |
emoninet2 | 0:795de307e97f | 463 | void set_RX_pipe_address(_nrf24l01p_pipe_t pipe,pipeAddrType_t address); |
emoninet2 | 0:795de307e97f | 464 | pipeAddrType_t get_RX_pipe_address(_nrf24l01p_pipe_t pipe); |
emoninet2 | 0:795de307e97f | 465 | void set_TX_pipe_address(pipeAddrType_t address); |
emoninet2 | 0:795de307e97f | 466 | pipeAddrType_t get_TX_pipe_address(); |
emoninet2 | 0:795de307e97f | 467 | |
emoninet2 | 0:795de307e97f | 468 | uint8_t get_RX_pipe_width(_nrf24l01p_pipe_t pipe); |
emoninet2 | 0:795de307e97f | 469 | |
emoninet2 | 0:795de307e97f | 470 | |
emoninet2 | 0:795de307e97f | 471 | bool get_fifo_flag_rx_empty(); |
emoninet2 | 0:795de307e97f | 472 | bool get_fifo_flag_rx_full(); |
emoninet2 | 0:795de307e97f | 473 | bool get_fifo_flag_tx_empty(); |
emoninet2 | 0:795de307e97f | 474 | bool get_fifo_flag_tx_full(); |
emoninet2 | 0:795de307e97f | 475 | bool get_fifo_flag_tx_reuse(); |
emoninet2 | 0:795de307e97f | 476 | |
emoninet2 | 0:795de307e97f | 477 | void enable_dynamic_payload_pipe(_nrf24l01p_pipe_t pipe); |
emoninet2 | 0:795de307e97f | 478 | void disable_dynamic_payload_pipe(_nrf24l01p_pipe_t pipe); |
emoninet2 | 0:795de307e97f | 479 | void disable_dynamic_payload_all_pipe(); |
emoninet2 | 0:795de307e97f | 480 | void enable_dynamic_payload(); |
emoninet2 | 0:795de307e97f | 481 | void disable_dynamic_payload(); |
emoninet2 | 0:795de307e97f | 482 | void enable_payload_with_ack(); |
emoninet2 | 0:795de307e97f | 483 | void disable_payload_with_ack(); |
emoninet2 | 0:795de307e97f | 484 | void enable_dynamic_payload_with_ack(); |
emoninet2 | 0:795de307e97f | 485 | void disable_dynamic_payload_with_ack(); |
emoninet2 | 0:795de307e97f | 486 | /**@}*/ |
emoninet2 | 0:795de307e97f | 487 | |
emoninet2 | 0:795de307e97f | 488 | |
emoninet2 | 0:795de307e97f | 489 | /** |
emoninet2 | 0:795de307e97f | 490 | * @brief Initialize |
emoninet2 | 0:795de307e97f | 491 | * hardware initialization of the NRF24L01+ |
emoninet2 | 0:795de307e97f | 492 | */ |
emoninet2 | 0:795de307e97f | 493 | |
emoninet2 | 0:795de307e97f | 494 | void init(); |
emoninet2 | 0:795de307e97f | 495 | int startup(); |
emoninet2 | 0:795de307e97f | 496 | int default_config(); |
emoninet2 | 0:795de307e97f | 497 | int stateMode(nRF24L01P_Mode_Type mode); |
emoninet2 | 0:795de307e97f | 498 | |
emoninet2 | 0:795de307e97f | 499 | bool readable(); |
emoninet2 | 0:795de307e97f | 500 | bool writable(); |
emoninet2 | 0:795de307e97f | 501 | |
emoninet2 | 0:795de307e97f | 502 | |
emoninet2 | 0:795de307e97f | 503 | int send(uint8_t *data, int datalen); |
emoninet2 | 0:795de307e97f | 504 | int send_to_address(pipeAddrType_t address, uint8_t *data, int datalen); |
emoninet2 | 0:795de307e97f | 505 | int send_to_address_ack(pipeAddrType_t address, uint8_t *data, int datalen); |
emoninet2 | 0:795de307e97f | 506 | bool readableOnPipe(_nrf24l01p_pipe_t pipe); |
emoninet2 | 0:795de307e97f | 507 | int read(_nrf24l01p_pipe_t pipe, uint8_t *data, int datalen); |
emoninet2 | 0:795de307e97f | 508 | int read_dyn_pld(_nrf24l01p_pipe_t pipe, uint8_t *data); |
emoninet2 | 0:795de307e97f | 509 | void write_ack(_nrf24l01p_pipe_t pipe, uint8_t *data, int datalen); |
emoninet2 | 0:795de307e97f | 510 | |
emoninet2 | 0:795de307e97f | 511 | void PTX(); |
emoninet2 | 0:795de307e97f | 512 | void PRX(); |
emoninet2 | 0:795de307e97f | 513 | |
emoninet2 | 0:795de307e97f | 514 | /**@}*/ |
emoninet2 | 0:795de307e97f | 515 | |
emoninet2 | 0:795de307e97f | 516 | |
emoninet2 | 0:795de307e97f | 517 | |
emoninet2 | 0:795de307e97f | 518 | |
emoninet2 | 0:795de307e97f | 519 | |
emoninet2 | 0:795de307e97f | 520 | |
emoninet2 | 0:795de307e97f | 521 | |
emoninet2 | 0:795de307e97f | 522 | ~nrf24l01p(); |
emoninet2 | 0:795de307e97f | 523 | protected: |
emoninet2 | 0:795de307e97f | 524 | |
emoninet2 | 0:795de307e97f | 525 | private: |
emoninet2 | 0:795de307e97f | 526 | nrf24l01p( const nrf24l01p &c ); |
emoninet2 | 0:795de307e97f | 527 | nrf24l01p& operator=( const nrf24l01p &c ); |
emoninet2 | 0:795de307e97f | 528 | |
emoninet2 | 0:795de307e97f | 529 | |
emoninet2 | 0:795de307e97f | 530 | |
emoninet2 | 0:795de307e97f | 531 | |
emoninet2 | 0:795de307e97f | 532 | |
emoninet2 | 0:795de307e97f | 533 | |
emoninet2 | 0:795de307e97f | 534 | |
emoninet2 | 0:795de307e97f | 535 | }; //nrf24l01p |
emoninet2 | 0:795de307e97f | 536 | |
emoninet2 | 0:795de307e97f | 537 | #endif //__NRF24L01P_H__ |
emoninet2 | 0:795de307e97f | 538 |