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

Committer:
charly
Date:
Wed Apr 27 19:02:00 2011 +0000
Revision:
0:b79cb3278583

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
charly 0:b79cb3278583 1 #include "mbed.h"
charly 0:b79cb3278583 2 #include "rfm12b.h"
charly 0:b79cb3278583 3 #include "rfm.h"
charly 0:b79cb3278583 4
charly 0:b79cb3278583 5 /*!
charly 0:b79cb3278583 6 * \file rfm12b.cpp
charly 0:b79cb3278583 7 * \brief class for rfm2b in rawmode - only receive part implemented
charly 0:b79cb3278583 8 * \author Karl Zweimüller based on code from WED 6.9.2009
charly 0:b79cb3278583 9 */
charly 0:b79cb3278583 10
charly 0:b79cb3278583 11
charly 0:b79cb3278583 12 /** Class rfm12b for RFM12B transceiver module
charly 0:b79cb3278583 13 http://www.hoperf.com/rf_fsk/rfm12b.htm
charly 0:b79cb3278583 14 */
charly 0:b79cb3278583 15
charly 0:b79cb3278583 16 /** rfm12b object
charly 0:b79cb3278583 17 */
charly 0:b79cb3278583 18 rfm12b::rfm12b(PinName mosi, PinName miso, PinName sclk, PinName nsel, PinName rxdata) {
charly 0:b79cb3278583 19
charly 0:b79cb3278583 20 rfm12b_spi = new SPI(mosi, miso, sclk); // mosi, miso, sclk
charly 0:b79cb3278583 21 cs = new DigitalOut(nsel); // nsel for chipselect
charly 0:b79cb3278583 22 m_pinRXData = new InterruptIn(rxdata); // rxData- generates interrupts
charly 0:b79cb3278583 23
charly 0:b79cb3278583 24 init_spi(); // init the spi-device
charly 0:b79cb3278583 25 }
charly 0:b79cb3278583 26
charly 0:b79cb3278583 27 /** init the spi-communication
charly 0:b79cb3278583 28 */
charly 0:b79cb3278583 29 void rfm12b::init_spi() {
charly 0:b79cb3278583 30 // Setup the spi for 16 bit data : 1RW-bit 7 adressbit, 8 databit
charly 0:b79cb3278583 31 // second edge capture, with a 5MHz clock rate
charly 0:b79cb3278583 32 rfm12b_spi->format(16,0);
charly 0:b79cb3278583 33 rfm12b_spi->frequency(5000000);
charly 0:b79cb3278583 34 }
charly 0:b79cb3278583 35
charly 0:b79cb3278583 36 ///////////////////////////////////////////////////////////////////////////////
charly 0:b79cb3278583 37 //
charly 0:b79cb3278583 38 // Initialise RF module
charly 0:b79cb3278583 39 // This are parameters for ETH Comfort by ELV
charly 0:b79cb3278583 40 ///////////////////////////////////////////////////////////////////////////////
charly 0:b79cb3278583 41 void rfm12b::RFM_init(void) {
charly 0:b79cb3278583 42
charly 0:b79cb3278583 43 // 0. Init the SPI backend
charly 0:b79cb3278583 44 //RFM_TESTPIN_INIT;
charly 0:b79cb3278583 45
charly 0:b79cb3278583 46 //RFM_READ_STATUS();
charly 0:b79cb3278583 47
charly 0:b79cb3278583 48 // 1. Configuration Setting Command
charly 0:b79cb3278583 49 RFM_SPI_16(
charly 0:b79cb3278583 50 //RFM_CONFIG_EL |
charly 0:b79cb3278583 51 //RFM_CONFIG_EF |
charly 0:b79cb3278583 52 RFM_CONFIG_BAND_868 |
charly 0:b79cb3278583 53 RFM_CONFIG_X_11_0pf
charly 0:b79cb3278583 54 );
charly 0:b79cb3278583 55
charly 0:b79cb3278583 56 // 2. Power Management Command
charly 0:b79cb3278583 57 //RFM_SPI_16(
charly 0:b79cb3278583 58 // RFM_POWER_MANAGEMENT // switch all off
charly 0:b79cb3278583 59 // );
charly 0:b79cb3278583 60
charly 0:b79cb3278583 61 // 3. Frequency Setting Command
charly 0:b79cb3278583 62 RFM_SPI_16(
charly 0:b79cb3278583 63 RFM_FREQUENCY |
charly 0:b79cb3278583 64 RFM_FREQ_868Band(868.30)
charly 0:b79cb3278583 65 );
charly 0:b79cb3278583 66
charly 0:b79cb3278583 67 // 4. Data Rate Command
charly 0:b79cb3278583 68 RFM_SPI_16(RFM_DATA_RATE_9600);
charly 0:b79cb3278583 69
charly 0:b79cb3278583 70 // 5. Receiver Control Command
charly 0:b79cb3278583 71 RFM_SPI_16(
charly 0:b79cb3278583 72 RFM_RX_CONTROL_P20_VDI |
charly 0:b79cb3278583 73 RFM_RX_CONTROL_VDI_FAST |
charly 0:b79cb3278583 74 //RFM_RX_CONTROL_BW(RFM_BAUD_RATE) |
charly 0:b79cb3278583 75 RFM_RX_CONTROL_BW_134 |
charly 0:b79cb3278583 76 RFM_RX_CONTROL_GAIN_0 |
charly 0:b79cb3278583 77 RFM_RX_CONTROL_RSSI_73
charly 0:b79cb3278583 78 );
charly 0:b79cb3278583 79
charly 0:b79cb3278583 80 // 6. Data Filter Command
charly 0:b79cb3278583 81 RFM_SPI_16(
charly 0:b79cb3278583 82 //RFM_DATA_FILTER_AL |
charly 0:b79cb3278583 83 //RFM_DATA_FILTER_ML |
charly 0:b79cb3278583 84 //RFM_DATA_FILTER_DQD(3)
charly 0:b79cb3278583 85 RFM_DATA_FILTER_ANALOG
charly 0:b79cb3278583 86 );
charly 0:b79cb3278583 87
charly 0:b79cb3278583 88 // 7. FIFO and Reset Mode Command
charly 0:b79cb3278583 89 RFM_SPI_16(
charly 0:b79cb3278583 90 RFM_FIFO_IT(8) |
charly 0:b79cb3278583 91 RFM_FIFO_DR
charly 0:b79cb3278583 92 );
charly 0:b79cb3278583 93
charly 0:b79cb3278583 94 // 8. Receiver FIFO Read
charly 0:b79cb3278583 95
charly 0:b79cb3278583 96 // 9. AFC Command
charly 0:b79cb3278583 97 RFM_SPI_16(
charly 0:b79cb3278583 98 RFM_AFC_AUTO_VDI |
charly 0:b79cb3278583 99 RFM_AFC_RANGE_LIMIT_7_8 |
charly 0:b79cb3278583 100 RFM_AFC_EN |
charly 0:b79cb3278583 101 RFM_AFC_OE |
charly 0:b79cb3278583 102 RFM_AFC_FI
charly 0:b79cb3278583 103 );
charly 0:b79cb3278583 104
charly 0:b79cb3278583 105 // 10. TX Configuration Control Command
charly 0:b79cb3278583 106 RFM_SPI_16(
charly 0:b79cb3278583 107 RFM_TX_CONTROL_MOD_30 |
charly 0:b79cb3278583 108 RFM_TX_CONTROL_POW_0
charly 0:b79cb3278583 109 );
charly 0:b79cb3278583 110
charly 0:b79cb3278583 111 // 11. Transmitter Register Write Command
charly 0:b79cb3278583 112
charly 0:b79cb3278583 113 // 12. Wake-Up Timer Command
charly 0:b79cb3278583 114
charly 0:b79cb3278583 115 // 13. Low Duty-Cycle Command
charly 0:b79cb3278583 116
charly 0:b79cb3278583 117 // 14. Low Battery Detector Command
charly 0:b79cb3278583 118
charly 0:b79cb3278583 119 //RFM_SPI_16(
charly 0:b79cb3278583 120 // RFM_LOW_BATT_DETECT |
charly 0:b79cb3278583 121 // 3 // 2.2V + v * 0.1V
charly 0:b79cb3278583 122 // );
charly 0:b79cb3278583 123
charly 0:b79cb3278583 124 // 15. Status Read Command
charly 0:b79cb3278583 125 //RFM_SPI_16(RFM_TX_ON());
charly 0:b79cb3278583 126 RFM_SPI_16(RFM_RX_ON());
charly 0:b79cb3278583 127
charly 0:b79cb3278583 128 }
charly 0:b79cb3278583 129
charly 0:b79cb3278583 130 ///////////////////////////////////////////////////////////////////////////////
charly 0:b79cb3278583 131
charly 0:b79cb3278583 132
charly 0:b79cb3278583 133
charly 0:b79cb3278583 134 /** write and read 16 bit to device
charly 0:b79cb3278583 135 */
charly 0:b79cb3278583 136 uint16_t rfm12b::rfm_spi16(uint16_t outval) {
charly 0:b79cb3278583 137
charly 0:b79cb3278583 138 uint16_t readval;
charly 0:b79cb3278583 139 // Select the device by seting chip select low
charly 0:b79cb3278583 140 cs->write(0);
charly 0:b79cb3278583 141 wait_ms(1); // wait before going on
charly 0:b79cb3278583 142 //write and read
charly 0:b79cb3278583 143 readval = rfm12b_spi->write(outval);
charly 0:b79cb3278583 144 // Deselect the device
charly 0:b79cb3278583 145 cs->write(1);
charly 0:b79cb3278583 146 wait_ms(1); // wait before going on
charly 0:b79cb3278583 147 return(readval);
charly 0:b79cb3278583 148 }
charly 0:b79cb3278583 149
charly 0:b79cb3278583 150