From 90b287f1f418262062d5d628afd3e73b4dfbe8e3 Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Sat, 6 Jun 2020 01:57:52 +0200 Subject: [PATCH] Multi 5-in-1 initial support --- Multiprotocol/FrSkyR9_sx1276.ino | 212 ++++++++++----------------- Multiprotocol/Multiprotocol.h | 2 +- Multiprotocol/Multiprotocol.ino | 35 +++-- Multiprotocol/Pins.h | 16 ++ Multiprotocol/SX1276_SPI.ino | 24 ++- Multiprotocol/Validate.h | 14 +- Multiprotocol/XN297Dump_nrf24l01.ino | 4 +- Multiprotocol/_Config.h | 9 +- Protocols_Details.md | 7 +- 9 files changed, 162 insertions(+), 161 deletions(-) diff --git a/Multiprotocol/FrSkyR9_sx1276.ino b/Multiprotocol/FrSkyR9_sx1276.ino index 6ff4690..90bc00d 100644 --- a/Multiprotocol/FrSkyR9_sx1276.ino +++ b/Multiprotocol/FrSkyR9_sx1276.ino @@ -1,96 +1,79 @@ #if defined(FRSKYR9_SX1276_INO) #include "iface_sx1276.h" -#define FREQ_MAP_SIZE 29 +#define FREQ_MAP_SIZE 29 -// TODO the channel spacing is equal, consider calculating the new channel instead of using lookup tables (first_chan + index * step) +uint8_t FrSkyR9_step = 1; +uint32_t FrSkyR9_freq_map[FREQ_MAP_SIZE]; -static uint32_t FrSkyR9_freq_map_915[FREQ_MAP_SIZE] = +static void __attribute__((unused)) FrSkyR9_build_packet() { - 914472960, - 914972672, - 915472384, - 915972096, - 916471808, - 916971520, - 917471232, - 917970944, - 918470656, - 918970368, - 919470080, - 919969792, - 920469504, - 920969216, - 921468928, - 921968640, - 922468352, - 922968064, - 923467776, - 923967488, - 924467200, - 924966912, - 925466624, - 925966336, - 926466048, - 926965760, - 927465472, + //Header + packet[0] = 0x3C; // unknown but constant - // last two determined by FrSkyR9_step - 0, - 0 -}; + //ID + packet[1] = rx_tx_addr[3]; + packet[2] = rx_tx_addr[2]; -static uint32_t FrSkyR9_freq_map_868[FREQ_MAP_SIZE] = -{ - 859504640, - 860004352, - 860504064, - 861003776, - 861503488, - 862003200, - 862502912, - 863002624, - 863502336, - 864002048, - 864501760, - 865001472, - 865501184, - 866000896, - 866500608, - 867000320, - 867500032, - 867999744, - 868499456, - 868999168, - 869498880, - 869998592, - 870498304, - 870998016, - 871497728, - 871997440, - 872497152, + //Hopping + packet[3] = hopping_frequency_no; // current channel index + packet[4] = FrSkyR9_step; // step size and last 2 channels start index - // last two determined by FrSkyR9_step - 0, - 0 -}; + //RX number + packet[5] = RX_num; // receiver number from OpenTX -static uint8_t FrSkyR9_step = 1; -static uint32_t* FrSkyR9_freq_map = FrSkyR9_freq_map_915; + // Set packet[6]=failsafe, packet[7]=0?? and packet[8..19]=channels data + FrSkyX_channels(6); + + //Bind + if(IS_BIND_IN_PROGRESS) + packet[6] = 0x41; + + //SPort + packet[20] = 0x08; //FrSkyX_TX_Seq=8 at startup + packet[21] = 0x00; // length? + packet[22] = 0x00; // data1? + packet[23] = 0x00; // data2? + + //CRC + uint16_t crc = FrSkyX_crc(packet, 24); + packet[24] = crc; // low byte + packet[25] = crc >> 8; // high byte +} uint16_t initFrSkyR9() { set_rx_tx_addr(MProtocol_id_master); - if(sub_protocol & 0x01) - FrSkyR9_freq_map = FrSkyR9_freq_map_868; - else - FrSkyR9_freq_map = FrSkyR9_freq_map_915; - + //FrSkyR9_step FrSkyR9_step = 1 + (random(0xfefefefe) % 24); - FrSkyR9_freq_map[27] = FrSkyR9_freq_map[FrSkyR9_step]; - FrSkyR9_freq_map[28] = FrSkyR9_freq_map[FrSkyR9_step+1]; + debugln("Step=%d", FrSkyR9_step); + + //Frequency table + uint32_t start_freq=914472960; //915 + if(sub_protocol & 0x01) + start_freq=859504640; //868 + for(uint8_t i=0;i> 8) | (ch2 << 4); - packet[CH_POS + i + 2] = (ch2 >> 4); - - chan_index += 2; - } - - if((sub_protocol & 0x02) == 0) - chan_start ^= 0x08; // Alternate between lower and upper when 16 channels is used - - packet[20] = 0x08; // ???? - packet[21] = 0x00; // ???? - packet[22] = 0x00; // ???? - packet[23] = 0x00; // ???? - - uint16_t crc = FrSkyX_crc(packet, 24); - - packet[24] = crc; // low byte - packet[25] = crc >> 8; // high byte - - SX1276_WritePayloadToFifo(packet, 26); - + //Set frequency hopping_frequency_no = (hopping_frequency_no + FrSkyR9_step) % FREQ_MAP_SIZE; + SX1276_SetFrequency(FrSkyR9_freq_map[hopping_frequency_no]); // set current center frequency + delayMicroseconds(500); //Frequency settle time + //Build packet + FrSkyR9_build_packet(); + + //Send + SX1276_WritePayloadToFifo(packet, 26); SX1276_SetMode(true, false, SX1276_OPMODE_TX); // need to clear RegIrqFlags? - return 19400; + return 20000; } #endif \ No newline at end of file diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index 1803d30..a1e99b0 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 3 #define VERSION_REVISION 1 -#define VERSION_PATCH_LEVEL 12 +#define VERSION_PATCH_LEVEL 13 //****************** // Protocols diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index 21df352..253bdeb 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -300,12 +300,12 @@ void setup() PORTE.DIRCLR = 0x02 ; // Timer1 config // TCC1 16-bit timer, clocked at 0.5uS - EVSYS.CH3MUX = 0x80 + 0x04 ; // Prescaler of 16 + EVSYS.CH3MUX = 0x80 + 0x04 ; // Prescaler of 16 TCC1.CTRLB = 0; TCC1.CTRLC = 0; TCC1.CTRLD = 0; TCC1.CTRLE = 0; TCC1.INTCTRLA = 0; TIMSK1 = 0; TCC1.PER = 0xFFFF ; TCNT1 = 0 ; - TCC1.CTRLA = 0x0B ; // Event3 (prescale of 16) + TCC1.CTRLA = 0x0B ; // Event3 (prescale of 16) #elif defined STM32_BOARD //STM32 afio_cfg_debug_ports(AFIO_DEBUG_NONE); @@ -322,7 +322,7 @@ void setup() pinMode(RX_INV_pin,OUTPUT); #if defined TELEMETRY #if defined INVERT_SERIAL - TX_INV_on; //activate inverter for both serial TX and RX signals + TX_INV_on; // activate inverter for both serial TX and RX signals RX_INV_on; #else TX_INV_off; @@ -331,11 +331,20 @@ void setup() #endif pinMode(BIND_pin,INPUT_PULLUP); pinMode(PPM_pin,INPUT); - pinMode(S1_pin,INPUT_PULLUP);//dial switch + pinMode(S1_pin,INPUT_PULLUP); // dial switch pinMode(S2_pin,INPUT_PULLUP); pinMode(S3_pin,INPUT_PULLUP); pinMode(S4_pin,INPUT_PULLUP); + #ifdef MULTI_5IN1_INTERNAL + //pinMode(SX1276_RST_pin,OUTPUT); // already done by LED2_pin + pinMode(SX1276_TXEN_pin,OUTPUT); // PB0 + pinMode(SX1276_DIO0_pin,INPUT_PULLUP); + #else + //Random pin + pinMode(RND_pin, INPUT_ANALOG); // set up PB0 pin for analog input + #endif + #if defined ENABLE_DIRECT_INPUTS #if defined (DI1_PIN) pinMode(DI1_PIN,INPUT_PULLUP); @@ -350,12 +359,9 @@ void setup() pinMode(DI4_PIN,INPUT_PULLUP); #endif #endif - - //Random pins - pinMode(PB0, INPUT_ANALOG); // set up pin for analog input //Timers - init_HWTimer(); //0.5us + init_HWTimer(); //0.5us #else //ATMEGA328p // all inputs @@ -410,6 +416,10 @@ void setup() #ifdef NRF_CSN_pin NRF_CSN_on; #endif + #ifdef SPI_CSN_pin + SPI_CSN_on; + #endif + // Set SPI lines #ifdef STM32_BOARD initSPI2(); @@ -473,7 +483,12 @@ void setup() #ifdef STM32_BOARD uint32_t seed=0; for(uint8_t i=0;i<4;i++) - seed=(seed<<8) | (analogRead(PB0)& 0xFF); + #ifdef RND_pin + seed=(seed<<8) | (analogRead(RND_pin)& 0xFF); + #else + //TODO find something to randomize... + seed=(seed<<8); + #endif randomSeed(seed); #else //Init the seed with a random value created from watchdog timer for all protocols requiring random values @@ -597,8 +612,8 @@ void setup() #endif #endif //ENABLE_SERIAL } - LED2_on; debugln("Init complete"); + LED2_on; } // Main diff --git a/Multiprotocol/Pins.h b/Multiprotocol/Pins.h index 075b5a8..fd1c7cc 100644 --- a/Multiprotocol/Pins.h +++ b/Multiprotocol/Pins.h @@ -223,6 +223,8 @@ #define S3_pin PA6 #define S4_pin PA7 // + #define RND_pin PB0 + // #define PE1_pin PB4 //PE1 #define PE2_pin PB5 //PE2 //CS pins @@ -313,6 +315,20 @@ #define DEBUG_PIN_toggle #endif + #ifdef MULTI_5IN1_INTERNAL + #undef RND_pin + #define SX1276_RST_pin PA2 //LED2 on other modules + #define SX1276_TXEN_pin PB0 //Random gen on other modules + #define SX1276_DIO0_pin PC13 //Unused on other modules + + #define SX1276_RST_on digitalWrite(SX1276_RST_pin,HIGH) + #define SX1276_RST_off digitalWrite(SX1276_RST_pin,LOW) + #define SX1276_TXEN_on digitalWrite(SX1276_TXEN_pin,HIGH) + #define SX1276_RXEN_on digitalWrite(SX1276_TXEN_pin,LOW) + #define IS_DIO0_on ( digitalRead(SX1276_DIO0_pin)==HIGH ) + #define IS_DIO0_off ( digitalRead(SX1276_DIO0_pin)==LOW ) + #endif + #define cli() noInterrupts() #define sei() interrupts() #define delayMilliseconds(x) delay(x) diff --git a/Multiprotocol/SX1276_SPI.ino b/Multiprotocol/SX1276_SPI.ino index 3b6c49c..41a2cb2 100644 --- a/Multiprotocol/SX1276_SPI.ino +++ b/Multiprotocol/SX1276_SPI.ino @@ -33,18 +33,32 @@ void SX1276_WriteRegisterMulti(uint8_t address, const uint8_t* data, uint8_t len uint8_t SX1276_Reset() { - //TODO - + //TODO when pin is not wired + #ifdef SX1276_RST_pin + SX1276_RST_off; + delayMicroseconds(200); + SX1276_RST_on; + #endif return 0; } +void SX1276_SetTxRxMode(uint8_t mode) +{ + #ifdef SX1276_TXEN_pin + if(mode == TX_EN) + SX1276_TXEN_on; + else + SX1276_RXEN_on; + #endif +} + void SX1276_SetFrequency(uint32_t frequency) { uint32_t f = frequency / 61; uint8_t data[3]; - data[0] = (f & (0xFF << 16)) >> 16; - data[1] = (f & (0xFF << 8)) >> 8; - data[2] = f & 0xFF; + data[0] = f >> 16; + data[1] = f >> 8; + data[2] = f; SX1276_WriteRegisterMulti(SX1276_06_FRFMSB, data, 3); } diff --git a/Multiprotocol/Validate.h b/Multiprotocol/Validate.h index 217fd99..1bfab72 100644 --- a/Multiprotocol/Validate.h +++ b/Multiprotocol/Validate.h @@ -185,12 +185,24 @@ #undef CC25_CSN_pin #undef NRF24L01_INSTALLED // Disable NRF for OrangeTX module #undef NRF_CSN_pin - #undef SX1276_INSTALLED // Disable NRF for OrangeTX module + #undef SX1276_INSTALLED // Disable SX1276 for OrangeTX module #define TELEMETRY // Enable telemetry #define INVERT_TELEMETRY // Enable invert telemetry #define DSM_TELEMETRY // Enable DSM telemetry #endif +//Change/Force RF chip configuration if MULTI_5IN1_INTERNAL +#ifdef MULTI_5IN1_INTERNAL + #if not defined(STM32_BOARD) + #error "Error MULTI_5IN1_INTERNAL is only for STM32 boards." + #endif + #define A7105_INSTALLED + #define CYRF6936_INSTALLED + #define CC2500_INSTALLED + #define NRF24L01_INSTALLED + #define SX1276_INSTALLED +#endif + //Make sure protocols are selected correctly #ifndef A7105_INSTALLED #undef AFHDS2A_A7105_INO diff --git a/Multiprotocol/XN297Dump_nrf24l01.ino b/Multiprotocol/XN297Dump_nrf24l01.ino index d5b06bd..54eea85 100644 --- a/Multiprotocol/XN297Dump_nrf24l01.ino +++ b/Multiprotocol/XN297Dump_nrf24l01.ino @@ -414,7 +414,7 @@ static uint16_t XN297Dump_callback() packet_count=0; bind_counter=0; debugln("Time between CH:%d and CH:%d",hopping_frequency[0],hopping_frequency[hopping_frequency_no]); - time_rf[hopping_frequency_no]=-1; + time_rf[hopping_frequency_no]=0xFFFFFFFF; NRF24L01_WriteReg(NRF24L01_05_RF_CH,hopping_frequency[0]); uint16_t timeL=TCNT1; if(TIMER2_BASE->SR & TIMER_SR_UIF) @@ -504,7 +504,7 @@ static uint16_t XN297Dump_callback() do { time=time_rf[i]; - if(time!=-1) + if(time!=0xFFFFFFFF) { next=i; for(uint8_t j=2;j