51#define SPI_TIMEOUT 15000
81#define spi_get_pcs(chip_sel_id) ((~(1u<<(chip_sel_id)))&0xF)
490 uint32_t ul_polarity);
493 uint32_t ul_cs_behavior);
497 uint8_t uc_baudrate_divider);
501#if (SAM3S || SAM3N || SAM4S || SAM4E || SAM4N || SAM4C || SAMG || SAM4CP || SAM4CM)
511 return (Pdc *)&(p_spi->
SPI_RPR);
515#if (SAM3U || SAM3XA || SAMV71 || SAMV70 || SAME70 || SAMS70)
523static inline void *spi_get_tx_access(
Spi *p_spi)
525 return (
void *)&(p_spi->
SPI_TDR);
535static inline void *spi_get_rx_access(
Spi *p_spi)
537 return (
void *)&(p_spi->
SPI_RDR);
#define SPI_RDR_RD_Msk
(SPI_RDR) Receive Data
#define SPI_CR_SPIEN
(SPI_CR) SPI Enable
#define SPI_CR_SPIDIS
(SPI_CR) SPI Disable
#define SPI_MR_MSTR
(SPI_MR) Master/Slave Mode
#define SPI_TDR_TD(value)
#define SPI_SR_TDRE
(SPI_SR) Transmit Data Register Empty
#define SPI_SR_TXEMPTY
(SPI_SR) Transmission Registers Empty
#define SPI_MR_PS
(SPI_MR) Peripheral Select
#define SPI_CSR_CSAAT
(SPI_CSR[4]) Chip Select Active After Transfer
#define SPI_MR_PCSDEC
(SPI_MR) Chip Select Decode
#define SPI_SR_RDRF
(SPI_SR) Receive Data Register Full
#define SPI_MR_WDRBT
(SPI_MR) Wait Data Read Before Transfer
#define SPI_MR_LLB
(SPI_MR) Local Loopback Enable
#define SPI_MR_MODFDIS
(SPI_MR) Mode Fault Detection
#define SPI_CR_SWRST
(SPI_CR) SPI Software Reset
#define SPI_SR_SPIENS
(SPI_SR) SPI Enable Status
#define SPI_CR_LASTXFER
(SPI_CR) Last Transfer
#define SPI_CSR_CSNAAT
(SPI_CSR[4]) Chip Select Not Active After Transfer (Ignored if CSAAT = 1)
int16_t spi_calc_baudrate_div(const uint32_t baudrate, uint32_t mck)
Calculate the baudrate divider.
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).
void spi_set_bits_per_transfer(Spi *p_spi, uint32_t ul_pcs_ch, uint32_t ul_bits)
Set number of bits per transfer.
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.
void spi_set_clock_polarity(Spi *p_spi, uint32_t ul_pcs_ch, uint32_t ul_polarity)
Set clock default state.
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).
void spi_set_peripheral_chip_select_value(Spi *p_spi, uint32_t ul_value)
Set Peripheral Chip Select (PCS) value.
void spi_enable_clock(Spi *p_spi)
Enable SPI clock.
uint32_t spi_get_writeprotect_status(Spi *p_spi)
Indicate write protect status.
void spi_set_delay_between_chip_select(Spi *p_spi, uint32_t ul_delay)
Set delay between chip selects (in number of MCK clocks).
void spi_set_writeprotect(Spi *p_spi, uint32_t ul_enable)
Enable or disable write protection of SPI registers.
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.
void spi_set_clock_phase(Spi *p_spi, uint32_t ul_pcs_ch, uint32_t ul_phase)
Set Data Capture Phase.
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.
void spi_disable_clock(Spi *p_spi)
Disable SPI clock.
spi_cs_behavior
SPI Chip Select behavior modes while transferring.
@ SPI_CS_KEEP_LOW
CS does not rise until a new transfer is requested on different chip select.
@ SPI_CS_RISE_FORCED
CS is de-asserted systematically during a time DLYBCS.
@ SPI_CS_RISE_NO_TX
CS rises if there is no more data to transfer.
static void spi_enable(Spi *p_spi)
Enable SPI.
static uint32_t spi_is_rx_ready(Spi *p_spi)
Check if all receptions are ready.
static void spi_disable_mode_fault_detect(Spi *p_spi)
Disable Mode Fault Detection.
static uint32_t spi_get_tx_on_rx_empty_setting(Spi *p_spi)
Check if SPI waits RX_EMPTY before transfer starts.
static uint32_t spi_get_mode(Spi *p_spi)
Get SPI work mode.
static uint32_t spi_is_enabled(Spi *p_spi)
Test if the SPI is enabled.
enum spi_cs_behavior spi_cs_behavior_t
SPI Chip Select behavior modes while transferring.
static void spi_set_fixed_peripheral_select(Spi *p_spi)
Set Fixed Peripheral Select.
static void spi_enable_interrupt(Spi *p_spi, uint32_t ul_sources)
Enable SPI interrupts.
static uint32_t spi_is_tx_ready(Spi *p_spi)
Check if all transmissions are ready.
static uint16_t spi_get(Spi *p_spi)
Get one data to a SPI peripheral.
static uint32_t spi_get_peripheral_select_decode_setting(Spi *p_spi)
Get Peripheral Select Decode mode.
static void spi_reset(Spi *p_spi)
Reset SPI and set it to Slave mode.
static void spi_disable_interrupt(Spi *p_spi, uint32_t ul_sources)
Disable SPI interrupts.
static uint32_t spi_is_tx_empty(Spi *p_spi)
Check if all transmissions are complete.
static void spi_set_variable_peripheral_select(Spi *p_spi)
Set Variable Peripheral Select.
static void spi_disable_peripheral_select_decode(Spi *p_spi)
Disable Peripheral Select Decode.
static uint32_t spi_get_peripheral_select_mode(Spi *p_spi)
Get Peripheral Select mode.
static uint32_t spi_is_rx_full(Spi *p_spi)
Check if the SPI contains a received character.
static void spi_set_master_mode(Spi *p_spi)
Set SPI to Master mode.
spi_status_t
Status codes used by the SPI driver.
@ SPI_ERROR_OVERRUN_AND_MODE_FAULT
static void spi_enable_loopback(Spi *p_spi)
Enable loopback mode.
static uint32_t spi_read_status(Spi *p_spi)
Read status register.
static Pdc * spi_get_pdc_base(Spi *p_spi)
Get PDC registers base address.
static uint32_t spi_get_mode_fault_detect_setting(Spi *p_spi)
Check if mode fault detection is enabled.
static void spi_enable_tx_on_rx_empty(Spi *p_spi)
Enable waiting RX_EMPTY before transfer starts.
static void spi_enable_peripheral_select_decode(Spi *p_spi)
Enable Peripheral Select Decode.
static uint32_t spi_read_interrupt_mask(Spi *p_spi)
Read SPI interrupt mask.
static void spi_set_slave_mode(Spi *p_spi)
Set SPI to Slave mode.
static void spi_enable_mode_fault_detect(Spi *p_spi)
Enable Mode Fault Detection.
static void spi_put(Spi *p_spi, uint16_t data)
Put one data to a SPI peripheral.
static void spi_disable(Spi *p_spi)
Disable SPI.
static void spi_disable_loopback(Spi *p_spi)
Disable loopback mode.
static void spi_set_lastxfer(Spi *p_spi)
Issue a LASTXFER command.
static void spi_disable_tx_on_rx_empty(Spi *p_spi)
Disable waiting RX_EMPTY before transfer starts.
__O uint32_t SPI_IER
(Spi Offset: 0x14) Interrupt Enable Register
__IO uint32_t SPI_RPR
(Spi Offset: 0x100) Receive Pointer Register
__IO uint32_t SPI_MR
(Spi Offset: 0x04) Mode Register
__O uint32_t SPI_IDR
(Spi Offset: 0x18) Interrupt Disable Register
__O uint32_t SPI_TDR
(Spi Offset: 0x0C) Transmit Data Register
__I uint32_t SPI_IMR
(Spi Offset: 0x1C) Interrupt Mask Register
__O uint32_t SPI_CR
(Spi Offset: 0x00) Control Register
__I uint32_t SPI_SR
(Spi Offset: 0x10) Status Register
__I uint32_t SPI_RDR
(Spi Offset: 0x08) Receive Data Register