diff --git a/Multiprotocol/CFlie_nrf24l01.ino b/Multiprotocol/CFlie_nrf24l01.ino index 3bbb2ee..b632345 100644 --- a/Multiprotocol/CFlie_nrf24l01.ino +++ b/Multiprotocol/CFlie_nrf24l01.ino @@ -109,8 +109,6 @@ static uint8_t tx_payload_len = 0; // Length of the packet stored in packet static uint8_t rx_payload_len = 0; // Length of the packet stored in rx_packet static uint8_t rx_packet[MAX_PACKET_SIZE]; // For reading in ACK payloads -static uint16_t cflie_counter; -static uint32_t packet_counter; static uint8_t data_rate; enum { @@ -194,8 +192,6 @@ static void send_packet() // Transmit the payload NRF24L01_WritePayload(packet, tx_payload_len); - ++packet_counter; - // // Check and adjust transmission power. NRF24L01_SetPower(); } @@ -256,7 +252,6 @@ static void send_search_packet() NRF24L01_WritePayload(buf, sizeof(buf)); - ++packet_counter; } // Frac 16.16 @@ -782,7 +777,6 @@ static uint16_t cflie_callback() break; case PKT_TIMEOUT: send_search_packet(); - cflie_counter = CFLIE_BIND_COUNT; } break; diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt index 6152406..257a544 100644 --- a/Multiprotocol/Multi.txt +++ b/Multiprotocol/Multi.txt @@ -45,4 +45,4 @@ 45,E01X,E012,E015,E016H 46,V911S 47,GD00X,V1,V2 -63,Test +63,XN_DUMP,250K,1M,2M diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index cbc0ee4..2a34a7c 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 2 #define VERSION_REVISION 1 -#define VERSION_PATCH_LEVEL 39 +#define VERSION_PATCH_LEVEL 40 //****************** // Protocols @@ -74,7 +74,7 @@ enum PROTOCOLS PROTO_E01X = 45, // =>NRF24L01 PROTO_V911S = 46, // =>NRF24L01 PROTO_GD00X = 47, // =>NRF24L01 - PROTO_TEST = 63, // =>NRF24L01 + PROTO_XN297DUMP = 63, // =>NRF24L01 }; enum Flysky diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index 82aa04e..5370984 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -1222,10 +1222,10 @@ static void protocol_init() remote_callback = GD00X_callback; break; #endif - #if defined(TEST_NRF24L01_INO) - case PROTO_TEST: - next_callback=initTest(); - remote_callback = Test_callback; + #if defined(XN297DUMP_NRF24L01_INO) + case PROTO_XN297DUMP: + next_callback=initXN297Dump(); + remote_callback = XN297Dump_callback; break; #endif #endif @@ -1315,7 +1315,7 @@ void update_serial_data() else #endif option=rx_ok_buff[3]; // Use radio-defined option value - + #ifdef FAILSAFE_ENABLE bool failsafe=false; if(rx_ok_buff[0]&0x02) diff --git a/Multiprotocol/Validate.h b/Multiprotocol/Validate.h index 2dfc763..d83a6a2 100644 --- a/Multiprotocol/Validate.h +++ b/Multiprotocol/Validate.h @@ -303,3 +303,7 @@ #if MAX_PPM_CHANNELS>16 #error MAX_PPM_CHANNELS must be below or equal to 16. The default for this value is 16. #endif + +#if defined (STM32_BOARD) && defined (DEBUG_SERIAL) && defined (NRF24L01_INSTALLED) + #define XN297DUMP_NRF24L01_INO +#endif diff --git a/Multiprotocol/XN297Dump_nrf24l01.ino b/Multiprotocol/XN297Dump_nrf24l01.ino new file mode 100644 index 0000000..be7c6aa --- /dev/null +++ b/Multiprotocol/XN297Dump_nrf24l01.ino @@ -0,0 +1,198 @@ +/* + 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 . + */ + +#ifdef XN297DUMP_NRF24L01_INO + +#include "iface_nrf24l01.h" + +// Parameters which can be modified +#define XN297DUMP_ADDRESS_LENGTH 5 // Default address length is 5, valid address length is between 3 and 5 +#define XN297DUMP_PERIOD_DUMP 2000 // Multiplied by 50, default 2000=100ms +#define XN297DUMP_MAX_RF_CHANNEL 84 // Default 84 + +// Do not touch from there +#define XN297DUMP_INITIAL_WAIT 500 +#define XN297DUMP_MAX_PACKET_LEN 32 +#define XN297DUMP_CRC_LENGTH 2 + +static void __attribute__((unused)) XN297Dump_init() +{ + NRF24L01_Initialize(); + NRF24L01_SetTxRxMode(RX_EN); + + 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 Acknowledgment on all data pipes + NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x01); // Enable data pipe 0 only + NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x01); // 3 bytes RX/TX address + NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, (uint8_t*)"\x55\x0F\x71", 3); // set up RX address to xn297 preamble + NRF24L01_WriteReg(NRF24L01_11_RX_PW_P0, XN297DUMP_MAX_PACKET_LEN); // Enable rx pipe 0 + + debug("XN297 dump, scramble=%c, address length=%d, speed=",RX_num?'N':'Y', XN297DUMP_ADDRESS_LENGTH); + switch(sub_protocol) + { + case 0: + NRF24L01_SetBitrate(NRF24L01_BR_250K); + debugln("250K"); + break; + case 2: + NRF24L01_SetBitrate(NRF24L01_BR_2M); + debugln("2M"); + break; + default: + NRF24L01_SetBitrate(NRF24L01_BR_1M); + debugln("1M"); + break; + + } + NRF24L01_Activate(0x73); // Activate feature register + NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 0x00); // Disable dynamic payload length on all pipes + NRF24L01_WriteReg(NRF24L01_1D_FEATURE, 0x01); + NRF24L01_Activate(0x73); + NRF24L01_SetPower(); +} + +static boolean __attribute__((unused)) XN297Dump_process_packet(void) +{ + uint8_t packet_ori[XN297DUMP_MAX_PACKET_LEN]; + memcpy(packet_ori,packet,XN297DUMP_MAX_PACKET_LEN); + packet_length=XN297DUMP_MAX_PACKET_LEN-XN297DUMP_CRC_LENGTH; + + while(packet_length > XN297DUMP_ADDRESS_LENGTH) + { + // init crc + crc = 0xb5d2; + + // unscramble address + for (uint8_t i = 0; i < XN297DUMP_ADDRESS_LENGTH; i++) + { + crc = crc16_update(crc, packet[i], 8); + rx_id[i]=packet[i]; + if (!RX_num) + rx_id[i] ^= xn297_scramble[i]; + } + // reverse address order + for (uint8_t i = 0; i < XN297DUMP_ADDRESS_LENGTH; i++) + packet[i]=rx_id[XN297DUMP_ADDRESS_LENGTH-1-i]; + + // unscramble payload + for (uint8_t i = XN297DUMP_ADDRESS_LENGTH; i < packet_length; i++) + { + crc = crc16_update(crc, packet[i], 8); + if (!RX_num) + packet[i] ^= xn297_scramble[i]; + packet[i] = bit_reverse(packet[i]); + } + + // check crc + if (RX_num) + crc ^= pgm_read_word(&xn297_crc_xorout[packet_length - 3]); + else + crc ^= pgm_read_word(&xn297_crc_xorout_scrambled[packet_length - 3]); + if( (crc >> 8) == packet[packet_length] && (crc & 0xff) == packet[packet_length + 1]) + return true; + packet_length--; + memcpy(packet,packet_ori,XN297DUMP_MAX_PACKET_LEN); + } + return false; +} + +static uint16_t XN297Dump_callback() +{ + if(option==0xFF && bind_counter>XN297DUMP_PERIOD_DUMP) + { // Scan frequencies + hopping_frequency_no++; + bind_counter=0; + } + if(hopping_frequency_no!=rf_ch_num) + { // Channel has changed + if(hopping_frequency_no>XN297DUMP_MAX_RF_CHANNEL) + hopping_frequency_no=0; // Invalid channel 0 by default + rf_ch_num=hopping_frequency_no; + debugln("Channel=%d,0x%02X",hopping_frequency_no,hopping_frequency_no) + NRF24L01_WriteReg(NRF24L01_05_RF_CH,hopping_frequency_no); + // switch to RX mode + NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); // Clear data ready, data sent, and retransmit + NRF24L01_SetTxRxMode(TXRX_OFF); + NRF24L01_SetTxRxMode(RX_EN); + NRF24L01_FlushRx(); + NRF24L01_WriteReg(NRF24L01_00_CONFIG, (0 << NRF24L01_00_EN_CRC) // switch to RX mode and disable CRC + | (1 << NRF24L01_00_CRCO) + | (1 << NRF24L01_00_PWR_UP) + | (1 << NRF24L01_00_PRIM_RX)); + } + + if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_RX_DR)) + { // RX fifo data ready + if(NRF24L01_ReadReg(NRF24L01_09_CD) || option != 0xFF) + { + NRF24L01_ReadPayload(packet,XN297DUMP_MAX_PACKET_LEN); + debug_time("RX: "); + debug("us %d ", option); + if(XN297Dump_process_packet()) + { // valid crc found + debug("A="); + for(uint8_t i=0; i