Loading...
Searching...
No Matches
spi.h
1
8
9#ifndef SPI_H
10#define SPI_H
11
12#include "stm32f439xx.h"
13#include "stdint.h"
14#include "stdbool.h"
15
16// Macro definitions for pin config literals
17//
18// clang-format off
19
20#define SPI_CONFIG_DEFAULT \
21 SPI_CONFIG_FULLDUPLEX_MASTER
22
23// Default configuration for full-duplex master mode
24#define SPI_CONFIG_FULLDUPLEX_MASTER \
25 (SPI_Config) { \
26 .CPHA = SPI_CPHA_SECOND, \
27 .CPOL = SPI_CPOL1, \
28 .MSTR = SPI_MASTER, \
29 .BR = SPI_BR_PCLK8, \
30 .LSBFIRST = SPI_MSB_FIRST, \
31 .SSI = true, \
32 .SSM = true, \
33 .RXONLY = false, \
34 .DFF = SPI_DFF8, \
35 .CRCNEXT = false, \
36 .CRCEN = false, \
37 .BIDIOE = false, \
38 .BIDIMODE = false \
39 }
40// clang-format on
41
48
53typedef enum {
54 SPI_CPHA_FIRST, // Begin data capture on first clock transition
55 SPI_CPHA_SECOND // Begin data capture on second clock transition
56} SPI_Phase;
57
62typedef enum {
63 SPI_CPOL0, // Clock idles low
64 SPI_CPOL1 // Clock idles high
66
71typedef enum {
72 SPI_SLAVE, // Slave configuration
73 SPI_MASTER // Master configuration
75
80typedef enum {
81 SPI_BR_PCLK2, // Pclk/2
82 SPI_BR_PCLK4, // Pclk/4
83 SPI_BR_PCLK8, // Pclk/8
84 SPI_BR_PCLK16, // Pclk/16
85 SPI_BR_PCLK32, // Pclk/32
86 SPI_BR_PCLK64, // Pclk/64
87 SPI_BR_PCLK128, // Pclk/128
88 SPI_BR_PCLK256, // Pclk/256
90
95typedef enum {
96 SPI_DFF8, // 8-bit data frame
97 SPI_DFF16 // 16-bit data frame
99
104typedef enum {
105 SPI_MSB_FIRST, // Transmit MSB first
106 SPI_LSB_FIRST // Transmit LSB first
108
113typedef struct {
118 bool SPE : 1;
120 bool SSI : 1;
121 bool SSM : 1;
122 bool RXONLY : 1;
124 bool CRCNEXT : 1;
125 bool CRCEN : 1;
126 bool BIDIOE : 1;
127 bool BIDIMODE : 1;
128} SPI_Config;
129
134typedef struct SPI {
135 SPI_TypeDef *interface;
137 void (*send)(struct SPI *, uint16_t);
138 void (*receive)(struct SPI *, volatile uint16_t *);
139 uint16_t (*transmit)(struct SPI *, uint16_t);
140 void (*updateConfig)(struct SPI *, SPI_Config *);
141} SPI_t;
142
143SPI_t SPI_init(SPI_TypeDef *, SPI_Config *);
144void SPI_send(SPI_t *, uint16_t);
145void SPI_receive(SPI_t *, volatile uint16_t *);
146uint16_t SPI_transmit(SPI_t *, uint16_t);
148
150#endif
SPI_DataFormat DFF
SPI data format | (default SPI_DFF8)
Definition spi.h:123
void(* send)(struct SPI *, uint16_t)
SPI send method.
Definition spi.h:137
bool BIDIOE
SPI bidirectional output | (default false)
Definition spi.h:126
bool RXONLY
SPI receive only | (default false)
Definition spi.h:122
uint16_t(* transmit)(struct SPI *, uint16_t)
SPI transmit method.
Definition spi.h:139
SPI_BaudRate BR
SPI clock division | (default SPI_BR_PCLK8)
Definition spi.h:117
bool SPE
SPI enable | (default false)
Definition spi.h:118
bool CRCEN
SPI CRC enable | (default false)
Definition spi.h:125
void(* updateConfig)(struct SPI *, SPI_Config *)
SPI configuration update method.
Definition spi.h:140
SPI_Polarity CPOL
SPI clock polarity | (default SPI_CPOL1)
Definition spi.h:115
SPI_Config config
Configuration parameters for the SPI peripheral.
Definition spi.h:136
SPI_FrameFormat LSBFIRST
SPI frame format | (default SPI_MSB_FIRST)
Definition spi.h:119
SPI_MasterSelect MSTR
SPI master select | (default SPI_MASTER)
Definition spi.h:116
void(* receive)(struct SPI *, volatile uint16_t *)
SPI receive method.
Definition spi.h:138
SPI_TypeDef * interface
Pointer to SPI interface struct.
Definition spi.h:135
bool SSM
SPI software slave management | (default true )
Definition spi.h:121
SPI_Phase CPHA
SPI clock phase | (default SPI_CPHA_SECOND)
Definition spi.h:114
bool CRCNEXT
SPI CRC transfer next | (default false)
Definition spi.h:124
bool BIDIMODE
SPI bidirectional mode | (default true)
Definition spi.h:127
bool SSI
SPI internal slave select | (default true)
Definition spi.h:120
SPI_Phase
SPI clock phase enum.
Definition spi.h:53
SPI_FrameFormat
SPI frame format enum.
Definition spi.h:104
SPI_t SPI_init(SPI_TypeDef *, SPI_Config *)
Initialiser for an SPI device interface.
Definition spi.c:36
SPI_DataFormat
SPI data format enum.
Definition spi.h:95
uint16_t SPI_transmit(SPI_t *, uint16_t)
Instance method to communicate a SPI transaction with slave device.
Definition spi.c:96
SPI_BaudRate
SPI baud rate enum.
Definition spi.h:80
SPI_MasterSelect
SPI master selection enum.
Definition spi.h:71
void SPI_updateConfig(SPI_t *, SPI_Config *)
Update SPI peripheral configuration.
Definition spi.c:166
SPI_Polarity
SPI clock polarity enum.
Definition spi.h:62
SPI CR1 configuration struct.
Definition spi.h:113
Struct definition for SPI interface. Provides the interface for API consumers to interact with the SP...
Definition spi.h:134