SPI

../_images/spi.svg

Examples

#include "abov/system.h"
#include "abov/hal/gpio.h"
#include "abov/irq.h"

#include "abov/ll/pwr.h"
#include "abov/ll/clk.h"
#include "abov/ll/spi.h"

static void myspi_gpio_init(void)
{
	struct gpio_cfg cfg = {
		.mode = GPIO_MODE_PUSHPULL,
		.altfunc = true,
		.altfunc_number = 1,
	};
	gpio_open(PERIPH_GPIOB, 10, &cfg); // SS
	gpio_open(PERIPH_GPIOB, 11, &cfg); // SCK
	gpio_open(PERIPH_GPIOB, 12, &cfg); // MOSI
	gpio_open(PERIPH_GPIOB, 13, &cfg); // MISO
}

static void myspi_init(void)
{
	myspi_gpio_init();

	pwr_enable_peripheral(PERIPH_SPI0);
	clk_enable_peripheral(PERIPH_SPI0);

	spi_reset(PERIPH_SPI0);
	spi_set_mode(PERIPH_SPI0, SPI_MODE_MASTER);
	spi_set_frequency(PERIPH_SPI0, 1000000, clk_get_pclk_frequency());
	spi_set_clock_phase(PERIPH_SPI0, 0);
	spi_set_clock_polarity(PERIPH_SPI0, 0);
	spi_set_bitorder(PERIPH_SPI0, false);
	spi_set_data_width(PERIPH_SPI0, 8);

	spi_disable_chip_select(PERIPH_SPI0);
	spi_set_loopback(PERIPH_SPI0, true);
}

int main(void)
{
	myspi_init();
	spi_start(PERIPH_SPI0);

	while (!(spi_get_event(PERIPH_SPI0) & SPI_EVENT_TX_COMPLETE)) { /* waiting */ }
	spi_set_txd(PERIPH_SPI0, 0xA5);

	while (!(spi_get_event(PERIPH_SPI0) & SPI_EVENT_RX)) { /* waiting */ }

	uint32_t received = spi_get_rxd(PERIPH_SPI0);
	(void)received;

	return 0;
}

HAL

Functions

void spi_enable(periph_t spi)
void spi_disable(periph_t spi)
bool spi_init(periph_t spi, const struct spi_cfg *cfg)
void spi_deinit(periph_t spi)
void spi_start(periph_t spi)
void spi_stop(periph_t spi)
void spi_write(periph_t spi, uint32_t value)
uint32_t spi_read(periph_t spi)
uint32_t spi_write_read(periph_t spi, uint32_t value)
struct spi_cfg
#include <spi.h>

Public Members

spi_mode_t mode
uint32_t frequency
int cpol
int cpha
uint32_t data_width
bool lsb_first
bool auto_chip_select
bool interrupt

LL

Enums

enum spi_mode_t

Values:

enumerator SPI_MODE_MASTER
enumerator SPI_MODE_SLAVE
enum spi_irq_t

Values:

enumerator SPI_IRQ_NONE
enumerator SPI_IRQ_RX
enumerator SPI_IRQ_TX
enumerator SPI_IRQ_EDGE_CHAGNE
enumerator SPI_IRQ_OVERRUN
enumerator SPI_IRQ_FRAME_ERROR
enumerator SPI_IRQ_ERROR
enumerator SPI_IRQ_MASK
enum spi_event_t

Values:

enumerator SPI_EVENT_NONE
enumerator SPI_EVENT_TX_COMPLETE
enumerator SPI_EVENT_RX
enumerator SPI_EVENT_BUSY
enumerator SPI_EVENT_OVERRUN
enumerator SPI_EVENT_UNDERRUN
enumerator SPI_EVENT_CHIP_SELECTED
enumerator SPI_EVENT_CHIP_DESELECTED
enumerator SPI_EVENT_MODE_FAULT
enumerator SPI_EVENT_CRC_ERROR
enumerator SPI_EVENT_MASK

Functions

void spi_reset(periph_t spi)

Reset SPI

This function makes the given SPI the reset default state.

Parameters

spi[in] a peripheral enumerated in periph_t

void spi_enable_clock(periph_t spi)
void spi_disable_clock(periph_t spi)
spi_event_t spi_get_event(periph_t spi)
void spi_clear_event(periph_t spi, spi_event_t events)
uint32_t spi_get_rxd(periph_t spi)
void spi_set_txd(periph_t spi, uint32_t value)
bool spi_is_busy(periph_t spi)
bool spi_is_tx_completed(periph_t spi)
bool spi_has_rx(periph_t spi)
void spi_clear_rx_buffer(periph_t spi)
void spi_clear_tx_buffer(periph_t spi)
void spi_enable_irq(periph_t spi, spi_irq_t irqs)
void spi_disable_irq(periph_t spi, spi_irq_t irqs)
void spi_enable_chip_select(periph_t spi)
void spi_disable_chip_select(periph_t spi)
void spi_set_chip_select_mode(periph_t spi, bool manual)
void spi_set_chip_select_level(periph_t spi, int level)
void spi_set_chip_select_polarity(periph_t spi, int level)
void spi_set_loopback(periph_t spi, bool enable)
void spi_set_mode(periph_t spi, spi_mode_t mode)
void spi_set_clock_phase(periph_t spi, int cpha)

Set clock phase

Parameters
  • spi[in] a peripheral enumerated in periph_t

  • cpha[in] 0 for the first clock edge or 1 for the second clock edge

void spi_set_clock_polarity(periph_t spi, int cpol)

Set clock polarity

Parameters
  • spi[in] a peripheral enumerated in periph_t

  • cpol[in] 0 for low, 1 for high

void spi_set_data_width(periph_t spi, uint32_t data_width)
void spi_set_bitorder(periph_t spi, bool lsb_first)
void spi_set_frequency(periph_t spi, uint32_t hz, uint32_t pclk)
void spi_set_start_delay(periph_t spi, uint32_t nsck)
void spi_set_stop_delay(periph_t spi, uint32_t nsck)
void spi_set_burst_delay(periph_t spi, uint32_t nsck)
void spi_enable_crc(periph_t spi)
void spi_disable_crc(periph_t spi)