1
0
Fork 0
mirror of https://github.com/iNavFlight/inav.git synced 2025-07-23 16:25:26 +03:00

Fix to syma nrf24l01 protocol (#565)

This commit is contained in:
Martin Budden 2016-09-05 12:03:55 +01:00 committed by Konstantin Sharlaimov
parent f262154ea9
commit 32eaa7bcd9
4 changed files with 28 additions and 27 deletions

View file

@ -261,7 +261,6 @@ void NRF24L01_SetupBasic(void)
NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // No auto acknowledgment NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // No auto acknowledgment
NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, BV(NRF24L01_02_EN_RXADDR_ERX_P0)); NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, BV(NRF24L01_02_EN_RXADDR_ERX_P0));
NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, NRF24L01_03_SETUP_AW_5BYTES); // 5-byte RX/TX address NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, NRF24L01_03_SETUP_AW_5BYTES); // 5-byte RX/TX address
NRF24L01_WriteReg(NRF24L01_08_OBSERVE_TX, 0x00); // Don't count lost or retransmitted packets
NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 0x00); // Disable dynamic payload length on all pipes NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 0x00); // Disable dynamic payload length on all pipes
} }
@ -326,6 +325,9 @@ bool NRF24L01_ReadPayloadIfAvailable(uint8_t *data, uint8_t length)
} }
#ifndef UNIT_TEST #ifndef UNIT_TEST
/*
* Fast read of payload, for use in interrupt service routine
*/
bool NRF24L01_ReadPayloadIfAvailableFast(uint8_t *data, uint8_t length) bool NRF24L01_ReadPayloadIfAvailableFast(uint8_t *data, uint8_t length)
{ {
// number of bits transferred = 8 * (3 + length) // number of bits transferred = 8 * (3 + length)
@ -333,10 +335,13 @@ bool NRF24L01_ReadPayloadIfAvailableFast(uint8_t *data, uint8_t length)
// at 50MHz clock rate that is approximately 3 microseconds // at 50MHz clock rate that is approximately 3 microseconds
bool ret = false; bool ret = false;
ENABLE_NRF24(); ENABLE_NRF24();
nrf24TransferByte(R_REGISTER | (REGISTER_MASK & NRF24L01_17_FIFO_STATUS)); nrf24TransferByte(R_REGISTER | (REGISTER_MASK & NRF24L01_07_STATUS));
const uint8_t fifoStatus = nrf24TransferByte(NOP); const uint8_t status = nrf24TransferByte(NOP);
if ((fifoStatus & BV(NRF24L01_17_FIFO_STATUS_RX_EMPTY)) == 0) { if ((status & BV(NRF24L01_07_STATUS_RX_DR)) == 0) {
ret = true; ret = true;
// clear RX_DR flag
nrf24TransferByte(W_REGISTER | (REGISTER_MASK & NRF24L01_07_STATUS));
nrf24TransferByte(BV(NRF24L01_07_STATUS_RX_DR));
nrf24TransferByte(R_RX_PAYLOAD); nrf24TransferByte(R_RX_PAYLOAD);
for (uint8_t i = 0; i < length; i++) { for (uint8_t i = 0; i < length; i++) {
data[i] = nrf24TransferByte(NOP); data[i] = nrf24TransferByte(NOP);

View file

@ -707,7 +707,7 @@ const clivalue_t valueTable[] = {
#ifdef USE_RX_NRF24 #ifdef USE_RX_NRF24
{ "nrf24rx_protocol", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, &masterConfig.rxConfig.nrf24rx_protocol, .config.lookup = { TABLE_NRF24_RX }, 0 }, { "nrf24rx_protocol", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, &masterConfig.rxConfig.nrf24rx_protocol, .config.lookup = { TABLE_NRF24_RX }, 0 },
{ "nrf24rx_id", VAR_UINT32 | MASTER_VALUE, &masterConfig.rxConfig.nrf24rx_id, .config.minmax = { 0, 0 }, 0 }, { "nrf24rx_id", VAR_UINT32 | MASTER_VALUE, &masterConfig.rxConfig.nrf24rx_id, .config.minmax = { 0, 0 }, 0 },
{ "nrf24rx_rf_channel_count", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, &masterConfig.rxConfig.nrf24rx_rf_channel_count, .config.minmax = { 0, 8 }, 0 }, { "nrf24rx_rf_channel_count", VAR_UINT8 | MASTER_VALUE, &masterConfig.rxConfig.nrf24rx_rf_channel_count, .config.minmax = { 0, 8 }, 0 },
#endif #endif
#ifdef SPEKTRUM_BIND #ifdef SPEKTRUM_BIND
{ "spektrum_sat_bind", VAR_UINT8 | MASTER_VALUE, &masterConfig.rxConfig.spektrum_sat_bind, .config.minmax = { SPEKTRUM_SAT_BIND_DISABLED, SPEKTRUM_SAT_BIND_MAX}, 0 }, { "spektrum_sat_bind", VAR_UINT8 | MASTER_VALUE, &masterConfig.rxConfig.spektrum_sat_bind, .config.minmax = { SPEKTRUM_SAT_BIND_DISABLED, SPEKTRUM_SAT_BIND_MAX}, 0 },

View file

@ -23,11 +23,11 @@
#include <string.h> #include <string.h>
#include <platform.h> #include <platform.h>
#include "build/build_config.h"
#ifdef USE_RX_SYMA #ifdef USE_RX_SYMA
#include "build/build_config.h"
#include "drivers/rx_nrf24l01.h" #include "drivers/rx_nrf24l01.h"
#include "drivers/system.h" #include "drivers/system.h"
@ -54,7 +54,7 @@
* uses address received in bind packets * uses address received in bind packets
* hops between 4 channels generated from address received in bind packets * hops between 4 channels generated from address received in bind packets
* *
* SymaX5 Protocol * SymaX5C Protocol
* No auto acknowledgment * No auto acknowledgment
* Payload size is 16, static * Payload size is 16, static
* Data rate is 1Mbps * Data rate is 1Mbps
@ -222,20 +222,6 @@ static void setSymaXHoppingChannels(uint32_t addr)
} }
} }
static void symaSetBound(const uint8_t* rxTxAddr)
{
protocolState = STATE_DATA;
// using protocol NRF24L01_SYMA_X, since NRF24L01_SYMA_X5C went straight into data mode
// set the hopping channels as determined by the rxTxAddr received in the bind packet
setSymaXHoppingChannels(rxTxAddr[0]);
timeOfLastHop = micros();
packetCount = 0;
// set the NRF24 to use the rxTxAddr received in the bind packet
NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, rxTxAddr, RX_TX_ADDR_LEN);
symaRfChannelIndex = 0;
NRF24L01_SetChannel(symaRfChannels[0]);
}
/* /*
* This is called periodically by the scheduler. * This is called periodically by the scheduler.
* Returns NRF24_RECEIVED_DATA if a data packet was received. * Returns NRF24_RECEIVED_DATA if a data packet was received.
@ -243,26 +229,35 @@ static void symaSetBound(const uint8_t* rxTxAddr)
nrf24_received_t symaNrf24DataReceived(uint8_t *payload) nrf24_received_t symaNrf24DataReceived(uint8_t *payload)
{ {
nrf24_received_t ret = NRF24_RECEIVED_NONE; nrf24_received_t ret = NRF24_RECEIVED_NONE;
uint32_t timeNowUs;
switch (protocolState) { switch (protocolState) {
case STATE_BIND: case STATE_BIND:
if (NRF24L01_ReadPayloadIfAvailable(payload, payloadSize)) { if (NRF24L01_ReadPayloadIfAvailable(payload, payloadSize)) {
const bool bindPacket = symaCheckBindPacket(payload); const bool bindPacket = symaCheckBindPacket(payload);
if (bindPacket) { if (bindPacket) {
ret = NRF24_RECEIVED_BIND; ret = NRF24_RECEIVED_BIND;
symaSetBound(rxTxAddr); protocolState = STATE_DATA;
// using protocol NRF24L01_SYMA_X, since NRF24L01_SYMA_X5C went straight into data mode
// set the hopping channels as determined by the rxTxAddr received in the bind packet
setSymaXHoppingChannels(rxTxAddr[0]);
// set the NRF24 to use the rxTxAddr received in the bind packet
NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, rxTxAddr, RX_TX_ADDR_LEN);
packetCount = 0;
symaRfChannelIndex = 0;
NRF24L01_SetChannel(symaRfChannels[0]);
} }
} }
break; break;
case STATE_DATA: case STATE_DATA:
// read the payload, processing of payload is deferred // read the payload, processing of payload is deferred
if (NRF24L01_ReadPayloadIfAvailable(payload, payloadSize)) { if (NRF24L01_ReadPayloadIfAvailable(payload, payloadSize)) {
symaHopToNextChannel();
timeOfLastHop = micros();
ret = NRF24_RECEIVED_DATA; ret = NRF24_RECEIVED_DATA;
} }
timeNowUs = micros(); if (micros() > timeOfLastHop + hopTimeout) {
if ((ret == NRF24_RECEIVED_DATA) || (timeNowUs > timeOfLastHop + hopTimeout)) {
symaHopToNextChannel(); symaHopToNextChannel();
timeOfLastHop = timeNowUs; timeOfLastHop = micros();
} }
break; break;
} }

View file

@ -73,6 +73,7 @@
#define USE_RX_INAV #define USE_RX_INAV
#define USE_RX_SYMA #define USE_RX_SYMA
#define USE_RX_V202 #define USE_RX_V202
//#define NRF24_DEFAULT_PROTOCOL NRF24RX_SYMA_X5
//#define NRF24_DEFAULT_PROTOCOL NRF24RX_SYMA_X5C //#define NRF24_DEFAULT_PROTOCOL NRF24RX_SYMA_X5C
//#define NRF24_DEFAULT_PROTOCOL NRF24RX_INAV //#define NRF24_DEFAULT_PROTOCOL NRF24RX_INAV
//#define NRF24_DEFAULT_PROTOCOL NRF24RX_H8_3D //#define NRF24_DEFAULT_PROTOCOL NRF24RX_H8_3D