microHAL
An abstraction layer for your future F4xx projects
Loading...
Searching...
No Matches
spi.h
Go to the documentation of this file.
1
15/* -- Includes -- */
16#include <stdint.h>
17#include "stm32f4xx.h"
18#include "defines.h"
19
20/* -- Structs -- */
24struct __attribute__((packed)) SPIRegs {
25 REG32 CR1;
26 REG32 CR2;
27 REG32 SR;
28 REG32 DR;
29 REG32 CRCPR;
30 REG32 RXCRCR;
31 REG32 TXCRCR;
32 REG32 I2SCFGR;
33 REG32 I2SPR;
34};
35
36_Static_assert((sizeof(struct SPIRegs)) == (sizeof(uint32_t) * 9U),
37 "SPI Register struct size mismatch. Is it aligned?");
38
39#define SPI(ADDR) (struct SPIRegs *)(ADDR);
40
44struct __attribute__((packed)) SPIISR {
45 _Bool ERR : 1;
46 _Bool RXNE : 1;
47 _Bool TXE : 1;
48};
49
50_Static_assert((sizeof(struct SPIISR)) == (sizeof(uint8_t) * 1U),
51 "SPI ISR struct size mismatch. Is it aligned?");
52
56struct __attribute__((packed)) SPIConfig {
57 /* Data */
58 _Bool Use16Bits : 1;
59 _Bool LSBFirst : 1;
60 _Bool TIMode : 1;
61 /* CRC */
62 _Bool UseCRC : 1;
63 uint16_t CRCPoly;
64};
65
66_Static_assert((sizeof(struct SPIConfig)) == (sizeof(uint8_t) * 3U),
67 "SPI Config struct size mismatch. Is it aligned?");
68
69/* -- Enums -- */
73typedef enum spi_peripheral {
74#ifdef SPI1_BASE
75 SPI_PERIPH_1 = 0x0,
76#endif
77#ifdef SPI2_BASE
78 SPI_PERIPH_2,
79#endif
80#ifdef SPI3_BASE
81 SPI_PERIPH_3,
82#endif
83#ifdef SPI4_BASE
84 SPI_PERIPH_4,
85#endif
86#ifdef SPI5_BASE
87 SPI_PERIPH_5,
88#endif
89#ifdef SPI6_BASE
90 SPI_PERIPH_6,
91#endif
92 SPI_PERIPH_LEN
94
98typedef enum spi_communication {
99 SPI_COMM_FULLDUPLEX = 0x0,
100 SPI_COMM_HALFDUPLEX_RX,
101 SPI_COMM_HALFDUPLEX_TX,
102 SPI_COMM_SIMPLEX_RX,
103 SPI_COMM_SIMPLEX_TX
105
109typedef enum spi_nss_mode {
110 SPI_NSS_SOFT = 0x0,
111 SPI_NSS_HARD_OE,
112 SPI_NSS_HARD_OD
114
118typedef enum spi_prescaler {
119 SPI_PRESC_DIV2 = 0x0,
120 SPI_PRESC_DIV4,
121 SPI_PRESC_DIV8,
122 SPI_PRESC_DIV16,
123 SPI_PRESC_DIV32,
124 SPI_PRESC_DIV64,
125 SPI_PRESC_DIV128,
126 SPI_PRESC_DIV256
128
139void spi_set_interrupts(const spi_peripheral_t spi, const struct SPIISR config);
140
154 const spi_communication_t com,
155 const spi_nss_mode_t nss);
156
172void spi_configure_clk(const spi_peripheral_t spi, const spi_prescaler_t div,
173 _Bool polarity, _Bool phase);
174
182void spi_set_ssi_state(const spi_peripheral_t spi, const _Bool state);
183
192void spi_set_dma(const spi_peripheral_t spi, const _Bool forTX,
193 const _Bool forRX);
194
207 const struct SPIConfig config);
208
221void spi_tx_data(const spi_peripheral_t spi, const uint16_t data);
222
233uint16_t spi_rx_data(const spi_peripheral_t spi);
234
244uint16_t spi_trx_data(const spi_peripheral_t spi, const uint16_t data);
245
253void spi_start(const spi_peripheral_t spi, const _Bool master);
254
261void spi_stop(const spi_peripheral_t spi);
Defines used commonly in most files.
spi_peripheral
Available SPI peripherals.
Definition spi.h:73
enum spi_nss_mode spi_nss_mode_t
Available SPI NSS pin modes.
void spi_stop(const spi_peripheral_t spi)
Stops the SPI peripheral communication.
Definition spi.c:251
void spi_configure_communication(const spi_peripheral_t spi, const spi_communication_t com, const spi_nss_mode_t nss)
Configures the SPI communication / wiring.
Definition spi.c:68
uint16_t spi_rx_data(const spi_peripheral_t spi)
Reads the received SPI data.
Definition spi.c:209
void spi_configure_options(const spi_peripheral_t spi, const struct SPIConfig config)
Set SPI options from specified config.
Definition spi.c:167
uint16_t spi_trx_data(const spi_peripheral_t spi, const uint16_t data)
Transmit data, receive answer.
Definition spi.c:221
enum spi_communication spi_communication_t
Available SPI communication modes.
void spi_set_dma(const spi_peripheral_t spi, const _Bool forTX, const _Bool forRX)
Enables DMA for SPI RX and/or TX.
Definition spi.c:151
enum spi_peripheral spi_peripheral_t
Available SPI peripherals.
void spi_set_ssi_state(const spi_peripheral_t spi, const _Bool state)
Sets the internal SS to the desired state.
Definition spi.c:136
void spi_configure_clk(const spi_peripheral_t spi, const spi_prescaler_t div, _Bool polarity, _Bool phase)
Configures the SPI prescale divider.
Definition spi.c:106
void spi_start(const spi_peripheral_t spi, const _Bool master)
Initiates the SPI peripheral with specified options.
Definition spi.c:237
spi_communication
Available SPI communication modes.
Definition spi.h:98
enum spi_prescaler spi_prescaler_t
Available SPI clock dividers.
spi_prescaler
Available SPI clock dividers.
Definition spi.h:118
void spi_tx_data(const spi_peripheral_t spi, const uint16_t data)
Transmits specified SPI data.
Definition spi.c:197
spi_nss_mode
Available SPI NSS pin modes.
Definition spi.h:109
void spi_set_interrupts(const spi_peripheral_t spi, const struct SPIISR config)
Enables specified SPI interrupts.
Definition spi.c:50
CMSIS device header stubs.
Contains additional SPI configuration.
Definition spi.h:56
uint16_t CRCPoly
Definition spi.h:63
_Bool UseCRC
Definition spi.h:62
_Bool Use16Bits
Definition spi.h:58
_Bool LSBFirst
Definition spi.h:59
_Bool TIMode
Definition spi.h:60
Contains SPI interrupt configuration.
Definition spi.h:44
_Bool ERR
Definition spi.h:45
_Bool TXE
Definition spi.h:47
_Bool RXNE
Definition spi.h:46
Contains SPI/I2S registers.
Definition spi.h:24