From daa8762f7165191149385ecb9b193ec0d696cc08 Mon Sep 17 00:00:00 2001 From: mikeller Date: Thu, 11 Jan 2018 21:23:35 +1300 Subject: [PATCH] Improved FrSky SPI RX detection / LED output. --- src/main/rx/cc2500_frsky_common.h | 2 +- src/main/rx/cc2500_frsky_d.c | 8 ++--- src/main/rx/cc2500_frsky_shared.c | 58 +++++++++++++++++++++---------- src/main/rx/cc2500_frsky_shared.h | 6 ++-- src/main/rx/cc2500_frsky_x.c | 8 ++--- src/main/rx/flysky.c | 4 ++- src/main/rx/flysky.h | 3 +- src/main/rx/nrf24_cx10.c | 4 ++- src/main/rx/nrf24_cx10.h | 2 +- src/main/rx/nrf24_h8_3d.c | 4 ++- src/main/rx/nrf24_h8_3d.h | 2 +- src/main/rx/nrf24_inav.c | 4 ++- src/main/rx/nrf24_inav.h | 2 +- src/main/rx/nrf24_syma.c | 4 ++- src/main/rx/nrf24_syma.h | 2 +- src/main/rx/nrf24_v202.c | 4 ++- src/main/rx/nrf24_v202.h | 2 +- src/main/rx/rx_spi.c | 5 ++- 18 files changed, 79 insertions(+), 45 deletions(-) diff --git a/src/main/rx/cc2500_frsky_common.h b/src/main/rx/cc2500_frsky_common.h index a9c4e2e673..679bc614a2 100644 --- a/src/main/rx/cc2500_frsky_common.h +++ b/src/main/rx/cc2500_frsky_common.h @@ -31,7 +31,7 @@ typedef struct rxFrSkySpiConfig_s { PG_DECLARE(rxFrSkySpiConfig_t, rxFrSkySpiConfig); -void frSkySpiInit(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig); +bool frSkySpiInit(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig); rx_spi_received_e frSkySpiDataReceived(uint8_t *packet); void frSkySpiSetRcData(uint16_t *rcData, const uint8_t *payload); diff --git a/src/main/rx/cc2500_frsky_d.c b/src/main/rx/cc2500_frsky_d.c index c7240cde42..a33c93c544 100644 --- a/src/main/rx/cc2500_frsky_d.c +++ b/src/main/rx/cc2500_frsky_d.c @@ -204,7 +204,7 @@ rx_spi_received_e frSkyDHandlePacket(uint8_t * const packet, uint8_t * const pro if (packet[0] == 0x11) { if ((packet[1] == rxFrSkySpiConfig()->bindTxId[0]) && (packet[2] == rxFrSkySpiConfig()->bindTxId[1])) { - IOHi(frSkyLedPin); + LedOn(); nextChannel(1); #if defined(USE_RX_FRSKY_SPI_TELEMETRY) if ((packet[3] % 4) == 2) { @@ -228,7 +228,7 @@ rx_spi_received_e frSkyDHandlePacket(uint8_t * const packet, uint8_t * const pro if (cmpTimeUs(currentPacketReceivedTime, lastPacketReceivedTime) > (timeoutUs * SYNC_DELAY_MAX)) { #if defined(USE_RX_FRSKY_SPI_PA_LNA) - RxEnable(); + TxDisable(); #endif if (timeoutUs == 1) { #if defined(USE_RX_FRSKY_SPI_PA_LNA) && defined(USE_RX_FRSKY_SPI_DIVERSITY) // SE4311 chip @@ -249,9 +249,9 @@ rx_spi_received_e frSkyDHandlePacket(uint8_t * const packet, uint8_t * const pro nextChannel(1); } else { if (ledIsOn) { - IOLo(frSkyLedPin); + LedOff(); } else { - IOHi(frSkyLedPin); + LedOn(); } ledIsOn = !ledIsOn; diff --git a/src/main/rx/cc2500_frsky_shared.c b/src/main/rx/cc2500_frsky_shared.c index e162560791..3714a16411 100644 --- a/src/main/rx/cc2500_frsky_shared.c +++ b/src/main/rx/cc2500_frsky_shared.c @@ -66,7 +66,7 @@ static setRcDataFn *setRcData; IO_t gdoPin; static IO_t bindPin = DEFIO_IO(NONE); -IO_t frSkyLedPin; +static IO_t frSkyLedPin; #if defined(USE_RX_FRSKY_SPI_PA_LNA) static IO_t txEnPin; @@ -105,17 +105,35 @@ void setRssiDbm(uint8_t value) #endif // USE_RX_FRSKY_SPI_TELEMETRY #if defined(USE_RX_FRSKY_SPI_PA_LNA) -void RxEnable(void) -{ - IOLo(txEnPin); -} - void TxEnable(void) { IOHi(txEnPin); } + +void TxDisable(void) +{ + IOLo(txEnPin); +} #endif +void LedOn(void) +{ +#if defined(RX_FRSKY_SPI_LED_PIN_INVERTED) + IOLo(frSkyLedPin); +#else + IOHi(frSkyLedPin); +#endif +} + +void LedOff(void) +{ +#if defined(RX_FRSKY_SPI_LED_PIN_INVERTED) + IOHi(frSkyLedPin); +#else + IOLo(frSkyLedPin); +#endif +} + void frSkySpiBind(void) { bindRequested = true; @@ -381,7 +399,7 @@ rx_spi_received_e frSkySpiDataReceived(uint8_t *packet) break; case STATE_BIND: if (checkBindRequested(true) || rxFrSkySpiConfig()->autoBind) { - IOHi(frSkyLedPin); + LedOn(); initTuneRx(); protocolState = STATE_BIND_TUNING; @@ -419,9 +437,9 @@ rx_spi_received_e frSkySpiDataReceived(uint8_t *packet) } else { uint8_t ctr = 40; while (ctr--) { - IOHi(frSkyLedPin); + LedOn(); delay(50); - IOLo(frSkyLedPin); + LedOff(); delay(50); } } @@ -481,22 +499,24 @@ void switchAntennae(void) static bool frSkySpiDetect(void) { - uint8_t tmp[2]; - tmp[0] = cc2500ReadReg(CC2500_30_PARTNUM | CC2500_READ_BURST); //CC2500 read registers chip part num - tmp[1] = cc2500ReadReg(CC2500_31_VERSION | CC2500_READ_BURST); //CC2500 read registers chip version - if (tmp[0] == 0x80 && tmp[1]==0x03){ + const uint8_t chipPartNum = cc2500ReadReg(CC2500_30_PARTNUM | CC2500_READ_BURST); //CC2500 read registers chip part num + const uint8_t chipVersion = cc2500ReadReg(CC2500_31_VERSION | CC2500_READ_BURST); //CC2500 read registers chip version + if (chipPartNum == 0x80 && chipVersion == 0x03) { return true; } + return false; } -void frSkySpiInit(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig) +bool frSkySpiInit(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig) { +#if !defined(RX_FRSKY_SPI_DISABLE_CHIP_DETECTION) if (!frSkySpiDetect()) { - rxRuntimeConfig->channelCount = 0; - - return; + return false; } +#else + UNUSED(frSkySpiDetect); +#endif spiProtocol = rxConfig->rx_spi_protocol; @@ -561,7 +581,7 @@ void frSkySpiInit(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig #if defined(USE_RX_FRSKY_SPI_DIVERSITY) IOHi(antSelPin); #endif - RxEnable(); + TxDisable(); #endif // USE_RX_FRSKY_SPI_PA_LNA missingPackets = 0; @@ -569,5 +589,7 @@ void frSkySpiInit(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig start_time = millis(); protocolState = STATE_INIT; + + return true; } #endif diff --git a/src/main/rx/cc2500_frsky_shared.h b/src/main/rx/cc2500_frsky_shared.h index a1957def55..36b91cdad9 100644 --- a/src/main/rx/cc2500_frsky_shared.h +++ b/src/main/rx/cc2500_frsky_shared.h @@ -47,12 +47,14 @@ extern timeDelta_t timeoutUs; extern int16_t rssiDbm; extern IO_t gdoPin; -extern IO_t frSkyLedPin; void setRssiDbm(uint8_t value); -void RxEnable(void); void TxEnable(void); +void TxDisable(void); + +void LedOn(void); +void LedOff(void); void switchAntennae(void); diff --git a/src/main/rx/cc2500_frsky_x.c b/src/main/rx/cc2500_frsky_x.c index 94ca0820ec..b86f8b4b4f 100644 --- a/src/main/rx/cc2500_frsky_x.c +++ b/src/main/rx/cc2500_frsky_x.c @@ -351,7 +351,7 @@ rx_spi_received_e frSkyXHandlePacket(uint8_t * const packet, uint8_t * const pro missingPackets = 0; timeoutUs = 1; receiveDelayUs = 0; - IOHi(frSkyLedPin); + LedOn(); if (skipChannels) { channelsToSkip = packet[5] << 2; if (packet[4] >= listLength) { @@ -431,9 +431,9 @@ rx_spi_received_e frSkyXHandlePacket(uint8_t * const packet, uint8_t * const pro } if (cmpTimeUs(micros(), packetTimerUs) > timeoutUs * SYNC_DELAY_MAX) { if (ledIsOn) { - IOLo(frSkyLedPin); + LedOff(); } else { - IOHi(frSkyLedPin); + LedOn(); } ledIsOn = !ledIsOn; @@ -500,7 +500,7 @@ rx_spi_received_e frSkyXHandlePacket(uint8_t * const packet, uint8_t * const pro nextChannel(channelsToSkip); cc2500Strobe(CC2500_SRX); #ifdef USE_RX_FRSKY_SPI_PA_LNA - RxEnable(); + TxDisable(); #if defined(USE_RX_FRSKY_SPI_DIVERSITY) if (missingPackets >= 2) { switchAntennae(); diff --git a/src/main/rx/flysky.c b/src/main/rx/flysky.c index 579154fd75..b7e151483a 100644 --- a/src/main/rx/flysky.c +++ b/src/main/rx/flysky.c @@ -349,7 +349,7 @@ static rx_spi_received_e flySkyReadAndProcess (uint8_t *payload, const uint32_t return result; } -void flySkyInit (const struct rxConfig_s *rxConfig, struct rxRuntimeConfig_s *rxRuntimeConfig) +bool flySkyInit (const struct rxConfig_s *rxConfig, struct rxRuntimeConfig_s *rxRuntimeConfig) { protocol = rxConfig->rx_spi_protocol; @@ -395,6 +395,8 @@ void flySkyInit (const struct rxConfig_s *rxConfig, struct rxRuntimeConfig_s *rx A7105Strobe(A7105_RX); // start listening resetTimeout(micros()); + + return true; } void flySkySetRcDataFromPayload (uint16_t *rcData, const uint8_t *payload) diff --git a/src/main/rx/flysky.h b/src/main/rx/flysky.h index 105e160968..2917c154ca 100644 --- a/src/main/rx/flysky.h +++ b/src/main/rx/flysky.h @@ -30,7 +30,6 @@ PG_DECLARE(flySkyConfig_t, flySkyConfig); struct rxConfig_s; struct rxRuntimeConfig_s; -void flySkyInit(const struct rxConfig_s *rxConfig, - struct rxRuntimeConfig_s *rxRuntimeConfig); +bool flySkyInit(const struct rxConfig_s *rxConfig, struct rxRuntimeConfig_s *rxRuntimeConfig); void flySkySetRcDataFromPayload(uint16_t *rcData, const uint8_t *payload); rx_spi_received_e flySkyDataReceived(uint8_t *payload); diff --git a/src/main/rx/nrf24_cx10.c b/src/main/rx/nrf24_cx10.c index f51dba595a..8ca88bc6eb 100644 --- a/src/main/rx/nrf24_cx10.c +++ b/src/main/rx/nrf24_cx10.c @@ -294,9 +294,11 @@ static void cx10Nrf24Setup(rx_spi_protocol_e protocol) NRF24L01_SetRxMode(); // enter receive mode to start listening for packets } -void cx10Nrf24Init(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig) +bool cx10Nrf24Init(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig) { rxRuntimeConfig->channelCount = RC_CHANNEL_COUNT; cx10Nrf24Setup((rx_spi_protocol_e)rxConfig->rx_spi_protocol); + + return true; } #endif diff --git a/src/main/rx/nrf24_cx10.h b/src/main/rx/nrf24_cx10.h index 408e7845dc..53ef8699bc 100644 --- a/src/main/rx/nrf24_cx10.h +++ b/src/main/rx/nrf24_cx10.h @@ -22,6 +22,6 @@ struct rxConfig_s; struct rxRuntimeConfig_s; -void cx10Nrf24Init(const struct rxConfig_s *rxConfig, struct rxRuntimeConfig_s *rxRuntimeConfig); +bool cx10Nrf24Init(const struct rxConfig_s *rxConfig, struct rxRuntimeConfig_s *rxRuntimeConfig); void cx10Nrf24SetRcDataFromPayload(uint16_t *rcData, const uint8_t *payload); rx_spi_received_e cx10Nrf24DataReceived(uint8_t *payload); diff --git a/src/main/rx/nrf24_h8_3d.c b/src/main/rx/nrf24_h8_3d.c index 54a9938f24..5d3f320a9d 100644 --- a/src/main/rx/nrf24_h8_3d.c +++ b/src/main/rx/nrf24_h8_3d.c @@ -278,9 +278,11 @@ static void h8_3dNrf24Setup(rx_spi_protocol_e protocol, const uint32_t *rxSpiId) NRF24L01_SetRxMode(); // enter receive mode to start listening for packets } -void h8_3dNrf24Init(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig) +bool h8_3dNrf24Init(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig) { rxRuntimeConfig->channelCount = RC_CHANNEL_COUNT; h8_3dNrf24Setup((rx_spi_protocol_e)rxConfig->rx_spi_protocol, &rxConfig->rx_spi_id); + + return true; } #endif diff --git a/src/main/rx/nrf24_h8_3d.h b/src/main/rx/nrf24_h8_3d.h index 306259f9aa..38340f9a96 100644 --- a/src/main/rx/nrf24_h8_3d.h +++ b/src/main/rx/nrf24_h8_3d.h @@ -22,6 +22,6 @@ struct rxConfig_s; struct rxRuntimeConfig_s; -void h8_3dNrf24Init(const struct rxConfig_s *rxConfig, struct rxRuntimeConfig_s *rxRuntimeConfig); +bool h8_3dNrf24Init(const struct rxConfig_s *rxConfig, struct rxRuntimeConfig_s *rxRuntimeConfig); void h8_3dNrf24SetRcDataFromPayload(uint16_t *rcData, const uint8_t *payload); rx_spi_received_e h8_3dNrf24DataReceived(uint8_t *payload); diff --git a/src/main/rx/nrf24_inav.c b/src/main/rx/nrf24_inav.c index 0bd9bb5776..f64c2413b4 100644 --- a/src/main/rx/nrf24_inav.c +++ b/src/main/rx/nrf24_inav.c @@ -419,9 +419,11 @@ static void inavNrf24Setup(rx_spi_protocol_e protocol, const uint32_t *rxSpiId, writeAckPayload(ackPayload, payloadSize); } -void inavNrf24Init(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig) +bool inavNrf24Init(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig) { rxRuntimeConfig->channelCount = RC_CHANNEL_COUNT_MAX; inavNrf24Setup((rx_spi_protocol_e)rxConfig->rx_spi_protocol, &rxConfig->rx_spi_id, rxConfig->rx_spi_rf_channel_count); + + return true; } #endif diff --git a/src/main/rx/nrf24_inav.h b/src/main/rx/nrf24_inav.h index f499f12a3a..4788f92438 100644 --- a/src/main/rx/nrf24_inav.h +++ b/src/main/rx/nrf24_inav.h @@ -22,7 +22,7 @@ struct rxConfig_s; struct rxRuntimeConfig_s; -void inavNrf24Init(const struct rxConfig_s *rxConfig, struct rxRuntimeConfig_s *rxRuntimeConfig); +bool inavNrf24Init(const struct rxConfig_s *rxConfig, struct rxRuntimeConfig_s *rxRuntimeConfig); void inavNrf24SetRcDataFromPayload(uint16_t *rcData, const uint8_t *payload); rx_spi_received_e inavNrf24DataReceived(uint8_t *payload); diff --git a/src/main/rx/nrf24_syma.c b/src/main/rx/nrf24_syma.c index cd3498b288..e6104dbdb4 100644 --- a/src/main/rx/nrf24_syma.c +++ b/src/main/rx/nrf24_syma.c @@ -294,9 +294,11 @@ static void symaNrf24Setup(rx_spi_protocol_e protocol) NRF24L01_SetRxMode(); // enter receive mode to start listening for packets } -void symaNrf24Init(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig) +bool symaNrf24Init(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig) { rxRuntimeConfig->channelCount = RC_CHANNEL_COUNT; symaNrf24Setup((rx_spi_protocol_e)rxConfig->rx_spi_protocol); + + return true; } #endif diff --git a/src/main/rx/nrf24_syma.h b/src/main/rx/nrf24_syma.h index 688bbb99ee..49cea270a0 100644 --- a/src/main/rx/nrf24_syma.h +++ b/src/main/rx/nrf24_syma.h @@ -22,7 +22,7 @@ struct rxConfig_s; struct rxRuntimeConfig_s; -void symaNrf24Init(const struct rxConfig_s *rxConfig, struct rxRuntimeConfig_s *rxRuntimeConfig); +bool symaNrf24Init(const struct rxConfig_s *rxConfig, struct rxRuntimeConfig_s *rxRuntimeConfig); void symaNrf24SetRcDataFromPayload(uint16_t *rcData, const uint8_t *payload); rx_spi_received_e symaNrf24DataReceived(uint8_t *payload); diff --git a/src/main/rx/nrf24_v202.c b/src/main/rx/nrf24_v202.c index f542b7dbe2..480104dafd 100644 --- a/src/main/rx/nrf24_v202.c +++ b/src/main/rx/nrf24_v202.c @@ -254,9 +254,11 @@ static void v202Nrf24Setup(rx_spi_protocol_e protocol) NRF24L01_SetRxMode(); // enter receive mode to start listening for packets } -void v202Nrf24Init(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig) +bool v202Nrf24Init(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig) { rxRuntimeConfig->channelCount = V2X2_RC_CHANNEL_COUNT; v202Nrf24Setup((rx_spi_protocol_e)rxConfig->rx_spi_protocol); + + return true; } #endif diff --git a/src/main/rx/nrf24_v202.h b/src/main/rx/nrf24_v202.h index f3600ad7d0..70f356ca82 100644 --- a/src/main/rx/nrf24_v202.h +++ b/src/main/rx/nrf24_v202.h @@ -22,6 +22,6 @@ struct rxConfig_s; struct rxRuntimeConfig_s; -void v202Nrf24Init(const struct rxConfig_s *rxConfig, struct rxRuntimeConfig_s *rxRuntimeConfig); +bool v202Nrf24Init(const struct rxConfig_s *rxConfig, struct rxRuntimeConfig_s *rxRuntimeConfig); void v202Nrf24SetRcDataFromPayload(uint16_t *rcData, const uint8_t *payload); rx_spi_received_e v202Nrf24DataReceived(uint8_t *payload); diff --git a/src/main/rx/rx_spi.c b/src/main/rx/rx_spi.c index 06b3fc6c84..0dbe00a9a8 100644 --- a/src/main/rx/rx_spi.c +++ b/src/main/rx/rx_spi.c @@ -48,7 +48,7 @@ uint16_t rxSpiRcData[MAX_SUPPORTED_RC_CHANNEL_COUNT]; STATIC_UNIT_TESTED uint8_t rxSpiPayload[RX_SPI_MAX_PAYLOAD_SIZE]; STATIC_UNIT_TESTED uint8_t rxSpiNewPacketAvailable; // set true when a new packet is received -typedef void (*protocolInitFnPtr)(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig); +typedef bool (*protocolInitFnPtr)(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig); typedef rx_spi_received_e (*protocolDataReceivedFnPtr)(uint8_t *payload); typedef void (*protocolSetRcDataFromPayloadFnPtr)(uint16_t *rcData, const uint8_t *payload); @@ -163,8 +163,7 @@ bool rxSpiInit(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig) const rx_spi_type_e spiType = feature(FEATURE_SOFTSPI) ? RX_SPI_SOFTSPI : RX_SPI_HARDSPI; rxSpiDeviceInit(spiType); if (rxSpiSetProtocol(rxConfig->rx_spi_protocol)) { - protocolInit(rxConfig, rxRuntimeConfig); - ret = true; + ret = protocolInit(rxConfig, rxRuntimeConfig); } rxSpiNewPacketAvailable = false; rxRuntimeConfig->rxRefreshRate = 20000;