V148

Fork of RadioHead-148 by David Rimer

Committer:
davidr99
Date:
Thu Oct 15 01:27:00 2015 +0000
Revision:
0:ab4e012489ef
Messy start, but a port for RadioHead.; Currently the SPI modulus are the only ones that work.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
davidr99 0:ab4e012489ef 1 // RH_RF22.h
davidr99 0:ab4e012489ef 2 // Author: Mike McCauley (mikem@airspayce.com)
davidr99 0:ab4e012489ef 3 // Copyright (C) 2011 Mike McCauley
davidr99 0:ab4e012489ef 4 // $Id: RH_RF22.h,v 1.27 2015/05/17 00:11:26 mikem Exp $
davidr99 0:ab4e012489ef 5 //
davidr99 0:ab4e012489ef 6
davidr99 0:ab4e012489ef 7 #ifndef RH_RF22_h
davidr99 0:ab4e012489ef 8 #define RH_RF22_h
davidr99 0:ab4e012489ef 9
davidr99 0:ab4e012489ef 10 #include <RHGenericSPI.h>
davidr99 0:ab4e012489ef 11 #include <RHSPIDriver.h>
davidr99 0:ab4e012489ef 12
davidr99 0:ab4e012489ef 13 // This is the maximum number of interrupts the library can support
davidr99 0:ab4e012489ef 14 // Most Arduinos can handle 2, Megas can handle more
davidr99 0:ab4e012489ef 15 #define RH_RF22_NUM_INTERRUPTS 3
davidr99 0:ab4e012489ef 16
davidr99 0:ab4e012489ef 17 // This is the bit in the SPI address that marks it as a write
davidr99 0:ab4e012489ef 18 #define RH_RF22_SPI_WRITE_MASK 0x80
davidr99 0:ab4e012489ef 19
davidr99 0:ab4e012489ef 20 // This is the maximum message length that can be supported by this library. Limited by
davidr99 0:ab4e012489ef 21 // the single message length octet in the header.
davidr99 0:ab4e012489ef 22 // Yes, 255 is correct even though the FIFO size in the RF22 is only
davidr99 0:ab4e012489ef 23 // 64 octets. We use interrupts to refill the Tx FIFO during transmission and to empty the
davidr99 0:ab4e012489ef 24 // Rx FIFO during reception
davidr99 0:ab4e012489ef 25 // Can be pre-defined to a smaller size (to save SRAM) prior to including this header
davidr99 0:ab4e012489ef 26 #ifndef RH_RF22_MAX_MESSAGE_LEN
davidr99 0:ab4e012489ef 27 //#define RH_RF22_MAX_MESSAGE_LEN 255
davidr99 0:ab4e012489ef 28 #define RH_RF22_MAX_MESSAGE_LEN 50
davidr99 0:ab4e012489ef 29 #endif
davidr99 0:ab4e012489ef 30
davidr99 0:ab4e012489ef 31 // Max number of octets the RF22 Rx and Tx FIFOs can hold
davidr99 0:ab4e012489ef 32 #define RH_RF22_FIFO_SIZE 64
davidr99 0:ab4e012489ef 33
davidr99 0:ab4e012489ef 34 // These values we set for FIFO thresholds (4, 55) are actually the same as the POR values
davidr99 0:ab4e012489ef 35 #define RH_RF22_TXFFAEM_THRESHOLD 4
davidr99 0:ab4e012489ef 36 #define RH_RF22_RXFFAFULL_THRESHOLD 55
davidr99 0:ab4e012489ef 37
davidr99 0:ab4e012489ef 38 // Number of registers to be passed to setModemConfig(). Obsolete.
davidr99 0:ab4e012489ef 39 #define RH_RF22_NUM_MODEM_CONFIG_REGS 18
davidr99 0:ab4e012489ef 40
davidr99 0:ab4e012489ef 41 // Register names
davidr99 0:ab4e012489ef 42 #define RH_RF22_REG_00_DEVICE_TYPE 0x00
davidr99 0:ab4e012489ef 43 #define RH_RF22_REG_01_VERSION_CODE 0x01
davidr99 0:ab4e012489ef 44 #define RH_RF22_REG_02_DEVICE_STATUS 0x02
davidr99 0:ab4e012489ef 45 #define RH_RF22_REG_03_INTERRUPT_STATUS1 0x03
davidr99 0:ab4e012489ef 46 #define RH_RF22_REG_04_INTERRUPT_STATUS2 0x04
davidr99 0:ab4e012489ef 47 #define RH_RF22_REG_05_INTERRUPT_ENABLE1 0x05
davidr99 0:ab4e012489ef 48 #define RH_RF22_REG_06_INTERRUPT_ENABLE2 0x06
davidr99 0:ab4e012489ef 49 #define RH_RF22_REG_07_OPERATING_MODE1 0x07
davidr99 0:ab4e012489ef 50 #define RH_RF22_REG_08_OPERATING_MODE2 0x08
davidr99 0:ab4e012489ef 51 #define RH_RF22_REG_09_OSCILLATOR_LOAD_CAPACITANCE 0x09
davidr99 0:ab4e012489ef 52 #define RH_RF22_REG_0A_UC_OUTPUT_CLOCK 0x0a
davidr99 0:ab4e012489ef 53 #define RH_RF22_REG_0B_GPIO_CONFIGURATION0 0x0b
davidr99 0:ab4e012489ef 54 #define RH_RF22_REG_0C_GPIO_CONFIGURATION1 0x0c
davidr99 0:ab4e012489ef 55 #define RH_RF22_REG_0D_GPIO_CONFIGURATION2 0x0d
davidr99 0:ab4e012489ef 56 #define RH_RF22_REG_0E_IO_PORT_CONFIGURATION 0x0e
davidr99 0:ab4e012489ef 57 #define RH_RF22_REG_0F_ADC_CONFIGURATION 0x0f
davidr99 0:ab4e012489ef 58 #define RH_RF22_REG_10_ADC_SENSOR_AMP_OFFSET 0x10
davidr99 0:ab4e012489ef 59 #define RH_RF22_REG_11_ADC_VALUE 0x11
davidr99 0:ab4e012489ef 60 #define RH_RF22_REG_12_TEMPERATURE_SENSOR_CALIBRATION 0x12
davidr99 0:ab4e012489ef 61 #define RH_RF22_REG_13_TEMPERATURE_VALUE_OFFSET 0x13
davidr99 0:ab4e012489ef 62 #define RH_RF22_REG_14_WAKEUP_TIMER_PERIOD1 0x14
davidr99 0:ab4e012489ef 63 #define RH_RF22_REG_15_WAKEUP_TIMER_PERIOD2 0x15
davidr99 0:ab4e012489ef 64 #define RH_RF22_REG_16_WAKEUP_TIMER_PERIOD3 0x16
davidr99 0:ab4e012489ef 65 #define RH_RF22_REG_17_WAKEUP_TIMER_VALUE1 0x17
davidr99 0:ab4e012489ef 66 #define RH_RF22_REG_18_WAKEUP_TIMER_VALUE2 0x18
davidr99 0:ab4e012489ef 67 #define RH_RF22_REG_19_LDC_MODE_DURATION 0x19
davidr99 0:ab4e012489ef 68 #define RH_RF22_REG_1A_LOW_BATTERY_DETECTOR_THRESHOLD 0x1a
davidr99 0:ab4e012489ef 69 #define RH_RF22_REG_1B_BATTERY_VOLTAGE_LEVEL 0x1b
davidr99 0:ab4e012489ef 70 #define RH_RF22_REG_1C_IF_FILTER_BANDWIDTH 0x1c
davidr99 0:ab4e012489ef 71 #define RH_RF22_REG_1D_AFC_LOOP_GEARSHIFT_OVERRIDE 0x1d
davidr99 0:ab4e012489ef 72 #define RH_RF22_REG_1E_AFC_TIMING_CONTROL 0x1e
davidr99 0:ab4e012489ef 73 #define RH_RF22_REG_1F_CLOCK_RECOVERY_GEARSHIFT_OVERRIDE 0x1f
davidr99 0:ab4e012489ef 74 #define RH_RF22_REG_20_CLOCK_RECOVERY_OVERSAMPLING_RATE 0x20
davidr99 0:ab4e012489ef 75 #define RH_RF22_REG_21_CLOCK_RECOVERY_OFFSET2 0x21
davidr99 0:ab4e012489ef 76 #define RH_RF22_REG_22_CLOCK_RECOVERY_OFFSET1 0x22
davidr99 0:ab4e012489ef 77 #define RH_RF22_REG_23_CLOCK_RECOVERY_OFFSET0 0x23
davidr99 0:ab4e012489ef 78 #define RH_RF22_REG_24_CLOCK_RECOVERY_TIMING_LOOP_GAIN1 0x24
davidr99 0:ab4e012489ef 79 #define RH_RF22_REG_25_CLOCK_RECOVERY_TIMING_LOOP_GAIN0 0x25
davidr99 0:ab4e012489ef 80 #define RH_RF22_REG_26_RSSI 0x26
davidr99 0:ab4e012489ef 81 #define RH_RF22_REG_27_RSSI_THRESHOLD 0x27
davidr99 0:ab4e012489ef 82 #define RH_RF22_REG_28_ANTENNA_DIVERSITY1 0x28
davidr99 0:ab4e012489ef 83 #define RH_RF22_REG_29_ANTENNA_DIVERSITY2 0x29
davidr99 0:ab4e012489ef 84 #define RH_RF22_REG_2A_AFC_LIMITER 0x2a
davidr99 0:ab4e012489ef 85 #define RH_RF22_REG_2B_AFC_CORRECTION_READ 0x2b
davidr99 0:ab4e012489ef 86 #define RH_RF22_REG_2C_OOK_COUNTER_VALUE_1 0x2c
davidr99 0:ab4e012489ef 87 #define RH_RF22_REG_2D_OOK_COUNTER_VALUE_2 0x2d
davidr99 0:ab4e012489ef 88 #define RH_RF22_REG_2E_SLICER_PEAK_HOLD 0x2e
davidr99 0:ab4e012489ef 89 #define RH_RF22_REG_30_DATA_ACCESS_CONTROL 0x30
davidr99 0:ab4e012489ef 90 #define RH_RF22_REG_31_EZMAC_STATUS 0x31
davidr99 0:ab4e012489ef 91 #define RH_RF22_REG_32_HEADER_CONTROL1 0x32
davidr99 0:ab4e012489ef 92 #define RH_RF22_REG_33_HEADER_CONTROL2 0x33
davidr99 0:ab4e012489ef 93 #define RH_RF22_REG_34_PREAMBLE_LENGTH 0x34
davidr99 0:ab4e012489ef 94 #define RH_RF22_REG_35_PREAMBLE_DETECTION_CONTROL1 0x35
davidr99 0:ab4e012489ef 95 #define RH_RF22_REG_36_SYNC_WORD3 0x36
davidr99 0:ab4e012489ef 96 #define RH_RF22_REG_37_SYNC_WORD2 0x37
davidr99 0:ab4e012489ef 97 #define RH_RF22_REG_38_SYNC_WORD1 0x38
davidr99 0:ab4e012489ef 98 #define RH_RF22_REG_39_SYNC_WORD0 0x39
davidr99 0:ab4e012489ef 99 #define RH_RF22_REG_3A_TRANSMIT_HEADER3 0x3a
davidr99 0:ab4e012489ef 100 #define RH_RF22_REG_3B_TRANSMIT_HEADER2 0x3b
davidr99 0:ab4e012489ef 101 #define RH_RF22_REG_3C_TRANSMIT_HEADER1 0x3c
davidr99 0:ab4e012489ef 102 #define RH_RF22_REG_3D_TRANSMIT_HEADER0 0x3d
davidr99 0:ab4e012489ef 103 #define RH_RF22_REG_3E_PACKET_LENGTH 0x3e
davidr99 0:ab4e012489ef 104 #define RH_RF22_REG_3F_CHECK_HEADER3 0x3f
davidr99 0:ab4e012489ef 105 #define RH_RF22_REG_40_CHECK_HEADER2 0x40
davidr99 0:ab4e012489ef 106 #define RH_RF22_REG_41_CHECK_HEADER1 0x41
davidr99 0:ab4e012489ef 107 #define RH_RF22_REG_42_CHECK_HEADER0 0x42
davidr99 0:ab4e012489ef 108 #define RH_RF22_REG_43_HEADER_ENABLE3 0x43
davidr99 0:ab4e012489ef 109 #define RH_RF22_REG_44_HEADER_ENABLE2 0x44
davidr99 0:ab4e012489ef 110 #define RH_RF22_REG_45_HEADER_ENABLE1 0x45
davidr99 0:ab4e012489ef 111 #define RH_RF22_REG_46_HEADER_ENABLE0 0x46
davidr99 0:ab4e012489ef 112 #define RH_RF22_REG_47_RECEIVED_HEADER3 0x47
davidr99 0:ab4e012489ef 113 #define RH_RF22_REG_48_RECEIVED_HEADER2 0x48
davidr99 0:ab4e012489ef 114 #define RH_RF22_REG_49_RECEIVED_HEADER1 0x49
davidr99 0:ab4e012489ef 115 #define RH_RF22_REG_4A_RECEIVED_HEADER0 0x4a
davidr99 0:ab4e012489ef 116 #define RH_RF22_REG_4B_RECEIVED_PACKET_LENGTH 0x4b
davidr99 0:ab4e012489ef 117 #define RH_RF22_REG_50_ANALOG_TEST_BUS_SELECT 0x50
davidr99 0:ab4e012489ef 118 #define RH_RF22_REG_51_DIGITAL_TEST_BUS_SELECT 0x51
davidr99 0:ab4e012489ef 119 #define RH_RF22_REG_52_TX_RAMP_CONTROL 0x52
davidr99 0:ab4e012489ef 120 #define RH_RF22_REG_53_PLL_TUNE_TIME 0x53
davidr99 0:ab4e012489ef 121 #define RH_RF22_REG_55_CALIBRATION_CONTROL 0x55
davidr99 0:ab4e012489ef 122 #define RH_RF22_REG_56_MODEM_TEST 0x56
davidr99 0:ab4e012489ef 123 #define RH_RF22_REG_57_CHARGE_PUMP_TEST 0x57
davidr99 0:ab4e012489ef 124 #define RH_RF22_REG_58_CHARGE_PUMP_CURRENT_TRIMMING 0x58
davidr99 0:ab4e012489ef 125 #define RH_RF22_REG_59_DIVIDER_CURRENT_TRIMMING 0x59
davidr99 0:ab4e012489ef 126 #define RH_RF22_REG_5A_VCO_CURRENT_TRIMMING 0x5a
davidr99 0:ab4e012489ef 127 #define RH_RF22_REG_5B_VCO_CALIBRATION 0x5b
davidr99 0:ab4e012489ef 128 #define RH_RF22_REG_5C_SYNTHESIZER_TEST 0x5c
davidr99 0:ab4e012489ef 129 #define RH_RF22_REG_5D_BLOCK_ENABLE_OVERRIDE1 0x5d
davidr99 0:ab4e012489ef 130 #define RH_RF22_REG_5E_BLOCK_ENABLE_OVERRIDE2 0x5e
davidr99 0:ab4e012489ef 131 #define RH_RF22_REG_5F_BLOCK_ENABLE_OVERRIDE3 0x5f
davidr99 0:ab4e012489ef 132 #define RH_RF22_REG_60_CHANNEL_FILTER_COEFFICIENT_ADDRESS 0x60
davidr99 0:ab4e012489ef 133 #define RH_RF22_REG_61_CHANNEL_FILTER_COEFFICIENT_VALUE 0x61
davidr99 0:ab4e012489ef 134 #define RH_RF22_REG_62_CRYSTAL_OSCILLATOR_POR_CONTROL 0x62
davidr99 0:ab4e012489ef 135 #define RH_RF22_REG_63_RC_OSCILLATOR_COARSE_CALIBRATION 0x63
davidr99 0:ab4e012489ef 136 #define RH_RF22_REG_64_RC_OSCILLATOR_FINE_CALIBRATION 0x64
davidr99 0:ab4e012489ef 137 #define RH_RF22_REG_65_LDO_CONTROL_OVERRIDE 0x65
davidr99 0:ab4e012489ef 138 #define RH_RF22_REG_66_LDO_LEVEL_SETTINGS 0x66
davidr99 0:ab4e012489ef 139 #define RH_RF22_REG_67_DELTA_SIGMA_ADC_TUNING1 0x67
davidr99 0:ab4e012489ef 140 #define RH_RF22_REG_68_DELTA_SIGMA_ADC_TUNING2 0x68
davidr99 0:ab4e012489ef 141 #define RH_RF22_REG_69_AGC_OVERRIDE1 0x69
davidr99 0:ab4e012489ef 142 #define RH_RF22_REG_6A_AGC_OVERRIDE2 0x6a
davidr99 0:ab4e012489ef 143 #define RH_RF22_REG_6B_GFSK_FIR_FILTER_COEFFICIENT_ADDRESS 0x6b
davidr99 0:ab4e012489ef 144 #define RH_RF22_REG_6C_GFSK_FIR_FILTER_COEFFICIENT_VALUE 0x6c
davidr99 0:ab4e012489ef 145 #define RH_RF22_REG_6D_TX_POWER 0x6d
davidr99 0:ab4e012489ef 146 #define RH_RF22_REG_6E_TX_DATA_RATE1 0x6e
davidr99 0:ab4e012489ef 147 #define RH_RF22_REG_6F_TX_DATA_RATE0 0x6f
davidr99 0:ab4e012489ef 148 #define RH_RF22_REG_70_MODULATION_CONTROL1 0x70
davidr99 0:ab4e012489ef 149 #define RH_RF22_REG_71_MODULATION_CONTROL2 0x71
davidr99 0:ab4e012489ef 150 #define RH_RF22_REG_72_FREQUENCY_DEVIATION 0x72
davidr99 0:ab4e012489ef 151 #define RH_RF22_REG_73_FREQUENCY_OFFSET1 0x73
davidr99 0:ab4e012489ef 152 #define RH_RF22_REG_74_FREQUENCY_OFFSET2 0x74
davidr99 0:ab4e012489ef 153 #define RH_RF22_REG_75_FREQUENCY_BAND_SELECT 0x75
davidr99 0:ab4e012489ef 154 #define RH_RF22_REG_76_NOMINAL_CARRIER_FREQUENCY1 0x76
davidr99 0:ab4e012489ef 155 #define RH_RF22_REG_77_NOMINAL_CARRIER_FREQUENCY0 0x77
davidr99 0:ab4e012489ef 156 #define RH_RF22_REG_79_FREQUENCY_HOPPING_CHANNEL_SELECT 0x79
davidr99 0:ab4e012489ef 157 #define RH_RF22_REG_7A_FREQUENCY_HOPPING_STEP_SIZE 0x7a
davidr99 0:ab4e012489ef 158 #define RH_RF22_REG_7C_TX_FIFO_CONTROL1 0x7c
davidr99 0:ab4e012489ef 159 #define RH_RF22_REG_7D_TX_FIFO_CONTROL2 0x7d
davidr99 0:ab4e012489ef 160 #define RH_RF22_REG_7E_RX_FIFO_CONTROL 0x7e
davidr99 0:ab4e012489ef 161 #define RH_RF22_REG_7F_FIFO_ACCESS 0x7f
davidr99 0:ab4e012489ef 162
davidr99 0:ab4e012489ef 163 // These register masks etc are named wherever possible
davidr99 0:ab4e012489ef 164 // corresponding to the bit and field names in the RF-22 Manual
davidr99 0:ab4e012489ef 165 // RH_RF22_REG_00_DEVICE_TYPE 0x00
davidr99 0:ab4e012489ef 166 #define RH_RF22_DEVICE_TYPE_RX_TRX 0x08
davidr99 0:ab4e012489ef 167 #define RH_RF22_DEVICE_TYPE_TX 0x07
davidr99 0:ab4e012489ef 168
davidr99 0:ab4e012489ef 169 // RH_RF22_REG_02_DEVICE_STATUS 0x02
davidr99 0:ab4e012489ef 170 #define RH_RF22_FFOVL 0x80
davidr99 0:ab4e012489ef 171 #define RH_RF22_FFUNFL 0x40
davidr99 0:ab4e012489ef 172 #define RH_RF22_RXFFEM 0x20
davidr99 0:ab4e012489ef 173 #define RH_RF22_HEADERR 0x10
davidr99 0:ab4e012489ef 174 #define RH_RF22_FREQERR 0x08
davidr99 0:ab4e012489ef 175 #define RH_RF22_LOCKDET 0x04
davidr99 0:ab4e012489ef 176 #define RH_RF22_CPS 0x03
davidr99 0:ab4e012489ef 177 #define RH_RF22_CPS_IDLE 0x00
davidr99 0:ab4e012489ef 178 #define RH_RF22_CPS_RX 0x01
davidr99 0:ab4e012489ef 179 #define RH_RF22_CPS_TX 0x10
davidr99 0:ab4e012489ef 180
davidr99 0:ab4e012489ef 181 // RH_RF22_REG_03_INTERRUPT_STATUS1 0x03
davidr99 0:ab4e012489ef 182 #define RH_RF22_IFFERROR 0x80
davidr99 0:ab4e012489ef 183 #define RH_RF22_ITXFFAFULL 0x40
davidr99 0:ab4e012489ef 184 #define RH_RF22_ITXFFAEM 0x20
davidr99 0:ab4e012489ef 185 #define RH_RF22_IRXFFAFULL 0x10
davidr99 0:ab4e012489ef 186 #define RH_RF22_IEXT 0x08
davidr99 0:ab4e012489ef 187 #define RH_RF22_IPKSENT 0x04
davidr99 0:ab4e012489ef 188 #define RH_RF22_IPKVALID 0x02
davidr99 0:ab4e012489ef 189 #define RH_RF22_ICRCERROR 0x01
davidr99 0:ab4e012489ef 190
davidr99 0:ab4e012489ef 191 // RH_RF22_REG_04_INTERRUPT_STATUS2 0x04
davidr99 0:ab4e012489ef 192 #define RH_RF22_ISWDET 0x80
davidr99 0:ab4e012489ef 193 #define RH_RF22_IPREAVAL 0x40
davidr99 0:ab4e012489ef 194 #define RH_RF22_IPREAINVAL 0x20
davidr99 0:ab4e012489ef 195 #define RH_RF22_IRSSI 0x10
davidr99 0:ab4e012489ef 196 #define RH_RF22_IWUT 0x08
davidr99 0:ab4e012489ef 197 #define RH_RF22_ILBD 0x04
davidr99 0:ab4e012489ef 198 #define RH_RF22_ICHIPRDY 0x02
davidr99 0:ab4e012489ef 199 #define RH_RF22_IPOR 0x01
davidr99 0:ab4e012489ef 200
davidr99 0:ab4e012489ef 201 // RH_RF22_REG_05_INTERRUPT_ENABLE1 0x05
davidr99 0:ab4e012489ef 202 #define RH_RF22_ENFFERR 0x80
davidr99 0:ab4e012489ef 203 #define RH_RF22_ENTXFFAFULL 0x40
davidr99 0:ab4e012489ef 204 #define RH_RF22_ENTXFFAEM 0x20
davidr99 0:ab4e012489ef 205 #define RH_RF22_ENRXFFAFULL 0x10
davidr99 0:ab4e012489ef 206 #define RH_RF22_ENEXT 0x08
davidr99 0:ab4e012489ef 207 #define RH_RF22_ENPKSENT 0x04
davidr99 0:ab4e012489ef 208 #define RH_RF22_ENPKVALID 0x02
davidr99 0:ab4e012489ef 209 #define RH_RF22_ENCRCERROR 0x01
davidr99 0:ab4e012489ef 210
davidr99 0:ab4e012489ef 211 // RH_RF22_REG_06_INTERRUPT_ENABLE2 0x06
davidr99 0:ab4e012489ef 212 #define RH_RF22_ENSWDET 0x80
davidr99 0:ab4e012489ef 213 #define RH_RF22_ENPREAVAL 0x40
davidr99 0:ab4e012489ef 214 #define RH_RF22_ENPREAINVAL 0x20
davidr99 0:ab4e012489ef 215 #define RH_RF22_ENRSSI 0x10
davidr99 0:ab4e012489ef 216 #define RH_RF22_ENWUT 0x08
davidr99 0:ab4e012489ef 217 #define RH_RF22_ENLBDI 0x04
davidr99 0:ab4e012489ef 218 #define RH_RF22_ENCHIPRDY 0x02
davidr99 0:ab4e012489ef 219 #define RH_RF22_ENPOR 0x01
davidr99 0:ab4e012489ef 220
davidr99 0:ab4e012489ef 221 // RH_RF22_REG_07_OPERATING_MODE 0x07
davidr99 0:ab4e012489ef 222 #define RH_RF22_SWRES 0x80
davidr99 0:ab4e012489ef 223 #define RH_RF22_ENLBD 0x40
davidr99 0:ab4e012489ef 224 #define RH_RF22_ENWT 0x20
davidr99 0:ab4e012489ef 225 #define RH_RF22_X32KSEL 0x10
davidr99 0:ab4e012489ef 226 #define RH_RF22_TXON 0x08
davidr99 0:ab4e012489ef 227 #define RH_RF22_RXON 0x04
davidr99 0:ab4e012489ef 228 #define RH_RF22_PLLON 0x02
davidr99 0:ab4e012489ef 229 #define RH_RF22_XTON 0x01
davidr99 0:ab4e012489ef 230
davidr99 0:ab4e012489ef 231 // RH_RF22_REG_08_OPERATING_MODE2 0x08
davidr99 0:ab4e012489ef 232 #define RH_RF22_ANTDIV 0xc0
davidr99 0:ab4e012489ef 233 #define RH_RF22_RXMPK 0x10
davidr99 0:ab4e012489ef 234 #define RH_RF22_AUTOTX 0x08
davidr99 0:ab4e012489ef 235 #define RH_RF22_ENLDM 0x04
davidr99 0:ab4e012489ef 236 #define RH_RF22_FFCLRRX 0x02
davidr99 0:ab4e012489ef 237 #define RH_RF22_FFCLRTX 0x01
davidr99 0:ab4e012489ef 238
davidr99 0:ab4e012489ef 239 // RH_RF22_REG_0F_ADC_CONFIGURATION 0x0f
davidr99 0:ab4e012489ef 240 #define RH_RF22_ADCSTART 0x80
davidr99 0:ab4e012489ef 241 #define RH_RF22_ADCDONE 0x80
davidr99 0:ab4e012489ef 242 #define RH_RF22_ADCSEL 0x70
davidr99 0:ab4e012489ef 243 #define RH_RF22_ADCSEL_INTERNAL_TEMPERATURE_SENSOR 0x00
davidr99 0:ab4e012489ef 244 #define RH_RF22_ADCSEL_GPIO0_SINGLE_ENDED 0x10
davidr99 0:ab4e012489ef 245 #define RH_RF22_ADCSEL_GPIO1_SINGLE_ENDED 0x20
davidr99 0:ab4e012489ef 246 #define RH_RF22_ADCSEL_GPIO2_SINGLE_ENDED 0x30
davidr99 0:ab4e012489ef 247 #define RH_RF22_ADCSEL_GPIO0_GPIO1_DIFFERENTIAL 0x40
davidr99 0:ab4e012489ef 248 #define RH_RF22_ADCSEL_GPIO1_GPIO2_DIFFERENTIAL 0x50
davidr99 0:ab4e012489ef 249 #define RH_RF22_ADCSEL_GPIO0_GPIO2_DIFFERENTIAL 0x60
davidr99 0:ab4e012489ef 250 #define RH_RF22_ADCSEL_GND 0x70
davidr99 0:ab4e012489ef 251 #define RH_RF22_ADCREF 0x0c
davidr99 0:ab4e012489ef 252 #define RH_RF22_ADCREF_BANDGAP_VOLTAGE 0x00
davidr99 0:ab4e012489ef 253 #define RH_RF22_ADCREF_VDD_ON_3 0x08
davidr99 0:ab4e012489ef 254 #define RH_RF22_ADCREF_VDD_ON_2 0x0c
davidr99 0:ab4e012489ef 255 #define RH_RF22_ADCGAIN 0x03
davidr99 0:ab4e012489ef 256
davidr99 0:ab4e012489ef 257 // RH_RF22_REG_10_ADC_SENSOR_AMP_OFFSET 0x10
davidr99 0:ab4e012489ef 258 #define RH_RF22_ADCOFFS 0x0f
davidr99 0:ab4e012489ef 259
davidr99 0:ab4e012489ef 260 // RH_RF22_REG_12_TEMPERATURE_SENSOR_CALIBRATION 0x12
davidr99 0:ab4e012489ef 261 #define RH_RF22_TSRANGE 0xc0
davidr99 0:ab4e012489ef 262 #define RH_RF22_TSRANGE_M64_64C 0x00
davidr99 0:ab4e012489ef 263 #define RH_RF22_TSRANGE_M64_192C 0x40
davidr99 0:ab4e012489ef 264 #define RH_RF22_TSRANGE_0_128C 0x80
davidr99 0:ab4e012489ef 265 #define RH_RF22_TSRANGE_M40_216F 0xc0
davidr99 0:ab4e012489ef 266 #define RH_RF22_ENTSOFFS 0x20
davidr99 0:ab4e012489ef 267 #define RH_RF22_ENTSTRIM 0x10
davidr99 0:ab4e012489ef 268 #define RH_RF22_TSTRIM 0x0f
davidr99 0:ab4e012489ef 269
davidr99 0:ab4e012489ef 270 // RH_RF22_REG_14_WAKEUP_TIMER_PERIOD1 0x14
davidr99 0:ab4e012489ef 271 #define RH_RF22_WTR 0x3c
davidr99 0:ab4e012489ef 272 #define RH_RF22_WTD 0x03
davidr99 0:ab4e012489ef 273
davidr99 0:ab4e012489ef 274 // RH_RF22_REG_1D_AFC_LOOP_GEARSHIFT_OVERRIDE 0x1d
davidr99 0:ab4e012489ef 275 #define RH_RF22_AFBCD 0x80
davidr99 0:ab4e012489ef 276 #define RH_RF22_ENAFC 0x40
davidr99 0:ab4e012489ef 277 #define RH_RF22_AFCGEARH 0x38
davidr99 0:ab4e012489ef 278 #define RH_RF22_AFCGEARL 0x07
davidr99 0:ab4e012489ef 279
davidr99 0:ab4e012489ef 280 // RH_RF22_REG_1E_AFC_TIMING_CONTROL 0x1e
davidr99 0:ab4e012489ef 281 #define RH_RF22_SWAIT_TIMER 0xc0
davidr99 0:ab4e012489ef 282 #define RH_RF22_SHWAIT 0x38
davidr99 0:ab4e012489ef 283 #define RH_RF22_ANWAIT 0x07
davidr99 0:ab4e012489ef 284
davidr99 0:ab4e012489ef 285 // RH_RF22_REG_30_DATA_ACCESS_CONTROL 0x30
davidr99 0:ab4e012489ef 286 #define RH_RF22_ENPACRX 0x80
davidr99 0:ab4e012489ef 287 #define RH_RF22_MSBFRST 0x00
davidr99 0:ab4e012489ef 288 #define RH_RF22_LSBFRST 0x40
davidr99 0:ab4e012489ef 289 #define RH_RF22_CRCHDRS 0x00
davidr99 0:ab4e012489ef 290 #define RH_RF22_CRCDONLY 0x20
davidr99 0:ab4e012489ef 291 #define RH_RF22_SKIP2PH 0x10
davidr99 0:ab4e012489ef 292 #define RH_RF22_ENPACTX 0x08
davidr99 0:ab4e012489ef 293 #define RH_RF22_ENCRC 0x04
davidr99 0:ab4e012489ef 294 #define RH_RF22_CRC 0x03
davidr99 0:ab4e012489ef 295 #define RH_RF22_CRC_CCITT 0x00
davidr99 0:ab4e012489ef 296 #define RH_RF22_CRC_CRC_16_IBM 0x01
davidr99 0:ab4e012489ef 297 #define RH_RF22_CRC_IEC_16 0x02
davidr99 0:ab4e012489ef 298 #define RH_RF22_CRC_BIACHEVA 0x03
davidr99 0:ab4e012489ef 299
davidr99 0:ab4e012489ef 300 // RH_RF22_REG_32_HEADER_CONTROL1 0x32
davidr99 0:ab4e012489ef 301 #define RH_RF22_BCEN 0xf0
davidr99 0:ab4e012489ef 302 #define RH_RF22_BCEN_NONE 0x00
davidr99 0:ab4e012489ef 303 #define RH_RF22_BCEN_HEADER0 0x10
davidr99 0:ab4e012489ef 304 #define RH_RF22_BCEN_HEADER1 0x20
davidr99 0:ab4e012489ef 305 #define RH_RF22_BCEN_HEADER2 0x40
davidr99 0:ab4e012489ef 306 #define RH_RF22_BCEN_HEADER3 0x80
davidr99 0:ab4e012489ef 307 #define RH_RF22_HDCH 0x0f
davidr99 0:ab4e012489ef 308 #define RH_RF22_HDCH_NONE 0x00
davidr99 0:ab4e012489ef 309 #define RH_RF22_HDCH_HEADER0 0x01
davidr99 0:ab4e012489ef 310 #define RH_RF22_HDCH_HEADER1 0x02
davidr99 0:ab4e012489ef 311 #define RH_RF22_HDCH_HEADER2 0x04
davidr99 0:ab4e012489ef 312 #define RH_RF22_HDCH_HEADER3 0x08
davidr99 0:ab4e012489ef 313
davidr99 0:ab4e012489ef 314 // RH_RF22_REG_33_HEADER_CONTROL2 0x33
davidr99 0:ab4e012489ef 315 #define RH_RF22_HDLEN 0x70
davidr99 0:ab4e012489ef 316 #define RH_RF22_HDLEN_0 0x00
davidr99 0:ab4e012489ef 317 #define RH_RF22_HDLEN_1 0x10
davidr99 0:ab4e012489ef 318 #define RH_RF22_HDLEN_2 0x20
davidr99 0:ab4e012489ef 319 #define RH_RF22_HDLEN_3 0x30
davidr99 0:ab4e012489ef 320 #define RH_RF22_HDLEN_4 0x40
davidr99 0:ab4e012489ef 321 #define RH_RF22_VARPKLEN 0x00
davidr99 0:ab4e012489ef 322 #define RH_RF22_FIXPKLEN 0x08
davidr99 0:ab4e012489ef 323 #define RH_RF22_SYNCLEN 0x06
davidr99 0:ab4e012489ef 324 #define RH_RF22_SYNCLEN_1 0x00
davidr99 0:ab4e012489ef 325 #define RH_RF22_SYNCLEN_2 0x02
davidr99 0:ab4e012489ef 326 #define RH_RF22_SYNCLEN_3 0x04
davidr99 0:ab4e012489ef 327 #define RH_RF22_SYNCLEN_4 0x06
davidr99 0:ab4e012489ef 328 #define RH_RF22_PREALEN8 0x01
davidr99 0:ab4e012489ef 329
davidr99 0:ab4e012489ef 330 // RH_RF22_REG_6D_TX_POWER 0x6d
davidr99 0:ab4e012489ef 331 // https://www.sparkfun.com/datasheets/Wireless/General/RFM22B.pdf
davidr99 0:ab4e012489ef 332 #define RH_RF22_PAPEAKVAL 0x80
davidr99 0:ab4e012489ef 333 #define RH_RF22_PAPEAKEN 0x40
davidr99 0:ab4e012489ef 334 #define RH_RF22_PAPEAKLVL 0x30
davidr99 0:ab4e012489ef 335 #define RH_RF22_PAPEAKLVL6_5 0x00
davidr99 0:ab4e012489ef 336 #define RH_RF22_PAPEAKLVL7 0x10
davidr99 0:ab4e012489ef 337 #define RH_RF22_PAPEAKLVL7_5 0x20
davidr99 0:ab4e012489ef 338 #define RH_RF22_PAPEAKLVL8 0x30
davidr99 0:ab4e012489ef 339 #define RH_RF22_LNA_SW 0x08
davidr99 0:ab4e012489ef 340 #define RH_RF22_TXPOW 0x07
davidr99 0:ab4e012489ef 341 #define RH_RF22_TXPOW_4X31 0x08 // Not used in RFM22B
davidr99 0:ab4e012489ef 342 // For RFM22B:
davidr99 0:ab4e012489ef 343 #define RH_RF22_TXPOW_1DBM 0x00
davidr99 0:ab4e012489ef 344 #define RH_RF22_TXPOW_2DBM 0x01
davidr99 0:ab4e012489ef 345 #define RH_RF22_TXPOW_5DBM 0x02
davidr99 0:ab4e012489ef 346 #define RH_RF22_TXPOW_8DBM 0x03
davidr99 0:ab4e012489ef 347 #define RH_RF22_TXPOW_11DBM 0x04
davidr99 0:ab4e012489ef 348 #define RH_RF22_TXPOW_14DBM 0x05
davidr99 0:ab4e012489ef 349 #define RH_RF22_TXPOW_17DBM 0x06
davidr99 0:ab4e012489ef 350 #define RH_RF22_TXPOW_20DBM 0x07
davidr99 0:ab4e012489ef 351 // RFM23B only:
davidr99 0:ab4e012489ef 352 #define RH_RF22_RF23B_TXPOW_M8DBM 0x00 // -8dBm
davidr99 0:ab4e012489ef 353 #define RH_RF22_RF23B_TXPOW_M5DBM 0x01 // -5dBm
davidr99 0:ab4e012489ef 354 #define RH_RF22_RF23B_TXPOW_M2DBM 0x02 // -2dBm
davidr99 0:ab4e012489ef 355 #define RH_RF22_RF23B_TXPOW_1DBM 0x03 // 1dBm
davidr99 0:ab4e012489ef 356 #define RH_RF22_RF23B_TXPOW_4DBM 0x04 // 4dBm
davidr99 0:ab4e012489ef 357 #define RH_RF22_RF23B_TXPOW_7DBM 0x05 // 7dBm
davidr99 0:ab4e012489ef 358 #define RH_RF22_RF23B_TXPOW_10DBM 0x06 // 10dBm
davidr99 0:ab4e012489ef 359 #define RH_RF22_RF23B_TXPOW_13DBM 0x07 // 13dBm
davidr99 0:ab4e012489ef 360 // RFM23BP only:
davidr99 0:ab4e012489ef 361 #define RH_RF22_RF23BP_TXPOW_28DBM 0x05 // 28dBm
davidr99 0:ab4e012489ef 362 #define RH_RF22_RF23BP_TXPOW_29DBM 0x06 // 29dBm
davidr99 0:ab4e012489ef 363 #define RH_RF22_RF23BP_TXPOW_30DBM 0x07 // 30dBm
davidr99 0:ab4e012489ef 364
davidr99 0:ab4e012489ef 365 // RH_RF22_REG_71_MODULATION_CONTROL2 0x71
davidr99 0:ab4e012489ef 366 #define RH_RF22_TRCLK 0xc0
davidr99 0:ab4e012489ef 367 #define RH_RF22_TRCLK_NONE 0x00
davidr99 0:ab4e012489ef 368 #define RH_RF22_TRCLK_GPIO 0x40
davidr99 0:ab4e012489ef 369 #define RH_RF22_TRCLK_SDO 0x80
davidr99 0:ab4e012489ef 370 #define RH_RF22_TRCLK_NIRQ 0xc0
davidr99 0:ab4e012489ef 371 #define RH_RF22_DTMOD 0x30
davidr99 0:ab4e012489ef 372 #define RH_RF22_DTMOD_DIRECT_GPIO 0x00
davidr99 0:ab4e012489ef 373 #define RH_RF22_DTMOD_DIRECT_SDI 0x10
davidr99 0:ab4e012489ef 374 #define RH_RF22_DTMOD_FIFO 0x20
davidr99 0:ab4e012489ef 375 #define RH_RF22_DTMOD_PN9 0x30
davidr99 0:ab4e012489ef 376 #define RH_RF22_ENINV 0x08
davidr99 0:ab4e012489ef 377 #define RH_RF22_FD8 0x04
davidr99 0:ab4e012489ef 378 #define RH_RF22_MODTYP 0x30
davidr99 0:ab4e012489ef 379 #define RH_RF22_MODTYP_UNMODULATED 0x00
davidr99 0:ab4e012489ef 380 #define RH_RF22_MODTYP_OOK 0x01
davidr99 0:ab4e012489ef 381 #define RH_RF22_MODTYP_FSK 0x02
davidr99 0:ab4e012489ef 382 #define RH_RF22_MODTYP_GFSK 0x03
davidr99 0:ab4e012489ef 383
davidr99 0:ab4e012489ef 384
davidr99 0:ab4e012489ef 385 // RH_RF22_REG_75_FREQUENCY_BAND_SELECT 0x75
davidr99 0:ab4e012489ef 386 #define RH_RF22_SBSEL 0x40
davidr99 0:ab4e012489ef 387 #define RH_RF22_HBSEL 0x20
davidr99 0:ab4e012489ef 388 #define RH_RF22_FB 0x1f
davidr99 0:ab4e012489ef 389
davidr99 0:ab4e012489ef 390 // Define this to include Serial printing in diagnostic routines
davidr99 0:ab4e012489ef 391 #define RH_RF22_HAVE_SERIAL
davidr99 0:ab4e012489ef 392
davidr99 0:ab4e012489ef 393 /////////////////////////////////////////////////////////////////////
davidr99 0:ab4e012489ef 394 /// \class RH_RF22 RH_RF22.h <RH_RF22.h>
davidr99 0:ab4e012489ef 395 /// \brief Driver to send and receive unaddressed, unreliable datagrams via an RF22 and compatible radio transceiver.
davidr99 0:ab4e012489ef 396 ///
davidr99 0:ab4e012489ef 397 /// Works with RF22, RF23 based radio modules, and compatible chips and modules, including:
davidr99 0:ab4e012489ef 398 /// - RF22 bare module: http://www.sparkfun.com/products/10153
davidr99 0:ab4e012489ef 399 /// (Caution, that is a 3.3V part, and requires a 3.3V CPU such as Teensy etc or level shifters)
davidr99 0:ab4e012489ef 400 /// - RF22 shield: http://www.sparkfun.com/products/11018
davidr99 0:ab4e012489ef 401 /// - RF22 integrated board http://www.anarduino.com/miniwireless
davidr99 0:ab4e012489ef 402 /// - RFM23BP bare module: http://www.anarduino.com/details.jsp?pid=130
davidr99 0:ab4e012489ef 403 /// - Silicon Labs Si4430/31/32 based modules. S4432 is equivalent to RF22. Si4431/30 is equivalent to RF23.
davidr99 0:ab4e012489ef 404 ///
davidr99 0:ab4e012489ef 405 /// Data based on https://www.sparkfun.com/datasheets/Wireless/General/RFM22B.pdf
davidr99 0:ab4e012489ef 406 ///
davidr99 0:ab4e012489ef 407 /// \par Overview
davidr99 0:ab4e012489ef 408 ///
davidr99 0:ab4e012489ef 409 /// This base class provides basic functions for sending and receiving unaddressed,
davidr99 0:ab4e012489ef 410 /// unreliable datagrams of arbitrary length to 255 octets per packet.
davidr99 0:ab4e012489ef 411 ///
davidr99 0:ab4e012489ef 412 /// Manager classes may use this class to implement reliable, addressed datagrams and streams,
davidr99 0:ab4e012489ef 413 /// mesh routers, repeaters, translators etc.
davidr99 0:ab4e012489ef 414 ///
davidr99 0:ab4e012489ef 415 /// On transmission, the TO and FROM addresses default to 0x00, unless changed by a subclass.
davidr99 0:ab4e012489ef 416 /// On reception the TO addressed is checked against the node address (defaults to 0x00) or the
davidr99 0:ab4e012489ef 417 /// broadcast address (which is 0xff). The ID and FLAGS are set to 0, and not checked by this class.
davidr99 0:ab4e012489ef 418 /// This permits use of the this base RH_RF22 class as an
davidr99 0:ab4e012489ef 419 /// unaddressed, unreliable datagram service without the use of one the RadioHead Manager classes.
davidr99 0:ab4e012489ef 420 ///
davidr99 0:ab4e012489ef 421 /// Naturally, for any 2 radios to communicate that must be configured to use the same frequency and
davidr99 0:ab4e012489ef 422 /// modulation scheme.
davidr99 0:ab4e012489ef 423 ///
davidr99 0:ab4e012489ef 424 /// \par Details
davidr99 0:ab4e012489ef 425 ///
davidr99 0:ab4e012489ef 426 /// This Driver provides an object-oriented interface for sending and receiving data messages with Hope-RF
davidr99 0:ab4e012489ef 427 /// RF22 and RF23 based radio modules, and compatible chips and modules,
davidr99 0:ab4e012489ef 428 /// including the RFM22B transceiver module such as
davidr99 0:ab4e012489ef 429 /// this bare module: http://www.sparkfun.com/products/10153
davidr99 0:ab4e012489ef 430 /// and this shield: http://www.sparkfun.com/products/11018
davidr99 0:ab4e012489ef 431 /// and this module: http://www.hoperfusa.com/details.jsp?pid=131
davidr99 0:ab4e012489ef 432 /// and this integrated board: http://www.anarduino.com/miniwireless
davidr99 0:ab4e012489ef 433 /// and RF23BP modules such as this http://www.anarduino.com/details.jsp?pid=130
davidr99 0:ab4e012489ef 434 ///
davidr99 0:ab4e012489ef 435 /// The Hope-RF (http://www.hoperf.com) RFM22B (http://www.hoperf.com/rf_fsk/fsk/RFM22B.htm)
davidr99 0:ab4e012489ef 436 /// is a low-cost ISM transceiver module. It supports FSK, GFSK, OOK over a wide
davidr99 0:ab4e012489ef 437 /// range of frequencies and programmable data rates.
davidr99 0:ab4e012489ef 438 /// Manual can be found at https://www.sparkfun.com/datasheets/Wireless/General/RFM22.PDF
davidr99 0:ab4e012489ef 439 ///
davidr99 0:ab4e012489ef 440 /// This library provides functions for sending and receiving messages of up to 255 octets on any
davidr99 0:ab4e012489ef 441 /// frequency supported by the RF22B, in a range of predefined data rates and frequency deviations.
davidr99 0:ab4e012489ef 442 /// Frequency can be set with 312Hz precision to any frequency from 240.0MHz to 960.0MHz.
davidr99 0:ab4e012489ef 443 ///
davidr99 0:ab4e012489ef 444 /// Up to 3 RF22B modules can be connected to an Arduino, permitting the construction of translators
davidr99 0:ab4e012489ef 445 /// and frequency changers, etc.
davidr99 0:ab4e012489ef 446 ///
davidr99 0:ab4e012489ef 447 /// The following modulation types are suppported with a range of modem configurations for
davidr99 0:ab4e012489ef 448 /// common data rates and frequency deviations:
davidr99 0:ab4e012489ef 449 /// - GFSK Gaussian Frequency Shift Keying
davidr99 0:ab4e012489ef 450 /// - FSK Frequency Shift Keying
davidr99 0:ab4e012489ef 451 /// - OOK On-Off Keying
davidr99 0:ab4e012489ef 452 ///
davidr99 0:ab4e012489ef 453 /// Support for other RF22B features such as on-chip temperature measurement, analog-digital
davidr99 0:ab4e012489ef 454 /// converter, transmitter power control etc is also provided.
davidr99 0:ab4e012489ef 455 ///
davidr99 0:ab4e012489ef 456 /// Tested on Arduino Diecimila, Uno and Mega with arduino-0021, 1.0.5
davidr99 0:ab4e012489ef 457 /// on OpenSuSE 13.1 and avr-libc-1.6.1-1.15,
davidr99 0:ab4e012489ef 458 /// cross-avr-binutils-2.19-9.1, cross-avr-gcc-4.1.3_20080612-26.5.
davidr99 0:ab4e012489ef 459 /// With HopeRF RFM22 modules that appear to have RF22B chips on board:
davidr99 0:ab4e012489ef 460 /// - Device Type Code = 0x08 (RX/TRX)
davidr99 0:ab4e012489ef 461 /// - Version Code = 0x06
davidr99 0:ab4e012489ef 462 /// Works on Duo. Works with Sparkfun RFM22 Wireless shields. Works with RFM22 modules from http://www.hoperfusa.com/
davidr99 0:ab4e012489ef 463 /// Works with Arduino 1.0 to at least 1.0.5. Works on Maple, Flymaple, Uno32.
davidr99 0:ab4e012489ef 464 ///
davidr99 0:ab4e012489ef 465 /// \par Packet Format
davidr99 0:ab4e012489ef 466 ///
davidr99 0:ab4e012489ef 467 /// All messages sent and received by this Driver must conform to this packet format:
davidr99 0:ab4e012489ef 468 ///
davidr99 0:ab4e012489ef 469 /// - 8 nibbles (4 octets) PREAMBLE
davidr99 0:ab4e012489ef 470 /// - 2 octets SYNC 0x2d, 0xd4
davidr99 0:ab4e012489ef 471 /// - 4 octets HEADER: (TO, FROM, ID, FLAGS)
davidr99 0:ab4e012489ef 472 /// - 1 octet LENGTH (0 to 255), number of octets in DATA
davidr99 0:ab4e012489ef 473 /// - 0 to 255 octets DATA
davidr99 0:ab4e012489ef 474 /// - 2 octets CRC computed with CRC16(IBM), computed on HEADER, LENGTH and DATA
davidr99 0:ab4e012489ef 475 ///
davidr99 0:ab4e012489ef 476 /// For technical reasons, the message format is not protocol compatible with the
davidr99 0:ab4e012489ef 477 /// 'HopeRF Radio Transceiver Message Library for Arduino' http://www.airspayce.com/mikem/arduino/HopeRF from the same author. Nor is it compatible with
davidr99 0:ab4e012489ef 478 /// 'Virtual Wire' http://www.airspayce.com/mikem/arduino/VirtualWire.pdf also from the same author.
davidr99 0:ab4e012489ef 479 ///
davidr99 0:ab4e012489ef 480 /// \par Connecting RFM-22 to Arduino
davidr99 0:ab4e012489ef 481 ///
davidr99 0:ab4e012489ef 482 /// If you have the Sparkfun RFM22 Shield (https://www.sparkfun.com/products/11018)
davidr99 0:ab4e012489ef 483 /// the connections described below are done for you on the shield, no changes required,
davidr99 0:ab4e012489ef 484 /// just add headers and plug it in to an Arduino (but not and Arduino Mega, see below)
davidr99 0:ab4e012489ef 485 ///
davidr99 0:ab4e012489ef 486 /// The physical connection between the RF22B and the Arduino requires 3.3V,
davidr99 0:ab4e012489ef 487 /// the 3 x SPI pins (SCK, SDI, SDO), a Slave Select pin and an interrupt pin.
davidr99 0:ab4e012489ef 488 ///
davidr99 0:ab4e012489ef 489 /// Note also that on the RFM22B (but not the RFM23B), it is required to control the TX_ANT and
davidr99 0:ab4e012489ef 490 /// RX_ANT pins of the RFM22 in order to control the antenna connection properly. The RH_RF22
davidr99 0:ab4e012489ef 491 /// driver is configured by default so that GPIO0 and GPIO1 outputs can
davidr99 0:ab4e012489ef 492 /// control TX_ANT and RX_ANT input pins respectively automatically. On RFM22,
davidr99 0:ab4e012489ef 493 /// you must connect GPIO0
davidr99 0:ab4e012489ef 494 /// to TX_ANT and GPIO1 to RX_ANT for this automatic antenna switching to
davidr99 0:ab4e012489ef 495 /// occur. See setGpioReversed() for more details. These connections are not required on RFM23B.
davidr99 0:ab4e012489ef 496 ///
davidr99 0:ab4e012489ef 497 /// If you are using the Sparkfun RF22 shield, it will work with any 5V arduino without modification.
davidr99 0:ab4e012489ef 498 /// Connect the RFM-22 module to most Arduino's like this (Caution, Arduino Mega has different pins for SPI,
davidr99 0:ab4e012489ef 499 /// see below).
davidr99 0:ab4e012489ef 500 /// \code
davidr99 0:ab4e012489ef 501 /// Arduino RFM-22B
davidr99 0:ab4e012489ef 502 /// GND----------GND-\ (ground in)
davidr99 0:ab4e012489ef 503 /// SDN-/ (shutdown in)
davidr99 0:ab4e012489ef 504 /// 3V3----------VCC (3.3V in)
davidr99 0:ab4e012489ef 505 /// interrupt 0 pin D2-----------NIRQ (interrupt request out)
davidr99 0:ab4e012489ef 506 /// SS pin D10----------NSEL (chip select in)
davidr99 0:ab4e012489ef 507 /// SCK pin D13----------SCK (SPI clock in)
davidr99 0:ab4e012489ef 508 /// MOSI pin D11----------SDI (SPI Data in)
davidr99 0:ab4e012489ef 509 /// MISO pin D12----------SDO (SPI data out)
davidr99 0:ab4e012489ef 510 /// /--GPIO0 (GPIO0 out to control transmitter antenna TX_ANT)
davidr99 0:ab4e012489ef 511 /// \--TX_ANT (TX antenna control in) RFM22B only
davidr99 0:ab4e012489ef 512 /// /--GPIO1 (GPIO1 out to control receiver antenna RX_ANT)
davidr99 0:ab4e012489ef 513 /// \--RX_ANT (RX antenna control in) RFM22B only
davidr99 0:ab4e012489ef 514 /// \endcode
davidr99 0:ab4e012489ef 515 /// For an Arduino Mega:
davidr99 0:ab4e012489ef 516 /// \code
davidr99 0:ab4e012489ef 517 /// Mega RFM-22B
davidr99 0:ab4e012489ef 518 /// GND----------GND-\ (ground in)
davidr99 0:ab4e012489ef 519 /// SDN-/ (shutdown in)
davidr99 0:ab4e012489ef 520 /// 3V3----------VCC (3.3V in)
davidr99 0:ab4e012489ef 521 /// interrupt 0 pin D2-----------NIRQ (interrupt request out)
davidr99 0:ab4e012489ef 522 /// SS pin D53----------NSEL (chip select in)
davidr99 0:ab4e012489ef 523 /// SCK pin D52----------SCK (SPI clock in)
davidr99 0:ab4e012489ef 524 /// MOSI pin D51----------SDI (SPI Data in)
davidr99 0:ab4e012489ef 525 /// MISO pin D50----------SDO (SPI data out)
davidr99 0:ab4e012489ef 526 /// /--GPIO0 (GPIO0 out to control transmitter antenna TX_ANT)
davidr99 0:ab4e012489ef 527 /// \--TX_ANT (TX antenna control in) RFM22B only
davidr99 0:ab4e012489ef 528 /// /--GPIO1 (GPIO1 out to control receiver antenna RX_ANT)
davidr99 0:ab4e012489ef 529 /// \--RX_ANT (RX antenna control in) RFM22B only
davidr99 0:ab4e012489ef 530 /// \endcode
davidr99 0:ab4e012489ef 531 /// For Chipkit Uno32. Caution: you must also ensure jumper JP4 on the Uno32 is set to RD4
davidr99 0:ab4e012489ef 532 /// \code
davidr99 0:ab4e012489ef 533 /// Arduino RFM-22B
davidr99 0:ab4e012489ef 534 /// GND----------GND-\ (ground in)
davidr99 0:ab4e012489ef 535 /// SDN-/ (shutdown in)
davidr99 0:ab4e012489ef 536 /// 3V3----------VCC (3.3V in)
davidr99 0:ab4e012489ef 537 /// interrupt 0 pin D38----------NIRQ (interrupt request out)
davidr99 0:ab4e012489ef 538 /// SS pin D10----------NSEL (chip select in)
davidr99 0:ab4e012489ef 539 /// SCK pin D13----------SCK (SPI clock in)
davidr99 0:ab4e012489ef 540 /// MOSI pin D11----------SDI (SPI Data in)
davidr99 0:ab4e012489ef 541 /// MISO pin D12----------SDO (SPI data out)
davidr99 0:ab4e012489ef 542 /// /--GPIO0 (GPIO0 out to control transmitter antenna TX_ANT)
davidr99 0:ab4e012489ef 543 /// \--TX_ANT (TX antenna control in) RFM22B only
davidr99 0:ab4e012489ef 544 /// /--GPIO1 (GPIO1 out to control receiver antenna RX_ANT)
davidr99 0:ab4e012489ef 545 /// \--RX_ANT (RX antenna control in) RFM22B only
davidr99 0:ab4e012489ef 546 /// \endcode
davidr99 0:ab4e012489ef 547 /// For Teensy 3.1
davidr99 0:ab4e012489ef 548 /// \code
davidr99 0:ab4e012489ef 549 /// Teensy RFM-22B
davidr99 0:ab4e012489ef 550 /// GND----------GND-\ (ground in)
davidr99 0:ab4e012489ef 551 /// SDN-/ (shutdown in)
davidr99 0:ab4e012489ef 552 /// 3V3----------VCC (3.3V in)
davidr99 0:ab4e012489ef 553 /// interrupt 2 pin D2-----------NIRQ (interrupt request out)
davidr99 0:ab4e012489ef 554 /// SS pin D10----------NSEL (chip select in)
davidr99 0:ab4e012489ef 555 /// SCK pin D13----------SCK (SPI clock in)
davidr99 0:ab4e012489ef 556 /// MOSI pin D11----------SDI (SPI Data in)
davidr99 0:ab4e012489ef 557 /// MISO pin D12----------SDO (SPI data out)
davidr99 0:ab4e012489ef 558 /// /--GPIO0 (GPIO0 out to control transmitter antenna TX_ANT)
davidr99 0:ab4e012489ef 559 /// \--TX_ANT (TX antenna control in) RFM22B only
davidr99 0:ab4e012489ef 560 /// /--GPIO1 (GPIO1 out to control receiver antenna RX_ANT)
davidr99 0:ab4e012489ef 561 /// \--RX_ANT (RX antenna control in) RFM22B only
davidr99 0:ab4e012489ef 562 /// \endcode
davidr99 0:ab4e012489ef 563 /// For connecting an Arduino to an RFM23BP module. Note that the antenna control pins are reversed
davidr99 0:ab4e012489ef 564 /// compared to the RF22.
davidr99 0:ab4e012489ef 565 /// \code
davidr99 0:ab4e012489ef 566 /// Arduino RFM-23BP
davidr99 0:ab4e012489ef 567 /// GND----------GND-\ (ground in)
davidr99 0:ab4e012489ef 568 /// SDN-/ (shutdown in)
davidr99 0:ab4e012489ef 569 /// 5V-----------VCC (5V in)
davidr99 0:ab4e012489ef 570 /// interrupt 0 pin D2-----------NIRQ (interrupt request out)
davidr99 0:ab4e012489ef 571 /// SS pin D10----------NSEL (chip select in)
davidr99 0:ab4e012489ef 572 /// SCK pin D13----------SCK (SPI clock in)
davidr99 0:ab4e012489ef 573 /// MOSI pin D11----------SDI (SPI Data in)
davidr99 0:ab4e012489ef 574 /// MISO pin D12----------SDO (SPI data out)
davidr99 0:ab4e012489ef 575 /// /--GPIO0 (GPIO0 out to control receiver antenna RXON)
davidr99 0:ab4e012489ef 576 /// \--RXON (RX antenna control in)
davidr99 0:ab4e012489ef 577 /// /--GPIO1 (GPIO1 out to control transmitter antenna TXON)
davidr99 0:ab4e012489ef 578 /// \--TXON (TX antenna control in)
davidr99 0:ab4e012489ef 579 /// \endcode
davidr99 0:ab4e012489ef 580 ///
davidr99 0:ab4e012489ef 581 /// and you can then use the default constructor RH_RF22().
davidr99 0:ab4e012489ef 582 /// You can override the default settings for the SS pin and the interrupt
davidr99 0:ab4e012489ef 583 /// in the RH_RF22 constructor if you wish to connect the slave select SS to other than the normal one for your
davidr99 0:ab4e012489ef 584 /// Arduino (D10 for Diecimila, Uno etc and D53 for Mega)
davidr99 0:ab4e012489ef 585 /// or the interrupt request to other than pin D2 (Caution, different processors have different constraints as to the
davidr99 0:ab4e012489ef 586 /// pins available for interrupts).
davidr99 0:ab4e012489ef 587 ///
davidr99 0:ab4e012489ef 588 /// It is possible to have 2 radios connected to one Arduino, provided each radio has its own
davidr99 0:ab4e012489ef 589 /// SS and interrupt line (SCK, SDI and SDO are common to both radios)
davidr99 0:ab4e012489ef 590 ///
davidr99 0:ab4e012489ef 591 /// Caution: on some Arduinos such as the Mega 2560, if you set the slave select pin to be other than the usual SS
davidr99 0:ab4e012489ef 592 /// pin (D53 on Mega 2560), you may need to set the usual SS pin to be an output to force the Arduino into SPI
davidr99 0:ab4e012489ef 593 /// master mode.
davidr99 0:ab4e012489ef 594 ///
davidr99 0:ab4e012489ef 595 /// Caution: Power supply requirements of the RF22 module may be relevant in some circumstances:
davidr99 0:ab4e012489ef 596 /// RF22 modules are capable of pulling 80mA+ at full power, where Arduino's 3.3V line can
davidr99 0:ab4e012489ef 597 /// give 50mA. You may need to make provision for alternate power supply for
davidr99 0:ab4e012489ef 598 /// the RF22, especially if you wish to use full transmit power, and/or you have
davidr99 0:ab4e012489ef 599 /// other shields demanding power. Inadequate power for the RF22 is reported to cause symptoms such as:
davidr99 0:ab4e012489ef 600 /// - reset's/bootups terminate with "init failed" messages
davidr99 0:ab4e012489ef 601 /// -random termination of communication after 5-30 packets sent/received
davidr99 0:ab4e012489ef 602 /// -"fake ok" state, where initialization passes fluently, but communication doesn't happen
davidr99 0:ab4e012489ef 603 /// -shields hang Arduino boards, especially during the flashing
davidr99 0:ab4e012489ef 604 ///
davidr99 0:ab4e012489ef 605 /// Caution: some RF22 breakout boards (such as the HAB-RFM22B-BOA HAB-RFM22B-BO) reportedly
davidr99 0:ab4e012489ef 606 /// have the TX_ANT and RX_ANT pre-connected to GPIO0 and GPIO1 round the wrong way. You can work with this
davidr99 0:ab4e012489ef 607 /// if you use setGpioReversed().
davidr99 0:ab4e012489ef 608 ///
davidr99 0:ab4e012489ef 609 /// Caution: If you are using a bare RF22 module without IO level shifters, you may have difficulty connecting
davidr99 0:ab4e012489ef 610 /// to a 5V arduino. The RF22 module is 3.3V and its IO pins are 3.3V not 5V. Some Arduinos (Diecimila and
davidr99 0:ab4e012489ef 611 /// Uno) seem to work OK with this, and some (Mega) do not always work reliably. Your Mileage May Vary.
davidr99 0:ab4e012489ef 612 /// For best result, use level shifters, or use a RF22 shield or board with level shifters built in,
davidr99 0:ab4e012489ef 613 /// such as the Sparkfun RFM22 shield http://www.sparkfun.com/products/11018.
davidr99 0:ab4e012489ef 614 /// You could also use a 3.3V IO Arduino such as a Pro.
davidr99 0:ab4e012489ef 615 /// It is recognised that it is difficult to connect
davidr99 0:ab4e012489ef 616 /// the Sparkfun RFM22 shield to a Mega, since the SPI pins on the Mega are different to other Arduinos,
davidr99 0:ab4e012489ef 617 /// But it is possible, by bending the SPI pins (D10, D11, D12, D13) on the
davidr99 0:ab4e012489ef 618 /// shield out of the way before plugging it in to the Mega and jumpering the shield pins to the Mega like this:
davidr99 0:ab4e012489ef 619 /// \code
davidr99 0:ab4e012489ef 620 /// RF22 Shield Mega
davidr99 0:ab4e012489ef 621 /// D10 D53
davidr99 0:ab4e012489ef 622 /// D13 D52
davidr99 0:ab4e012489ef 623 /// D11 D51
davidr99 0:ab4e012489ef 624 /// D12 D50
davidr99 0:ab4e012489ef 625 /// \endcode
davidr99 0:ab4e012489ef 626 ///
davidr99 0:ab4e012489ef 627 /// \par Interrupts
davidr99 0:ab4e012489ef 628 ///
davidr99 0:ab4e012489ef 629 /// The Driver uses interrupts to react to events in the RF22 module,
davidr99 0:ab4e012489ef 630 /// such as the reception of a new packet, or the completion of transmission of a packet.
davidr99 0:ab4e012489ef 631 /// The RH_RF22 interrupt service routine reads status from and writes data
davidr99 0:ab4e012489ef 632 /// to the the RF22 module via the SPI interface. It is very important therefore,
davidr99 0:ab4e012489ef 633 /// that if you are using the RF22 library with another SPI based deviced, that you
davidr99 0:ab4e012489ef 634 /// disable interrupts while you transfer data to and from that other device.
davidr99 0:ab4e012489ef 635 /// Use cli() to disable interrupts and sei() to reenable them.
davidr99 0:ab4e012489ef 636 ///
davidr99 0:ab4e012489ef 637 /// \par SPI Interface
davidr99 0:ab4e012489ef 638 ///
davidr99 0:ab4e012489ef 639 /// The RF22 module uses the SPI bus to communicate with the Arduino. Arduino
davidr99 0:ab4e012489ef 640 /// IDE includes a hardware SPI class to communicate with SPI devices using
davidr99 0:ab4e012489ef 641 /// the SPI facilities built into the Atmel chips, over the standard designated
davidr99 0:ab4e012489ef 642 /// SPI pins MOSI, MISO, SCK, which are usually on Arduino pins 11, 12 and 13
davidr99 0:ab4e012489ef 643 /// respectively (or 51, 50, 52 on a Mega).
davidr99 0:ab4e012489ef 644 ///
davidr99 0:ab4e012489ef 645 /// By default, the RH_RF22 Driver uses the Hardware SPI interface to
davidr99 0:ab4e012489ef 646 /// communicate with the RF22 module. However, if your RF22 SPI is connected to
davidr99 0:ab4e012489ef 647 /// the Arduino through non-standard pins, or the standard Hardware SPI
davidr99 0:ab4e012489ef 648 /// interface will not work for you, you can instead use a bit-banged Software
davidr99 0:ab4e012489ef 649 /// SPI class RHSoftwareSPI, which can be configured to work on any Arduino digital IO pins.
davidr99 0:ab4e012489ef 650 /// See the documentation of RHSoftwareSPI for details.
davidr99 0:ab4e012489ef 651 ///
davidr99 0:ab4e012489ef 652 /// The advantages of the Software SPI interface are that it can be used on
davidr99 0:ab4e012489ef 653 /// any Arduino pins, not just the usual dedicated hardware pins. The
davidr99 0:ab4e012489ef 654 /// disadvantage is that it is significantly slower then hardware.
davidr99 0:ab4e012489ef 655 /// If you observe reliable behaviour with the default hardware SPI RHHardwareSPI, but unreliable behaviour
davidr99 0:ab4e012489ef 656 /// with Software SPI RHSoftwareSPI, it may be due to slow CPU performance.
davidr99 0:ab4e012489ef 657 ///
davidr99 0:ab4e012489ef 658 /// Initialisation example with hardware SPI
davidr99 0:ab4e012489ef 659 /// \code
davidr99 0:ab4e012489ef 660 /// #include <RH_RF22.h>
davidr99 0:ab4e012489ef 661 /// RH_RF22 driver;
davidr99 0:ab4e012489ef 662 /// RHReliableDatagram manager(driver, CLIENT_ADDRESS);
davidr99 0:ab4e012489ef 663 /// \endcode
davidr99 0:ab4e012489ef 664 ///
davidr99 0:ab4e012489ef 665 /// Initialisation example with software SPI
davidr99 0:ab4e012489ef 666 /// \code
davidr99 0:ab4e012489ef 667 /// #include <RH_RF22.h>
davidr99 0:ab4e012489ef 668 /// #include <RHSoftwareSPI.h>
davidr99 0:ab4e012489ef 669 /// RHSoftwareSPI spi;
davidr99 0:ab4e012489ef 670 /// RH_RF22 driver(10, 2, spi);
davidr99 0:ab4e012489ef 671 /// RHReliableDatagram manager(driver, CLIENT_ADDRESS);
davidr99 0:ab4e012489ef 672 /// \endcode
davidr99 0:ab4e012489ef 673 ///
davidr99 0:ab4e012489ef 674 /// \par Memory
davidr99 0:ab4e012489ef 675 ///
davidr99 0:ab4e012489ef 676 /// The RH_RF22 Driver requires non-trivial amounts of memory. The sample programs all compile to
davidr99 0:ab4e012489ef 677 /// about 9 to 14kbytes each on Arduino, which will fit in the flash proram memory of most Arduinos. However,
davidr99 0:ab4e012489ef 678 /// the RAM requirements are more critical. Most sample programs above will run on Duemilanova,
davidr99 0:ab4e012489ef 679 /// but not on Diecimila. Even on Duemilanova, the RAM requirements are very close to the
davidr99 0:ab4e012489ef 680 /// available memory of 2kbytes. Therefore, you should be vary sparing with RAM use in programs that use
davidr99 0:ab4e012489ef 681 /// the RH_RF22 Driver on Duemilanova.
davidr99 0:ab4e012489ef 682 ///
davidr99 0:ab4e012489ef 683 /// The sample RHRouter and RHMesh programs compile to about 14kbytes,
davidr99 0:ab4e012489ef 684 /// and require more RAM than the others.
davidr99 0:ab4e012489ef 685 /// They will not run on Duemilanova or Diecimila, but will run on Arduino Mega.
davidr99 0:ab4e012489ef 686 ///
davidr99 0:ab4e012489ef 687 /// It is often hard to accurately identify when you are hitting RAM limits on Arduino.
davidr99 0:ab4e012489ef 688 /// The symptoms can include:
davidr99 0:ab4e012489ef 689 /// - Mysterious crashes and restarts
davidr99 0:ab4e012489ef 690 /// - Changes in behaviour when seemingly unrelated changes are made (such as adding print() statements)
davidr99 0:ab4e012489ef 691 /// - Hanging
davidr99 0:ab4e012489ef 692 /// - Output from Serial.print() not appearing
davidr99 0:ab4e012489ef 693 ///
davidr99 0:ab4e012489ef 694 /// With an Arduino Mega, with 8 kbytes of SRAM, there is much more RAM headroom for
davidr99 0:ab4e012489ef 695 /// your own elaborate programs.
davidr99 0:ab4e012489ef 696 /// This library is reported to work with Arduino Pro Mini, but that has not been tested by me.
davidr99 0:ab4e012489ef 697 ///
davidr99 0:ab4e012489ef 698 /// The RF22M modules use an inexpensive crystal to control the frequency synthesizer, and therfore you can expect
davidr99 0:ab4e012489ef 699 /// the transmitter and receiver frequencies to be subject to the usual inaccuracies of such crystals. The RF22
davidr99 0:ab4e012489ef 700 /// contains an AFC circuit to compensate for differences in transmitter and receiver frequencies.
davidr99 0:ab4e012489ef 701 /// It does this by altering the receiver frequency during reception by up to the pull-in frequency range.
davidr99 0:ab4e012489ef 702 /// This RF22 library enables the AFC and by default sets the pull-in frequency range to
davidr99 0:ab4e012489ef 703 /// 0.05MHz, which should be sufficient to handle most situations. However, if you observe unexplained packet losses
davidr99 0:ab4e012489ef 704 /// or failure to operate correctly all the time it may be because your modules have a wider frequency difference, and
davidr99 0:ab4e012489ef 705 /// you may need to set the afcPullInRange to a different value, using setFrequency();
davidr99 0:ab4e012489ef 706 ///
davidr99 0:ab4e012489ef 707 /// \par Transmitter Power
davidr99 0:ab4e012489ef 708 ///
davidr99 0:ab4e012489ef 709 /// You can control the transmitter power on the RF22 and RF23 transceivers
davidr99 0:ab4e012489ef 710 /// with the RH_RF22::setTxPower() function. The argument can be any of the
davidr99 0:ab4e012489ef 711 /// RH_RF22_TXPOW_* (for RFM22) or RH_RF22_RF23B_TXPOW_* (for RFM23) values.
davidr99 0:ab4e012489ef 712 /// The default is RH_RF22_TXPOW_8DBM/RH_RF22_RF23B_TXPOW_1DBM . Eg:
davidr99 0:ab4e012489ef 713 /// \code
davidr99 0:ab4e012489ef 714 /// driver.setTxPower(RH_RF22_TXPOW_2DBM);
davidr99 0:ab4e012489ef 715 /// \endcode
davidr99 0:ab4e012489ef 716 ///
davidr99 0:ab4e012489ef 717 /// The RF23BP has higher power capability, there are
davidr99 0:ab4e012489ef 718 /// several power settings that are specific to the RF23BP only:
davidr99 0:ab4e012489ef 719 ///
davidr99 0:ab4e012489ef 720 /// - RH_RF22_RF23BP_TXPOW_28DBM
davidr99 0:ab4e012489ef 721 /// - RH_RF22_RF23BP_TXPOW_29DBM
davidr99 0:ab4e012489ef 722 /// - RH_RF22_RF23BP_TXPOW_38DBM
davidr99 0:ab4e012489ef 723 ///
davidr99 0:ab4e012489ef 724 /// CAUTION: the high power settings available on the RFM23BP require
davidr99 0:ab4e012489ef 725 /// significant power supply current. For example at +30dBm, the typical chip
davidr99 0:ab4e012489ef 726 /// supply current is 550mA. This will overwhelm some small CPU board power
davidr99 0:ab4e012489ef 727 /// regulators and USB supplies. If you use this chip at high power make sure
davidr99 0:ab4e012489ef 728 /// you have an adequate supply current providing full 5V to the RFM23BP (and
davidr99 0:ab4e012489ef 729 /// the CPU if required), otherwise you can expect strange behaviour like
davidr99 0:ab4e012489ef 730 /// hanging, stopping, incorrect power levels, RF power amp overheating etc.
davidr99 0:ab4e012489ef 731 /// You must also ensure that the RFM23BP GPIO pins are connected to the
davidr99 0:ab4e012489ef 732 /// antenna switch control pins like so:
davidr99 0:ab4e012489ef 733 ////
davidr99 0:ab4e012489ef 734 /// \code
davidr99 0:ab4e012489ef 735 /// GPIO0 <-> RXON
davidr99 0:ab4e012489ef 736 /// GPIO1 <-> TXON
davidr99 0:ab4e012489ef 737 /// \endcode
davidr99 0:ab4e012489ef 738 ///
davidr99 0:ab4e012489ef 739 /// The RF output impedance of the RFM22BP module is 50 ohms. In our
davidr99 0:ab4e012489ef 740 /// experiments we found that the most critical issue (besides a suitable
davidr99 0:ab4e012489ef 741 /// power supply) is to ensure that the antenna impedance is also near 50
davidr99 0:ab4e012489ef 742 /// ohms. Connecting a simple 1/4 wavelength (ie a 17.3cm single wire)
davidr99 0:ab4e012489ef 743 /// directly to the antenna output <b>will not work at full 30dBm power</b>,
davidr99 0:ab4e012489ef 744 /// and will result in the transmitter hanging and/or the power amp
davidr99 0:ab4e012489ef 745 /// overheating. Connect a proper 50 ohm impedance transmission line or
davidr99 0:ab4e012489ef 746 /// antenna, and prevent RF radiation into the radio and arduino modules,
davidr99 0:ab4e012489ef 747 /// in order to get full, reliable power. Our tests show that a 433MHz
davidr99 0:ab4e012489ef 748 /// RFM23BP feeding a 50 ohm transmission line with a VHF discone antenna at
davidr99 0:ab4e012489ef 749 /// the end results in full power output and the power amp transistor on the
davidr99 0:ab4e012489ef 750 /// RFM22BP module runnning slightly warm but not hot. We recommend you use
davidr99 0:ab4e012489ef 751 /// the services of a competent RF engineer when trying to use this high power
davidr99 0:ab4e012489ef 752 /// module.
davidr99 0:ab4e012489ef 753 ///
davidr99 0:ab4e012489ef 754 /// Note: with RFM23BP, the reported maximum possible power when operating on 3.3V is 27dBm.
davidr99 0:ab4e012489ef 755 ///
davidr99 0:ab4e012489ef 756 /// We have made some actual power measurements against
davidr99 0:ab4e012489ef 757 /// programmed power for Sparkfun RFM22 wireless module under the following conditions:
davidr99 0:ab4e012489ef 758 /// - Sparkfun RFM22 wireless module, Duemilanove, USB power
davidr99 0:ab4e012489ef 759 /// - 10cm RG58C/U soldered direct to RFM22 module ANT and GND
davidr99 0:ab4e012489ef 760 /// - bnc connecteor
davidr99 0:ab4e012489ef 761 /// - 12dB attenuator
davidr99 0:ab4e012489ef 762 /// - BNC-SMA adapter
davidr99 0:ab4e012489ef 763 /// - MiniKits AD8307 HF/VHF Power Head (calibrated against Rohde&Schwartz 806.2020 test set)
davidr99 0:ab4e012489ef 764 /// - Tektronix TDS220 scope to measure the Vout from power head
davidr99 0:ab4e012489ef 765 /// \code
davidr99 0:ab4e012489ef 766 /// Program power Measured Power
davidr99 0:ab4e012489ef 767 /// dBm dBm
davidr99 0:ab4e012489ef 768 /// 1 -5.6
davidr99 0:ab4e012489ef 769 /// 2 -3.8
davidr99 0:ab4e012489ef 770 /// 5 -2.2
davidr99 0:ab4e012489ef 771 /// 8 -0.6
davidr99 0:ab4e012489ef 772 /// 11 1.2
davidr99 0:ab4e012489ef 773 /// 14 11.6
davidr99 0:ab4e012489ef 774 /// 17 14.4
davidr99 0:ab4e012489ef 775 /// 20 18.0
davidr99 0:ab4e012489ef 776 /// \endcode
davidr99 0:ab4e012489ef 777 /// (Caution: we dont claim laboratory accuracy for these measurements)
davidr99 0:ab4e012489ef 778 /// You would not expect to get anywhere near these powers to air with a simple 1/4 wavelength wire antenna.
davidr99 0:ab4e012489ef 779 ///
davidr99 0:ab4e012489ef 780 /// \par Performance
davidr99 0:ab4e012489ef 781 ///
davidr99 0:ab4e012489ef 782 /// Some simple speed performance tests have been conducted.
davidr99 0:ab4e012489ef 783 /// In general packet transmission rate will be limited by the modulation scheme.
davidr99 0:ab4e012489ef 784 /// Also, if your code does any slow operations like Serial printing it will also limit performance.
davidr99 0:ab4e012489ef 785 /// We disabled any printing in the tests below.
davidr99 0:ab4e012489ef 786 /// We tested with RH_RF22::GFSK_Rb125Fd125, which is probably the fastest scheme available.
davidr99 0:ab4e012489ef 787 /// We tested with a 13 octet message length, over a very short distance of 10cm.
davidr99 0:ab4e012489ef 788 ///
davidr99 0:ab4e012489ef 789 /// Transmission (no reply) tests with modulation RH_RF22::GFSK_Rb125Fd125 and a
davidr99 0:ab4e012489ef 790 /// 13 octet message show about 330 messages per second transmitted.
davidr99 0:ab4e012489ef 791 ///
davidr99 0:ab4e012489ef 792 /// Transmit-and-wait-for-a-reply tests with modulation RH_RF22::GFSK_Rb125Fd125 and a
davidr99 0:ab4e012489ef 793 /// 13 octet message (send and receive) show about 160 round trips per second.
davidr99 0:ab4e012489ef 794 ///
davidr99 0:ab4e012489ef 795 /// \par Compatibility with RF22 library
davidr99 0:ab4e012489ef 796 /// The RH_RF22 driver is based on our earlier RF22 library http://www.airspayce.com/mikem/arduino/RF22
davidr99 0:ab4e012489ef 797 /// We have tried hard to be as compatible as possible with the earlier RF22 library, but there are some differences:
davidr99 0:ab4e012489ef 798 /// - Different constructor.
davidr99 0:ab4e012489ef 799 /// - Indexes for some modem configurations have changed (we recommend you use the symbolic names, not integer indexes).
davidr99 0:ab4e012489ef 800 ///
davidr99 0:ab4e012489ef 801 /// The major difference is that under RadioHead, you are
davidr99 0:ab4e012489ef 802 /// required to create 2 objects (ie RH_RF22 and a manager) instead of just one object under RF22
davidr99 0:ab4e012489ef 803 /// (ie RHMesh, RHRouter, RHReliableDatagram or RHDatagram).
davidr99 0:ab4e012489ef 804 /// It may be sufficient or you to change for example:
davidr99 0:ab4e012489ef 805 /// \code
davidr99 0:ab4e012489ef 806 /// RF22ReliableDatagram rf22(CLIENT_ADDRESS);
davidr99 0:ab4e012489ef 807 /// \endcode
davidr99 0:ab4e012489ef 808 /// to:
davidr99 0:ab4e012489ef 809 /// \code
davidr99 0:ab4e012489ef 810 /// RH_RF22 driver;
davidr99 0:ab4e012489ef 811 /// RHReliableDatagram rf22(driver, CLIENT_ADDRESS);
davidr99 0:ab4e012489ef 812 /// \endcode
davidr99 0:ab4e012489ef 813 /// and any instance of RF22_MAX_MESSAGE_LEN to RH_RF22_MAX_MESSAGE_LEN
davidr99 0:ab4e012489ef 814 ///
davidr99 0:ab4e012489ef 815 /// RadioHead version 1.6 changed the way the interrupt pin number is
davidr99 0:ab4e012489ef 816 /// specified on Arduino and Uno32 platforms. If your code previously
davidr99 0:ab4e012489ef 817 /// specifed a non-default interrupt pin number in the RH_RF22 constructor,
davidr99 0:ab4e012489ef 818 /// you may need to review your code to specify the correct interrrupt pin
davidr99 0:ab4e012489ef 819 /// (and not the interrupt number as before).
davidr99 0:ab4e012489ef 820 class RH_RF22 : public RHSPIDriver
davidr99 0:ab4e012489ef 821 {
davidr99 0:ab4e012489ef 822 public:
davidr99 0:ab4e012489ef 823
davidr99 0:ab4e012489ef 824 /// \brief Defines register values for a set of modem configuration registers
davidr99 0:ab4e012489ef 825 ///
davidr99 0:ab4e012489ef 826 /// Defines register values for a set of modem configuration registers
davidr99 0:ab4e012489ef 827 /// that can be passed to setModemConfig()
davidr99 0:ab4e012489ef 828 /// if none of the choices in ModemConfigChoice suit your need
davidr99 0:ab4e012489ef 829 /// setModemConfig() writes the register values to the appropriate RH_RF22 registers
davidr99 0:ab4e012489ef 830 /// to set the desired modulation type, data rate and deviation/bandwidth.
davidr99 0:ab4e012489ef 831 /// Suitable values for these registers can be computed using the register calculator at
davidr99 0:ab4e012489ef 832 /// http://www.hoperf.com/upload/rf/RF22B%2023B%2031B%2042B%2043B%20Register%20Settings_RevB1-v5.xls
davidr99 0:ab4e012489ef 833 typedef struct
davidr99 0:ab4e012489ef 834 {
davidr99 0:ab4e012489ef 835 uint8_t reg_1c; ///< Value for register RH_RF22_REG_1C_IF_FILTER_BANDWIDTH
davidr99 0:ab4e012489ef 836 uint8_t reg_1f; ///< Value for register RH_RF22_REG_1F_CLOCK_RECOVERY_GEARSHIFT_OVERRIDE
davidr99 0:ab4e012489ef 837 uint8_t reg_20; ///< Value for register RH_RF22_REG_20_CLOCK_RECOVERY_OVERSAMPLING_RATE
davidr99 0:ab4e012489ef 838 uint8_t reg_21; ///< Value for register RH_RF22_REG_21_CLOCK_RECOVERY_OFFSET2
davidr99 0:ab4e012489ef 839 uint8_t reg_22; ///< Value for register RH_RF22_REG_22_CLOCK_RECOVERY_OFFSET1
davidr99 0:ab4e012489ef 840 uint8_t reg_23; ///< Value for register RH_RF22_REG_23_CLOCK_RECOVERY_OFFSET0
davidr99 0:ab4e012489ef 841 uint8_t reg_24; ///< Value for register RH_RF22_REG_24_CLOCK_RECOVERY_TIMING_LOOP_GAIN1
davidr99 0:ab4e012489ef 842 uint8_t reg_25; ///< Value for register RH_RF22_REG_25_CLOCK_RECOVERY_TIMING_LOOP_GAIN0
davidr99 0:ab4e012489ef 843 uint8_t reg_2c; ///< Value for register RH_RF22_REG_2C_OOK_COUNTER_VALUE_1
davidr99 0:ab4e012489ef 844 uint8_t reg_2d; ///< Value for register RH_RF22_REG_2D_OOK_COUNTER_VALUE_2
davidr99 0:ab4e012489ef 845 uint8_t reg_2e; ///< Value for register RH_RF22_REG_2E_SLICER_PEAK_HOLD
davidr99 0:ab4e012489ef 846 uint8_t reg_58; ///< Value for register RH_RF22_REG_58_CHARGE_PUMP_CURRENT_TRIMMING
davidr99 0:ab4e012489ef 847 uint8_t reg_69; ///< Value for register RH_RF22_REG_69_AGC_OVERRIDE1
davidr99 0:ab4e012489ef 848 uint8_t reg_6e; ///< Value for register RH_RF22_REG_6E_TX_DATA_RATE1
davidr99 0:ab4e012489ef 849 uint8_t reg_6f; ///< Value for register RH_RF22_REG_6F_TX_DATA_RATE0
davidr99 0:ab4e012489ef 850 uint8_t reg_70; ///< Value for register RH_RF22_REG_70_MODULATION_CONTROL1
davidr99 0:ab4e012489ef 851 uint8_t reg_71; ///< Value for register RH_RF22_REG_71_MODULATION_CONTROL2
davidr99 0:ab4e012489ef 852 uint8_t reg_72; ///< Value for register RH_RF22_REG_72_FREQUENCY_DEVIATION
davidr99 0:ab4e012489ef 853 } ModemConfig;
davidr99 0:ab4e012489ef 854
davidr99 0:ab4e012489ef 855 /// Choices for setModemConfig() for a selected subset of common modulation types,
davidr99 0:ab4e012489ef 856 /// and data rates. If you need another configuration, use the register calculator.
davidr99 0:ab4e012489ef 857 /// and call setModemRegisters() with your desired settings.
davidr99 0:ab4e012489ef 858 /// These are indexes into MODEM_CONFIG_TABLE. We strongly recommend you use these symbolic
davidr99 0:ab4e012489ef 859 /// definitions and not their integer equivalents: its possible that new values will be
davidr99 0:ab4e012489ef 860 /// introduced in later versions (though we will try to avoid it).
davidr99 0:ab4e012489ef 861 typedef enum
davidr99 0:ab4e012489ef 862 {
davidr99 0:ab4e012489ef 863 UnmodulatedCarrier = 0, ///< Unmodulated carrier for testing
davidr99 0:ab4e012489ef 864 FSK_PN9_Rb2Fd5, ///< FSK, No Manchester, Rb = 2kbs, Fd = 5kHz, PN9 random modulation for testing
davidr99 0:ab4e012489ef 865
davidr99 0:ab4e012489ef 866 FSK_Rb2Fd5, ///< FSK, No Manchester, Rb = 2kbs, Fd = 5kHz
davidr99 0:ab4e012489ef 867 FSK_Rb2_4Fd36, ///< FSK, No Manchester, Rb = 2.4kbs, Fd = 36kHz
davidr99 0:ab4e012489ef 868 FSK_Rb4_8Fd45, ///< FSK, No Manchester, Rb = 4.8kbs, Fd = 45kHz
davidr99 0:ab4e012489ef 869 FSK_Rb9_6Fd45, ///< FSK, No Manchester, Rb = 9.6kbs, Fd = 45kHz
davidr99 0:ab4e012489ef 870 FSK_Rb19_2Fd9_6, ///< FSK, No Manchester, Rb = 19.2kbs, Fd = 9.6kHz
davidr99 0:ab4e012489ef 871 FSK_Rb38_4Fd19_6, ///< FSK, No Manchester, Rb = 38.4kbs, Fd = 19.6kHz
davidr99 0:ab4e012489ef 872 FSK_Rb57_6Fd28_8, ///< FSK, No Manchester, Rb = 57.6kbs, Fd = 28.8kHz
davidr99 0:ab4e012489ef 873 FSK_Rb125Fd125, ///< FSK, No Manchester, Rb = 125kbs, Fd = 125kHz
davidr99 0:ab4e012489ef 874 FSK_Rb_512Fd2_5, ///< FSK, No Manchester, Rb = 512bs, Fd = 2.5kHz, for POCSAG compatibility
davidr99 0:ab4e012489ef 875 FSK_Rb_512Fd4_5, ///< FSK, No Manchester, Rb = 512bs, Fd = 4.5kHz, for POCSAG compatibility
davidr99 0:ab4e012489ef 876
davidr99 0:ab4e012489ef 877 GFSK_Rb2Fd5, ///< GFSK, No Manchester, Rb = 2kbs, Fd = 5kHz
davidr99 0:ab4e012489ef 878 GFSK_Rb2_4Fd36, ///< GFSK, No Manchester, Rb = 2.4kbs, Fd = 36kHz
davidr99 0:ab4e012489ef 879 GFSK_Rb4_8Fd45, ///< GFSK, No Manchester, Rb = 4.8kbs, Fd = 45kHz
davidr99 0:ab4e012489ef 880 GFSK_Rb9_6Fd45, ///< GFSK, No Manchester, Rb = 9.6kbs, Fd = 45kHz
davidr99 0:ab4e012489ef 881 GFSK_Rb19_2Fd9_6, ///< GFSK, No Manchester, Rb = 19.2kbs, Fd = 9.6kHz
davidr99 0:ab4e012489ef 882 GFSK_Rb38_4Fd19_6, ///< GFSK, No Manchester, Rb = 38.4kbs, Fd = 19.6kHz
davidr99 0:ab4e012489ef 883 GFSK_Rb57_6Fd28_8, ///< GFSK, No Manchester, Rb = 57.6kbs, Fd = 28.8kHz
davidr99 0:ab4e012489ef 884 GFSK_Rb125Fd125, ///< GFSK, No Manchester, Rb = 125kbs, Fd = 125kHz
davidr99 0:ab4e012489ef 885
davidr99 0:ab4e012489ef 886 OOK_Rb1_2Bw75, ///< OOK, No Manchester, Rb = 1.2kbs, Rx Bandwidth = 75kHz
davidr99 0:ab4e012489ef 887 OOK_Rb2_4Bw335, ///< OOK, No Manchester, Rb = 2.4kbs, Rx Bandwidth = 335kHz
davidr99 0:ab4e012489ef 888 OOK_Rb4_8Bw335, ///< OOK, No Manchester, Rb = 4.8kbs, Rx Bandwidth = 335kHz
davidr99 0:ab4e012489ef 889 OOK_Rb9_6Bw335, ///< OOK, No Manchester, Rb = 9.6kbs, Rx Bandwidth = 335kHz
davidr99 0:ab4e012489ef 890 OOK_Rb19_2Bw335, ///< OOK, No Manchester, Rb = 19.2kbs, Rx Bandwidth = 335kHz
davidr99 0:ab4e012489ef 891 OOK_Rb38_4Bw335, ///< OOK, No Manchester, Rb = 38.4kbs, Rx Bandwidth = 335kHz
davidr99 0:ab4e012489ef 892 OOK_Rb40Bw335 ///< OOK, No Manchester, Rb = 40kbs, Rx Bandwidth = 335kHz
davidr99 0:ab4e012489ef 893
davidr99 0:ab4e012489ef 894 } ModemConfigChoice;
davidr99 0:ab4e012489ef 895
davidr99 0:ab4e012489ef 896 /// \brief Defines the available choices for CRC
davidr99 0:ab4e012489ef 897 /// Types of permitted CRC polynomials, to be passed to setCRCPolynomial()
davidr99 0:ab4e012489ef 898 /// They deliberately have the same numeric values as the crc[1:0] field of Register
davidr99 0:ab4e012489ef 899 /// RH_RF22_REG_30_DATA_ACCESS_CONTROL
davidr99 0:ab4e012489ef 900 typedef enum
davidr99 0:ab4e012489ef 901 {
davidr99 0:ab4e012489ef 902 CRC_CCITT = 0, ///< CCITT
davidr99 0:ab4e012489ef 903 CRC_16_IBM = 1, ///< CRC-16 (IBM) The default used by RH_RF22 driver
davidr99 0:ab4e012489ef 904 CRC_IEC_16 = 2, ///< IEC-16
davidr99 0:ab4e012489ef 905 CRC_Biacheva = 3 ///< Biacheva
davidr99 0:ab4e012489ef 906 } CRCPolynomial;
davidr99 0:ab4e012489ef 907
davidr99 0:ab4e012489ef 908 /// Constructor. You can have multiple instances, but each instance must have its own
davidr99 0:ab4e012489ef 909 /// interrupt and slave select pin. After constructing, you must call init() to initialise the interface
davidr99 0:ab4e012489ef 910 /// and the radio module. A maximum of 3 instances can co-exist on one processor, provided there are sufficient
davidr99 0:ab4e012489ef 911 /// distinct interrupt lines, one for each instance.
davidr99 0:ab4e012489ef 912 /// \param[in] slaveSelectPin the Arduino pin number of the output to use to select the RH_RF22 before
davidr99 0:ab4e012489ef 913 /// accessing it. Defaults to the normal SS pin for your Arduino (D10 for Diecimila, Uno etc, D53 for Mega, D10 for Maple)
davidr99 0:ab4e012489ef 914 /// \param[in] interruptPin The interrupt Pin number that is connected to the RF22 NIRQ interrupt line.
davidr99 0:ab4e012489ef 915 /// Defaults to pin 2, as required by sparkfun RFM22 module shields.
davidr99 0:ab4e012489ef 916 /// Caution: You must specify an interrupt capable pin.
davidr99 0:ab4e012489ef 917 /// On many Arduino boards, there are limitations as to which pins may be used as interrupts.
davidr99 0:ab4e012489ef 918 /// On Leonardo pins 0, 1, 2 or 3. On Mega2560 pins 2, 3, 18, 19, 20, 21. On Due and Teensy, any digital pin.
davidr99 0:ab4e012489ef 919 /// On other Arduinos pins 2 or 3.
davidr99 0:ab4e012489ef 920 /// See http://arduino.cc/en/Reference/attachInterrupt for more details.
davidr99 0:ab4e012489ef 921 /// On Chipkit Uno32, pins 38, 2, 7, 8, 35.
davidr99 0:ab4e012489ef 922 /// On other boards, any digital pin may be used.
davidr99 0:ab4e012489ef 923 /// \param[in] spi Pointer to the SPI interface object to use.
davidr99 0:ab4e012489ef 924 /// Defaults to the standard Arduino hardware SPI interface
davidr99 0:ab4e012489ef 925 RH_RF22(PINS slaveSelectPin, PINS interruptPin, RHGenericSPI& spi = hardware_spi);
davidr99 0:ab4e012489ef 926
davidr99 0:ab4e012489ef 927 /// Initialises this instance and the radio module connected to it.
davidr99 0:ab4e012489ef 928 /// The following steps are taken:
davidr99 0:ab4e012489ef 929 /// - Initialise the slave select pin and the SPI interface library
davidr99 0:ab4e012489ef 930 /// - Software reset the RH_RF22 module
davidr99 0:ab4e012489ef 931 /// - Checks the connected RH_RF22 module is either a RH_RF22_DEVICE_TYPE_RX_TRX or a RH_RF22_DEVICE_TYPE_TX
davidr99 0:ab4e012489ef 932 /// - Attaches an interrupt handler
davidr99 0:ab4e012489ef 933 /// - Configures the RH_RF22 module
davidr99 0:ab4e012489ef 934 /// - Sets the frequency to 434.0 MHz
davidr99 0:ab4e012489ef 935 /// - Sets the modem data rate to FSK_Rb2_4Fd36
davidr99 0:ab4e012489ef 936 /// \return true if everything was successful
davidr99 0:ab4e012489ef 937 bool init();
davidr99 0:ab4e012489ef 938
davidr99 0:ab4e012489ef 939 /// Issues a software reset to the
davidr99 0:ab4e012489ef 940 /// RH_RF22 module. Blocks for 1ms to ensure the reset is complete.
davidr99 0:ab4e012489ef 941 void reset();
davidr99 0:ab4e012489ef 942
davidr99 0:ab4e012489ef 943 /// Reads and returns the device status register RH_RF22_REG_02_DEVICE_STATUS
davidr99 0:ab4e012489ef 944 /// \return The value of the device status register
davidr99 0:ab4e012489ef 945 uint8_t statusRead();
davidr99 0:ab4e012489ef 946
davidr99 0:ab4e012489ef 947 /// Reads a value from the on-chip analog-digital converter
davidr99 0:ab4e012489ef 948 /// \param[in] adcsel Selects the ADC input to measure. One of RH_RF22_ADCSEL_*. Defaults to the
davidr99 0:ab4e012489ef 949 /// internal temperature sensor
davidr99 0:ab4e012489ef 950 /// \param[in] adcref Specifies the refernce voltage to use. One of RH_RF22_ADCREF_*.
davidr99 0:ab4e012489ef 951 /// Defaults to the internal bandgap voltage.
davidr99 0:ab4e012489ef 952 /// \param[in] adcgain Amplifier gain selection.
davidr99 0:ab4e012489ef 953 /// \param[in] adcoffs Amplifier offseet (0 to 15).
davidr99 0:ab4e012489ef 954 /// \return The analog value. 0 to 255.
davidr99 0:ab4e012489ef 955 uint8_t adcRead(uint8_t adcsel = RH_RF22_ADCSEL_INTERNAL_TEMPERATURE_SENSOR,
davidr99 0:ab4e012489ef 956 uint8_t adcref = RH_RF22_ADCREF_BANDGAP_VOLTAGE,
davidr99 0:ab4e012489ef 957 uint8_t adcgain = 0,
davidr99 0:ab4e012489ef 958 uint8_t adcoffs = 0);
davidr99 0:ab4e012489ef 959
davidr99 0:ab4e012489ef 960 /// Reads the on-chip temperature sensor
davidr99 0:ab4e012489ef 961 /// \param[in] tsrange Specifies the temperature range to use. One of RH_RF22_TSRANGE_*
davidr99 0:ab4e012489ef 962 /// \param[in] tvoffs Specifies the temperature value offset. This is actually signed value
davidr99 0:ab4e012489ef 963 /// added to the measured temperature value
davidr99 0:ab4e012489ef 964 /// \return The measured temperature.
davidr99 0:ab4e012489ef 965 uint8_t temperatureRead(uint8_t tsrange = RH_RF22_TSRANGE_M64_64C, uint8_t tvoffs = 0);
davidr99 0:ab4e012489ef 966
davidr99 0:ab4e012489ef 967 /// Reads the wakeup timer value in registers RH_RF22_REG_17_WAKEUP_TIMER_VALUE1
davidr99 0:ab4e012489ef 968 /// and RH_RF22_REG_18_WAKEUP_TIMER_VALUE2
davidr99 0:ab4e012489ef 969 /// \return The wakeup timer value
davidr99 0:ab4e012489ef 970 uint16_t wutRead();
davidr99 0:ab4e012489ef 971
davidr99 0:ab4e012489ef 972 /// Sets the wakeup timer period registers RH_RF22_REG_14_WAKEUP_TIMER_PERIOD1,
davidr99 0:ab4e012489ef 973 /// RH_RF22_REG_15_WAKEUP_TIMER_PERIOD2 and RH_RF22_R<EG_16_WAKEUP_TIMER_PERIOD3
davidr99 0:ab4e012489ef 974 /// \param[in] wtm Wakeup timer mantissa value
davidr99 0:ab4e012489ef 975 /// \param[in] wtr Wakeup timer exponent R value
davidr99 0:ab4e012489ef 976 /// \param[in] wtd Wakeup timer exponent D value
davidr99 0:ab4e012489ef 977 void setWutPeriod(uint16_t wtm, uint8_t wtr = 0, uint8_t wtd = 0);
davidr99 0:ab4e012489ef 978
davidr99 0:ab4e012489ef 979 /// Sets the transmitter and receiver centre frequency
davidr99 0:ab4e012489ef 980 /// \param[in] centre Frequency in MHz. 240.0 to 960.0. Caution, some versions of RH_RF22 and derivatives
davidr99 0:ab4e012489ef 981 /// implemented more restricted frequency ranges.
davidr99 0:ab4e012489ef 982 /// \param[in] afcPullInRange Sets the AF Pull In Range in MHz. Defaults to 0.05MHz (50kHz).
davidr99 0:ab4e012489ef 983 /// Range is 0.0 to 0.159375
davidr99 0:ab4e012489ef 984 /// for frequencies 240.0 to 480MHz, and 0.0 to 0.318750MHz for frequencies 480.0 to 960MHz,
davidr99 0:ab4e012489ef 985 /// \return true if the selected frquency centre + (fhch * fhs) is within range and the afcPullInRange
davidr99 0:ab4e012489ef 986 /// is within range
davidr99 0:ab4e012489ef 987 bool setFrequency(float centre, float afcPullInRange = 0.05);
davidr99 0:ab4e012489ef 988
davidr99 0:ab4e012489ef 989 /// Sets the frequency hopping step size.
davidr99 0:ab4e012489ef 990 /// \param[in] fhs Frequency Hopping step size in 10kHz increments
davidr99 0:ab4e012489ef 991 /// \return true if centre + (fhch * fhs) is within limits
davidr99 0:ab4e012489ef 992 bool setFHStepSize(uint8_t fhs);
davidr99 0:ab4e012489ef 993
davidr99 0:ab4e012489ef 994 /// Sets the frequncy hopping channel. Adds fhch * fhs to centre frequency
davidr99 0:ab4e012489ef 995 /// \param[in] fhch The channel number
davidr99 0:ab4e012489ef 996 /// \return true if the selected frquency centre + (fhch * fhs) is within range
davidr99 0:ab4e012489ef 997 bool setFHChannel(uint8_t fhch);
davidr99 0:ab4e012489ef 998
davidr99 0:ab4e012489ef 999 /// Reads and returns the current RSSI value from register RH_RF22_REG_26_RSSI. Caution: this is
davidr99 0:ab4e012489ef 1000 /// in internal units (see figure 31 of RFM22B/23B documentation), not in dBm. If you want to find the RSSI in dBm
davidr99 0:ab4e012489ef 1001 /// of the last received message, use lastRssi() instead.
davidr99 0:ab4e012489ef 1002 /// \return The current RSSI value
davidr99 0:ab4e012489ef 1003 uint8_t rssiRead();
davidr99 0:ab4e012489ef 1004
davidr99 0:ab4e012489ef 1005 /// Reads and returns the current EZMAC value from register RH_RF22_REG_31_EZMAC_STATUS
davidr99 0:ab4e012489ef 1006 /// \return The current EZMAC value
davidr99 0:ab4e012489ef 1007 uint8_t ezmacStatusRead();
davidr99 0:ab4e012489ef 1008
davidr99 0:ab4e012489ef 1009 /// Sets the parameters for the RH_RF22 Idle mode in register RH_RF22_REG_07_OPERATING_MODE.
davidr99 0:ab4e012489ef 1010 /// Idle mode is the mode the RH_RF22 will be in when not transmitting or receiving. The default idle mode
davidr99 0:ab4e012489ef 1011 /// is RH_RF22_XTON ie READY mode.
davidr99 0:ab4e012489ef 1012 /// \param[in] mode Mask of mode bits, using RH_RF22_SWRES, RH_RF22_ENLBD, RH_RF22_ENWT,
davidr99 0:ab4e012489ef 1013 /// RH_RF22_X32KSEL, RH_RF22_PLLON, RH_RF22_XTON.
davidr99 0:ab4e012489ef 1014 void setOpMode(uint8_t mode);
davidr99 0:ab4e012489ef 1015
davidr99 0:ab4e012489ef 1016 /// If current mode is Rx or Tx changes it to Idle. If the transmitter or receiver is running,
davidr99 0:ab4e012489ef 1017 /// disables them.
davidr99 0:ab4e012489ef 1018 void setModeIdle();
davidr99 0:ab4e012489ef 1019
davidr99 0:ab4e012489ef 1020 /// If current mode is Tx or Idle, changes it to Rx.
davidr99 0:ab4e012489ef 1021 /// Starts the receiver in the RH_RF22.
davidr99 0:ab4e012489ef 1022 void setModeRx();
davidr99 0:ab4e012489ef 1023
davidr99 0:ab4e012489ef 1024 /// If current mode is Rx or Idle, changes it to Rx.
davidr99 0:ab4e012489ef 1025 /// Starts the transmitter in the RH_RF22.
davidr99 0:ab4e012489ef 1026 void setModeTx();
davidr99 0:ab4e012489ef 1027
davidr99 0:ab4e012489ef 1028 /// Sets the transmitter power output level in register RH_RF22_REG_6D_TX_POWER.
davidr99 0:ab4e012489ef 1029 /// Be a good neighbour and set the lowest power level you need.
davidr99 0:ab4e012489ef 1030 /// After init(), the power will be set to RH_RF22::RH_RF22_TXPOW_8DBM on RF22B
davidr99 0:ab4e012489ef 1031 /// or RH_RF22_RF23B_TXPOW_1DBM on an RF23B.
davidr99 0:ab4e012489ef 1032 /// The highest power available on RF22B is RH_RF22::RH_RF22_TXPOW_20DBM (20dBm).
davidr99 0:ab4e012489ef 1033 /// The highest power available on RF23B is RH_RF22::RH_RF22_RF23B_TXPOW_13DBM (13dBm).
davidr99 0:ab4e012489ef 1034 /// Higher powers are available on RF23BP (using RH_RF22_RF23BP_TXPOW_*),
davidr99 0:ab4e012489ef 1035 /// and then only with an adequate power supply. See comments above.
davidr99 0:ab4e012489ef 1036 /// Caution: In some countries you may only select certain higher power levels if you
davidr99 0:ab4e012489ef 1037 /// are also using frequency hopping. Make sure you are aware of the legal
davidr99 0:ab4e012489ef 1038 /// limitations and regulations in your region.
davidr99 0:ab4e012489ef 1039 /// \param[in] power Transmitter power level, one of RH_RF22_*TXPOW_*
davidr99 0:ab4e012489ef 1040 void setTxPower(uint8_t power);
davidr99 0:ab4e012489ef 1041
davidr99 0:ab4e012489ef 1042 /// Sets all the registered required to configure the data modem in the RH_RF22, including the data rate,
davidr99 0:ab4e012489ef 1043 /// bandwidths etc. You cas use this to configure the modem with custom configuraitons if none of the
davidr99 0:ab4e012489ef 1044 /// canned configurations in ModemConfigChoice suit you.
davidr99 0:ab4e012489ef 1045 /// \param[in] config A ModemConfig structure containing values for the modem configuration registers.
davidr99 0:ab4e012489ef 1046 void setModemRegisters(const ModemConfig* config);
davidr99 0:ab4e012489ef 1047
davidr99 0:ab4e012489ef 1048 /// Select one of the predefined modem configurations. If you need a modem configuration not provided
davidr99 0:ab4e012489ef 1049 /// here, use setModemRegisters() with your own ModemConfig.
davidr99 0:ab4e012489ef 1050 /// \param[in] index The configuration choice.
davidr99 0:ab4e012489ef 1051 /// \return true if index is a valid choice.
davidr99 0:ab4e012489ef 1052 bool setModemConfig(ModemConfigChoice index);
davidr99 0:ab4e012489ef 1053
davidr99 0:ab4e012489ef 1054 /// Starts the receiver and checks whether a received message is available.
davidr99 0:ab4e012489ef 1055 /// This can be called multiple times in a timeout loop
davidr99 0:ab4e012489ef 1056 /// \return true if a complete, valid message has been received and is able to be retrieved by
davidr99 0:ab4e012489ef 1057 /// recv()
davidr99 0:ab4e012489ef 1058 bool available();
davidr99 0:ab4e012489ef 1059
davidr99 0:ab4e012489ef 1060 /// Turns the receiver on if it not already on.
davidr99 0:ab4e012489ef 1061 /// If there is a valid message available, copy it to buf and return true
davidr99 0:ab4e012489ef 1062 /// else return false.
davidr99 0:ab4e012489ef 1063 /// If a message is copied, *len is set to the length (Caution, 0 length messages are permitted).
davidr99 0:ab4e012489ef 1064 /// You should be sure to call this function frequently enough to not miss any messages
davidr99 0:ab4e012489ef 1065 /// It is recommended that you call it in your main loop.
davidr99 0:ab4e012489ef 1066 /// \param[in] buf Location to copy the received message
davidr99 0:ab4e012489ef 1067 /// \param[in,out] len Pointer to available space in buf. Set to the actual number of octets copied.
davidr99 0:ab4e012489ef 1068 /// \return true if a valid message was copied to buf
davidr99 0:ab4e012489ef 1069 bool recv(uint8_t* buf, uint8_t* len);
davidr99 0:ab4e012489ef 1070
davidr99 0:ab4e012489ef 1071 /// Waits until any previous transmit packet is finished being transmitted with waitPacketSent().
davidr99 0:ab4e012489ef 1072 /// Then loads a message into the transmitter and starts the transmitter. Note that a message length
davidr99 0:ab4e012489ef 1073 /// of 0 is NOT permitted.
davidr99 0:ab4e012489ef 1074 /// \param[in] data Array of data to be sent
davidr99 0:ab4e012489ef 1075 /// \param[in] len Number of bytes of data to send (> 0)
davidr99 0:ab4e012489ef 1076 /// \return true if the message length was valid and it was correctly queued for transmit
davidr99 0:ab4e012489ef 1077 bool send(const uint8_t* data, uint8_t len);
davidr99 0:ab4e012489ef 1078
davidr99 0:ab4e012489ef 1079 /// Sets the length of the preamble
davidr99 0:ab4e012489ef 1080 /// in 4-bit nibbles.
davidr99 0:ab4e012489ef 1081 /// Caution: this should be set to the same
davidr99 0:ab4e012489ef 1082 /// value on all nodes in your network. Default is 8.
davidr99 0:ab4e012489ef 1083 /// Sets the message preamble length in RH_RF22_REG_34_PREAMBLE_LENGTH
davidr99 0:ab4e012489ef 1084 /// \param[in] nibbles Preamble length in nibbles of 4 bits each.
davidr99 0:ab4e012489ef 1085 void setPreambleLength(uint8_t nibbles);
davidr99 0:ab4e012489ef 1086
davidr99 0:ab4e012489ef 1087 /// Sets the sync words for transmit and receive in registers RH_RF22_REG_36_SYNC_WORD3
davidr99 0:ab4e012489ef 1088 /// to RH_RF22_REG_39_SYNC_WORD0
davidr99 0:ab4e012489ef 1089 /// Caution: SyncWords should be set to the same
davidr99 0:ab4e012489ef 1090 /// value on all nodes in your network. Nodes with different SyncWords set will never receive
davidr99 0:ab4e012489ef 1091 /// each others messages, so different SyncWords can be used to isolate different
davidr99 0:ab4e012489ef 1092 /// networks from each other. Default is { 0x2d, 0xd4 }.
davidr99 0:ab4e012489ef 1093 /// \param[in] syncWords Array of sync words, 1 to 4 octets long
davidr99 0:ab4e012489ef 1094 /// \param[in] len Number of sync words to set, 1 to 4.
davidr99 0:ab4e012489ef 1095 void setSyncWords(const uint8_t* syncWords, uint8_t len);
davidr99 0:ab4e012489ef 1096
davidr99 0:ab4e012489ef 1097 /// Tells the receiver to accept messages with any TO address, not just messages
davidr99 0:ab4e012489ef 1098 /// addressed to thisAddress or the broadcast address
davidr99 0:ab4e012489ef 1099 /// \param[in] promiscuous true if you wish to receive messages with any TO address
davidr99 0:ab4e012489ef 1100 virtual void setPromiscuous(bool promiscuous);
davidr99 0:ab4e012489ef 1101
davidr99 0:ab4e012489ef 1102 /// Sets the CRC polynomial to be used to generate the CRC for both receive and transmit
davidr99 0:ab4e012489ef 1103 /// otherwise the default of CRC_16_IBM will be used.
davidr99 0:ab4e012489ef 1104 /// \param[in] polynomial One of RH_RF22::CRCPolynomial choices CRC_*
davidr99 0:ab4e012489ef 1105 /// \return true if polynomial is a valid option for this radio.
davidr99 0:ab4e012489ef 1106 bool setCRCPolynomial(CRCPolynomial polynomial);
davidr99 0:ab4e012489ef 1107
davidr99 0:ab4e012489ef 1108 /// Configures GPIO pins for reversed GPIO connections to the antenna switch.
davidr99 0:ab4e012489ef 1109 /// Normally on RF22 modules, GPIO0(out) is connected to TX_ANT(in) to enable tx antenna during transmit
davidr99 0:ab4e012489ef 1110 /// and GPIO1(out) is connected to RX_ANT(in) to enable rx antenna during receive. The RH_RF22 driver
davidr99 0:ab4e012489ef 1111 /// configures the GPIO pins during init() so the antenna switch works as expected.
davidr99 0:ab4e012489ef 1112 /// However, some RF22 modules, such as HAB-RFM22B-BOA HAB-RFM22B-BO, also Si4432 sold by Dorji.com via Tindie.com
davidr99 0:ab4e012489ef 1113 /// have these GPIO pins reversed, so that GPIO0 is connected to RX_ANT.
davidr99 0:ab4e012489ef 1114 /// Call this function with a true argument after init() and before transmitting
davidr99 0:ab4e012489ef 1115 /// in order to configure the module for reversed GPIO pins.
davidr99 0:ab4e012489ef 1116 /// \param[in] gpioReversed Set to true if your RF22 module has reversed GPIO antenna switch connections.
davidr99 0:ab4e012489ef 1117 void setGpioReversed(bool gpioReversed = false);
davidr99 0:ab4e012489ef 1118
davidr99 0:ab4e012489ef 1119 /// Returns the time in millis since the last preamble was received, and when the last
davidr99 0:ab4e012489ef 1120 /// RSSI measurement was made.
davidr99 0:ab4e012489ef 1121 uint32_t getLastPreambleTime();
davidr99 0:ab4e012489ef 1122
davidr99 0:ab4e012489ef 1123 /// The maximum message length supported by this driver
davidr99 0:ab4e012489ef 1124 /// \return The maximum message length supported by this driver
davidr99 0:ab4e012489ef 1125 uint8_t maxMessageLength();
davidr99 0:ab4e012489ef 1126
davidr99 0:ab4e012489ef 1127 /// Sets the radio into low-power sleep mode.
davidr99 0:ab4e012489ef 1128 /// If successful, the transport will stay in sleep mode until woken by
davidr99 0:ab4e012489ef 1129 /// changing mode it idle, transmit or receive (eg by calling send(), recv(), available() etc)
davidr99 0:ab4e012489ef 1130 /// Caution: there is a time penalty as the radio takes a finite time to wake from sleep mode.
davidr99 0:ab4e012489ef 1131 /// \return true if sleep mode was successfully entered.
davidr99 0:ab4e012489ef 1132 virtual bool sleep();
davidr99 0:ab4e012489ef 1133
davidr99 0:ab4e012489ef 1134 protected:
davidr99 0:ab4e012489ef 1135 /// This is a low level function to handle the interrupts for one instance of RH_RF22.
davidr99 0:ab4e012489ef 1136 /// Called automatically by isr*()
davidr99 0:ab4e012489ef 1137 /// Should not need to be called.
davidr99 0:ab4e012489ef 1138 void handleInterrupt();
davidr99 0:ab4e012489ef 1139
davidr99 0:ab4e012489ef 1140 /// Clears the receiver buffer.
davidr99 0:ab4e012489ef 1141 /// Internal use only
davidr99 0:ab4e012489ef 1142 void clearRxBuf();
davidr99 0:ab4e012489ef 1143
davidr99 0:ab4e012489ef 1144 /// Clears the transmitter buffer
davidr99 0:ab4e012489ef 1145 /// Internal use only
davidr99 0:ab4e012489ef 1146 void clearTxBuf();
davidr99 0:ab4e012489ef 1147
davidr99 0:ab4e012489ef 1148 /// Fills the transmitter buffer with the data of a mesage to be sent
davidr99 0:ab4e012489ef 1149 /// \param[in] data Array of data bytes to be sent (1 to 255)
davidr99 0:ab4e012489ef 1150 /// \param[in] len Number of data bytes in data (> 0)
davidr99 0:ab4e012489ef 1151 /// \return true if the message length is valid
davidr99 0:ab4e012489ef 1152 bool fillTxBuf(const uint8_t* data, uint8_t len);
davidr99 0:ab4e012489ef 1153
davidr99 0:ab4e012489ef 1154 /// Appends the transmitter buffer with the data of a mesage to be sent
davidr99 0:ab4e012489ef 1155 /// \param[in] data Array of data bytes to be sent (0 to 255)
davidr99 0:ab4e012489ef 1156 /// \param[in] len Number of data bytes in data
davidr99 0:ab4e012489ef 1157 /// \return false if the resulting message would exceed RH_RF22_MAX_MESSAGE_LEN, else true
davidr99 0:ab4e012489ef 1158 bool appendTxBuf(const uint8_t* data, uint8_t len);
davidr99 0:ab4e012489ef 1159
davidr99 0:ab4e012489ef 1160 /// Internal function to load the next fragment of
davidr99 0:ab4e012489ef 1161 /// the current message into the transmitter FIFO
davidr99 0:ab4e012489ef 1162 /// Internal use only
davidr99 0:ab4e012489ef 1163 void sendNextFragment();
davidr99 0:ab4e012489ef 1164
davidr99 0:ab4e012489ef 1165 /// function to copy the next fragment from
davidr99 0:ab4e012489ef 1166 /// the receiver FIF) into the receiver buffer
davidr99 0:ab4e012489ef 1167 void readNextFragment();
davidr99 0:ab4e012489ef 1168
davidr99 0:ab4e012489ef 1169 /// Clears the RF22 Rx and Tx FIFOs
davidr99 0:ab4e012489ef 1170 /// Internal use only
davidr99 0:ab4e012489ef 1171 void resetFifos();
davidr99 0:ab4e012489ef 1172
davidr99 0:ab4e012489ef 1173 /// Clears the RF22 Rx FIFO
davidr99 0:ab4e012489ef 1174 /// Internal use only
davidr99 0:ab4e012489ef 1175 void resetRxFifo();
davidr99 0:ab4e012489ef 1176
davidr99 0:ab4e012489ef 1177 /// Clears the RF22 Tx FIFO
davidr99 0:ab4e012489ef 1178 /// Internal use only
davidr99 0:ab4e012489ef 1179 void resetTxFifo();
davidr99 0:ab4e012489ef 1180
davidr99 0:ab4e012489ef 1181 /// This function will be called by handleInterrupt() if an RF22 external interrupt occurs.
davidr99 0:ab4e012489ef 1182 /// This can only happen if external interrupts are enabled in the RF22
davidr99 0:ab4e012489ef 1183 /// (which they are not by default).
davidr99 0:ab4e012489ef 1184 /// Subclasses may override this function to get control when an RF22 external interrupt occurs.
davidr99 0:ab4e012489ef 1185 virtual void handleExternalInterrupt();
davidr99 0:ab4e012489ef 1186
davidr99 0:ab4e012489ef 1187 /// This function will be called by handleInterrupt() if an RF22 wakeup timer interrupt occurs.
davidr99 0:ab4e012489ef 1188 /// This can only happen if wakeup timer interrupts are enabled in theRF22
davidr99 0:ab4e012489ef 1189 /// (which they are not by default).
davidr99 0:ab4e012489ef 1190 /// Subclasses may override this function to get control when an RF22 wakeup timer interrupt occurs.
davidr99 0:ab4e012489ef 1191 virtual void handleWakeupTimerInterrupt();
davidr99 0:ab4e012489ef 1192
davidr99 0:ab4e012489ef 1193 /// Start the transmission of the contents
davidr99 0:ab4e012489ef 1194 /// of the Tx buffer
davidr99 0:ab4e012489ef 1195 void startTransmit();
davidr99 0:ab4e012489ef 1196
davidr99 0:ab4e012489ef 1197 /// ReStart the transmission of the contents
davidr99 0:ab4e012489ef 1198 /// of the Tx buffer after a atransmission failure
davidr99 0:ab4e012489ef 1199 void restartTransmit();
davidr99 0:ab4e012489ef 1200
davidr99 0:ab4e012489ef 1201 void setThisAddress(uint8_t thisAddress);
davidr99 0:ab4e012489ef 1202
davidr99 0:ab4e012489ef 1203 /// Sets the radio operating mode for the case when the driver is idle (ie not
davidr99 0:ab4e012489ef 1204 /// transmitting or receiving), allowing you to control the idle mode power requirements
davidr99 0:ab4e012489ef 1205 /// at the expense of slower transitions to transmit and receive modes.
davidr99 0:ab4e012489ef 1206 /// By default, the idle mode is RH_RF22_XTON,
davidr99 0:ab4e012489ef 1207 /// but eg setIdleMode(RH_RF22_PLL) will provide a much lower
davidr99 0:ab4e012489ef 1208 /// idle current but slower transitions. Call this function after init().
davidr99 0:ab4e012489ef 1209 /// \param[in] idleMode The chip operating mode to use when the driver is idle. One of the valid definitions for RH_RF22_REG_07_OPERATING_MODE
davidr99 0:ab4e012489ef 1210 void setIdleMode(uint8_t idleMode);
davidr99 0:ab4e012489ef 1211
davidr99 0:ab4e012489ef 1212 protected:
davidr99 0:ab4e012489ef 1213 /// Low level interrupt service routine for RF22 connected to interrupt 0
davidr99 0:ab4e012489ef 1214 static void isr0();
davidr99 0:ab4e012489ef 1215
davidr99 0:ab4e012489ef 1216 /// Low level interrupt service routine for RF22 connected to interrupt 1
davidr99 0:ab4e012489ef 1217 static void isr1();
davidr99 0:ab4e012489ef 1218
davidr99 0:ab4e012489ef 1219 /// Low level interrupt service routine for RF22 connected to interrupt 1
davidr99 0:ab4e012489ef 1220 static void isr2();
davidr99 0:ab4e012489ef 1221
davidr99 0:ab4e012489ef 1222 /// Array of instances connected to interrupts 0 and 1
davidr99 0:ab4e012489ef 1223 static RH_RF22* _deviceForInterrupt[];
davidr99 0:ab4e012489ef 1224
davidr99 0:ab4e012489ef 1225 /// Index of next interrupt number to use in _deviceForInterrupt
davidr99 0:ab4e012489ef 1226 static uint8_t _interruptCount;
davidr99 0:ab4e012489ef 1227
davidr99 0:ab4e012489ef 1228 #if (RH_PLATFORM == RH_PLATFORM_MBED)
davidr99 0:ab4e012489ef 1229 /// The configured interrupt pin connected to this instance
davidr99 0:ab4e012489ef 1230 InterruptIn _interruptPin;
davidr99 0:ab4e012489ef 1231 #else
davidr99 0:ab4e012489ef 1232 /// The configured interrupt pin connected to this instance
davidr99 0:ab4e012489ef 1233 uint8_t _interruptPin;
davidr99 0:ab4e012489ef 1234 #endif
davidr99 0:ab4e012489ef 1235
davidr99 0:ab4e012489ef 1236 /// The index into _deviceForInterrupt[] for this device (if an interrupt is already allocated)
davidr99 0:ab4e012489ef 1237 /// else 0xff
davidr99 0:ab4e012489ef 1238 uint8_t _myInterruptIndex;
davidr99 0:ab4e012489ef 1239
davidr99 0:ab4e012489ef 1240 /// The radio mode to use when mode is idle
davidr99 0:ab4e012489ef 1241 uint8_t _idleMode;
davidr99 0:ab4e012489ef 1242
davidr99 0:ab4e012489ef 1243 /// The device type reported by the RF22
davidr99 0:ab4e012489ef 1244 uint8_t _deviceType;
davidr99 0:ab4e012489ef 1245
davidr99 0:ab4e012489ef 1246 /// The selected CRC polynomial
davidr99 0:ab4e012489ef 1247 CRCPolynomial _polynomial;
davidr99 0:ab4e012489ef 1248
davidr99 0:ab4e012489ef 1249 // These volatile members may get changed in the interrupt service routine
davidr99 0:ab4e012489ef 1250 /// Number of octets in the receiver buffer
davidr99 0:ab4e012489ef 1251 volatile uint8_t _bufLen;
davidr99 0:ab4e012489ef 1252
davidr99 0:ab4e012489ef 1253 /// The receiver buffer
davidr99 0:ab4e012489ef 1254 uint8_t _buf[RH_RF22_MAX_MESSAGE_LEN];
davidr99 0:ab4e012489ef 1255
davidr99 0:ab4e012489ef 1256 /// True when there is a valid message in the Rx buffer
davidr99 0:ab4e012489ef 1257 volatile bool _rxBufValid;
davidr99 0:ab4e012489ef 1258
davidr99 0:ab4e012489ef 1259 /// Index into TX buffer of the next to send chunk
davidr99 0:ab4e012489ef 1260 volatile uint8_t _txBufSentIndex;
davidr99 0:ab4e012489ef 1261
davidr99 0:ab4e012489ef 1262 /// Time in millis since the last preamble was received (and the last time the RSSI was measured)
davidr99 0:ab4e012489ef 1263 uint32_t _lastPreambleTime;
davidr99 0:ab4e012489ef 1264 };
davidr99 0:ab4e012489ef 1265
davidr99 0:ab4e012489ef 1266 /// @example rf22_client.pde
davidr99 0:ab4e012489ef 1267 /// @example rf22_server.pde
davidr99 0:ab4e012489ef 1268
davidr99 0:ab4e012489ef 1269 #endif