#include #include #include #include #include #include "delay.h" #include "util.h" uint8_t FIFO[FIFO_SIZE] = {0}; static void clock_setup(void) { rcc_clock_setup_pll(&rcc_hse_configs[RCC_CLOCK_HSE8_72MHZ]); rcc_periph_clock_enable(RCC_GPIOA); rcc_periph_clock_enable(RCC_GPIOB); rcc_periph_clock_enable(RCC_SPI1); } static void gpio_setup(void) { gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_2_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO0 | GPIO1); } static void spi_setup(void) { /* Configure GPIOs: SS=PA4, SCK=PA5, MISO=PA6 and MOSI=PA7 */ gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO5 | GPIO7 ); gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO4); gpio_set(GPIOA, GPIO4); gpio_set_mode(GPIOA, GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT, GPIO6); /* Reset SPI, SPI_CR1 register cleared, SPI is disabled */ spi_reset(SPI1); /* Set up SPI in Master mode with: * Clock baud rate: 1/64 of peripheral clock frequency * Clock polarity: Idle Low * Clock phase: Data valid on 1st clock pulse * Data frame format: 8-bit * Frame format: MSB First */ spi_init_master(SPI1, SPI_CR1_BAUDRATE_FPCLK_DIV_64, SPI_CR1_CPOL_CLK_TO_0_WHEN_IDLE, SPI_CR1_CPHA_CLK_TRANSITION_1, SPI_CR1_DFF_8BIT, SPI_CR1_MSBFIRST); /* * Set NSS management to software. * * Note: * Setting nss high is very important, even if we are controlling the GPIO * ourselves this bit needs to be at least set to 1, otherwise the spi * peripheral will not send any data out. */ spi_enable_software_slave_management(SPI1); spi_set_nss_high(SPI1); /* Enable SPI1 periph. */ spi_enable(SPI1); } int main(void) { clock_setup(); spi_setup(); gpio_setup(); SEGGER_RTT_WriteString(0, "SX1276 LoRa test\n"); SEGGER_RTT_printf(0, "CPU clk: %dHz\n", rcc_ahb_frequency); struct sx1276_state_st *sx1276_state = sx1276_init(86520000); sx1276_fifo_write(0x0, 0xde); sx1276_fifo_write(0x1, 0xad); sx1276_fifo_write(0x2, 0xbe); sx1276_fifo_write(0x3, 0xef); sx1276_write(SX1276_REG_PAYLOAD_LENGTH, 4); sx1276_write(SX1276_REG_OP_MODE, SX1276_MODE_LONG_RANGE_MODE | SX1276_MODE_TX); while (1) { int ret = sx1276_read(SX1276_REG_OP_MODE); SEGGER_RTT_printf(0, "MOD: 0x%02x ", ret); ret = sx1276_read(SX1276_REG_MODEM_STATUS); SEGGER_RTT_printf(0, "STAT: 0x%02x ", ret); ret = sx1276_read(SX1276_REG_IRQ_FLAGS); SEGGER_RTT_printf(0, "IRQ: 0x%02x\n", ret); if (ret & (1<<3)){ break; } delay_ms(100); } SEGGER_RTT_printf(0, "Done\n"); /* Blink the LED (PA5) on the board. */ while (1) { /* Using API function gpio_toggle(): */ gpio_toggle(GPIOB, GPIO1); /* LED on/off */ delay_ms(500); } return 0; }