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
rfm12b.cpp@0:b79cb3278583, 2011-04-27 (annotated)
- Committer:
- charly
- Date:
- Wed Apr 27 19:02:00 2011 +0000
- Revision:
- 0:b79cb3278583
Who changed what in which revision?
User | Revision | Line number | New 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 |