RFM12B radio module driver library
Fork of RF12B by
Diff: RF12B.h
- Revision:
- 0:e724d8251cdc
- Child:
- 2:a5808054ac5f
diff -r 000000000000 -r e724d8251cdc RF12B.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/RF12B.h Sat Mar 31 07:11:16 2012 +0000 @@ -0,0 +1,132 @@ +/* RF12B Library. Based on work done by JeeLabs.org ported to mbed by SK Pang. +http://jeelabs.net/projects/cafe/wiki/RF12 + +http://opensource.org/licenses/mit-license.php + +Jan 2012 skpang.co.uk + +Modified by Andrew Lindsay (andrew [at] thiseldo [dot] co [dot] uk) + +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. +*/ + +#ifndef _RF12B_H +#define _RF12B_H + +#include "mbed.h" + +#define RF12_433MHZ 1 +#define RF12_868MHZ 2 +#define RF12_915MHZ 3 + +#define rf12_grp rf12_buf[0] +#define rf12_hdr rf12_buf[1] +#define rf12_len rf12_buf[2] +#define rf12_data (rf12_buf + 3) + +#define RF12_HDR_CTL 0x80 +#define RF12_HDR_DST 0x40 +#define RF12_HDR_ACK 0x20 +#define RF12_HDR_MASK 0x1F + +#define RF12_MAXDATA 66 +// maximum transmit / receive buffer: 3 header + data + 2 crc bytes +#define RF_MAX (RF12_MAXDATA + 5) +//#define PACKET_LEN 16 + +// shorthand to simplify sending out the proper ACK when requested +#define RF12_WANTS_ACK ((rf12_hdr & RF12_HDR_ACK) && !(rf12_hdr & RF12_HDR_CTL)) +#define RF12_ACK_REPLY (rf12_hdr & RF12_HDR_DST ? RF12_HDR_CTL : \ + RF12_HDR_CTL | RF12_HDR_DST | (rf12_hdr & RF12_HDR_MASK)) + +/** RFM12B Radio module class + * Example usage: + * @code + * #include "RF12B.h" + * + * RF12B rfm12b(p11, p12, p13, p14, p18); + * + * int main() { + * rfm12b.init(2, 868, 5 ); //id = 2, band 866, group 5 + * rfm12b.rf12_recvStart(); + * while (true) { + * if ( rfm12b.available() > 0 ) { + * // Do something with received data + * } + * } + * + * } + * @endcode + */ +class RF12B { +public: + /* Constructor */ + RF12B(PinName SDI, + PinName SDO, + PinName SCK, + PinName NCS, + PinName NIRQ); + + /* Initialises the RF12B module */ + void init(uint8_t id, uint8_t band, uint8_t g); + + /* Returns the packet length if data is available in the receive buffer, 0 otherwise*/ + bool havePacket( void ); + int available(); + void rf12_sendStart (uint8_t hdr, const void* ptr, uint8_t len); + void rf12_sendStart (uint8_t hdr); + uint8_t rf12_recvDone (void); + void rf12_recvStart (void); + uint16_t check_crc(void); + uint8_t length(void); + uint8_t* get_data(void); + uint8_t* get_payload(void); + +protected: + + /* SPI module */ + SPI spi; + + /* Other digital pins */ + DigitalOut NCS; + InterruptIn NIRQ; + DigitalIn NIRQ_in; + volatile uint16_t rf12_crc; // running crc value + volatile unsigned char rf12_buf[RF_MAX]; // recv/xmit buf, including hdr & crc bytes + volatile uint8_t nodeid; // address of this node + volatile uint8_t group; // network group + volatile uint8_t rxfill; // number of data bytes in rf12_buf + volatile int8_t rxstate; // current transceiver state + + /* Write a command to the RF Module */ + int writeCmd(int cmd); + + /* Sends a byte of data across RF */ + void send(uint8_t data); + + /* Interrupt routine for data reception */ + void rxISR(); + + uint16_t _crc16_update(uint16_t crc, uint8_t data); + + uint16_t rf12_xfer (uint16_t cmd); + uint8_t rf12_byte(uint8_t out); +}; + +#endif /* _RF12B_H */ \ No newline at end of file