diff --git a/codice/Core/Inc/bassofono.h b/codice/Core/Inc/bassofono.h index b51bb8d..843b452 100644 --- a/codice/Core/Inc/bassofono.h +++ b/codice/Core/Inc/bassofono.h @@ -1,10 +1,25 @@ #include #include -#include +// #include #include "main.h" #include "rx.h" #include "tx.h" +#define TX_TYPE_NONE 0 +#define TX_TYPE_DAC 1 +#define TX_TYPE_PWM 2 +#define TX_TYPE_SI5351 3 +// #define TX_TYPE TX_TYPE_SI5351 +#define TX_TYPE TX_TYPE_NONE + +#define IF_TYPE_NOIF 0 +#define IF_TYPE_LOMIX 1 +#define IF_TYPE IF_TYPE_NOIF + +#define LO_TYPE_FIX 0 +#define LO_TYPE_SI5351 1 +#define LO_TYPE LO_TYPE_SI5351 + #define CLOCK (168000000UL) // RX ADC @@ -19,67 +34,15 @@ #define TX_DAC_BUFFER_SIZE (1024) #define TX_DAC_BUFFER_RATE (TX_DAC_SAMPLE_RATE/TX_DAC_BUFFER_SIZE) -// =========== HBF ========== -// #define MS_HBF_TAP_NUM (15) - - -// #define DECIMATION_FACTOR (ADC_BUFFER_SIZE/ST2_BUFFER_SIZE) -// #define DECIMATION_FACTOR_MASK (DECIMATION_FACTOR - 1) - -/* -// 1° stadio -// decimazione del singolo stadio -#define MS_DECIMATION_FACTOR (2) -#define MS_DECIMATION_FACTOR_MASK (MS_DECIMATION_FACTOR - 1) -// ringbuf -#define MIXED_SAMPLES_RINGBUFFER_SIZE (64) // l'ultimo deve essere grande almeno come MS_HBF_TAP_NUM -#define MIXED_SAMPLES_RINGBUFFER_SIZE_MASK (MIXED_SAMPLES_RINGBUFFER_SIZE - 1) -#define MIXED_SAMPLES_2M_RINGBUFFER_SIZE (MIXED_SAMPLES_RINGBUFFER_SIZE / 2) -#define MIXED_SAMPLES_2M_RINGBUFFER_SIZE_MASK (MIXED_SAMPLES_2M_RINGBUFFER_SIZE - 1) - -#define ST1_OUT_SAMPLE_RATE (ADC_SAMPLE_RATE/(MS_DECIMATION_FACTOR*2)) - -// 2° stadio -#define ST2_BUFFER_SIZE (256) -#define ST2_DECIMATION_FACTOR (4) -#define ST2_OUT_SAMPLE_RATE (ST1_OUT_SAMPLE_RATE/ST2_DECIMATION_FACTOR) -#define ST2_FILTER_BLOCK_SIZE (ST2_BUFFER_SIZE) -#define ST2_FILTER_TAP_NUM (128) -*/ - -/* - -// =========== DEMOD ========== - -// DAC_SAMPLE_RATE/((2^32)/(incremento)) = freq -// (2^32)/(DAC_SAMPLE_RATE/freq) = incremento -#define NCO2_INCREMENT (343597383L) -#define NCO2_FREQUENCY (DAC_SAMPLE_RATE/((0xFFFFFFFF)/NCO2_INCREMENT)) -#define LF_BUFFER_SIZE (ST2_BUFFER_SIZE/ST2_DECIMATION_FACTOR) - -// audio filter -#define AUDIO_FILTER_TAP_NUM 128 -#define AUDIO_FILTER_FREQ_DEF (1350) -#define AUDIO_FILTER_FREQ_MAX (DAC_SAMPLE_RATE/2) -#define AUDIO_FILTER_BW_DEF (2000) -#define AUDIO_FILTER_BW_MAX (DAC_SAMPLE_RATE/2) -#define AUDIO_FILTER_BETA_DEF (16) -#define AUDIO_FILTER_BLOCK_SIZE LF_BUFFER_SIZE -*/ -// statemask -/* -#define FREQUENCY_OFFSET 0 -#define GAIN_OFFSET 1 -#define VOLUME_OFFSET 2 -#define FILTER_OFFSET 3 -#define MODULATION_OFFSET 4 -*/ - #define MOD_DC 0 #define MOD_LSB 1 #define MOD_USB 2 #define MOD_AM 3 +#define STATUS_RX 0 +#define STATUS_TX 1 +#define STATUS_SQ 2 + // === DAC === #define DAC_DIVISOR 7680 #define DAC_SAMPLE_RATE (CLOCK/DAC_DIVISOR) @@ -96,6 +59,8 @@ extern uint8_t receive, transmit; extern q31_t nco1_increment; extern uint32_t frequency; +extern int32_t rit; +extern uint16_t pwm_tx_period; extern int32_t modulation; extern int32_t gain; extern int32_t peak, oldpeak, peakset; @@ -105,9 +70,11 @@ extern int32_t mic_gain; extern int32_t scan; extern uint32_t audio_filter_freq, audio_filter_bw, audio_filter_beta; extern uint16_t state_changed; - +extern char tabstring[15]; extern CORDIC_HandleTypeDef hcordic; +extern uint8_t s_meter; + // uartz extern char uart_rx_buf[2], rx_cmd_rb[RX_CMD_RB_SIZE]; extern uint8_t rx_cmd_rb_in_idx, rx_cmd_rb_out_idx; @@ -130,6 +97,7 @@ extern q31_t if_Q[LF_BUFFER_SIZE]; extern uint8_t lf_buffer_toggle; extern q31_t prefilter_lf_buffer[LF_BUFFER_SIZE]; extern q31_t lf_buffer[2][LF_BUFFER_SIZE]; +// extern q31_t lf_buffer_test[2][LF_BUFFER_SIZE]; // ======== FUNZIONI ======== @@ -147,3 +115,8 @@ q31_t sat_mult_q31(q31_t a, q31_t b); // diag void diag(void); + +uint32_t get_pwm_freq(uint16_t pwm_period); +uint16_t get_pwm_period(uint32_t pwm_frequency); + +uint8_t measure_log_abs_mean(q31_t *samples, uint16_t size); diff --git a/codice/Core/Inc/interface.h b/codice/Core/Inc/interface.h index e57b9a8..9880c23 100644 --- a/codice/Core/Inc/interface.h +++ b/codice/Core/Inc/interface.h @@ -31,30 +31,22 @@ #define TYP_FLOAT 1 #define TYP_ALPHA 2 #define TYP_LIST 3 +#define TYP_NED 4 +#define TYP_HID 5 -/* -#define MOD_DC 0 -#define MOD_LSB 1 -#define MOD_USB 2 -#define MOD_AM 3 -*/ +#define MENU_PAGE_SOM 0 +#define MENU_PAGE_DEFAULT 0 +#define MENU_PAGE_AUDIO 1 +#define MENU_PAGE_EOM 1 + +#define MENU_PAGE_MEM 2 +#define MENU_PAGE_ALL 255 #define SAT 0 #define WRAP 1 -/* -#define MENU_SELECT_FREQ 0 -#define MENU_SELECT_VOL 1 -#define MENU_SELECT_MODUL 2 -#define MENU_SELECT_FILTER_F 3 -#define MENU_SELECT_FILTER_BW 4 -*/ - -// #define MENU_SELECT_DEFAULT MENU_SELECT_FREQ -// #define MENU_SELECT_EOM MENU_SELECT_FILTER_BW - #define MENU_NAME_ROW 0 -#define MENU_NAME_COL 1 +#define MENU_NAME_COL 0 #define DISPLAY_BL_DIM 0 #define DISPLAY_ROWS 6 @@ -70,6 +62,7 @@ typedef void (*menu_set_function)(void); typedef void (*menu_print_function)(uint8_t a); struct menu_item { + uint8_t page; char name[14]; uint8_t type; uint8_t size; @@ -79,19 +72,24 @@ struct menu_item { uint32_t min; uint32_t max; uint8_t wrap; + char prefix[4]; + char suffix[4]; uint32_t *varptr; menu_set_function set_function_ptr; menu_print_function print_function_ptr; }; -extern uint8_t menu_mode, current_tab; +extern uint8_t menu_item, menu_page; +extern uint8_t menu_last_item[MENU_PAGE_EOM + 1]; + extern char modulation_list[4][4]; +extern char status_list[3][3]; extern struct menu_item items[]; -extern struct menu_item tabs[]; +// extern struct menu_item tabs[]; extern uint8_t menu_item_count; -extern uint8_t tabs_count; +// extern uint8_t tabs_count; // funcs @@ -99,9 +97,10 @@ void encoder_increment(void); void encoder_decrement(void); void joystick_dx(void); void joystick_sx(void); -void set_menu_mode(uint8_t mode); +void set_menu_item(uint8_t mode); void print_integer(uint8_t item_idx); +void print_string(uint8_t item_idx); void print_modulation(uint8_t item_idx); void print_bar(uint8_t item_idx); void print_frequency(uint8_t item_idx); @@ -109,3 +108,5 @@ void print_frequency(uint8_t item_idx); char * valToStr(uint32_t val, char *buf, uint8_t bufSize, char sepChar); uint8_t sat_subu8b(uint8_t x, uint8_t y); +void menu_item_up(void); +void menu_item_down(void); diff --git a/codice/Core/Inc/main.h b/codice/Core/Inc/main.h index 3a44a7e..22d8143 100644 --- a/codice/Core/Inc/main.h +++ b/codice/Core/Inc/main.h @@ -59,14 +59,16 @@ void set_gain(void); /* USER CODE END EFP */ /* Private defines -----------------------------------------------------------*/ +#define NC1_Pin GPIO_PIN_0 +#define NC1_GPIO_Port GPIOA +#define NC2_Pin GPIO_PIN_2 +#define NC2_GPIO_Port GPIOA +#define OUT_Pin GPIO_PIN_12 +#define OUT_GPIO_Port GPIOA #define T_SWDIO_Pin GPIO_PIN_13 #define T_SWDIO_GPIO_Port GPIOA #define T_SWCLK_Pin GPIO_PIN_14 #define T_SWCLK_GPIO_Port GPIOA -#define T_SWO_Pin GPIO_PIN_3 -#define T_SWO_GPIO_Port GPIOB -#define OUT_Pin GPIO_PIN_5 -#define OUT_GPIO_Port GPIOB /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ @@ -76,5 +78,3 @@ void set_gain(void); #endif #endif /* __MAIN_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/codice/Core/Inc/rx.h b/codice/Core/Inc/rx.h index 24a5803..f407fe6 100644 --- a/codice/Core/Inc/rx.h +++ b/codice/Core/Inc/rx.h @@ -6,7 +6,6 @@ #define NCO2_INCREMENT (343597383L) #define NCO2_FREQUENCY (DAC_SAMPLE_RATE/((0xFFFFFFFF)/NCO2_INCREMENT)) -#define LF_BUFFER_SIZE (ST2_BUFFER_SIZE/ST2_DECIMATION_FACTOR) // 1° stadio // decimazione del singolo stadio @@ -28,16 +27,21 @@ #define ST2_FILTER_BLOCK_SIZE (ST2_BUFFER_SIZE) #define ST2_FILTER_TAP_NUM (128) +#define LF_BUFFER_SIZE (ST2_BUFFER_SIZE/ST2_DECIMATION_FACTOR) + // audio filter #define AUDIO_FILTER_TAP_NUM 128 -#define AUDIO_FILTER_FREQ_DEF (1350) +#define AUDIO_FILTER_FREQ_DEF (1250) #define AUDIO_FILTER_FREQ_MAX (DAC_SAMPLE_RATE/2) #define AUDIO_FILTER_BW_DEF (2000) #define AUDIO_FILTER_BW_MAX (DAC_SAMPLE_RATE/2) #define AUDIO_FILTER_BETA_DEF (16) #define AUDIO_FILTER_BLOCK_SIZE LF_BUFFER_SIZE -extern int32_t rx_signal; +#define RX_SMETER_SCALE 4 + +extern uint8_t rx_signal, rx_signal_last; +extern q31_t rx_nco1_increment; // filtro st2 extern arm_fir_decimate_instance_q31 st2_filter_I_struct; @@ -67,6 +71,4 @@ void audio_filter_init(void); void audio_filter_generate_coeffs(int32_t *Coeffs, uint32_t freq, uint32_t bw, uint8_t beta); q31_t hb_fir15(q31_t * samples_ringbuf, uint8_t sample_index, uint8_t buff_size_mask, q31_t * coefficients); -void rx_measure_signal(q31_t *samples, uint16_t size); - #endif diff --git a/codice/Core/Inc/si5351.h b/codice/Core/Inc/si5351.h new file mode 100644 index 0000000..1574627 --- /dev/null +++ b/codice/Core/Inc/si5351.h @@ -0,0 +1,27 @@ +#define SI5351_ADDRESS (0x60) + +#define SI5351_CRYSTAL_FREQ 24000000 + +#define SI5351_MIN_FREQ 3000 +#define SI5351_MAX_FREQ 200000000 + +#define SI5351_OUT_ENABLE 3 +#define SI5351_OUT_DIS_STATE 24 + +#define SI5351_INPUT_SOURCE 15 + +#define SI5351_CLK0_CONTROL 16 +#define SI5351_CLK1_CONTROL 17 +#define SI5351_CLK2_CONTROL 18 + +#define SI5351_PLLA 26 +#define SI5351_PLLB 34 + +#define SI5351_MULTISYNTH0 42 +#define SI5351_MULTISYNTH1 50 +#define SI5351_MULTISYNTH2 58 + +#define SI5351_RESET 177 +#define SI5351_CRYSTAL_LOAD 183 + +extern I2C_HandleTypeDef hi2c1; diff --git a/codice/Core/Inc/stm32g4xx_hal_conf.h b/codice/Core/Inc/stm32g4xx_hal_conf.h index f8d7297..c152b5a 100644 --- a/codice/Core/Inc/stm32g4xx_hal_conf.h +++ b/codice/Core/Inc/stm32g4xx_hal_conf.h @@ -1,21 +1,22 @@ +/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file stm32g4xx_hal_conf.h * @author MCD Application Team * @brief HAL configuration file ****************************************************************************** - * @attention + * @attention * - *

© Copyright (c) 2019 STMicroelectronics. - * All rights reserved.

+ * Copyright (c) 2019 STMicroelectronics. + * All rights reserved. * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ +/* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef STM32G4xx_HAL_CONF_H @@ -46,7 +47,7 @@ /*#define HAL_HRTIM_MODULE_ENABLED */ /*#define HAL_IRDA_MODULE_ENABLED */ /*#define HAL_IWDG_MODULE_ENABLED */ -/*#define HAL_I2C_MODULE_ENABLED */ +#define HAL_I2C_MODULE_ENABLED /*#define HAL_I2S_MODULE_ENABLED */ /*#define HAL_LPTIM_MODULE_ENABLED */ /*#define HAL_NAND_MODULE_ENABLED */ @@ -377,5 +378,3 @@ void assert_failed(uint8_t *file, uint32_t line); #endif #endif /* STM32G4xx_HAL_CONF_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/codice/Core/Inc/stm32g4xx_it.h b/codice/Core/Inc/stm32g4xx_it.h index b9c9d80..42bcde7 100644 --- a/codice/Core/Inc/stm32g4xx_it.h +++ b/codice/Core/Inc/stm32g4xx_it.h @@ -72,5 +72,3 @@ void TIM7_IRQHandler(void); #endif #endif /* __STM32G4xx_IT_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/codice/Core/Inc/tx.h b/codice/Core/Inc/tx.h index 0f850a5..e0f7bea 100644 --- a/codice/Core/Inc/tx.h +++ b/codice/Core/Inc/tx.h @@ -8,6 +8,9 @@ #define TX_AUDIO_FILTER_BLOCK_SIZE (1024) #define TX_AUDIO_FILTER_TAP_NUM (128) +extern uint8_t tx_signal, tx_signal_last; +extern q31_t tx_nco1_increment; + // buffer extern volatile uint8_t half_tx_dac_buffer_empty, tx_dac_buffer_toggle; extern volatile uint8_t tx_adc_buffer_ready; diff --git a/codice/Core/Src/bassofono.c b/codice/Core/Src/bassofono.c index 3f23d5f..179f368 100644 --- a/codice/Core/Src/bassofono.c +++ b/codice/Core/Src/bassofono.c @@ -13,6 +13,7 @@ #include "tx.h" #include "rx.h" #include "interface.h" +#include "si5351.h" #include "main.h" #include "FIRFilterCode.h" #include @@ -33,6 +34,8 @@ // state uint8_t receive, transmit; uint32_t frequency; +int32_t rit; +uint16_t pwm_tx_period; int32_t modulation; int32_t gain; int32_t peak, oldpeak, peakset; @@ -42,6 +45,8 @@ int32_t mic_gain; int32_t scan; q31_t nco1_increment; uint32_t audio_filter_freq, audio_filter_bw, audio_filter_beta; +char tabstring[15]; +uint8_t s_meter; // maschera, ogni bit uno stato uint16_t state_changed; @@ -64,9 +69,10 @@ q31_t if_Q[LF_BUFFER_SIZE]; uint8_t lf_buffer_toggle; q31_t prefilter_lf_buffer[LF_BUFFER_SIZE]; q31_t lf_buffer[2][LF_BUFFER_SIZE]; +// q31_t lf_buffer_test[2][LF_BUFFER_SIZE]; // TX -volatile uint8_t half_tx_dac_buffer_empty, tx_dac_buffer_toggle; +// volatile uint8_t half_tx_dac_buffer_empty, tx_dac_buffer_toggle; q31_t tx_dac_buffer[2][TX_DAC_BUFFER_SIZE]; // ============ @@ -104,6 +110,7 @@ void dequeue_cmd(void){ ringbuf_increment(&rx_cmd_rb_out_idx, RX_CMD_RB_SIZE_MASK); } +/* void enqueue_tx(char * data, uint16_t len){ for( uint8_t index = 0; index < len; index++){ uart_tx_buf[uart_tx_buf_in_idx] = data[index]; @@ -111,10 +118,20 @@ void enqueue_tx(char * data, uint16_t len){ if(uart_tx_buf_in_idx == UART_TX_BUFFER_SIZE) break; } } +*/ // state changes void set_frequency(void){ - nco1_increment = set_nco1_freq(frequency); + rx_nco1_increment = set_nco1_freq(frequency+rit); + if(TX_TYPE == TX_TYPE_DAC){ + tx_nco1_increment = set_nco1_freq(frequency); + } + else if(TX_TYPE == TX_TYPE_PWM){ + pwm_tx_period = get_pwm_period(frequency); + } + else if(TX_TYPE == TX_TYPE_SI5351){ + si53531_set_frequency(frequency); + } } void set_filter(void){ @@ -124,14 +141,15 @@ void set_filter(void){ void set_modulation(void){ st2_filter_init(); // cambia offset - nco1_increment = set_nco1_freq(frequency); + set_frequency(); +// nco1_increment = set_nco1_freq(frequency); } void set_dummy(void){ // non fare NULLAH } - +// cambiato stato void set_changed(uint8_t state){ state_changed |= (1U< 0) ? samples[index] : (q31_t)__QSUB(0, samples[index]); + measured_signal += (abs >> 6); + index++; + } + while (log_sig) { + if((measured_signal >> log_sig) & 1) break; + log_sig--; + } + return log_sig; +} diff --git a/codice/Core/Src/interface.c b/codice/Core/Src/interface.c index 77f3dc5..2183f37 100644 --- a/codice/Core/Src/interface.c +++ b/codice/Core/Src/interface.c @@ -2,13 +2,15 @@ #include "bassofono.h" #include -uint8_t menu_mode, current_tab; +uint8_t menu_item, menu_page; +uint8_t menu_last_item[MENU_PAGE_EOM + 1]; /* typedef void (*menu_set_function)(void); typedef void (*menu_print_function)(uint8_t a); struct menu_item { + uint8_t page; char name[14]; uint8_t type; uint8_t size; @@ -18,31 +20,44 @@ struct menu_item { uint32_t min; uint32_t max; uint8_t wrap; + char suffix[3]; uint32_t *varptr; menu_set_function set_function_ptr; menu_print_function print_function_ptr; }; */ -// name, type, size,row,col,step, min, max, wrap *varptr, set_function_ptr print_function_ptr +// size deve comprendere lo spazio per il '>', eccetto che per i campi NED +// set_function_ptr viene applicata dopo che varptr e' stata modificata con + +// name, type, size,row,col,step, min, max, wrap suffix *varptr, set_function_ptr print_function_ptr struct menu_item items[] = { - {" Frequency", TYP_INT, 11, 1, 0, 100, 1000, 175000, WRAP, &frequency, &set_frequency, &print_frequency}, - {" Volume ", TYP_INT, 2, 2, 0, 1, 0, 32, SAT, &volume, &set_dummy, &print_integer}, - {" Gain ", TYP_INT, 1, 2, 3, 1, 1, 6, SAT, &gain, &set_gain, &print_integer}, - {" Modulation", TYP_INT, 3, 2, 5, 1, 0, 3, WRAP, &modulation, &set_modulation,&print_modulation}, - {" Squelch ", TYP_INT, 2, 2, 10, 1, 0, 32, SAT, &squelch, &set_dummy, &print_integer}, - {" Filter CF ", TYP_INT, 4, 3, 0, 100, 100, 3500, SAT, &audio_filter_freq, &set_filter, &print_integer}, - {" Filter BW ", TYP_INT, 4, 3, 5, 100, 100, 2500, SAT, &audio_filter_bw, &set_filter, &print_integer}, - {" Filter Q ", TYP_INT, 2, 3, 10, 1, 1, 32, SAT, &audio_filter_beta, &set_filter, &print_integer}, - {" Signal ", TYP_INT, 8, 10, 0, 1, 1, 32, SAT, &rx_signal, &set_dummy, &print_bar}, + {MENU_PAGE_DEFAULT, " Frequency", TYP_INT, 9, 1, 0, 100, 1000, 175000, WRAP, "", " Hz", &frequency, &set_frequency, &print_frequency}, +// {MENU_PAGE_DEFAULT, " Rit ", TYP_INT, 4, 2, 0, 10, 0, 9999, SAT, "", "", &rit, &set_frequency, &print_frequency}, + {MENU_PAGE_DEFAULT, " Volume ", TYP_INT, 5, 2, 0, 1, 0, 32, SAT, "", "|", &volume, &set_dummy, &print_bar}, + {MENU_PAGE_DEFAULT, " Gain ", TYP_INT, 1, 2, 7, 1, 1, 6, SAT, "", "x", &gain, &set_gain, &print_integer}, + {MENU_PAGE_DEFAULT, " Modulation", TYP_INT, 3, 2, 10, 1, 0, 3, WRAP, "", "", &modulation, &set_modulation,&print_modulation}, +// {MENU_PAGE_DEFAULT, " Squelch ", TYP_INT, 2, 3, 10, 1, 0, 32, SAT, "", "", &squelch, &set_dummy, &print_integer}, + + {MENU_PAGE_AUDIO, " Filter CF ", TYP_INT, 4, 1, 0, 50, 50, 3500, SAT, "", " Hz", &audio_filter_freq, &set_filter, &print_integer}, + {MENU_PAGE_AUDIO, " Filter BW ", TYP_INT, 4, 2, 0, 50, 50, 2500, SAT, "", " Hz", &audio_filter_bw, &set_filter, &print_integer}, + {MENU_PAGE_AUDIO, " Filter Q ", TYP_INT, 2, 3, 0, 1, 1, 32, SAT, "", " Q", &audio_filter_beta, &set_filter, &print_integer}, + + {MENU_PAGE_ALL, " Signal ", TYP_NED, 13, 4, 0, 0, 0, 0, SAT, "S", "", &s_meter, &set_dummy, &print_bar}, + {MENU_PAGE_ALL, " TX tab ", TYP_NED, 3, 5, 0, 0, 0, 0, SAT, "", "", "PTT", &set_dummy, &print_string}, + {MENU_PAGE_ALL, " Tabs ", TYP_NED, 3, 5, 4, 0, 0, 0, SAT, "", "", "SET", &set_dummy, &print_string}, + {MENU_PAGE_ALL, " Tabs ", TYP_NED, 1, 5, 9, 0, 0, 0, SAT, "", "", "-", &set_dummy, &print_string}, + {MENU_PAGE_ALL, " Tabs ", TYP_NED, 1, 5, 12, 0, 0, 0, SAT, "", "", "+", &set_dummy, &print_string}, }; +/* struct menu_item tabs[] = { - {"SCN", TYP_INT, 3, 0, 0, 1, 0, 3, WRAP, &scan, &set_dummy, &print_integer}, + {MENU_PAGE_DEFAULT, "SCN", TYP_INT, 3, 0, 0, 1, 0, 3, WRAP, "Hz", &scan, &set_dummy, &print_integer}, }; +*/ uint8_t menu_item_count = sizeof(items)/sizeof(items[0]); -uint8_t tabs_count = sizeof(tabs)/sizeof(tabs[0]); +// uint8_t tabs_count = sizeof(tabs)/sizeof(tabs[0]); char modulation_list[][4] = { [MOD_DC] = "DC", @@ -53,6 +68,16 @@ char modulation_list[][4] = { uint8_t modulation_list_count = sizeof(modulation_list)/sizeof(modulation_list[0]); +char status_list[][3] = { + [STATUS_RX] = "Rx", + [STATUS_TX] = "Tx", + [STATUS_SQ] = "Sq", +}; + +uint8_t status_list_count = sizeof(status_list)/sizeof(status_list[0]); + +// == ################################ == + void decode_cmd(char cmd){ switch(cmd){ case ENRH: @@ -112,49 +137,61 @@ void decode_cmd(char cmd){ } void encoder_increment(void){ - integer_editor_up(menu_mode); - items[menu_mode].set_function_ptr(); + if(items[menu_item].type == TYP_INT) integer_editor_up(menu_item); + items[menu_item].set_function_ptr(); } void encoder_decrement(void){ - integer_editor_down(menu_mode); - items[menu_mode].set_function_ptr(); + if(items[menu_item].type == TYP_INT) integer_editor_down(menu_item); + items[menu_item].set_function_ptr(); } void joystick_dx(void){ - step_down(menu_mode); + step_down(menu_item); } void joystick_sx(void){ - step_up(menu_mode); + step_up(menu_item); } void joystick_down(void){ - menu_mode_up(); + menu_item_up(); } void joystick_up(void){ - menu_mode_down(); + menu_item_down(); } void joystick_button(void){ } -void menu_mode_up(void){ - set_changed(menu_mode); // pulisci vecchio - menu_mode++; - if(menu_mode >= menu_item_count) menu_mode = 0; - set_changed(menu_mode); // cursore nel nuovo +void menu_item_up(void){ + set_changed(menu_item); // pulisci vecchio + menu_item++; +// if((items[menu_item].type == TYP_NED) || (items[menu_item].page != menu_page)) menu_item++; + while((items[menu_item].type == TYP_NED) || (items[menu_item].page != menu_page)){ + menu_item++; + if(menu_item >= menu_item_count) menu_item = 0; + } + set_changed(menu_item); // cursore nel nuovo // nome - display_update_mode(); + display_update_item(); } -void menu_mode_down(void){ - set_changed(menu_mode); // pulisci vecchio - menu_mode--; - if(menu_mode >= menu_item_count) menu_mode = menu_item_count - 1; - set_changed(menu_mode); // nuovo - display_update_mode(); +void menu_item_down(void){ + set_changed(menu_item); // pulisci vecchio + menu_item--; + if(menu_item >= menu_item_count) menu_item = menu_item_count - 1; +// if(menu_item >= menu_item_count) menu_item = menu_item_count - 1; + // if((items[menu_item].type == TYP_NED) || (items[menu_item].page != menu_page)) menu_item--; +// if(menu_item >= menu_item_count) menu_item = menu_item_count - 1; + while((items[menu_item].type == TYP_NED) || (items[menu_item].page != menu_page)){ + menu_item--; + if(menu_item >= menu_item_count) menu_item = menu_item_count - 1; + } + + set_changed(menu_item); // nuovo + display_update_item(); } void step_up(uint8_t mode){ @@ -166,47 +203,53 @@ void step_down(uint8_t mode){ } void interface_set_default(void){ - menu_mode = 0; - display_update_mode(); + menu_item = 0; + menu_page = MENU_PAGE_DEFAULT; + menu_last_item[MENU_PAGE_DEFAULT] = 0; + menu_last_item[MENU_PAGE_AUDIO] = 4; + strcpy(tabstring, "TX SET MEM NO"); } void display_set_position(uint8_t row, uint8_t col){ uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[%d,%dz", col, row); } +/* void display_print_string(uint8_t row, uint8_t col, char * string){ display_set_position(row,col); enqueue_tx(string, strlen(string)); } +*/ -void display_draw_dual_bar(char * string, uint8_t value1, uint8_t value2){ - uint8_t cols; - char buf[84]; - for( cols = 0; cols < DISPLAY_Y_SIZE; cols++){ - if(cols < value1) buf[cols] |= 0xF; - if(cols < value2) buf[cols] |= 0xF0; - } - enqueue_tx(buf, DISPLAY_Y_SIZE); -} - -void display_update_mode(void){ +void display_update_item(void){ display_set_position(MENU_NAME_ROW,MENU_NAME_COL); - uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"%d %-12s", menu_mode, items[menu_mode].name); + uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"%d %-12s", menu_item, items[menu_item].name); } void display_update_state(void){ uint8_t var; for(uint8_t item_idx = 0; item_idx < (menu_item_count); item_idx++){ if(get_changed(item_idx)){ - display_set_position(items[item_idx].row,items[item_idx].col); - if(item_idx == menu_mode) uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx, ">"); - else { - uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx, " "); - } - if(items[item_idx].type == TYP_INT) items[item_idx].print_function_ptr(item_idx); -// if(items[item_idx].type == TYP_INT) uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"%0*ld", items[item_idx].size, * items[item_idx].varptr); - // if(items[item_idx].type == TYP_LIST) uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"%*s", items[item_idx].size, &items[item_idx].mapptr[* items[item_idx].varptr]); - // display_draw_bar(14, 4, 0, volume * 2); + if(((items[item_idx].page == menu_page) || (items[item_idx].page == MENU_PAGE_ALL) )&& (items[item_idx].type != TYP_HID)){ + // posizionati + display_set_position(items[item_idx].row,items[item_idx].col); + // setta o meno il > + uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx, items[item_idx].prefix); + if(items[item_idx].type != TYP_NED){ + if(item_idx == menu_item) uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx, ">"); + else { + uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx, " "); + } + } + // stampa valore +// if(items[item_idx].type != TYP_HID) items[item_idx].print_function_ptr(item_idx); + items[item_idx].print_function_ptr(item_idx); + uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx, items[item_idx].suffix); + + // if(items[item_idx].type == TYP_INT) uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"%0*ld", items[item_idx].size, * items[item_idx].varptr); + // if(items[item_idx].type == TYP_LIST) uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"%*s", items[item_idx].size, &items[item_idx].mapptr[* items[item_idx].varptr]); + } + // resetta reset_changed(item_idx); } } @@ -252,6 +295,25 @@ void tab_up(uint8_t tab){ stop_receive(); start_transmit(); break; + case 1: + menu_last_item[menu_page] = menu_item; + menu_page++; + if(menu_page > MENU_PAGE_EOM) menu_page = MENU_PAGE_SOM; + menu_item = menu_last_item[menu_page]; + + state_changed = 0xFFFF; + clear_display(); + display_update_item(); + display_update_state(); + break; + case 2: + encoder_increment(); + click(); + break; + case 3: + encoder_decrement(); + click(); + break; } } @@ -266,35 +328,41 @@ void tab_down(uint8_t tab){ } void display_init(void){ + // https://git.lattuga.net/asdrea/tosta + // caratteri print_bar uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[128,255,0,0,0,0,0c"); uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[129,255,255,0,0,0,0c"); uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[130,255,255,255,0,0,0c"); uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[131,255,255,255,255,0,0c"); uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[132,255,255,255,255,255,0c"); uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[133,255,255,255,255,255,255c"); + uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[%ds",DISPLAY_STANDBY_TIMER); - uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[200,100q"); + uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[150,100q"); uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[%db",DISPLAY_BL_DIM); - uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\a"); - uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\f"); - uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\f"); +// uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\a"); + clear_display(); } // menu prints +void print_dummy(uint8_t item_idx){ +} + void print_integer(uint8_t item_idx){ uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"%*ld", items[item_idx].size, * items[item_idx].varptr); } +void print_string(uint8_t item_idx){ + uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"%*s", items[item_idx].size, items[item_idx].varptr); +} + void print_modulation(uint8_t item_idx){ uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"%*s", items[item_idx].size, modulation_list[*items[item_idx].varptr]); } void print_bar(uint8_t item_idx){ - // uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"%0*ld", items[item_idx].size, * items[item_idx].varptr); - // display_draw_bar(items[item_idx].size, * items[item_idx].varptr); - uint8_t i; - uint8_t cols, cols_tmp; -// cols = *items[item_idx].varptr / (2147483648 / (items[item_idx].size * 6)); + // il range massimo e' items[item_idx].size * 6 + uint8_t i, cols; cols = *items[item_idx].varptr; char buf[items[item_idx].size]; @@ -308,14 +376,15 @@ void print_bar(uint8_t item_idx){ } cols = sat_subu8b(cols, 6); } - enqueue_tx(buf, items[item_idx].size); + uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx, buf); } void print_frequency(uint8_t item_idx){ char bufin[14]; char bufout[14]; - uint8_t i, j; + uint8_t i, j, unformatted_size; j = 0; +// unformatted_size = items[item_idx].size; sprintf(bufin,"%8ld", * items[item_idx].varptr); for(i=0; bufin[i] != '\0'; i++){ if((((strlen(bufin)-i)%3)==0) && (i != 0)) { @@ -333,6 +402,8 @@ void print_frequency(uint8_t item_idx){ uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"%s", bufout); } +// ### + void scan_do(uint8_t scan_state){ static uint8_t scan_timer; frequency += items[0].step * scan_state; @@ -347,5 +418,9 @@ uint8_t sat_subu8b(uint8_t x, uint8_t y){ } void click(void){ - uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[600,10q"); + uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[600,5q"); +} + +void clear_display(void){ + uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\f"); } diff --git a/codice/Core/Src/main.c b/codice/Core/Src/main.c index 8d93c07..b957adc 100644 --- a/codice/Core/Src/main.c +++ b/codice/Core/Src/main.c @@ -25,6 +25,7 @@ #include #include "bassofono.h" #include "interface.h" +#include "si5351.h" /* USER CODE END Includes */ @@ -52,6 +53,8 @@ DAC_HandleTypeDef hdac1; DMA_HandleTypeDef hdma_dac1_ch1; DMA_HandleTypeDef hdma_dac1_ch2; +I2C_HandleTypeDef hi2c1; + OPAMP_HandleTypeDef hopamp1; TIM_HandleTypeDef htim6; @@ -64,6 +67,7 @@ DMA_HandleTypeDef hdma_usart1_tx; /* USER CODE BEGIN PV */ volatile uint8_t tick; +uint16_t tick_timer; // RX volatile uint8_t rx_adc_buffer_ready, half_rx_dac_buffer_empty; @@ -85,6 +89,7 @@ static void MX_CORDIC_Init(void); static void MX_USART1_UART_Init(void); static void MX_TIM8_Init(void); static void MX_OPAMP1_Init(void); +static void MX_I2C1_Init(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ @@ -94,6 +99,19 @@ static void MX_OPAMP1_Init(void); // IRQ +// EXTI Line9 External Interrupt ISR Handler CallBackFun +void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ + if(GPIO_Pin == GPIO_PIN_11){ +/* + if(HAL_GPIO_ReadPin(PTT_GPIO_Port, PTT_Pin)){ + enqueue_cmd(BT1P); + } else { + enqueue_cmd(BT1R); + } + */ + } +} + // ADC void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){ @@ -122,13 +140,13 @@ void HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef* hdac) { // tx void HAL_DACEx_ConvHalfCpltCallbackCh2(DAC_HandleTypeDef* hdac) { - HAL_GPIO_TogglePin(OUT_GPIO_Port, OUT_Pin); +// HAL_GPIO_TogglePin(OUT_GPIO_Port, OUT_Pin); tx_dac_buffer_toggle = 0; half_tx_dac_buffer_empty = 1; } void HAL_DACEx_ConvCpltCallbackCh2(DAC_HandleTypeDef* hdac) { - HAL_GPIO_TogglePin(OUT_GPIO_Port, OUT_Pin); +// HAL_GPIO_TogglePin(OUT_GPIO_Port, OUT_Pin); tx_dac_buffer_toggle = 1; half_tx_dac_buffer_empty = 1; } @@ -197,21 +215,34 @@ void start_transmit(void){ // ADC // HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_BUFFER_SIZE); - // DAC - HAL_TIM_Base_Start(&htim8); - HAL_DAC_Start(&hdac1,DAC_CHANNEL_2); - HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_2, tx_dac_buffer, (TX_DAC_BUFFER_SIZE * 2), DAC_ALIGN_12B_R); + if(TX_TYPE == TX_TYPE_DAC){ + // DAC + HAL_TIM_Base_Start(&htim8); + HAL_DAC_Start(&hdac1,DAC_CHANNEL_2); + HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_2, tx_dac_buffer, (TX_DAC_BUFFER_SIZE * 2), DAC_ALIGN_12B_R); + } else if(TX_TYPE == TX_TYPE_PWM){ +// HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_3); +// HAL_TIM_Base_Start(&htim4); + } else if(TX_TYPE == TX_TYPE_SI5351){ + si5351_on(); + } } void stop_transmit(void){ transmit = 0; // ADC // HAL_ADC_Stop_DMA(&hadc1); - - // DAC - HAL_TIM_Base_Stop(&htim8); - HAL_DAC_Stop(&hdac1,DAC_CHANNEL_2); - HAL_DAC_Stop_DMA(&hdac1, DAC_CHANNEL_2); + if(TX_TYPE == TX_TYPE_DAC){ + // DAC + HAL_TIM_Base_Stop(&htim8); + HAL_DAC_Stop(&hdac1,DAC_CHANNEL_2); + HAL_DAC_Stop_DMA(&hdac1, DAC_CHANNEL_2); + } else if(TX_TYPE == TX_TYPE_PWM){ +// HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_3); +// HAL_TIM_Base_Stop(&htim4); + } else if(TX_TYPE == TX_TYPE_SI5351){ + si5351_off(); + } } void start_receive(void){ @@ -277,11 +308,6 @@ int main(void) { /* USER CODE BEGIN 1 */ state_changed = 0; - display_init(); - state_set_default(); - interface_set_default(); - display_update_mode(); - display_update_state(); /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ @@ -311,7 +337,19 @@ int main(void) MX_USART1_UART_Init(); MX_TIM8_Init(); MX_OPAMP1_Init(); + MX_I2C1_Init(); /* USER CODE BEGIN 2 */ + + HAL_Delay(10); + + display_init(); + state_set_default(); + interface_set_default(); + + // inutili + display_update_item(); +// display_update_state(); + st2_filter_init(); audio_filter_init(); // diag(); @@ -321,6 +359,12 @@ int main(void) HAL_UART_Receive_IT(&huart1, uart_rx_buf, 1); // HAL_UART_Receive_IT(&huart2, uart_rx_buf, 1); + if(TX_TYPE == TX_TYPE_SI5351){ + // rooto! + si53531_initialize(); + } + + start_receive(); /* USER CODE END 2 */ @@ -330,25 +374,30 @@ int main(void) /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ + HAL_GPIO_TogglePin(OUT_GPIO_Port, OUT_Pin); +// receive = transmit = 0; if(receive){ if(rx_adc_buffer_ready){ - HAL_GPIO_WritePin(OUT_GPIO_Port, OUT_Pin, SET); - rx_mixer(adc_buffer, ADC_BUFFER_SIZE, if_I, if_Q, nco1_increment); - HAL_GPIO_WritePin(OUT_GPIO_Port, OUT_Pin, RESET); +// HAL_GPIO_WritePin(OUT_GPIO_Port, OUT_Pin, SET); + rx_mixer(adc_buffer, ADC_BUFFER_SIZE, if_I, if_Q, rx_nco1_increment); +// HAL_GPIO_WritePin(OUT_GPIO_Port, OUT_Pin, RESET); rx_adc_buffer_ready = 0; } if(half_rx_dac_buffer_empty){ + // HAL_GPIO_WritePin(OUT_GPIO_Port, OUT_Pin, SET); if (modulation == MOD_DC) dc_demodulator(if_I, LF_BUFFER_SIZE, prefilter_lf_buffer); else if(modulation == MOD_LSB || modulation == MOD_USB) ssb_demodulator(if_I, if_Q, LF_BUFFER_SIZE, prefilter_lf_buffer, NCO2_INCREMENT); else if (modulation == MOD_AM) am_demodulator(if_I, if_Q, LF_BUFFER_SIZE, prefilter_lf_buffer); arm_fir_q31(&audio_filter_struct, prefilter_lf_buffer, lf_buffer[lf_buffer_toggle], AUDIO_FILTER_BLOCK_SIZE); +// arm_fir_q31(&audio_filter_struct, prefilter_lf_buffer, lf_buffer_test[lf_buffer_toggle], AUDIO_FILTER_BLOCK_SIZE); + // HAL_GPIO_WritePin(OUT_GPIO_Port, OUT_Pin, RESET); half_rx_dac_buffer_empty = 0; } } if (transmit){ if(half_tx_dac_buffer_empty){ // HAL_GPIO_WritePin(OUT_GPIO_Port, OUT_Pin, SET); - tx_mixer(tx_dac_buffer[tx_dac_buffer_toggle], TX_DAC_BUFFER_SIZE, if_I, if_Q, nco1_increment); + tx_mixer(tx_dac_buffer[tx_dac_buffer_toggle], TX_DAC_BUFFER_SIZE, if_I, if_Q, tx_nco1_increment); half_tx_dac_buffer_empty = 0; // HAL_GPIO_WritePin(OUT_GPIO_Port, OUT_Pin, RESET); } @@ -359,27 +408,46 @@ int main(void) } } if(tick){ - if(receive){ - // TODO - rx_measure_signal(if_I, LF_BUFFER_SIZE); - } - // HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin); + // consuma coda comandi while(rx_cmd_rb_in_idx != rx_cmd_rb_out_idx) dequeue_cmd(); + + // applica cambiamenti display if(state_changed) display_update_state(); if(uart_tx_buf_in_idx){ display_write(uart_tx_buf, uart_tx_buf_in_idx); uart_tx_buf_in_idx = 0; } - if(peak){ - if(peakset == 0) click(); - peakset = 50; - peak = 0; - } - if(peakset){ - peakset--; - if(peakset == 0) click(); + + tick_timer++; + // eventi lenti + if(tick_timer % 8 == 0){ + if(receive){ + if(peak){ + if(peakset == 0) click(); + peakset = 50; + peak = 0; + } + if(peakset){ + peakset--; + if(peakset == 0) click(); + } + + rx_signal = measure_log_abs_mean(if_I, LF_BUFFER_SIZE) * RX_SMETER_SCALE; + if(rx_signal != s_meter){ + s_meter = rx_signal; + set_changed(7); + } + } + if(transmit){ + tx_signal = 78; + if(tx_signal != s_meter){ + s_meter = tx_signal; + set_changed(7); + } + } } + tick = 0; } } @@ -394,7 +462,6 @@ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; - RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; /** Configure the main internal regulator output voltage */ @@ -428,15 +495,7 @@ void SystemClock_Config(void) { Error_Handler(); } - /** Initializes the peripherals clocks - */ - PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_ADC12; - PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2; - PeriphClkInit.Adc12ClockSelection = RCC_ADC12CLKSOURCE_SYSCLK; - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) - { - Error_Handler(); - } + HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1); } /** @@ -608,6 +667,52 @@ static void MX_DAC1_Init(void) } +/** + * @brief I2C1 Initialization Function + * @param None + * @retval None + */ +static void MX_I2C1_Init(void) +{ + + /* USER CODE BEGIN I2C1_Init 0 */ + + /* USER CODE END I2C1_Init 0 */ + + /* USER CODE BEGIN I2C1_Init 1 */ + + /* USER CODE END I2C1_Init 1 */ + hi2c1.Instance = I2C1; + hi2c1.Init.Timing = 0x60505F8C; + hi2c1.Init.OwnAddress1 = 0; + hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + hi2c1.Init.OwnAddress2 = 0; + hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK; + hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + if (HAL_I2C_Init(&hi2c1) != HAL_OK) + { + Error_Handler(); + } + /** Configure Analogue filter + */ + if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK) + { + Error_Handler(); + } + /** Configure Digital filter + */ + if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN I2C1_Init 2 */ + + /* USER CODE END I2C1_Init 2 */ + +} + /** * @brief OPAMP1 Initialization Function * @param None @@ -856,11 +961,25 @@ static void MX_GPIO_Init(void) /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(OUT_GPIO_Port, OUT_Pin, GPIO_PIN_RESET); + /*Configure GPIO pins : NC1_Pin NC2_Pin */ + GPIO_InitStruct.Pin = NC1_Pin|NC2_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_PULLDOWN; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /*Configure GPIO pin : PA8 */ + GPIO_InitStruct.Pin = GPIO_PIN_8; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF0_MCO; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + /*Configure GPIO pin : OUT_Pin */ GPIO_InitStruct.Pin = OUT_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM; HAL_GPIO_Init(OUT_GPIO_Port, &GPIO_InitStruct); } @@ -901,4 +1020,3 @@ void assert_failed(uint8_t *file, uint32_t line) } #endif /* USE_FULL_ASSERT */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/codice/Core/Src/rx.c b/codice/Core/Src/rx.c index 933e1ca..ca22988 100644 --- a/codice/Core/Src/rx.c +++ b/codice/Core/Src/rx.c @@ -6,7 +6,9 @@ #include "bassofono.h" #include "rx.h" -int32_t rx_signal; +q31_t rx_nco1_increment; + +uint8_t rx_signal, rx_signal_last; // filtro 2 arm_fir_decimate_instance_q31 st2_filter_I_struct; @@ -258,15 +260,3 @@ void audio_filter_generate_coeffs(int32_t *Coeffs, uint32_t freq, uint32_t bw, u Coeffs[index] = (int32_t) ( (double)(FPCoeff[index])*(double)0x7FFFFFFF ); } } - -void rx_measure_signal(q31_t *samples, uint16_t size){ - static int32_t old_rx_signal; - uint32_t index; - arm_max_q31(samples, size, &old_rx_signal, &index); - old_rx_signal >>= 10; - if(old_rx_signal != rx_signal) { - rx_signal = old_rx_signal; - // rx_signal = 45; - set_changed(8); - } -} diff --git a/codice/Core/Src/si5351.c b/codice/Core/Src/si5351.c new file mode 100644 index 0000000..2425d53 --- /dev/null +++ b/codice/Core/Src/si5351.c @@ -0,0 +1,173 @@ +#include "main.h" +#include "stm32g4xx_hal.h" +#include +#include "si5351.h" + +void si5351_write8 (uint8_t reg, uint8_t value){ + while (HAL_I2C_IsDeviceReady(&hi2c1, (uint16_t)(SI5351_ADDRESS<<1), 3, 100) != HAL_OK) { } + HAL_I2C_Mem_Write(&hi2c1, (uint8_t)(SI5351_ADDRESS<<1), (uint8_t)reg, I2C_MEMADD_SIZE_8BIT, (uint8_t*)(&value), 1, 100); +} + +uint8_t si5351_read8(uint8_t reg, uint8_t *value){ + HAL_StatusTypeDef status = HAL_OK; + while (HAL_I2C_IsDeviceReady(&hi2c1, (uint16_t)(SI5351_ADDRESS<<1), 3, 100) != HAL_OK) { } + status = HAL_I2C_Mem_Read(&hi2c1, // i2c handle + (uint8_t)(SI5351_ADDRESS<<1), // i2c address, left aligned + (uint8_t)reg, // register address + I2C_MEMADD_SIZE_8BIT, // si5351 uses 8bit register addresses + (uint8_t*)(&value), // write returned data to this variable + 1, // how many bytes to expect returned + 100); // timeout + + return status; +} + + +void CalcRegisters(uint32_t fout, uint8_t *regs){ + uint32_t fref = SI5351_CRYSTAL_FREQ; // The reference frequency + + // Calc Output Multisynth Divider and R with e = 0 and f = 1 => msx_p2 = 0 and msx_p3 = 1 + uint32_t d = 4; + uint32_t msx_p1 = 0; // If fout > 150 MHz then MSx_P1 = 0 and MSx_DIVBY4 = 0xC0, see datasheet 4.1.3 + int msx_divby4 = 0; + int rx_div = 0; + int r = 1; + + if (fout > 150e6) + msx_divby4 = 0x0C; // MSx_DIVBY4[1:0] = 0b11, see datasheet 4.1.3 + else if (fout < 292969UL) // If fout < 500 kHz then use R divider, see datasheet 4.2.2. In reality this means > 292 968,75 Hz when d = 2048 + { + int rd = 0; + while ((r < 128) && (r * fout < 292969UL)) + { + r <<= 1; + rd++; + } + rx_div = rd << 4; + + d = 600e6 / (r * fout); // Use lowest VCO frequency but handle d minimum + if (d % 2) // Make d even to reduce spurious and phase noise/jitter, see datasheet 4.1.2.1. + d++; + + if (d * r * fout < 600e6) // VCO frequency to low check and maintain an even d value + d += 2; + } + else // 292968 Hz <= fout <= 150 MHz + { + d = 600e6 / fout; // Use lowest VCO frequency but handle d minimum + if (d < 6) + d = 6; + else if (d % 2) // Make d even to reduce phase noise/jitter, see datasheet 4.1.2.1. + d++; + + if (d * fout < 600e6) // VCO frequency to low check and maintain an even d value + d += 2; + } + msx_p1 = 128 * d - 512; + + uint32_t fvco = (uint32_t) d * r * fout; + + // Calc Feedback Multisynth Divider + double fmd = (double)fvco / fref; // The FMD value has been found + int a = fmd; // a is the integer part of the FMD value + + double b_c = (double)fmd - a; // Get b/c + uint32_t c = 1048575UL; + uint32_t b = (double)b_c * c; + if (b > 0) + { + c = (double)b / b_c + 0.5; // Improves frequency precision in some cases + if (c > 1048575UL) + c = 1048575UL; + } + + uint32_t msnx_p1 = 128 * a + 128 * b / c - 512; // See datasheet 3.2 + uint32_t msnx_p2 = 128 * b - c * (128 * b / c); + uint32_t msnx_p3 = c; + + // Feedback Multisynth Divider registers + regs[0] = (msnx_p3 >> 8) & 0xFF; + regs[1] = msnx_p3 & 0xFF; + regs[2] = (msnx_p1 >> 16) & 0x03; + regs[3] = (msnx_p1 >> 8) & 0xFF; + regs[4] = msnx_p1 & 0xFF; + regs[5] = ((msnx_p3 >> 12) & 0xF0) + ((msnx_p2 >> 16) & 0x0F); + regs[6] = (msnx_p2 >> 8) & 0xFF; + regs[7] = msnx_p2 & 0xFF; + + // Output Multisynth Divider registers + regs[8] = 0; // (msx_p3 >> 8) & 0xFF + regs[9] = 1; // msx_p3 & 0xFF + regs[10] = rx_div + msx_divby4 + ((msx_p1 >> 16) & 0x03); + regs[11] = (msx_p1 >> 8) & 0xFF; + regs[12] = msx_p1 & 0xFF; + regs[13] = 0; // ((msx_p3 >> 12) & 0xF0) + (msx_p2 >> 16) & 0x0F + regs[14] = 0; // (msx_p2 >> 8) & 0xFF + regs[15] = 0; // msx_p2 & 0xFF + +// HAL_I2C_Master_Transmit(&hi2c2, Si5351_ConfigStruct->HW_I2C_Address, reg_data, sizeof(reg_data), HAL_MAX_DELAY); + return; +} + +void si53531_initialize(){ + uint8_t dummy; + // Initialize Si5351A + while (si5351_read8(0,dummy) & 0x80); // Wait for Si5351A to initialize + si5351_write8(SI5351_OUT_ENABLE, 0xFF); // Output Enable Control, disable all + +// for (int i = 16; i < 24; i++) si5351_write8 (i, 0x80); // CLKi Control, power down CLKi + + si5351_write8(SI5351_INPUT_SOURCE, 0x00); // PLL Input Source, select the XTAL input as the reference clock for PLLA and PLLB + si5351_write8(SI5351_OUT_DIS_STATE, 0x00); + + // Output Multisynth0, e = 0, f = 1, MS0_P2 and MSO_P3 + si5351_write8(SI5351_MULTISYNTH0, 0x00); + si5351_write8(SI5351_MULTISYNTH0+1, 0x01); + si5351_write8(SI5351_MULTISYNTH0+5, 0x00); + si5351_write8(SI5351_MULTISYNTH0+6, 0x00); + si5351_write8(SI5351_MULTISYNTH0+7, 0x00); + + si5351_write8(SI5351_MULTISYNTH1, 0x00); + si5351_write8(SI5351_MULTISYNTH1+1, 0x01); + si5351_write8(SI5351_MULTISYNTH1+5, 0x00); + si5351_write8(SI5351_MULTISYNTH1+6, 0x00); + si5351_write8(SI5351_MULTISYNTH1+7, 0x00); + + si5351_write8(SI5351_CLK0_CONTROL, 0x4F); // Power up CLKx, PLLA, MS0 operates in integer mode, Output Clock 0 is not inverted, Select MultiSynth 0 as the source for CLK0 and 8 mA + si5351_write8(SI5351_CLK1_CONTROL, 0x5F); // Power up CLKx, PLLA, MS0 operates in integer mode, Output Clock 0 is not inverted, Select MultiSynth 0 as the source for CLK0 and 8 mA + si5351_write8(SI5351_CLK2_CONTROL, 0x80); // Power down CLKx + + // Reference load configuration + si5351_write8(SI5351_CRYSTAL_LOAD, 0x12); // Set reference load C: 6 pF = 0x12, 8 pF = 0x92, 10 pF = 0xD2 + + // Turn CLK0 output on +// si5351_write8(SI5351_OUT_ENABLE, 0xFC); // Output Enable Control. Active low +} + +void si53531_set_frequency(uint32_t freq){ + uint8_t regs[16]; + CalcRegisters(freq, regs); + + // Load PLLA Feedback Multisynth NA + for (int i = 0; i < 8; i++) + si5351_write8(SI5351_PLLA + i, regs[i]); + + // Load Output Multisynth0 with d (e and f already set during init. and never changed) + for (int i = 10; i < 13; i++) + si5351_write8(34 + i, regs[i]); + + for (int i = 10; i < 13; i++) + si5351_write8(42 + i, regs[i]); + + // Reset PLLA + // delayMicroseconds(500); // Allow registers to settle before resetting the PLL + si5351_write8(SI5351_RESET, 0x20); +} + +void si5351_off(void){ + si5351_write8(SI5351_OUT_ENABLE, 0xFF); +} + +void si5351_on(void){ + si5351_write8(SI5351_OUT_ENABLE, 0xFC); +} diff --git a/codice/Core/Src/stm32g4xx_hal_msp.c b/codice/Core/Src/stm32g4xx_hal_msp.c index 0d55820..ab0274c 100644 --- a/codice/Core/Src/stm32g4xx_hal_msp.c +++ b/codice/Core/Src/stm32g4xx_hal_msp.c @@ -96,11 +96,21 @@ void HAL_MspInit(void) */ void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) { + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; if(hadc->Instance==ADC1) { /* USER CODE BEGIN ADC1_MspInit 0 */ /* USER CODE END ADC1_MspInit 0 */ + /** Initializes the peripherals clocks + */ + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC12; + PeriphClkInit.Adc12ClockSelection = RCC_ADC12CLKSOURCE_SYSCLK; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } + /* Peripheral clock enable */ __HAL_RCC_ADC12_CLK_ENABLE(); @@ -305,6 +315,82 @@ void HAL_DAC_MspDeInit(DAC_HandleTypeDef* hdac) } +/** +* @brief I2C MSP Initialization +* This function configures the hardware resources used in this example +* @param hi2c: I2C handle pointer +* @retval None +*/ +void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + if(hi2c->Instance==I2C1) + { + /* USER CODE BEGIN I2C1_MspInit 0 */ + + /* USER CODE END I2C1_MspInit 0 */ + /** Initializes the peripherals clocks + */ + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_I2C1; + PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_PCLK1; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**I2C1 GPIO Configuration + PB7 ------> I2C1_SDA + PB8-BOOT0 ------> I2C1_SCL + */ + GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* Peripheral clock enable */ + __HAL_RCC_I2C1_CLK_ENABLE(); + /* USER CODE BEGIN I2C1_MspInit 1 */ + + /* USER CODE END I2C1_MspInit 1 */ + } + +} + +/** +* @brief I2C MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hi2c: I2C handle pointer +* @retval None +*/ +void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c) +{ + if(hi2c->Instance==I2C1) + { + /* USER CODE BEGIN I2C1_MspDeInit 0 */ + + /* USER CODE END I2C1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_I2C1_CLK_DISABLE(); + + /**I2C1 GPIO Configuration + PB7 ------> I2C1_SDA + PB8-BOOT0 ------> I2C1_SCL + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7); + + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_8); + + /* USER CODE BEGIN I2C1_MspDeInit 1 */ + + /* USER CODE END I2C1_MspDeInit 1 */ + } + +} + /** * @brief OPAMP MSP Initialization * This function configures the hardware resources used in this example @@ -467,11 +553,21 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) void HAL_UART_MspInit(UART_HandleTypeDef* huart) { GPIO_InitTypeDef GPIO_InitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; if(huart->Instance==USART1) { /* USER CODE BEGIN USART1_MspInit 0 */ /* USER CODE END USART1_MspInit 0 */ + /** Initializes the peripherals clocks + */ + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1; + PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } + /* Peripheral clock enable */ __HAL_RCC_USART1_CLK_ENABLE(); @@ -553,4 +649,3 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) /* USER CODE END 1 */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/codice/Core/Src/stm32g4xx_it.c b/codice/Core/Src/stm32g4xx_it.c index 6246610..b50cc44 100644 --- a/codice/Core/Src/stm32g4xx_it.c +++ b/codice/Core/Src/stm32g4xx_it.c @@ -306,4 +306,4 @@ void TIM7_IRQHandler(void) /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/codice/Core/Src/tx.c b/codice/Core/Src/tx.c index a26f766..87ec8fa 100644 --- a/codice/Core/Src/tx.c +++ b/codice/Core/Src/tx.c @@ -5,6 +5,9 @@ #include "bassofono.h" #include "tx.h" +q31_t tx_nco1_increment; +uint8_t tx_signal, tx_signal_last; + volatile uint8_t half_tx_dac_buffer_empty, tx_dac_buffer_toggle; volatile uint8_t tx_adc_buffer_ready;