Fixed firmware dwell time bug in sweep mode. Two buffers of sample data are now thrown away at the start of each step in order to allow time for tuning.

Fixes #317.
This commit is contained in:
Michael Ossmann
2017-02-01 16:21:04 -07:00
parent c4a820ef34
commit 0eb85c529c
2 changed files with 16 additions and 8 deletions

View File

@ -34,6 +34,7 @@
#define MIN_FREQ 1 #define MIN_FREQ 1
#define MAX_FREQ 6000 #define MAX_FREQ 6000
#define MAX_FREQ_COUNT 1000 #define MAX_FREQ_COUNT 1000
#define THROWAWAY_BUFFERS 2
volatile bool start_sweep_mode = false; volatile bool start_sweep_mode = false;
static uint64_t sweep_freq; static uint64_t sweep_freq;
@ -89,16 +90,18 @@ void sweep_mode(void) {
if (transfer) { if (transfer) {
*(uint16_t*)buffer = 0x7F7F; *(uint16_t*)buffer = 0x7F7F;
*(uint16_t*)(buffer+2) = sweep_freq; *(uint16_t*)(buffer+2) = sweep_freq;
if (blocks_queued > THROWAWAY_BUFFERS) {
usb_transfer_schedule_block( usb_transfer_schedule_block(
&usb_endpoint_bulk_in, &usb_endpoint_bulk_in,
buffer, buffer,
0x4000, 0x4000,
NULL, NULL NULL, NULL
); );
}
transfer = false; transfer = false;
} }
if (blocks_queued >= dwell_blocks) { if ((dwell_blocks + THROWAWAY_BUFFERS) <= blocks_queued) {
if(++ifreq >= frequency_count) if(++ifreq >= frequency_count)
ifreq = 0; ifreq = 0;
sweep_freq = frequencies[ifreq]; sweep_freq = frequencies[ifreq];

View File

@ -243,7 +243,7 @@ static void usage() {
fprintf(stderr, "\t[-l gain_db] # RX LNA (IF) gain, 0-40dB, 8dB steps\n"); fprintf(stderr, "\t[-l gain_db] # RX LNA (IF) gain, 0-40dB, 8dB steps\n");
fprintf(stderr, "\t[-g gain_db] # RX VGA (baseband) gain, 0-62dB, 2dB steps\n"); fprintf(stderr, "\t[-g gain_db] # RX VGA (baseband) gain, 0-62dB, 2dB steps\n");
fprintf(stderr, "\t[-x gain_db] # TX VGA (IF) gain, 0-47dB, 1dB steps\n"); fprintf(stderr, "\t[-x gain_db] # TX VGA (IF) gain, 0-47dB, 1dB steps\n");
fprintf(stderr, "\t[-n num_samples] # Number of samples per frequency, 0-4294967296\n"); fprintf(stderr, "\t[-n num_samples] # Number of samples per frequency, 16384-4294967296\n");
} }
static hackrf_device* device = NULL; static hackrf_device* device = NULL;
@ -355,6 +355,11 @@ int main(int argc, char** argv) {
return EXIT_FAILURE; return EXIT_FAILURE;
} }
if (num_samples < 0x4000) {
fprintf(stderr, "warning: num_samples (-n) must be at least 16384\n");
return EXIT_FAILURE;
}
if( amp ) { if( amp ) {
if( amp_enable > 1 ) { if( amp_enable > 1 ) {
fprintf(stderr, "argument error: amp_enable shall be 0 or 1.\n"); fprintf(stderr, "argument error: amp_enable shall be 0 or 1.\n");