Microchip® Advanced Software Framework

spi.h File Reference

Serial Peripheral Interface (SPI) driver for SAM.

Copyright (c) 2011-2018 Microchip Technology Inc. and its subsidiaries.

#include "compiler.h"

Macros

#define spi_get_pcs(chip_sel_id)   ((~(1u<<(chip_sel_id)))&0xF)
 Generate Peripheral Chip Select Value from Chip Select ID. More...
 
#define SPI_TIMEOUT   15000
 Time-out value (number of attempts). More...
 

Typedefs

typedef enum spi_cs_behavior spi_cs_behavior_t
 SPI Chip Select behavior modes while transferring. More...
 

Enumerations

enum  spi_cs_behavior {
  SPI_CS_KEEP_LOW = SPI_CSR_CSAAT,
  SPI_CS_RISE_NO_TX = 0,
  SPI_CS_RISE_FORCED = SPI_CSR_CSNAAT
}
 SPI Chip Select behavior modes while transferring. More...
 
enum  spi_status_t {
  SPI_ERROR = -1,
  SPI_OK = 0,
  SPI_ERROR_TIMEOUT = 1,
  SPI_ERROR_ARGUMENT,
  SPI_ERROR_OVERRUN,
  SPI_ERROR_MODE_FAULT,
  SPI_ERROR_OVERRUN_AND_MODE_FAULT
}
 Status codes used by the SPI driver. More...
 

Functions

int16_t spi_calc_baudrate_div (const uint32_t baudrate, uint32_t mck)
 Calculate the baudrate divider. More...
 
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). More...
 
static void spi_disable (Spi *p_spi)
 Disable SPI. More...
 
void spi_disable_clock (Spi *p_spi)
 Disable SPI clock. More...
 
static void spi_disable_interrupt (Spi *p_spi, uint32_t ul_sources)
 Disable SPI interrupts. More...
 
static void spi_disable_loopback (Spi *p_spi)
 Disable loopback mode. More...
 
static void spi_disable_mode_fault_detect (Spi *p_spi)
 Disable Mode Fault Detection. More...
 
static void spi_disable_peripheral_select_decode (Spi *p_spi)
 Disable Peripheral Select Decode. More...
 
static void spi_disable_tx_on_rx_empty (Spi *p_spi)
 Disable waiting RX_EMPTY before transfer starts. More...
 
static void spi_enable (Spi *p_spi)
 Enable SPI. More...
 
void spi_enable_clock (Spi *p_spi)
 Enable SPI clock. More...
 
static void spi_enable_interrupt (Spi *p_spi, uint32_t ul_sources)
 Enable SPI interrupts. More...
 
static void spi_enable_loopback (Spi *p_spi)
 Enable loopback mode. More...
 
static void spi_enable_mode_fault_detect (Spi *p_spi)
 Enable Mode Fault Detection. More...
 
static void spi_enable_peripheral_select_decode (Spi *p_spi)
 Enable Peripheral Select Decode. More...
 
static void spi_enable_tx_on_rx_empty (Spi *p_spi)
 Enable waiting RX_EMPTY before transfer starts. More...
 
static uint16_t spi_get (Spi *p_spi)
 Get one data to a SPI peripheral. More...
 
static uint32_t spi_get_mode (Spi *p_spi)
 Get SPI work mode. More...
 
static uint32_t spi_get_mode_fault_detect_setting (Spi *p_spi)
 Check if mode fault detection is enabled. More...
 
static uint32_t spi_get_peripheral_select_decode_setting (Spi *p_spi)
 Get Peripheral Select Decode mode. More...
 
static uint32_t spi_get_peripheral_select_mode (Spi *p_spi)
 Get Peripheral Select mode. More...
 
static uint32_t spi_get_tx_on_rx_empty_setting (Spi *p_spi)
 Check if SPI waits RX_EMPTY before transfer starts. More...
 
uint32_t spi_get_writeprotect_status (Spi *p_spi)
 Indicate write protect status. More...
 
static uint32_t spi_is_enabled (Spi *p_spi)
 Test if the SPI is enabled. More...
 
static uint32_t spi_is_rx_full (Spi *p_spi)
 Check if the SPI contains a received character. More...
 
static uint32_t spi_is_rx_ready (Spi *p_spi)
 Check if all receptions are ready. More...
 
static uint32_t spi_is_tx_empty (Spi *p_spi)
 Check if all transmissions are complete. More...
 
static uint32_t spi_is_tx_ready (Spi *p_spi)
 Check if all transmissions are ready. More...
 
static void spi_put (Spi *p_spi, uint16_t data)
 Put one data to a SPI peripheral. More...
 
spi_status_t spi_read (Spi *p_spi, uint16_t *us_data, uint8_t *p_pcs)
 Read the received data and it's peripheral chip select value. More...
 
static uint32_t spi_read_interrupt_mask (Spi *p_spi)
 Read SPI interrupt mask. More...
 
static uint32_t spi_read_status (Spi *p_spi)
 Read status register. More...
 
static void spi_reset (Spi *p_spi)
 Reset SPI and set it to Slave mode. More...
 
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). More...
 
void spi_set_bits_per_transfer (Spi *p_spi, uint32_t ul_pcs_ch, uint32_t ul_bits)
 Set number of bits per transfer. More...
 
void spi_set_clock_phase (Spi *p_spi, uint32_t ul_pcs_ch, uint32_t ul_phase)
 Set Data Capture Phase. More...
 
void spi_set_clock_polarity (Spi *p_spi, uint32_t ul_pcs_ch, uint32_t ul_polarity)
 Set clock default state. More...
 
void spi_set_delay_between_chip_select (Spi *p_spi, uint32_t ul_delay)
 Set delay between chip selects (in number of MCK clocks). More...
 
static void spi_set_fixed_peripheral_select (Spi *p_spi)
 Set Fixed Peripheral Select. More...
 
static void spi_set_lastxfer (Spi *p_spi)
 Issue a LASTXFER command. More...
 
static void spi_set_master_mode (Spi *p_spi)
 Set SPI to Master mode. More...
 
void spi_set_peripheral_chip_select_value (Spi *p_spi, uint32_t ul_value)
 Set Peripheral Chip Select (PCS) value. More...
 
static void spi_set_slave_mode (Spi *p_spi)
 Set SPI to Slave mode. More...
 
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. More...
 
static void spi_set_variable_peripheral_select (Spi *p_spi)
 Set Variable Peripheral Select. More...
 
void spi_set_writeprotect (Spi *p_spi, uint32_t ul_enable)
 Enable or disable write protection of SPI registers. More...
 
spi_status_t spi_write (Spi *p_spi, uint16_t us_data, uint8_t uc_pcs, uint8_t uc_last)
 Write the transmitted data with specified peripheral chip select value. More...
 

#define spi_get_pcs (   chip_sel_id)    ((~(1u<<(chip_sel_id)))&0xF)

Generate Peripheral Chip Select Value from Chip Select ID.

Note
When chip select n is working, PCS bit n is set to low level.
Parameters
chip_sel_idThe chip select number used
#define SPI_TIMEOUT   15000

Time-out value (number of attempts).

Referenced by spi_read(), spi_read_packet(), spi_transceive_packet(), spi_write(), and spi_write_packet().

SPI Chip Select behavior modes while transferring.

SPI Chip Select behavior modes while transferring.

Enumerator
SPI_CS_KEEP_LOW 

CS does not rise until a new transfer is requested on different chip select.

SPI_CS_RISE_NO_TX 

CS rises if there is no more data to transfer.

SPI_CS_RISE_FORCED 

CS is de-asserted systematically during a time DLYBCS.

Status codes used by the SPI driver.

Enumerator
SPI_ERROR 
SPI_OK 
SPI_ERROR_TIMEOUT 
SPI_ERROR_ARGUMENT 
SPI_ERROR_OVERRUN 
SPI_ERROR_MODE_FAULT 
SPI_ERROR_OVERRUN_AND_MODE_FAULT 

static void spi_disable ( Spi *  p_spi)
inlinestatic

Disable SPI.

Note
CS is de-asserted, which indicates that the last data is done, and user should check TX_EMPTY before disabling SPI.
Parameters
p_spiPointer to an SPI instance.

Referenced by run_spi_trans_test(), spi_master_initialize(), spi_slave_initialize(), and trx_spi_disable().

static void spi_disable_interrupt ( Spi *  p_spi,
uint32_t  ul_sources 
)
inlinestatic

Disable SPI interrupts.

Parameters
p_spiPointer to an SPI instance.
ul_sourcesInterrupts to be disabled.

Referenced by CONF_TEST_SPI_HANDLER(), run_spi_trans_test(), and SPI_Handler().

static void spi_disable_loopback ( Spi *  p_spi)
inlinestatic

Disable loopback mode.

Parameters
p_spiPointer to an SPI instance.

Referenced by run_spi_trans_test(), and spi_master_init().

static void spi_disable_mode_fault_detect ( Spi *  p_spi)
inlinestatic

Disable Mode Fault Detection.

Parameters
p_spiPointer to an SPI instance.

Referenced by run_spi_trans_test(), spi_master_init(), spi_master_initialize(), and spi_slave_initialize().

static void spi_disable_peripheral_select_decode ( Spi *  p_spi)
inlinestatic

Disable Peripheral Select Decode.

Parameters
p_spiPointer to an SPI instance.

Referenced by spi_master_init().

static void spi_disable_tx_on_rx_empty ( Spi *  p_spi)
inlinestatic

Disable waiting RX_EMPTY before transfer starts.

Parameters
p_spiPointer to an SPI instance.
static void spi_enable ( Spi *  p_spi)
inlinestatic
static void spi_enable_interrupt ( Spi *  p_spi,
uint32_t  ul_sources 
)
inlinestatic

Enable SPI interrupts.

Parameters
p_spiPointer to an SPI instance.
ul_sourcesInterrupts to be enabled.

Referenced by run_spi_trans_test(), SPI_Handler(), and spi_slave_initialize().

static void spi_enable_loopback ( Spi *  p_spi)
inlinestatic

Enable loopback mode.

Parameters
p_spiPointer to an SPI instance.

Referenced by run_spi_trans_test().

static void spi_enable_mode_fault_detect ( Spi *  p_spi)
inlinestatic

Enable Mode Fault Detection.

Parameters
p_spiPointer to an SPI instance.
static void spi_enable_peripheral_select_decode ( Spi *  p_spi)
inlinestatic

Enable Peripheral Select Decode.

Parameters
p_spiPointer to an SPI instance.
static void spi_enable_tx_on_rx_empty ( Spi *  p_spi)
inlinestatic

Enable waiting RX_EMPTY before transfer starts.

Parameters
p_spiPointer to an SPI instance.
static uint16_t spi_get ( Spi *  p_spi)
inlinestatic

Get one data to a SPI peripheral.

Parameters
p_spiBase address of the SPI instance.
Returns
The data byte

Referenced by spi_read_single().

static uint32_t spi_get_mode ( Spi *  p_spi)
inlinestatic

Get SPI work mode.

Parameters
p_spiPointer to an SPI instance.
Returns
1 for master mode, 0 for slave mode.
static uint32_t spi_get_mode_fault_detect_setting ( Spi *  p_spi)
inlinestatic

Check if mode fault detection is enabled.

Parameters
p_spiPointer to an SPI instance.
Returns
1 for disabled, 0 for enabled.
static uint32_t spi_get_peripheral_select_decode_setting ( Spi *  p_spi)
inlinestatic

Get Peripheral Select Decode mode.

Parameters
p_spiPointer to an SPI instance.
Returns
1 for decode mode, 0 for direct mode.

Referenced by spi_select_device().

static uint32_t spi_get_peripheral_select_mode ( Spi *  p_spi)
inlinestatic

Get Peripheral Select mode.

Parameters
p_spiPointer to an SPI instance.
Returns
1 for Variable mode, 0 for fixed mode.

Referenced by spi_read(), and spi_write().

static uint32_t spi_get_tx_on_rx_empty_setting ( Spi *  p_spi)
inlinestatic

Check if SPI waits RX_EMPTY before transfer starts.

Parameters
p_spiPointer to an SPI instance.
Returns
1 for SPI waits, 0 for no wait.
static uint32_t spi_is_enabled ( Spi *  p_spi)
inlinestatic

Test if the SPI is enabled.

Parameters
p_spiPointer to an SPI instance.
Returns
1 if the SPI is enabled, otherwise 0.

Referenced by at45dbx_spi_init(), and run_spi_ctrl_test().

static uint32_t spi_is_rx_full ( Spi *  p_spi)
inlinestatic

Check if the SPI contains a received character.

Parameters
p_spiPointer to an SPI instance.
Returns
1 if the SPI Receive Holding Register is full, otherwise 0.
static uint32_t spi_is_rx_ready ( Spi *  p_spi)
inlinestatic

Check if all receptions are ready.

Parameters
p_spiPointer to an SPI instance.
Returns
1 if the SPI Receiver is ready, otherwise 0.

Referenced by spi_read_packet(), and spi_transceive_packet().

static uint32_t spi_is_tx_empty ( Spi *  p_spi)
inlinestatic

Check if all transmissions are complete.

Parameters
p_spiPointer to an SPI instance.
Return values
1if transmissions are complete.
0if transmissions are not complete.

Referenced by spi_deselect_device(), trx_aes_wrrd(), trx_sram_read(), and trx_sram_write().

static uint32_t spi_is_tx_ready ( Spi *  p_spi)
inlinestatic

Check if all transmissions are ready.

Parameters
p_spiPointer to an SPI instance.
Return values
1if transmissions are complete.
0if transmissions are not complete.

Referenced by spi_read_packet(), spi_transceive_packet(), and spi_write_packet().

static void spi_put ( Spi *  p_spi,
uint16_t  data 
)
inlinestatic

Put one data to a SPI peripheral.

Parameters
p_spiBase address of the SPI instance.
dataThe data byte to be loaded

Referenced by spi_write_single().

static uint32_t spi_read_interrupt_mask ( Spi *  p_spi)
inlinestatic

Read SPI interrupt mask.

Parameters
p_spiPointer to an SPI instance.
Returns
The interrupt mask value.

Referenced by SPI_Handler().

static uint32_t spi_read_status ( Spi *  p_spi)
inlinestatic

Read status register.

Parameters
p_spiPointer to an SPI instance.
Returns
SPI status register value.

Referenced by CONF_TEST_SPI_HANDLER(), SPI_Handler(), and spi_master_transfer().

static void spi_reset ( Spi *  p_spi)
inlinestatic

Reset SPI and set it to Slave mode.

Parameters
p_spiPointer to an SPI instance.

Referenced by run_spi_ctrl_test(), run_spi_trans_test(), spi_master_init(), spi_master_initialize(), and spi_slave_initialize().

static void spi_set_fixed_peripheral_select ( Spi *  p_spi)
inlinestatic

Set Fixed Peripheral Select.

Peripheral Chip Select is controlled by SPI_MR.

Parameters
p_spiPointer to an SPI instance.

Referenced by spi_master_init().

static void spi_set_lastxfer ( Spi *  p_spi)
inlinestatic

Issue a LASTXFER command.

The next transfer is the last transfer and after that CS is de-asserted.

Parameters
p_spiPointer to an SPI instance.

Referenced by run_spi_trans_test(), spi_deselect_device(), and spi_master_initialize().

static void spi_set_master_mode ( Spi *  p_spi)
inlinestatic

Set SPI to Master mode.

Parameters
p_spiPointer to an SPI instance.

Referenced by run_spi_trans_test(), spi_master_init(), and spi_master_initialize().

static void spi_set_slave_mode ( Spi *  p_spi)
inlinestatic

Set SPI to Slave mode.

Parameters
p_spiPointer to an SPI instance.

Referenced by spi_slave_initialize().

static void spi_set_variable_peripheral_select ( Spi *  p_spi)
inlinestatic

Set Variable Peripheral Select.

Peripheral Chip Select can be controlled by SPI_TDR.

Parameters
p_spiPointer to an SPI instance.

Referenced by run_spi_trans_test().