Cleanup of the FrSky SPI RX code.
This commit is contained in:
parent
bd84749e92
commit
a4ba8b3db8
|
@ -49,5 +49,6 @@ const char * const debugModeNames[DEBUG_COUNT] = {
|
|||
"ALTITUDE",
|
||||
"FFT",
|
||||
"FFT_TIME",
|
||||
"FFT_FREQ"
|
||||
"FFT_FREQ",
|
||||
"FRSKY_D_RX"
|
||||
};
|
||||
|
|
|
@ -68,6 +68,7 @@ typedef enum {
|
|||
DEBUG_FFT,
|
||||
DEBUG_FFT_TIME,
|
||||
DEBUG_FFT_FREQ,
|
||||
DEBUG_FRSKY_D_RX,
|
||||
DEBUG_COUNT
|
||||
} debugType_e;
|
||||
|
||||
|
|
|
@ -7,56 +7,56 @@
|
|||
|
||||
#include "platform.h"
|
||||
|
||||
#ifdef USE_RX_CC2500
|
||||
|
||||
#include "build/build_config.h"
|
||||
#include "cc2500.h"
|
||||
#include "io.h"
|
||||
#include "rx_spi.h"
|
||||
#include "system.h"
|
||||
#include "time.h"
|
||||
|
||||
#include "drivers/cc2500.h"
|
||||
#include "drivers/io.h"
|
||||
#include "drivers/rx_spi.h"
|
||||
#include "drivers/system.h"
|
||||
#include "drivers/time.h"
|
||||
|
||||
|
||||
#define NOP 0xFF
|
||||
|
||||
uint8_t cc2500_readFifo(uint8_t *dpbuffer, uint8_t len)
|
||||
uint8_t cc2500ReadFifo(uint8_t *dpbuffer, uint8_t len)
|
||||
{
|
||||
return rxSpiReadCommandMulti(CC2500_3F_RXFIFO | CC2500_READ_BURST, NOP, dpbuffer, len);
|
||||
}
|
||||
|
||||
uint8_t cc2500_writeFifo(uint8_t *dpbuffer, uint8_t len)
|
||||
uint8_t cc2500WriteFifo(uint8_t *dpbuffer, uint8_t len)
|
||||
{
|
||||
uint8_t ret;
|
||||
cc2500_strobe(CC2500_SFTX); // 0x3B SFTX
|
||||
cc2500Strobe(CC2500_SFTX); // 0x3B SFTX
|
||||
ret = rxSpiWriteCommandMulti(CC2500_3F_TXFIFO | CC2500_WRITE_BURST,
|
||||
dpbuffer, len);
|
||||
cc2500_strobe(CC2500_STX); // 0x35
|
||||
cc2500Strobe(CC2500_STX); // 0x35
|
||||
return ret;
|
||||
}
|
||||
|
||||
uint8_t cc2500_ReadRegisterMulti(uint8_t address, uint8_t *data, uint8_t length)
|
||||
uint8_t cc2500ReadRegisterMulti(uint8_t address, uint8_t *data, uint8_t length)
|
||||
{
|
||||
return rxSpiReadCommandMulti(address, NOP, data, length);
|
||||
}
|
||||
|
||||
uint8_t cc2500_WriteRegisterMulti(uint8_t address, uint8_t *data,
|
||||
uint8_t cc2500WriteRegisterMulti(uint8_t address, uint8_t *data,
|
||||
uint8_t length)
|
||||
{
|
||||
return rxSpiWriteCommandMulti(address, data, length);
|
||||
}
|
||||
|
||||
uint8_t cc2500_readReg(uint8_t reg)
|
||||
uint8_t cc2500ReadReg(uint8_t reg)
|
||||
{
|
||||
return rxSpiReadCommand(reg | 0x80, NOP);
|
||||
}
|
||||
|
||||
void cc2500_strobe(uint8_t address) { rxSpiWriteByte(address); }
|
||||
void cc2500Strobe(uint8_t address) { rxSpiWriteByte(address); }
|
||||
|
||||
uint8_t cc2500_writeReg(uint8_t address, uint8_t data)
|
||||
uint8_t cc2500WriteReg(uint8_t address, uint8_t data)
|
||||
{
|
||||
return rxSpiWriteCommand(address, data);
|
||||
}
|
||||
|
||||
void CC2500_SetPower(uint8_t power)
|
||||
void cc2500SetPower(uint8_t power)
|
||||
{
|
||||
const uint8_t patable[8] = {
|
||||
0xC5, // -12dbm
|
||||
|
@ -70,16 +70,15 @@ void CC2500_SetPower(uint8_t power)
|
|||
};
|
||||
if (power > 7)
|
||||
power = 7;
|
||||
cc2500_writeReg(CC2500_3E_PATABLE, patable[power]);
|
||||
cc2500WriteReg(CC2500_3E_PATABLE, patable[power]);
|
||||
}
|
||||
|
||||
uint8_t CC2500_Reset()
|
||||
uint8_t cc2500Reset()
|
||||
{
|
||||
cc2500_strobe(CC2500_SRES);
|
||||
cc2500Strobe(CC2500_SRES);
|
||||
delayMicroseconds(1000); // 1000us
|
||||
// CC2500_SetTxRxMode(TXRX_OFF);
|
||||
// RX_EN_off;//off tx
|
||||
// TX_EN_off;//off rx
|
||||
return cc2500_readReg(CC2500_0E_FREQ1) == 0xC4; // check if reset
|
||||
return cc2500ReadReg(CC2500_0E_FREQ1) == 0xC4; // check if reset
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -138,16 +138,16 @@ enum {
|
|||
#define CC2500_LQI_CRC_OK_BM 0x80
|
||||
#define CC2500_LQI_EST_BM 0x7F
|
||||
|
||||
// void FrskyRXspiInit();
|
||||
uint8_t cc2500_readFifo(uint8_t *dpbuffer, uint8_t len);
|
||||
uint8_t cc2500_writeFifo(uint8_t *dpbuffer, uint8_t len);
|
||||
uint8_t cc2500_ReadRegisterMulti(uint8_t address, uint8_t *data,
|
||||
uint8_t cc2500ReadFifo(uint8_t *dpbuffer, uint8_t len);
|
||||
uint8_t cc2500WriteFifo(uint8_t *dpbuffer, uint8_t len);
|
||||
|
||||
uint8_t cc2500ReadRegisterMulti(uint8_t address, uint8_t *data,
|
||||
uint8_t length);
|
||||
uint8_t CC2500_WriteRegisterMulti(uint8_t address, uint8_t *data,
|
||||
uint8_t cc2500WriteRegisterMulti(uint8_t address, uint8_t *data,
|
||||
uint8_t length);
|
||||
|
||||
uint8_t cc2500_readReg(uint8_t reg);
|
||||
void cc2500_strobe(uint8_t address);
|
||||
uint8_t cc2500_writeReg(uint8_t address, uint8_t data);
|
||||
void CC2500_SetPower(uint8_t power);
|
||||
uint8_t CC2500_Reset();
|
||||
uint8_t cc2500ReadReg(uint8_t reg);
|
||||
void cc2500Strobe(uint8_t address);
|
||||
uint8_t cc2500WriteReg(uint8_t address, uint8_t data);
|
||||
void cc2500SetPower(uint8_t power);
|
||||
uint8_t cc2500Reset();
|
||||
|
|
|
@ -2110,7 +2110,7 @@ static void cliBeeper(char *cmdline)
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef FRSKY_BIND
|
||||
#ifdef USE_RX_FRSKY_D
|
||||
void cliFrSkyBind(char *cmdline){
|
||||
UNUSED(cmdline);
|
||||
frSkyDBind();
|
||||
|
@ -3491,7 +3491,7 @@ const clicmd_t cmdTable[] = {
|
|||
CLI_COMMAND_DEF("beeper", "turn on/off beeper", "list\r\n"
|
||||
"\t<+|->[name]", cliBeeper),
|
||||
#endif
|
||||
#ifdef FRSKY_BIND
|
||||
#ifdef USE_RX_FRSKY_D
|
||||
CLI_COMMAND_DEF("frsky_bind", NULL, NULL, cliFrSkyBind),
|
||||
#endif
|
||||
#ifdef LED_STRIP
|
||||
|
|
|
@ -25,113 +25,70 @@
|
|||
#ifdef USE_RX_FRSKY_D
|
||||
|
||||
#include "build/build_config.h"
|
||||
#include "build/debug.h"
|
||||
|
||||
#include "common/utils.h"
|
||||
#include "common/maths.h"
|
||||
#include "common/utils.h"
|
||||
|
||||
#include "drivers/cc2500.h"
|
||||
#include "drivers/io.h"
|
||||
#include "drivers/system.h"
|
||||
#include "drivers/time.h"
|
||||
|
||||
#include "fc/config.h"
|
||||
|
||||
#include "config/feature.h"
|
||||
#include "config/parameter_group_ids.h"
|
||||
|
||||
#include "rx/rx.h"
|
||||
#include "rx/rx_spi.h"
|
||||
#include "rx/frsky_d.h"
|
||||
|
||||
#include "sensors/battery.h"
|
||||
|
||||
#include "fc/config.h"
|
||||
|
||||
#include "config/feature.h"
|
||||
#include "config/parameter_group_ids.h"
|
||||
|
||||
#include "telemetry/frsky.h"
|
||||
|
||||
#define RC_CHANNEL_COUNT 8
|
||||
#define MAX_MISSING_PKT 100
|
||||
|
||||
#define DEBUG_DATA_ERROR_COUNT 0
|
||||
|
||||
#define SYNC 9000
|
||||
#define FS_THR 960
|
||||
|
||||
#define FLED_on \
|
||||
{ \
|
||||
IOHi(IOGetByTag(IO_TAG(FRSKY_LED_PIN))); \
|
||||
}
|
||||
#define FLED_off \
|
||||
{ \
|
||||
IOLo(IOGetByTag(IO_TAG(FRSKY_LED_PIN))); \
|
||||
}
|
||||
#define GDO_1 IORead(IOGetByTag(IO_TAG(GDO_0_PIN)))
|
||||
|
||||
#if defined(PA_LNA)
|
||||
#define TX_EN_on \
|
||||
{ \
|
||||
IOHi(IOGetByTag(IO_TAG(TX_EN_PIN))); \
|
||||
}
|
||||
#define TX_EN_off \
|
||||
{ \
|
||||
IOLo(IOGetByTag(IO_TAG(TX_EN_PIN))); \
|
||||
}
|
||||
|
||||
#define RX_EN_on \
|
||||
{ \
|
||||
IOHi(IOGetByTag(IO_TAG(RX_EN_PIN))); \
|
||||
}
|
||||
#define RX_EN_off \
|
||||
{ \
|
||||
IOLo(IOGetByTag(IO_TAG(RX_EN_PIN))); \
|
||||
}
|
||||
|
||||
#if defined(DIVERSITY)
|
||||
#define ANT_SEL_on \
|
||||
{ \
|
||||
IOHi(IOGetByTag(IO_TAG(ANT_SEL_PIN))); \
|
||||
}
|
||||
#define ANT_SEL_off \
|
||||
{ \
|
||||
IOLo(IOGetByTag(IO_TAG(ANT_SEL_PIN))); \
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static uint8_t ccLen;
|
||||
static uint8_t channr;
|
||||
static uint32_t missingPackets;
|
||||
static uint8_t calData[255][3];
|
||||
static uint32_t time_tune;
|
||||
static uint8_t listLength;
|
||||
static uint8_t bindIdx;
|
||||
static uint8_t cnt;
|
||||
static uint16_t Servo_data[RC_CHANNEL_COUNT];
|
||||
static uint16_t c[8];
|
||||
static uint32_t t_out;
|
||||
static int32_t t_out;
|
||||
static uint8_t Lqi;
|
||||
static uint32_t packet_timer;
|
||||
static uint8_t protocol_state;
|
||||
static int16_t word_temp;
|
||||
static timeUs_t lastPacketReceivedTime;
|
||||
static uint8_t protocolState;
|
||||
static uint32_t start_time;
|
||||
static int8_t bindOffset;
|
||||
static uint16_t dataErrorCount = 0;
|
||||
|
||||
static IO_t GdoPin;
|
||||
static IO_t BindPin = DEFIO_IO(NONE);
|
||||
static IO_t gdoPin;
|
||||
static IO_t bindPin = DEFIO_IO(NONE);
|
||||
static bool lastBindPinStatus;
|
||||
static IO_t FrskyLedPin;
|
||||
#if defined(PA_LNA)
|
||||
static IO_t TxEnPin;
|
||||
static IO_t RxEnPin;
|
||||
static IO_t AntSelPin;
|
||||
static IO_t frSkyLedPin;
|
||||
#if defined(USE_FRSKY_RX_PA_LNA)
|
||||
static IO_t txEnPin;
|
||||
static IO_t rxEnPin;
|
||||
static IO_t antSelPin;
|
||||
static uint8_t pass;
|
||||
#endif
|
||||
bool bindRequested = false;
|
||||
|
||||
#ifdef FRSKY_TELEMETRY
|
||||
#ifdef USE_FRSKY_D_TELEMETRY
|
||||
static uint8_t frame[20];
|
||||
static int16_t RSSI_dBm;
|
||||
static uint8_t telemetry_id;
|
||||
static uint8_t telemetryRX;
|
||||
static uint32_t telemetryTime;
|
||||
|
||||
#if defined(HUB)
|
||||
#if defined(TELEMETRY_FRSKY)
|
||||
#define MAX_SERIAL_BYTES 64
|
||||
static uint8_t hub_index;
|
||||
static uint8_t idxx = 0;
|
||||
|
@ -154,8 +111,6 @@ PG_RESET_TEMPLATE(frSkyDConfig_t, frSkyDConfig,
|
|||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
);
|
||||
|
||||
rx_spi_received_e ret;
|
||||
|
||||
enum {
|
||||
STATE_INIT = 0,
|
||||
STATE_BIND,
|
||||
|
@ -166,22 +121,22 @@ enum {
|
|||
STATE_STARTING,
|
||||
STATE_UPDATE,
|
||||
STATE_DATA,
|
||||
STATE_TELEM
|
||||
STATE_TELEMETRY
|
||||
};
|
||||
|
||||
#if defined(FRSKY_TELEMETRY)
|
||||
#if defined(USE_FRSKY_D_TELEMETRY)
|
||||
static void compute_RSSIdbm(uint8_t *packet)
|
||||
{
|
||||
if (packet[ccLen - 2] >= 128) {
|
||||
RSSI_dBm = ((((uint16_t)packet[ccLen - 2]) * 18) >> 5) - 82;
|
||||
if (packet[18] >= 128) {
|
||||
RSSI_dBm = ((((uint16_t)packet[18]) * 18) >> 5) - 82;
|
||||
} else {
|
||||
RSSI_dBm = ((((uint16_t)packet[ccLen - 2]) * 18) >> 5) + 65;
|
||||
RSSI_dBm = ((((uint16_t)packet[18]) * 18) >> 5) + 65;
|
||||
}
|
||||
|
||||
processRssi(constrain((RSSI_dBm << 3) / 10, 0, 100));
|
||||
}
|
||||
|
||||
#if defined(HUB)
|
||||
#if defined(TELEMETRY_FRSKY)
|
||||
static uint8_t frsky_append_hub_data(uint8_t *buf)
|
||||
{
|
||||
if (telemetry_id == telemetry_expected_id)
|
||||
|
@ -228,7 +183,7 @@ static void telemetry_build_frame(uint8_t *packet)
|
|||
frame[3] = (uint8_t)((adcExternal1Sample & 0xff0) >> 4); // A1
|
||||
frame[4] = (uint8_t)((adcRssiSample & 0xff0) >> 4); // A2
|
||||
frame[5] = (uint8_t)RSSI_dBm;
|
||||
#if defined(HUB)
|
||||
#if defined(TELEMETRY_FRSKY)
|
||||
bytes_used = frsky_append_hub_data(&frame[8]);
|
||||
#endif
|
||||
frame[6] = bytes_used;
|
||||
|
@ -237,17 +192,17 @@ static void telemetry_build_frame(uint8_t *packet)
|
|||
|
||||
#endif
|
||||
|
||||
#if defined(PA_LNA)
|
||||
#if defined(USE_FRSKY_RX_PA_LNA)
|
||||
static void RX_enable()
|
||||
{
|
||||
TX_EN_off;
|
||||
RX_EN_on;
|
||||
IOLo(txEnPin);
|
||||
IOHi(rxEnPin);
|
||||
}
|
||||
|
||||
static void TX_enable()
|
||||
{
|
||||
RX_EN_off;
|
||||
TX_EN_on;
|
||||
IOLo(rxEnPin);
|
||||
IOHi(txEnPin);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -258,82 +213,82 @@ void frSkyDBind()
|
|||
|
||||
static void initialize()
|
||||
{
|
||||
CC2500_Reset();
|
||||
cc2500_writeReg(CC2500_02_IOCFG0, 0x01);
|
||||
cc2500_writeReg(CC2500_17_MCSM1, 0x0C);
|
||||
cc2500_writeReg(CC2500_18_MCSM0, 0x18);
|
||||
cc2500_writeReg(CC2500_06_PKTLEN, 0x19);
|
||||
cc2500_writeReg(CC2500_08_PKTCTRL0, 0x05);
|
||||
cc2500_writeReg(CC2500_3E_PATABLE, 0xFF);
|
||||
cc2500_writeReg(CC2500_0B_FSCTRL1, 0x08);
|
||||
cc2500_writeReg(CC2500_0C_FSCTRL0, 0x00);
|
||||
cc2500_writeReg(CC2500_0D_FREQ2, 0x5C);
|
||||
cc2500_writeReg(CC2500_0E_FREQ1, 0x76);
|
||||
cc2500_writeReg(CC2500_0F_FREQ0, 0x27);
|
||||
cc2500_writeReg(CC2500_10_MDMCFG4, 0xAA);
|
||||
cc2500_writeReg(CC2500_11_MDMCFG3, 0x39);
|
||||
cc2500_writeReg(CC2500_12_MDMCFG2, 0x11);
|
||||
cc2500_writeReg(CC2500_13_MDMCFG1, 0x23);
|
||||
cc2500_writeReg(CC2500_14_MDMCFG0, 0x7A);
|
||||
cc2500_writeReg(CC2500_15_DEVIATN, 0x42);
|
||||
cc2500_writeReg(CC2500_19_FOCCFG, 0x16);
|
||||
cc2500_writeReg(CC2500_1A_BSCFG, 0x6C);
|
||||
cc2500_writeReg(CC2500_1B_AGCCTRL2, 0x03);
|
||||
cc2500_writeReg(CC2500_1C_AGCCTRL1, 0x40);
|
||||
cc2500_writeReg(CC2500_1D_AGCCTRL0, 0x91);
|
||||
cc2500_writeReg(CC2500_21_FREND1, 0x56);
|
||||
cc2500_writeReg(CC2500_22_FREND0, 0x10);
|
||||
cc2500_writeReg(CC2500_23_FSCAL3, 0xA9);
|
||||
cc2500_writeReg(CC2500_24_FSCAL2, 0x0A);
|
||||
cc2500_writeReg(CC2500_25_FSCAL1, 0x00);
|
||||
cc2500_writeReg(CC2500_26_FSCAL0, 0x11);
|
||||
cc2500_writeReg(CC2500_29_FSTEST, 0x59);
|
||||
cc2500_writeReg(CC2500_2C_TEST2, 0x88);
|
||||
cc2500_writeReg(CC2500_2D_TEST1, 0x31);
|
||||
cc2500_writeReg(CC2500_2E_TEST0, 0x0B);
|
||||
cc2500_writeReg(CC2500_03_FIFOTHR, 0x07);
|
||||
cc2500_writeReg(CC2500_09_ADDR, 0x00);
|
||||
cc2500_strobe(CC2500_SIDLE);
|
||||
cc2500Reset();
|
||||
cc2500WriteReg(CC2500_02_IOCFG0, 0x01);
|
||||
cc2500WriteReg(CC2500_17_MCSM1, 0x0C);
|
||||
cc2500WriteReg(CC2500_18_MCSM0, 0x18);
|
||||
cc2500WriteReg(CC2500_06_PKTLEN, 0x19);
|
||||
cc2500WriteReg(CC2500_08_PKTCTRL0, 0x05);
|
||||
cc2500WriteReg(CC2500_3E_PATABLE, 0xFF);
|
||||
cc2500WriteReg(CC2500_0B_FSCTRL1, 0x08);
|
||||
cc2500WriteReg(CC2500_0C_FSCTRL0, 0x00);
|
||||
cc2500WriteReg(CC2500_0D_FREQ2, 0x5C);
|
||||
cc2500WriteReg(CC2500_0E_FREQ1, 0x76);
|
||||
cc2500WriteReg(CC2500_0F_FREQ0, 0x27);
|
||||
cc2500WriteReg(CC2500_10_MDMCFG4, 0xAA);
|
||||
cc2500WriteReg(CC2500_11_MDMCFG3, 0x39);
|
||||
cc2500WriteReg(CC2500_12_MDMCFG2, 0x11);
|
||||
cc2500WriteReg(CC2500_13_MDMCFG1, 0x23);
|
||||
cc2500WriteReg(CC2500_14_MDMCFG0, 0x7A);
|
||||
cc2500WriteReg(CC2500_15_DEVIATN, 0x42);
|
||||
cc2500WriteReg(CC2500_19_FOCCFG, 0x16);
|
||||
cc2500WriteReg(CC2500_1A_BSCFG, 0x6C);
|
||||
cc2500WriteReg(CC2500_1B_AGCCTRL2, 0x03);
|
||||
cc2500WriteReg(CC2500_1C_AGCCTRL1, 0x40);
|
||||
cc2500WriteReg(CC2500_1D_AGCCTRL0, 0x91);
|
||||
cc2500WriteReg(CC2500_21_FREND1, 0x56);
|
||||
cc2500WriteReg(CC2500_22_FREND0, 0x10);
|
||||
cc2500WriteReg(CC2500_23_FSCAL3, 0xA9);
|
||||
cc2500WriteReg(CC2500_24_FSCAL2, 0x0A);
|
||||
cc2500WriteReg(CC2500_25_FSCAL1, 0x00);
|
||||
cc2500WriteReg(CC2500_26_FSCAL0, 0x11);
|
||||
cc2500WriteReg(CC2500_29_FSTEST, 0x59);
|
||||
cc2500WriteReg(CC2500_2C_TEST2, 0x88);
|
||||
cc2500WriteReg(CC2500_2D_TEST1, 0x31);
|
||||
cc2500WriteReg(CC2500_2E_TEST0, 0x0B);
|
||||
cc2500WriteReg(CC2500_03_FIFOTHR, 0x07);
|
||||
cc2500WriteReg(CC2500_09_ADDR, 0x00);
|
||||
cc2500Strobe(CC2500_SIDLE);
|
||||
|
||||
cc2500_writeReg(CC2500_07_PKTCTRL1, 0x04);
|
||||
cc2500_writeReg(CC2500_0C_FSCTRL0, 0);
|
||||
cc2500WriteReg(CC2500_07_PKTCTRL1, 0x04);
|
||||
cc2500WriteReg(CC2500_0C_FSCTRL0, 0);
|
||||
for (uint8_t c = 0; c < 0xFF; c++) {
|
||||
cc2500_strobe(CC2500_SIDLE);
|
||||
cc2500_writeReg(CC2500_0A_CHANNR, c);
|
||||
cc2500_strobe(CC2500_SCAL);
|
||||
cc2500Strobe(CC2500_SIDLE);
|
||||
cc2500WriteReg(CC2500_0A_CHANNR, c);
|
||||
cc2500Strobe(CC2500_SCAL);
|
||||
delayMicroseconds(900);
|
||||
calData[c][0] = cc2500_readReg(CC2500_23_FSCAL3);
|
||||
calData[c][1] = cc2500_readReg(CC2500_24_FSCAL2);
|
||||
calData[c][2] = cc2500_readReg(CC2500_25_FSCAL1);
|
||||
calData[c][0] = cc2500ReadReg(CC2500_23_FSCAL3);
|
||||
calData[c][1] = cc2500ReadReg(CC2500_24_FSCAL2);
|
||||
calData[c][2] = cc2500ReadReg(CC2500_25_FSCAL1);
|
||||
}
|
||||
}
|
||||
|
||||
static void initialize_data(uint8_t adr)
|
||||
{
|
||||
cc2500_writeReg(CC2500_0C_FSCTRL0, (uint8_t)frSkyDConfig()->bindOffset);
|
||||
cc2500_writeReg(CC2500_18_MCSM0, 0x8);
|
||||
cc2500_writeReg(CC2500_09_ADDR, adr ? 0x03 : frSkyDConfig()->bindTxId[0]);
|
||||
cc2500_writeReg(CC2500_07_PKTCTRL1, 0x0D);
|
||||
cc2500_writeReg(CC2500_19_FOCCFG, 0x16);
|
||||
cc2500WriteReg(CC2500_0C_FSCTRL0, (uint8_t)frSkyDConfig()->bindOffset);
|
||||
cc2500WriteReg(CC2500_18_MCSM0, 0x8);
|
||||
cc2500WriteReg(CC2500_09_ADDR, adr ? 0x03 : frSkyDConfig()->bindTxId[0]);
|
||||
cc2500WriteReg(CC2500_07_PKTCTRL1, 0x0D);
|
||||
cc2500WriteReg(CC2500_19_FOCCFG, 0x16);
|
||||
delay(10);
|
||||
}
|
||||
|
||||
static void initTuneRx(void)
|
||||
{
|
||||
cc2500_writeReg(CC2500_19_FOCCFG, 0x14);
|
||||
cc2500WriteReg(CC2500_19_FOCCFG, 0x14);
|
||||
time_tune = millis();
|
||||
bindOffset = -126;
|
||||
cc2500_writeReg(CC2500_0C_FSCTRL0, (uint8_t)bindOffset);
|
||||
cc2500_writeReg(CC2500_07_PKTCTRL1, 0x0C);
|
||||
cc2500_writeReg(CC2500_18_MCSM0, 0x8);
|
||||
cc2500WriteReg(CC2500_0C_FSCTRL0, (uint8_t)bindOffset);
|
||||
cc2500WriteReg(CC2500_07_PKTCTRL1, 0x0C);
|
||||
cc2500WriteReg(CC2500_18_MCSM0, 0x8);
|
||||
|
||||
cc2500_strobe(CC2500_SIDLE);
|
||||
cc2500_writeReg(CC2500_23_FSCAL3, calData[0][0]);
|
||||
cc2500_writeReg(CC2500_24_FSCAL2, calData[0][1]);
|
||||
cc2500_writeReg(CC2500_25_FSCAL1, calData[0][2]);
|
||||
cc2500_writeReg(CC2500_0A_CHANNR, 0);
|
||||
cc2500_strobe(CC2500_SFRX);
|
||||
cc2500_strobe(CC2500_SRX);
|
||||
cc2500Strobe(CC2500_SIDLE);
|
||||
cc2500WriteReg(CC2500_23_FSCAL3, calData[0][0]);
|
||||
cc2500WriteReg(CC2500_24_FSCAL2, calData[0][1]);
|
||||
cc2500WriteReg(CC2500_25_FSCAL1, calData[0][2]);
|
||||
cc2500WriteReg(CC2500_0A_CHANNR, 0);
|
||||
cc2500Strobe(CC2500_SFRX);
|
||||
cc2500Strobe(CC2500_SRX);
|
||||
}
|
||||
|
||||
static bool tuneRx(uint8_t *packet)
|
||||
|
@ -344,12 +299,12 @@ static bool tuneRx(uint8_t *packet)
|
|||
if ((millis() - time_tune) > 50) {
|
||||
time_tune = millis();
|
||||
bindOffset += 5;
|
||||
cc2500_writeReg(CC2500_0C_FSCTRL0, (uint8_t)bindOffset);
|
||||
cc2500WriteReg(CC2500_0C_FSCTRL0, (uint8_t)bindOffset);
|
||||
}
|
||||
if (GDO_1) {
|
||||
ccLen = cc2500_readReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F;
|
||||
if (IORead(gdoPin)) {
|
||||
uint8_t ccLen = cc2500ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F;
|
||||
if (ccLen) {
|
||||
cc2500_readFifo(packet, ccLen);
|
||||
cc2500ReadFifo(packet, ccLen);
|
||||
if (packet[ccLen - 1] & 0x80) {
|
||||
if (packet[2] == 0x01) {
|
||||
Lqi = packet[ccLen - 1] & 0x7F;
|
||||
|
@ -368,15 +323,15 @@ static bool tuneRx(uint8_t *packet)
|
|||
|
||||
static void initGetBind(void)
|
||||
{
|
||||
cc2500_strobe(CC2500_SIDLE);
|
||||
cc2500_writeReg(CC2500_23_FSCAL3, calData[0][0]);
|
||||
cc2500_writeReg(CC2500_24_FSCAL2, calData[0][1]);
|
||||
cc2500_writeReg(CC2500_25_FSCAL1, calData[0][2]);
|
||||
cc2500_writeReg(CC2500_0A_CHANNR, 0);
|
||||
cc2500_strobe(CC2500_SFRX);
|
||||
cc2500Strobe(CC2500_SIDLE);
|
||||
cc2500WriteReg(CC2500_23_FSCAL3, calData[0][0]);
|
||||
cc2500WriteReg(CC2500_24_FSCAL2, calData[0][1]);
|
||||
cc2500WriteReg(CC2500_25_FSCAL1, calData[0][2]);
|
||||
cc2500WriteReg(CC2500_0A_CHANNR, 0);
|
||||
cc2500Strobe(CC2500_SFRX);
|
||||
delayMicroseconds(20); // waiting flush FIFO
|
||||
|
||||
cc2500_strobe(CC2500_SRX);
|
||||
cc2500Strobe(CC2500_SRX);
|
||||
listLength = 0;
|
||||
bindIdx = 0x05;
|
||||
}
|
||||
|
@ -386,10 +341,10 @@ static bool getBind1(uint8_t *packet)
|
|||
// len|bind |tx
|
||||
// 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|
|
||||
// Start by getting bind packet 0 and the txid
|
||||
if (GDO_1) {
|
||||
ccLen = cc2500_readReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F;
|
||||
if (IORead(gdoPin)) {
|
||||
uint8_t ccLen = cc2500ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F;
|
||||
if (ccLen) {
|
||||
cc2500_readFifo(packet, ccLen);
|
||||
cc2500ReadFifo(packet, ccLen);
|
||||
if (packet[ccLen - 1] & 0x80) {
|
||||
if (packet[2] == 0x01) {
|
||||
if (packet[5] == 0x00) {
|
||||
|
@ -413,11 +368,10 @@ static bool getBind1(uint8_t *packet)
|
|||
static bool getBind2(uint8_t *packet)
|
||||
{
|
||||
if (bindIdx <= 120) {
|
||||
if (GDO_1) {
|
||||
ccLen =
|
||||
cc2500_readReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F;
|
||||
if (IORead(gdoPin)) {
|
||||
uint8_t ccLen = cc2500ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F;
|
||||
if (ccLen) {
|
||||
cc2500_readFifo(packet, ccLen);
|
||||
cc2500ReadFifo(packet, ccLen);
|
||||
if (packet[ccLen - 1] & 0x80) {
|
||||
if (packet[2] == 0x01) {
|
||||
if ((packet[3] == frSkyDConfig()->bindTxId[0]) &&
|
||||
|
@ -467,27 +421,32 @@ static bool getBind2(uint8_t *packet)
|
|||
|
||||
static void nextChannel(uint8_t skip)
|
||||
{
|
||||
static uint8_t channr = 0;
|
||||
|
||||
channr += skip;
|
||||
if (channr >= listLength)
|
||||
while (channr >= listLength) {
|
||||
channr -= listLength;
|
||||
cc2500_strobe(CC2500_SIDLE);
|
||||
cc2500_writeReg(CC2500_23_FSCAL3,
|
||||
}
|
||||
cc2500Strobe(CC2500_SIDLE);
|
||||
cc2500WriteReg(CC2500_23_FSCAL3,
|
||||
calData[frSkyDConfig()->bindHopData[channr]][0]);
|
||||
cc2500_writeReg(CC2500_24_FSCAL2,
|
||||
cc2500WriteReg(CC2500_24_FSCAL2,
|
||||
calData[frSkyDConfig()->bindHopData[channr]][1]);
|
||||
cc2500_writeReg(CC2500_25_FSCAL1,
|
||||
cc2500WriteReg(CC2500_25_FSCAL1,
|
||||
calData[frSkyDConfig()->bindHopData[channr]][2]);
|
||||
cc2500_writeReg(CC2500_0A_CHANNR, frSkyDConfig()->bindHopData[channr]);
|
||||
cc2500_strobe(CC2500_SFRX);
|
||||
cc2500WriteReg(CC2500_0A_CHANNR, frSkyDConfig()->bindHopData[channr]);
|
||||
cc2500Strobe(CC2500_SFRX);
|
||||
}
|
||||
|
||||
static bool checkBindRequested(bool reset)
|
||||
{
|
||||
bool bindPinStatus = IORead(BindPin);
|
||||
if (lastBindPinStatus && !bindPinStatus) {
|
||||
bindRequested = true;
|
||||
if (bindPin) {
|
||||
bool bindPinStatus = IORead(bindPin);
|
||||
if (lastBindPinStatus && !bindPinStatus) {
|
||||
bindRequested = true;
|
||||
}
|
||||
lastBindPinStatus = bindPinStatus;
|
||||
}
|
||||
lastBindPinStatus = bindPinStatus;
|
||||
|
||||
if (!bindRequested) {
|
||||
return false;
|
||||
|
@ -500,46 +459,63 @@ static bool checkBindRequested(bool reset)
|
|||
}
|
||||
}
|
||||
|
||||
void frskyD_Rx_SetRCdata(uint16_t *rcData, const uint8_t *packet)
|
||||
{
|
||||
c[0] = (uint16_t)(((packet[10] & 0x0F) << 8 | packet[6]));
|
||||
c[1] = (uint16_t)(((packet[10] & 0xF0) << 4 | packet[7]));
|
||||
c[2] = (uint16_t)(((packet[11] & 0x0F) << 8 | packet[8]));
|
||||
c[3] = (uint16_t)(((packet[11] & 0xF0) << 4 | packet[9]));
|
||||
c[4] = (uint16_t)(((packet[16] & 0x0F) << 8 | packet[12]));
|
||||
c[5] = (uint16_t)(((packet[16] & 0xF0) << 4 | packet[13]));
|
||||
c[6] = (uint16_t)(((packet[17] & 0x0F) << 8 | packet[14]));
|
||||
c[7] = (uint16_t)(((packet[17] & 0xF0) << 4 | packet[15]));
|
||||
#define FRSKY_D_CHANNEL_SCALING (2.0f / 3)
|
||||
|
||||
for (uint8_t i = 0; i < 8; i++) {
|
||||
word_temp = 0.667 * c[i];
|
||||
if ((word_temp > 800) && (word_temp < 2200))
|
||||
Servo_data[i] = word_temp;
|
||||
rcData[i] = Servo_data[i];
|
||||
static void decodeChannelPair(uint16_t *channels, const uint8_t *packet, const uint8_t highNibbleOffset) {
|
||||
channels[0] = FRSKY_D_CHANNEL_SCALING * (uint16_t)((packet[highNibbleOffset] & 0xf) << 8 | packet[0]);
|
||||
channels[1] = FRSKY_D_CHANNEL_SCALING * (uint16_t)((packet[highNibbleOffset] & 0xf0) << 4 | packet[1]);
|
||||
}
|
||||
|
||||
void frSkyDSetRcData(uint16_t *rcData, const uint8_t *packet)
|
||||
{
|
||||
uint16_t channels[RC_CHANNEL_COUNT];
|
||||
bool dataError = false;
|
||||
|
||||
decodeChannelPair(channels, packet + 6, 4);
|
||||
decodeChannelPair(channels + 2, packet + 8, 3);
|
||||
decodeChannelPair(channels + 4, packet + 12, 4);
|
||||
decodeChannelPair(channels + 6, packet + 14, 3);
|
||||
|
||||
for (int i = 0; i < RC_CHANNEL_COUNT; i++) {
|
||||
if ((channels[i] < 800) || (channels[i] > 2200)) {
|
||||
dataError = true;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!dataError) {
|
||||
for (int i = 0; i < RC_CHANNEL_COUNT; i++) {
|
||||
rcData[i] = channels[i];
|
||||
}
|
||||
} else {
|
||||
DEBUG_SET(DEBUG_FRSKY_D_RX, DEBUG_DATA_ERROR_COUNT, ++dataErrorCount);
|
||||
}
|
||||
}
|
||||
|
||||
rx_spi_received_e frskyD_Rx_DataReceived(uint8_t *packet)
|
||||
rx_spi_received_e frSkyDDataReceived(uint8_t *packet)
|
||||
{
|
||||
ret = RX_SPI_RECEIVED_NONE;
|
||||
const timeUs_t currentPacketReceivedTime = micros();
|
||||
|
||||
switch (protocol_state) {
|
||||
rx_spi_received_e ret = RX_SPI_RECEIVED_NONE;
|
||||
|
||||
switch (protocolState) {
|
||||
case STATE_INIT:
|
||||
if ((millis() - start_time) > 10) {
|
||||
initialize();
|
||||
|
||||
protocol_state = STATE_BIND;
|
||||
protocolState = STATE_BIND;
|
||||
}
|
||||
|
||||
break;
|
||||
case STATE_BIND:
|
||||
if (checkBindRequested(true) || frSkyDConfig()->autoBind) {
|
||||
FLED_on;
|
||||
IOHi(frSkyLedPin);
|
||||
initTuneRx();
|
||||
|
||||
protocol_state = STATE_BIND_TUNING;
|
||||
protocolState = STATE_BIND_TUNING;
|
||||
} else {
|
||||
protocol_state = STATE_STARTING;
|
||||
protocolState = STATE_STARTING;
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -548,21 +524,21 @@ rx_spi_received_e frskyD_Rx_DataReceived(uint8_t *packet)
|
|||
initGetBind();
|
||||
initialize_data(1);
|
||||
|
||||
protocol_state = STATE_BIND_BINDING1;
|
||||
protocolState = STATE_BIND_BINDING1;
|
||||
}
|
||||
|
||||
break;
|
||||
case STATE_BIND_BINDING1:
|
||||
if (getBind1(packet)) {
|
||||
protocol_state = STATE_BIND_BINDING2;
|
||||
protocolState = STATE_BIND_BINDING2;
|
||||
}
|
||||
|
||||
break;
|
||||
case STATE_BIND_BINDING2:
|
||||
if (getBind2(packet)) {
|
||||
cc2500_strobe(CC2500_SIDLE);
|
||||
cc2500Strobe(CC2500_SIDLE);
|
||||
|
||||
protocol_state = STATE_BIND_COMPLETE;
|
||||
protocolState = STATE_BIND_COMPLETE;
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -572,86 +548,83 @@ rx_spi_received_e frskyD_Rx_DataReceived(uint8_t *packet)
|
|||
} else {
|
||||
uint8_t ctr = 40;
|
||||
while (ctr--) {
|
||||
FLED_on;
|
||||
IOHi(frSkyLedPin);
|
||||
delay(50);
|
||||
FLED_off;
|
||||
IOLo(frSkyLedPin);
|
||||
delay(50);
|
||||
}
|
||||
}
|
||||
|
||||
protocol_state = STATE_STARTING;
|
||||
protocolState = STATE_STARTING;
|
||||
|
||||
break;
|
||||
case STATE_STARTING:
|
||||
listLength = 47;
|
||||
initialize_data(0);
|
||||
protocol_state = STATE_UPDATE;
|
||||
protocolState = STATE_UPDATE;
|
||||
nextChannel(1); //
|
||||
cc2500_strobe(CC2500_SRX);
|
||||
cc2500Strobe(CC2500_SRX);
|
||||
ret = RX_SPI_RECEIVED_BIND;
|
||||
|
||||
break;
|
||||
case STATE_UPDATE:
|
||||
packet_timer = micros();
|
||||
protocol_state = STATE_DATA;
|
||||
lastPacketReceivedTime = currentPacketReceivedTime;
|
||||
protocolState = STATE_DATA;
|
||||
|
||||
if (checkBindRequested(false)) {
|
||||
packet_timer = 0;
|
||||
lastPacketReceivedTime = 0;
|
||||
t_out = 50;
|
||||
missingPackets = 0;
|
||||
|
||||
protocol_state = STATE_INIT;
|
||||
protocolState = STATE_INIT;
|
||||
|
||||
break;
|
||||
}
|
||||
// here FS code could be
|
||||
case STATE_DATA:
|
||||
if (GDO_1) {
|
||||
ccLen =
|
||||
cc2500_readReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F;
|
||||
if (ccLen > 20)
|
||||
ccLen = 20;
|
||||
if (ccLen == 20) {
|
||||
cc2500_readFifo(packet, ccLen);
|
||||
if (packet[ccLen - 1] & 0x80) {
|
||||
if (IORead(gdoPin)) {
|
||||
uint8_t ccLen = cc2500ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F;
|
||||
if (ccLen >= 20) {
|
||||
cc2500ReadFifo(packet, 20);
|
||||
if (packet[19] & 0x80) {
|
||||
missingPackets = 0;
|
||||
t_out = 1;
|
||||
if (packet[0] == 0x11) {
|
||||
if ((packet[1] == frSkyDConfig()->bindTxId[0]) &&
|
||||
(packet[2] == frSkyDConfig()->bindTxId[1])) {
|
||||
FLED_on;
|
||||
IOHi(frSkyLedPin);
|
||||
nextChannel(1);
|
||||
#ifdef FRSKY_TELEMETRY
|
||||
#ifdef USE_FRSKY_D_TELEMETRY
|
||||
if ((packet[3] % 4) == 2) {
|
||||
telemetryRX = 1;
|
||||
telemetryTime = micros();
|
||||
compute_RSSIdbm(packet);
|
||||
telemetry_build_frame(packet);
|
||||
protocol_state = STATE_TELEM;
|
||||
protocolState = STATE_TELEMETRY;
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
cc2500_strobe(CC2500_SRX);
|
||||
protocol_state = STATE_UPDATE;
|
||||
cc2500Strobe(CC2500_SRX);
|
||||
protocolState = STATE_UPDATE;
|
||||
}
|
||||
ret = RX_SPI_RECEIVED_DATA;
|
||||
packet_timer = micros();
|
||||
lastPacketReceivedTime = currentPacketReceivedTime;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ((micros() - packet_timer) > (t_out * SYNC)) {
|
||||
#ifdef PA_LNA
|
||||
|
||||
if (cmp32(currentPacketReceivedTime, lastPacketReceivedTime) > (t_out * SYNC)) {
|
||||
#ifdef USE_FRSKY_RX_PA_LNA
|
||||
RX_enable();
|
||||
#endif
|
||||
if (t_out == 1) {
|
||||
#ifdef DIVERSITY // SE4311 chip
|
||||
#ifdef USE_FRSKY_RX_DIVERSITY // SE4311 chip
|
||||
if (missingPackets >= 2) {
|
||||
if (pass & 0x01) {
|
||||
ANT_SEL_on;
|
||||
IOHi(antSelPin);
|
||||
} else {
|
||||
ANT_SEL_off;
|
||||
IOLo(antSelPin);
|
||||
}
|
||||
pass++;
|
||||
}
|
||||
|
@ -664,34 +637,31 @@ rx_spi_received_e frskyD_Rx_DataReceived(uint8_t *packet)
|
|||
nextChannel(1);
|
||||
} else {
|
||||
if (cnt++ & 0x01) {
|
||||
FLED_off;
|
||||
IOLo(frSkyLedPin);
|
||||
} else
|
||||
FLED_on;
|
||||
IOHi(frSkyLedPin);
|
||||
|
||||
nextChannel(13);
|
||||
}
|
||||
|
||||
cc2500_strobe(CC2500_SRX);
|
||||
protocol_state = STATE_UPDATE;
|
||||
cc2500Strobe(CC2500_SRX);
|
||||
protocolState = STATE_UPDATE;
|
||||
}
|
||||
break;
|
||||
#ifdef FRSKY_TELEMETRY
|
||||
case STATE_TELEM:
|
||||
if (telemetryRX) {
|
||||
if ((micros() - telemetryTime) >= 1380) {
|
||||
cc2500_strobe(CC2500_SIDLE);
|
||||
CC2500_SetPower(6);
|
||||
cc2500_strobe(CC2500_SFRX);
|
||||
#if defined(PA_LNA)
|
||||
TX_enable();
|
||||
#ifdef USE_FRSKY_D_TELEMETRY
|
||||
case STATE_TELEMETRY:
|
||||
if ((micros() - telemetryTime) >= 1380) {
|
||||
cc2500Strobe(CC2500_SIDLE);
|
||||
cc2500SetPower(6);
|
||||
cc2500Strobe(CC2500_SFRX);
|
||||
#if defined(USE_FRSKY_RX_PA_LNA)
|
||||
TX_enable();
|
||||
#endif
|
||||
cc2500_strobe(CC2500_SIDLE);
|
||||
cc2500_writeFifo(frame, frame[0] + 1);
|
||||
protocol_state = STATE_DATA;
|
||||
ret = RX_SPI_RECEIVED_DATA;
|
||||
packet_timer = micros();
|
||||
telemetryRX = 0;
|
||||
}
|
||||
cc2500Strobe(CC2500_SIDLE);
|
||||
cc2500WriteFifo(frame, frame[0] + 1);
|
||||
protocolState = STATE_DATA;
|
||||
ret = RX_SPI_RECEIVED_DATA;
|
||||
lastPacketReceivedTime = currentPacketReceivedTime;
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -701,58 +671,59 @@ rx_spi_received_e frskyD_Rx_DataReceived(uint8_t *packet)
|
|||
return ret;
|
||||
}
|
||||
|
||||
void frskyD_Rx_Setup(rx_spi_protocol_e protocol)
|
||||
static void frskyD_Rx_Setup(rx_spi_protocol_e protocol)
|
||||
{
|
||||
UNUSED(protocol);
|
||||
// gpio init here
|
||||
GdoPin = IOGetByTag(IO_TAG(GDO_0_PIN));
|
||||
BindPin = IOGetByTag(IO_TAG(BINDPLUG_PIN));
|
||||
FrskyLedPin = IOGetByTag(IO_TAG(FRSKY_LED_PIN));
|
||||
#if defined(PA_LNA)
|
||||
RxEnPin = IOGetByTag(IO_TAG(RX_EN_PIN));
|
||||
TxEnPin = IOGetByTag(IO_TAG(TX_EN_PIN));
|
||||
IOInit(RxEnPin, OWNER_RX_BIND, 0);
|
||||
IOInit(TxEnPin, OWNER_RX_BIND, 0);
|
||||
IOConfigGPIO(RxEnPin, IOCFG_OUT_PP);
|
||||
IOConfigGPIO(TxEnPin, IOCFG_OUT_PP);
|
||||
gdoPin = IOGetByTag(IO_TAG(FRSKY_RX_GDO_0_PIN));
|
||||
IOInit(gdoPin, OWNER_RX_BIND, 0);
|
||||
IOConfigGPIO(gdoPin, IOCFG_IN_FLOATING);
|
||||
frSkyLedPin = IOGetByTag(IO_TAG(FRSKY_RX_LED_PIN));
|
||||
IOInit(frSkyLedPin, OWNER_LED, 0);
|
||||
IOConfigGPIO(frSkyLedPin, IOCFG_OUT_PP);
|
||||
#if defined(USE_FRSKY_RX_PA_LNA)
|
||||
rxEnPin = IOGetByTag(IO_TAG(FRSKY_RX_RX_EN_PIN));
|
||||
IOInit(rxEnPin, OWNER_RX_BIND, 0);
|
||||
IOConfigGPIO(rxEnPin, IOCFG_OUT_PP);
|
||||
txEnPin = IOGetByTag(IO_TAG(FRSKY_RX_TX_EN_PIN));
|
||||
IOInit(txEnPin, OWNER_RX_BIND, 0);
|
||||
IOConfigGPIO(txEnPin, IOCFG_OUT_PP);
|
||||
#endif
|
||||
#if defined(DIVERSITY)
|
||||
AntSelPin = IOGetByTag(IO_TAG(ANT_SEL_PIN));
|
||||
IOInit(AntSelPin, OWNER_RX_BIND, 0);
|
||||
IOConfigGPIO(AntSelPin, IOCFG_OUT_PP);
|
||||
#if defined(USE_FRSKY_RX_DIVERSITY)
|
||||
antSelPin = IOGetByTag(IO_TAG(FRSKY_RX_ANT_SEL_PIN));
|
||||
IOInit(antSelPin, OWNER_RX_BIND, 0);
|
||||
IOConfigGPIO(antSelPin, IOCFG_OUT_PP);
|
||||
#endif
|
||||
#if defined(BINDPLUG_PIN)
|
||||
bindPin = IOGetByTag(IO_TAG(BINDPLUG_PIN));
|
||||
IOInit(bindPin, OWNER_RX_BIND, 0);
|
||||
IOConfigGPIO(bindPin, IOCFG_IPU);
|
||||
|
||||
lastBindPinStatus = IORead(bindPin);
|
||||
#endif
|
||||
//
|
||||
IOInit(GdoPin, OWNER_RX_BIND, 0);
|
||||
IOInit(BindPin, OWNER_RX_BIND, 0);
|
||||
IOInit(FrskyLedPin, OWNER_LED, 0);
|
||||
//
|
||||
IOConfigGPIO(GdoPin, IOCFG_IN_FLOATING);
|
||||
IOConfigGPIO(BindPin, IOCFG_IPU);
|
||||
IOConfigGPIO(FrskyLedPin, IOCFG_OUT_PP);
|
||||
|
||||
lastBindPinStatus = IORead(BindPin);
|
||||
start_time = millis();
|
||||
packet_timer = 0;
|
||||
lastPacketReceivedTime = 0;
|
||||
t_out = 50;
|
||||
missingPackets = 0;
|
||||
protocol_state = STATE_INIT;
|
||||
#if defined(DIVERSITY)
|
||||
ANT_SEL_on;
|
||||
protocolState = STATE_INIT;
|
||||
#if defined(USE_FRSKY_RX_DIVERSITY)
|
||||
IOHi(antSelPin);
|
||||
#endif
|
||||
#if defined(PA_LNA)
|
||||
#if defined(USE_FRSKY_RX_PA_LNA)
|
||||
RX_enable();
|
||||
#endif
|
||||
|
||||
#if defined(HUB)
|
||||
#if defined(TELEMETRY_FRSKY)
|
||||
initFrSkyExternalTelemetry(&frSkyTelemetryInitFrameSpi,
|
||||
&frSkyTelemetryWriteSpi);
|
||||
#endif
|
||||
|
||||
// if(!frskySpiDetect())//detect spi working routine
|
||||
// if(!frSkySpiDetect())//detect spi working routine
|
||||
// return;
|
||||
}
|
||||
|
||||
void frskyD_Rx_Init(const rxConfig_t *rxConfig,
|
||||
void frSkyDInit(const rxConfig_t *rxConfig,
|
||||
rxRuntimeConfig_t *rxRuntimeConfig)
|
||||
{
|
||||
rxRuntimeConfig->channelCount = RC_CHANNEL_COUNT;
|
||||
|
|
|
@ -33,7 +33,7 @@ PG_DECLARE(frSkyDConfig_t, frSkyDConfig);
|
|||
|
||||
struct rxConfig_s;
|
||||
struct rxRuntimeConfig_s;
|
||||
void frskyD_Rx_Init(const struct rxConfig_s *rxConfig, struct rxRuntimeConfig_s *rxRuntimeConfig);
|
||||
void frskyD_Rx_SetRCdata(uint16_t *rcData, const uint8_t *payload);
|
||||
rx_spi_received_e frskyD_Rx_DataReceived(uint8_t *payload);
|
||||
void frSkyDInit(const struct rxConfig_s *rxConfig, struct rxRuntimeConfig_s *rxRuntimeConfig);
|
||||
void frSkyDSetRcData(uint16_t *rcData, const uint8_t *payload);
|
||||
rx_spi_received_e frSkyDDataReceived(uint8_t *payload);
|
||||
void frSkyDBind();
|
||||
|
|
|
@ -111,9 +111,9 @@ STATIC_UNIT_TESTED bool rxSpiSetProtocol(rx_spi_protocol_e protocol)
|
|||
#endif
|
||||
#ifdef USE_RX_FRSKY_D
|
||||
case RX_SPI_FRSKY_D:
|
||||
protocolInit = frskyD_Rx_Init;
|
||||
protocolDataReceived = frskyD_Rx_DataReceived;
|
||||
protocolSetRcDataFromPayload = frskyD_Rx_SetRCdata;
|
||||
protocolInit = frSkyDInit;
|
||||
protocolDataReceived = frSkyDDataReceived;
|
||||
protocolSetRcDataFromPayload = frSkyDSetRcData;
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -95,8 +95,6 @@
|
|||
#define DEFAULT_VOLTAGE_METER_SOURCE VOLTAGE_METER_ADC
|
||||
#define DEFAULT_CURRENT_METER_SOURCE CURRENT_METER_ADC
|
||||
|
||||
#define USE_RX_CC2500
|
||||
|
||||
#define USE_RX_SPI
|
||||
#define RX_SPI_INSTANCE SPI1
|
||||
#define RX_NSS_GPIO_CLK_PERIPHERAL RCC_APB2Periph_GPIOA
|
||||
|
@ -105,23 +103,22 @@
|
|||
#define DEFAULT_RX_FEATURE FEATURE_RX_SPI
|
||||
#define RX_SPI_DEFAULT_PROTOCOL RX_SPI_FRSKY_D
|
||||
|
||||
#define FRSKY_BIND
|
||||
#define USE_FRSKY_D_TELEMETRY
|
||||
|
||||
#define FRSKY_TELEMETRY
|
||||
#define HUB
|
||||
|
||||
#define PA_LNA
|
||||
#define DIVERSITY
|
||||
#define USE_FRSKY_RX_PA_LNA
|
||||
#define USE_FRSKY_RX_DIVERSITY
|
||||
|
||||
#define RX_NSS_PIN SPI1_NSS_PIN
|
||||
#define RX_SCK_PIN SPI1_SCK_PIN
|
||||
#define RX_MISO_PIN SPI1_MISO_PIN
|
||||
#define RX_MOSI_PIN SPI1_MOSI_PIN
|
||||
#define GDO_0_PIN PB0
|
||||
#define ANT_SEL_PIN PB2
|
||||
#define TX_EN_PIN PB1
|
||||
#define RX_EN_PIN PB11
|
||||
#define FRSKY_LED_PIN PB6
|
||||
|
||||
#define FRSKY_RX_GDO_0_PIN PB0
|
||||
#define FRSKY_RX_ANT_SEL_PIN PB2
|
||||
#define FRSKY_RX_TX_EN_PIN PB1
|
||||
#define FRSKY_RX_RX_EN_PIN PB11
|
||||
#define FRSKY_RX_LED_PIN PB6
|
||||
|
||||
#define BINDPLUG_PIN PC13
|
||||
|
||||
#define USE_SERIAL_4WAY_BLHELI_INTERFACE
|
||||
|
|
Loading…
Reference in New Issue