From 3d287a28273b5869d79ce25a01a3a87817a03699 Mon Sep 17 00:00:00 2001 From: pascallanger Date: Fri, 18 Mar 2016 17:11:27 +0100 Subject: [PATCH] New FY326 protocol --- Multiprotocol/FY326_nrf24l01.ino | 167 +++++++++++++++++++++++++++++++ Multiprotocol/Multiprotocol.h | 7 +- Multiprotocol/Multiprotocol.ino | 8 +- Multiprotocol/_Config.h | 3 + 4 files changed, 182 insertions(+), 3 deletions(-) create mode 100644 Multiprotocol/FY326_nrf24l01.ino diff --git a/Multiprotocol/FY326_nrf24l01.ino b/Multiprotocol/FY326_nrf24l01.ino new file mode 100644 index 0000000..ccd640f --- /dev/null +++ b/Multiprotocol/FY326_nrf24l01.ino @@ -0,0 +1,167 @@ +/* + This project is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Multiprotocol is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Multiprotocol. If not, see . + */ +// Last sync with hexfet new_protocols/fy326_nrf24l01.c dated 2015-07-29 + +#if defined(FY326_NRF24L01_INO) + +#include "iface_nrf24l01.h" + +#define FY326_INITIAL_WAIT 500 +#define FY326_PACKET_PERIOD 1500 +#define FY326_PACKET_CHKTIME 300 +#define FY326_PACKET_SIZE 15 +#define FY326_BIND_COUNT 16 +#define FY326_RF_BIND_CHANNEL 0x17 +#define FY326_NUM_RF_CHANNELS 5 + +enum { + FY326_BIND1=0, + FY326_BIND2, + FY326_DATA +}; + +#define rxid channel + +#define CHAN_TO_TRIM(chanval) ((chanval/10)-10) +static void __attribute__((unused)) FY326_send_packet(uint8_t bind) +{ + packet[0] = rx_tx_addr[3]; + if(bind) + packet[1] = 0x55; + else + packet[1] = GET_FLAG(Servo_AUX3, 0x80) // Headless + | GET_FLAG(Servo_AUX2, 0x40) // RTH + | GET_FLAG(Servo_AUX1, 0x02) // Flip + | GET_FLAG(Servo_AUX5, 0x01) // Calibrate + | GET_FLAG(Servo_AUX4, 0x04); // Expert + packet[2] = 200 - convert_channel_8b_scale(AILERON, 0, 200); // aileron + packet[3] = convert_channel_8b_scale(ELEVATOR, 0, 200); // elevator + packet[4] = 200 - convert_channel_8b_scale(RUDDER, 0, 200); // rudder + packet[5] = convert_channel_8b_scale(THROTTLE, 0, 200); // throttle + packet[6] = rx_tx_addr[0]; + packet[7] = rx_tx_addr[1]; + packet[8] = rx_tx_addr[2]; + packet[9] = CHAN_TO_TRIM(packet[2]); // aileron_trim; + packet[10] = CHAN_TO_TRIM(packet[3]); // elevator_trim; + packet[11] = CHAN_TO_TRIM(packet[4]); // rudder_trim; + packet[12] = 0; // throttle_trim; + packet[13] = rxid; + packet[14] = rx_tx_addr[4]; + + if (bind) + NRF24L01_WriteReg(NRF24L01_05_RF_CH, FY326_RF_BIND_CHANNEL); + else + { + NRF24L01_WriteReg(NRF24L01_05_RF_CH, hopping_frequency[hopping_frequency_no++]); + hopping_frequency_no %= FY326_NUM_RF_CHANNELS; + } + + // clear packet status bits and TX FIFO + NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); + NRF24L01_FlushTx(); + + NRF24L01_WritePayload(packet, FY326_PACKET_SIZE); + + NRF24L01_SetPower(); // Set tx_power +} + +static void __attribute__((unused)) FY326_init() +{ + NRF24L01_Initialize(); + NRF24L01_SetTxRxMode(TX_EN); + NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x01); // Three-byte rx/tx address + NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, (uint8_t *)"\x15\x59\x23\xc6\x29", 5); + NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, (uint8_t *)"\x15\x59\x23\xc6\x29", 5); + NRF24L01_FlushTx(); + NRF24L01_FlushRx(); + NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); // Clear data ready, data sent, and retransmit + NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // No Auto Acknowledgement on all data pipes + NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x01); // Enable data pipe 0 only + NRF24L01_WriteReg(NRF24L01_11_RX_PW_P0, FY326_PACKET_SIZE); + NRF24L01_WriteReg(NRF24L01_05_RF_CH, FY326_RF_BIND_CHANNEL); + NRF24L01_SetBitrate(NRF24L01_BR_250K); + NRF24L01_SetPower(); + + NRF24L01_Activate(0x73); + NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 0x3f); + NRF24L01_WriteReg(NRF24L01_1D_FEATURE, 0x07); + NRF24L01_Activate(0x73); +} + +uint16_t FY326_callback() +{ + switch (phase) + { + case FY326_BIND1: + if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_RX_DR)) + { // RX fifo data ready + NRF24L01_ReadPayload(packet, FY326_PACKET_SIZE); + rxid = packet[13]; + rx_tx_addr[0] = 0xAA; + NRF24L01_SetTxRxMode(TXRX_OFF); + NRF24L01_SetTxRxMode(TX_EN); + BIND_DONE; + phase = FY326_DATA; + } + else + if (bind_counter-- == 0) + { + bind_counter = FY326_BIND_COUNT; + NRF24L01_SetTxRxMode(TXRX_OFF); + NRF24L01_SetTxRxMode(TX_EN); + FY326_send_packet(1); + phase = FY326_BIND2; + return FY326_PACKET_CHKTIME; + } + break; + case FY326_BIND2: + if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_TX_DS)) + { // TX data sent -> switch to RX mode + NRF24L01_SetTxRxMode(TXRX_OFF); + NRF24L01_FlushRx(); + NRF24L01_SetTxRxMode(RX_EN); + phase = FY326_BIND1; + } + else + return FY326_PACKET_CHKTIME; + break; + case FY326_DATA: + FY326_send_packet(0); + break; + } + return FY326_PACKET_PERIOD; +} + +static void __attribute__((unused)) FY326_initialize_txid() +{ + hopping_frequency[0] = (rx_tx_addr[0]&0x0f); + hopping_frequency[1] = 0x10 + (rx_tx_addr[0] >> 4); + hopping_frequency[2] = 0x20 + (rx_tx_addr[1]&0x0f); + hopping_frequency[3] = 0x30 + (rx_tx_addr[1] >> 4); + hopping_frequency[4] = 0x40 + (rx_tx_addr[2] >> 4); +} + +uint16_t initFY326(void) +{ + BIND_IN_PROGRESS; // autobind protocol + rxid = 0xAA; + bind_counter = 0; + FY326_initialize_txid(); + FY326_init(); + phase=FY326_BIND1; + return FY326_INITIAL_WAIT; +} + +#endif diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index 37a8e36..41d3ac9 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -45,7 +45,8 @@ enum PROTOCOLS MODE_ESKY = 16, // =>NRF24L01 MODE_MT99XX=17, // =>NRF24L01 MODE_MJXQ=18, // =>NRF24L01 - MODE_SHENQI=19 // =>NRF24L01 + MODE_SHENQI=19, // =>NRF24L01 + MODE_FY326=20 // =>NRF24L01 }; enum Flysky @@ -305,7 +306,8 @@ enum NRF_POWER // CC2500 power enum CC2500_POWER { - CC2500_POWER_0 = 0xC5, // -12dbm + CC2500_POWER_0 = 0x50, // -30dbm + //CC2500_POWER_0 = 0xC5, // -12dbm CC2500_POWER_1 = 0x97, // -10dbm CC2500_POWER_2 = 0x6E, // -8dbm CC2500_POWER_3 = 0x7F, // -6dbm @@ -421,6 +423,7 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- MT99XX 17 MJXQ 18 SHENQI 19 + FY326 20 BindBit=> 0x80 1=Bind/0=No AutoBindBit=> 0x40 1=Yes /0=No RangeCheck=> 0x20 1=Yes /0=No diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index 5dc6e62..cd62a62 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -440,6 +440,12 @@ static void protocol_init() next_callback=initSHENQI(); remote_callback = SHENQI_callback; break; +#endif +#if defined(FY326_NRF24L01_INO) + case MODE_FY326: + next_callback=initFY326(); + remote_callback = FY326_callback; + break; #endif } @@ -522,7 +528,7 @@ static void module_reset() case MODE_DEVO: CYRF_Reset(); break; - default: // MODE_HISKY, MODE_V2X2, MODE_YD717, MODE_KN, MODE_SYMAX, MODE_SLT, MODE_CX10, MODE_CG023, MODE_BAYANG, MODE_ESKY, MODE_MT99XX, MODE_MJXQ, MODE_SHENQI + default: // MODE_HISKY, MODE_V2X2, MODE_YD717, MODE_KN, MODE_SYMAX, MODE_SLT, MODE_CX10, MODE_CG023, MODE_BAYANG, MODE_ESKY, MODE_MT99XX, MODE_MJXQ, MODE_SHENQI, MODE_FY326 NRF24L01_Reset(); break; } diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index 3d4ba8b..fb40ddd 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -57,6 +57,7 @@ #define MT99XX_NRF24L01_INO #define MJXQ_NRF24L01_INO #define SHENQI_NRF24L01_INO + #define FY326_NRF24L01_INO #endif //Update this table to set which protocol and all associated settings are called for the corresponding dial number @@ -142,6 +143,8 @@ const PPM_Parameters PPM_prot[15]= { H26D MODE_SHENQI NONE + MODE_FY326 + NONE RX_Num value between 0 and 15