Paparazzi UAS  v5.18.0_stable
Paparazzi is a free software Unmanned Aircraft System.
cc2500_frsky_shared.c
Go to the documentation of this file.
1 #include "cc2500_compat.h"
2 
3 #include "peripherals/cc2500.h"
4 #include "cc2500_settings.h"
5 #include "cc2500_rx_spi_common.h"
6 #include "cc2500_common.h"
7 #include "cc2500_frsky_common.h"
8 #include "cc2500_frsky_d.h"
9 #include "cc2500_frsky_x.h"
10 #include "cc2500_frsky_shared.h"
11 
12 // betaflight/src/main/rx/cc2500_frsky_shared.c @ 766c90b
13 /*
14  * This file is part of Cleanflight and Betaflight.
15  *
16  * Cleanflight and Betaflight are free software. You can redistribute
17  * this software and/or modify this software under the terms of the
18  * GNU General Public License as published by the Free Software
19  * Foundation, either version 3 of the License, or (at your option)
20  * any later version.
21  *
22  * Cleanflight and Betaflight are distributed in the hope that they
23  * will be useful, but WITHOUT ANY WARRANTY; without even the implied
24  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
25  * See the GNU General Public License for more details.
26  *
27  * You should have received a copy of the GNU General Public License
28  * along with this software.
29  *
30  * If not, see <http://www.gnu.org/licenses/>.
31  */
32 
33 #include <stdbool.h>
34 
35 //#include "platform.h"
36 
37 #ifdef USE_RX_FRSKY_SPI
38 
39 //#include "common/maths.h"
40 //
41 //#include "drivers/rx/rx_cc2500.h"
42 //#include "drivers/io.h"
43 //#include "drivers/time.h"
44 //
45 //#include "fc/config.h"
46 //
47 //#include "pg/rx.h"
48 //#include "pg/rx_spi.h"
49 //#include "pg/rx_spi_cc2500.h"
50 //
51 //#include "rx/rx.h"
52 //#include "rx/rx_spi.h"
53 //#include "rx/rx_spi_common.h"
54 //
55 //#include "rx/cc2500_common.h"
56 //#include "rx/cc2500_frsky_common.h"
57 //#include "rx/cc2500_frsky_d.h"
58 //#include "rx/cc2500_frsky_x.h"
59 //
60 //#include "cc2500_frsky_shared.h"
61 
63 
66 
69 
70 static uint8_t calData[255][3];
75 
76 typedef uint8_t handlePacketFn(uint8_t * const packet, uint8_t * const protocolState);
77 typedef rx_spi_received_e processFrameFn(uint8_t * const packet);
78 typedef void setRcDataFn(uint16_t *rcData, const uint8_t *payload);
79 
83 
84 static void initialise() {
85  cc2500Reset();
111 
112  switch (spiProtocol) {
113  case RX_SPI_FRSKY_D:
124 
125  break;
126  case RX_SPI_FRSKY_X:
137 
138  break;
139  case RX_SPI_FRSKY_X_LBT:
150 
151  break;
152  default:
153 
154  break;
155  }
156 
157  for(unsigned c = 0;c < 0xFF; c++)
158  { //calibrate all channels
162  delayMicroseconds(900); //
166  }
167 }
168 
169 void initialiseData(bool inBindState)
170 {
173  cc2500WriteReg(CC2500_09_ADDR, inBindState ? 0x03 : rxCc2500SpiConfig()->bindTxId[0]);
176  if (!inBindState) {
178  }
179  delay(10);
180 }
181 
182 static void initTuneRx(void)
183 {
185  timeTunedMs = millis();
186  bindOffset = -126;
190 
198 }
199 
200 static bool tuneRx(uint8_t *packet)
201 {
202  if (bindOffset >= 126) {
203  bindOffset = -126;
204  }
205  if ((millis() - timeTunedMs) > 50) {
206  timeTunedMs = millis();
207  bindOffset += 5;
209  }
210  if (cc2500getGdo()) {
212  if (ccLen) {
213  cc2500ReadFifo(packet, ccLen);
214  if (packet[ccLen - 1] & 0x80) {
215  if (packet[2] == 0x01) {
216  uint8_t Lqi = packet[ccLen - 1] & 0x7F;
217  // higher lqi represent better link quality
218  if (Lqi > 50) {
220  return true;
221  }
222  }
223  }
224  }
225  }
226 
227  return false;
228 }
229 
230 static void initGetBind(void)
231 {
238  delayMicroseconds(20); // waiting flush FIFO
239 
241  listLength = 0;
242  bindIdx = 0x05;
243 }
244 
245 static bool getBind1(uint8_t *packet)
246 {
247  // len|bind |tx
248  // id|03|01|idx|h0|h1|h2|h3|h4|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|CHK1|CHK2|RSSI|LQI/CRC|
249  // Start by getting bind packet 0 and the txid
250  if (cc2500getGdo()) {
252  if (ccLen) {
253  cc2500ReadFifo(packet, ccLen);
254  if (packet[ccLen - 1] & 0x80) {
255  if (packet[2] == 0x01) {
256  if (packet[5] == 0x00) {
257  rxCc2500SpiConfigMutable()->bindTxId[0] = packet[3];
258  rxCc2500SpiConfigMutable()->bindTxId[1] = packet[4];
259  for (uint8_t n = 0; n < 5; n++) {
260  rxCc2500SpiConfigMutable()->bindHopData[packet[5] + n] =
261  packet[6 + n];
262  }
263 
264  rxCc2500SpiConfigMutable()->rxNum = packet[12];
265 
266  return true;
267  }
268  }
269  }
270  }
271  }
272 
273  return false;
274 }
275 
276 static bool getBind2(uint8_t *packet)
277 {
278  if (bindIdx <= 120) {
279  if (cc2500getGdo()) {
281  if (ccLen) {
282  cc2500ReadFifo(packet, ccLen);
283  if (packet[ccLen - 1] & 0x80) {
284  if (packet[2] == 0x01) {
285  if ((packet[3] == rxCc2500SpiConfig()->bindTxId[0]) &&
286  (packet[4] == rxCc2500SpiConfig()->bindTxId[1])) {
287  if (packet[5] == bindIdx) {
288 #if defined(DJTS)
289  if (packet[5] == 0x2D) {
290  for (uint8_t i = 0; i < 2; i++) {
291  rxCc2500SpiConfigMutable()->bindHopData[packet[5] + i] = packet[6 + i];
292  }
293  listLength = 47;
294 
295  return true;
296  }
297 #endif
298 
299  for (uint8_t n = 0; n < 5; n++) {
300  if (packet[6 + n] == packet[ccLen - 3] || (packet[6 + n] == 0)) {
301  if (bindIdx >= 0x2D) {
302  listLength = packet[5] + n;
303 
304  return true;
305  }
306  }
307 
308  rxCc2500SpiConfigMutable()->bindHopData[packet[5] + n] = packet[6 + n];
309  }
310 
311  bindIdx = bindIdx + 5;
312 
313  return false;
314  }
315  }
316  }
317  }
318  }
319  }
320 
321  return false;
322  } else {
323  return true;
324  }
325 }
326 
328 {
330 
331  switch (protocolState) {
332  case STATE_INIT:
333  if ((millis() - start_time) > 10) {
334  initialise();
335 
337  }
338 
339  break;
340  case STATE_BIND:
341  if (rxSpiCheckBindRequested(true) || rxCc2500SpiConfig()->autoBind) {
342  rxSpiLedOn();
343  initTuneRx();
344 
346  } else {
348  }
349 
350  break;
351  case STATE_BIND_TUNING:
352  if (tuneRx(packet)) {
353  initGetBind();
354  initialiseData(true);
355 
357  }
358 
359  break;
360  case STATE_BIND_BINDING1:
361  if (getBind1(packet)) {
363  }
364 
365  break;
366  case STATE_BIND_BINDING2:
367  if (getBind2(packet)) {
369 
371  }
372 
373  break;
374  case STATE_BIND_COMPLETE:
375  if (!rxCc2500SpiConfig()->autoBind) {
376  writeEEPROM();
377  } else {
378  uint8_t ctr = 80;
379  while (ctr--) {
380  rxSpiLedToggle();
381  delay(50);
382  }
383  }
384 
385  ret = RX_SPI_RECEIVED_BIND;
387 
388  break;
389  default:
390  ret = handlePacket(packet, &protocolState);
391 
392  break;
393  }
394 
395  return ret;
396 }
397 
399 {
400  if (processFrame) {
401  return processFrame(packet);
402  }
403 
404  return RX_SPI_RECEIVED_NONE;
405 }
406 
407 void frSkySpiSetRcData(uint16_t *rcData, const uint8_t *payload)
408 {
409  setRcData(rcData, payload);
410 }
411 
413 {
414  static uint8_t channr = 0;
415 
416  channr += skip;
417  while (channr >= listLength) {
418  channr -= listLength;
419  }
422  calData[rxCc2500SpiConfig()->bindHopData[channr]][0]);
424  calData[rxCc2500SpiConfig()->bindHopData[channr]][1]);
426  calData[rxCc2500SpiConfig()->bindHopData[channr]][2]);
427  cc2500WriteReg(CC2500_0A_CHANNR, rxCc2500SpiConfig()->bindHopData[channr]);
428  if (spiProtocol == RX_SPI_FRSKY_D) {
430  }
431 }
432 
434 {
436  if (!cc2500SpiInit()) {
437  return false;
438  }
439 
441 
442  switch (spiProtocol) {
443  case RX_SPI_FRSKY_D:
445 
448  frSkyDInit();
449 
450  break;
451  case RX_SPI_FRSKY_X:
452  case RX_SPI_FRSKY_X_LBT:
454 
456 #if defined(USE_RX_FRSKY_SPI_TELEMETRY) && defined(USE_TELEMETRY_SMARTPORT)
458 #endif
461 
462  break;
463  default:
464 
465  break;
466  }
467 
468 #if defined(USE_RX_FRSKY_SPI_TELEMETRY)
469  if (rssiSource == RSSI_SOURCE_NONE) {
471  }
472 #endif
473 
474  missingPackets = 0;
475  timeoutUs = 50;
476 
477  start_time = millis();
479 
480  return true;
481 }
482 #endif
initialiseData
void initialiseData(bool inBindState)
Definition: cc2500_frsky_shared.c:169
c
VIC slots used for the LPC2148 define name e g gps UART1_VIC_SLOT e g modem SPI1_VIC_SLOT SPI1 in mcu_periph spi_arch c or spi_slave_hs_arch c(and some others not using the SPI peripheral yet..) I2C0_VIC_SLOT 8 mcu_periph/i2c_arch.c I2C1_VIC_SLOT 9 mcu_periph/i2c_arch.c USB_VIC_SLOT 10 usb
CC2500_25_FSCAL1
@ CC2500_25_FSCAL1
Definition: cc2500.h:102
processFrameFn
rx_spi_received_e processFrameFn(uint8_t *const packet)
Definition: cc2500_frsky_shared.c:77
STATE_INIT
@ STATE_INIT
Definition: cc2500_frsky_shared.h:38
CC2500_1A_BSCFG
@ CC2500_1A_BSCFG
Definition: cc2500.h:91
CC2500_07_PKTCTRL1
@ CC2500_07_PKTCTRL1
Definition: cc2500.h:72
frSkyDHandlePacket
static rx_spi_received_e frSkyDHandlePacket(uint8_t *const packet, uint8_t *const protocolState)
Definition: cc2500_frsky_d.h:6
uint16_t
unsigned short uint16_t
Definition: types.h:16
initTuneRx
static void initTuneRx(void)
Definition: cc2500_frsky_shared.c:182
CC2500_SIDLE
#define CC2500_SIDLE
Definition: cc2500.h:155
CC2500_2E_TEST0
@ CC2500_2E_TEST0
Definition: cc2500.h:111
CC2500_13_MDMCFG1
@ CC2500_13_MDMCFG1
Definition: cc2500.h:84
rxSpiConfig_s::rx_spi_protocol
uint8_t rx_spi_protocol
Definition: cc2500_settings.h:98
STATE_BIND_BINDING2
@ STATE_BIND_BINDING2
Definition: cc2500_frsky_shared.h:42
frSkyDSetRcData
static void frSkyDSetRcData(uint16_t *rcData, const uint8_t *payload)
Definition: cc2500_frsky_d.h:12
frSkyXInit
void frSkyXInit(const rx_spi_protocol_e spiProtocol)
Definition: cc2500_frsky_x.c:582
millis
#define millis()
Definition: cc2500_compat.h:176
frSkySpiDataReceived
rx_spi_received_e frSkySpiDataReceived(uint8_t *packet)
Definition: cc2500_frsky_shared.c:327
frSkySpiProcessFrame
rx_spi_received_e frSkySpiProcessFrame(uint8_t *packet)
Definition: cc2500_frsky_shared.c:398
initialise
static void initialise()
Definition: cc2500_frsky_shared.c:84
setRcDataFn
void setRcDataFn(uint16_t *rcData, const uint8_t *payload)
Definition: cc2500_frsky_shared.c:78
rxCc2500SpiConfig
const rxCc2500SpiConfig_t * rxCc2500SpiConfig(void)
Definition: cc2500_settings.c:94
frSkyDInit
static void frSkyDInit(void)
Definition: cc2500_frsky_d.h:18
listLength
uint8_t listLength
Definition: cc2500_frsky_shared.c:72
rxCc2500SpiConfig_s::bindOffset
int8_t bindOffset
Definition: cc2500_settings.h:127
CC2500_0F_FREQ0
@ CC2500_0F_FREQ0
Definition: cc2500.h:80
CC2500_17_MCSM1
@ CC2500_17_MCSM1
Definition: cc2500.h:88
cc2500_frsky_x.h
RC_CHANNEL_COUNT_FRSKY_D
#define RC_CHANNEL_COUNT_FRSKY_D
Definition: cc2500_frsky_d.h:4
rcData
int16_t rcData[MAX_SUPPORTED_RC_CHANNEL_COUNT]
Definition: cc2500_rx.c:118
bindOffset
static int8_t bindOffset
Definition: cc2500_frsky_shared.c:74
CC2500_26_FSCAL0
@ CC2500_26_FSCAL0
Definition: cc2500.h:103
CC2500_24_FSCAL2
@ CC2500_24_FSCAL2
Definition: cc2500.h:101
CC2500_22_FREND0
@ CC2500_22_FREND0
Definition: cc2500.h:99
RX_SPI_FRSKY_D
@ RX_SPI_FRSKY_D
Definition: cc2500_rx_spi.h:43
timeDelta_t
int32_t timeDelta_t
Definition: cc2500_compat.h:91
uint32_t
unsigned long uint32_t
Definition: types.h:18
setRcData
static setRcDataFn * setRcData
Definition: cc2500_frsky_shared.c:82
STATE_STARTING
@ STATE_STARTING
Definition: cc2500_frsky_shared.h:44
CC2500_09_ADDR
@ CC2500_09_ADDR
Definition: cc2500.h:74
CC2500_0C_FSCTRL0
@ CC2500_0C_FSCTRL0
Definition: cc2500.h:77
frSkyXProcessFrame
rx_spi_received_e frSkyXProcessFrame(uint8_t *const packet)
Definition: cc2500_frsky_x.c:544
RX_SPI_RECEIVED_BIND
@ RX_SPI_RECEIVED_BIND
Definition: cc2500_rx_spi.h:56
rxCc2500SpiConfig_s::bindHopData
uint8_t bindHopData[50]
Definition: cc2500_settings.h:128
CC2500_0E_FREQ1
@ CC2500_0E_FREQ1
Definition: cc2500.h:79
cc2500SpiInit
bool cc2500SpiInit(void)
Definition: cc2500_common.c:127
STATE_BIND_BINDING1
@ STATE_BIND_BINDING1
Definition: cc2500_frsky_shared.h:41
CC2500_19_FOCCFG
@ CC2500_19_FOCCFG
Definition: cc2500.h:90
RX_SPI_FRSKY_X_LBT
@ RX_SPI_FRSKY_X_LBT
Definition: cc2500_rx_spi.h:50
rxSpiCheckBindRequested
bool rxSpiCheckBindRequested(bool reset)
Definition: cc2500_rx_spi_common.c:128
rssiSource
rssiSource_e rssiSource
Definition: cc2500_rx.c:100
frSkySpiSetRcData
void frSkySpiSetRcData(uint16_t *rcData, const uint8_t *payload)
Definition: cc2500_frsky_shared.c:407
protocolState
static uint8_t protocolState
Definition: cc2500_frsky_shared.c:65
cc2500Reset
uint8_t cc2500Reset(void)
Definition: cc2500.c:228
CC2500_0B_FSCTRL1
@ CC2500_0B_FSCTRL1
Definition: cc2500.h:76
CC2500_0D_FREQ2
@ CC2500_0D_FREQ2
Definition: cc2500.h:78
getBind2
static bool getBind2(uint8_t *packet)
Definition: cc2500_frsky_shared.c:276
cc2500getGdo
bool cc2500getGdo(void)
Definition: cc2500_common.c:80
cc2500_common.h
rxSpiCommonIOInit
void rxSpiCommonIOInit(const rxSpiConfig_t *rxSpiConfig)
Definition: cc2500_rx_spi_common.c:45
rxRuntimeConfig
rxRuntimeConfig_t rxRuntimeConfig
Definition: cc2500_rx.c:131
cc2500ReadReg
uint8_t cc2500ReadReg(uint8_t reg)
Definition: cc2500.c:199
bindIdx
static uint8_t bindIdx
Definition: cc2500_frsky_shared.c:73
rxSpiLedToggle
void rxSpiLedToggle(void)
Definition: cc2500_rx_spi_common.c:81
CC2500_06_PKTLEN
@ CC2500_06_PKTLEN
Definition: cc2500.h:71
CC2500_23_FSCAL3
@ CC2500_23_FSCAL3
Definition: cc2500.h:100
cc2500_frsky_common.h
CC2500_29_FSTEST
@ CC2500_29_FSTEST
Definition: cc2500.h:106
cc2500_settings.h
cc2500_frsky_d.h
CC2500_2D_TEST1
@ CC2500_2D_TEST1
Definition: cc2500.h:110
tuneRx
static bool tuneRx(uint8_t *packet)
Definition: cc2500_frsky_shared.c:200
processFrame
static processFrameFn * processFrame
Definition: cc2500_frsky_shared.c:81
STATE_BIND_COMPLETE
@ STATE_BIND_COMPLETE
Definition: cc2500_frsky_shared.h:43
CC2500_02_IOCFG0
@ CC2500_02_IOCFG0
Definition: cc2500.h:67
CC2500_08_PKTCTRL0
@ CC2500_08_PKTCTRL0
Definition: cc2500.h:73
uint8_t
unsigned char uint8_t
Definition: types.h:14
CC2500_2C_TEST2
@ CC2500_2C_TEST2
Definition: cc2500.h:109
rxSpiConfig
const rxSpiConfig_t * rxSpiConfig(void)
Definition: cc2500_settings.c:87
CC2500_1B_AGCCTRL2
@ CC2500_1B_AGCCTRL2
Definition: cc2500.h:92
writeEEPROM
#define writeEEPROM()
Definition: cc2500_settings.h:45
calData
static uint8_t calData[255][3]
Definition: cc2500_frsky_shared.c:70
delay
#define delay(ms)
Definition: cc2500_compat.h:171
RSSI_SOURCE_RX_PROTOCOL
@ RSSI_SOURCE_RX_PROTOCOL
Definition: cc2500_rx.h:158
rxSpiLedOn
void rxSpiLedOn(void)
Definition: cc2500_rx_spi_common.c:67
CC2500_SCAL
#define CC2500_SCAL
Definition: cc2500.h:146
timeoutUs
timeDelta_t timeoutUs
Definition: cc2500_frsky_shared.c:68
initGetBind
static void initGetBind(void)
Definition: cc2500_frsky_shared.c:230
cc2500Strobe
void cc2500Strobe(uint8_t address)
Definition: cc2500.c:204
CC2500_SRX
#define CC2500_SRX
Definition: cc2500.h:148
cc2500_frsky_shared.h
CC2500_0A_CHANNR
@ CC2500_0A_CHANNR
Definition: cc2500.h:75
frSkyXSetRcData
void frSkyXSetRcData(uint16_t *rcData, const uint8_t *packet)
Definition: cc2500_frsky_x.c:304
rxCc2500SpiConfig_s::bindTxId
uint8_t bindTxId[2]
Definition: cc2500_settings.h:126
CC2500_READ_BURST
#define CC2500_READ_BURST
Definition: cc2500.h:137
CC2500_10_MDMCFG4
@ CC2500_10_MDMCFG4
Definition: cc2500.h:81
spiProtocol
static rx_spi_protocol_e spiProtocol
Definition: cc2500_frsky_shared.c:62
CC2500_11_MDMCFG3
@ CC2500_11_MDMCFG3
Definition: cc2500.h:82
CC2500_21_FREND1
@ CC2500_21_FREND1
Definition: cc2500.h:98
delayMicroseconds
#define delayMicroseconds(us)
Definition: cc2500.c:70
getBind1
static bool getBind1(uint8_t *packet)
Definition: cc2500_frsky_shared.c:245
CC2500_1C_AGCCTRL1
@ CC2500_1C_AGCCTRL1
Definition: cc2500.h:93
int8_t
signed char int8_t
Definition: types.h:15
rxRuntimeConfig_s
Definition: cc2500_rx.h:142
RC_CHANNEL_COUNT_FRSKY_X
#define RC_CHANNEL_COUNT_FRSKY_X
Definition: cc2500_frsky_x.h:29
RX_SPI_RECEIVED_NONE
@ RX_SPI_RECEIVED_NONE
Definition: cc2500_rx_spi.h:55
CC2500_3E_PATABLE
@ CC2500_3E_PATABLE
Definition: cc2500.h:128
frSkyXHandlePacket
rx_spi_received_e frSkyXHandlePacket(uint8_t *const packet, uint8_t *const protocolState)
Definition: cc2500_frsky_x.c:340
RSSI_SOURCE_NONE
@ RSSI_SOURCE_NONE
Definition: cc2500_rx.h:155
rx_spi_protocol_e
rx_spi_protocol_e
Definition: cc2500_rx_spi.h:34
cc2500WriteReg
void cc2500WriteReg(uint8_t address, uint8_t data)
Definition: cc2500.c:206
CC2500_03_FIFOTHR
@ CC2500_03_FIFOTHR
Definition: cc2500.h:68
handlePacketFn
uint8_t handlePacketFn(uint8_t *const packet, uint8_t *const protocolState)
Definition: cc2500_frsky_shared.c:76
cc2500ReadFifo
void cc2500ReadFifo(uint8_t *dpbuffer, uint8_t len)
Definition: cc2500.c:174
CC2500_14_MDMCFG0
@ CC2500_14_MDMCFG0
Definition: cc2500.h:85
STATE_BIND_TUNING
@ STATE_BIND_TUNING
Definition: cc2500_frsky_shared.h:40
rxRuntimeConfig_s::channelCount
uint8_t channelCount
Definition: cc2500_rx.h:145
rxCc2500SpiConfig_s::rxNum
uint8_t rxNum
Definition: cc2500_settings.h:129
CC2500_15_DEVIATN
@ CC2500_15_DEVIATN
Definition: cc2500.h:86
timeTunedMs
static timeMs_t timeTunedMs
Definition: cc2500_frsky_shared.c:71
start_time
static timeMs_t start_time
Definition: cc2500_frsky_shared.c:64
RX_SPI_FRSKY_X
@ RX_SPI_FRSKY_X
Definition: cc2500_rx_spi.h:44
rx_spi_received_e
rx_spi_received_e
Definition: cc2500_rx_spi.h:54
cc2500_rx_spi_common.h
rxCc2500SpiConfigMutable
rxCc2500SpiConfig_t * rxCc2500SpiConfigMutable(void)
Definition: cc2500_settings.c:97
rxSpiConfig_s
Definition: cc2500_settings.h:96
STATE_BIND
@ STATE_BIND
Definition: cc2500_frsky_shared.h:39
CC2500_1D_AGCCTRL0
@ CC2500_1D_AGCCTRL0
Definition: cc2500.h:94
cc2500.h
CC2500_12_MDMCFG2
@ CC2500_12_MDMCFG2
Definition: cc2500.h:83
cc2500_compat.h
CC2500_18_MCSM0
@ CC2500_18_MCSM0
Definition: cc2500.h:89
handlePacket
static handlePacketFn * handlePacket
Definition: cc2500_frsky_shared.c:80
timeMs_t
uint32_t timeMs_t
Definition: cc2500_compat.h:92
nextChannel
void nextChannel(uint8_t skip)
Definition: cc2500_frsky_shared.c:412
missingPackets
uint32_t missingPackets
Definition: cc2500_frsky_shared.c:67
frSkySpiInit
bool frSkySpiInit(const rxSpiConfig_t *rxSpiConfig, rxRuntimeConfig_t *rxRuntimeConfig)
Definition: cc2500_frsky_shared.c:433
CC2500_SFRX
#define CC2500_SFRX
Definition: cc2500.h:161
CC2500_3B_RXBYTES
@ CC2500_3B_RXBYTES
Definition: cc2500.h:125