Library to send and receive data using RF12B transceiver modules Big thanks to the tutorial at https://loee.jottit.com/rfm12b_and_avr_-_quick_start and madcowswe
Dependents: Measure_system Quadcopter_copy
RF12B.cpp
- Committer:
- harryeakins
- Date:
- 2011-03-10
- Revision:
- 0:bd1232f200be
- Child:
- 1:42b124ed1f57
File content as of revision 0:bd1232f200be:
#include "RF12B.h" RF12B::RF12B(PinName SDI, PinName SDO, PinName SCK, PinName NCS, PinName NIRQ):spi(SDI, SDO, SCK), NCS(NCS), NIRQ(NIRQ) { this->initialized = false; this->trans = false; this->spi.format(16,0); this->spi.frequency(2000000); this->NCS = 1; } /* Initialises the RF12B module as transmitter or receiver. This should be called after the RF module has fully started up (give it a few hundred ms) */ void RF12B::init(bool _trans) { trans = _trans; writeCmd(0x80E7); //EL,EF,868band,12.0pF if (trans) { writeCmd(0x8239); //!er,!ebb,ET,ES,EX,!eb,!ew,DC } else { writeCmd(0x8299); //er,!ebb,ET,ES,EX,!eb,!ew,DC } writeCmd(0xA640); //frequency select writeCmd(0xC647); //4.8kbps writeCmd(0x94A0); //VDI,FAST,134kHz,0dBm,-103dBm writeCmd(0xC2AC); //AL,!ml,DIG,DQD4 writeCmd(0xCA81); //FIFO8,SYNC,!ff,DR writeCmd(0xCED4); //SYNC=2DD4 writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN writeCmd(0x9850); //!mp,90kHz,MAX OUT writeCmd(0xCC17); //OB1, COB0, LPX, Iddy, CDDITCBW0 writeCmd(0xE000); //NOT USED writeCmd(0xC800); //NOT USED writeCmd(0xC040); //1.66MHz,2.2V initialized = true; } /* Reads a byte of data from the RF module's buffer This is a blocking call */ unsigned char RF12B::read() { if (!initialized) { init(false); //Receiver trans = false; initialized = true; } if(trans) { return 0; } unsigned int data; while (1) { data = writeCmd(0x0000); if ( (data&0x8000) ) { data = writeCmd(0xB000); return (data&0x00FF); } } } /* Sends a byte of data to the RF module for transmission */ void RF12B::write(unsigned char data) { if (!initialized) { init(true); //Transmitter trans = true; initialized = true; } if (!trans) { return; // Must be in transmitter mode! } while (NIRQ); writeCmd(0xB800 + data); } /* Flushes all data from the RF module's buffer */ void RF12B::flush() { if (!trans) { writeCmd(0xCA81); writeCmd(0xCA83); } }; unsigned int RF12B::writeCmd(unsigned int cmd) { unsigned int recv; NCS = 0; recv = spi.write(cmd); NCS = 1; return recv; }