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:
- 3:e72ad65868ab
- Parent:
- 2:99cf337cd23e
- Child:
- 4:2a295db9ba1a
--- a/RF12B.cpp Thu Mar 10 12:48:08 2011 +0000 +++ b/RF12B.cpp Thu Mar 10 13:14:48 2011 +0000 @@ -1,117 +1,117 @@ -#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; - - init(); - mode(false);// Receiver - flush(); -} - - -/* Reads a byte of data from the RF module's buffer - This is a blocking call */ -unsigned char RF12B::read() { - if (!initialized || trans) { - mode(false); //Receiver - trans = false; - initialized = true; - } - - 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 || !trans) { - mode(true); //Transmitter - trans = true; - initialized = true; - } - writeCmd(0x0000); - send(0xAA); // PREAMBLE - send(0xAA); - send(0xAA); - send(0x2D); // SYNC - send(0xD4); - for (int i=0; i<16; i++) { - send(data[i]); - } - send(0xAA); // DUMMY BYTES - send(0xAA); - send(0xAA); - - mode(false); - trans = false; -} - -void RF12B::send(unsigned char data) { - while (NIRQ); - writeCmd(0xB800 + data); -} - -/* Flushes all data from the RF module's buffer */ -void RF12B::flush() { - if (!trans) { - writeCmd(0xCA81); - writeCmd(0xCA83); - } -}; - -/* 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() { - - writeCmd(0x80E7); //EL,EF,868band,12.0pF - mode(false); - trans = false; - 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, CDDITÂCBW0 - writeCmd(0xE000); //NOT USED - writeCmd(0xC800); //NOT USED - writeCmd(0xC040); //1.66MHz,2.2V - - initialized = true; -} - -void RF12B::mode(bool trans) { - if (trans) { - writeCmd(0x8239); //!er,!ebb,ET,ES,EX,!eb,!ew,DC - } else { - writeCmd(0x8299); //er,!ebb,ET,ES,EX,!eb,!ew,DC - } -} - -unsigned int RF12B::writeCmd(unsigned int cmd) { - unsigned int recv; - NCS = 0; - recv = spi.write(cmd); - NCS = 1; - return recv; -} +#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; + + init(); + mode(false);// Receiver + flush(); +} + + +/* Reads a byte of data from the RF module's buffer + This is a blocking call */ +unsigned char RF12B::read() { + if (!initialized || trans) { + mode(false); //Receiver + trans = false; + initialized = true; + } + + 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, unsigned int length) { + if (!initialized || !trans) { + mode(true); //Transmitter + trans = true; + initialized = true; + } + writeCmd(0x0000); + send(0xAA); // PREAMBLE + send(0xAA); + send(0xAA); + send(0x2D); // SYNC + send(0xD4); + for (int i=0; i<length; i++) { + send(data[i]); + } + send(0xAA); // DUMMY BYTES + send(0xAA); + send(0xAA); + + mode(false); + trans = false; +} + +void RF12B::send(unsigned char data) { + while (NIRQ); + writeCmd(0xB800 + data); +} + +/* Flushes all data from the RF module's buffer */ +void RF12B::flush() { + if (!trans) { + writeCmd(0xCA81); + writeCmd(0xCA83); + } +}; + +/* 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() { + + writeCmd(0x80E7); //EL,EF,868band,12.0pF + mode(false); + trans = false; + 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; +} + +void RF12B::mode(bool trans) { + if (trans) { + writeCmd(0x8239); //!er,!ebb,ET,ES,EX,!eb,!ew,DC + } else { + writeCmd(0x8299); //er,!ebb,ET,ES,EX,!eb,!ew,DC + } +} + +unsigned int RF12B::writeCmd(unsigned int cmd) { + unsigned int recv; + NCS = 0; + recv = spi.write(cmd); + NCS = 1; + return recv; +}