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:
- 3:e72ad65868ab
- Parent:
- 2:99cf337cd23e
- Child:
- 4:2a295db9ba1a
File content as of revision 3:e72ad65868ab:
#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; }