SAM4SD32 (SAM4S-EK2)
Loading...
Searching...
No Matches
spi.h
Go to the documentation of this file.
1
33/*
34 * Support and FAQ: visit <a href="https://www.microchip.com/support/">Microchip Support</a>
35 */
36
37#ifndef SPI_H_INCLUDED
38#define SPI_H_INCLUDED
39
40#include "compiler.h"
41
43
44#ifdef __cplusplus
45extern "C" {
46#endif
49
51#define SPI_TIMEOUT 15000
52
64
74
81#define spi_get_pcs(chip_sel_id) ((~(1u<<(chip_sel_id)))&0xF)
82
88static inline void spi_reset(Spi *p_spi)
89{
90 p_spi->SPI_CR = SPI_CR_SWRST;
91}
92
98static inline void spi_enable(Spi *p_spi)
99{
100 p_spi->SPI_CR = SPI_CR_SPIEN;
101}
102
111static inline void spi_disable(Spi *p_spi)
112{
113 p_spi->SPI_CR = SPI_CR_SPIDIS;
114}
115
122static inline void spi_set_lastxfer(Spi *p_spi)
123{
124 p_spi->SPI_CR = SPI_CR_LASTXFER;
125}
126
132static inline void spi_set_master_mode(Spi *p_spi)
133{
134 p_spi->SPI_MR |= SPI_MR_MSTR;
135}
136
142static inline void spi_set_slave_mode(Spi *p_spi)
143{
144 p_spi->SPI_MR &= (~SPI_MR_MSTR);
145}
146
154static inline uint32_t spi_get_mode(Spi *p_spi)
155{
156 if (p_spi->SPI_MR & SPI_MR_MSTR) {
157 return 1;
158 } else {
159 return 0;
160 }
161}
162
169static inline void spi_set_variable_peripheral_select(Spi *p_spi)
170{
171 p_spi->SPI_MR |= SPI_MR_PS;
172}
173
180static inline void spi_set_fixed_peripheral_select(Spi *p_spi)
181{
182 p_spi->SPI_MR &= (~SPI_MR_PS);
183}
184
192static inline uint32_t spi_get_peripheral_select_mode(Spi *p_spi)
193{
194 if (p_spi->SPI_MR & SPI_MR_PS) {
195 return 1;
196 } else {
197 return 0;
198 }
199}
200
206static inline void spi_enable_peripheral_select_decode(Spi *p_spi)
207{
208 p_spi->SPI_MR |= SPI_MR_PCSDEC;
209}
210
217{
218 p_spi->SPI_MR &= (~SPI_MR_PCSDEC);
219}
220
228static inline uint32_t spi_get_peripheral_select_decode_setting(Spi *p_spi)
229{
230 if (p_spi->SPI_MR & SPI_MR_PCSDEC) {
231 return 1;
232 } else {
233 return 0;
234 }
235}
236
242static inline void spi_enable_mode_fault_detect(Spi *p_spi)
243{
244 p_spi->SPI_MR &= (~SPI_MR_MODFDIS);
245}
246
252static inline void spi_disable_mode_fault_detect(Spi *p_spi)
253{
254 p_spi->SPI_MR |= SPI_MR_MODFDIS;
255}
256
264static inline uint32_t spi_get_mode_fault_detect_setting(Spi *p_spi)
265{
266 if (p_spi->SPI_MR & SPI_MR_MODFDIS) {
267 return 1;
268 } else {
269 return 0;
270 }
271}
272
278static inline void spi_enable_tx_on_rx_empty(Spi *p_spi)
279{
280 p_spi->SPI_MR |= SPI_MR_WDRBT;
281}
282
288static inline void spi_disable_tx_on_rx_empty(Spi *p_spi)
289{
290 p_spi->SPI_MR &= (~SPI_MR_WDRBT);
291}
292
300static inline uint32_t spi_get_tx_on_rx_empty_setting(Spi *p_spi)
301{
302 if (p_spi->SPI_MR & SPI_MR_WDRBT) {
303 return 1;
304 } else {
305 return 0;
306 }
307}
308
314static inline void spi_enable_loopback(Spi *p_spi)
315{
316 p_spi->SPI_MR |= SPI_MR_LLB;
317}
318
324static inline void spi_disable_loopback(Spi *p_spi)
325{
326 p_spi->SPI_MR &= (~SPI_MR_LLB);
327}
328
329void spi_enable_clock(Spi *p_spi);
330void spi_disable_clock(Spi *p_spi);
331void spi_set_peripheral_chip_select_value(Spi *p_spi, uint32_t ul_value);
332void spi_set_delay_between_chip_select(Spi *p_spi, uint32_t ul_delay);
333spi_status_t spi_read(Spi *p_spi, uint16_t *us_data, uint8_t *p_pcs);
334spi_status_t spi_write(Spi *p_spi, uint16_t us_data, uint8_t uc_pcs,
335 uint8_t uc_last);
336
344static inline uint32_t spi_read_status(Spi *p_spi)
345{
346 return p_spi->SPI_SR;
347}
348
356static inline uint32_t spi_is_enabled(Spi *p_spi)
357{
358 if (p_spi->SPI_SR & SPI_SR_SPIENS) {
359 return 1;
360 } else {
361 return 0;
362 }
363}
364
372static inline void spi_put(Spi *p_spi, uint16_t data)
373{
374 p_spi->SPI_TDR = SPI_TDR_TD(data);
375}
376
383static inline uint16_t spi_get(Spi *p_spi)
384{
385 return (p_spi->SPI_RDR & SPI_RDR_RD_Msk);
386}
387
396static inline uint32_t spi_is_tx_empty(Spi *p_spi)
397{
398 if (p_spi->SPI_SR & SPI_SR_TXEMPTY) {
399 return 1;
400 } else {
401 return 0;
402 }
403}
404
413static inline uint32_t spi_is_tx_ready(Spi *p_spi)
414{
415 if (p_spi->SPI_SR & SPI_SR_TDRE) {
416 return 1;
417 } else {
418 return 0;
419 }
420}
421
429static inline uint32_t spi_is_rx_full(Spi *p_spi)
430{
431 if (p_spi->SPI_SR & SPI_SR_RDRF) {
432 return 1;
433 } else {
434 return 0;
435 }
436}
437
445static inline uint32_t spi_is_rx_ready(Spi *p_spi)
446{
447 if ((p_spi->SPI_SR & (SPI_SR_RDRF | SPI_SR_TXEMPTY))
449 return 1;
450 } else {
451 return 0;
452 }
453}
454
461static inline void spi_enable_interrupt(Spi *p_spi, uint32_t ul_sources)
462{
463 p_spi->SPI_IER = ul_sources;
464}
465
472static inline void spi_disable_interrupt(Spi *p_spi, uint32_t ul_sources)
473{
474 p_spi->SPI_IDR = ul_sources;
475}
476
484static inline uint32_t spi_read_interrupt_mask(Spi *p_spi)
485{
486 return p_spi->SPI_IMR;
487}
488
489void spi_set_clock_polarity(Spi *p_spi, uint32_t ul_pcs_ch,
490 uint32_t ul_polarity);
491void spi_set_clock_phase(Spi *p_spi, uint32_t ul_pcs_ch, uint32_t ul_phase);
492void spi_configure_cs_behavior(Spi *p_spi, uint32_t ul_pcs_ch,
493 uint32_t ul_cs_behavior);
494void spi_set_bits_per_transfer(Spi *p_spi, uint32_t ul_pcs_ch, uint32_t ul_bits);
495int16_t spi_calc_baudrate_div(const uint32_t baudrate, uint32_t mck);
496int16_t spi_set_baudrate_div(Spi *p_spi, uint32_t ul_pcs_ch,
497 uint8_t uc_baudrate_divider);
498void spi_set_transfer_delay(Spi *p_spi, uint32_t ul_pcs_ch, uint8_t uc_dlybs,
499 uint8_t uc_dlybct);
500
501#if (SAM3S || SAM3N || SAM4S || SAM4E || SAM4N || SAM4C || SAMG || SAM4CP || SAM4CM)
509static inline Pdc *spi_get_pdc_base(Spi *p_spi)
510{
511 return (Pdc *)&(p_spi->SPI_RPR);
512}
513#endif
514
515#if (SAM3U || SAM3XA || SAMV71 || SAMV70 || SAME70 || SAMS70)
523static inline void *spi_get_tx_access(Spi *p_spi)
524{
525 return (void *)&(p_spi->SPI_TDR);
526}
527
535static inline void *spi_get_rx_access(Spi *p_spi)
536{
537 return (void *)&(p_spi->SPI_RDR);
538}
539#endif
540
541void spi_set_writeprotect(Spi *p_spi, uint32_t ul_enable);
542uint32_t spi_get_writeprotect_status(Spi *p_spi);
543
545
546#ifdef __cplusplus
547}
548#endif
551
618#endif /* SPI_H_INCLUDED */
619
#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.
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
uint32_t spi_get_writeprotect_status(Spi *p_spi)
Indicate write protect status.
Definition spi.c:444
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_writeprotect(Spi *p_spi, uint32_t ul_enable)
Enable or disable write protection of SPI registers.
Definition spi.c:420
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.
Definition spi.c:224
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_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.
Definition spi.c:257
void spi_disable_clock(Spi *p_spi)
Disable SPI clock.
Definition spi.c:123
spi_cs_behavior
SPI Chip Select behavior modes while transferring.
Definition spi.h:66
@ SPI_CS_KEEP_LOW
CS does not rise until a new transfer is requested on different chip select.
Definition spi.h:68
@ SPI_CS_RISE_FORCED
CS is de-asserted systematically during a time DLYBCS.
Definition spi.h:72
@ SPI_CS_RISE_NO_TX
CS rises if there is no more data to transfer.
Definition spi.h:70
static void spi_enable(Spi *p_spi)
Enable SPI.
Definition spi.h:98
static uint32_t spi_is_rx_ready(Spi *p_spi)
Check if all receptions are ready.
Definition spi.h:445
static void spi_disable_mode_fault_detect(Spi *p_spi)
Disable Mode Fault Detection.
Definition spi.h:252
static uint32_t spi_get_tx_on_rx_empty_setting(Spi *p_spi)
Check if SPI waits RX_EMPTY before transfer starts.
Definition spi.h:300
static uint32_t spi_get_mode(Spi *p_spi)
Get SPI work mode.
Definition spi.h:154
static uint32_t spi_is_enabled(Spi *p_spi)
Test if the SPI is enabled.
Definition spi.h:356
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.
Definition spi.h:180
static void spi_enable_interrupt(Spi *p_spi, uint32_t ul_sources)
Enable SPI interrupts.
Definition spi.h:461
static uint32_t spi_is_tx_ready(Spi *p_spi)
Check if all transmissions are ready.
Definition spi.h:413
static uint16_t spi_get(Spi *p_spi)
Get one data to a SPI peripheral.
Definition spi.h:383
static uint32_t spi_get_peripheral_select_decode_setting(Spi *p_spi)
Get Peripheral Select Decode mode.
Definition spi.h:228
static void spi_reset(Spi *p_spi)
Reset SPI and set it to Slave mode.
Definition spi.h:88
static void spi_disable_interrupt(Spi *p_spi, uint32_t ul_sources)
Disable SPI interrupts.
Definition spi.h:472
static uint32_t spi_is_tx_empty(Spi *p_spi)
Check if all transmissions are complete.
Definition spi.h:396
static void spi_set_variable_peripheral_select(Spi *p_spi)
Set Variable Peripheral Select.
Definition spi.h:169
static void spi_disable_peripheral_select_decode(Spi *p_spi)
Disable Peripheral Select Decode.
Definition spi.h:216
static uint32_t spi_get_peripheral_select_mode(Spi *p_spi)
Get Peripheral Select mode.
Definition spi.h:192
static uint32_t spi_is_rx_full(Spi *p_spi)
Check if the SPI contains a received character.
Definition spi.h:429
static void spi_set_master_mode(Spi *p_spi)
Set SPI to Master mode.
Definition spi.h:132
spi_status_t
Status codes used by the SPI driver.
Definition spi.h:55
@ SPI_ERROR_OVERRUN
Definition spi.h:60
@ SPI_ERROR_MODE_FAULT
Definition spi.h:61
@ SPI_OK
Definition spi.h:57
@ SPI_ERROR_ARGUMENT
Definition spi.h:59
@ SPI_ERROR_OVERRUN_AND_MODE_FAULT
Definition spi.h:62
@ SPI_ERROR
Definition spi.h:56
@ SPI_ERROR_TIMEOUT
Definition spi.h:58
static void spi_enable_loopback(Spi *p_spi)
Enable loopback mode.
Definition spi.h:314
static uint32_t spi_read_status(Spi *p_spi)
Read status register.
Definition spi.h:344
static Pdc * spi_get_pdc_base(Spi *p_spi)
Get PDC registers base address.
Definition spi.h:509
static uint32_t spi_get_mode_fault_detect_setting(Spi *p_spi)
Check if mode fault detection is enabled.
Definition spi.h:264
static void spi_enable_tx_on_rx_empty(Spi *p_spi)
Enable waiting RX_EMPTY before transfer starts.
Definition spi.h:278
static void spi_enable_peripheral_select_decode(Spi *p_spi)
Enable Peripheral Select Decode.
Definition spi.h:206
static uint32_t spi_read_interrupt_mask(Spi *p_spi)
Read SPI interrupt mask.
Definition spi.h:484
static void spi_set_slave_mode(Spi *p_spi)
Set SPI to Slave mode.
Definition spi.h:142
static void spi_enable_mode_fault_detect(Spi *p_spi)
Enable Mode Fault Detection.
Definition spi.h:242
static void spi_put(Spi *p_spi, uint16_t data)
Put one data to a SPI peripheral.
Definition spi.h:372
static void spi_disable(Spi *p_spi)
Disable SPI.
Definition spi.h:111
static void spi_disable_loopback(Spi *p_spi)
Disable loopback mode.
Definition spi.h:324
static void spi_set_lastxfer(Spi *p_spi)
Issue a LASTXFER command.
Definition spi.h:122
static void spi_disable_tx_on_rx_empty(Spi *p_spi)
Disable waiting RX_EMPTY before transfer starts.
Definition spi.h:288
Spi hardware registers.
__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