78 lines
1.9 KiB
C
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
|