skl-tunnel/radio/src/radio_spi.c
2022-06-16 23:39:07 +03:00

78 lines
1.9 KiB
C

//
// Created by erki on 4.06.22.
//
#include "radio_spi.h"
#include "radio_hardware_instance.h"
#include "hpl_pm_base.h"
#include "hpl_gclk_base.h"
#include "hpl_sercom_config.h"
#ifdef __cplusplus
extern "C" {
#endif
static struct spi_m_sync_descriptor SPI_4;
/**
* Enables the SERCOM4 clock and sets it to clock generator 0.
*/
static void _spi4_init_clock(void)
{
_pm_enable_bus_clock(PM_BUS_APBC, SERCOM4);
_gclk_enable_channel(SERCOM4_GCLK_ID_CORE, GCLK_CLKCTRL_GEN_GCLK0_Val);
}
/**
* Configures:
* * PC19 as MISO
* * PC18 as SCLK
* * PB30 as MOSI
* * PB31 as chip select
*/
static void _spi4_port_init(void)
{
#define PINMUX_FUNCTION_F _L_(5)
#define PINMUX_PC19F_SERCOM4_PAD0 ((_L_(19) << 16) | PINMUX_FUNCTION_F)
#define PINMUX_PB31F_SERCOM4_PAD1 ((_L_(31) << 16) | PINMUX_FUNCTION_F)
#define PINMUX_PB30F_SERCOM4_PAD2 ((_L_(30) << 16) | PINMUX_FUNCTION_F)
#define PINMUX_PC18F_SERCOM4_PAD3 ((_L_(18) << 16) | PINMUX_FUNCTION_F)
gpio_set_pin_direction(PC19, GPIO_DIRECTION_IN);
gpio_set_pin_pull_mode(PC19, GPIO_PULL_OFF);
gpio_set_pin_function(PC19, PINMUX_PC19F_SERCOM4_PAD0);
gpio_set_pin_level(PB30, false);
gpio_set_pin_direction(PB30, GPIO_DIRECTION_OUT);
gpio_set_pin_function(PB30, PINMUX_PB30F_SERCOM4_PAD2);
gpio_set_pin_level(PC18, false);
gpio_set_pin_direction(PC18, GPIO_DIRECTION_OUT);
gpio_set_pin_function(PC18, PINMUX_PC18F_SERCOM4_PAD3);
gpio_set_pin_level(PB31, true);
gpio_set_pin_direction(PB31, GPIO_DIRECTION_OUT);
#undef PINMUX_PC19F_SERCOM4_PAD0
#undef PINMUX_PB31F_SERCOM4_PAD1
#undef PINMUX_PB30F_SERCOM4_PAD2
#undef PINMUX_PC18F_SERCOM4_PAD3
#undef PINMUX_FUNCTION_F
}
struct spi_m_sync_descriptor* radio_spi_init()
{
_spi4_init_clock();
spi_m_sync_init(&SPI_4, SERCOM4);
_spi4_port_init();
spi_m_sync_set_baudrate(&SPI_4, CONF_SERCOM_4_SPI_BAUD_RATE);
return &SPI_4;
}
#ifdef __cplusplus
}
#endif