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
Diff: RF12B.cpp
- Revision:
- 0:bd1232f200be
- Child:
- 1:42b124ed1f57
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/RF12B.cpp Thu Mar 10 10:56:15 2011 +0000 @@ -0,0 +1,97 @@ +#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; +}