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

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, CDDITCBW0
+    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;
+}