SAM4SD32 (SAM4S-EK2)
Loading...
Searching...
No Matches
Quickstart guide for SAM SPI driver

This is the quickstart guide for the SAM SPI driver, with step-by-step instructions on how to configure and use the driver in a selection of use cases.

The use cases contain several code fragments. The code fragments in the steps for setup can be copied into a custom initialization function, while the steps for usage can be copied into, e.g.the main application function.

Basic use case

In this basic use case, the SPI module are configured for:

  • Master mode
  • Interrupt-based handling

Prerequisites

  1. System Clock Management (Sysclock)

Setup steps

Example code

Add to application C-file:

void spi_master_init(Spi *p_spi)
{
spi_reset(p_spi);
spi_get_pcs(DEFAULT_CHIP_ID));
spi_set_delay_between_chip_select(p_spi, CONFIG_SPI_MASTER_DELAY_BCS);
}
void spi_master_setup_device(Spi *p_spi, struct spi_device *device,
spi_flags_t flags, uint32_t baud_rate, board_spi_select_id_t sel_id)
{
spi_set_transfer_delay(p_spi, device->id, CONFIG_SPI_MASTER_DELAY_BS,
CONFIG_SPI_MASTER_DELAY_BCT);
spi_set_bits_per_transfer(p_spi, device->id, CONFIG_SPI_MASTER_BITS_PER_TRANSFER);
spi_set_baudrate_div(p_spi, device->id,
spi_calc_baudrate_div(baud_rate, sysclk_get_peripheral_hz()));
spi_set_clock_polarity(p_spi, device->id, flags >> 1);
spi_set_clock_phase(p_spi, device->id, ((flags & 0x1) ^ 0x1));
}
int16_t spi_calc_baudrate_div(const uint32_t baudrate, uint32_t mck)
Calculate the baudrate divider.
Definition spi.c:362
int16_t spi_set_baudrate_div(Spi *p_spi, uint32_t ul_pcs_ch, uint8_t uc_baudrate_divider)
Set Serial Clock Baud Rate divider value (SCBR).
Definition spi.c:385
void spi_set_bits_per_transfer(Spi *p_spi, uint32_t ul_pcs_ch, uint32_t ul_bits)
Set number of bits per transfer.
Definition spi.c:345
void spi_set_transfer_delay(Spi *p_spi, uint32_t ul_pcs_ch, uint8_t uc_dlybs, uint8_t uc_dlybct)
Configure timing for SPI transfer.
Definition spi.c:405
void spi_set_clock_polarity(Spi *p_spi, uint32_t ul_pcs_ch, uint32_t ul_polarity)
Set clock default state.
Definition spi.c:290
void spi_configure_cs_behavior(Spi *p_spi, uint32_t ul_pcs_ch, uint32_t ul_cs_behavior)
Configure CS behavior for SPI transfer (spi_cs_behavior_t).
Definition spi.c:323
void spi_set_peripheral_chip_select_value(Spi *p_spi, uint32_t ul_value)
Set Peripheral Chip Select (PCS) value.
Definition spi.c:193
void spi_enable_clock(Spi *p_spi)
Enable SPI clock.
Definition spi.c:60
void spi_set_delay_between_chip_select(Spi *p_spi, uint32_t ul_delay)
Set delay between chip selects (in number of MCK clocks).
Definition spi.c:206
void spi_set_clock_phase(Spi *p_spi, uint32_t ul_pcs_ch, uint32_t ul_phase)
Set Data Capture Phase.
Definition spi.c:307
@ SPI_CS_KEEP_LOW
CS does not rise until a new transfer is requested on different chip select.
Definition spi.h:68
static void spi_disable_mode_fault_detect(Spi *p_spi)
Disable Mode Fault Detection.
Definition spi.h:252
static void spi_set_fixed_peripheral_select(Spi *p_spi)
Set Fixed Peripheral Select.
Definition spi.h:180
static void spi_reset(Spi *p_spi)
Reset SPI and set it to Slave mode.
Definition spi.h:88
static void spi_disable_peripheral_select_decode(Spi *p_spi)
Disable Peripheral Select Decode.
Definition spi.h:216
static void spi_set_master_mode(Spi *p_spi)
Set SPI to Master mode.
Definition spi.h:132
#define spi_get_pcs(chip_sel_id)
Generate Peripheral Chip Select Value from Chip Select ID.
Definition spi.h:81
static void spi_disable_loopback(Spi *p_spi)
Disable loopback mode.
Definition spi.h:324
Spi hardware registers.

Workflow

  1. Initialize the SPI in master mode:
    • void spi_master_init(SPI_EXAMPLE);
  2. Set up an SPI device:
    • void spi_master_setup_device(SPI_EXAMPLE, &SPI_DEVICE_EXAMPLE,
      SPI_MODE_0, SPI_EXAMPLE_BAUDRATE, 0);
      #define SPI_MODE_0
      SPI mode definition.
      Definition usart.h:70
    • Note
      The returned device descriptor structure must be passed to the driver whenever that device should be used as current slave device.
  3. Enable SPI module: