spi.h

[Stub] support.

Library Documentation

Serial Peripheral Interface (SPI) and Integrated Interchip Sound (I2S) peripheral support.

Author:Marti Bolivar <> I2S support is currently limited to register maps and bit definitions.

Defines
SPI1_BASE

SPI1 register map base pointer.

SPI2_BASE

SPI2 register map base pointer.

SPI3_BASE

SPI3 register map base pointer.

SPI_CR1_BIDIMODE_BIT

SPI_CR1_BIDIOE_BIT

SPI_CR1_CRCEN_BIT

SPI_CR1_CRCNEXT_BIT

SPI_CR1_DFF_BIT

SPI_CR1_RXONLY_BIT

SPI_CR1_SSM_BIT

SPI_CR1_SSI_BIT

SPI_CR1_LSBFIRST_BIT

SPI_CR1_SPE_BIT

SPI_CR1_MSTR_BIT

SPI_CR1_CPOL_BIT

SPI_CR1_CPHA_BIT

SPI_CR1_BIDIMODE

SPI_CR1_BIDIMODE_2_LINE

SPI_CR1_BIDIMODE_1_LINE

SPI_CR1_BIDIOE

SPI_CR1_CRCEN

SPI_CR1_CRCNEXT

SPI_CR1_DFF

SPI_CR1_DFF_8_BIT

SPI_CR1_DFF_16_BIT

SPI_CR1_RXONLY

SPI_CR1_SSM

SPI_CR1_SSI

SPI_CR1_LSBFIRST

SPI_CR1_SPE

SPI_CR1_BR

SPI_CR1_BR_PCLK_DIV_2

SPI_CR1_BR_PCLK_DIV_4

SPI_CR1_BR_PCLK_DIV_8

SPI_CR1_BR_PCLK_DIV_16

SPI_CR1_BR_PCLK_DIV_32

SPI_CR1_BR_PCLK_DIV_64

SPI_CR1_BR_PCLK_DIV_128

SPI_CR1_BR_PCLK_DIV_256

SPI_CR1_MSTR

SPI_CR1_CPOL

SPI_CR1_CPOL_LOW

SPI_CR1_CPOL_HIGH

SPI_CR1_CPHA

SPI_CR2_TXEIE_BIT

SPI_CR2_RXNEIE_BIT

SPI_CR2_ERRIE_BIT

SPI_CR2_SSOE_BIT

SPI_CR2_TXDMAEN_BIT

SPI_CR2_RXDMAEN_BIT

SPI_CR2_TXEIE

SPI_CR2_RXNEIE

SPI_CR2_ERRIE

SPI_CR2_SSOE

SPI_CR2_TXDMAEN

SPI_CR2_RXDMAEN

SPI_SR_BSY_BIT

SPI_SR_OVR_BIT

SPI_SR_MODF_BIT

SPI_SR_CRCERR_BIT

SPI_SR_UDR_BIT

SPI_SR_CHSIDE_BIT

SPI_SR_TXE_BIT

SPI_SR_RXNE_BIT

SPI_SR_BSY

SPI_SR_OVR

SPI_SR_MODF

SPI_SR_CRCERR

SPI_SR_UDR

SPI_SR_CHSIDE

SPI_SR_CHSIDE_LEFT

SPI_SR_CHSIDE_RIGHT

SPI_SR_TXE

SPI_SR_RXNE

SPI_I2SCFGR_I2SMOD_BIT

SPI_I2SCFGR_I2SE_BIT

SPI_I2SCFGR_PCMSYNC_BIT

SPI_I2SCFGR_CKPOL_BIT

SPI_I2SCFGR_CHLEN_BIT

SPI_I2SCFGR_I2SMOD

SPI_I2SCFGR_I2SMOD_SPI

SPI_I2SCFGR_I2SMOD_I2S

SPI_I2SCFGR_I2SE

SPI_I2SCFGR_I2SCFG

SPI_I2SCFGR_I2SCFG_SLAVE_TX

SPI_I2SCFGR_I2SCFG_SLAVE_RX

SPI_I2SCFGR_I2SCFG_MASTER_TX

SPI_I2SCFGR_I2SCFG_MASTER_RX

SPI_I2SCFGR_PCMSYNC

SPI_I2SCFGR_PCMSYNC_SHORT

SPI_I2SCFGR_PCMSYNC_LONG

SPI_I2SCFGR_I2SSTD

SPI_I2SCFGR_I2SSTD_PHILLIPS

SPI_I2SCFGR_I2SSTD_MSB

SPI_I2SCFGR_I2SSTD_LSB

SPI_I2SCFGR_I2SSTD_PCM

SPI_I2SCFGR_CKPOL

SPI_I2SCFGR_CKPOL_LOW

SPI_I2SCFGR_CKPOL_HIGH

SPI_I2SCFGR_DATLEN

SPI_I2SCFGR_DATLEN_16_BIT

SPI_I2SCFGR_DATLEN_24_BIT

SPI_I2SCFGR_DATLEN_32_BIT

SPI_I2SCFGR_CHLEN

SPI_I2SCFGR_CHLEN_16_BIT

SPI_I2SCFGR_CHLEN_32_BIT

SPI_INTERRUPTS_ALL

Mask for all spi_interrupt values.

See:spi_interrupt

Enums
spi_mode enum

SPI mode configuration.

Determines a combination of clock polarity (CPOL), which determines idle state of the clock line, and clock phase (CPHA), which determines which clock edge triggers data capture.

Values:

  • SPI_MODE_0 -

    Clock line idles low (0), data capture on first clock transition.

  • SPI_MODE_1 -

    Clock line idles low (0), data capture on second clock transition.

  • SPI_MODE_2 -

    Clock line idles high (1), data capture on first clock transition.

  • SPI_MODE_3 -

    Clock line idles high (1), data capture on second clock transition.

spi_baud_rate enum

SPI baud rate configuration, as a divisor of f_PCLK, the PCLK clock frequency.

Values:

  • SPI_BAUD_PCLK_DIV_2 = SPI_CR1_BR_PCLK_DIV_2 -

    f_PCLK/2

  • SPI_BAUD_PCLK_DIV_4 = SPI_CR1_BR_PCLK_DIV_4 -

    f_PCLK/4

  • SPI_BAUD_PCLK_DIV_8 = SPI_CR1_BR_PCLK_DIV_8 -

    f_PCLK/8

  • SPI_BAUD_PCLK_DIV_16 = SPI_CR1_BR_PCLK_DIV_16 -

    f_PCLK/16

  • SPI_BAUD_PCLK_DIV_32 = SPI_CR1_BR_PCLK_DIV_32 -

    f_PCLK/32

  • SPI_BAUD_PCLK_DIV_64 = SPI_CR1_BR_PCLK_DIV_64 -

    f_PCLK/64

  • SPI_BAUD_PCLK_DIV_128 = SPI_CR1_BR_PCLK_DIV_128 -

    f_PCLK/128

  • SPI_BAUD_PCLK_DIV_256 = SPI_CR1_BR_PCLK_DIV_256 -

    f_PCLK/256

spi_cfg_flag enum

SPI initialization flags.

See:

spi_master_enable()

spi_slave_enable()

Values:

  • SPI_BIDIMODE = SPI_CR1_BIDIMODE -

    Bidirectional mode enable.

  • SPI_BIDIOE = SPI_CR1_BIDIOE -

    Output enable in bidirectional mode.

  • SPI_CRCEN = SPI_CR1_CRCEN -

    Cyclic redundancy check (CRC) enable.

  • SPI_DFF_8_BIT = SPI_CR1_DFF_8_BIT -

    8-bit data frame format (this is the default)

  • SPI_DFF_16_BIT = SPI_CR1_DFF_16_BIT -

    16-bit data frame format

  • SPI_RX_ONLY = SPI_CR1_RXONLY -

    Receive only.

  • SPI_SW_SLAVE = SPI_CR1_SSM -

    Software slave management.

  • SPI_SOFT_SS = SPI_CR1_SSI -

    Software (internal) slave select.

    This flag only has an effect when used in combination with SPI_SW_SLAVE.

  • SPI_FRAME_LSB = SPI_CR1_LSBFIRST -

    LSB-first (little-endian) frame format.

  • SPI_FRAME_MSB = 0 -

    MSB-first (big-endian) frame format (this is the default).

spi_interrupt enum

Available SPI interrupts.

Values:

  • SPI_TXE_INTERRUPT = SPI_CR2_TXEIE -

    TX buffer empty interrupt.

  • SPI_RXNE_INTERRUPT = SPI_CR2_RXNEIE -

    RX buffer not empty interrupt.

  • SPI_ERR_INTERRUPT = SPI_CR2_ERRIE -

    Error interrupt (CRC, overrun, and mode fault errors for SPI; underrun, overrun errors for I2S).

Functions
void spi_init(spi_dev * dev)

Initialize and reset a SPI device.

Parameters:
  • dev -

    Device to initialize and reset.

void spi_gpio_cfg(uint8 as_master, gpio_dev * nss_dev, uint8 nss_bit, gpio_dev * comm_dev, uint8 sck_bit, uint8 miso_bit, uint8 mosi_bit)

Configure GPIO bit modes for use as a SPI port’s pins.

Parameters:
  • as_master -

    If true, configure bits for use as a bus master. Otherwise, configure bits for use as slave.

  • nss_dev -

    NSS pin’s GPIO device

  • comm_dev -

    SCK, MISO, MOSI pins’ GPIO device

  • nss_bit -

    NSS pin’s GPIO bit on nss_dev

  • sck_bit -

    SCK pin’s GPIO bit on comm_dev

  • miso_bit -

    MISO pin’s GPIO bit on comm_dev

  • mosi_bit -

    MOSI pin’s GPIO bit on comm_dev

void spi_master_enable(spi_dev * dev, spi_baud_rate baud, spi_mode mode, uint32 flags)

Configure and enable a SPI device as bus master.

The device’s peripheral will be disabled before being reconfigured.

Parameters:
  • dev -

    Device to configure as bus master

  • baud -

    Bus baud rate

  • mode -

    SPI mode

  • flags -

    Logical OR of spi_cfg_flag values.

See:

spi_cfg_flag

void spi_slave_enable(spi_dev * dev, spi_mode mode, uint32 flags)

Configure and enable a SPI device as a bus slave.

The device’s peripheral will be disabled before being reconfigured.

Parameters:
  • dev -

    Device to configure as a bus slave

  • mode -

    SPI mode

  • flags -

    Logical OR of spi_cfg_flag values.

See:

spi_cfg_flag

uint32 spi_tx(spi_dev * dev, const void * buf, uint32 len)

Nonblocking SPI transmit.

Parameters:
  • dev -

    SPI port to use for transmission

  • buf -

    Buffer to transmit. The sizeof buf’s elements are inferred from dev’s data frame format (i.e., are correctly treated as 8-bit or 16-bit quantities).

  • len -

    Maximum number of elements to transmit.

Return:

Number of elements transmitted.

void spi_foreach(void(*)( spi_dev (*dev)) fn)

void spi_peripheral_enable(spi_dev * dev)

Enable a SPI peripheral.

Parameters:
  • dev -

    Device to enable

void spi_peripheral_disable(spi_dev * dev)

Disable a SPI peripheral.

Parameters:
  • dev -

    Device to disable

void spi_tx_dma_enable(spi_dev * dev)

Enable DMA requests whenever the transmit buffer is empty.

Parameters:
  • dev -

    SPI device on which to enable TX DMA requests

void spi_tx_dma_disable(spi_dev * dev)

Disable DMA requests whenever the transmit buffer is empty.

Parameters:
  • dev -

    SPI device on which to disable TX DMA requests

void spi_rx_dma_enable(spi_dev * dev)

Enable DMA requests whenever the receive buffer is empty.

Parameters:
  • dev -

    SPI device on which to enable RX DMA requests

void spi_rx_dma_disable(spi_dev * dev)

Disable DMA requests whenever the receive buffer is empty.

Parameters:
  • dev -

    SPI device on which to disable RX DMA requests

uint8 spi_is_enabled(spi_dev * dev)

Determine if a SPI peripheral is enabled.

Parameters:
  • dev -

    SPI device

Return:

True, if and only if dev’s peripheral is enabled.

void spi_peripheral_disable_all(void)

Disable all SPI peripherals.

void spi_irq_enable(spi_dev * dev, uint32 interrupt_flags)

Enable SPI interrupt requests.

Parameters:
  • dev -

    SPI device

  • interrupt_flags -

    Bitwise OR of spi_interrupt values to enable

See:

spi_interrupt

void spi_irq_disable(spi_dev * dev, uint32 interrupt_flags)

Disable SPI interrupt requests.

Parameters:
  • dev -

    SPI device

  • interrupt_flags -

    Bitwise OR of spi_interrupt values to disable

See:

spi_interrupt

spi_cfg_flag spi_dff(spi_dev * dev)

Get the data frame format flags with which a SPI port is configured.

Parameters:
  • dev -

    SPI device whose data frame format to get.

Return:

SPI_DFF_8_BIT, if dev has an 8-bit data frame format. Otherwise, SPI_DFF_16_BIT.

uint8 spi_is_rx_nonempty(spi_dev * dev)

Determine whether the device’s peripheral receive (RX) register is empty.

Parameters:
  • dev -

    SPI device

Return:

true, iff dev’s RX register is empty.

uint16 spi_rx_reg(spi_dev * dev)

Retrieve the contents of the device’s peripheral receive (RX) register.

You may only call this function when the RX register is nonempty. Calling this function clears the contents of the RX register.

Parameters:
  • dev -

    SPI device

Return:

Contents of dev’s peripheral RX register

See:

spi_is_rx_reg_nonempty()

uint8 spi_is_tx_empty(spi_dev * dev)

Determine whether the device’s peripheral transmit (TX) register is empty.

Parameters:
  • dev -

    SPI device

Return:

true, iff dev’s TX register is empty.

void spi_tx_reg(spi_dev * dev, uint16 val)

Load a value into the device’s peripheral transmit (TX) register.

You may only call this function when the TX register is empty. Calling this function loads val into the peripheral’s TX register. If the device is properly configured, this will initiate a transmission, the completion of which will cause the TX register to be empty again.

Parameters:
  • dev -

    SPI device

  • val -

    Value to load into the TX register. If the SPI data frame format is 8 bit, the value must be right-aligned.

See:

spi_is_tx_reg_empty()

spi_init()

spi_master_enable()

spi_slave_enable()

uint8 spi_is_busy(spi_dev * dev)

Determine whether the device’s peripheral busy (SPI_SR_BSY) flag is set.

Parameters:
  • dev -

    SPI device

Return:

true, iff dev’s BSY flag is set.

Variables
spi_dev * SPI1

SPI device 1.

spi_dev * SPI2

SPI device 2.

class spi_reg_map

SPI register map type.

Public Members
__io uint32 CR1

Control register 1.

__io uint32 CR2

Control register 2.

__io uint32 SR

Status register.

__io uint32 DR

Data register.

__io uint32 CRCPR

CRC polynomial register.

__io uint32 RXCRCR

RX CRC register.

__io uint32 TXCRCR

TX CRC register.

__io uint32 I2SCFGR

I2S configuration register.

__io uint32 I2SPR

I2S prescaler register.

class spi_dev

SPI device type.

Public Members
spi_reg_map * regs

Register map.

rcc_clk_id clk_id

RCC clock information.

nvic_irq_num irq_num

NVIC interrupt number.