Code for our FYDP -only one IMU works right now -RTOS is working

Dependencies:   mbed

Committer:
majik
Date:
Wed Mar 18 22:23:48 2015 +0000
Revision:
0:964eb6a2ef00
This is our FYDP code, but only one IMU works with the RTOS.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
majik 0:964eb6a2ef00 1 /**
majik 0:964eb6a2ef00 2 * @file nRF24L01P.h
majik 0:964eb6a2ef00 3 *
majik 0:964eb6a2ef00 4 * @author Owen Edwards
majik 0:964eb6a2ef00 5 *
majik 0:964eb6a2ef00 6 * @section LICENSE
majik 0:964eb6a2ef00 7 *
majik 0:964eb6a2ef00 8 * Copyright (c) 2010 Owen Edwards
majik 0:964eb6a2ef00 9 *
majik 0:964eb6a2ef00 10 * This program is free software: you can redistribute it and/or modify
majik 0:964eb6a2ef00 11 * it under the terms of the GNU General Public License as published by
majik 0:964eb6a2ef00 12 * the Free Software Foundation, either version 3 of the License, or
majik 0:964eb6a2ef00 13 * (at your option) any later version.
majik 0:964eb6a2ef00 14 *
majik 0:964eb6a2ef00 15 * This program is distributed in the hope that it will be useful,
majik 0:964eb6a2ef00 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
majik 0:964eb6a2ef00 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
majik 0:964eb6a2ef00 18 * GNU General Public License for more details.
majik 0:964eb6a2ef00 19 *
majik 0:964eb6a2ef00 20 * You should have received a copy of the GNU General Public License
majik 0:964eb6a2ef00 21 * along with this program. If not, see <http://www.gnu.org/licenses/>.
majik 0:964eb6a2ef00 22 *
majik 0:964eb6a2ef00 23 * The above copyright notice and this permission notice shall be included in
majik 0:964eb6a2ef00 24 * all copies or substantial portions of the Software.
majik 0:964eb6a2ef00 25 *
majik 0:964eb6a2ef00 26 * @section DESCRIPTION
majik 0:964eb6a2ef00 27 *
majik 0:964eb6a2ef00 28 * nRF24L01+ Single Chip 2.4GHz Transceiver from Nordic Semiconductor.
majik 0:964eb6a2ef00 29 *
majik 0:964eb6a2ef00 30 * Datasheet:
majik 0:964eb6a2ef00 31 *
majik 0:964eb6a2ef00 32 * http://www.nordicsemi.no/files/Product/data_sheet/nRF24L01P_Product_Specification_1_0.pdf
majik 0:964eb6a2ef00 33 */
majik 0:964eb6a2ef00 34
majik 0:964eb6a2ef00 35 #ifndef __NRF24L01P_H__
majik 0:964eb6a2ef00 36 #define __NRF24L01P_H__
majik 0:964eb6a2ef00 37
majik 0:964eb6a2ef00 38 /**
majik 0:964eb6a2ef00 39 * Includes
majik 0:964eb6a2ef00 40 */
majik 0:964eb6a2ef00 41 #include "mbed.h"
majik 0:964eb6a2ef00 42
majik 0:964eb6a2ef00 43 /**
majik 0:964eb6a2ef00 44 * Defines
majik 0:964eb6a2ef00 45 */
majik 0:964eb6a2ef00 46 #define NRF24L01P_TX_PWR_ZERO_DB 0
majik 0:964eb6a2ef00 47 #define NRF24L01P_TX_PWR_MINUS_6_DB -6
majik 0:964eb6a2ef00 48 #define NRF24L01P_TX_PWR_MINUS_12_DB -12
majik 0:964eb6a2ef00 49 #define NRF24L01P_TX_PWR_MINUS_18_DB -18
majik 0:964eb6a2ef00 50
majik 0:964eb6a2ef00 51 #define NRF24L01P_DATARATE_250_KBPS 250
majik 0:964eb6a2ef00 52 #define NRF24L01P_DATARATE_1_MBPS 1000
majik 0:964eb6a2ef00 53 #define NRF24L01P_DATARATE_2_MBPS 2000
majik 0:964eb6a2ef00 54
majik 0:964eb6a2ef00 55 #define NRF24L01P_CRC_NONE 0
majik 0:964eb6a2ef00 56 #define NRF24L01P_CRC_8_BIT 8
majik 0:964eb6a2ef00 57 #define NRF24L01P_CRC_16_BIT 16
majik 0:964eb6a2ef00 58
majik 0:964eb6a2ef00 59 #define NRF24L01P_MIN_RF_FREQUENCY 2400
majik 0:964eb6a2ef00 60 #define NRF24L01P_MAX_RF_FREQUENCY 2525
majik 0:964eb6a2ef00 61
majik 0:964eb6a2ef00 62 #define NRF24L01P_PIPE_P0 0
majik 0:964eb6a2ef00 63 #define NRF24L01P_PIPE_P1 1
majik 0:964eb6a2ef00 64 #define NRF24L01P_PIPE_P2 2
majik 0:964eb6a2ef00 65 #define NRF24L01P_PIPE_P3 3
majik 0:964eb6a2ef00 66 #define NRF24L01P_PIPE_P4 4
majik 0:964eb6a2ef00 67 #define NRF24L01P_PIPE_P5 5
majik 0:964eb6a2ef00 68
majik 0:964eb6a2ef00 69 /**
majik 0:964eb6a2ef00 70 * Default setup for the nRF24L01+, based on the Sparkfun "Nordic Serial Interface Board"
majik 0:964eb6a2ef00 71 * for evaluation (http://www.sparkfun.com/products/9019)
majik 0:964eb6a2ef00 72 */
majik 0:964eb6a2ef00 73 #define DEFAULT_NRF24L01P_ADDRESS ((unsigned long long) 0xE7E7E7E7E7 )
majik 0:964eb6a2ef00 74 #define DEFAULT_NRF24L01P_ADDRESS_WIDTH 5
majik 0:964eb6a2ef00 75 #define DEFAULT_NRF24L01P_CRC NRF24L01P_CRC_8_BIT
majik 0:964eb6a2ef00 76 #define DEFAULT_NRF24L01P_RF_FREQUENCY (NRF24L01P_MIN_RF_FREQUENCY + 2)
majik 0:964eb6a2ef00 77 #define DEFAULT_NRF24L01P_DATARATE NRF24L01P_DATARATE_1_MBPS
majik 0:964eb6a2ef00 78 #define DEFAULT_NRF24L01P_TX_PWR NRF24L01P_TX_PWR_ZERO_DB
majik 0:964eb6a2ef00 79 #define DEFAULT_NRF24L01P_TRANSFER_SIZE 4
majik 0:964eb6a2ef00 80
majik 0:964eb6a2ef00 81 /**
majik 0:964eb6a2ef00 82 * nRF24L01+ Single Chip 2.4GHz Transceiver from Nordic Semiconductor.
majik 0:964eb6a2ef00 83 */
majik 0:964eb6a2ef00 84 class nRF24L01P {
majik 0:964eb6a2ef00 85
majik 0:964eb6a2ef00 86 public:
majik 0:964eb6a2ef00 87
majik 0:964eb6a2ef00 88 /**
majik 0:964eb6a2ef00 89 * Constructor.
majik 0:964eb6a2ef00 90 *
majik 0:964eb6a2ef00 91 * @param mosi mbed pin to use for MOSI line of SPI interface.
majik 0:964eb6a2ef00 92 * @param miso mbed pin to use for MISO line of SPI interface.
majik 0:964eb6a2ef00 93 * @param sck mbed pin to use for SCK line of SPI interface.
majik 0:964eb6a2ef00 94 * @param csn mbed pin to use for not chip select line of SPI interface.
majik 0:964eb6a2ef00 95 * @param ce mbed pin to use for the chip enable line.
majik 0:964eb6a2ef00 96 * @param irq mbed pin to use for the interrupt request line.
majik 0:964eb6a2ef00 97 */
majik 0:964eb6a2ef00 98 nRF24L01P(PinName mosi, PinName miso, PinName sck, PinName csn, PinName ce, PinName irq = NC);
majik 0:964eb6a2ef00 99
majik 0:964eb6a2ef00 100 /**
majik 0:964eb6a2ef00 101 * Set the RF frequency.
majik 0:964eb6a2ef00 102 *
majik 0:964eb6a2ef00 103 * @param frequency the frequency of RF transmission in MHz (2400..2525).
majik 0:964eb6a2ef00 104 */
majik 0:964eb6a2ef00 105 void setRfFrequency(int frequency = DEFAULT_NRF24L01P_RF_FREQUENCY);
majik 0:964eb6a2ef00 106
majik 0:964eb6a2ef00 107 /**
majik 0:964eb6a2ef00 108 * Get the RF frequency.
majik 0:964eb6a2ef00 109 *
majik 0:964eb6a2ef00 110 * @return the frequency of RF transmission in MHz (2400..2525).
majik 0:964eb6a2ef00 111 */
majik 0:964eb6a2ef00 112 int getRfFrequency(void);
majik 0:964eb6a2ef00 113
majik 0:964eb6a2ef00 114 /**
majik 0:964eb6a2ef00 115 * Set the RF output power.
majik 0:964eb6a2ef00 116 *
majik 0:964eb6a2ef00 117 * @param power the RF output power in dBm (0, -6, -12 or -18).
majik 0:964eb6a2ef00 118 */
majik 0:964eb6a2ef00 119 void setRfOutputPower(int power = DEFAULT_NRF24L01P_TX_PWR);
majik 0:964eb6a2ef00 120
majik 0:964eb6a2ef00 121 /**
majik 0:964eb6a2ef00 122 * Get the RF output power.
majik 0:964eb6a2ef00 123 *
majik 0:964eb6a2ef00 124 * @return the RF output power in dBm (0, -6, -12 or -18).
majik 0:964eb6a2ef00 125 */
majik 0:964eb6a2ef00 126 int getRfOutputPower(void);
majik 0:964eb6a2ef00 127
majik 0:964eb6a2ef00 128 /**
majik 0:964eb6a2ef00 129 * Set the Air data rate.
majik 0:964eb6a2ef00 130 *
majik 0:964eb6a2ef00 131 * @param rate the air data rate in kbps (250, 1M or 2M).
majik 0:964eb6a2ef00 132 */
majik 0:964eb6a2ef00 133 void setAirDataRate(int rate = DEFAULT_NRF24L01P_DATARATE);
majik 0:964eb6a2ef00 134
majik 0:964eb6a2ef00 135 /**
majik 0:964eb6a2ef00 136 * Get the Air data rate.
majik 0:964eb6a2ef00 137 *
majik 0:964eb6a2ef00 138 * @return the air data rate in kbps (250, 1M or 2M).
majik 0:964eb6a2ef00 139 */
majik 0:964eb6a2ef00 140 int getAirDataRate(void);
majik 0:964eb6a2ef00 141
majik 0:964eb6a2ef00 142 /**
majik 0:964eb6a2ef00 143 * Set the CRC width.
majik 0:964eb6a2ef00 144 *
majik 0:964eb6a2ef00 145 * @param width the number of bits for the CRC (0, 8 or 16).
majik 0:964eb6a2ef00 146 */
majik 0:964eb6a2ef00 147 void setCrcWidth(int width = DEFAULT_NRF24L01P_CRC);
majik 0:964eb6a2ef00 148
majik 0:964eb6a2ef00 149 /**
majik 0:964eb6a2ef00 150 * Get the CRC width.
majik 0:964eb6a2ef00 151 *
majik 0:964eb6a2ef00 152 * @return the number of bits for the CRC (0, 8 or 16).
majik 0:964eb6a2ef00 153 */
majik 0:964eb6a2ef00 154 int getCrcWidth(void);
majik 0:964eb6a2ef00 155
majik 0:964eb6a2ef00 156 /**
majik 0:964eb6a2ef00 157 * Set the Receive address.
majik 0:964eb6a2ef00 158 *
majik 0:964eb6a2ef00 159 * @param address address associated with the particular pipe
majik 0:964eb6a2ef00 160 * @param width width of the address in bytes (3..5)
majik 0:964eb6a2ef00 161 * @param pipe pipe to associate the address with (0..5, default 0)
majik 0:964eb6a2ef00 162 *
majik 0:964eb6a2ef00 163 * Note that Pipes 0 & 1 have 3, 4 or 5 byte addresses,
majik 0:964eb6a2ef00 164 * while Pipes 2..5 only use the lowest byte (bits 7..0) of the
majik 0:964eb6a2ef00 165 * address provided here, and use 2, 3 or 4 bytes from Pipe 1's address.
majik 0:964eb6a2ef00 166 * The width parameter is ignored for Pipes 2..5.
majik 0:964eb6a2ef00 167 */
majik 0:964eb6a2ef00 168 void setRxAddress(unsigned long long address = DEFAULT_NRF24L01P_ADDRESS, int width = DEFAULT_NRF24L01P_ADDRESS_WIDTH, int pipe = NRF24L01P_PIPE_P0);
majik 0:964eb6a2ef00 169
majik 0:964eb6a2ef00 170 void setRxAddress(unsigned long msb_address, unsigned long lsb_address, int width, int pipe = NRF24L01P_PIPE_P0);
majik 0:964eb6a2ef00 171
majik 0:964eb6a2ef00 172 /**
majik 0:964eb6a2ef00 173 * Set the Transmit address.
majik 0:964eb6a2ef00 174 *
majik 0:964eb6a2ef00 175 * @param address address for transmission
majik 0:964eb6a2ef00 176 * @param width width of the address in bytes (3..5)
majik 0:964eb6a2ef00 177 *
majik 0:964eb6a2ef00 178 * Note that the address width is shared with the Receive pipes,
majik 0:964eb6a2ef00 179 * so a change to that address width affect transmissions.
majik 0:964eb6a2ef00 180 */
majik 0:964eb6a2ef00 181 void setTxAddress(unsigned long long address = DEFAULT_NRF24L01P_ADDRESS, int width = DEFAULT_NRF24L01P_ADDRESS_WIDTH);
majik 0:964eb6a2ef00 182
majik 0:964eb6a2ef00 183 void setTxAddress(unsigned long msb_address, unsigned long lsb_address, int width);
majik 0:964eb6a2ef00 184
majik 0:964eb6a2ef00 185 /**
majik 0:964eb6a2ef00 186 * Get the Receive address.
majik 0:964eb6a2ef00 187 *
majik 0:964eb6a2ef00 188 * @param pipe pipe to get the address from (0..5, default 0)
majik 0:964eb6a2ef00 189 * @return the address associated with the particular pipe
majik 0:964eb6a2ef00 190 */
majik 0:964eb6a2ef00 191 unsigned long long getRxAddress(int pipe = NRF24L01P_PIPE_P0);
majik 0:964eb6a2ef00 192
majik 0:964eb6a2ef00 193 /**
majik 0:964eb6a2ef00 194 * Get the Transmit address.
majik 0:964eb6a2ef00 195 *
majik 0:964eb6a2ef00 196 * @return address address for transmission
majik 0:964eb6a2ef00 197 */
majik 0:964eb6a2ef00 198 unsigned long long getTxAddress(void);
majik 0:964eb6a2ef00 199
majik 0:964eb6a2ef00 200 /**
majik 0:964eb6a2ef00 201 * Set the transfer size.
majik 0:964eb6a2ef00 202 *
majik 0:964eb6a2ef00 203 * @param size the size of the transfer, in bytes (1..32)
majik 0:964eb6a2ef00 204 * @param pipe pipe for the transfer (0..5, default 0)
majik 0:964eb6a2ef00 205 */
majik 0:964eb6a2ef00 206 void setTransferSize(int size = DEFAULT_NRF24L01P_TRANSFER_SIZE, int pipe = NRF24L01P_PIPE_P0);
majik 0:964eb6a2ef00 207
majik 0:964eb6a2ef00 208 /**
majik 0:964eb6a2ef00 209 * Get the transfer size.
majik 0:964eb6a2ef00 210 *
majik 0:964eb6a2ef00 211 * @return the size of the transfer, in bytes (1..32).
majik 0:964eb6a2ef00 212 */
majik 0:964eb6a2ef00 213 int getTransferSize(int pipe = NRF24L01P_PIPE_P0);
majik 0:964eb6a2ef00 214
majik 0:964eb6a2ef00 215
majik 0:964eb6a2ef00 216 /**
majik 0:964eb6a2ef00 217 * Get the RPD (Received Power Detector) state.
majik 0:964eb6a2ef00 218 *
majik 0:964eb6a2ef00 219 * @return true if the received power exceeded -64dBm
majik 0:964eb6a2ef00 220 */
majik 0:964eb6a2ef00 221 bool getRPD(void);
majik 0:964eb6a2ef00 222
majik 0:964eb6a2ef00 223 /**
majik 0:964eb6a2ef00 224 * Put the nRF24L01+ into Receive mode
majik 0:964eb6a2ef00 225 */
majik 0:964eb6a2ef00 226 void setReceiveMode(void);
majik 0:964eb6a2ef00 227
majik 0:964eb6a2ef00 228 /**
majik 0:964eb6a2ef00 229 * Put the nRF24L01+ into Transmit mode
majik 0:964eb6a2ef00 230 */
majik 0:964eb6a2ef00 231 void setTransmitMode(void);
majik 0:964eb6a2ef00 232
majik 0:964eb6a2ef00 233 /**
majik 0:964eb6a2ef00 234 * Power up the nRF24L01+ into Standby mode
majik 0:964eb6a2ef00 235 */
majik 0:964eb6a2ef00 236 void powerUp(void);
majik 0:964eb6a2ef00 237
majik 0:964eb6a2ef00 238 /**
majik 0:964eb6a2ef00 239 * Power down the nRF24L01+ into Power Down mode
majik 0:964eb6a2ef00 240 */
majik 0:964eb6a2ef00 241 void powerDown(void);
majik 0:964eb6a2ef00 242
majik 0:964eb6a2ef00 243 /**
majik 0:964eb6a2ef00 244 * Enable the nRF24L01+ to Receive or Transmit (using the CE pin)
majik 0:964eb6a2ef00 245 */
majik 0:964eb6a2ef00 246 void enable(void);
majik 0:964eb6a2ef00 247
majik 0:964eb6a2ef00 248 /**
majik 0:964eb6a2ef00 249 * Disable the nRF24L01+ to Receive or Transmit (using the CE pin)
majik 0:964eb6a2ef00 250 */
majik 0:964eb6a2ef00 251 void disable(void);
majik 0:964eb6a2ef00 252
majik 0:964eb6a2ef00 253 /**
majik 0:964eb6a2ef00 254 * Transmit data
majik 0:964eb6a2ef00 255 *
majik 0:964eb6a2ef00 256 * @param pipe is ignored (included for consistency with file write routine)
majik 0:964eb6a2ef00 257 * @param data pointer to an array of bytes to write
majik 0:964eb6a2ef00 258 * @param count the number of bytes to send (1..32)
majik 0:964eb6a2ef00 259 * @return the number of bytes actually written, or -1 for an error
majik 0:964eb6a2ef00 260 */
majik 0:964eb6a2ef00 261 int write(int pipe, char *data, int count);
majik 0:964eb6a2ef00 262
majik 0:964eb6a2ef00 263 /**
majik 0:964eb6a2ef00 264 * Receive data
majik 0:964eb6a2ef00 265 *
majik 0:964eb6a2ef00 266 * @param pipe the receive pipe to get data from
majik 0:964eb6a2ef00 267 * @param data pointer to an array of bytes to store the received data
majik 0:964eb6a2ef00 268 * @param count the number of bytes to receive (1..32)
majik 0:964eb6a2ef00 269 * @return the number of bytes actually received, 0 if none are received, or -1 for an error
majik 0:964eb6a2ef00 270 */
majik 0:964eb6a2ef00 271 int read(int pipe, char *data, int count);
majik 0:964eb6a2ef00 272
majik 0:964eb6a2ef00 273 /**
majik 0:964eb6a2ef00 274 * Determine if there is data available to read
majik 0:964eb6a2ef00 275 *
majik 0:964eb6a2ef00 276 * @param pipe the receive pipe to check for data
majik 0:964eb6a2ef00 277 * @return true if the is data waiting in the given pipe
majik 0:964eb6a2ef00 278 */
majik 0:964eb6a2ef00 279 bool readable(int pipe = NRF24L01P_PIPE_P0);
majik 0:964eb6a2ef00 280
majik 0:964eb6a2ef00 281 /**
majik 0:964eb6a2ef00 282 * Disable all receive pipes
majik 0:964eb6a2ef00 283 *
majik 0:964eb6a2ef00 284 * Note: receive pipes are enabled when their address is set.
majik 0:964eb6a2ef00 285 */
majik 0:964eb6a2ef00 286 void disableAllRxPipes(void);
majik 0:964eb6a2ef00 287
majik 0:964eb6a2ef00 288 /**
majik 0:964eb6a2ef00 289 * Disable AutoAcknowledge function
majik 0:964eb6a2ef00 290 */
majik 0:964eb6a2ef00 291 void disableAutoAcknowledge(void);
majik 0:964eb6a2ef00 292
majik 0:964eb6a2ef00 293 /**
majik 0:964eb6a2ef00 294 * Enable AutoAcknowledge function
majik 0:964eb6a2ef00 295 *
majik 0:964eb6a2ef00 296 * @param pipe the receive pipe
majik 0:964eb6a2ef00 297 */
majik 0:964eb6a2ef00 298 void enableAutoAcknowledge(int pipe = NRF24L01P_PIPE_P0);
majik 0:964eb6a2ef00 299
majik 0:964eb6a2ef00 300 /**
majik 0:964eb6a2ef00 301 * Disable AutoRetransmit function
majik 0:964eb6a2ef00 302 */
majik 0:964eb6a2ef00 303 void disableAutoRetransmit(void);
majik 0:964eb6a2ef00 304
majik 0:964eb6a2ef00 305 /**
majik 0:964eb6a2ef00 306 * Enable AutoRetransmit function
majik 0:964eb6a2ef00 307 *
majik 0:964eb6a2ef00 308 * @param delay the delay between restransmits, in uS (250uS..4000uS)
majik 0:964eb6a2ef00 309 * @param count number of retransmits before generating an error (1..15)
majik 0:964eb6a2ef00 310 */
majik 0:964eb6a2ef00 311 void enableAutoRetransmit(int delay, int count);
majik 0:964eb6a2ef00 312
majik 0:964eb6a2ef00 313 private:
majik 0:964eb6a2ef00 314
majik 0:964eb6a2ef00 315 /**
majik 0:964eb6a2ef00 316 * Get the contents of an addressable register.
majik 0:964eb6a2ef00 317 *
majik 0:964eb6a2ef00 318 * @param regAddress address of the register
majik 0:964eb6a2ef00 319 * @return the contents of the register
majik 0:964eb6a2ef00 320 */
majik 0:964eb6a2ef00 321 int getRegister(int regAddress);
majik 0:964eb6a2ef00 322
majik 0:964eb6a2ef00 323 /**
majik 0:964eb6a2ef00 324 * Set the contents of an addressable register.
majik 0:964eb6a2ef00 325 *
majik 0:964eb6a2ef00 326 * @param regAddress address of the register
majik 0:964eb6a2ef00 327 * @param regData data to write to the register
majik 0:964eb6a2ef00 328 */
majik 0:964eb6a2ef00 329 void setRegister(int regAddress, int regData);
majik 0:964eb6a2ef00 330
majik 0:964eb6a2ef00 331 /**
majik 0:964eb6a2ef00 332 * Get the contents of the status register.
majik 0:964eb6a2ef00 333 *
majik 0:964eb6a2ef00 334 * @return the contents of the status register
majik 0:964eb6a2ef00 335 */
majik 0:964eb6a2ef00 336 int getStatusRegister(void);
majik 0:964eb6a2ef00 337
majik 0:964eb6a2ef00 338 SPI spi_;
majik 0:964eb6a2ef00 339 DigitalOut nCS_;
majik 0:964eb6a2ef00 340 DigitalOut ce_;
majik 0:964eb6a2ef00 341 InterruptIn nIRQ_;
majik 0:964eb6a2ef00 342
majik 0:964eb6a2ef00 343 int mode;
majik 0:964eb6a2ef00 344
majik 0:964eb6a2ef00 345 };
majik 0:964eb6a2ef00 346
majik 0:964eb6a2ef00 347 #endif /* __NRF24L01P_H__ */