mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-16 12:55:19 +03:00
Fixed lockups in FrSky SPI RX.
This commit is contained in:
parent
97ad4c64b2
commit
cb66ee09ba
4 changed files with 19 additions and 6 deletions
|
@ -194,7 +194,7 @@ rx_spi_received_e frSkyDHandlePacket(uint8_t * const packet, uint8_t * const pro
|
||||||
switch (*protocolState) {
|
switch (*protocolState) {
|
||||||
case STATE_STARTING:
|
case STATE_STARTING:
|
||||||
listLength = 47;
|
listLength = 47;
|
||||||
initialiseData(0);
|
initialiseData(false);
|
||||||
*protocolState = STATE_UPDATE;
|
*protocolState = STATE_UPDATE;
|
||||||
nextChannel(1);
|
nextChannel(1);
|
||||||
cc2500Strobe(CC2500_SRX);
|
cc2500Strobe(CC2500_SRX);
|
||||||
|
@ -218,9 +218,11 @@ rx_spi_received_e frSkyDHandlePacket(uint8_t * const packet, uint8_t * const pro
|
||||||
case STATE_DATA:
|
case STATE_DATA:
|
||||||
if (cc2500getGdo()) {
|
if (cc2500getGdo()) {
|
||||||
uint8_t ccLen = cc2500ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F;
|
uint8_t ccLen = cc2500ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F;
|
||||||
|
bool packetOk = false;
|
||||||
if (ccLen >= 20) {
|
if (ccLen >= 20) {
|
||||||
cc2500ReadFifo(packet, 20);
|
cc2500ReadFifo(packet, 20);
|
||||||
if (packet[19] & 0x80) {
|
if (packet[19] & 0x80) {
|
||||||
|
packetOk = true;
|
||||||
missingPackets = 0;
|
missingPackets = 0;
|
||||||
timeoutUs = 1;
|
timeoutUs = 1;
|
||||||
if (packet[0] == 0x11) {
|
if (packet[0] == 0x11) {
|
||||||
|
@ -246,6 +248,9 @@ rx_spi_received_e frSkyDHandlePacket(uint8_t * const packet, uint8_t * const pro
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!packetOk) {
|
||||||
|
cc2500Strobe(CC2500_SRX);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmpTimeUs(currentPacketReceivedTime, lastPacketReceivedTime) > (timeoutUs * SYNC_DELAY_MAX)) {
|
if (cmpTimeUs(currentPacketReceivedTime, lastPacketReceivedTime) > (timeoutUs * SYNC_DELAY_MAX)) {
|
||||||
|
|
|
@ -152,13 +152,16 @@ static void initialise() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void initialiseData(uint8_t adr)
|
void initialiseData(bool inBindState)
|
||||||
{
|
{
|
||||||
cc2500WriteReg(CC2500_0C_FSCTRL0, (uint8_t)rxCc2500SpiConfig()->bindOffset);
|
cc2500WriteReg(CC2500_0C_FSCTRL0, (uint8_t)rxCc2500SpiConfig()->bindOffset);
|
||||||
cc2500WriteReg(CC2500_18_MCSM0, 0x8);
|
cc2500WriteReg(CC2500_18_MCSM0, 0x8);
|
||||||
cc2500WriteReg(CC2500_09_ADDR, adr ? 0x03 : rxCc2500SpiConfig()->bindTxId[0]);
|
cc2500WriteReg(CC2500_09_ADDR, inBindState ? 0x03 : rxCc2500SpiConfig()->bindTxId[0]);
|
||||||
cc2500WriteReg(CC2500_07_PKTCTRL1, 0x0D);
|
cc2500WriteReg(CC2500_07_PKTCTRL1, 0x0D);
|
||||||
cc2500WriteReg(CC2500_19_FOCCFG, 0x16);
|
cc2500WriteReg(CC2500_19_FOCCFG, 0x16);
|
||||||
|
if (!inBindState) {
|
||||||
|
cc2500WriteReg(CC2500_03_FIFOTHR, 0x14);
|
||||||
|
}
|
||||||
delay(10);
|
delay(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -334,7 +337,7 @@ rx_spi_received_e frSkySpiDataReceived(uint8_t *packet)
|
||||||
case STATE_BIND_TUNING:
|
case STATE_BIND_TUNING:
|
||||||
if (tuneRx(packet)) {
|
if (tuneRx(packet)) {
|
||||||
initGetBind();
|
initGetBind();
|
||||||
initialiseData(1);
|
initialiseData(true);
|
||||||
|
|
||||||
protocolState = STATE_BIND_BINDING1;
|
protocolState = STATE_BIND_BINDING1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,6 +51,6 @@ extern uint8_t listLength;
|
||||||
extern uint32_t missingPackets;
|
extern uint32_t missingPackets;
|
||||||
extern timeDelta_t timeoutUs;
|
extern timeDelta_t timeoutUs;
|
||||||
|
|
||||||
void initialiseData(uint8_t adr);
|
void initialiseData(bool inBindState);
|
||||||
|
|
||||||
void nextChannel(uint8_t skip);
|
void nextChannel(uint8_t skip);
|
||||||
|
|
|
@ -346,7 +346,7 @@ rx_spi_received_e frSkyXHandlePacket(uint8_t * const packet, uint8_t * const pro
|
||||||
switch (*protocolState) {
|
switch (*protocolState) {
|
||||||
case STATE_STARTING:
|
case STATE_STARTING:
|
||||||
listLength = 47;
|
listLength = 47;
|
||||||
initialiseData(0);
|
initialiseData(false);
|
||||||
*protocolState = STATE_UPDATE;
|
*protocolState = STATE_UPDATE;
|
||||||
nextChannel(1);
|
nextChannel(1);
|
||||||
cc2500Strobe(CC2500_SRX);
|
cc2500Strobe(CC2500_SRX);
|
||||||
|
@ -369,10 +369,12 @@ rx_spi_received_e frSkyXHandlePacket(uint8_t * const packet, uint8_t * const pro
|
||||||
// here FS code could be
|
// here FS code could be
|
||||||
case STATE_DATA:
|
case STATE_DATA:
|
||||||
if (cc2500getGdo() && (frameReceived == false)){
|
if (cc2500getGdo() && (frameReceived == false)){
|
||||||
|
bool packetOk = false;
|
||||||
uint8_t ccLen = cc2500ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F;
|
uint8_t ccLen = cc2500ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F;
|
||||||
if (ccLen >= packetLength) {
|
if (ccLen >= packetLength) {
|
||||||
cc2500ReadFifo(packet, packetLength);
|
cc2500ReadFifo(packet, packetLength);
|
||||||
if (isValidPacket(packet)) {
|
if (isValidPacket(packet)) {
|
||||||
|
packetOk = true;
|
||||||
missingPackets = 0;
|
missingPackets = 0;
|
||||||
timeoutUs = 1;
|
timeoutUs = 1;
|
||||||
receiveDelayUs = 0;
|
receiveDelayUs = 0;
|
||||||
|
@ -447,6 +449,9 @@ rx_spi_received_e frSkyXHandlePacket(uint8_t * const packet, uint8_t * const pro
|
||||||
DEBUG_SET(DEBUG_RX_FRSKY_SPI, DEBUG_DATA_BAD_FRAME, packetErrors);
|
DEBUG_SET(DEBUG_RX_FRSKY_SPI, DEBUG_DATA_BAD_FRAME, packetErrors);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!packetOk) {
|
||||||
|
cc2500Strobe(CC2500_SRX);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (telemetryReceived) {
|
if (telemetryReceived) {
|
||||||
if (cmpTimeUs(micros(), packetTimerUs) > receiveDelayUs) { // if received or not received in this time sent telemetry data
|
if (cmpTimeUs(micros(), packetTimerUs) > receiveDelayUs) { // if received or not received in this time sent telemetry data
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue