Microchip® Advanced Software Framework

 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Serial Peripheral Interface (SPI)

See Quickstart guide for SAM SPI driver.

The SPI circuit is a synchronous serial data link that provides communication with external devices in Master or Slave mode. Connection to Peripheral DMA Controller channel capabilities optimizes data transfers.

Macros

#define SPI_WPMR_WPKEY_PASSWD   SPI_WPMR_WPKEY((uint32_t) 0x535049)
 

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...
 
void spi_disable_clock (Spi *p_spi)
 Disable SPI clock. More...
 
void spi_enable_clock (Spi *p_spi)
 Enable SPI clock. More...
 
uint32_t spi_get_writeprotect_status (Spi *p_spi)
 Indicate write protect status. 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...
 
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...
 
void spi_set_peripheral_chip_select_value (Spi *p_spi, uint32_t ul_value)
 Set Peripheral Chip Select (PCS) value. 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...
 
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_WPMR_WPKEY_PASSWD   SPI_WPMR_WPKEY((uint32_t) 0x535049)

Referenced by spi_set_writeprotect().

int16_t spi_calc_baudrate_div ( const uint32_t  baudrate,
uint32_t  mck 
)

Calculate the baudrate divider.

Parameters
baudrateBaudrate value.
mckSPI module input clock frequency (MCK clock, Hz).
Returns
Divider or error code.
Return values
>0 Success.
<0 Error.

References div_ceil.

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).

Parameters
p_spiPointer to an SPI instance.
ul_pcs_chPeripheral Chip Select channel (0~3).
ul_cs_behaviorBehavior of the Chip Select after transfer.

References SPI_CS_KEEP_LOW, SPI_CS_RISE_FORCED, and SPI_CS_RISE_NO_TX.

void spi_disable_clock ( Spi *  p_spi)

Disable SPI clock.

Parameters
p_spiPointer to an SPI instance.

References sysclk_disable_peripheral_clock(), and UNUSED.

void spi_enable_clock ( Spi *  p_spi)

Enable SPI clock.

Parameters
p_spiPointer to an SPI instance.

References sysclk_enable_peripheral_clock(), and UNUSED.

Referenced by nm_bus_init().

uint32_t spi_get_writeprotect_status ( Spi *  p_spi)

Indicate write protect status.

Parameters
p_spiPointer to an SPI instance.
Returns
SPI_WPSR value.
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.

While SPI works in fixed peripheral select mode, the peripheral chip select value is meaningless.

Parameters
p_spiPointer to an SPI instance.
dataPointer to the location where to store the received data word.
p_pcsPointer to fill Peripheral Chip Select Value.
Return values
SPI_OKon Success.
SPI_ERROR_TIMEOUTon Time-out.

References SPI_ERROR_TIMEOUT, spi_get_peripheral_select_mode(), SPI_OK, and SPI_TIMEOUT.

Referenced by spi_rw().

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).

Parameters
p_spiPointer to an SPI instance.
ul_pcs_chPeripheral Chip Select channel (0~3).
uc_baudrate_dividerBaudrate divider from MCK.
Returns
Return values
is0 Success.
is-1 Error.

Referenced by nm_bus_init().

void spi_set_bits_per_transfer ( Spi *  p_spi,
uint32_t  ul_pcs_ch,
uint32_t  ul_bits 
)

Set number of bits per transfer.

Parameters
p_spiPointer to an SPI instance.
ul_pcs_chPeripheral Chip Select channel (0~3).
ul_bitsNumber of bits (8~16), use the pattern defined in the device header file.

Referenced by nm_bus_init().

void spi_set_clock_phase ( Spi *  p_spi,
uint32_t  ul_pcs_ch,
uint32_t  ul_phase 
)

Set Data Capture Phase.

Parameters
p_spiPointer to an SPI instance.
ul_pcs_chPeripheral Chip Select channel (0~3).
ul_phaseData capture on the rising/falling edge of clock.

Referenced by nm_bus_init().

void spi_set_clock_polarity ( Spi *  p_spi,
uint32_t  ul_pcs_ch,
uint32_t  ul_polarity 
)

Set clock default state.

Parameters
p_spiPointer to an SPI instance.
ul_pcs_chPeripheral Chip Select channel (0~3).
ul_polarityDefault clock state is logical one(high)/zero(low).

Referenced by nm_bus_init().

void spi_set_delay_between_chip_select ( Spi *  p_spi,
uint32_t  ul_delay 
)

Set delay between chip selects (in number of MCK clocks).

If DLYBCS <= 6, 6 MCK clocks will be inserted by default.

Parameters
p_spiPointer to an SPI instance.
ul_delayDelay between chip selects (in number of MCK clocks).
void spi_set_peripheral_chip_select_value ( Spi *  p_spi,
uint32_t  ul_value 
)

Set Peripheral Chip Select (PCS) value.

Parameters
p_spiPointer to an SPI instance.
ul_valuePeripheral Chip Select value. If PCS decode mode is not used, use spi_get_pcs to build the value to use. On reset the decode mode is not enabled. The decode mode can be enabled/disabled by follow functions: spi_enable_peripheral_select_decode, spi_disable_peripheral_select_decode.

Referenced by nm_bus_init().

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.

Parameters
p_spiPointer to an SPI instance.
ul_pcs_chPeripheral Chip Select channel (0~3).
uc_dlybsDelay before SPCK (in number of MCK clocks).
uc_dlybctDelay between consecutive transfers (in number of MCK clocks).

Referenced by nm_bus_init().

void spi_set_writeprotect ( Spi *  p_spi,
uint32_t  ul_enable 
)

Enable or disable write protection of SPI registers.

Parameters
p_spiPointer to an SPI instance.
ul_enable1 to enable, 0 to disable.

References SPI_WPMR_WPKEY_PASSWD.

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.

Parameters
p_spiPointer to an SPI instance.
us_dataThe data to transmit.
uc_pcsPeripheral Chip Select Value while SPI works in peripheral select mode, otherwise it's meaningless.
uc_lastIndicate whether this data is the last one while SPI is working in variable peripheral select mode.
Return values
SPI_OKon Success.
SPI_ERROR_TIMEOUTon Time-out.

References SPI_ERROR_TIMEOUT, spi_get_peripheral_select_mode(), SPI_OK, and SPI_TIMEOUT.

Referenced by spi_rw().