1
0
Fork 0
mirror of https://github.com/iNavFlight/inav.git synced 2025-07-24 00:35:34 +03:00

Merge pull request #373 from martinbudden/nrf24_fixups

Fixed H8_3D protocol. Minor optimisations to other protocols
This commit is contained in:
Martin Budden 2016-07-23 11:11:55 +01:00 committed by GitHub
commit 19921a0a3c
8 changed files with 49 additions and 52 deletions

View file

@ -252,6 +252,18 @@ void NRF24L01_Initialize(uint8_t baseConfig)
// now in Standby mode
}
/*
* Common setup of registers
*/
void NRF24L01_Setup(void)
{
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_03_SETUP_AW, NRF24L01_03_SETUP_AW_5BYTES); // 5-byte RX/TX address
NRF24L01_WriteReg(NRF24L01_08_OBSERVE_TX, 0x00);
NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 0x00); // Disable dynamic payload length on all pipes
}
/*
* Enter standby mode
*/

View file

@ -136,6 +136,7 @@ void NRF24L01_FlushRx(void);
// Utility functions
void NRF24L01_Setup(void);
void NRF24L01_SetStandbyMode(void);
void NRF24L01_SetRxMode(void);
void NRF24L01_SetTxMode(void);

View file

@ -392,7 +392,6 @@ static const char * const lookupTableNRF24RX[] = {
"CX10",
"CX10A",
"H8_3D",
"H8_3D_DEV",
"REF"
};
#endif
@ -522,7 +521,6 @@ typedef struct cliLookupTableConfig_s {
typedef union {
cliLookupTableConfig_t lookup;
cliMinMaxConfig_t minmax;
} cliValueConfig_t;
typedef struct {

View file

@ -85,6 +85,7 @@ STATIC_UNIT_TESTED protocol_state_t protocolState;
static uint8_t payloadSize;
#define ACK_TO_SEND_COUNT 8
#define CRC_LEN 2
#define RX_TX_ADDR_LEN 5
//STATIC_UNIT_TESTED uint8_t rxTxAddr[RX_TX_ADDR_LEN] = {0xcc, 0xcc, 0xcc, 0xcc, 0xcc};
STATIC_UNIT_TESTED uint8_t txAddr[RX_TX_ADDR_LEN] = {0x55, 0x0F, 0x71, 0x0C, 0x00}; // converted XN297 address, 0xC710F55 (28 bit)
@ -97,8 +98,10 @@ STATIC_UNIT_TESTED uint8_t txId[TX_ID_LEN];
STATIC_UNIT_TESTED uint8_t cx10RfChannelIndex = 0;
STATIC_UNIT_TESTED uint8_t cx10RfChannels[RF_CHANNEL_COUNT]; // channels are set using txId from bind packet
#define CX10_PROTOCOL_HOP_TIMEOUT 1500 // 1.5ms
#define CX10A_PROTOCOL_HOP_TIMEOUT 6500 // 6.5ms
static uint32_t hopTimeout;
static uint32_t timeOfLastHop;
static const uint32_t hopTimeout = 5000; // 5ms
/*
* Returns true if it is a bind packet.
@ -179,8 +182,8 @@ nrf24_received_t cx10DataReceived(uint8_t *payload)
switch (protocolState) {
case STATE_BIND:
if (NRF24L01_ReadPayloadIfAvailable(payload, payloadSize + 2)) {
XN297_UnscramblePayload(payload, payloadSize + 2, rxAddr);
if (NRF24L01_ReadPayloadIfAvailable(payload, payloadSize + CRC_LEN)) {
XN297_UnscramblePayload(payload, payloadSize + CRC_LEN, rxAddr);
const bool bindPacket = cx10CheckBindPacket(payload);
if (bindPacket) {
// set the hopping channels as determined by the txId received in the bind packet
@ -232,8 +235,8 @@ nrf24_received_t cx10DataReceived(uint8_t *payload)
case STATE_DATA:
timeNowUs = micros();
// read the payload, processing of payload is deferred
if (NRF24L01_ReadPayloadIfAvailable(payload, payloadSize + 2)) {
XN297_UnscramblePayload(payload, payloadSize + 2, rxAddr);
if (NRF24L01_ReadPayloadIfAvailable(payload, payloadSize + CRC_LEN)) {
XN297_UnscramblePayload(payload, payloadSize + CRC_LEN, rxAddr);
cx10HopToNextChannel();
timeOfLastHop = timeNowUs;
ret = NRF24_RECEIVED_DATA;
@ -251,12 +254,11 @@ void cx10Nrf24Init(nrf24_protocol_t protocol)
cx10Protocol = protocol;
protocolState = STATE_BIND;
payloadSize = (protocol == NRF24RX_CX10) ? CX10_PROTOCOL_PAYLOAD_SIZE : CX10A_PROTOCOL_PAYLOAD_SIZE;
hopTimeout = (protocol == NRF24RX_CX10) ? CX10_PROTOCOL_HOP_TIMEOUT : CX10A_PROTOCOL_HOP_TIMEOUT;
NRF24L01_Initialize(0); // sets PWR_UP, no CRC
NRF24L01_Setup();
NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0);
NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, BV(NRF24L01_02_EN_RXADDR_ERX_P0)); // Enable data pipe 0 only
NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, NRF24L01_03_SETUP_AW_5BYTES); // 5-byte RX/TX address
NRF24L01_SetChannel(CX10_RF_BIND_CHANNEL);
NRF24L01_WriteReg(NRF24L01_06_RF_SETUP, NRF24L01_06_RF_SETUP_RF_DR_1Mbps | NRF24L01_06_RF_SETUP_RF_PWR_n12dbm);
@ -265,10 +267,7 @@ void cx10Nrf24Init(nrf24_protocol_t protocol)
NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, txAddr, RX_TX_ADDR_LEN);
NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, rxAddr, RX_TX_ADDR_LEN);
NRF24L01_WriteReg(NRF24L01_08_OBSERVE_TX, 0x00);
NRF24L01_WriteReg(NRF24L01_11_RX_PW_P0, payloadSize + 2); // payload + 2 bytes CRC
NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 0x00); // Disable dynamic payload length on all pipes
NRF24L01_WriteReg(NRF24L01_11_RX_PW_P0, payloadSize + CRC_LEN); // payload + 2 bytes CRC
NRF24L01_SetRxMode(); // enter receive mode to start listening for packets
}

View file

@ -68,8 +68,6 @@
#define FLAG_CAMERA_UP 0x04 // on payload[18]
#define FLAG_CAMERA_DOWN 0x08 // on payload[18]
STATIC_UNIT_TESTED nrf24_protocol_t h8_3dProtocol;
typedef enum {
STATE_BIND = 0,
STATE_DATA
@ -181,7 +179,7 @@ static void h8_3dHopToNextChannel(void)
// The hopping channels are determined by the txId
void h8_3dSetHoppingChannels(const uint8_t* txId)
{
#ifndef XXX
#ifdef XXX
for (int ii = 0; ii < H8_3D_RF_CHANNEL_COUNT; ++ii) {
h8_3dRfChannels[ii] = 0x06 + (0x0f * ii) + ((txId[ii] >> 4) + (txId[ii] & 0x0f)) % 0x0f;
}
@ -237,7 +235,7 @@ nrf24_received_t h8_3dDataReceived(uint8_t *payload)
case STATE_DATA:
// read the payload, processing of payload is deferred
if (NRF24L01_ReadPayloadIfAvailable(payload, payloadSize)) {
const uint16_t crc = XN297_UnscramblePayload(payload - CRC_LEN, payloadSize, rxTxAddrXN297);
const uint16_t crc = XN297_UnscramblePayload(payload, payloadSize - CRC_LEN, rxTxAddrXN297);
if (crcOK(crc, payload)) {
ret = NRF24_RECEIVED_DATA;
}
@ -252,29 +250,24 @@ nrf24_received_t h8_3dDataReceived(uint8_t *payload)
return ret;
}
void h8_3dNrf24Init(nrf24_protocol_t protocol, const uint8_t* nrf24_id)
void h8_3dNrf24Init(nrf24_protocol_t protocol, uint32_t nrf24_id)
{
h8_3dProtocol = protocol;
UNUSED(protocol);
protocolState = STATE_BIND;
NRF24L01_Initialize(0); // sets PWR_UP, no CRC - hardware CRC not used for XN297
NRF24L01_Setup();
NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0); // No auto acknowledgment
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_06_RF_SETUP, NRF24L01_06_RF_SETUP_RF_DR_1Mbps | NRF24L01_06_RF_SETUP_RF_PWR_n12dbm);
// RX_ADDR for pipes P1-P5 are left at default values
NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, rxTxAddrXN297, RX_TX_ADDR_LEN);
if ((nrf24_id[0] | nrf24_id[1] | nrf24_id[2] | nrf24_id[3]) == 0) {
if (nrf24_id == 0) {
h8_3dRfChannelIndex = H8_3D_RF_BIND_CHANNEL_START;
NRF24L01_SetChannel(H8_3D_RF_BIND_CHANNEL_START);
} else {
h8_3dSetBound(nrf24_id);
h8_3dSetBound((uint8_t*)&nrf24_id);
}
NRF24L01_WriteReg(NRF24L01_08_OBSERVE_TX, 0x00);
NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 0x00); // Disable dynamic payload length on all pipes
payloadSize = H8_3D_PROTOCOL_PAYLOAD_SIZE + CRC_LEN; // payload + 2 bytes CRC
NRF24L01_WriteReg(NRF24L01_11_RX_PW_P0, payloadSize); // payload + 2 bytes CRC
@ -284,6 +277,6 @@ void h8_3dNrf24Init(nrf24_protocol_t protocol, const uint8_t* nrf24_id)
void h8_3dInit(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig)
{
rxRuntimeConfig->channelCount = RC_CHANNEL_COUNT;
h8_3dNrf24Init((nrf24_protocol_t)rxConfig->nrf24rx_protocol, rxConfig->nrf24rx_id);
h8_3dNrf24Init((nrf24_protocol_t)rxConfig->nrf24rx_protocol, 0);
}
#endif

View file

@ -220,34 +220,25 @@ nrf24_received_t refDataReceived(uint8_t *payload)
return ret;
}
void refNrf24Init(nrf24_protocol_t protocol, const uint8_t* nrf24_id)
void refNrf24Init(nrf24_protocol_t protocol, uint32_t nrf24_id)
{
UNUSED(protocol);
UNUSED(nrf24_id);
NRF24L01_Initialize(BV(NRF24L01_00_CONFIG_EN_CRC) | BV( NRF24L01_00_CONFIG_CRCO)); // sets PWR_UP, EN_CRC, CRCO - 2 byte CRC
NRF24L01_Setup();
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_03_SETUP_AW, NRF24L01_03_SETUP_AW_5BYTES); // 5-byte RX/TX address
//if ((nrf24_id != NULL) && ((nrf24_id[0] | nrf24_id[1] | nrf24_id[2] | nrf24_id[3] | nrf24_id[4]) == 0)) {
if (nrf24_id == 0) {
protocolState = STATE_BIND;
NRF24L01_SetChannel(REF_RF_BIND_CHANNEL);
/*} else {
rxTxAddr[0] = nrf24_id[0];
rxTxAddr[1] = nrf24_id[1];
rxTxAddr[2] = nrf24_id[2];
rxTxAddr[3] = nrf24_id[3];
rxTxAddr[4] = nrf24_id[4];
refSetBound(nrf24_id);
}*/
} else {
memcpy(rxTxAddr, (uint8_t*)nrf24_id, sizeof(uint32_t));
rxTxAddr[4] = 0xD2;
refSetBound();
}
NRF24L01_WriteReg(NRF24L01_06_RF_SETUP, NRF24L01_06_RF_SETUP_RF_DR_250Kbps | NRF24L01_06_RF_SETUP_RF_PWR_n12dbm);
// RX_ADDR for pipes P1-P5 are left at default values
NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, rxTxAddr, RX_TX_ADDR_LEN);
NRF24L01_WriteReg(NRF24L01_08_OBSERVE_TX, 0x00);
NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 0x00); // Disable dynamic payload length on all pipes
NRF24L01_WriteReg(NRF24L01_11_RX_PW_P0, payloadSize);
NRF24L01_SetRxMode(); // enter receive mode to start listening for packets
}
@ -255,8 +246,8 @@ void refNrf24Init(nrf24_protocol_t protocol, const uint8_t* nrf24_id)
void refInit(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig)
{
rxRuntimeConfig->channelCount = RC_CHANNEL_COUNT;
//refNrf24Init((nrf24_protocol_t)rxConfig->nrf24rx_protocol, rxConfig->nrf24rx_address);
refNrf24Init((nrf24_protocol_t)rxConfig->nrf24rx_protocol, NULL);
//refNrf24Init((nrf24_protocol_t)rxConfig->nrf24rx_protocol, rxConfig->nrf24rx_id);
refNrf24Init((nrf24_protocol_t)rxConfig->nrf24rx_protocol, 0);
}
#endif

View file

@ -108,12 +108,11 @@ typedef struct rxChannelRangeConfiguration_s {
uint16_t max;
} rxChannelRangeConfiguration_t;
#define NRF24RX_ID_LEN 5
typedef struct rxConfig_s {
uint8_t rcmap[MAX_MAPPABLE_RX_INPUTS]; // mapping of radio channels to internal RPYTA+ order
uint8_t serialrx_provider; // type of UART-based receiver (0 = spek 10, 1 = spek 11, 2 = sbus). Must be enabled by FEATURE_RX_SERIAL first.
uint8_t nrf24rx_protocol; // type of nrf24 protocol (0 = v202 250kbps). Must be enabled by FEATURE_RX_NRF24 first.
uint8_t nrf24rx_id[NRF24RX_ID_LEN];
uint32_t nrf24rx_id;
uint8_t spektrum_sat_bind; // number of bind pulses for Spektrum satellite receivers
uint8_t rssi_channel;
uint8_t rssi_scale;

View file

@ -34,7 +34,7 @@
#define ACC
#define USE_ACC_MPU6050
#define MAG
//#define MAG
#define USE_MAG_HMC5883
#define USE_USART1
@ -66,11 +66,15 @@
#define USE_RX_NRF24
#define USE_RX_CX10
#define USE_RX_H8_3D
#define USE_RX_REF
#define USE_RX_SYMA
#define USE_RX_V202
#define NRF24_DEFAULT_PROTOCOL NRF24RX_SYMA_X5C
//#define NRF24_DEFAULT_PROTOCOL NRF24RX_SYMA_X5C
//#define NRF24_DEFAULT_PROTOCOL NRF24RX_REF
//#define NRF24_DEFAULT_PROTOCOL NRF24RX_H8_3D
//#define NRF24_DEFAULT_PROTOCOL NRF24RX_CX10A
#define NRF24_DEFAULT_PROTOCOL NRF24RX_V202_1M
#define DEFAULT_RX_FEATURE FEATURE_RX_NRF24
#define SKIP_RX_PWM_PPM