Files @ 2fa25ca2db21
Branch filter:

Location: FeatherHAB/wsprhab/src/wspr.c - annotation

Ethan Zonca
Don't zero out everything in position, because we need some of that data; fix timer clocking
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
a127e9133034
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
659774b354b1
659774b354b1
659774b354b1
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
f126c64d1202
c1b1dfc6c2f4
f126c64d1202
f126c64d1202
f126c64d1202
f126c64d1202
f126c64d1202
1ecaddb549ab
1ecaddb549ab
1ecaddb549ab
1ecaddb549ab
2fa25ca2db21
1ecaddb549ab
1ecaddb549ab
1ecaddb549ab
1ecaddb549ab
1ecaddb549ab
1ecaddb549ab
1ecaddb549ab
1ecaddb549ab
1ecaddb549ab
1ecaddb549ab
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
1ecaddb549ab
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
c1b1dfc6c2f4
1ecaddb549ab
1ecaddb549ab
1ecaddb549ab
1ecaddb549ab
1ecaddb549ab
1ecaddb549ab
1ecaddb549ab
1ecaddb549ab
1ecaddb549ab
1ecaddb549ab
1ecaddb549ab
c1b1dfc6c2f4
c1b1dfc6c2f4
#include "stm32f0xx_hal.h"
#include "si5351.h"
#include "jtencode.h"
#include "gpio.h"
#include "wspr.h"
#include "i2c.h"
#include "config.h"


#define WSPR_DEFAULT_FREQ 10140100UL
#define WSPR_TONE_SPACING 146 // ~1.46 Hz
#define WSPR_CTC 10672 // CTC value for WSPR

// Test stuff
char call[7] = "KD8TDF";
char loc[5] = "EN72";
uint8_t dbm = 10;
uint8_t tx_buffer[255];

// Frequencies and channel info
uint32_t freq = WSPR_DEFAULT_FREQ;
uint8_t symbol_count = WSPR_SYMBOL_COUNT;
uint16_t ctc = WSPR_CTC;
uint16_t tone_spacing = WSPR_TONE_SPACING;
volatile uint8_t proceed = 0;

TIM_HandleTypeDef htim1;



void wspr_init(void)
{
    // Turn off ICs
    HAL_GPIO_WritePin(OSC_NOTEN, 1);
    HAL_GPIO_WritePin(TCXO_EN, 0);
}

// Do anything needed to prepare for sleep
void wspr_sleep(void)
{
    HAL_TIM_Base_Stop_IT(&htim1);
}

void wspr_wakeup(void)
{
    HAL_TIM_Base_Start_IT(&htim1);
}


// Bring up TCXO and oscillator IC
void wspr_transmit(uint8_t* grid_locator)
{
	// Copy 4 digit grid locator to local buffer; null terminate
	for(uint8_t i=0; i<4; i++)
		loc[i] = grid_locator[i];
	loc[4] = '\0';


    // Start timer for WSPR
    __TIM1_CLK_ENABLE();
    htim1.Instance = TIM1;
    htim1.Init.Prescaler = 512 / 4; // FIXED gives 64us ticks from 2mhz clock // gives 64uS ticks from 8MHz ahbclk
    htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim1.Init.Period = ctc; // Count up to this value (how many 64uS ticks per symbol)
    htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim1.Init.RepetitionCounter = 0;
    HAL_TIM_Base_Init(&htim1);
    HAL_TIM_Base_Start_IT(&htim1);
    HAL_NVIC_SetPriority(TIM1_BRK_UP_TRG_COM_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(TIM1_BRK_UP_TRG_COM_IRQn);


    HAL_GPIO_WritePin(OSC_NOTEN, 0);
    HAL_GPIO_WritePin(TCXO_EN, 1);
    HAL_Delay(100);

    // Bring up the chip
    i2c_init();
    si5351_init(i2c_get(), SI5351_CRYSTAL_LOAD_8PF, 0);
    si5351_set_correction(0);
    //si5351_set_pll(SI5351_PLL_FIXED, SI5351_PLLA);
    //si5351_set_ms_source(SI5351_CLK0, SI5351_PLLA);
    si5351_set_freq(WSPR_DEFAULT_FREQ * 100, 0, SI5351_CLK0);
    si5351_drive_strength(SI5351_CLK0, SI5351_DRIVE_8MA); // Set for max power if desired (8ma max)
    si5351_output_enable(SI5351_CLK0, 1);
    //si5351_pll_reset(SI5351_PLLA);

    // Make sure the other outputs of the SI5351 are disabled
    si5351_output_enable(SI5351_CLK1, 0); // Disable the clock initially
    si5351_output_enable(SI5351_CLK2, 0); // Disable the clock initially

    // disable clock powers
    si5351_set_clock_pwr(SI5351_CLK1, 0);
    si5351_set_clock_pwr(SI5351_CLK2, 0);


    // Encode message to transmit
    wspr_encode(call, loc, dbm, tx_buffer);

    // Key transmitter
    si5351_output_enable(SI5351_CLK0, 1);

    // Loop through and transmit symbols TODO: Do this from an ISR or ISR-triggered main loop function call (optimal)
    uint8_t i;
    for(i=0; i<symbol_count; i++)
    {
        uint32_t freq2 = (freq * 100) + (tx_buffer[i] * tone_spacing);
        si5351_set_freq(freq2, 0, SI5351_CLK0);
        HAL_GPIO_TogglePin(LED_BLUE);

        proceed = 0;
        while(!proceed);
    }

    // Disable transmitter
    si5351_output_enable(SI5351_CLK0, 0);

    HAL_GPIO_WritePin(OSC_NOTEN, 1);
    HAL_GPIO_WritePin(TCXO_EN, 0);

    i2c_deinit();

    // Disable timer
    HAL_NVIC_DisableIRQ(TIM1_BRK_UP_TRG_COM_IRQn);
    HAL_TIM_Base_Stop_IT(&htim1);
    HAL_TIM_Base_DeInit(&htim1);

    __TIM1_CLK_DISABLE();


}