Fast sweep added

tinySA-v0.2
erikkaashoek 6 years ago
parent 4c2f3d821c
commit 8584158b58

@ -29,6 +29,8 @@
#define __MEASURE__
#define __SELFTEST__
#define __CALIBRATE__
#define __FAST_SWEEP__ // Pre-fill SI4432 RSSI buffer to get fastest sweep in zero span mode
//#define __ULTRA__ // Add harmonics mode on low input.
//#define __ULTRA_SA__ // Adds ADF4351 control for extra high 1st IF stage
#define __SPUR__ // Does spur reduction by shifting IF
@ -602,7 +604,12 @@ void reset_settings(int m);
#define S_IS_AUTO(x) ((x)&2)
#define S_STATE(X) ((X)&1)
enum { S_OFF=0, S_ON=1, S_AUTO_OFF=2, S_AUTO_ON=3 };
#ifdef __FAST_SWEEP__
#define MINIMUM_SWEEP_TIME 3 // Minimum sweep time on zero span in miliseconds
#else
#define MINIMUM_SWEEP_TIME 15 // Minimum sweep time on zero span in miliseconds
#endif
#define REPEAT_TIME 134.0 // Time per extra repeat in uS
#define MEASURE_TIME 175.0 // Time per vbwstep without stepdelay in uS
@ -807,6 +814,9 @@ byte SI4432_Read_Byte( byte ADR );
void SI4432_Init(void);
void SI4432_Drive(int);
float SI4432_RSSI(uint32_t i, int s);
#ifdef __FAST_SWEEP__
void SI4432_Fill(int s);
#endif
void SI4432_Set_Frequency ( long Freq );
float SI4432_SET_RBW(float WISH);
void SI4432_SetReference(int freq);

@ -1291,6 +1291,11 @@ float perform(bool break_on_operation, int i, uint32_t f, int tracking)
float signal_path_loss;
skip_LO_setting:
#ifdef __FAST_SWEEP__
if (i == 0 && setting.frequency_step == 0 && setting.trigger == T_AUTO && actualStepDelay == 0 && setting.repeat == 1 && actualStepDelay < 1000) {
SI4432_Fill(MODE_SELECT(setting.mode));
}
#endif
#ifdef __ULTRA__
if (setting.mode == M_ULTRA)

@ -315,6 +315,33 @@ void SI4432_Set_Frequency ( long Freq ) {
int actualStepDelay = 1500;
//extern int setting.repeat;
#ifdef __FAST_SWEEP__
extern char age[POINTS_COUNT];
static int buf_index = 0;
static bool buf_read = false;
void SI4432_Fill(int s)
{
SI4432_Sel = s;
int sel = SI_nSEL[SI4432_Sel];
float t = setting.sweep_time - calc_min_sweep_time(); // Time to delay in mS
if (t < 0)
t = 0;
int ti = t * 1000 / 290.0; // Now in uS per point if (t < 30000)
for (int i=0; i<POINTS_COUNT; ) {
SPI2_CLK_LOW;
palClearPad(GPIOC, sel);
shiftOut( 0x26 );
age[i++]=(char)shiftIn();
palSetPad(GPIOC, sel);
if (ti)
my_microsecond_delay(ti);
}
buf_index = 0;
buf_read = true;
}
#endif
float SI4432_RSSI(uint32_t i, int s)
{
(void) i;
@ -327,6 +354,15 @@ float SI4432_RSSI(uint32_t i, int s)
} else
#endif
//START_PROFILE
#ifdef __FAST_SWEEP__
if (buf_read) {
float dBm = ((float)((unsigned char)age[buf_index++]))/2 + SI4432_RSSI_correction;
if (buf_index ==POINTS_COUNT) {
buf_read = false;
}
return dBm;
}
#endif
SI4432_Sel = s;
int stepdelay = actualStepDelay;
if (SI4432_frequency_changed) {

Loading…
Cancel
Save

Powered by TurnKey Linux.