aggiunto oscillatore
This commit is contained in:
@@ -1,10 +1,25 @@
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <arm_math.h>
|
||||
// #include <arm_math.h>
|
||||
#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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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****/
|
||||
|
||||
@@ -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
|
||||
|
||||
27
codice/Core/Inc/si5351.h
Normal file
27
codice/Core/Inc/si5351.h
Normal 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;
|
||||
@@ -1,3 +1,4 @@
|
||||
/* USER CODE BEGIN Header */
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file stm32g4xx_hal_conf.h
|
||||
@@ -6,16 +7,16 @@
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* <h2><center>© Copyright (c) 2019 STMicroelectronics.
|
||||
* All rights reserved.</center></h2>
|
||||
* 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****/
|
||||
|
||||
@@ -72,5 +72,3 @@ void TIM7_IRQHandler(void);
|
||||
#endif
|
||||
|
||||
#endif /* __STM32G4xx_IT_H */
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#include "tx.h"
|
||||
#include "rx.h"
|
||||
#include "interface.h"
|
||||
#include "si5351.h"
|
||||
#include "main.h"
|
||||
#include "FIRFilterCode.h"
|
||||
#include <arm_math.h>
|
||||
@@ -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<<state);
|
||||
}
|
||||
@@ -146,15 +164,17 @@ uint8_t get_changed(uint8_t state){
|
||||
|
||||
void state_set_default(void){
|
||||
modulation = MOD_USB;
|
||||
frequency = 98600;
|
||||
nco1_increment = set_nco1_freq(frequency);
|
||||
gain = 3;
|
||||
volume = 16;
|
||||
frequency = 128000;
|
||||
rit = 0;
|
||||
set_frequency();
|
||||
gain = 2;
|
||||
volume = 8;
|
||||
audio_filter_freq = AUDIO_FILTER_FREQ_DEF;
|
||||
audio_filter_bw = AUDIO_FILTER_BW_DEF;
|
||||
audio_filter_beta = AUDIO_FILTER_BETA_DEF;
|
||||
audio_filter_generate_coeffs(audio_filter_coeffs, audio_filter_freq, audio_filter_bw, audio_filter_beta);
|
||||
state_changed = 0xFFFF;
|
||||
// strcpy(tabstring, "TX AUD MEM NO");
|
||||
}
|
||||
|
||||
// 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,"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,"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,"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;
|
||||
}
|
||||
|
||||
@@ -2,13 +2,15 @@
|
||||
#include "bassofono.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_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)){
|
||||
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);
|
||||
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 {
|
||||
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_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);
|
||||
}
|
||||
}
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <stdio.h>
|
||||
#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);
|
||||
|
||||
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);
|
||||
|
||||
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,17 +408,20 @@ 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;
|
||||
}
|
||||
|
||||
tick_timer++;
|
||||
// eventi lenti
|
||||
if(tick_timer % 8 == 0){
|
||||
if(receive){
|
||||
if(peak){
|
||||
if(peakset == 0) click();
|
||||
peakset = 50;
|
||||
@@ -380,6 +432,22 @@ int main(void)
|
||||
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****/
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
173
codice/Core/Src/si5351.c
Normal file
173
codice/Core/Src/si5351.c
Normal 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);
|
||||
}
|
||||
@@ -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****/
|
||||
|
||||
@@ -306,4 +306,4 @@ void TIM7_IRQHandler(void)
|
||||
/* USER CODE BEGIN 1 */
|
||||
|
||||
/* USER CODE END 1 */
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user