51#ifndef SPI_WPMR_WPKEY_PASSWD
52#define SPI_WPMR_WPKEY_PASSWD SPI_WPMR_WPKEY((uint32_t) 0x535049)
62#if (SAM4S || SAM3S || SAM3N || SAM3U || SAM4E || SAM4N || SAMG51|| SAMG53|| SAMG54)
64 sysclk_enable_peripheral_clock(
ID_SPI);
65#elif (SAM3XA || SAM4C || SAM4CP || SAM4CM || SAMV71 || SAMV70 || SAME70 || SAMS70)
67 sysclk_enable_peripheral_clock(ID_SPI0);
70 else if (p_spi == SPI1) {
71 sysclk_enable_peripheral_clock(ID_SPI1);
76 sysclk_enable_peripheral_clock(ID_FLEXCOM0);
79 else if (p_spi == SPI1) {
80 sysclk_enable_peripheral_clock(ID_FLEXCOM1);
84 else if (p_spi == SPI2) {
85 sysclk_enable_peripheral_clock(ID_FLEXCOM2);
89 else if (p_spi == SPI3) {
90 sysclk_enable_peripheral_clock(ID_FLEXCOM3);
94 else if (p_spi == SPI4) {
95 sysclk_enable_peripheral_clock(ID_FLEXCOM4);
99 else if (p_spi == SPI5) {
100 sysclk_enable_peripheral_clock(ID_FLEXCOM5);
104 else if (p_spi == SPI6) {
105 sysclk_enable_peripheral_clock(ID_FLEXCOM6);
109 else if (p_spi == SPI7) {
110 sysclk_enable_peripheral_clock(ID_FLEXCOM7);
114 sysclk_enable_peripheral_clock(p_spi);
125#if (SAM4S || SAM3S || SAM3N || SAM3U || SAM4E || SAM4N || SAMG51|| SAMG53|| SAMG54)
127 sysclk_disable_peripheral_clock(
ID_SPI);
128#elif (SAM3XA || SAM4C || SAM4CP || SAM4CM || SAMV71 || SAMV70 || SAME70 || SAMS70)
130 sysclk_disable_peripheral_clock(ID_SPI0);
133 else if (p_spi == SPI1) {
134 sysclk_disable_peripheral_clock(ID_SPI1);
139 sysclk_disable_peripheral_clock(ID_FLEXCOM0);
142 else if (p_spi == SPI1) {
143 sysclk_disable_peripheral_clock(ID_FLEXCOM1);
147 else if (p_spi == SPI2) {
148 sysclk_disable_peripheral_clock(ID_FLEXCOM2);
152 else if (p_spi == SPI3) {
153 sysclk_disable_peripheral_clock(ID_FLEXCOM3);
157 else if (p_spi == SPI4) {
158 sysclk_disable_peripheral_clock(ID_FLEXCOM4);
162 else if (p_spi == SPI5) {
163 sysclk_disable_peripheral_clock(ID_FLEXCOM5);
167 else if (p_spi == SPI6) {
168 sysclk_disable_peripheral_clock(ID_FLEXCOM6);
172 else if (p_spi == SPI7) {
173 sysclk_disable_peripheral_clock(ID_FLEXCOM7);
177 sysclk_disable_peripheral_clock(p_spi);
227 static uint32_t reg_value;
258 uint8_t uc_pcs, uint8_t uc_last)
291 uint32_t ul_polarity)
324 uint32_t ul_cs_behavior)
349 p_spi->
SPI_CSR[ul_pcs_ch] |= ul_bits;
364 int baud_div = div_ceil(mck, baudrate);
367 if (baud_div <= 0 || baud_div > 255) {
386 uint8_t uc_baudrate_divider)
389 if (!uc_baudrate_divider){
406 uint8_t uc_dlybs, uint8_t uc_dlybct)
424 p_spi->SPI_WPCR = SPI_WPCR_SPIWPKEY_VALUE | SPI_WPCR_SPIWPEN;
426 p_spi->SPI_WPCR = SPI_WPCR_SPIWPKEY_VALUE;
#define SPI_RDR_RD_Msk
(SPI_RDR) Receive Data
#define SPI_MR_PCS_Msk
(SPI_MR) Peripheral Chip Select
#define SPI_RDR_PCS_Msk
(SPI_RDR) Peripheral Chip Select
#define SPI_CSR_SCBR_Msk
(SPI_CSR[4]) Serial Clock Baud Rate
#define SPI_MR_DLYBCS(value)
#define SPI_CSR_DLYBS(value)
#define SPI_TDR_LASTXFER
(SPI_TDR) Last Transfer
#define SPI_TDR_TD(value)
#define SPI_CSR_SCBR(value)
#define SPI_MR_PCS(value)
#define SPI_CSR_DLYBCT(value)
#define SPI_SR_TDRE
(SPI_SR) Transmit Data Register Empty
#define SPI_MR_DLYBCS_Msk
(SPI_MR) Delay Between Chip Selects
#define SPI_CSR_BITS_Msk
(SPI_CSR[4]) Bits Per Transfer
#define SPI_CSR_DLYBS_Msk
(SPI_CSR[4]) Delay Before SPCK
#define SPI_CSR_CPOL
(SPI_CSR[4]) Clock Polarity
#define SPI_CSR_CSAAT
(SPI_CSR[4]) Chip Select Active After Transfer
#define SPI_SR_RDRF
(SPI_SR) Receive Data Register Full
#define SPI_CSR_NCPHA
(SPI_CSR[4]) Clock Phase
#define SPI_WPMR_WPEN
(SPI_WPMR) Write Protect Enable
#define SPI_TDR_PCS(value)
#define SPI_CSR_DLYBCT_Msk
(SPI_CSR[4]) Delay Between Consecutive Transfers
#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.
#define SPI_WPMR_WPKEY_PASSWD
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.
#define ID_SPI
Serial Peripheral Interface (SPI).
Serial Peripheral Interface (SPI) driver for SAM.
#define SPI_TIMEOUT
Time-out value (number of attempts).
@ 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 uint32_t spi_get_peripheral_select_mode(Spi *p_spi)
Get Peripheral Select mode.
spi_status_t
Status codes used by the SPI driver.
__IO uint32_t SPI_MR
(Spi Offset: 0x04) Mode Register
__O uint32_t SPI_TDR
(Spi Offset: 0x0C) Transmit Data Register
__IO uint32_t SPI_WPMR
(Spi Offset: 0xE4) Write Protection Control Register
__IO uint32_t SPI_CSR[4]
(Spi Offset: 0x30) Chip Select Register
__I uint32_t SPI_WPSR
(Spi Offset: 0xE8) Write Protection Status Register
__I uint32_t SPI_SR
(Spi Offset: 0x10) Status Register
__I uint32_t SPI_RDR
(Spi Offset: 0x08) Receive Data Register