aggiunto oscillatore

This commit is contained in:
nzasch
2021-12-31 04:22:22 +01:00
parent 36ef31c453
commit 9306bc9852
16 changed files with 743 additions and 240 deletions

View File

@@ -1,10 +1,25 @@
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <arm_math.h> // #include <arm_math.h>
#include "main.h" #include "main.h"
#include "rx.h" #include "rx.h"
#include "tx.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) #define CLOCK (168000000UL)
// RX ADC // RX ADC
@@ -19,67 +34,15 @@
#define TX_DAC_BUFFER_SIZE (1024) #define TX_DAC_BUFFER_SIZE (1024)
#define TX_DAC_BUFFER_RATE (TX_DAC_SAMPLE_RATE/TX_DAC_BUFFER_SIZE) #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_DC 0
#define MOD_LSB 1 #define MOD_LSB 1
#define MOD_USB 2 #define MOD_USB 2
#define MOD_AM 3 #define MOD_AM 3
#define STATUS_RX 0
#define STATUS_TX 1
#define STATUS_SQ 2
// === DAC === // === DAC ===
#define DAC_DIVISOR 7680 #define DAC_DIVISOR 7680
#define DAC_SAMPLE_RATE (CLOCK/DAC_DIVISOR) #define DAC_SAMPLE_RATE (CLOCK/DAC_DIVISOR)
@@ -96,6 +59,8 @@
extern uint8_t receive, transmit; extern uint8_t receive, transmit;
extern q31_t nco1_increment; extern q31_t nco1_increment;
extern uint32_t frequency; extern uint32_t frequency;
extern int32_t rit;
extern uint16_t pwm_tx_period;
extern int32_t modulation; extern int32_t modulation;
extern int32_t gain; extern int32_t gain;
extern int32_t peak, oldpeak, peakset; extern int32_t peak, oldpeak, peakset;
@@ -105,9 +70,11 @@ extern int32_t mic_gain;
extern int32_t scan; extern int32_t scan;
extern uint32_t audio_filter_freq, audio_filter_bw, audio_filter_beta; extern uint32_t audio_filter_freq, audio_filter_bw, audio_filter_beta;
extern uint16_t state_changed; extern uint16_t state_changed;
extern char tabstring[15];
extern CORDIC_HandleTypeDef hcordic; extern CORDIC_HandleTypeDef hcordic;
extern uint8_t s_meter;
// uartz // uartz
extern char uart_rx_buf[2], rx_cmd_rb[RX_CMD_RB_SIZE]; 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; 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 uint8_t lf_buffer_toggle;
extern q31_t prefilter_lf_buffer[LF_BUFFER_SIZE]; extern q31_t prefilter_lf_buffer[LF_BUFFER_SIZE];
extern q31_t lf_buffer[2][LF_BUFFER_SIZE]; extern q31_t lf_buffer[2][LF_BUFFER_SIZE];
// extern q31_t lf_buffer_test[2][LF_BUFFER_SIZE];
// ======== FUNZIONI ======== // ======== FUNZIONI ========
@@ -147,3 +115,8 @@ q31_t sat_mult_q31(q31_t a, q31_t b);
// diag // diag
void diag(void); 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);

View File

@@ -31,30 +31,22 @@
#define TYP_FLOAT 1 #define TYP_FLOAT 1
#define TYP_ALPHA 2 #define TYP_ALPHA 2
#define TYP_LIST 3 #define TYP_LIST 3
#define TYP_NED 4
#define TYP_HID 5
/* #define MENU_PAGE_SOM 0
#define MOD_DC 0 #define MENU_PAGE_DEFAULT 0
#define MOD_LSB 1 #define MENU_PAGE_AUDIO 1
#define MOD_USB 2 #define MENU_PAGE_EOM 1
#define MOD_AM 3
*/ #define MENU_PAGE_MEM 2
#define MENU_PAGE_ALL 255
#define SAT 0 #define SAT 0
#define WRAP 1 #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_ROW 0
#define MENU_NAME_COL 1 #define MENU_NAME_COL 0
#define DISPLAY_BL_DIM 0 #define DISPLAY_BL_DIM 0
#define DISPLAY_ROWS 6 #define DISPLAY_ROWS 6
@@ -70,6 +62,7 @@ typedef void (*menu_set_function)(void);
typedef void (*menu_print_function)(uint8_t a); typedef void (*menu_print_function)(uint8_t a);
struct menu_item { struct menu_item {
uint8_t page;
char name[14]; char name[14];
uint8_t type; uint8_t type;
uint8_t size; uint8_t size;
@@ -79,19 +72,24 @@ struct menu_item {
uint32_t min; uint32_t min;
uint32_t max; uint32_t max;
uint8_t wrap; uint8_t wrap;
char prefix[4];
char suffix[4];
uint32_t *varptr; uint32_t *varptr;
menu_set_function set_function_ptr; menu_set_function set_function_ptr;
menu_print_function print_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 modulation_list[4][4];
extern char status_list[3][3];
extern struct menu_item items[]; extern struct menu_item items[];
extern struct menu_item tabs[]; // extern struct menu_item tabs[];
extern uint8_t menu_item_count; extern uint8_t menu_item_count;
extern uint8_t tabs_count; // extern uint8_t tabs_count;
// funcs // funcs
@@ -99,9 +97,10 @@ void encoder_increment(void);
void encoder_decrement(void); void encoder_decrement(void);
void joystick_dx(void); void joystick_dx(void);
void joystick_sx(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_integer(uint8_t item_idx);
void print_string(uint8_t item_idx);
void print_modulation(uint8_t item_idx); void print_modulation(uint8_t item_idx);
void print_bar(uint8_t item_idx); void print_bar(uint8_t item_idx);
void print_frequency(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); char * valToStr(uint32_t val, char *buf, uint8_t bufSize, char sepChar);
uint8_t sat_subu8b(uint8_t x, uint8_t y); uint8_t sat_subu8b(uint8_t x, uint8_t y);
void menu_item_up(void);
void menu_item_down(void);

View File

@@ -59,14 +59,16 @@ void set_gain(void);
/* USER CODE END EFP */ /* USER CODE END EFP */
/* Private defines -----------------------------------------------------------*/ /* 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_Pin GPIO_PIN_13
#define T_SWDIO_GPIO_Port GPIOA #define T_SWDIO_GPIO_Port GPIOA
#define T_SWCLK_Pin GPIO_PIN_14 #define T_SWCLK_Pin GPIO_PIN_14
#define T_SWCLK_GPIO_Port GPIOA #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 BEGIN Private defines */
/* USER CODE END Private defines */ /* USER CODE END Private defines */
@@ -76,5 +78,3 @@ void set_gain(void);
#endif #endif
#endif /* __MAIN_H */ #endif /* __MAIN_H */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

View File

@@ -6,7 +6,6 @@
#define NCO2_INCREMENT (343597383L) #define NCO2_INCREMENT (343597383L)
#define NCO2_FREQUENCY (DAC_SAMPLE_RATE/((0xFFFFFFFF)/NCO2_INCREMENT)) #define NCO2_FREQUENCY (DAC_SAMPLE_RATE/((0xFFFFFFFF)/NCO2_INCREMENT))
#define LF_BUFFER_SIZE (ST2_BUFFER_SIZE/ST2_DECIMATION_FACTOR)
// 1° stadio // 1° stadio
// decimazione del singolo stadio // decimazione del singolo stadio
@@ -28,16 +27,21 @@
#define ST2_FILTER_BLOCK_SIZE (ST2_BUFFER_SIZE) #define ST2_FILTER_BLOCK_SIZE (ST2_BUFFER_SIZE)
#define ST2_FILTER_TAP_NUM (128) #define ST2_FILTER_TAP_NUM (128)
#define LF_BUFFER_SIZE (ST2_BUFFER_SIZE/ST2_DECIMATION_FACTOR)
// audio filter // audio filter
#define AUDIO_FILTER_TAP_NUM 128 #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_FREQ_MAX (DAC_SAMPLE_RATE/2)
#define AUDIO_FILTER_BW_DEF (2000) #define AUDIO_FILTER_BW_DEF (2000)
#define AUDIO_FILTER_BW_MAX (DAC_SAMPLE_RATE/2) #define AUDIO_FILTER_BW_MAX (DAC_SAMPLE_RATE/2)
#define AUDIO_FILTER_BETA_DEF (16) #define AUDIO_FILTER_BETA_DEF (16)
#define AUDIO_FILTER_BLOCK_SIZE LF_BUFFER_SIZE #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 // filtro st2
extern arm_fir_decimate_instance_q31 st2_filter_I_struct; 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); 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); 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 #endif

27
codice/Core/Inc/si5351.h Normal file
View File

@@ -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;

View File

@@ -1,3 +1,4 @@
/* USER CODE BEGIN Header */
/** /**
****************************************************************************** ******************************************************************************
* @file stm32g4xx_hal_conf.h * @file stm32g4xx_hal_conf.h
@@ -6,16 +7,16 @@
****************************************************************************** ******************************************************************************
* @attention * @attention
* *
* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics. * Copyright (c) 2019 STMicroelectronics.
* All rights reserved.</center></h2> * All rights reserved.
* *
* This software component is licensed by ST under BSD 3-Clause license, * This software is licensed under terms that can be found in the LICENSE file
* the "License"; You may not use this file except in compliance with the * in the root directory of this software component.
* License. You may obtain a copy of the License at: * If no LICENSE file comes with this software, it is provided AS-IS.
* opensource.org/licenses/BSD-3-Clause
* *
****************************************************************************** ******************************************************************************
*/ */
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/ /* Define to prevent recursive inclusion -------------------------------------*/
#ifndef STM32G4xx_HAL_CONF_H #ifndef STM32G4xx_HAL_CONF_H
@@ -46,7 +47,7 @@
/*#define HAL_HRTIM_MODULE_ENABLED */ /*#define HAL_HRTIM_MODULE_ENABLED */
/*#define HAL_IRDA_MODULE_ENABLED */ /*#define HAL_IRDA_MODULE_ENABLED */
/*#define HAL_IWDG_MODULE_ENABLED */ /*#define HAL_IWDG_MODULE_ENABLED */
/*#define HAL_I2C_MODULE_ENABLED */ #define HAL_I2C_MODULE_ENABLED
/*#define HAL_I2S_MODULE_ENABLED */ /*#define HAL_I2S_MODULE_ENABLED */
/*#define HAL_LPTIM_MODULE_ENABLED */ /*#define HAL_LPTIM_MODULE_ENABLED */
/*#define HAL_NAND_MODULE_ENABLED */ /*#define HAL_NAND_MODULE_ENABLED */
@@ -377,5 +378,3 @@ void assert_failed(uint8_t *file, uint32_t line);
#endif #endif
#endif /* STM32G4xx_HAL_CONF_H */ #endif /* STM32G4xx_HAL_CONF_H */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

View File

@@ -72,5 +72,3 @@ void TIM7_IRQHandler(void);
#endif #endif
#endif /* __STM32G4xx_IT_H */ #endif /* __STM32G4xx_IT_H */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

View File

@@ -8,6 +8,9 @@
#define TX_AUDIO_FILTER_BLOCK_SIZE (1024) #define TX_AUDIO_FILTER_BLOCK_SIZE (1024)
#define TX_AUDIO_FILTER_TAP_NUM (128) #define TX_AUDIO_FILTER_TAP_NUM (128)
extern uint8_t tx_signal, tx_signal_last;
extern q31_t tx_nco1_increment;
// buffer // buffer
extern volatile uint8_t half_tx_dac_buffer_empty, tx_dac_buffer_toggle; extern volatile uint8_t half_tx_dac_buffer_empty, tx_dac_buffer_toggle;
extern volatile uint8_t tx_adc_buffer_ready; extern volatile uint8_t tx_adc_buffer_ready;

View File

@@ -13,6 +13,7 @@
#include "tx.h" #include "tx.h"
#include "rx.h" #include "rx.h"
#include "interface.h" #include "interface.h"
#include "si5351.h"
#include "main.h" #include "main.h"
#include "FIRFilterCode.h" #include "FIRFilterCode.h"
#include <arm_math.h> #include <arm_math.h>
@@ -33,6 +34,8 @@
// state // state
uint8_t receive, transmit; uint8_t receive, transmit;
uint32_t frequency; uint32_t frequency;
int32_t rit;
uint16_t pwm_tx_period;
int32_t modulation; int32_t modulation;
int32_t gain; int32_t gain;
int32_t peak, oldpeak, peakset; int32_t peak, oldpeak, peakset;
@@ -42,6 +45,8 @@ int32_t mic_gain;
int32_t scan; int32_t scan;
q31_t nco1_increment; q31_t nco1_increment;
uint32_t audio_filter_freq, audio_filter_bw, audio_filter_beta; uint32_t audio_filter_freq, audio_filter_bw, audio_filter_beta;
char tabstring[15];
uint8_t s_meter;
// maschera, ogni bit uno stato // maschera, ogni bit uno stato
uint16_t state_changed; uint16_t state_changed;
@@ -64,9 +69,10 @@ q31_t if_Q[LF_BUFFER_SIZE];
uint8_t lf_buffer_toggle; uint8_t lf_buffer_toggle;
q31_t prefilter_lf_buffer[LF_BUFFER_SIZE]; q31_t prefilter_lf_buffer[LF_BUFFER_SIZE];
q31_t lf_buffer[2][LF_BUFFER_SIZE]; q31_t lf_buffer[2][LF_BUFFER_SIZE];
// q31_t lf_buffer_test[2][LF_BUFFER_SIZE];
// TX // 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]; 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); ringbuf_increment(&rx_cmd_rb_out_idx, RX_CMD_RB_SIZE_MASK);
} }
/*
void enqueue_tx(char * data, uint16_t len){ void enqueue_tx(char * data, uint16_t len){
for( uint8_t index = 0; index < len; index++){ for( uint8_t index = 0; index < len; index++){
uart_tx_buf[uart_tx_buf_in_idx] = data[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; if(uart_tx_buf_in_idx == UART_TX_BUFFER_SIZE) break;
} }
} }
*/
// state changes // state changes
void set_frequency(void){ 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){ void set_filter(void){
@@ -124,14 +141,15 @@ void set_filter(void){
void set_modulation(void){ void set_modulation(void){
st2_filter_init(); st2_filter_init();
// cambia offset // cambia offset
nco1_increment = set_nco1_freq(frequency); set_frequency();
// nco1_increment = set_nco1_freq(frequency);
} }
void set_dummy(void){ void set_dummy(void){
// non fare NULLAH // non fare NULLAH
} }
// cambiato stato
void set_changed(uint8_t state){ void set_changed(uint8_t state){
state_changed |= (1U<<state); state_changed |= (1U<<state);
} }
@@ -146,15 +164,17 @@ uint8_t get_changed(uint8_t state){
void state_set_default(void){ void state_set_default(void){
modulation = MOD_USB; modulation = MOD_USB;
frequency = 98600; frequency = 128000;
nco1_increment = set_nco1_freq(frequency); rit = 0;
gain = 3; set_frequency();
volume = 16; gain = 2;
volume = 8;
audio_filter_freq = AUDIO_FILTER_FREQ_DEF; audio_filter_freq = AUDIO_FILTER_FREQ_DEF;
audio_filter_bw = AUDIO_FILTER_BW_DEF; audio_filter_bw = AUDIO_FILTER_BW_DEF;
audio_filter_beta = AUDIO_FILTER_BETA_DEF; audio_filter_beta = AUDIO_FILTER_BETA_DEF;
audio_filter_generate_coeffs(audio_filter_coeffs, audio_filter_freq, audio_filter_bw, audio_filter_beta); audio_filter_generate_coeffs(audio_filter_coeffs, audio_filter_freq, audio_filter_bw, audio_filter_beta);
state_changed = 0xFFFF; state_changed = 0xFFFF;
// strcpy(tabstring, "TX AUD MEM NO");
} }
// diag // diag
@@ -167,8 +187,34 @@ void diag(void){
uart_tx_buf_in_idx += sprintf(uart_tx_buf,"2st out sample rate: %d\n", ST2_OUT_SAMPLE_RATE); uart_tx_buf_in_idx += sprintf(uart_tx_buf,"2st out sample rate: %d\n", ST2_OUT_SAMPLE_RATE);
uart_tx_buf_in_idx += sprintf(uart_tx_buf,"in gain %d\n", gain); uart_tx_buf_in_idx += sprintf(uart_tx_buf,"in gain %d\n", gain);
uart_tx_buf_in_idx += sprintf(uart_tx_buf,"af gain %d\n", volume); uart_tx_buf_in_idx += sprintf(uart_tx_buf,"af gain %d\n", volume);
uart_tx_buf_in_idx += sprintf(uart_tx_buf,"nco1 inc %d\n", nco1_increment); uart_tx_buf_in_idx += sprintf(uart_tx_buf,"rx nco1 inc %d\n", rx_nco1_increment);
uart_tx_buf_in_idx += sprintf(uart_tx_buf,"nco2 inc %d\n", NCO2_INCREMENT); uart_tx_buf_in_idx += sprintf(uart_tx_buf,"nco2 inc %d\n", NCO2_INCREMENT);
uart_tx_buf_in_idx += sprintf(uart_tx_buf,"audio filter f %d bw %d\n", audio_filter_freq, audio_filter_bw); uart_tx_buf_in_idx += sprintf(uart_tx_buf,"audio filter f %d bw %d\n", audio_filter_freq, audio_filter_bw);
} }
uint32_t get_pwm_freq(uint16_t pwm_period){
return CLOCK/pwm_period;
}
uint16_t get_pwm_period(uint32_t pwm_frequency){
return CLOCK/pwm_frequency;
}
uint8_t measure_log_abs_mean(q31_t *samples, uint16_t size){
int32_t measured_signal = 0;
// , old_rx_signal;
uint16_t index = 0;
uint8_t log_sig = 31;
q31_t abs, accu;
while(index < size){
abs = (samples[index] > 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;
}

View File

@@ -2,13 +2,15 @@
#include "bassofono.h" #include "bassofono.h"
#include <stdint.h> #include <stdint.h>
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_set_function)(void);
typedef void (*menu_print_function)(uint8_t a); typedef void (*menu_print_function)(uint8_t a);
struct menu_item { struct menu_item {
uint8_t page;
char name[14]; char name[14];
uint8_t type; uint8_t type;
uint8_t size; uint8_t size;
@@ -18,31 +20,44 @@ struct menu_item {
uint32_t min; uint32_t min;
uint32_t max; uint32_t max;
uint8_t wrap; uint8_t wrap;
char suffix[3];
uint32_t *varptr; uint32_t *varptr;
menu_set_function set_function_ptr; menu_set_function set_function_ptr;
menu_print_function print_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[] = { struct menu_item items[] = {
{" Frequency", TYP_INT, 11, 1, 0, 100, 1000, 175000, WRAP, &frequency, &set_frequency, &print_frequency}, {MENU_PAGE_DEFAULT, " Frequency", TYP_INT, 9, 1, 0, 100, 1000, 175000, WRAP, "", " Hz", &frequency, &set_frequency, &print_frequency},
{" Volume ", TYP_INT, 2, 2, 0, 1, 0, 32, SAT, &volume, &set_dummy, &print_integer}, // {MENU_PAGE_DEFAULT, " Rit ", TYP_INT, 4, 2, 0, 10, 0, 9999, SAT, "", "", &rit, &set_frequency, &print_frequency},
{" Gain ", TYP_INT, 1, 2, 3, 1, 1, 6, SAT, &gain, &set_gain, &print_integer}, {MENU_PAGE_DEFAULT, " Volume ", TYP_INT, 5, 2, 0, 1, 0, 32, SAT, "", "|", &volume, &set_dummy, &print_bar},
{" Modulation", TYP_INT, 3, 2, 5, 1, 0, 3, WRAP, &modulation, &set_modulation,&print_modulation}, {MENU_PAGE_DEFAULT, " Gain ", TYP_INT, 1, 2, 7, 1, 1, 6, SAT, "", "x", &gain, &set_gain, &print_integer},
{" Squelch ", TYP_INT, 2, 2, 10, 1, 0, 32, SAT, &squelch, &set_dummy, &print_integer}, {MENU_PAGE_DEFAULT, " Modulation", TYP_INT, 3, 2, 10, 1, 0, 3, WRAP, "", "", &modulation, &set_modulation,&print_modulation},
{" Filter CF ", TYP_INT, 4, 3, 0, 100, 100, 3500, SAT, &audio_filter_freq, &set_filter, &print_integer}, // {MENU_PAGE_DEFAULT, " Squelch ", TYP_INT, 2, 3, 10, 1, 0, 32, SAT, "", "", &squelch, &set_dummy, &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}, {MENU_PAGE_AUDIO, " Filter CF ", TYP_INT, 4, 1, 0, 50, 50, 3500, SAT, "", " Hz", &audio_filter_freq, &set_filter, &print_integer},
{" Signal ", TYP_INT, 8, 10, 0, 1, 1, 32, SAT, &rx_signal, &set_dummy, &print_bar}, {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[] = { 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 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] = { char modulation_list[][4] = {
[MOD_DC] = "DC", [MOD_DC] = "DC",
@@ -53,6 +68,16 @@ char modulation_list[][4] = {
uint8_t modulation_list_count = sizeof(modulation_list)/sizeof(modulation_list[0]); 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){ void decode_cmd(char cmd){
switch(cmd){ switch(cmd){
case ENRH: case ENRH:
@@ -112,49 +137,61 @@ void decode_cmd(char cmd){
} }
void encoder_increment(void){ void encoder_increment(void){
integer_editor_up(menu_mode); if(items[menu_item].type == TYP_INT) integer_editor_up(menu_item);
items[menu_mode].set_function_ptr(); items[menu_item].set_function_ptr();
} }
void encoder_decrement(void){ void encoder_decrement(void){
integer_editor_down(menu_mode); if(items[menu_item].type == TYP_INT) integer_editor_down(menu_item);
items[menu_mode].set_function_ptr(); items[menu_item].set_function_ptr();
} }
void joystick_dx(void){ void joystick_dx(void){
step_down(menu_mode); step_down(menu_item);
} }
void joystick_sx(void){ void joystick_sx(void){
step_up(menu_mode); step_up(menu_item);
} }
void joystick_down(void){ void joystick_down(void){
menu_mode_up(); menu_item_up();
} }
void joystick_up(void){ void joystick_up(void){
menu_mode_down(); menu_item_down();
} }
void joystick_button(void){ void joystick_button(void){
} }
void menu_mode_up(void){ void menu_item_up(void){
set_changed(menu_mode); // pulisci vecchio set_changed(menu_item); // pulisci vecchio
menu_mode++; menu_item++;
if(menu_mode >= menu_item_count) menu_mode = 0; // if((items[menu_item].type == TYP_NED) || (items[menu_item].page != menu_page)) menu_item++;
set_changed(menu_mode); // cursore nel nuovo 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 // nome
display_update_mode(); display_update_item();
} }
void menu_mode_down(void){ void menu_item_down(void){
set_changed(menu_mode); // pulisci vecchio set_changed(menu_item); // pulisci vecchio
menu_mode--; menu_item--;
if(menu_mode >= menu_item_count) menu_mode = menu_item_count - 1; if(menu_item >= menu_item_count) menu_item = menu_item_count - 1;
set_changed(menu_mode); // nuovo // if(menu_item >= menu_item_count) menu_item = menu_item_count - 1;
display_update_mode(); // 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){ void step_up(uint8_t mode){
@@ -166,47 +203,53 @@ void step_down(uint8_t mode){
} }
void interface_set_default(void){ void interface_set_default(void){
menu_mode = 0; menu_item = 0;
display_update_mode(); 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){ 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); 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){ void display_print_string(uint8_t row, uint8_t col, char * string){
display_set_position(row,col); display_set_position(row,col);
enqueue_tx(string, strlen(string)); enqueue_tx(string, strlen(string));
} }
*/
void display_draw_dual_bar(char * string, uint8_t value1, uint8_t value2){ void display_update_item(void){
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){
display_set_position(MENU_NAME_ROW,MENU_NAME_COL); 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){ void display_update_state(void){
uint8_t var; uint8_t var;
for(uint8_t item_idx = 0; item_idx < (menu_item_count); item_idx++){ for(uint8_t item_idx = 0; item_idx < (menu_item_count); item_idx++){
if(get_changed(item_idx)){ if(get_changed(item_idx)){
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); 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, ">"); // 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 { else {
uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx, " "); 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); }
// 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_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]); // 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); }
// resetta
reset_changed(item_idx); reset_changed(item_idx);
} }
} }
@@ -252,6 +295,25 @@ void tab_up(uint8_t tab){
stop_receive(); stop_receive();
start_transmit(); start_transmit();
break; 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){ 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[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[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[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[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[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[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[%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,"\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,"\a");
uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\f"); clear_display();
uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\f");
} }
// menu prints // menu prints
void print_dummy(uint8_t item_idx){
}
void print_integer(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); 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){ 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]); 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){ 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); // il range massimo e' items[item_idx].size * 6
// display_draw_bar(items[item_idx].size, * items[item_idx].varptr); uint8_t i, cols;
uint8_t i;
uint8_t cols, cols_tmp;
// cols = *items[item_idx].varptr / (2147483648 / (items[item_idx].size * 6));
cols = *items[item_idx].varptr; cols = *items[item_idx].varptr;
char buf[items[item_idx].size]; char buf[items[item_idx].size];
@@ -308,14 +376,15 @@ void print_bar(uint8_t item_idx){
} }
cols = sat_subu8b(cols, 6); 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){ void print_frequency(uint8_t item_idx){
char bufin[14]; char bufin[14];
char bufout[14]; char bufout[14];
uint8_t i, j; uint8_t i, j, unformatted_size;
j = 0; j = 0;
// unformatted_size = items[item_idx].size;
sprintf(bufin,"%8ld", * items[item_idx].varptr); sprintf(bufin,"%8ld", * items[item_idx].varptr);
for(i=0; bufin[i] != '\0'; i++){ for(i=0; bufin[i] != '\0'; i++){
if((((strlen(bufin)-i)%3)==0) && (i != 0)) { 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); uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"%s", bufout);
} }
// ###
void scan_do(uint8_t scan_state){ void scan_do(uint8_t scan_state){
static uint8_t scan_timer; static uint8_t scan_timer;
frequency += items[0].step * scan_state; frequency += items[0].step * scan_state;
@@ -347,5 +418,9 @@ uint8_t sat_subu8b(uint8_t x, uint8_t y){
} }
void click(void){ 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");
} }

View File

@@ -25,6 +25,7 @@
#include <stdio.h> #include <stdio.h>
#include "bassofono.h" #include "bassofono.h"
#include "interface.h" #include "interface.h"
#include "si5351.h"
/* USER CODE END Includes */ /* USER CODE END Includes */
@@ -52,6 +53,8 @@ DAC_HandleTypeDef hdac1;
DMA_HandleTypeDef hdma_dac1_ch1; DMA_HandleTypeDef hdma_dac1_ch1;
DMA_HandleTypeDef hdma_dac1_ch2; DMA_HandleTypeDef hdma_dac1_ch2;
I2C_HandleTypeDef hi2c1;
OPAMP_HandleTypeDef hopamp1; OPAMP_HandleTypeDef hopamp1;
TIM_HandleTypeDef htim6; TIM_HandleTypeDef htim6;
@@ -64,6 +67,7 @@ DMA_HandleTypeDef hdma_usart1_tx;
/* USER CODE BEGIN PV */ /* USER CODE BEGIN PV */
volatile uint8_t tick; volatile uint8_t tick;
uint16_t tick_timer;
// RX // RX
volatile uint8_t rx_adc_buffer_ready, half_rx_dac_buffer_empty; 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_USART1_UART_Init(void);
static void MX_TIM8_Init(void); static void MX_TIM8_Init(void);
static void MX_OPAMP1_Init(void); static void MX_OPAMP1_Init(void);
static void MX_I2C1_Init(void);
/* USER CODE BEGIN PFP */ /* USER CODE BEGIN PFP */
/* USER CODE END PFP */ /* USER CODE END PFP */
@@ -94,6 +99,19 @@ static void MX_OPAMP1_Init(void);
// IRQ // 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 // ADC
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){
@@ -122,13 +140,13 @@ void HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef* hdac) {
// tx // tx
void HAL_DACEx_ConvHalfCpltCallbackCh2(DAC_HandleTypeDef* hdac) { 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; tx_dac_buffer_toggle = 0;
half_tx_dac_buffer_empty = 1; half_tx_dac_buffer_empty = 1;
} }
void HAL_DACEx_ConvCpltCallbackCh2(DAC_HandleTypeDef* hdac) { 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; tx_dac_buffer_toggle = 1;
half_tx_dac_buffer_empty = 1; half_tx_dac_buffer_empty = 1;
} }
@@ -197,21 +215,34 @@ void start_transmit(void){
// ADC // ADC
// HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_BUFFER_SIZE); // HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_BUFFER_SIZE);
if(TX_TYPE == TX_TYPE_DAC){
// DAC // DAC
HAL_TIM_Base_Start(&htim8); HAL_TIM_Base_Start(&htim8);
HAL_DAC_Start(&hdac1,DAC_CHANNEL_2); 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); 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){ void stop_transmit(void){
transmit = 0; transmit = 0;
// ADC // ADC
// HAL_ADC_Stop_DMA(&hadc1); // HAL_ADC_Stop_DMA(&hadc1);
if(TX_TYPE == TX_TYPE_DAC){
// DAC // DAC
HAL_TIM_Base_Stop(&htim8); HAL_TIM_Base_Stop(&htim8);
HAL_DAC_Stop(&hdac1,DAC_CHANNEL_2); HAL_DAC_Stop(&hdac1,DAC_CHANNEL_2);
HAL_DAC_Stop_DMA(&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){ void start_receive(void){
@@ -277,11 +308,6 @@ int main(void)
{ {
/* USER CODE BEGIN 1 */ /* USER CODE BEGIN 1 */
state_changed = 0; state_changed = 0;
display_init();
state_set_default();
interface_set_default();
display_update_mode();
display_update_state();
/* USER CODE END 1 */ /* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/ /* MCU Configuration--------------------------------------------------------*/
@@ -311,7 +337,19 @@ int main(void)
MX_USART1_UART_Init(); MX_USART1_UART_Init();
MX_TIM8_Init(); MX_TIM8_Init();
MX_OPAMP1_Init(); MX_OPAMP1_Init();
MX_I2C1_Init();
/* USER CODE BEGIN 2 */ /* 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(); st2_filter_init();
audio_filter_init(); audio_filter_init();
// diag(); // diag();
@@ -321,6 +359,12 @@ int main(void)
HAL_UART_Receive_IT(&huart1, uart_rx_buf, 1); HAL_UART_Receive_IT(&huart1, uart_rx_buf, 1);
// HAL_UART_Receive_IT(&huart2, uart_rx_buf, 1); // HAL_UART_Receive_IT(&huart2, uart_rx_buf, 1);
if(TX_TYPE == TX_TYPE_SI5351){
// rooto!
si53531_initialize();
}
start_receive(); start_receive();
/* USER CODE END 2 */ /* USER CODE END 2 */
@@ -330,25 +374,30 @@ int main(void)
/* USER CODE END WHILE */ /* USER CODE END WHILE */
/* USER CODE BEGIN 3 */ /* USER CODE BEGIN 3 */
HAL_GPIO_TogglePin(OUT_GPIO_Port, OUT_Pin);
// receive = transmit = 0;
if(receive){ if(receive){
if(rx_adc_buffer_ready){ if(rx_adc_buffer_ready){
HAL_GPIO_WritePin(OUT_GPIO_Port, OUT_Pin, SET); // HAL_GPIO_WritePin(OUT_GPIO_Port, OUT_Pin, SET);
rx_mixer(adc_buffer, ADC_BUFFER_SIZE, if_I, if_Q, nco1_increment); rx_mixer(adc_buffer, ADC_BUFFER_SIZE, if_I, if_Q, rx_nco1_increment);
HAL_GPIO_WritePin(OUT_GPIO_Port, OUT_Pin, RESET); // HAL_GPIO_WritePin(OUT_GPIO_Port, OUT_Pin, RESET);
rx_adc_buffer_ready = 0; rx_adc_buffer_ready = 0;
} }
if(half_rx_dac_buffer_empty){ 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); 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_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); 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[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; half_rx_dac_buffer_empty = 0;
} }
} }
if (transmit){ if (transmit){
if(half_tx_dac_buffer_empty){ if(half_tx_dac_buffer_empty){
// HAL_GPIO_WritePin(OUT_GPIO_Port, OUT_Pin, SET); // 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; half_tx_dac_buffer_empty = 0;
// HAL_GPIO_WritePin(OUT_GPIO_Port, OUT_Pin, RESET); // HAL_GPIO_WritePin(OUT_GPIO_Port, OUT_Pin, RESET);
} }
@@ -359,17 +408,20 @@ int main(void)
} }
} }
if(tick){ if(tick){
if(receive){ // consuma coda comandi
// TODO
rx_measure_signal(if_I, LF_BUFFER_SIZE);
}
// HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
while(rx_cmd_rb_in_idx != rx_cmd_rb_out_idx) dequeue_cmd(); while(rx_cmd_rb_in_idx != rx_cmd_rb_out_idx) dequeue_cmd();
// applica cambiamenti display
if(state_changed) display_update_state(); if(state_changed) display_update_state();
if(uart_tx_buf_in_idx){ if(uart_tx_buf_in_idx){
display_write(uart_tx_buf, uart_tx_buf_in_idx); display_write(uart_tx_buf, uart_tx_buf_in_idx);
uart_tx_buf_in_idx = 0; uart_tx_buf_in_idx = 0;
} }
tick_timer++;
// eventi lenti
if(tick_timer % 8 == 0){
if(receive){
if(peak){ if(peak){
if(peakset == 0) click(); if(peakset == 0) click();
peakset = 50; peakset = 50;
@@ -380,6 +432,22 @@ int main(void)
if(peakset == 0) click(); 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; tick = 0;
} }
} }
@@ -394,7 +462,6 @@ void SystemClock_Config(void)
{ {
RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
/** Configure the main internal regulator output voltage /** Configure the main internal regulator output voltage
*/ */
@@ -428,15 +495,7 @@ void SystemClock_Config(void)
{ {
Error_Handler(); Error_Handler();
} }
/** Initializes the peripherals clocks HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1);
*/
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();
}
} }
/** /**
@@ -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 * @brief OPAMP1 Initialization Function
* @param None * @param None
@@ -856,11 +961,25 @@ static void MX_GPIO_Init(void)
/*Configure GPIO pin Output Level */ /*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(OUT_GPIO_Port, OUT_Pin, GPIO_PIN_RESET); 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 */ /*Configure GPIO pin : OUT_Pin */
GPIO_InitStruct.Pin = OUT_Pin; GPIO_InitStruct.Pin = OUT_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL; 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); 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 */ #endif /* USE_FULL_ASSERT */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

View File

@@ -6,7 +6,9 @@
#include "bassofono.h" #include "bassofono.h"
#include "rx.h" #include "rx.h"
int32_t rx_signal; q31_t rx_nco1_increment;
uint8_t rx_signal, rx_signal_last;
// filtro 2 // filtro 2
arm_fir_decimate_instance_q31 st2_filter_I_struct; 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 ); 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);
}
}

173
codice/Core/Src/si5351.c Normal file
View File

@@ -0,0 +1,173 @@
#include "main.h"
#include "stm32g4xx_hal.h"
#include <math.h>
#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);
}

View File

@@ -96,11 +96,21 @@ void HAL_MspInit(void)
*/ */
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{ {
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
if(hadc->Instance==ADC1) if(hadc->Instance==ADC1)
{ {
/* USER CODE BEGIN ADC1_MspInit 0 */ /* USER CODE BEGIN ADC1_MspInit 0 */
/* USER CODE END 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 */ /* Peripheral clock enable */
__HAL_RCC_ADC12_CLK_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 * @brief OPAMP MSP Initialization
* This function configures the hardware resources used in this example * 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) void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{ {
GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
if(huart->Instance==USART1) if(huart->Instance==USART1)
{ {
/* USER CODE BEGIN USART1_MspInit 0 */ /* USER CODE BEGIN USART1_MspInit 0 */
/* USER CODE END 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 */ /* Peripheral clock enable */
__HAL_RCC_USART1_CLK_ENABLE(); __HAL_RCC_USART1_CLK_ENABLE();
@@ -553,4 +649,3 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
/* USER CODE END 1 */ /* USER CODE END 1 */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

View File

@@ -306,4 +306,4 @@ void TIM7_IRQHandler(void)
/* USER CODE BEGIN 1 */ /* USER CODE BEGIN 1 */
/* USER CODE END 1 */ /* USER CODE END 1 */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

View File

@@ -5,6 +5,9 @@
#include "bassofono.h" #include "bassofono.h"
#include "tx.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 half_tx_dac_buffer_empty, tx_dac_buffer_toggle;
volatile uint8_t tx_adc_buffer_ready; volatile uint8_t tx_adc_buffer_ready;