PER Firmware
Loading...
Searching...
No Matches
spi.h
Go to the documentation of this file.
1
11#ifndef _PHAL_SPI_H
12#define _PHAL_SPI_H
13
14#include <stddef.h>
15
18#include "common/phal_F4_F7/phal_F4_F7.h"
20#include "common_defs.h"
21
25typedef struct
26{
27 uint32_t data_rate;
28 uint8_t data_len;
29 bool nss_sw;
30 GPIO_TypeDef* nss_gpio_port;
31 uint32_t nss_gpio_pin;
32
35
36 volatile bool _busy;
37 volatile bool _error;
38 volatile bool _direct_mode_error;
39 volatile bool _fifo_overrun;
40
41 SPI_TypeDef* periph;
43
52
64bool PHAL_SPI_transfer(SPI_InitConfig_t* spi, const uint8_t* out_data, const uint32_t data_len, const uint8_t* in_data);
65
77bool PHAL_SPI_transfer_noDMA(SPI_InitConfig_t* spi, const uint8_t* out_data, uint32_t txlen, uint32_t rxlen, uint8_t* in_data);
78
87
96uint8_t PHAL_SPI_writeByte(SPI_InitConfig_t* spi, uint8_t address, uint8_t writeDat);
97
106uint8_t PHAL_SPI_readByte(SPI_InitConfig_t* spi, uint8_t address, bool skipDummy);
107
108void PHAL_SPI_ForceReset(SPI_InitConfig_t* spi);
109
110// SPI Configuration macros
111#define SPI1_RXDMA_CONT_CONFIG(rx_addr_, priority_) \
112 { \
113 .periph_addr = (uint32_t)&(SPI1->DR), \
114 .mem_addr = (uint32_t)(rx_addr_), \
115 .tx_size = 1, \
116 .increment = false, \
117 .circular = false, \
118 .dir = 0b0, \
119 .mem_inc = true, \
120 .periph_inc = false, \
121 .mem_to_mem = false, \
122 .priority = (priority_), \
123 .mem_size = 0b00, \
124 .periph_size = 0b00, \
125 .tx_isr_en = false, \
126 .dma_chan_request = 0b0011, \
127 .stream_idx = 2, \
128 .periph = DMA2, \
129 .stream = DMA2_Stream2}
130
131#define SPI1_TXDMA_CONT_CONFIG(tx_addr_, priority_) \
132 { \
133 .periph_addr = (uint32_t)&(SPI1->DR), \
134 .mem_addr = (uint32_t)(tx_addr_), \
135 .tx_size = 1, \
136 .increment = false, \
137 .circular = false, \
138 .dir = 0b1, \
139 .mem_inc = true, \
140 .periph_inc = false, \
141 .mem_to_mem = false, \
142 .priority = (priority_), \
143 .mem_size = 0b00, \
144 .periph_size = 0b00, \
145 .tx_isr_en = true, \
146 .dma_chan_request = 0b0011, \
147 .stream_idx = 3, \
148 .periph = DMA2, \
149 .stream = DMA2_Stream3}
150
151#define SPI2_TXDMA_CONT_CONFIG(tx_addr_, priority_) \
152 { \
153 .periph_addr = (uint32_t)&(SPI2->DR), \
154 .mem_addr = (uint32_t)(tx_addr_), \
155 .tx_size = 1, \
156 .increment = false, \
157 .circular = false, \
158 .dir = 0b1, \
159 .mem_inc = true, \
160 .periph_inc = false, \
161 .mem_to_mem = false, \
162 .priority = (priority_), \
163 .mem_size = 0b00, \
164 .periph_size = 0b00, \
165 .tx_isr_en = true, \
166 .dma_chan_request = 0b0000, \
167 .stream_idx = 4, \
168 .periph = DMA1, \
169 .stream = DMA1_Stream4}
170
171#define SPI2_RXDMA_CONT_CONFIG(rx_addr_, priority_) \
172 { \
173 .periph_addr = (uint32_t)&(SPI2->DR), \
174 .mem_addr = (uint32_t)(rx_addr_), \
175 .tx_size = 1, \
176 .increment = false, \
177 .circular = false, \
178 .dir = 0b0, \
179 .mem_inc = true, \
180 .periph_inc = false, \
181 .mem_to_mem = false, \
182 .priority = (priority_), \
183 .mem_size = 0b00, \
184 .periph_size = 0b00, \
185 .tx_isr_en = false, \
186 .dma_chan_request = 0b0000, \
187 .stream_idx = 3, \
188 .periph = DMA1, \
189 .stream = DMA1_Stream3}
190
191#endif /* _PHAL_SPI_H */
Common defs for the entire firmware repository. Dont let this get too out of control please.
GPIO Driver for STM32F4/F7 Devices.
RCC Configuration Driver for STM32F4 Devices.
uint8_t PHAL_SPI_writeByte(SPI_InitConfig_t *spi, uint8_t address, uint8_t writeDat)
Blocking function to write a single byte to a SPI device. Useful for Initilization functions that jus...
Definition spi.c:440
bool PHAL_SPI_busy(SPI_InitConfig_t *cfg)
Check for current SPI transaction to complete.
Definition spi.c:215
bool PHAL_SPI_transfer_noDMA(SPI_InitConfig_t *spi, const uint8_t *out_data, uint32_t txlen, uint32_t rxlen, uint8_t *in_data)
SPI handle.
Definition spi.c:87
bool PHAL_SPI_init(SPI_InitConfig_t *handle)
Initilize SPI peripheral with the configuired structure.
Definition spi.c:22
bool PHAL_SPI_transfer(SPI_InitConfig_t *spi, const uint8_t *out_data, const uint32_t data_len, const uint8_t *in_data)
Transfer data_len bytes from out_data to SPI device and place MISO data in in_data This function just...
Definition spi.c:153
uint8_t PHAL_SPI_readByte(SPI_InitConfig_t *spi, uint8_t address, bool skipDummy)
Blocking function to read a single byte from a SPI device. Useful for Initilization functions that ju...
Definition spi.c:421
Configuration entry for SPI initilization.
Definition spi.h:26
volatile bool _busy
SPI Peripheral currently in a transaction.
Definition spi.h:36
volatile bool _direct_mode_error
DMA error while attempting to operate in direct mode.
Definition spi.h:38
uint8_t data_len
Number of bits per transaction.
Definition spi.h:28
SPI_TypeDef * periph
SPI Peripheral.
Definition spi.h:41
dma_init_t * tx_dma_cfg
DMA initilization for TX transfer.
Definition spi.h:34
volatile bool _fifo_overrun
DMA FIFO has been overrun - this should never occur, as it should never be enabled.
Definition spi.h:39
uint32_t data_rate
Target baudrate in b/s (might be different depending on peripheral clock divison)
Definition spi.h:27
bool nss_sw
Save Select controlled by Software.
Definition spi.h:29
dma_init_t * rx_dma_cfg
DMA initilization for RX transfer.
Definition spi.h:33
uint32_t nss_gpio_pin
GPIO Pin of SPI CS Pin.
Definition spi.h:31
volatile bool _error
SPI Peripheral current transaction error.
Definition spi.h:37
GPIO_TypeDef * nss_gpio_port
GPIO Port of SPI CS Pin.
Definition spi.h:30
Definition dma.h:17