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:
- 8:6fc24b44e027
- Parent:
- 7:9f9e2a63a8a2
- Child:
- 9:cd34784da6da
--- a/RF12B.cpp Fri Mar 11 19:30:30 2011 +0000 +++ b/RF12B.cpp Fri Mar 11 20:40:43 2011 +0000 @@ -1,8 +1,7 @@ #include "RF12B.h" #include "RF_defs.h" - -DigitalOut rfled(LED3); +#include <algorithm> RF12B::RF12B(PinName _SDI, PinName _SDO, @@ -58,6 +57,7 @@ /* Sends a packet of data to the RF module for transmission TODO: Make asych*/ void RF12B::write(unsigned char *data, unsigned char length) { unsigned char crc = 0; + /* Transmitter mode */ changeMode(TX); @@ -92,6 +92,48 @@ write(&data, 1); } +void RF12B::write(queue<char> &data, int length) { + char crc = 0; + char length_byte = 0; + + /* -1 means try to transmit everything in the queue */ + if(length == -1) { + length = data.size(); + } + + /* max length of packet is 255 */ + length_byte = min(length, 255); + + /* Transmitter mode */ + changeMode(TX); + + writeCmd(0x0000); + send(0xAA); // PREAMBLE + send(0xAA); + send(0xAA); + send(0x2D); // SYNC + send(0xD4); + /* Packet Length */ + send(length_byte); + crc = crc8(crc, length_byte); + send(crc); + crc = crc8(crc, crc); + /* Packet Data */ + for (char i=0; i<length_byte; i++) { + send(data.front()); + crc = crc8(crc, data.front()); + data.pop(); + } + send(crc); + send(0xAA); // DUMMY BYTES + send(0xAA); + send(0xAA); + + /* Back to receiver mode */ + changeMode(RX); + status(); +} + /********************************************************************** * PRIVATE FUNCTIONS *********************************************************************/ @@ -213,8 +255,9 @@ } /* Change the mode of the RF module to Transmitting or Receiving */ -void RF12B::changeMode(rfmode_t mode) { - if (mode == TX) { +void RF12B::changeMode(rfmode_t _mode) { + mode = _mode; + if (_mode == TX) { writeCmd(0x8239); //!er,!ebb,ET,ES,EX,!eb,!ew,DC } else { /* mode == RX */ writeCmd(0x8299); //er,!ebb,ET,ES,EX,!eb,!ew,DC @@ -230,7 +273,7 @@ static queue<unsigned char> temp; //Loop while interrupt is asserted - while (!NIRQ_in) { + while (!NIRQ_in && mode == RX) { /* Grab the packet's length byte */ if (i == -2) {