diff --git a/Multiprotocol/XN297Dump_nrf24l01.ino b/Multiprotocol/XN297Dump_nrf24l01.ino
index bc62b45..29ccbe6 100644
--- a/Multiprotocol/XN297Dump_nrf24l01.ino
+++ b/Multiprotocol/XN297Dump_nrf24l01.ino
@@ -13,12 +13,16 @@
along with Multiprotocol. If not, see .
*/
+// sub_protocol: 0=250Kbps, 1=1Mbps, 2=2Mbps. Other values default to 1Mbps.
+// RX_num = address length 3 or 4 or 5. Other values default to 5.
+// option = RF channel number 0..84 and -1 = scan all channels. Other values default to RF channel 0.
+
#ifdef XN297DUMP_NRF24L01_INO
#include "iface_nrf24l01.h"
// Parameters which can be modified
-#define XN297DUMP_PERIOD_DUMP 3000 // Multiplied by 50, default 3000=150ms
+#define XN297DUMP_PERIOD_DUMP 25000
#define XN297DUMP_MAX_RF_CHANNEL 84 // Default 84
// Do not touch from there
@@ -27,6 +31,7 @@
#define XN297DUMP_CRC_LENGTH 2
uint8_t address_length;
+uint16_t over;
boolean scramble;
static void __attribute__((unused)) XN297Dump_init()
@@ -43,7 +48,7 @@ static void __attribute__((unused)) XN297Dump_init()
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, speed=");
+ debug("XN297 dump, address length=%d, speed=",address_length);
switch(sub_protocol)
{
case 0:
@@ -71,129 +76,151 @@ static boolean __attribute__((unused)) XN297Dump_process_packet(void)
{
uint16_t crcxored;
uint8_t packet_sc[XN297DUMP_MAX_PACKET_LEN], packet_un[XN297DUMP_MAX_PACKET_LEN];
- address_length=5;
- while(address_length >= 3)
+ // init crc
+ crc = 0xb5d2;
+
+ // address
+ for (uint8_t i = 0; i < address_length; i++)
{
- // init crc
- crc = 0xb5d2;
-
- // address
- for (uint8_t i = 0; i < address_length; i++)
+ crc = crc16_update(crc, packet[i], 8);
+ packet_un[address_length-1-i]=packet[i];
+ packet_sc[address_length-1-i]=packet[i] ^ xn297_scramble[i];
+ }
+
+ // payload
+ for (uint8_t i = address_length; i < XN297DUMP_MAX_PACKET_LEN-XN297DUMP_CRC_LENGTH; i++)
+ {
+ crc = crc16_update(crc, packet[i], 8);
+ packet_sc[i] = bit_reverse(packet[i]^xn297_scramble[i]);
+ packet_un[i] = bit_reverse(packet[i]);
+ // check crc
+ crcxored = crc ^ pgm_read_word(&xn297_crc_xorout[i+1 - 3]);
+ if( (crcxored >> 8) == packet[i + 1] && (crcxored & 0xff) == packet[i + 2])
{
- crc = crc16_update(crc, packet[i], 8);
- packet_un[address_length-1-i]=packet[i];
- packet_sc[address_length-1-i]=packet[i] ^= xn297_scramble[i];
+ packet_length=i+1;
+ memcpy(packet,packet_un,packet_length);
+ scramble=false;
+ return true;
}
-
- // payload
- for (uint8_t i = address_length; i < XN297DUMP_MAX_PACKET_LEN-XN297DUMP_CRC_LENGTH; i++)
+ crcxored = crc ^ pgm_read_word(&xn297_crc_xorout_scrambled[i+1 - 3]);
+ if( (crcxored >> 8) == packet[i + 1] && (crcxored & 0xff) == packet[i + 2])
{
- crc = crc16_update(crc, packet[i], 8);
- packet_sc[i] = bit_reverse(packet[i]^xn297_scramble[i]);
- packet_un[i] = bit_reverse(packet[i]);
- // check crc
- crcxored = crc ^ pgm_read_word(&xn297_crc_xorout[i+1 - 3]);
- if( (crcxored >> 8) == packet[i + 1] && (crcxored & 0xff) == packet[i + 2])
- {
- packet_length=i+1;
- memcpy(packet,packet_un,packet_length);
- scramble=false;
- return true;
- }
- crcxored = crc ^ pgm_read_word(&xn297_crc_xorout_scrambled[i+1 - 3]);
- if( (crcxored >> 8) == packet[i + 1] && (crcxored & 0xff) == packet[i + 2])
- {
- packet_length=i+1;
- memcpy(packet,packet_sc,packet_length);
- scramble=true;
- return true;
- }
+ packet_length=i+1;
+ memcpy(packet,packet_sc,packet_length);
+ scramble=true;
+ return true;
}
-
- address_length--;
}
return false;
}
+static void __attribute__((unused)) XN297Dump_overflow()
+{
+ if(TIMER2_BASE->SR & TIMER_SR_UIF)
+ { // timer overflow
+ if(over!=0xFFFF)
+ over++;
+ TIMER2_BASE->SR = 0x1E5F & ~TIMER_SR_UIF; // Clear Timer2 overflow flag
+ }
+}
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 C=%d ", hopping_frequency_no);
- if(XN297Dump_process_packet())
- { // valid crc found
- debug("S=%c A=",scramble?'Y':'N');
- for(uint8_t i=0; iXN297DUMP_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));
+ over=0xFFFF;
+ }
+ XN297Dump_overflow();
+
+ 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);
+ uint16_t time_TCNT1=TCNT1;
+ uint32_t time32=0;
+ time=time_TCNT1-time;
+ if(over!=0xFFFF)
+ time32=(over<<16)+time;
+ debug("RX: %5luus C=%d ", time32>>1 , hopping_frequency_no);
+ time=time_TCNT1;
+ over=0;
+ if(XN297Dump_process_packet())
+ { // valid crc found
+ debug("S=%c A=",scramble?'Y':'N');
+ for(uint8_t i=0; i5)
+ address_length=5; //default
XN297Dump_init();
bind_counter=0;
rf_ch_num=0xFF;