diff --git a/src/ad5933.c b/src/ad5933.c index d51761d6ae172dfbad4a0620f5c07f8a1aaec5f5..467a45b9d62a5a56169e53f9e7da7516abea17b0 100644 --- a/src/ad5933.c +++ b/src/ad5933.c @@ -265,13 +265,13 @@ static void internal_clock_set(bool internal) { } void ad5933_test(void){ - ad5933_set_params(0x0f5c28, 0x14f, 10, 100, 1); + ad5933_set_params(0x0f5c28, 0x9f4f, 10, 2000, 1); - cuint16_t result[10]; + cint16_t result[10]; ad5933_sweep(result, 10); for (uint8_t n = 0; n < 10; n++) { - printf("%u + %ui\r\n", result[n].real, result[n].imag); + printf("%i + %ii\r\n", result[n].real, result[n].imag); } } @@ -378,7 +378,7 @@ static void set_control_mode(uint8_t mode) { return; } -void ad5933_sweep(cuint16_t imp[], int n) { +void ad5933_sweep(cint16_t imp[], int n) { reset(); set_control_mode(CTRL_STANDBY_MODE); set_control_mode(CTRL_INIT_START_FREQ); @@ -401,11 +401,51 @@ void ad5933_sweep(cuint16_t imp[], int n) { return; } +cint16_t ad5933_measure_one(uint8_t measure_type) { + cint16_t data; + + if ((read_byte(STATUS_REG) & STATUS_SWEEP_DONE) == STATUS_SWEEP_DONE) { + data.real = 0; + data.imag = 0; + printf("#INFO: AD5933: Reached end of sweep.\r\n"); + set_control_mode(CTRL_POWER_DOWN_MODE); + return data; + } + + switch (measure_type) { + case AD5933_MEASURE_FIRST: + reset(); + set_control_mode(CTRL_STANDBY_MODE); + set_control_mode(CTRL_INIT_START_FREQ); + delay_ms(400); + set_control_mode(CTRL_START_FREQ_SWEEP); + break; + + case AD5933_MEASURE_NEXT: + set_control_mode(CTRL_INCREMENT_FREQ); + break; + + case AD5933_MEASURE_REPEAT: + set_control_mode(CTRL_REPEAT_FREQ); + break; + + default: + printf("#ERR: AD5933: Invalid frequency mode selected.\r\n"); + data.real = 0; + data.imag = 0; + return data; + } + + + return(ad5993_get_complex_data()); +} + -cuint16_t ad5993_get_complex_data(void) { +cint16_t ad5993_get_complex_data(void) { // poll the status register to check for data to receive while ((read_byte(STATUS_REG) & STATUS_DATA_VALID) != STATUS_DATA_VALID){ - delay_ms(30); +// delay_ms(30); + delay_ms(10); } uint16_t real; @@ -414,7 +454,7 @@ cuint16_t ad5993_get_complex_data(void) { read_block(REAL_DATA_1, 2, (uint8_t*)&real); read_block(IMAG_DATA_1, 2, (uint8_t*)&imag); - cuint16_t result; + cint16_t result; result.real = swap16(real); result.imag = swap16(imag); diff --git a/src/ad5933.h b/src/ad5933.h index f1aa7fe39eb21534ffd631f652dc60e8e574f0b3..24ba4d422d512e277eb1a652f380f70d028c1ece 100644 --- a/src/ad5933.h +++ b/src/ad5933.h @@ -13,15 +13,20 @@ #include #include -typedef struct c_uint16_t { - uint16_t real; - uint16_t imag; -} cuint16_t; +#define AD5933_MEASURE_FIRST 0 +#define AD5933_MEASURE_REPEAT 1 +#define AD5933_MEASURE_NEXT 2 + +typedef struct c_int16_t { + int16_t real; + int16_t imag; +} cint16_t; void ad5933_set_params(uint32_t start, uint32_t increment, uint16_t n_increments, uint16_t settle_cycles, uint8_t gain); -void ad5933_sweep(cuint16_t imp[], int n); -cuint16_t ad5993_get_complex_data(void); +void ad5933_sweep(cint16_t imp[], int n); +cint16_t ad5993_get_complex_data(void); +cint16_t ad5933_measure_one(uint8_t measure_type); void ad5933_test(void);