From ea944b4c0593d9f13b8776521169e93748fba2f7 Mon Sep 17 00:00:00 2001 From: erikkaashoek Date: Wed, 25 May 2022 14:30:10 +0200 Subject: [PATCH] Timeout added --- main.c | 28 +++++++++---- nanovna.h | 3 +- sa_cmd.c | 10 ++--- sa_core.c | 2 + si4468.c | 115 +++++++++++++++++++++++++++++++++++++++++++++--------- ui_sa.c | 2 +- 6 files changed, 126 insertions(+), 34 deletions(-) diff --git a/main.c b/main.c index 35000bd..7a67e99 100644 --- a/main.c +++ b/main.c @@ -2501,16 +2501,31 @@ int main(void) spi_init(); -#ifdef TINYSA4 - disk_initialize(0); -// SD_PowerOn(); -#endif + + /* + * Set LCD display brightness (use DAC2 for control) + * Starting DAC1 driver, setting up the output pin as analog as suggested by the Reference Manual. + */ + dac_init(); + DAC->CR|= DAC_CR_EN1 | DAC_CR_EN2; // Use DAC: CH1 and CH2 + #ifdef __LCD_BRIGHTNESS__ + lcd_setBrightness(DEFAULT_BRIGHTNESS); + #endif + DAC->DHR12R1 = 0; // Setup DAC: CH1 value /* * SPI LCD Initialize */ ili9341_init(); +#ifdef TINYSA4 + ili9341_set_foreground(LCD_FG_COLOR); + ili9341_drawstring("Starting...", 0,0); + + disk_initialize(0); +// SD_PowerOn(); +#endif + /* * Initiate 1 micro second timer @@ -2634,14 +2649,11 @@ int main(void) * Set LCD display brightness (use DAC2 for control) * Starting DAC1 driver, setting up the output pin as analog as suggested by the Reference Manual. */ - dac_init(); - DAC->CR|= DAC_CR_EN1 | DAC_CR_EN2; // Use DAC: CH1 and CH2 - #ifdef __LCD_BRIGHTNESS__ + #ifdef __LCD_BRIGHTNESS__ lcd_setBrightness(config._brightness); #else DAC->DHR12R2 = config.dac_value; // Setup DAC: CH2 value #endif - DAC->DHR12R1 = 0; // Setup DAC: CH1 value chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO-1, Thread1, NULL); diff --git a/nanovna.h b/nanovna.h index 5293bd4..80cd54e 100644 --- a/nanovna.h +++ b/nanovna.h @@ -1366,6 +1366,7 @@ extern void ui_init(void); extern void ui_process(void); int current_menu_is_form(void); extern float nf_gain; +extern const char * const averageText[]; void ui_mode_normal(void); void ui_mode_menu(void); @@ -1645,7 +1646,7 @@ extern void SI4463_set_output_level(int t); extern freq_t SI4463_set_freq(freq_t freq); extern uint16_t set_rbw(uint16_t rbw_x10); extern uint16_t force_rbw(int f); -extern void SI4463_do_api(void* data, uint8_t len, void* out, uint8_t outLen); +extern int SI4463_do_api(void* data, uint8_t len, void* out, uint8_t outLen); extern void SI4463_set_gpio(int i, int s); extern void si_set_offset(int16_t offset); extern void si_fm_offset(int16_t offset); diff --git a/sa_cmd.c b/sa_cmd.c index 047c375..a8f857a 100644 --- a/sa_cmd.c +++ b/sa_cmd.c @@ -79,6 +79,7 @@ VNA_SHELL_FUNCTION(cmd_modulation ) VNA_SHELL_FUNCTION(cmd_calc ) { + int t = 0; #ifdef TINYSA4 static const char cmd_cal[] = "off|minh|maxh|maxd|aver4|aver16|aver|quasip|log|lin"; #else @@ -86,11 +87,10 @@ VNA_SHELL_FUNCTION(cmd_calc ) #endif if (argc < 1) { usage: - usage_printf("calc [{trace#}] %s\r\n", cmd_cal); + usage_printf("calc [{trace#}] %s\r\n%s\r\n", cmd_cal,averageText[setting.average[t]]); return; } int next_arg = 0; - int t = 0; if ('0' <= argv[0][0] && argv[0][0] <= '9') { t = my_atoi(argv[0]) - 1; next_arg++; @@ -302,7 +302,7 @@ VNA_SHELL_FUNCTION(cmd_level) VNA_SHELL_FUNCTION(cmd_sweeptime) { if (argc != 1 || argv[0][0] == '?') { - usage_printf("sweeptime 0.003..60\r\n"); + usage_printf("sweeptime 0.003..60\r\n%5.3Fs\r\n",((float)setting.actual_sweep_time_us)/ONE_SECOND_TIME); return; } float f = my_atof(argv[0]); @@ -449,9 +449,9 @@ VNA_SHELL_FUNCTION(cmd_rbw) if (argc != 1 || argv[0][0] == '?') { usage: #ifdef TINYSA4 - usage_printf("rbw 0.3..850|auto\r\n"); + usage_printf("rbw 0.3..850|auto\r\n%.1FHz\r\n", actual_rbw_x10*100.0); #else - usage_printf("rbw 2..600|auto\r\n"); + usage_printf("rbw 2..600|auto\r\n%.1FHz\r\n", actual_rbw_x10*100.0); #endif return; } diff --git a/sa_core.c b/sa_core.c index 007d189..e9ffb04 100644 --- a/sa_core.c +++ b/sa_core.c @@ -6906,7 +6906,9 @@ void calibrate(void) int calibration_stage = CS_NORMAL; config.low_level_offset = 0; config.high_level_offset = 0; +#ifdef TINYSA4 config.lna_level_offset = 0; +#endif config.receive_switch_offset = 0; again: for (int k = 0; k<2; k++) { diff --git a/si4468.c b/si4468.c index 5c9d8f7..2ec5cab 100644 --- a/si4468.c +++ b/si4468.c @@ -66,7 +66,7 @@ #else // On 48M MCU STM32_PCLK2 = 48M, SPI = 48M/2 = 24M //#define SI4432_SPI_SPEED SPI_BR_DIV2 -#define SI4432_SPI_SPEED SPI_BR_DIV4 +#define SI4432_SPI_SPEED SPI_BR_DIV8 #endif @@ -670,9 +670,10 @@ static uint8_t SI4463_in_tx_mode = false; static int SI4463_output_level = 0x20; static si446x_state_t SI4463_get_state(void); -static void SI4463_set_state(si446x_state_t); +static int SI4463_set_state(si446x_state_t); #define SI4463_READ_CTS (palReadLine(LINE_RX_CTS)) +#define SI4463_CTS_TIMEOUT 1000000 #ifdef __WAIT_CTS_WHILE_SLEEPING__ extern volatile int sleep; #if 0 @@ -684,7 +685,20 @@ extern volatile int sleep; } \ }; #else -#define SI4463_WAIT_CTS while (!SI4463_READ_CTS) ; + +inline int SI4463_wait_CTS(void) { + int t=0; + while (!SI4463_READ_CTS) { + t++; + if (t >=SI4463_CTS_TIMEOUT) + return -1; + } + return 0; +} + +#define SI4463_WAIT_CTS SI4463_wait_CTS() + +//#define SI4463_WAIT_CTS {int t=0; while (!SI4463_READ_CTS) { t++; if (t >=SI4463_CTS_TIMEOUT) ili9341_drawstring("SI4486 deadlock", 0,20);} } #endif #else #define SI4463_WAIT_CTS while (!SI4463_READ_CTS) ; @@ -751,11 +765,11 @@ static uint8_t SI4463_get_response(void* buff, uint8_t len) #endif -void SI4463_do_api(void* data, uint8_t len, void* out, uint8_t outLen) +void SI4463_do_first_api(void* data, uint8_t len, void* out, uint8_t outLen) { uint8_t *ptr = (uint8_t *)data; set_SPI_mode(SPI_MODE_SI); - SI4463_WAIT_CTS; // Wait for CTS +// SI4463_WAIT_CTS; // Wait for CTS SI_CS_LOW; #if 1 // Inline transfer while (len--){ @@ -799,6 +813,56 @@ void SI4463_do_api(void* data, uint8_t len, void* out, uint8_t outLen) SI_CS_HIGH; } + +int SI4463_do_api(void* data, uint8_t len, void* out, uint8_t outLen) +{ + uint8_t *ptr = (uint8_t *)data; + set_SPI_mode(SPI_MODE_SI); + if (SI4463_WAIT_CTS) return -1; // Wait for CTS + SI_CS_LOW; +#if 1 // Inline transfer + while (len--){ + while (SPI_TX_IS_NOT_EMPTY(SI4432_SPI)); + SPI_WRITE_8BIT(SI4432_SPI, *ptr++); + } + while (SPI_IS_BUSY(SI4432_SPI)); +#else + while (len--) + shiftOut(*ptr++); // (pgm_read_byte(&((uint8_t*)data)[i])); +#endif + SI_CS_HIGH; + + if(out == NULL) return 0; // If we have an output buffer then read command response into it + + while (SPI_RX_IS_NOT_EMPTY(SI4432_SPI)) + (void)SPI_READ_8BIT(SI4432_SPI); // Remove lingering bytes from SPI RX buffer + if (SI4463_WAIT_CTS) return -1; // Wait for CTS + + SI_CS_LOW; +#if 1 + SPI_WRITE_8BIT(SI4432_SPI, SI446X_CMD_READ_CMD_BUFF); + SPI_WRITE_8BIT(SI4432_SPI, 0xFF); + while (SPI_IS_BUSY(SI4432_SPI)); + SPI_READ_16BIT(SI4432_SPI); // drop SI446X_CMD_READ_CMD_BUFF and CTS 0xFF +#else + shiftOut( SI446X_CMD_READ_CMD_BUFF ); + shiftIn(); // Should always be 0xFF +#endif + // Get response data + ptr = (uint8_t *)out; + while (outLen--){ +#if 1 // Inline transfer + SPI_WRITE_8BIT(SI4432_SPI, 0xFF); + while (SPI_RX_IS_EMPTY(SI4432_SPI)); //wait rx data in buffer + *ptr++ = SPI_READ_8BIT(SI4432_SPI); +#else + *ptr++ = shiftIn(); +#endif + } + SI_CS_HIGH; + return 0; +} + #ifdef notused static void SI4463_set_properties(uint16_t prop, void* values, uint8_t len) { @@ -866,13 +930,13 @@ static void SI4463_set_properties(uint16_t prop, void* values, uint8_t len) static const uint8_t SI4468_config[] = RADIO_CONFIGURATION_DATA_ARRAY; // Set new state -static void SI4463_set_state(si446x_state_t newState) +static int SI4463_set_state(si446x_state_t newState) { uint8_t data[] = { SI446X_CMD_CHANGE_STATE, newState }; - SI4463_do_api(data, sizeof(data), NULL, 0); + return SI4463_do_api(data, sizeof(data), NULL, 0); } static uint8_t gpio_state[5] = { @@ -883,7 +947,7 @@ static uint8_t gpio_state[5] = { SI446X_GPIO_MODE_DRIVE1 }; -void SI4463_refresh_gpio(void) +int SI4463_refresh_gpio(void) { uint8_t data2[] = { SI446X_CMD_GPIO_PIN_CFG, @@ -895,7 +959,7 @@ void SI4463_refresh_gpio(void) 0, // SDO 0 // GEN_CONFIG }; - SI4463_do_api(data2, sizeof(data2), NULL, 0); + return SI4463_do_api(data2, sizeof(data2), NULL, 0); } void SI4463_set_gpio(int i, int s) @@ -1002,13 +1066,14 @@ void SI4463_start_tx(uint8_t CHANNEL) } -void SI4463_start_rx(uint8_t CHANNEL) +int SI4463_start_rx(uint8_t CHANNEL) { si446x_state_t s = SI4463_get_state(); if (s == SI446X_STATE_TX){ - SI4463_set_state(SI446X_STATE_READY); + if (SI4463_set_state(SI446X_STATE_READY)) + return -1; } - SI4463_refresh_gpio(); + if (SI4463_refresh_gpio()) return -1; #if 0 @@ -1042,7 +1107,8 @@ void SI4463_start_rx(uint8_t CHANNEL) SI446X_CMD_START_RX_ARG_NEXT_STATE3_RXINVALID_STATE_ENUM_RX }; //retry: - SI4463_do_api(data, sizeof(data), NULL, 0); + if (SI4463_do_api(data, sizeof(data), NULL, 0)) + return -1; #if 0 // Get state for debugging si446x_state_t s = SI4463_get_state(); @@ -1058,6 +1124,7 @@ void SI4463_start_rx(uint8_t CHANNEL) } #endif SI4463_in_tx_mode = false; + return 0; } @@ -1861,20 +1928,30 @@ freq_t SI4463_set_freq(freq_t freq) void SI4463_init_rx(void) { -// reset: + reset: SI_SDN_LOW; - my_microsecond_delay(100); + my_microsecond_delay(10000); SI_SDN_HIGH; - my_microsecond_delay(1000); + my_microsecond_delay(10000); SI_SDN_LOW; - my_microsecond_delay(1000); + my_microsecond_delay(100000); + if (SI4463_WAIT_CTS) { + ili9341_drawstring("SI4468 Reset fail", 0,10); + goto reset; + } for(uint16_t i=0;i