22
22
23
23
#include " RF24.h"
24
24
25
- uint8_t MY_RF24_BASE_ADDR[MY_RF24_ADDR_WIDTH] = { MY_RF24_BASE_RADIO_ID };
26
- uint8_t MY_RF24_NODE_ADDRESS = AUTO;
25
+ LOCAL uint8_t MY_RF24_BASE_ADDR[MY_RF24_ADDR_WIDTH] = { MY_RF24_BASE_RADIO_ID };
26
+ LOCAL uint8_t MY_RF24_NODE_ADDRESS = AUTO;
27
27
28
- void csn (bool level) {
28
+ LOCAL void RF24_csn (bool level) {
29
29
digitalWrite (MY_RF24_CS_PIN, level);
30
30
}
31
31
32
- void ce (bool level) {
32
+ LOCAL void RF24_ce (bool level) {
33
33
digitalWrite (MY_RF24_CE_PIN, level);
34
34
}
35
35
36
- uint8_t spiMultiByteTransfer (uint8_t cmd, uint8_t * buf, uint8_t len, bool aReadMode) {
36
+ LOCAL uint8_t RF24_spiMultiByteTransfer (uint8_t cmd, uint8_t * buf, uint8_t len, bool aReadMode) {
37
37
uint8_t * current = buf;
38
38
#if !defined(MY_SOFTSPI)
39
39
_SPI.beginTransaction (SPISettings (MY_RF24_SPI_MAX_SPEED, MY_RF24_SPI_DATA_ORDER, MY_RF24_SPI_DATA_MODE));
40
40
#endif
41
- csn (LOW);
41
+ RF24_csn (LOW);
42
42
// timing
43
43
delayMicroseconds (10 );
44
44
uint8_t status = _SPI.transfer ( cmd );
@@ -48,7 +48,7 @@ uint8_t spiMultiByteTransfer(uint8_t cmd, uint8_t* buf, uint8_t len, bool aReadM
48
48
if (buf != NULL ) *current++ = status;
49
49
} else status = _SPI.transfer (*current++);
50
50
}
51
- csn (HIGH);
51
+ RF24_csn (HIGH);
52
52
#if !defined(MY_SOFTSPI)
53
53
_SPI.endTransaction ();
54
54
#endif
@@ -57,120 +57,116 @@ uint8_t spiMultiByteTransfer(uint8_t cmd, uint8_t* buf, uint8_t len, bool aReadM
57
57
return status;
58
58
}
59
59
60
- uint8_t spiByteTransfer (uint8_t cmd) {
61
- return spiMultiByteTransfer ( cmd, NULL , 0 , false );
60
+ LOCAL uint8_t RF24_spiByteTransfer (uint8_t cmd) {
61
+ return RF24_spiMultiByteTransfer ( cmd, NULL , 0 , false );
62
62
}
63
63
64
- uint8_t _readByteRegister (uint8_t cmd) {
65
- uint8_t value = spiMultiByteTransfer ( cmd, NULL , 1 , true );
64
+ LOCAL uint8_t RF24_RAW_readByteRegister (uint8_t cmd) {
65
+ uint8_t value = RF24_spiMultiByteTransfer ( cmd, NULL , 1 , true );
66
66
RF24_DEBUG (PSTR (" read register, reg=%d, value=%d\n " ), cmd & (R_REGISTER ^ 0xFF ), value);
67
67
return value;
68
68
}
69
69
70
- uint8_t _writeByteRegister (uint8_t cmd, uint8_t value) {
70
+ LOCAL uint8_t RF24_RAW_writeByteRegister (uint8_t cmd, uint8_t value) {
71
71
RF24_DEBUG (PSTR (" write register, reg=%d, value=%d\n " ), cmd & (W_REGISTER ^ 0xFF ), value);
72
- return spiMultiByteTransfer ( cmd , &value, 1 , false );
72
+ return RF24_spiMultiByteTransfer ( cmd , &value, 1 , false );
73
73
}
74
74
75
- #define readByteRegister (reg ) _readByteRegister( R_REGISTER | ( REGISTER_MASK & (reg) ) )
76
- #define writeByteRegister (reg, value ) _writeByteRegister( W_REGISTER | ( REGISTER_MASK & (reg) ), value )
77
- #define writeMultiByteRegister (reg, buf, len ) spiMultiByteTransfer( W_REGISTER | ( REGISTER_MASK & (reg) ), (uint8_t *)buf, len, false )
78
-
79
- void flushRX (void ) {
80
- RF24_DEBUG (PSTR (" flushRX\n " ));
81
- spiByteTransfer ( FLUSH_RX );
75
+ LOCAL void RF24_flushRX (void ) {
76
+ RF24_DEBUG (PSTR (" RF24_flushRX\n " ));
77
+ RF24_spiByteTransfer ( FLUSH_RX );
82
78
}
83
79
84
- void flushTX (void ) {
85
- RF24_DEBUG (PSTR (" flushTX \n " ));
86
- spiByteTransfer ( FLUSH_TX );
80
+ LOCAL void RF24_flushTX (void ) {
81
+ RF24_DEBUG (PSTR (" RF24_flushTX \n " ));
82
+ RF24_spiByteTransfer ( FLUSH_TX );
87
83
}
88
84
89
- uint8_t getStatus (void ) {
90
- return spiByteTransfer ( NOP );
85
+ LOCAL uint8_t RF24_getStatus (void ) {
86
+ return RF24_spiByteTransfer ( NOP );
91
87
}
92
88
93
- void openWritingPipe (uint8_t recipient) {
89
+ LOCAL void RF24_openWritingPipe (uint8_t recipient) {
94
90
RF24_DEBUG (PSTR (" open writing pipe, recipient=%d\n " ), recipient);
95
91
// only write LSB of RX0 and TX pipe
96
- writeByteRegister (RX_ADDR_P0, recipient);
97
- writeByteRegister (TX_ADDR, recipient);
92
+ RF24_writeByteRegister (RX_ADDR_P0, recipient);
93
+ RF24_writeByteRegister (TX_ADDR, recipient);
98
94
}
99
95
100
- void startListening (void ) {
96
+ LOCAL void RF24_startListening (void ) {
101
97
RF24_DEBUG (PSTR (" start listening\n " ));
102
98
// toggle PRX
103
- writeByteRegister (NRF_CONFIG, MY_RF24_CONFIGURATION | _BV (PWR_UP) | _BV (PRIM_RX) );
99
+ RF24_writeByteRegister (NRF_CONFIG, MY_RF24_CONFIGURATION | _BV (PWR_UP) | _BV (PRIM_RX) );
104
100
// all RX pipe addresses must be unique, therefore skip if node ID is 0xFF
105
- if (MY_RF24_NODE_ADDRESS!=AUTO) writeByteRegister (RX_ADDR_P0, MY_RF24_NODE_ADDRESS);
101
+ if (MY_RF24_NODE_ADDRESS!=AUTO) RF24_writeByteRegister (RX_ADDR_P0, MY_RF24_NODE_ADDRESS);
106
102
// start listening
107
- ce (HIGH);
103
+ RF24_ce (HIGH);
108
104
}
109
105
110
- void stopListening (void ) {
106
+ LOCAL void RF24_stopListening (void ) {
111
107
RF24_DEBUG (PSTR (" stop listening\n " ));
112
- ce (LOW);
108
+ RF24_ce (LOW);
113
109
// timing
114
110
delayMicroseconds (130 );
115
- writeByteRegister (NRF_CONFIG, MY_RF24_CONFIGURATION | _BV (PWR_UP) );
111
+ RF24_writeByteRegister (NRF_CONFIG, MY_RF24_CONFIGURATION | _BV (PWR_UP) );
116
112
// timing
117
113
delayMicroseconds (100 );
118
114
}
119
115
120
- void powerDown (void ) {
121
- ce (LOW);
122
- writeByteRegister (NRF_CONFIG, 0x00 );
116
+ LOCAL void RF24_powerDown (void ) {
117
+ RF24_ce (LOW);
118
+ RF24_writeByteRegister (NRF_CONFIG, 0x00 );
123
119
RF24_DEBUG (PSTR (" power down\n " ));
124
120
}
125
121
126
- bool sendMessage ( uint8_t recipient, const void * buf, uint8_t len ) {
122
+ LOCAL bool RF24_sendMessage ( uint8_t recipient, const void * buf, uint8_t len ) {
127
123
uint8_t status;
128
124
129
- stopListening ();
130
- openWritingPipe ( recipient );
125
+ RF24_stopListening ();
126
+ RF24_openWritingPipe ( recipient );
131
127
RF24_DEBUG (PSTR (" send message to %d, len=%d\n " ),recipient,len);
132
128
// flush TX FIFO
133
- flushTX ();
129
+ RF24_flushTX ();
134
130
// this command is affected in clones (e.g. Si24R1): flipped NoACK bit when using W_TX_PAYLOAD_NO_ACK / W_TX_PAYLOAD
135
- // spiMultiByteTransfer ( recipient==BROADCAST_ADDRESS ? W_TX_PAYLOAD_NO_ACK : W_TX_PAYLOAD, (uint8_t*)buf, len, false );
131
+ // RF24_spiMultiByteTransfer ( recipient==BROADCAST_ADDRESS ? W_TX_PAYLOAD_NO_ACK : W_TX_PAYLOAD, (uint8_t*)buf, len, false );
136
132
// we are safe by disabling AutoACK on the broadcasting pipe
137
- spiMultiByteTransfer ( W_TX_PAYLOAD, (uint8_t *)buf, len, false );
133
+ RF24_spiMultiByteTransfer ( W_TX_PAYLOAD, (uint8_t *)buf, len, false );
138
134
// go
139
- ce (HIGH);
135
+ RF24_ce (HIGH);
140
136
// TX starts after ~10us
141
137
do {
142
- status = getStatus ();
138
+ status = RF24_getStatus ();
143
139
} while (!(status & ( _BV (MAX_RT) | _BV (TX_DS) )));
144
140
145
- ce (LOW);
141
+ RF24_ce (LOW);
146
142
// reset interrupts
147
- writeByteRegister (RF24_STATUS, _BV (TX_DS) | _BV (MAX_RT) );
143
+ RF24_writeByteRegister (RF24_STATUS, _BV (TX_DS) | _BV (MAX_RT) );
148
144
// Max retries exceeded
149
145
if ( status & _BV (MAX_RT)){
150
146
// flush packet
151
147
RF24_DEBUG (PSTR (" MAX_RT\n " ));
152
- flushTX ();
148
+ RF24_flushTX ();
153
149
}
154
150
155
- startListening ();
151
+ RF24_startListening ();
156
152
157
153
return (status & _BV (TX_DS));
158
154
}
159
155
160
- uint8_t getDynamicPayloadSize (void ) {
161
- uint8_t result = spiMultiByteTransfer (R_RX_PL_WID,NULL ,1 ,true );
156
+ LOCAL uint8_t RF24_getDynamicPayloadSize (void ) {
157
+ uint8_t result = RF24_spiMultiByteTransfer (R_RX_PL_WID,NULL ,1 ,true );
162
158
// check if payload size invalid
163
159
if (result > 32 ) {
164
160
RF24_DEBUG (PSTR (" invalid payload length = %d\n " ),result);
165
- flushRX ();
161
+ RF24_flushRX ();
166
162
result = 0 ;
167
163
}
168
164
return result;
169
165
}
170
166
171
167
172
- bool IsDataAvailable (uint8_t * to) {
173
- uint8_t pipe_num = ( getStatus () >> RX_P_NO ) & 0b0111 ;
168
+ LOCAL bool RF24_isDataAvailable (uint8_t * to) {
169
+ uint8_t pipe_num = ( RF24_getStatus () >> RX_P_NO ) & 0b0111 ;
174
170
#if defined(MY_DEBUG_VERBOSE_RF24)
175
171
if (pipe_num <= 5 )
176
172
RF24_DEBUG (PSTR (" Data available on pipe %d\n " ),pipe_num);
@@ -183,75 +179,77 @@ bool IsDataAvailable(uint8_t* to) {
183
179
}
184
180
185
181
186
- uint8_t readMessage ( void * buf) {
187
- uint8_t len = getDynamicPayloadSize ();
182
+ LOCAL uint8_t RF24_readMessage ( void * buf) {
183
+ uint8_t len = RF24_getDynamicPayloadSize ();
188
184
RF24_DEBUG (PSTR (" read message, len=%d\n " ), len);
189
- spiMultiByteTransfer ( R_RX_PAYLOAD , (uint8_t *)buf, len, true );
185
+ RF24_spiMultiByteTransfer ( R_RX_PAYLOAD , (uint8_t *)buf, len, true );
190
186
// clear RX interrupt
191
- writeByteRegister (RF24_STATUS, _BV (RX_DR) );
187
+ RF24_writeByteRegister (RF24_STATUS, _BV (RX_DR) );
192
188
return len;
193
189
}
194
190
195
- void setNodeAddress (uint8_t address) {
196
- MY_RF24_NODE_ADDRESS = address;
197
- // enable node pipe
198
- writeByteRegister (EN_RXADDR, _BV (ERX_P0 + BROADCAST_PIPE) | _BV (ERX_P0) );
199
- // enable autoACK on pipe 0
200
- writeByteRegister (EN_AA, _BV (ENAA_P0) );
191
+ LOCAL void RF24_setNodeAddress (uint8_t address) {
192
+ if (address!=AUTO){
193
+ MY_RF24_NODE_ADDRESS = address;
194
+ // enable node pipe
195
+ RF24_writeByteRegister (EN_RXADDR, _BV (ERX_P0 + BROADCAST_PIPE) | _BV (ERX_P0) );
196
+ // enable autoACK on pipe 0
197
+ RF24_writeByteRegister (EN_AA, _BV (ENAA_P0) );
198
+ }
201
199
}
202
200
203
- uint8_t getNodeID (void ) {
201
+ LOCAL uint8_t RF24_getNodeID (void ) {
204
202
return MY_RF24_NODE_ADDRESS;
205
203
}
206
204
207
- bool initializeRF24 (void ) {
205
+ LOCAL bool RF24_initialize (void ) {
208
206
// Initialize pins
209
207
pinMode (MY_RF24_CE_PIN,OUTPUT);
210
208
pinMode (MY_RF24_CS_PIN,OUTPUT);
211
209
// Initialize SPI
212
210
_SPI.begin ();
213
- ce (LOW);
214
- csn (HIGH);
211
+ RF24_ce (LOW);
212
+ RF24_csn (HIGH);
215
213
// CRC and power up
216
- writeByteRegister (NRF_CONFIG, MY_RF24_CONFIGURATION | _BV (PWR_UP) ) ;
214
+ RF24_writeByteRegister (NRF_CONFIG, MY_RF24_CONFIGURATION | _BV (PWR_UP) ) ;
217
215
// settle >2ms
218
216
delay (5 );
219
217
// set address width
220
- writeByteRegister (SETUP_AW, MY_RF24_ADDR_WIDTH - 2 );
218
+ RF24_writeByteRegister (SETUP_AW, MY_RF24_ADDR_WIDTH - 2 );
221
219
// auto retransmit delay 1500us, auto retransmit count 15
222
- writeByteRegister (SETUP_RETR, RF24_ARD << ARD | RF24_ARC << ARC);
220
+ RF24_writeByteRegister (SETUP_RETR, RF24_ARD << ARD | RF24_ARC << ARC);
223
221
// set channel
224
- writeByteRegister (RF_CH, MY_RF24_CHANNEL);
222
+ RF24_writeByteRegister (RF_CH, MY_RF24_CHANNEL);
225
223
// set data rate and pa level
226
- writeByteRegister (RF_SETUP, MY_RF24_RF_SETUP);
224
+ RF24_writeByteRegister (RF_SETUP, MY_RF24_RF_SETUP);
227
225
// sanity check
228
226
#if defined(MY_RF24_SANITY_CHECK)
229
- if (readByteRegister (RF_SETUP)!=MY_RF24_RF_SETUP) {
230
- RF24_DEBUG (PSTR (" Sanity check failed: RF_SETUP register=%d instead of %d, check wiring, replace module or non-P version\n " ),readByteRegister (RF_SETUP), MY_RF24_RF_SETUP);
227
+ if (RF24_readByteRegister (RF_SETUP)!=MY_RF24_RF_SETUP) {
228
+ RF24_DEBUG (PSTR (" Sanity check failed: RF_SETUP register=%d instead of %d, check wiring, replace module or non-P version\n " ),RF24_readByteRegister (RF_SETUP), MY_RF24_RF_SETUP);
231
229
return false ;
232
230
}
233
231
#endif
234
232
// toggle features (necessary on some clones)
235
- writeByteRegister (ACTIVATE,0x73 );
233
+ RF24_writeByteRegister (ACTIVATE,0x73 );
236
234
// enable ACK payload and dynamic payload
237
- writeByteRegister (FEATURE, MY_RF24_FEATURE );
235
+ RF24_writeByteRegister (FEATURE, MY_RF24_FEATURE );
238
236
// enable broadcasting pipe
239
- writeByteRegister (EN_RXADDR, _BV (ERX_P0 + BROADCAST_PIPE) );
237
+ RF24_writeByteRegister (EN_RXADDR, _BV (ERX_P0 + BROADCAST_PIPE) );
240
238
// disable AA on all pipes, activate when node pipe set
241
- writeByteRegister (EN_AA, 0x00 );
239
+ RF24_writeByteRegister (EN_AA, 0x00 );
242
240
// enable dynamic payloads on used pipes
243
- writeByteRegister (DYNPD, _BV (DPL_P0 + BROADCAST_PIPE) | _BV (DPL_P0));
241
+ RF24_writeByteRegister (DYNPD, _BV (DPL_P0 + BROADCAST_PIPE) | _BV (DPL_P0));
244
242
// listen to broadcast pipe
245
243
MY_RF24_BASE_ADDR[0 ] = BROADCAST_ADDRESS;
246
- writeMultiByteRegister (RX_ADDR_P0 + BROADCAST_PIPE, (uint8_t *)&MY_RF24_BASE_ADDR, BROADCAST_PIPE > 1 ? 1 : MY_RF24_ADDR_WIDTH);
244
+ RF24_writeMultiByteRegister (RX_ADDR_P0 + BROADCAST_PIPE, (uint8_t *)&MY_RF24_BASE_ADDR, BROADCAST_PIPE > 1 ? 1 : MY_RF24_ADDR_WIDTH);
247
245
// pipe 0, set full address, later only LSB is updated
248
- writeMultiByteRegister (RX_ADDR_P0, (uint8_t *)&MY_RF24_BASE_ADDR, MY_RF24_ADDR_WIDTH);
249
- writeMultiByteRegister (TX_ADDR, (uint8_t *)&MY_RF24_BASE_ADDR, MY_RF24_ADDR_WIDTH);
246
+ RF24_writeMultiByteRegister (RX_ADDR_P0, (uint8_t *)&MY_RF24_BASE_ADDR, MY_RF24_ADDR_WIDTH);
247
+ RF24_writeMultiByteRegister (TX_ADDR, (uint8_t *)&MY_RF24_BASE_ADDR, MY_RF24_ADDR_WIDTH);
250
248
// reset FIFO
251
- flushRX ();
252
- flushTX ();
249
+ RF24_flushRX ();
250
+ RF24_flushTX ();
253
251
// reset interrupts
254
- writeByteRegister (RF24_STATUS, _BV (TX_DS) | _BV (MAX_RT) | _BV (RX_DR));
252
+ RF24_writeByteRegister (RF24_STATUS, _BV (TX_DS) | _BV (MAX_RT) | _BV (RX_DR));
255
253
return true ;
256
254
}
257
255
0 commit comments