Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of RadioHead-148 by
RH_RF24.h
00001 // RH_RF24.h 00002 // Author: Mike McCauley (mikem@airspayce.com) 00003 // Copyright (C) 2014 Mike McCauley 00004 // $Id: RH_RF24.h,v 1.13 2015/08/13 02:45:47 mikem Exp $ 00005 // 00006 // Supports RF24/RF26 and RFM24/RFM26 modules in FIFO mode 00007 // also Si4464/63/62/61/60-A1 00008 // Si4063 is the same but Tx only 00009 // 00010 // Per http://www.hoperf.cn/upload/rf/RFM24.pdf 00011 // and http://www.hoperf.cn/upload/rf/RFM26.pdf 00012 // Sigh: the HopeRF documentation is utter rubbish: full of errors and incomplete. The Si446x docs are better: 00013 // http://www.silabs.com/Support%20Documents/TechnicalDocs/Si4464-63-61-60.pdf 00014 // http://www.silabs.com/Support%20Documents/TechnicalDocs/AN626.pdf 00015 // http://www.silabs.com/Support%20Documents/TechnicalDocs/AN627.pdf 00016 // http://www.silabs.com/Support%20Documents/TechnicalDocs/AN647.pdf 00017 // http://www.silabs.com/Support%20Documents/TechnicalDocs/AN633.pdf 00018 // http://www.silabs.com/Support%20Documents/TechnicalDocs/AN736.pdf 00019 // http://nicerf.com/manage/upfile/indexbanner/635231050196868750.pdf (API description) 00020 // http://www.silabs.com/Support%20Documents/Software/Si446x%20RX_HOP%20PLL%20Calculator.xlsx 00021 #ifndef RH_RF24_h 00022 #define RH_RF24_h 00023 00024 #include <RHGenericSPI.h> 00025 #include <RHSPIDriver.h> 00026 00027 // This is the maximum number of interrupts the driver can support 00028 // Most Arduinos can handle 2, Megas can handle more 00029 #define RH_RF24_NUM_INTERRUPTS 3 00030 00031 // Maximum payload length the RF24 can support, limited by our 1 octet message length 00032 #define RH_RF24_MAX_PAYLOAD_LEN 255 00033 00034 // The length of the headers we add. 00035 // The headers are inside the RF24's payload 00036 #define RH_RF24_HEADER_LEN 4 00037 00038 // This is the maximum message length that can be supported by this driver. 00039 // Can be pre-defined to a smaller size (to save SRAM) prior to including this header 00040 // Here we allow for message length 4 bytes of address and header and payload to be included in payload size limit. 00041 #ifndef RH_RF24_MAX_MESSAGE_LEN 00042 #define RH_RF24_MAX_MESSAGE_LEN (RH_RF24_MAX_PAYLOAD_LEN - RH_RF24_HEADER_LEN - 1) 00043 #endif 00044 00045 // Max number of times we will try to read CTS from the radio 00046 #define RH_RF24_CTS_RETRIES 2500 00047 00048 // RF24/RF26 API commands from table 10 00049 // also Si446X API DESCRIPTIONS table 1 00050 #define RH_RF24_CMD_NOP 0x00 00051 #define RH_RF24_CMD_PART_INFO 0x01 00052 #define RH_RF24_CMD_POWER_UP 0x02 00053 #define RH_RF24_CMD_PATCH_IMAGE 0x04 00054 #define RH_RF24_CMD_FUNC_INFO 0x10 00055 #define RH_RF24_CMD_SET_PROPERTY 0x11 00056 #define RH_RF24_CMD_GET_PROPERTY 0x12 00057 #define RH_RF24_CMD_GPIO_PIN_CFG 0x13 00058 #define RH_RF24_CMD_GET_ADC_READING 0x14 00059 #define RH_RF24_CMD_FIFO_INFO 0x15 00060 #define RH_RF24_CMD_PACKET_INFO 0x16 00061 #define RH_RF24_CMD_IRCAL 0x17 00062 #define RH_RF24_CMD_PROTOCOL_CFG 0x18 00063 #define RH_RF24_CMD_GET_INT_STATUS 0x20 00064 #define RH_RF24_CMD_GET_PH_STATUS 0x21 00065 #define RH_RF24_CMD_GET_MODEM_STATUS 0x22 00066 #define RH_RF24_CMD_GET_CHIP_STATUS 0x23 00067 #define RH_RF24_CMD_START_TX 0x31 00068 #define RH_RF24_CMD_START_RX 0x32 00069 #define RH_RF24_CMD_REQUEST_DEVICE_STATE 0x33 00070 #define RH_RF24_CMD_CHANGE_STATE 0x34 00071 #define RH_RF24_CMD_RX_HOP 0x36 00072 #define RH_RF24_CMD_READ_BUF 0x44 00073 #define RH_RF24_CMD_FAST_RESPONSE_A 0x50 00074 #define RH_RF24_CMD_FAST_RESPONSE_B 0x51 00075 #define RH_RF24_CMD_FAST_RESPONSE_C 0x53 00076 #define RH_RF24_CMD_FAST_RESPONSE_D 0x57 00077 #define RH_RF24_CMD_TX_FIFO_WRITE 0x66 00078 #define RH_RF24_CMD_RX_FIFO_READ 0x77 00079 00080 // The Clear To Send signal from the radio 00081 #define RH_RF24_REPLY_CTS 0xff 00082 00083 //#define RH_RF24_CMD_START_TX 0x31 00084 #define RH_RF24_CONDITION_TX_COMPLETE_STATE 0xf0 00085 #define RH_RF24_CONDITION_RETRANSMIT_NO 0x00 00086 #define RH_RF24_CONDITION_RETRANSMIT_YES 0x04 00087 #define RH_RF24_CONDITION_START_IMMEDIATE 0x00 00088 #define RH_RF24_CONDITION_START_AFTER_WUT 0x01 00089 00090 //#define RH_RF24_CMD_START_RX 0x32 00091 #define RH_RF24_CONDITION_RX_START_IMMEDIATE 0x00 00092 00093 //#define RH_RF24_CMD_REQUEST_DEVICE_STATE 0x33 00094 #define RH_RF24_DEVICE_STATE_NO_CHANGE 0x00 00095 #define RH_RF24_DEVICE_STATE_SLEEP 0x01 00096 #define RH_RF24_DEVICE_STATE_SPI_ACTIVE 0x02 00097 #define RH_RF24_DEVICE_STATE_READY 0x03 00098 #define RH_RF24_DEVICE_STATE_ALSO_READY 0x04 00099 #define RH_RF24_DEVICE_STATE_TUNE_TX 0x05 00100 #define RH_RF24_DEVICE_STATE_TUNE_RX 0x06 00101 #define RH_RF24_DEVICE_STATE_TX 0x07 00102 #define RH_RF24_DEVICE_STATE_RX 0x08 00103 00104 // Properties for API Description AN625 Section 2.2 00105 #define RH_RF24_PROPERTY_GLOBAL_XO_TUNE 0x0000 00106 #define RH_RF24_PROPERTY_GLOBAL_CLK_CFG 0x0001 00107 #define RH_RF24_PROPERTY_GLOBAL_LOW_BATT_THRESH 0x0002 00108 #define RH_RF24_PROPERTY_GLOBAL_CONFIG 0x0003 00109 #define RH_RF24_PROPERTY_GLOBAL_WUT_CONFIG 0x0004 00110 #define RH_RF24_PROPERTY_GLOBAL_WUT_M_15_8 0x0005 00111 #define RH_RF24_PROPERTY_GLOBAL_WUT_M_7_0 0x0006 00112 #define RH_RF24_PROPERTY_GLOBAL_WUT_R 0x0007 00113 #define RH_RF24_PROPERTY_GLOBAL_WUT_LDC 0x0008 00114 #define RH_RF24_PROPERTY_INT_CTL_ENABLE 0x0100 00115 #define RH_RF24_PROPERTY_INT_CTL_PH_ENABLE 0x0101 00116 #define RH_RF24_PROPERTY_INT_CTL_MODEM_ENABLE 0x0102 00117 #define RH_RF24_PROPERTY_INT_CTL_CHIP_ENABLE 0x0103 00118 #define RH_RF24_PROPERTY_FRR_CTL_A_MODE 0x0200 00119 #define RH_RF24_PROPERTY_FRR_CTL_B_MODE 0x0201 00120 #define RH_RF24_PROPERTY_FRR_CTL_C_MODE 0x0202 00121 #define RH_RF24_PROPERTY_FRR_CTL_D_MODE 0x0203 00122 #define RH_RF24_PROPERTY_PREAMBLE_TX_LENGTH 0x1000 00123 #define RH_RF24_PROPERTY_PREAMBLE_CONFIG_STD_1 0x1001 00124 #define RH_RF24_PROPERTY_PREAMBLE_CONFIG_NSTD 0x1002 00125 #define RH_RF24_PROPERTY_PREAMBLE_CONFIG_STD_2 0x1003 00126 #define RH_RF24_PROPERTY_PREAMBLE_CONFIG 0x1004 00127 #define RH_RF24_PROPERTY_PREAMBLE_PATTERN_31_24 0x1005 00128 #define RH_RF24_PROPERTY_PREAMBLE_PATTERN_23_16 0x1006 00129 #define RH_RF24_PROPERTY_PREAMBLE_PATTERN_15_8 0x1007 00130 #define RH_RF24_PROPERTY_PREAMBLE_PATTERN_7_0 0x1008 00131 #define RH_RF24_PROPERTY_SYNC_CONFIG 0x1100 00132 #define RH_RF24_PROPERTY_SYNC_BITS_31_24 0x1101 00133 #define RH_RF24_PROPERTY_SYNC_BITS_23_16 0x1102 00134 #define RH_RF24_PROPERTY_SYNC_BITS_15_8 0x1103 00135 #define RH_RF24_PROPERTY_SYNC_BITS_7_0 0x1104 00136 #define RH_RF24_PROPERTY_PKT_CRC_CONFIG 0x1200 00137 #define RH_RF24_PROPERTY_PKT_CONFIG1 0x1206 00138 #define RH_RF24_PROPERTY_PKT_LEN 0x1208 00139 #define RH_RF24_PROPERTY_PKT_LEN_FIELD_SOURCE 0x1209 00140 #define RH_RF24_PROPERTY_PKT_LEN_ADJUST 0x120a 00141 #define RH_RF24_PROPERTY_PKT_TX_THRESHOLD 0x120b 00142 #define RH_RF24_PROPERTY_PKT_RX_THRESHOLD 0x120c 00143 #define RH_RF24_PROPERTY_PKT_FIELD_1_LENGTH_12_8 0x120d 00144 #define RH_RF24_PROPERTY_PKT_FIELD_1_LENGTH_7_0 0x120e 00145 #define RH_RF24_PROPERTY_PKT_FIELD_1_CONFIG 0x120f 00146 #define RH_RF24_PROPERTY_PKT_FIELD_1_CRC_CONFIG 0x1210 00147 #define RH_RF24_PROPERTY_PKT_FIELD_2_LENGTH_12_8 0x1211 00148 #define RH_RF24_PROPERTY_PKT_FIELD_2_LENGTH_7_0 0x1212 00149 #define RH_RF24_PROPERTY_PKT_FIELD_2_CONFIG 0x1213 00150 #define RH_RF24_PROPERTY_PKT_FIELD_2_CRC_CONFIG 0x1214 00151 #define RH_RF24_PROPERTY_PKT_FIELD_3_LENGTH_12_8 0x1215 00152 #define RH_RF24_PROPERTY_PKT_FIELD_3_LENGTH_7_0 0x1216 00153 #define RH_RF24_PROPERTY_PKT_FIELD_3_CONFIG 0x1217 00154 #define RH_RF24_PROPERTY_PKT_FIELD_3_CRC_CONFIG 0x1218 00155 #define RH_RF24_PROPERTY_PKT_FIELD_4_LENGTH_12_8 0x1219 00156 #define RH_RF24_PROPERTY_PKT_FIELD_4_LENGTH_7_0 0x121a 00157 #define RH_RF24_PROPERTY_PKT_FIELD_4_CONFIG 0x121b 00158 #define RH_RF24_PROPERTY_PKT_FIELD_4_CRC_CONFIG 0x121c 00159 #define RH_RF24_PROPERTY_PKT_FIELD_5_LENGTH_12_8 0x121d 00160 #define RH_RF24_PROPERTY_PKT_FIELD_5_LENGTH_7_0 0x121e 00161 #define RH_RF24_PROPERTY_PKT_FIELD_5_CONFIG 0x121f 00162 #define RH_RF24_PROPERTY_PKT_FIELD_5_CRC_CONFIG 0x1220 00163 #define RH_RF24_PROPERTY_PKT_RX_FIELD_1_LENGTH_12_8 0x1221 00164 #define RH_RF24_PROPERTY_PKT_RX_FIELD_1_LENGTH_7_0 0x1222 00165 #define RH_RF24_PROPERTY_PKT_RX_FIELD_1_CONFIG 0x1223 00166 #define RH_RF24_PROPERTY_PKT_RX_FIELD_1_CRC_CONFIG 0x1224 00167 #define RH_RF24_PROPERTY_PKT_RX_FIELD_2_LENGTH_12_8 0x1225 00168 #define RH_RF24_PROPERTY_PKT_RX_FIELD_2_LENGTH_7_0 0x1226 00169 #define RH_RF24_PROPERTY_PKT_RX_FIELD_2_CONFIG 0x1227 00170 #define RH_RF24_PROPERTY_PKT_RX_FIELD_2_CRC_CONFIG 0x1228 00171 #define RH_RF24_PROPERTY_PKT_RX_FIELD_3_LENGTH_12_8 0x1229 00172 #define RH_RF24_PROPERTY_PKT_RX_FIELD_3_LENGTH_7_0 0x122a 00173 #define RH_RF24_PROPERTY_PKT_RX_FIELD_3_CONFIG 0x122b 00174 #define RH_RF24_PROPERTY_PKT_RX_FIELD_3_CRC_CONFIG 0x122c 00175 #define RH_RF24_PROPERTY_PKT_RX_FIELD_4_LENGTH_12_8 0x122d 00176 #define RH_RF24_PROPERTY_PKT_RX_FIELD_4_LENGTH_7_0 0x122e 00177 #define RH_RF24_PROPERTY_PKT_RX_FIELD_4_CONFIG 0x122f 00178 #define RH_RF24_PROPERTY_PKT_RX_FIELD_4_CRC_CONFIG 0x1230 00179 #define RH_RF24_PROPERTY_PKT_RX_FIELD_5_LENGTH_12_8 0x1231 00180 #define RH_RF24_PROPERTY_PKT_RX_FIELD_5_LENGTH_7_0 0x1232 00181 #define RH_RF24_PROPERTY_PKT_RX_FIELD_5_CONFIG 0x1233 00182 #define RH_RF24_PROPERTY_PKT_RX_FIELD_5_CRC_CONFIG 0x1234 00183 #define RH_RF24_PROPERTY_MODEM_MOD_TYPE 0x2000 00184 #define RH_RF24_PROPERTY_MODEM_MAP_CONTROL 0x2001 00185 #define RH_RF24_PROPERTY_MODEM_DSM_CTRL 0x2002 00186 #define RH_RF24_PROPERTY_MODEM_DATA_RATE_2 0x2003 00187 #define RH_RF24_PROPERTY_MODEM_DATA_RATE_1 0x2004 00188 #define RH_RF24_PROPERTY_MODEM_DATA_RATE_0 0x2005 00189 #define RH_RF24_PROPERTY_MODEM_TX_NCO_MODE_3 0x2006 00190 #define RH_RF24_PROPERTY_MODEM_TX_NCO_MODE_2 0x2007 00191 #define RH_RF24_PROPERTY_MODEM_TX_NCO_MODE_1 0x2008 00192 #define RH_RF24_PROPERTY_MODEM_TX_NCO_MODE_0 0x2009 00193 #define RH_RF24_PROPERTY_MODEM_FREQ_DEV_2 0x200a 00194 #define RH_RF24_PROPERTY_MODEM_FREQ_DEV_1 0x200b 00195 #define RH_RF24_PROPERTY_MODEM_FREQ_DEV_0 0x200c 00196 #define RH_RF24_PROPERTY_MODEM_TX_RAMP_DELAY 0x2018 00197 #define RH_RF24_PROPERTY_MODEM_MDM_CTRL 0x2019 00198 #define RH_RF24_PROPERTY_MODEM_IF_CONTROL 0x201a 00199 #define RH_RF24_PROPERTY_MODEM_IF_FREQ_2 0x201b 00200 #define RH_RF24_PROPERTY_MODEM_IF_FREQ_1 0x201c 00201 #define RH_RF24_PROPERTY_MODEM_IF_FREQ_0 0x201d 00202 #define RH_RF24_PROPERTY_MODEM_DECIMATION_CFG1 0x201e 00203 #define RH_RF24_PROPERTY_MODEM_DECIMATION_CFG0 0x201f 00204 #define RH_RF24_PROPERTY_MODEM_BCR_OSR_1 0x2022 00205 #define RH_RF24_PROPERTY_MODEM_BCR_OSR_0 0x2023 00206 #define RH_RF24_PROPERTY_MODEM_BCR_NCO_OFFSET_2 0x2024 00207 #define RH_RF24_PROPERTY_MODEM_BCR_NCO_OFFSET_1 0x2025 00208 #define RH_RF24_PROPERTY_MODEM_BCR_NCO_OFFSET_0 0x2026 00209 #define RH_RF24_PROPERTY_MODEM_BCR_GAIN_1 0x2027 00210 #define RH_RF24_PROPERTY_MODEM_BCR_GAIN_0 0x2028 00211 #define RH_RF24_PROPERTY_MODEM_BCR_GEAR 0x2029 00212 #define RH_RF24_PROPERTY_MODEM_BCR_MISC1 0x202a 00213 #define RH_RF24_PROPERTY_MODEM_AFC_GEAR 0x202c 00214 #define RH_RF24_PROPERTY_MODEM_AFC_WAIT 0x202d 00215 #define RH_RF24_PROPERTY_MODEM_AFC_GAIN_1 0x202e 00216 #define RH_RF24_PROPERTY_MODEM_AFC_GAIN_0 0x202f 00217 #define RH_RF24_PROPERTY_MODEM_AFC_LIMITER_1 0x2030 00218 #define RH_RF24_PROPERTY_MODEM_AFC_LIMITER_0 0x2031 00219 #define RH_RF24_PROPERTY_MODEM_AFC_MISC 0x2032 00220 #define RH_RF24_PROPERTY_MODEM_AGC_CONTROL 0x2035 00221 #define RH_RF24_PROPERTY_MODEM_AGC_WINDOW_SIZE 0x2038 00222 #define RH_RF24_PROPERTY_MODEM_AGC_RFPD_DECAY 0x2039 00223 #define RH_RF24_PROPERTY_MODEM_AGC_IFPD_DECAY 0x203a 00224 #define RH_RF24_PROPERTY_MODEM_FSK4_GAIN1 0x203b 00225 #define RH_RF24_PROPERTY_MODEM_FSK4_GAIN0 0x203c 00226 #define RH_RF24_PROPERTY_MODEM_FSK4_TH1 0x203d 00227 #define RH_RF24_PROPERTY_MODEM_FSK4_TH0 0x203e 00228 #define RH_RF24_PROPERTY_MODEM_FSK4_MAP 0x203f 00229 #define RH_RF24_PROPERTY_MODEM_OOK_PDTC 0x2040 00230 #define RH_RF24_PROPERTY_MODEM_OOK_CNT1 0x2042 00231 #define RH_RF24_PROPERTY_MODEM_OOK_MISC 0x2043 00232 #define RH_RF24_PROPERTY_MODEM_RAW_SEARCH 0x2044 00233 #define RH_RF24_PROPERTY_MODEM_RAW_CONTROL 0x2045 00234 #define RH_RF24_PROPERTY_MODEM_RAW_EYE_1 0x2046 00235 #define RH_RF24_PROPERTY_MODEM_RAW_EYE_0 0x2047 00236 #define RH_RF24_PROPERTY_MODEM_ANT_DIV_MODE 0x2048 00237 #define RH_RF24_PROPERTY_MODEM_ANT_DIV_CONTROL 0x2049 00238 #define RH_RF24_PROPERTY_MODEM_RSSI_THRESH 0x204a 00239 #define RH_RF24_PROPERTY_MODEM_RSSI_JUMP_THRESH 0x204b 00240 #define RH_RF24_PROPERTY_MODEM_RSSI_CONTROL 0x204c 00241 #define RH_RF24_PROPERTY_MODEM_RSSI_CONTROL2 0x204d 00242 #define RH_RF24_PROPERTY_MODEM_RSSI_COMP 0x204e 00243 #define RH_RF24_PROPERTY_MODEM_ANT_DIV_CONT 0x2049 00244 #define RH_RF24_PROPERTY_MODEM_CLKGEN_BAND 0x2051 00245 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE13_7_0 0x2100 00246 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE12_7_0 0x2101 00247 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE11_7_0 0x2102 00248 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE10_7_0 0x2103 00249 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE9_7_0 0x2104 00250 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE8_7_0 0x2105 00251 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE7_7_0 0x2106 00252 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE6_7_0 0x2107 00253 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE5_7_0 0x2108 00254 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE4_7_0 0x2109 00255 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE3_7_0 0x210a 00256 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE2_7_0 0x210b 00257 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE1_7_0 0x210c 00258 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE0_7_0 0x210d 00259 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COEM0 0x210e 00260 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COEM1 0x210f 00261 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COEM2 0x2110 00262 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COEM3 0x2111 00263 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE13_7_0 0x2112 00264 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE12_7_0 0x2113 00265 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE11_7_0 0x2114 00266 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE10_7_0 0x2115 00267 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE9_7_0 0x2116 00268 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE8_7_0 0x2117 00269 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE7_7_0 0x2118 00270 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE6_7_0 0x2119 00271 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE5_7_0 0x211a 00272 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE4_7_0 0x211b 00273 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE3_7_0 0x211c 00274 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE2_7_0 0x211d 00275 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE1_7_0 0x211e 00276 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE0_7_0 0x211f 00277 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COEM0 0x2120 00278 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COEM1 0x2121 00279 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COEM2 0x2122 00280 #define RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COEM3 0x2123 00281 #define RH_RF24_PROPERTY_PA_MODE 0x2200 00282 #define RH_RF24_PROPERTY_PA_PWR_LVL 0x2201 00283 #define RH_RF24_PROPERTY_PA_BIAS_CLKDUTY 0x2202 00284 #define RH_RF24_PROPERTY_PA_TC 0x2203 00285 #define RH_RF24_PROPERTY_SYNTH_PFDCP_CPFF 0x2300 00286 #define RH_RF24_PROPERTY_SYNTH_PFDCP_CPINT 0x2301 00287 #define RH_RF24_PROPERTY_SYNTH_VCO_KV 0x2302 00288 #define RH_RF24_PROPERTY_SYNTH_LPFILT3 0x2303 00289 #define RH_RF24_PROPERTY_SYNTH_LPFILT2 0x2304 00290 #define RH_RF24_PROPERTY_SYNTH_LPFILT1 0x2305 00291 #define RH_RF24_PROPERTY_SYNTH_LPFILT0 0x2306 00292 #define RH_RF24_PROPERTY_MATCH_VALUE_1 0x3000 00293 #define RH_RF24_PROPERTY_MATCH_MASK_1 0x3001 00294 #define RH_RF24_PROPERTY_MATCH_CTRL_1 0x3002 00295 #define RH_RF24_PROPERTY_MATCH_VALUE_2 0x3003 00296 #define RH_RF24_PROPERTY_MATCH_MASK_2 0x3004 00297 #define RH_RF24_PROPERTY_MATCH_CTRL_2 0x3005 00298 #define RH_RF24_PROPERTY_MATCH_VALUE_3 0x3006 00299 #define RH_RF24_PROPERTY_MATCH_MASK_3 0x3007 00300 #define RH_RF24_PROPERTY_MATCH_CTRL_3 0x3008 00301 #define RH_RF24_PROPERTY_MATCH_VALUE_4 0x3009 00302 #define RH_RF24_PROPERTY_MATCH_MASK_4 0x300a 00303 #define RH_RF24_PROPERTY_MATCH_CTRL_4 0x300b 00304 #define RH_RF24_PROPERTY_FREQ_CONTROL_INTE 0x4000 00305 #define RH_RF24_PROPERTY_FREQ_CONTROL_FRAC_2 0x4001 00306 #define RH_RF24_PROPERTY_FREQ_CONTROL_FRAC_1 0x4002 00307 #define RH_RF24_PROPERTY_FREQ_CONTROL_FRAC_0 0x4003 00308 #define RH_RF24_PROPERTY_FREQ_CONTROL_CHANNEL_STEP_SIZE_1 0x4004 00309 #define RH_RF24_PROPERTY_FREQ_CONTROL_CHANNEL_STEP_SIZE_0 0x4005 00310 #define RH_RF24_PROPERTY_FREQ_CONTROL_VCOCNT_RX_ADJ 0x4007 00311 #define RH_RF24_PROPERTY_RX_HOP_CONTROL 0x5000 00312 #define RH_RF24_PROPERTY_RX_HOP_TABLE_SIZE 0x5001 00313 #define RH_RF24_PROPERTY_RX_HOP_TABLE_ENTRY_0 0x5002 00314 00315 //#define RH_RF24_CMD_GPIO_PIN_CFG 0x13 00316 #define RH_RF24_GPIO_NO_CHANGE 0 00317 #define RH_RF24_GPIO_DISABLED 1 00318 #define RH_RF24_GPIO_LOW 2 00319 #define RH_RF24_GPIO_HIGH 3 00320 #define RH_RF24_GPIO_INPUT 4 00321 #define RH_RF24_GPIO_32_KHZ_CLOCK 5 00322 #define RH_RF24_GPIO_BOOT_CLOCK 6 00323 #define RH_RF24_GPIO_DIVIDED_MCU_CLOCK 7 00324 #define RH_RF24_GPIO_CTS 8 00325 #define RH_RF24_GPIO_INV_CTS 9 00326 #define RH_RF24_GPIO_HIGH_ON_CMD_OVERLAP 10 00327 #define RH_RF24_GPIO_SPI_DATA_OUT 11 00328 #define RH_RF24_GPIO_HIGH_AFTER_RESET 12 00329 #define RH_RF24_GPIO_HIGH_AFTER_CALIBRATION 13 00330 #define RH_RF24_GPIO_HIGH_AFTER_WUT 14 00331 #define RH_RF24_GPIO_UNUSED_0 15 00332 #define RH_RF24_GPIO_TX_DATA_CLOCK 16 00333 #define RH_RF24_GPIO_RX_DATA_CLOCK 17 00334 #define RH_RF24_GPIO_UNUSED_1 18 00335 #define RH_RF24_GPIO_TX_DATA 19 00336 #define RH_RF24_GPIO_RX_DATA 20 00337 #define RH_RF24_GPIO_RX_RAW_DATA 21 00338 #define RH_RF24_GPIO_ANTENNA_1_SWITCH 22 00339 #define RH_RF24_GPIO_ANTENNA_2_SWITCH 23 00340 #define RH_RF24_GPIO_VALID_PREAMBLE 24 00341 #define RH_RF24_GPIO_INVALID_PREAMBLE 25 00342 #define RH_RF24_GPIO_SYNC_DETECTED 26 00343 #define RH_RF24_GPIO_RSSI_ABOVE_CAT 27 00344 #define RH_RF24_GPIO_TX_STATE 32 00345 #define RH_RF24_GPIO_RX_STATE 33 00346 #define RH_RF24_GPIO_RX_FIFO_ALMOST_FULL 34 00347 #define RH_RF24_GPIO_TX_FIFO_ALMOST_EMPTY 35 00348 #define RH_RF24_GPIO_BATT_LOW 36 00349 #define RH_RF24_GPIO_RSSI_ABOVE_CAT_LOW 37 00350 #define RH_RF24_GPIO_HOP 38 00351 #define RH_RF24_GPIO_HOP_TABLE_WRAPPED 39 00352 00353 // #define RH_RF24_CMD_GET_INT_STATUS 0x20 00354 #define RH_RF24_INT_STATUS_CHIP_INT_STATUS 0x04 00355 #define RH_RF24_INT_STATUS_MODEM_INT_STATUS 0x02 00356 #define RH_RF24_INT_STATUS_PH_INT_STATUS 0x01 00357 #define RH_RF24_INT_STATUS_FILTER_MATCH 0x80 00358 #define RH_RF24_INT_STATUS_FILTER_MISS 0x40 00359 #define RH_RF24_INT_STATUS_PACKET_SENT 0x20 00360 #define RH_RF24_INT_STATUS_PACKET_RX 0x10 00361 #define RH_RF24_INT_STATUS_CRC_ERROR 0x08 00362 #define RH_RF24_INT_STATUS_TX_FIFO_ALMOST_EMPTY 0x02 00363 #define RH_RF24_INT_STATUS_RX_FIFO_ALMOST_FULL 0x01 00364 #define RH_RF24_INT_STATUS_INVALID_SYNC 0x20 00365 #define RH_RF24_INT_STATUS_RSSI_JUMP 0x10 00366 #define RH_RF24_INT_STATUS_RSSI 0x08 00367 #define RH_RF24_INT_STATUS_INVALID_PREAMBLE 0x04 00368 #define RH_RF24_INT_STATUS_PREAMBLE_DETECT 0x02 00369 #define RH_RF24_INT_STATUS_SYNC_DETECT 0x01 00370 #define RH_RF24_INT_STATUS_CAL 0x40 00371 #define RH_RF24_INT_STATUS_FIFO_UNDERFLOW_OVERFLOW_ERROR 0x20 00372 #define RH_RF24_INT_STATUS_STATE_CHANGE 0x10 00373 #define RH_RF24_INT_STATUS_CMD_ERROR 0x08 00374 #define RH_RF24_INT_STATUS_CHIP_READY 0x04 00375 #define RH_RF24_INT_STATUS_LOW_BATT 0x02 00376 #define RH_RF24_INT_STATUS_WUT 0x01 00377 00378 //#define RH_RF24_PROPERTY_FRR_CTL_A_MODE 0x0200 00379 //#define RH_RF24_PROPERTY_FRR_CTL_B_MODE 0x0201 00380 //#define RH_RF24_PROPERTY_FRR_CTL_C_MODE 0x0202 00381 //#define RH_RF24_PROPERTY_FRR_CTL_D_MODE 0x0203 00382 #define RH_RF24_FRR_MODE_DISABLED 0 00383 #define RH_RF24_FRR_MODE_GLOBAL_STATUS 1 00384 #define RH_RF24_FRR_MODE_GLOBAL_INTERRUPT_PENDING 2 00385 #define RH_RF24_FRR_MODE_PACKET_HANDLER_STATUS 3 00386 #define RH_RF24_FRR_MODE_PACKET_HANDLER_INTERRUPT_PENDING 4 00387 #define RH_RF24_FRR_MODE_MODEM_STATUS 5 00388 #define RH_RF24_FRR_MODE_MODEM_INTERRUPT_PENDING 6 00389 #define RH_RF24_FRR_MODE_CHIP_STATUS 7 00390 #define RH_RF24_FRR_MODE_CHIP_INTERRUPT_PENDING 8 00391 #define RH_RF24_FRR_MODE_CURRENT_STATE 9 00392 #define RH_RF24_FRR_MODE_LATCHED_RSSI 10 00393 00394 //#define RH_RF24_PROPERTY_INT_CTL_ENABLE 0x0100 00395 #define RH_RF24_CHIP_INT_STATUS_EN 0x04 00396 #define RH_RF24_MODEM_INT_STATUS_EN 0x02 00397 #define RH_RF24_PH_INT_STATUS_EN 0x01 00398 00399 //#define RH_RF24_PROPERTY_PREAMBLE_CONFIG 0x1004 00400 #define RH_RF24_PREAMBLE_FIRST_1 0x20 00401 #define RH_RF24_PREAMBLE_FIRST_0 0x00 00402 #define RH_RF24_PREAMBLE_LENGTH_NIBBLES 0x00 00403 #define RH_RF24_PREAMBLE_LENGTH_BYTES 0x10 00404 #define RH_RF24_PREAMBLE_MAN_CONST 0x08 00405 #define RH_RF24_PREAMBLE_MAN_ENABLE 0x02 00406 #define RH_RF24_PREAMBLE_NON_STANDARD 0x00 00407 #define RH_RF24_PREAMBLE_STANDARD_1010 0x01 00408 #define RH_RF24_PREAMBLE_STANDARD_0101 0x02 00409 00410 //#define RH_RF24_PROPERTY_SYNC_CONFIG 0x1100 00411 #define RH_RF24_SYNC_CONFIG_SKIP_TX 0x80 00412 #define RH_RF24_SYNC_CONFIG_RX_ERRORS_MASK 0x70 00413 #define RH_RF24_SYNC_CONFIG_4FSK 0x08 00414 #define RH_RF24_SYNC_CONFIG_MANCH 0x04 00415 #define RH_RF24_SYNC_CONFIG_LENGTH_MASK 0x03 00416 00417 //#define RH_RF24_PROPERTY_PKT_CRC_CONFIG 0x1200 00418 #define RH_RF24_CRC_SEED_ALL_0S 0x00 00419 #define RH_RF24_CRC_SEED_ALL_1S 0x80 00420 #define RH_RF24_CRC_MASK 0x0f 00421 #define RH_RF24_CRC_NONE 0x00 00422 #define RH_RF24_CRC_ITU_T 0x01 00423 #define RH_RF24_CRC_IEC_16 0x02 00424 #define RH_RF24_CRC_BIACHEVA 0x03 00425 #define RH_RF24_CRC_16_IBM 0x04 00426 #define RH_RF24_CRC_CCITT 0x05 00427 #define RH_RF24_CRC_KOOPMAN 0x06 00428 #define RH_RF24_CRC_IEEE_802_3 0x07 00429 #define RH_RF24_CRC_CASTAGNOLI 0x08 00430 00431 //#define RH_RF24_PROPERTY_PKT_CONFIG1 0x1206 00432 #define RH_RF24_PH_FIELD_SPLIT 0x80 00433 #define RH_RF24_PH_RX_DISABLE 0x40 00434 #define RH_RF24_4FSK_EN 0x20 00435 #define RH_RF24_RX_MULTI_PKT 0x10 00436 #define RH_RF24_MANCH_POL 0x08 00437 #define RH_RF24_CRC_INVERT 0x04 00438 #define RH_RF24_CRC_ENDIAN 0x02 00439 #define RH_RF24_BIT_ORDER 0x01 00440 00441 //#define RH_RF24_PROPERTY_PKT_FIELD_1_CONFIG 0x120f 00442 //#define RH_RF24_PROPERTY_PKT_FIELD_2_CONFIG 0x1213 00443 //#define RH_RF24_PROPERTY_PKT_FIELD_3_CONFIG 0x1217 00444 //#define RH_RF24_PROPERTY_PKT_FIELD_4_CONFIG 0x121b 00445 //#define RH_RF24_PROPERTY_PKT_FIELD_5_CONFIG 0x121f 00446 #define RH_RF24_FIELD_CONFIG_4FSK 0x10 00447 #define RH_RF24_FIELD_CONFIG_WHITEN 0x02 00448 #define RH_RF24_FIELD_CONFIG_MANCH 0x01 00449 00450 //#define RH_RF24_PROPERTY_PKT_RX_FIELD_1_CRC_CONFIG 0x1224 00451 //#define RH_RF24_PROPERTY_PKT_RX_FIELD_2_CRC_CONFIG 0x1228 00452 //#define RH_RF24_PROPERTY_PKT_RX_FIELD_3_CRC_CONFIG 0x122c 00453 //#define RH_RF24_PROPERTY_PKT_RX_FIELD_4_CRC_CONFIG 0x1230 00454 //#define RH_RF24_PROPERTY_PKT_RX_FIELD_5_CRC_CONFIG 0x1234 00455 #define RH_RF24_FIELD_CONFIG_CRC_START 0x80 00456 #define RH_RF24_FIELD_CONFIG_SEND_CRC 0x20 00457 #define RH_RF24_FIELD_CONFIG_CHECK_CRC 0x08 00458 #define RH_RF24_FIELD_CONFIG_CRC_ENABLE 0x02 00459 00460 00461 00462 00463 //#define RH_RF24_PROPERTY_MODEM_MOD_TYPE 0x2000 00464 #define RH_RF24_TX_DIRECT_MODE_TYPE_SYNCHRONOUS 0x00 00465 #define RH_RF24_TX_DIRECT_MODE_TYPE_ASYNCHRONOUS 0x80 00466 #define RH_RF24_TX_DIRECT_MODE_GPIO0 0x00 00467 #define RH_RF24_TX_DIRECT_MODE_GPIO1 0x20 00468 #define RH_RF24_TX_DIRECT_MODE_GPIO2 0x40 00469 #define RH_RF24_TX_DIRECT_MODE_GPIO3 0x60 00470 #define RH_RF24_MOD_SOURCE_PACKET_HANDLER 0x00 00471 #define RH_RF24_MOD_SOURCE_DIRECT_MODE 0x08 00472 #define RH_RF24_MOD_SOURCE_RANDOM_GENERATOR 0x10 00473 #define RH_RF24_MOD_TYPE_CW 0x00 00474 #define RH_RF24_MOD_TYPE_OOK 0x01 00475 #define RH_RF24_MOD_TYPE_2FSK 0x02 00476 #define RH_RF24_MOD_TYPE_2GFSK 0x03 00477 #define RH_RF24_MOD_TYPE_4FSK 0x04 00478 #define RH_RF24_MOD_TYPE_4GFSK 0x05 00479 00480 // RH_RF24_PROPERTY_PA_MODE 0x2200 00481 #define RH_RF24_PA_MODE_1_GROUP 0x04 00482 #define RH_RF24_PA_MODE_2_GROUPS 0x08 00483 #define RH_RF24_PA_MODE_CLASS_E 0x00 00484 #define RH_RF24_PA_MODE_SWITCH_CURRENT 0x01 00485 00486 00487 ///////////////////////////////////////////////////////////////////// 00488 /// \class RH_RF24 RH_RF24.h <RH_RF24.h> 00489 /// \brief Driver to send and receive unaddressed, unreliable datagrams via an RF24 and compatible radio transceiver. 00490 /// 00491 /// Works with 00492 /// - Silicon Labs Si4460/1/2/3/4 transceiver chips 00493 /// - The equivalent HopeRF RF24/25/26/27 transceiver chips 00494 /// - HopeRF Complete modules: RFM24W/26W/27W 00495 /// 00496 /// \par Overview 00497 /// 00498 /// This class provides basic functions for sending and receiving unaddressed, 00499 /// unreliable datagrams of arbitrary length to 250 octets per packet. 00500 /// 00501 /// Manager classes may use this class to implement reliable, addressed datagrams and streams, 00502 /// mesh routers, repeaters, translators etc. 00503 /// 00504 /// Naturally, for any 2 radios to communicate that must be configured to use the same frequency and 00505 /// modulation scheme. 00506 /// 00507 /// This Driver provides an object-oriented interface for sending and receiving data messages with Hope-RF 00508 /// RF24 and compatible radio modules, such as the RFM24W module. 00509 /// 00510 /// The Hope-RF (http://www.hoperf.com) RF24 family is a low-cost ISM transceiver 00511 /// chip. It supports FSK, GFSK, OOK over a wide range of frequencies and 00512 /// programmable data rates. HopeRF also sell these chips on modules which includes 00513 /// a crystal and antenna coupling circuits: RFM24W, RFM26W and RFM27W 00514 /// 00515 /// This Driver provides functions for sending and receiving messages of up 00516 /// to 250 octets on any frequency supported by the RF24, in a range of 00517 /// predefined data rates and frequency deviations. Frequency can be set 00518 /// to any frequency from 142.0MHz to 1050.0MHz. Caution: most modules only support a more limited 00519 /// range of frequencies due to antenna tuning. 00520 /// 00521 /// Up to 2 RFM24 modules can be connected to an Arduino (3 on a Mega), 00522 /// permitting the construction of translators and frequency changers, etc. 00523 /// 00524 /// The following modulation types are suppported with a range of modem configurations for 00525 /// common data rates and frequency deviations: 00526 /// - OOK On-Off Keying 00527 /// - GFSK Gaussian Frequency Shift Keying 00528 /// - FSK Frequency Shift Keying 00529 /// 00530 /// Support for other RF24 features such as on-chip temperature measurement, 00531 /// transmitter power control etc is also provided. 00532 /// 00533 /// RH_RF24 uses interrupts to detect and handle events in the radio chip. The RF24 family has 00534 /// TX and RX FIFOs of 64 bytes, but through the use of interrupt, the RH_RF24 driver can send longer 00535 /// messages by filling or emptying the FIFOs on-the-fly. 00536 /// 00537 /// Tested on Anarduino Mini http://www.anarduino.com/mini/ with arduino-1.0.5 00538 /// on OpenSuSE 13.1 00539 /// 00540 /// \par Packet Format 00541 /// 00542 /// All messages sent and received by this RH_RF24 Driver conform to this packet format: 00543 /// 00544 /// - 4 octets PREAMBLE (configurable) 00545 /// - 2 octets SYNC 0x2d, 0xd4 (configurable, so you can use this as a network filter) 00546 /// - Field containing 1 octet of message length and 2 octet CRC protecting this field 00547 /// - Field 2 containing at least 4 octets, and 2 octet CRC protecting this field: 00548 /// + 4 octets HEADER: (TO, FROM, ID, FLAGS) 00549 /// + 0 to 250 octets DATA 00550 /// + 2 octets CRC, computed on HEADER and DATA 00551 /// 00552 /// \par Connecting RFM-24 to Arduino 00553 /// 00554 /// For RFM24/RFM26 and Teensy 3.1 or Anarduino Mini 00555 /// \code 00556 /// Teensy RFM-24/RFM26 00557 /// GND----------GND (ground in) 00558 /// 3V3----------VCC (3.3V in) 00559 /// interrupt 2 pin D2-----------NIRQ (interrupt request out) 00560 /// SS pin D10----------NSEL (chip select in) 00561 /// SCK pin D13----------SCK (SPI clock in) 00562 /// MOSI pin D11----------SDI (SPI Data in) 00563 /// MISO pin D12----------SDO (SPI data out) 00564 /// D9-----------SDN (shutdown in) 00565 /// /--GPIO0 (GPIO0 out to control transmitter antenna TX_ANT) 00566 /// \--TX_ANT (TX antenna control in) RFM22B only 00567 /// /--GPIO1 (GPIO1 out to control receiver antenna RX_ANT) 00568 /// \--RX_ANT (RX antenna control in) RFM22B only 00569 /// \endcode 00570 /// Caution: tying the radio SDN pin to ground (though it might appear from the data sheets to make sense) 00571 /// does not always produce a reliable radio startup. So this driver controls the SDN pin directly. 00572 /// Note: the GPIO0-TX_ANT and GPIO1-RX_ANT connections are not required for the 11dBm RFM24W, 00573 /// which has no antenna switch. 00574 /// 00575 /// \par Customising 00576 /// 00577 /// The library will work out of the box with the provided examples, over the full frequency range and with 00578 /// a wide range of predefined modem configurations schemes and speeds. However, you may want to 00579 /// change the default behaviour of this library. There are several ways you can do this: 00580 /// 00581 /// - Use the RH_RF24 API based on this documentation 00582 /// - Create your own ModemConfig and pass it to setModemreeegisters() 00583 /// - Generate a new radio_config_Si4460.h using the Silicon Labs WDS software package 00584 /// - Write directly to the radio registers and properties using command() and set_properties() 00585 /// 00586 /// \par RSSI 00587 /// 00588 /// The RSSI (Received Signal Strength Indicator) is measured and latched after the message sync bytes are received. 00589 /// The latched RSSI is available from the lastRssi() member functionafter the complete message is received. 00590 /// Although lastRssi() 00591 /// supposedly returns a signed integer, in the case of this radio it actually returns an unsigned 8 bit integer (uint8_t) 00592 /// and you will have to cast the return value to use it: 00593 /// \code 00594 /// uint8_t lastRssi = (uint8_t)rf24.lastRssi(); 00595 /// \endcode 00596 /// The units of RSSI are arbitrary and relative, with larger unsigned numbers indicating a stronger signal. Values up to 255 00597 /// are seen with radios in close proximity to each other. Lower limit of receivable strength is about 70. 00598 /// 00599 /// \par Transmitter Power 00600 /// 00601 /// You can control the transmitter power on the RF24/25/26/27 transceiver 00602 /// with the RH_RF24::setTxPower() function. The argument can be any of 00603 /// 0x00 to 0x4f (for RFM24/Si4460) or 00604 /// 0x00 to 0x7f (for others) 00605 /// 0x00 will yield no measurable power. For other settings there is a non-linear correlation with actual 00606 /// RF power output (see below) 00607 /// The default is 0x10. Eg: 00608 /// \code 00609 /// driver.setTxPower(0x10); 00610 /// \endcode 00611 /// 00612 /// We have made some actual power measurements against 00613 /// programmed power 00614 /// - Anarduino Mini with RFM24-433 and RFM26-433 at Vcc = 3.3V, in CW mode, 434MHz 00615 /// - 10cm RG58C/U soldered direct to RFM69 module ANT and GND 00616 /// - bnc connecteor 00617 /// - 12dB attenuator 00618 /// - BNC-SMA adapter 00619 /// - MiniKits AD8307 HF/VHF Power Head (calibrated against Rohde&Schwartz 806.2020 test set) 00620 /// - Digitech QM-1460 digital multimeter 00621 /// \code 00622 /// Program power Measured Power dBm 00623 /// HEX RFM24 RFM26 00624 /// 0x00 not measurable not measurable 00625 /// 0x01 -20.4 -20.6 00626 /// 0x0f 2.4 4.8 00627 /// 0x1f 9.4 11.0 00628 /// 0x2f 11.2 14.2 00629 /// 0x3f 11.6 16.4 00630 /// 0x4f 11.6 18.0 00631 /// 0x5f 18.6 00632 /// 0x6f 19.0 00633 /// 0x7f 19.2 00634 /// \endcode 00635 /// Caution: the actual radiated power output will depend heavily on the power supply voltage and the antenna. 00636 00637 class RH_RF24 : public RHSPIDriver 00638 { 00639 public: 00640 /// \brief Defines property values for a set of modem configuration registers 00641 /// 00642 /// Defines property values for a set of modem configuration registers 00643 /// that can be passed to setModemRegisters() if none of the choices in 00644 /// ModemConfigChoice suit your need setModemRegisters() writes the 00645 /// property values from this structure to the appropriate RF24 properties 00646 /// to set the desired modulation type, data rate and deviation/bandwidth. 00647 typedef struct 00648 { 00649 uint8_t prop_2000; ///< Value for property RH_RF24_PROPERTY_MODEM_MOD_TYPE 00650 uint8_t prop_2003; ///< Value for property RH_RF24_PROPERTY_MODEM_DATA_RATE_2 00651 uint8_t prop_2004; ///< Value for property RH_RF24_PROPERTY_MODEM_DATA_RATE_1 00652 uint8_t prop_2005; ///< Value for property RH_RF24_PROPERTY_MODEM_DATA_RATE_0 00653 uint8_t prop_2006; ///< Value for property RH_RF24_PROPERTY_MODEM_TX_NCO_MODE_3 00654 uint8_t prop_200a; ///< Value for property RH_RF24_PROPERTY_MODEM_FREQ_DEV_2 00655 uint8_t prop_200b; ///< Value for property RH_RF24_PROPERTY_MODEM_FREQ_DEV_1 00656 uint8_t prop_200c; ///< Value for property RH_RF24_PROPERTY_MODEM_FREQ_DEV_0 00657 uint8_t prop_2018; ///< Value for property RH_RF24_PROPERTY_MODEM_TX_RAMP_DELAY 00658 uint8_t prop_201e; ///< Value for property RH_RF24_PROPERTY_MODEM_DECIMATION_CFG1 00659 uint8_t prop_201f; ///< Value for property RH_RF24_PROPERTY_MODEM_DECIMATION_CFG0 00660 uint8_t prop_2022; ///< Value for property RH_RF24_PROPERTY_MODEM_BCR_OSR_1 00661 uint8_t prop_2023; ///< Value for property RH_RF24_PROPERTY_MODEM_BCR_OSR_0 00662 uint8_t prop_2024; ///< Value for property RH_RF24_PROPERTY_MODEM_BCR_NCO_OFFSET_2 00663 uint8_t prop_2025; ///< Value for property RH_RF24_PROPERTY_MODEM_BCR_NCO_OFFSET_1 00664 uint8_t prop_2026; ///< Value for property RH_RF24_PROPERTY_MODEM_BCR_NCO_OFFSET_0 00665 uint8_t prop_2027; ///< Value for property RH_RF24_PROPERTY_MODEM_BCR_GAIN_1 00666 uint8_t prop_2028; ///< Value for property RH_RF24_PROPERTY_MODEM_BCR_GAIN_0 00667 uint8_t prop_2029; ///< Value for property RH_RF24_PROPERTY_MODEM_BCR_GEAR 00668 uint8_t prop_202d; ///< Value for property RH_RF24_PROPERTY_MODEM_AFC_WAIT 00669 uint8_t prop_202e; ///< Value for property RH_RF24_PROPERTY_MODEM_AFC_GAIN_1 00670 uint8_t prop_202f; ///< Value for property RH_RF24_PROPERTY_MODEM_AFC_GAIN_0 00671 uint8_t prop_2030; ///< Value for property RH_RF24_PROPERTY_MODEM_AFC_LIMITER_1 00672 uint8_t prop_2031; ///< Value for property RH_RF24_PROPERTY_MODEM_AFC_LIMITER_0 00673 uint8_t prop_2035; ///< Value for property RH_RF24_PROPERTY_MODEM_AGC_CONTROL 00674 uint8_t prop_2038; ///< Value for property RH_RF24_PROPERTY_MODEM_AGC_WINDOW_SIZE 00675 uint8_t prop_2039; ///< Value for property RH_RF24_PROPERTY_MODEM_AGC_RFPD_DECAY 00676 uint8_t prop_203a; ///< Value for property RH_RF24_PROPERTY_MODEM_AGC_IFPD_DECAY 00677 uint8_t prop_203b; ///< Value for property RH_RF24_PROPERTY_MODEM_FSK4_GAIN1 00678 uint8_t prop_203c; ///< Value for property RH_RF24_PROPERTY_MODEM_FSK4_GAIN0 00679 uint8_t prop_203d; ///< Value for property RH_RF24_PROPERTY_MODEM_FSK4_TH1 00680 uint8_t prop_203e; ///< Value for property RH_RF24_PROPERTY_MODEM_FSK4_TH0 00681 uint8_t prop_203f; ///< Value for property RH_RF24_PROPERTY_MODEM_FSK4_MAP 00682 uint8_t prop_2040; ///< Value for property RH_RF24_PROPERTY_MODEM_OOK_PDTC 00683 uint8_t prop_2043; ///< Value for property RH_RF24_PROPERTY_MODEM_OOK_MISC 00684 uint8_t prop_2045; ///< Value for property RH_RF24_PROPERTY_MODEM_RAW_CONTROL 00685 uint8_t prop_2046; ///< Value for property RH_RF24_PROPERTY_MODEM_RAW_EYE_1 00686 uint8_t prop_2047; ///< Value for property RH_RF24_PROPERTY_MODEM_RAW_EYE_0 00687 uint8_t prop_204e; ///< Value for property RH_RF24_PROPERTY_MODEM_RSSI_COMP 00688 uint8_t prop_2100; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE13_7_0 00689 uint8_t prop_2101; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE12_7_0 00690 uint8_t prop_2102; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE11_7_0 00691 uint8_t prop_2103; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE10_7_0 00692 uint8_t prop_2104; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE9_7_0 00693 uint8_t prop_2105; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE8_7_0 00694 uint8_t prop_2106; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE7_7_0 00695 uint8_t prop_2107; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE6_7_0 00696 uint8_t prop_2108; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE5_7_0 00697 uint8_t prop_2109; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE4_7_0 00698 uint8_t prop_210a; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE3_7_0 00699 uint8_t prop_210b; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE2_7_0 00700 uint8_t prop_210c; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE1_7_0 00701 uint8_t prop_210d; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COE0_7_0 00702 uint8_t prop_210e; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COEM0 00703 uint8_t prop_210f; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COEM1 00704 uint8_t prop_2110; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COEM2 00705 uint8_t prop_2111; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX1_CHFLT_COEM3 00706 uint8_t prop_2112; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE13_7_0 00707 uint8_t prop_2113; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE12_7_0 00708 uint8_t prop_2114; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE11_7_0 00709 uint8_t prop_2115; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE10_7_0 00710 uint8_t prop_2116; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE9_7_0 00711 uint8_t prop_2117; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE8_7_0 00712 uint8_t prop_2118; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE7_7_0 00713 uint8_t prop_2119; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE6_7_0 00714 uint8_t prop_211a; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE5_7_0 00715 uint8_t prop_211b; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE4_7_0 00716 uint8_t prop_211c; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE3_7_0 00717 uint8_t prop_211d; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE2_7_0 00718 uint8_t prop_211e; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE1_7_0 00719 uint8_t prop_211f; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COE0_7_0 00720 uint8_t prop_2120; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COEM0 00721 uint8_t prop_2121; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COEM1 00722 uint8_t prop_2122; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COEM2 00723 uint8_t prop_2123; ///< Value for property RH_RF24_PROPERTY_MODEM_CHFLT_RX2_CHFLT_COEM3 00724 uint8_t prop_2203; ///< Value for property RH_RF24_PROPERTY_PA_TC 00725 uint8_t prop_2300; ///< Value for property RH_RF24_PROPERTY_SYNTH_PFDCP_CPFF 00726 uint8_t prop_2301; ///< Value for property RH_RF24_PROPERTY_SYNTH_PFDCP_CPINT 00727 uint8_t prop_2303; ///< Value for property RH_RF24_PROPERTY_SYNTH_LPFILT3 00728 uint8_t prop_2304; ///< Value for property RH_RF24_PROPERTY_SYNTH_LPFILT2 00729 uint8_t prop_2305; ///< Value for property RH_RF24_PROPERTY_SYNTH_LPFILT1 00730 } ModemConfig; 00731 00732 /// Choices for setModemConfig() for a selected subset of common 00733 /// modulation types, and data rates. If you need another configuration, 00734 /// use the register calculator. and call setModemRegisters() with your 00735 /// desired settings. 00736 /// These are indexes into MODEM_CONFIG_TABLE. We strongly recommend you use these symbolic 00737 /// definitions and not their integer equivalents: its possible that values will be 00738 /// changed in later versions (though we will try to avoid it). 00739 /// Contributions of new complete and tested ModemConfigs ready to add to this list will be readily accepted. 00740 typedef enum 00741 { 00742 FSK_Rb0_5Fd1 = 0, ///< FSK Rb = 0.5kbs, Fd = 1kHz 00743 FSK_Rb5Fd10, ///< FSK Rb = 5kbs, Fd = 10kHz 00744 FSK_Rb50Fd100, ///< FSK Rb = 50kbs, Fd = 100kHz 00745 FSK_Rb150Fd300, ///< FSK Rb = 50kbs, Fd = 100kHz 00746 00747 GFSK_Rb0_5Fd1, ///< GFSK Rb = 0.5kbs, Fd = 1kHz 00748 GFSK_Rb5Fd10, ///< GFSK Rb = 5kbs, Fd = 10kHz 00749 GFSK_Rb50Fd100, ///< GFSK Rb = 50kbs, Fd = 100kHz 00750 GFSK_Rb150Fd300, ///< GFSK Rb = 150kbs, Fd = 300kHz 00751 00752 // We were unable to get any other OOKs to work 00753 OOK_Rb5Bw30, ///< OOK Rb = 5kbs, Bw = 30kHz 00754 OOK_Rb10Bw40, ///< OOK Rb = 10kbs, Bw = 40kHz 00755 00756 // We were unable to get any 4FSK or 4GFSK schemes to work 00757 00758 } ModemConfigChoice; 00759 00760 /// \brief Defines the available choices for CRC 00761 /// Types of permitted CRC polynomials, to be passed to setCRCPolynomial() 00762 /// They deliberately have the same numeric values as the CRC_POLYNOMIAL field of PKT_CRC_CONFIG 00763 typedef enum 00764 { 00765 CRC_NONE = 0, 00766 CRC_ITU_T, 00767 CRC_IEC_16, 00768 CRC_Biacheva, 00769 CRC_16_IBM, 00770 CRC_CCITT, 00771 CRC_Koopman, 00772 CRC_IEEE_802_3, 00773 CRC_Castagnoli, 00774 } CRCPolynomial; 00775 00776 /// \brief Defines the commands we can interrogate in printRegisters 00777 typedef struct 00778 { 00779 uint8_t cmd; ///< The command number 00780 uint8_t replyLen; ///< Number of bytes in the reply stream (after the CTS) 00781 } CommandInfo; 00782 00783 /// Constructor. You can have multiple instances, but each instance must have its own 00784 /// interrupt and slave select pin. After constructing, you must call init() to initialise the interface 00785 /// and the radio module. A maximum of 3 instances can co-exist on one processor, provided there are sufficient 00786 /// distinct interrupt lines, one for each instance. 00787 /// \param[in] slaveSelectPin the Arduino pin number of the output to use to select the RF24 before 00788 /// accessing it. Defaults to the normal SS pin for your Arduino (D10 for Diecimila, Uno etc, D53 for Mega, D10 for Maple) 00789 /// \param[in] interruptPin The interrupt Pin number that is connected to the RF24 DIO0 interrupt line. 00790 /// Defaults to pin 2. 00791 /// Caution: You must specify an interrupt capable pin. 00792 /// On many Arduino boards, there are limitations as to which pins may be used as interrupts. 00793 /// On Leonardo pins 0, 1, 2 or 3. On Mega2560 pins 2, 3, 18, 19, 20, 21. On Due and Teensy, any digital pin. 00794 /// On other Arduinos pins 2 or 3. 00795 /// See http://arduino.cc/en/Reference/attachInterrupt for more details. 00796 /// On Chipkit Uno32, pins 38, 2, 7, 8, 35. 00797 /// On other boards, any digital pin may be used. 00798 /// \param [in] sdnPin The pin number connected to SDN on the radio. Defaults to pin 9. 00799 /// Connecting SDN directly to ground does not aloways provide reliable radio startup. 00800 /// \param[in] spi Pointer to the SPI interface object to use. 00801 /// Defaults to the standard Arduino hardware SPI interface 00802 RH_RF24(PINS slaveSelectPin, PINS interruptPin, PINS sdnPin, RHGenericSPI& spi = hardware_spi); 00803 00804 /// Initialises this instance and the radio module connected to it. 00805 /// The following steps are taken: 00806 /// - Initialise the slave select and shutdown pins and the SPI interface library 00807 /// - Checks the connected RF24 module can be communicated 00808 /// - Attaches an interrupt handler 00809 /// - Configures the RF24 module 00810 /// - Sets the frequency to 434.0 MHz 00811 /// - Sets the modem data rate to GFSK_Rb5Fd10 00812 /// - Sets the tranmitter power level to 16 (about 2.4dBm on RFM4) 00813 /// \return true if everything was successful 00814 bool init(); 00815 00816 /// Sets the chip mode that will be used when the RH_RF24 driver is idle (ie not transmitting or receiving) 00817 /// You can use this to control the power level consumed while idle, at the cost of slower 00818 /// transition to tranmit or receive states 00819 /// \param[in] idleMode The chip state to use when idle. Sensible choices might be RH_RF24_DEVICE_STATE_SLEEP or RH_RF24_DEVICE_STATE_READY 00820 void setIdleMode(uint8_t idleMode); 00821 00822 /// Sets the transmitter and receiver 00823 /// centre frequency. 00824 /// Valid frequency ranges for RFM24/Si4460, Si4461, RFM25/Si4463 are: 00825 /// 142MHz to 175Mhz, 284MHz to 350MHz, 425MHz to 525MHz, 850MHz to 1050MHz. 00826 /// Valid frequency ranges for RFM26/Si4464 are: 00827 /// 119MHz to 960MHz. 00828 /// Caution: RFM modules are designed with antenna coupling components to suit a limited band 00829 /// of frequencies (marked underneath the module). It is possible to set frequencies in other bands, 00830 /// but you may only get little or no power radiated. 00831 /// \param[in] centre Frequency in MHz. 00832 /// \param[in] afcPullInRange Not used 00833 /// \return true if the selected frequency is within a valid range for the connected radio and if 00834 /// setting the new frequency succeeded. 00835 bool setFrequency(float centre, float afcPullInRange = 0.05); 00836 00837 /// Sets all the properties required to configure the data modem in the RF24, including the data rate, 00838 /// bandwidths etc. You can use this to configure the modem with custom configurations if none of the 00839 /// canned configurations in ModemConfigChoice suit you. 00840 /// \param[in] config A ModemConfig structure containing values for the modem configuration registers. 00841 void setModemRegisters(const ModemConfig* config); 00842 00843 /// Select one of the predefined modem configurations. If you need a modem configuration not provided 00844 /// here, use setModemRegisters() with your own ModemConfig. The default after init() is RH_RF24::GFSK_Rb5Fd10. 00845 /// \param[in] index The configuration choice. 00846 /// \return true if index is a valid choice. 00847 bool setModemConfig(ModemConfigChoice index); 00848 00849 /// Starts the receiver and checks whether a received message is available. 00850 /// This can be called multiple times in a timeout loop 00851 /// \return true if a complete, valid message has been received and is able to be retrieved by 00852 /// recv() 00853 bool available(); 00854 00855 /// Turns the receiver on if it not already on. 00856 /// If there is a valid message available, copy it to buf and return true 00857 /// else return false. 00858 /// If a message is copied, *len is set to the length (Caution, 0 length messages are permitted). 00859 /// You should be sure to call this function frequently enough to not miss any messages 00860 /// It is recommended that you call it in your main loop. 00861 /// \param[in] buf Location to copy the received message 00862 /// \param[in,out] len Pointer to available space in buf. Set to the actual number of octets copied. 00863 /// \return true if a valid message was copied to buf 00864 bool recv(uint8_t* buf, uint8_t* len); 00865 00866 /// Waits until any previous transmit packet is finished being transmitted with waitPacketSent(). 00867 /// Then loads a message into the transmitter and starts the transmitter. Note that a message length 00868 /// of 0 is NOT permitted. 00869 /// \param[in] data Array of data to be sent 00870 /// \param[in] len Number of bytes of data to send (> 0) 00871 /// \return true if the message length was valid and it was correctly queued for transmit 00872 bool send(const uint8_t* data, uint8_t len); 00873 00874 /// The maximum message length supported by this driver 00875 /// \return The maximum message length supported by this driver 00876 uint8_t maxMessageLength(); 00877 00878 /// Sets the length of the preamble 00879 /// in bytes. 00880 /// Caution: this should be set to the same 00881 /// value on all nodes in your network. Default is 4. 00882 /// \param[in] bytes Preamble length in bytes. 00883 void setPreambleLength(uint16_t bytes); 00884 00885 /// Sets the sync words for transmit and receive 00886 /// Caution: SyncWords should be set to the same 00887 /// value on all nodes in your network. Nodes with different SyncWords set will never receive 00888 /// each others messages, so different SyncWords can be used to isolate different 00889 /// networks from each other. Default is { 0x2d, 0xd4 }. 00890 /// \param[in] syncWords Array of sync words, 1 to 4 octets long. NULL if no sync words to be used. 00891 /// \param[in] len Number of sync words to set, 1 to 4. 0 if no sync words to be used. 00892 void setSyncWords(const uint8_t* syncWords = NULL, uint8_t len = 0); 00893 00894 /// Sets the CRC polynomial to be used to generate the CRC for both receive and transmit 00895 /// otherwise the default of CRC_16_IBM will be used. 00896 /// \param[in] polynomial One of RH_RF24::CRCPolynomial choices CRC_* 00897 /// \return true if polynomial is a valid option for this radio. 00898 bool setCRCPolynomial(CRCPolynomial polynomial); 00899 00900 /// If current mode is Rx or Tx changes it to Idle. If the transmitter or receiver is running, 00901 /// disables them. 00902 void setModeIdle(); 00903 00904 /// If current mode is Tx or Idle, changes it to Rx. 00905 /// Starts the receiver in the RF24. 00906 void setModeRx(); 00907 00908 /// If current mode is Rx or Idle, changes it to Rx. F 00909 /// Starts the transmitter in the RF24. 00910 void setModeTx(); 00911 00912 /// Sets the transmitter power output level register PA_PWR_LVL 00913 /// The power argument to this function has a non-linear correlation with the actual RF power output. 00914 /// See the transmitter power table above for some examples. 00915 /// Also the Si446x Data Sheet section 5.4.2 may be helpful. 00916 /// Be a good neighbour and set the lowest power level you need. 00917 /// Caution: legal power limits may apply in certain countries. 00918 /// After init(), the power will be set to 0x10. 00919 /// \param[in] power Transmitter power level. For RFM24/Si4460, valid values are 0x00 to 0x4f. For others, 0x00 to 0x7f 00920 void setTxPower(uint8_t power); 00921 00922 /// Dump the values of available command replies and properties 00923 /// to the Serial device if RH_HAVE_SERIAL is defined for the current platform 00924 /// Not all commands have valid replies, therefore they are not all printed. 00925 /// Caution: the list is very long 00926 bool printRegisters(); 00927 00928 /// Send a string of command bytes to the chip and get a string of reply bytes 00929 /// Different RFM24 commands take different numbers of command bytes and send back different numbers 00930 /// of reply bytes. See the Si446x documentaiton for more details. 00931 /// Both command bytes and reply bytes are optional 00932 /// \param[in] cmd The command number. One of RH_RF24_CMD_* 00933 /// \param[in] write_buf Pointer to write_len bytes of command input bytes to send. If there are none, set to NULL. 00934 /// \param[in] write_len The number of bytes to send from write_buf. If there are none, set to 0 00935 /// \param[out] read_buf Pointer to read_len bytes of storage where the reply stream from the comand will be written. 00936 /// If none are required, set to NULL 00937 /// \param[in] read_len The number of bytes to read from the reply stream. If none required, set to 0. 00938 /// \return true if the command succeeeded. 00939 bool command(uint8_t cmd, const uint8_t* write_buf = 0, uint8_t write_len = 0, uint8_t* read_buf = 0, uint8_t read_len = 0); 00940 00941 /// Set one or more chip properties using the RH_RF24_CMD_SET_PROPERTY 00942 /// command. See the Si446x API Description AN625 for details on what properties are available. 00943 /// param[in] firstProperty The property number of the first property to set. The first value in the values array 00944 /// will be used to set this property, and any subsequent values will be used to set the following properties. 00945 /// One of RH_RF24_PROPERTY_* 00946 /// param[in] values Array of 0 or more values to write the firstProperty and subsequent proerties 00947 /// param[in] count The number of values in the values array 00948 /// \return true if the command succeeeded. 00949 bool set_properties(uint16_t firstProperty, const uint8_t* values, uint8_t count); 00950 00951 /// Get one or more chip properties using the RH_RF24_CMD_GET_PROPERTY 00952 /// command. See the Si446x API Description AN625 for details on what properties are available. 00953 /// param[in] firstProperty The property number of the first property to get. The first value in the values array 00954 /// will be set with this property, and any subsequent values will be set from the following properties. 00955 /// One of RH_RF24_PROPERTY_* 00956 /// param[out] values Array of 0 or more values to receive the firstProperty and subsequent proerties 00957 /// param[in] count The number of values in the values array 00958 /// \return true if the command succeeeded. 00959 bool get_properties(uint16_t firstProperty, uint8_t* values, uint8_t count); 00960 00961 /// Measures and returns the current 00962 /// Chip temperature. 00963 /// \return The current chip temperature in degrees Centigrade 00964 float get_temperature(); 00965 00966 /// Measures and returns the current 00967 /// Chip Vcc supply voltage. 00968 /// \return The current chip Vcc supply voltage in Volts. 00969 float get_battery_voltage(); 00970 00971 /// Measures and returns the current 00972 /// voltage applied to a GPIO pin (which has previously been configured as a voltage input) 00973 /// \param[in] gpio The GPIO pin to read. 0 to 3. 00974 /// \return The current pin voltage in Volts. 00975 float get_gpio_voltage(uint8_t gpio); 00976 00977 /// Read one of the Fast Read Response registers. 00978 /// The Fast Read Response register must be previously configured with the matching 00979 /// RH_RF24_PROPERTY_FRR_CTL_?_MODE property to select what chip property will be available in that register. 00980 /// \param[in] reg The index of the FRR register to read. 0 means FRR A, 1 means B etc. 00981 /// \return the value read from the specified Fast Read Response register. 00982 uint8_t frr_read(uint8_t reg); 00983 00984 /// Sets the radio into low-power sleep mode. 00985 /// If successful, the transport will stay in sleep mode until woken by 00986 /// changing mode it idle, transmit or receive (eg by calling send(), recv(), available() etc) 00987 /// Caution: there is a time penalty as the radio takes a finte time to wake from sleep mode. 00988 /// \return true if sleep mode was successfully entered. 00989 virtual bool sleep(); 00990 00991 protected: 00992 /// This is a low level function to handle the interrupts for one instance of RF24. 00993 /// Called automatically by isr*() 00994 /// Should not need to be called by user code. 00995 void handleInterrupt(); 00996 00997 /// Clears the chips RX FIFO 00998 /// \return true if successful 00999 bool clearRxFifo(); 01000 01001 /// Clears RH_RF24's internal TX and RX buffers and counters 01002 void clearBuffer(); 01003 01004 /// Loads the next part of the currently transmitting message 01005 /// into the chips TX buffer 01006 void sendNextFragment(); 01007 01008 /// Copies the next part of the currenrtly received message from the chips RX FIFO to the 01009 /// receive buffer 01010 void readNextFragment(); 01011 01012 /// Loads data into the chips TX FIFO 01013 /// \param[in] data Array of data bytes to be loaded 01014 /// \param[in] len Number of bytes in data to be loaded 01015 /// \return true if successful 01016 bool writeTxFifo(uint8_t *data, uint8_t len); 01017 01018 /// Checks the contents of the RX buffer. 01019 /// If it contans a valid message adressed to this node 01020 /// sets _rxBufValid. 01021 void validateRxBuf(); 01022 01023 /// Cycles the Shutdown pin to force the cradio chip to reset 01024 void power_on_reset(); 01025 01026 /// Sets registers, commands and properties 01027 /// in the ratio according to the data in the commands array 01028 /// \param[in] commands Array of data containing radio commands in the format provided by radio_config_Si4460.h 01029 /// \return true if successful 01030 bool configure(const uint8_t* commands); 01031 01032 /// Clears all pending interrutps in the radio chip. 01033 bool cmd_clear_all_interrupts(); 01034 01035 private: 01036 01037 /// Low level interrupt service routine for RF24 connected to interrupt 0 01038 static void isr0(); 01039 01040 /// Low level interrupt service routine for RF24 connected to interrupt 1 01041 static void isr1(); 01042 01043 /// Low level interrupt service routine for RF24 connected to interrupt 1 01044 static void isr2(); 01045 01046 /// Array of instances connected to interrupts 0 and 1 01047 static RH_RF24* _deviceForInterrupt[]; 01048 01049 /// Index of next interrupt number to use in _deviceForInterrupt 01050 static uint8_t _interruptCount; 01051 01052 #if (RH_PLATFORM == RH_PLATFORM_MBED) 01053 /// The configured interrupt pin connected to this instance 01054 InterruptIn _interruptPin; 01055 #else 01056 /// The configured interrupt pin connected to this instance 01057 uint8_t _interruptPin; 01058 #endif 01059 01060 /// The index into _deviceForInterrupt[] for this device (if an interrupt is already allocated) 01061 /// else 0xff 01062 uint8_t _myInterruptIndex; 01063 01064 #if (RH_PLATFORM == RH_PLATFORM_MBED) 01065 /// The configured pin connected to the SDN pin of the radio 01066 DigitalOut _sdnPin; 01067 #else 01068 /// The configured pin connected to the SDN pin of the radio 01069 uint8_t _sdnPin; 01070 #endif 01071 01072 /// The radio OP mode to use when mode is RHModeIdle 01073 uint8_t _idleMode; 01074 01075 /// The reported PART device type 01076 uint16_t _deviceType; 01077 01078 /// The selected output power in dBm 01079 int8_t _power; 01080 01081 /// The message length in _buf 01082 volatile uint8_t _bufLen; 01083 01084 /// Array of octets of the last received message or the next to transmit message 01085 uint8_t _buf[RH_RF24_MAX_PAYLOAD_LEN]; 01086 01087 /// True when there is a valid message in the Rx buffer 01088 volatile bool _rxBufValid; 01089 01090 /// Index into TX buffer of the next to send chunk 01091 volatile uint8_t _txBufSentIndex; 01092 01093 /// Time in millis since the last preamble was received (and the last time the RSSI was measured) 01094 uint32_t _lastPreambleTime; 01095 01096 }; 01097 01098 /// @example rf24_client.pde 01099 /// @example rf24_server.pde 01100 /// @example rf24_reliable_datagram_client.pde 01101 /// @example rf24_reliable_datagram_server.pde 01102 01103 #endif
Generated on Tue Jul 12 2022 20:15:57 by
1.7.2
