diff --git a/main.c b/main.c index 9347a0f..67fe4a0 100644 --- a/main.c +++ b/main.c @@ -2712,7 +2712,7 @@ int main(void) set_mode(M_LOW); set_sweep_frequency(ST_STOP, (uint32_t) 4000000); sweep(true); - set_sweep_frequency(ST_STOP, (uint32_t) 35000000); + set_sweep_frequency(ST_STOP, (uint32_t) 350000000); set_refer_output(-1); // ui_mode_menu(); // Show menu when autostarting mode diff --git a/sa_core.c b/sa_core.c index 0235140..f898c3b 100644 --- a/sa_core.c +++ b/sa_core.c @@ -516,7 +516,7 @@ void set_harmonic(int h) void set_step_delay(int d) { - if ((2 <= d && d < 300) || d > 30000) + if ((3 <= d && d < 300) || d > 30000) return; setting.step_delay = d; dirty = true; @@ -768,7 +768,7 @@ void apply_settings(void) SI4432_SetReference(setting.refer); update_rbw(); if (setting.frequency_step == 0.0) { - if (setting.step_delay <= 1) + if (setting.step_delay <= 2) actualStepDelay = 0; else actualStepDelay = setting.step_delay; @@ -824,6 +824,7 @@ int peakIndex; float temppeakLevel; int temppeakIndex; static unsigned long old_freq[4] = { 0, 0, 0, 0 }; +static unsigned long real_old_freq[4] = { 0, 0, 0, 0 }; void setupSA(void) @@ -831,6 +832,8 @@ void setupSA(void) SI4432_Init(); old_freq[0] = 0; old_freq[1] = 0; + real_old_freq[0] = 0; + real_old_freq[1] = 0; SI4432_Sel = 0; SI4432_Receive(); @@ -839,6 +842,8 @@ void setupSA(void) PE4302_init(); PE4302_Write_Byte(0); } +extern int SI4432_frequency_changed; +extern int SI4432_offset_changed; void set_freq(int V, unsigned long freq) { @@ -846,16 +851,43 @@ void set_freq(int V, unsigned long freq) if (V <= 1) { SI4432_Sel = V; if (freq < 240000000 || freq > 960000000) { - old_freq[V] = freq + 1; + real_old_freq[V] = freq + 1; return; } +#if 1 + if (setting.step_delay == 2) { + int delta = freq - real_old_freq[V]; + + if (real_old_freq[V] >= 480000000) // 480MHz, high band + delta = delta >> 1; + if (delta > 0 && delta < 80000) { // use frequency deviation registers + if (1) { + if (real_old_freq[V] >= 480000000) + shell_printf("%d: Offs %q HW %d\r\n", SI4432_Sel, (uint32_t)(real_old_freq[V]+delta*2), real_old_freq[V]); + else + shell_printf("%d: Offs %q HW %d\r\n", SI4432_Sel, (uint32_t)(real_old_freq[V]+delta*1), real_old_freq[V]); + } + + delta = delta * 4 / 625; // = 156.25; + SI4432_Write_Byte(0x73, (uint8_t)(delta & 0xff)); + uint8_t reg = delta >> 8; + SI4432_Write_Byte(0x74, (uint8_t)((delta >> 8) & 0x03)); + SI4432_offset_changed = true; + old_freq[V] = freq; + return; + } +#endif + } SI4432_Set_Frequency(freq); + SI4432_Write_Byte(0x73, 0); + SI4432_Write_Byte(0x74, 0); #ifdef __ULTRA_SA__ } else { ADF4351_set_frequency(V-2,freq,3); #endif } old_freq[V] = freq; + real_old_freq[V] = freq; } } @@ -886,7 +918,9 @@ void set_switches(int m) SI4432_Init(); old_freq[0] = 0; old_freq[1] = 0; -switch(m) { + real_old_freq[0] = 0; + real_old_freq[1] = 0; + switch(m) { case M_LOW: // Mixed into 0 #ifdef __ULTRA__ case M_ULTRA: @@ -2724,8 +2758,8 @@ void self_test(int test) setting.auto_IF = false; setting.frequency_IF=433900000; ui_mode_normal(); - int i = 13; // calibrate low mode power on 30 MHz; -// int i = 15; // calibrate low mode power on 30 MHz; +// int i = 13; // calibrate low mode power on 30 MHz; + int i = 15; // calibrate low mode power on 30 MHz; test_prepare(i); setting.step_delay = 8000; for (int j= 0; j < 57; j++ ) { diff --git a/si4432.c b/si4432.c index 8beccae..7e17dd6 100644 --- a/si4432.c +++ b/si4432.c @@ -310,6 +310,8 @@ void set_10mhz(uint32_t f) } int SI4432_frequency_changed = false; +int SI4432_offset_changed = false; + #if 0 static int old_freq_band[2] = {-1,-1}; static int written[2]= {0,0}; @@ -319,6 +321,7 @@ void SI4432_Set_Frequency ( uint32_t Freq ) { // int mode = SI4432_Read_Byte(0x02) & 0x03; // SI4432_Write_Byte(0x07, 0x02); // Switch to tune mode uint8_t hbsel; + if (1) shell_printf("%d: Freq %q\r\n", SI4432_Sel, Freq); if (Freq >= 480000000U) { hbsel = 1<<5; Freq>>=1; @@ -425,6 +428,9 @@ float SI4432_RSSI(uint32_t i, int s) stepdelay = 280; } SI4432_frequency_changed = false; + } else if (SI4432_offset_changed) { + stepdelay = 280 + stepdelay/4; + SI4432_offset_changed = false; } if (stepdelay) my_microsecond_delay(stepdelay); @@ -557,13 +563,13 @@ void SI4432_Init() SI4432_Sel = 0; // SI4432_Receive();// Enable receiver chain // SI4432_Write_Byte(0x09, V0_XTAL_CAPACITANCE);// Tune the crystal - SI4432_Set_Frequency(433800000); +// SI4432_Set_Frequency(433800000); SI4432_Write_Byte(0x0D, 0x1F) ; // Set GPIO2 output to ground SI4432_Sel = 1; // SI4432_Write_Byte(0x09, V1_XTAL_CAPACITANCE);// Tune the crystal - SI4432_Set_Frequency(443800000); +// SI4432_Set_Frequency(443800000); SI4432_Write_Byte(0x0D, 0x1F) ; // Set GPIO2 output to ground // SI4432_Write_Byte(0x6D, 0x1C);//Set low power diff --git a/ui_sa.c b/ui_sa.c index c4d23e3..6f3e7ff 100644 --- a/ui_sa.c +++ b/ui_sa.c @@ -1387,8 +1387,9 @@ static const menuitem_t menu_harmonic[] = static const menuitem_t menu_scanning_speed[] = { - { MT_CALLBACK, 0, "FAST", menu_scanning_speed_cb}, - { MT_CALLBACK, 1, "PRECISE", menu_scanning_speed_cb}, + { MT_CALLBACK, 0, "FAST", menu_scanning_speed_cb}, + { MT_CALLBACK, 1, "PRECISE", menu_scanning_speed_cb}, + { MT_CALLBACK, 2, "\2EXTRA\0FAST", menu_scanning_speed_cb}, { MT_KEYPAD, KM_SAMPLETIME, "\2SAMPLE\0DELAY", "300..30000"}, { MT_CANCEL, 0, "\032 BACK", NULL }, { MT_NONE, 0, NULL, NULL } // sentinel