mirror of
https://github.com/pascallanger/DIY-Multiprotocol-TX-Module.git
synced 2025-02-10 01:48:13 +00:00
FrSkyD and FrSkyX: random frequencies
This commit is contained in:
parent
9585b3919a
commit
7bb26a7f07
@ -66,3 +66,18 @@ uint16_t limit_channel_100(uint8_t ch)
|
|||||||
return Servo_data[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++;
|
||||||
|
}
|
||||||
|
}
|
@ -50,16 +50,6 @@ static void __attribute__((unused)) frsky2way_init(uint8_t bind)
|
|||||||
//#######END INIT########
|
//#######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()
|
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
|
//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];
|
packet[4] = rx_tx_addr[2];
|
||||||
uint16_t idx = ((state -FRSKY_BIND) % 10) * 5;
|
uint16_t idx = ((state -FRSKY_BIND) % 10) * 5;
|
||||||
packet[5] = idx;
|
packet[5] = idx;
|
||||||
packet[6] = get_chan_num(idx++);
|
packet[6] = hopping_frequency[idx++];
|
||||||
packet[7] = get_chan_num(idx++);
|
packet[7] = hopping_frequency[idx++];
|
||||||
packet[8] = get_chan_num(idx++);
|
packet[8] = hopping_frequency[idx++];
|
||||||
packet[9] = get_chan_num(idx++);
|
packet[9] = hopping_frequency[idx++];
|
||||||
packet[10] = get_chan_num(idx++);
|
packet[10] = hopping_frequency[idx++];
|
||||||
packet[11] = 0x00;
|
packet[11] = 0x00;
|
||||||
packet[12] = 0x00;
|
packet[12] = 0x00;
|
||||||
packet[13] = 0x00;
|
packet[13] = 0x00;
|
||||||
@ -124,6 +114,7 @@ static void __attribute__((unused)) frsky2way_data_frame()
|
|||||||
|
|
||||||
uint16_t initFrSky_2way()
|
uint16_t initFrSky_2way()
|
||||||
{
|
{
|
||||||
|
Frsky_init_hop();
|
||||||
if(IS_AUTOBIND_FLAG_on)
|
if(IS_AUTOBIND_FLAG_on)
|
||||||
{
|
{
|
||||||
frsky2way_init(1);
|
frsky2way_init(1);
|
||||||
@ -169,7 +160,7 @@ uint16_t ReadFrSky_2way()
|
|||||||
{ //telemetry receive
|
{ //telemetry receive
|
||||||
CC2500_SetTxRxMode(RX_EN);
|
CC2500_SetTxRxMode(RX_EN);
|
||||||
CC2500_Strobe(CC2500_SIDLE);
|
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);
|
CC2500_WriteReg(CC2500_23_FSCAL3, 0x89);
|
||||||
state++;
|
state++;
|
||||||
return 1300;
|
return 1300;
|
||||||
@ -191,7 +182,7 @@ uint16_t ReadFrSky_2way()
|
|||||||
CC2500_SetPower(); // Set tx_power
|
CC2500_SetPower(); // Set tx_power
|
||||||
}
|
}
|
||||||
CC2500_Strobe(CC2500_SIDLE);
|
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 )
|
if ( prev_option != option )
|
||||||
{
|
{
|
||||||
CC2500_WriteReg(CC2500_0C_FSCTRL0,option); // Frequency offset hack
|
CC2500_WriteReg(CC2500_0C_FSCTRL0,option); // Frequency offset hack
|
||||||
|
@ -26,29 +26,11 @@ uint8_t ctr;
|
|||||||
uint8_t seq_last_sent;
|
uint8_t seq_last_sent;
|
||||||
uint8_t seq_last_rcvd;
|
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 )
|
static void __attribute__((unused)) set_start(uint8_t ch )
|
||||||
{
|
{
|
||||||
CC2500_Strobe(CC2500_SIDLE);
|
CC2500_Strobe(CC2500_SIDLE);
|
||||||
CC2500_WriteReg(CC2500_25_FSCAL1, calData[ch]);
|
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()
|
static void __attribute__((unused)) frskyX_init()
|
||||||
@ -87,19 +69,14 @@ static void __attribute__((unused)) frskyX_init()
|
|||||||
CC2500_WriteReg(CC2500_0C_FSCTRL0, option);
|
CC2500_WriteReg(CC2500_0C_FSCTRL0, option);
|
||||||
CC2500_Strobe(CC2500_SIDLE);
|
CC2500_Strobe(CC2500_SIDLE);
|
||||||
//
|
//
|
||||||
for(uint8_t c=0;c < 47;c++)
|
for(uint8_t c=0;c < 48;c++)
|
||||||
{//calibrate hop channels
|
{//calibrate hop channels
|
||||||
CC2500_Strobe(CC2500_SIDLE);
|
CC2500_Strobe(CC2500_SIDLE);
|
||||||
CC2500_WriteReg(CC2500_0A_CHANNR,hop(c));
|
CC2500_WriteReg(CC2500_0A_CHANNR,hopping_frequency[c]);
|
||||||
CC2500_Strobe(CC2500_SCAL);
|
CC2500_Strobe(CC2500_SCAL);
|
||||||
delayMicroseconds(900);//
|
delayMicroseconds(900);//
|
||||||
calData[c] = CC2500_ReadReg(CC2500_25_FSCAL1);
|
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########
|
//#######END INIT########
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -148,11 +125,11 @@ static void __attribute__((unused)) frskyX_build_bind_packet()
|
|||||||
packet[4] = rx_tx_addr[2];
|
packet[4] = rx_tx_addr[2];
|
||||||
int idx = ((state -FRSKY_BIND) % 10) * 5;
|
int idx = ((state -FRSKY_BIND) % 10) * 5;
|
||||||
packet[5] = idx;
|
packet[5] = idx;
|
||||||
packet[6] = hop(idx++);
|
packet[6] = hopping_frequency[idx++];
|
||||||
packet[7] = hop(idx++);
|
packet[7] = hopping_frequency[idx++];
|
||||||
packet[8] = hop(idx++);
|
packet[8] = hopping_frequency[idx++];
|
||||||
packet[9] = hop(idx++);
|
packet[9] = hopping_frequency[idx++];
|
||||||
packet[10] = hop(idx++);
|
packet[10] = hopping_frequency[idx++];
|
||||||
packet[11] = 0x02;
|
packet[11] = 0x02;
|
||||||
packet[12] = RX_num;
|
packet[12] = RX_num;
|
||||||
//
|
//
|
||||||
@ -307,16 +284,18 @@ uint16_t ReadFrSkyX()
|
|||||||
|
|
||||||
uint16_t initFrSkyX()
|
uint16_t initFrSkyX()
|
||||||
{
|
{
|
||||||
|
Frsky_init_hop();
|
||||||
while(!chanskip)
|
while(!chanskip)
|
||||||
chanskip=random(0xfefefefe)%47;
|
chanskip=random(0xfefefefe)%47;
|
||||||
while((chanskip-ctr)%4)
|
while((chanskip-ctr)%4)
|
||||||
ctr=(ctr+1)%4;
|
ctr=(ctr+1)%4;
|
||||||
|
|
||||||
counter_rst=(chanskip-ctr)>>2;
|
counter_rst=(chanskip-ctr)>>2;
|
||||||
|
|
||||||
//for test***************
|
//for test***************
|
||||||
//rx_tx_addr[3]=0xB3;
|
//rx_tx_addr[3]=0xB3;
|
||||||
//rx_tx_addr[2]=0xFD;
|
//rx_tx_addr[2]=0xFD;
|
||||||
//************************
|
//************************
|
||||||
|
hopping_frequency[47]=0;
|
||||||
frskyX_init();
|
frskyX_init();
|
||||||
CC2500_SetTxRxMode(TX_EN);
|
CC2500_SetTxRxMode(TX_EN);
|
||||||
//
|
//
|
||||||
|
@ -76,7 +76,7 @@ uint16_t packet_period;
|
|||||||
uint8_t packet_count;
|
uint8_t packet_count;
|
||||||
uint8_t packet_sent;
|
uint8_t packet_sent;
|
||||||
uint8_t packet_length;
|
uint8_t packet_length;
|
||||||
uint8_t hopping_frequency[23];
|
uint8_t hopping_frequency[50];
|
||||||
uint8_t *hopping_frequency_ptr;
|
uint8_t *hopping_frequency_ptr;
|
||||||
uint8_t hopping_frequency_no=0;
|
uint8_t hopping_frequency_no=0;
|
||||||
uint8_t rf_ch_num;
|
uint8_t rf_ch_num;
|
||||||
|
@ -73,8 +73,8 @@
|
|||||||
#define J6PRO_CYRF6936_INO
|
#define J6PRO_CYRF6936_INO
|
||||||
|
|
||||||
//The protocols below need a CC2500 to be installed
|
//The protocols below need a CC2500 to be installed
|
||||||
#define FRSKYD_CC2500_INO
|
|
||||||
#define FRSKYV_CC2500_INO
|
#define FRSKYV_CC2500_INO
|
||||||
|
#define FRSKYD_CC2500_INO
|
||||||
#define FRSKYX_CC2500_INO
|
#define FRSKYX_CC2500_INO
|
||||||
#define SFHSS_CC2500_INO
|
#define SFHSS_CC2500_INO
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user