From 7bb26a7f07bea56028c6f59e6282271adb1fca71 Mon Sep 17 00:00:00 2001 From: pascallanger Date: Wed, 21 Dec 2016 18:05:55 +0100 Subject: [PATCH] FrSkyD and FrSkyX: random frequencies --- Multiprotocol/{Convert.ino => Common.ino} | 15 ++++++++ Multiprotocol/FrSkyD_cc2500.ino | 25 +++++-------- Multiprotocol/FrSkyX_cc2500.ino | 43 ++++++----------------- Multiprotocol/Multiprotocol.ino | 2 +- Multiprotocol/_Config.h | 2 +- 5 files changed, 36 insertions(+), 51 deletions(-) rename Multiprotocol/{Convert.ino => Common.ino} (83%) diff --git a/Multiprotocol/Convert.ino b/Multiprotocol/Common.ino similarity index 83% rename from Multiprotocol/Convert.ino rename to Multiprotocol/Common.ino index 07e7b2c..12f5c8a 100644 --- a/Multiprotocol/Convert.ino +++ b/Multiprotocol/Common.ino @@ -66,3 +66,18 @@ uint16_t limit_channel_100(uint8_t ch) return Servo_data[ch]; } +/******************************/ +/** FrSky D and X routines **/ +/******************************/ +void Frsky_init_hop(void) +{ + uint8_t channel = rx_tx_addr[0]&0x07; + uint8_t channel_spacing = (rx_tx_addr[1]&0x7F)+64; + for(uint8_t i=0;i<50;i++) + { + hopping_frequency[i]=i>47?0:channel; + channel=(channel+channel_spacing) % 0xEB; + if((channel==0x00) || (channel==0x5A) || (channel==0xDC)) + channel++; + } +} diff --git a/Multiprotocol/FrSkyD_cc2500.ino b/Multiprotocol/FrSkyD_cc2500.ino index 9bc2ff5..04b4057 100644 --- a/Multiprotocol/FrSkyD_cc2500.ino +++ b/Multiprotocol/FrSkyD_cc2500.ino @@ -50,16 +50,6 @@ static void __attribute__((unused)) frsky2way_init(uint8_t bind) //#######END INIT######## } -static uint8_t __attribute__((unused)) get_chan_num(uint16_t idx) -{ - uint8_t ret = (idx * 0x1e) % 0xeb; - if(idx == 3 || idx == 23 || idx == 47) - ret++; - if(idx > 47) - return 0; - return ret; -} - static void __attribute__((unused)) frsky2way_build_bind_packet() { //11 03 01 d7 2d 00 00 1e 3c 5b 78 00 00 00 00 00 00 01 @@ -71,11 +61,11 @@ static void __attribute__((unused)) frsky2way_build_bind_packet() packet[4] = rx_tx_addr[2]; uint16_t idx = ((state -FRSKY_BIND) % 10) * 5; packet[5] = idx; - packet[6] = get_chan_num(idx++); - packet[7] = get_chan_num(idx++); - packet[8] = get_chan_num(idx++); - packet[9] = get_chan_num(idx++); - packet[10] = get_chan_num(idx++); + packet[6] = hopping_frequency[idx++]; + packet[7] = hopping_frequency[idx++]; + packet[8] = hopping_frequency[idx++]; + packet[9] = hopping_frequency[idx++]; + packet[10] = hopping_frequency[idx++]; packet[11] = 0x00; packet[12] = 0x00; packet[13] = 0x00; @@ -124,6 +114,7 @@ static void __attribute__((unused)) frsky2way_data_frame() uint16_t initFrSky_2way() { + Frsky_init_hop(); if(IS_AUTOBIND_FLAG_on) { frsky2way_init(1); @@ -169,7 +160,7 @@ uint16_t ReadFrSky_2way() { //telemetry receive CC2500_SetTxRxMode(RX_EN); CC2500_Strobe(CC2500_SIDLE); - CC2500_WriteReg(CC2500_0A_CHANNR, get_chan_num(counter % 47)); + CC2500_WriteReg(CC2500_0A_CHANNR, hopping_frequency[counter % 47]); CC2500_WriteReg(CC2500_23_FSCAL3, 0x89); state++; return 1300; @@ -191,7 +182,7 @@ uint16_t ReadFrSky_2way() CC2500_SetPower(); // Set tx_power } CC2500_Strobe(CC2500_SIDLE); - CC2500_WriteReg(CC2500_0A_CHANNR, get_chan_num(counter % 47)); + CC2500_WriteReg(CC2500_0A_CHANNR, hopping_frequency[counter % 47]); if ( prev_option != option ) { CC2500_WriteReg(CC2500_0C_FSCTRL0,option); // Frequency offset hack diff --git a/Multiprotocol/FrSkyX_cc2500.ino b/Multiprotocol/FrSkyX_cc2500.ino index 474f190..86a0a70 100644 --- a/Multiprotocol/FrSkyX_cc2500.ino +++ b/Multiprotocol/FrSkyX_cc2500.ino @@ -26,29 +26,11 @@ uint8_t ctr; uint8_t seq_last_sent; uint8_t seq_last_rcvd; -const PROGMEM uint8_t hop_data[]={ - 0x02, 0xD4, 0xBB, 0xA2, 0x89, - 0x70, 0x57, 0x3E, 0x25, 0x0C, - 0xDE, 0xC5, 0xAC, 0x93, 0x7A, - 0x61, 0x48, 0x2F, 0x16, 0xE8, - 0xCF, 0xB6, 0x9D, 0x84, 0x6B, - 0x52, 0x39, 0x20, 0x07, 0xD9, - 0xC0, 0xA7, 0x8E, 0x75, 0x5C, - 0x43, 0x2A, 0x11, 0xE3, 0xCA, - 0xB1, 0x98, 0x7F, 0x66, 0x4D, - 0x34, 0x1B, 0x00, 0x1D, 0x03 -}; - -static uint8_t __attribute__((unused)) hop(uint8_t byte) -{ - return pgm_read_byte_near(&hop_data[byte]); -} - static void __attribute__((unused)) set_start(uint8_t ch ) { CC2500_Strobe(CC2500_SIDLE); CC2500_WriteReg(CC2500_25_FSCAL1, calData[ch]); - CC2500_WriteReg(CC2500_0A_CHANNR, ch==47? 0:hop(ch)); + CC2500_WriteReg(CC2500_0A_CHANNR, hopping_frequency[ch]); } static void __attribute__((unused)) frskyX_init() @@ -87,19 +69,14 @@ static void __attribute__((unused)) frskyX_init() CC2500_WriteReg(CC2500_0C_FSCTRL0, option); CC2500_Strobe(CC2500_SIDLE); // - for(uint8_t c=0;c < 47;c++) + for(uint8_t c=0;c < 48;c++) {//calibrate hop channels CC2500_Strobe(CC2500_SIDLE); - CC2500_WriteReg(CC2500_0A_CHANNR,hop(c)); + CC2500_WriteReg(CC2500_0A_CHANNR,hopping_frequency[c]); CC2500_Strobe(CC2500_SCAL); delayMicroseconds(900);// calData[c] = CC2500_ReadReg(CC2500_25_FSCAL1); } - CC2500_Strobe(CC2500_SIDLE); - CC2500_WriteReg(CC2500_0A_CHANNR,0x00); - CC2500_Strobe(CC2500_SCAL); - delayMicroseconds(900); - calData[47] = CC2500_ReadReg(CC2500_25_FSCAL1); //#######END INIT######## } @@ -148,11 +125,11 @@ static void __attribute__((unused)) frskyX_build_bind_packet() packet[4] = rx_tx_addr[2]; int idx = ((state -FRSKY_BIND) % 10) * 5; packet[5] = idx; - packet[6] = hop(idx++); - packet[7] = hop(idx++); - packet[8] = hop(idx++); - packet[9] = hop(idx++); - packet[10] = hop(idx++); + packet[6] = hopping_frequency[idx++]; + packet[7] = hopping_frequency[idx++]; + packet[8] = hopping_frequency[idx++]; + packet[9] = hopping_frequency[idx++]; + packet[10] = hopping_frequency[idx++]; packet[11] = 0x02; packet[12] = RX_num; // @@ -307,16 +284,18 @@ uint16_t ReadFrSkyX() uint16_t initFrSkyX() { + Frsky_init_hop(); while(!chanskip) chanskip=random(0xfefefefe)%47; while((chanskip-ctr)%4) ctr=(ctr+1)%4; - counter_rst=(chanskip-ctr)>>2; + //for test*************** //rx_tx_addr[3]=0xB3; //rx_tx_addr[2]=0xFD; //************************ + hopping_frequency[47]=0; frskyX_init(); CC2500_SetTxRxMode(TX_EN); // diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index 2a051aa..1f39c83 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -76,7 +76,7 @@ uint16_t packet_period; uint8_t packet_count; uint8_t packet_sent; uint8_t packet_length; -uint8_t hopping_frequency[23]; +uint8_t hopping_frequency[50]; uint8_t *hopping_frequency_ptr; uint8_t hopping_frequency_no=0; uint8_t rf_ch_num; diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index d40966c..094708a 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -73,8 +73,8 @@ #define J6PRO_CYRF6936_INO //The protocols below need a CC2500 to be installed -#define FRSKYD_CC2500_INO #define FRSKYV_CC2500_INO +#define FRSKYD_CC2500_INO #define FRSKYX_CC2500_INO #define SFHSS_CC2500_INO