Program for decoding radio-signals sent by a ETH-Window-Shutter-Contact, received with a RFM12B-module. The messages are sent to KNX via a freebus rs-interface. Details see http://mbed.org/users/charly/notebook/connecting-a-radio-window-shutter-contact-to-knx/

Dependencies:   TextLCD mbed ConfigFile

Revision:
0:b79cb3278583
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfm12b.cpp	Wed Apr 27 19:02:00 2011 +0000
@@ -0,0 +1,150 @@
+#include "mbed.h"
+#include "rfm12b.h"
+#include "rfm.h"
+
+/*!
+ * \file       rfm12b.cpp
+ * \brief      class for rfm2b in rawmode - only receive part implemented
+ * \author     Karl Zweimüller based on code from WED 6.9.2009
+ */
+
+
+/** Class rfm12b for RFM12B transceiver module
+  http://www.hoperf.com/rf_fsk/rfm12b.htm
+*/
+
+/** rfm12b object
+*/
+rfm12b::rfm12b(PinName mosi, PinName miso, PinName sclk, PinName nsel, PinName rxdata) {
+
+    rfm12b_spi  = new SPI(mosi, miso, sclk);   // mosi, miso, sclk
+    cs          = new DigitalOut(nsel);        // nsel for chipselect
+    m_pinRXData = new InterruptIn(rxdata);     // rxData- generates interrupts
+
+    init_spi();            // init the spi-device
+}
+
+/** init the spi-communication
+*/
+void rfm12b::init_spi() {
+    // Setup the spi for 16 bit data : 1RW-bit 7 adressbit, 8 databit
+    // second edge capture, with a 5MHz clock rate
+    rfm12b_spi->format(16,0);
+    rfm12b_spi->frequency(5000000);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Initialise RF module
+// This are parameters for ETH Comfort by ELV
+///////////////////////////////////////////////////////////////////////////////
+void rfm12b::RFM_init(void) {
+
+    // 0. Init the SPI backend
+    //RFM_TESTPIN_INIT;
+
+    //RFM_READ_STATUS();
+
+    // 1. Configuration Setting Command
+    RFM_SPI_16(
+        //RFM_CONFIG_EL           |
+        //RFM_CONFIG_EF           |
+        RFM_CONFIG_BAND_868     |
+        RFM_CONFIG_X_11_0pf
+    );
+
+    // 2. Power Management Command
+    //RFM_SPI_16(
+    //     RFM_POWER_MANAGEMENT     // switch all off
+    //     );
+
+    // 3. Frequency Setting Command
+    RFM_SPI_16(
+        RFM_FREQUENCY            |
+        RFM_FREQ_868Band(868.30)
+    );
+
+    // 4. Data Rate Command
+    RFM_SPI_16(RFM_DATA_RATE_9600);
+
+    // 5. Receiver Control Command
+    RFM_SPI_16(
+        RFM_RX_CONTROL_P20_VDI  |
+        RFM_RX_CONTROL_VDI_FAST |
+        //RFM_RX_CONTROL_BW(RFM_BAUD_RATE) |
+        RFM_RX_CONTROL_BW_134 |
+        RFM_RX_CONTROL_GAIN_0   |
+        RFM_RX_CONTROL_RSSI_73
+    );
+
+    // 6. Data Filter Command
+    RFM_SPI_16(
+        //RFM_DATA_FILTER_AL      |
+        //RFM_DATA_FILTER_ML      |
+        //RFM_DATA_FILTER_DQD(3)
+        RFM_DATA_FILTER_ANALOG
+    );
+
+    // 7. FIFO and Reset Mode Command
+    RFM_SPI_16(
+        RFM_FIFO_IT(8) |
+        RFM_FIFO_DR
+    );
+
+    // 8. Receiver FIFO Read
+
+    // 9. AFC Command
+    RFM_SPI_16(
+        RFM_AFC_AUTO_VDI        |
+        RFM_AFC_RANGE_LIMIT_7_8 |
+        RFM_AFC_EN              |
+        RFM_AFC_OE              |
+        RFM_AFC_FI
+    );
+
+    // 10. TX Configuration Control Command
+    RFM_SPI_16(
+        RFM_TX_CONTROL_MOD_30 |
+        RFM_TX_CONTROL_POW_0
+    );
+
+    // 11. Transmitter Register Write Command
+
+    // 12. Wake-Up Timer Command
+
+    // 13. Low Duty-Cycle Command
+
+    // 14. Low Battery Detector Command
+
+    //RFM_SPI_16(
+    //     RFM_LOW_BATT_DETECT |
+    //     3      // 2.2V + v * 0.1V
+    //     );
+
+    // 15. Status Read Command
+    //RFM_SPI_16(RFM_TX_ON());
+    RFM_SPI_16(RFM_RX_ON());
+
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+
+
+/** write and read 16 bit to device
+*/
+uint16_t rfm12b::rfm_spi16(uint16_t outval) {
+
+    uint16_t    readval;
+    // Select the device by seting chip select low
+    cs->write(0);
+    wait_ms(1);               // wait before going on
+    //write and read
+    readval = rfm12b_spi->write(outval);
+    // Deselect the device
+    cs->write(1);
+    wait_ms(1);               // wait before going on
+    return(readval);
+}
+
+