Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers RF12B.h Source File

RF12B.h

00001 #ifndef _RF12B_H
00002 #define _RF12B_H
00003 
00004 #include "mbed.h"
00005 #define RF12_433MHZ     1
00006 #define RF12_868MHZ     2
00007 #define RF12_915MHZ     3
00008 
00009 #define rf12_grp        rf12_buf[0]
00010 #define rf12_hdr        rf12_buf[1]
00011 #define rf12_len        rf12_buf[2]
00012 #define rf12_data       (rf12_buf + 3)
00013 
00014 #define RF12_HDR_CTL    0x80
00015 #define RF12_HDR_DST    0x40
00016 #define RF12_HDR_ACK    0x20
00017 #define RF12_HDR_MASK   0x1F
00018 
00019 #define RF12_MAXDATA    66
00020 // maximum transmit / receive buffer: 3 header + data + 2 crc bytes
00021 #define RF_MAX   (RF12_MAXDATA + 5)
00022 #define PACKET_LEN 16
00023 
00024 // shorthand to simplify sending out the proper ACK when requested
00025 #define RF12_WANTS_ACK ((rf12_hdr & RF12_HDR_ACK) && !(rf12_hdr & RF12_HDR_CTL))
00026 #define RF12_ACK_REPLY (rf12_hdr & RF12_HDR_DST ? RF12_HDR_CTL : \
00027             RF12_HDR_CTL | RF12_HDR_DST | (rf12_hdr & RF12_HDR_MASK))
00028  
00029 // New for mbed 
00030 #define RF12_WANTS_ACK_MBED ((radiolink.get_hdr() & RF12_HDR_ACK) && !(radiolink.get_hdr() & RF12_HDR_CTL))
00031 #define RF12_ACK_REPLY_MBED (radiolink.get_hdr() & RF12_HDR_DST ? RF12_HDR_CTL : \
00032             RF12_HDR_CTL | RF12_HDR_DST | (radiolink.get_hdr() & RF12_HDR_MASK))
00033                        
00034             
00035 //enum rfmode_t{RX, TX};
00036 
00037 class RF12B {
00038 public:
00039     /* Constructor */
00040     RF12B(PinName SDI,
00041           PinName SDO,
00042           PinName SCK,
00043           PinName NCS,
00044           PinName NIRQ);
00045    
00046      
00047     /* Initialises the RF12B module */
00048     void init(uint8_t id, uint8_t band, uint8_t g);
00049         
00050  
00051     /* Returns the packet length if data is available in the receive buffer, 0 otherwise*/
00052    unsigned int available();
00053    void rf12_sendStart (uint8_t hdr, const void* ptr, uint8_t len);
00054    void rf12_sendStart2 (uint8_t hdr); 
00055    uint8_t  rf12_recvDone (void);
00056    void rf12_recvStart (void);
00057    uint16_t check_crc(void);
00058    uint8_t length(void);
00059    uint8_t* get_data(void);
00060    uint8_t get_hdr(void);
00061    
00062 protected:
00063 
00064     /* SPI module */
00065     SPI spi;
00066     
00067     /* Other digital pins */
00068     DigitalOut NCS;
00069     InterruptIn NIRQ;
00070     DigitalIn NIRQ_in;
00071 
00072     volatile uint16_t rf12_crc; // running crc value
00073     volatile unsigned char rf12_buf[RF_MAX];  // recv/xmit buf, including hdr & crc bytes  
00074     volatile  uint8_t nodeid;              // address of this node
00075     volatile  uint8_t group;               // network grou
00076     volatile uint8_t rxfill;     // number of data bytes in rf12_buf
00077     volatile int8_t rxstate;     // current transceiver state
00078  
00079 
00080     /* Write a command to the RF Module */
00081     unsigned int writeCmd(unsigned int cmd);
00082     
00083     /* Sends a byte of data across RF */
00084     void send(unsigned char data);
00085     
00086     /* Interrupt routine for data reception */
00087     void rxISR();
00088     
00089 
00090     uint16_t _crc16_update(uint16_t crc, uint8_t data);
00091     
00092     uint16_t rf12_xfer (uint16_t cmd);    
00093     uint8_t rf12_byte(uint8_t out);
00094 };
00095 
00096 #endif /* _RF12B_H */