MyLibs 1.0
Расширенные библиотеки для STM32
Loading...
Searching...
No Matches
general_spi.c
Go to the documentation of this file.
1/**
2**************************************************************************
3* @file general_spi.c
4* @brief Модуль для инициализации SPI.
5**************************************************************************
6Реализация функций для работы с SPI:
7 - Инициализация SPI и его линий CLK/MISO/MOSI
8 - Настройка GPIO для SPI
9 - Настройка NVIC и тактирования SPI
10**************************************************************************/
11#include "general_spi.h"
12#include "general_gpio.h"
13
14//-------------------------------------------------------------------
15//------------------------SPI INIT FUNCTIONS------------------------
16/**
17 * @brief Инициализация SPI с помощью структуры SPI_SettingsTypeDef.
18 * @param sspi Указатель на структуру с настройками SPI.
19 * @return HAL status.
20 * @details
21 * Инициализирует SPI и его GPIO.
22 * Настройка аналогична HAL_SPI_Init
23 * @code
24 * suart.hspi.Init...
25 * @endcode
26 * но дополнительно надо прописать пины CLK/MISO/MOSI @ref SPI_SettingsTypeDef
27 */
28HAL_StatusTypeDef SPI_Base_Init(SPI_SettingsTypeDef *sspi)
29{ // function takes setting structure for init
30
31 // check is settings are valid
32 if(SPI_Check_Init_Struct(sspi) != HAL_OK)
33 return HAL_ERROR;
34
35 SPI_MspInit(&sspi->hspi);
36
37 if (HAL_SPI_Init(&sspi->hspi) != HAL_OK)
38 {
40 return HAL_ERROR;
41 }
42
43 // init gpio from SPISettings structure
44 SPI_GPIO_Init(sspi);
45
46// // init dma from SPISettings structure if need
47// if (sspi->DMAChannel != 0)
48// SPI_DMA_Init(&sspi->hspi, sspi->hspi.hdmarx, sspi->DMAChannel, sspi->DMA_CHANNEL_X);
49
50 return HAL_OK;
51}
52
53
54/**
55 * @brief Инициализация GPIO для SPI.
56 * @param sspi Указатель на структуру с настройками SPI.
57 */
59{
60 GPIO_InitTypeDef GPIO_InitStruct = {0};
61 // GPIO INIT
65 // CLK PIN INIT
66 GPIO_InitStruct.Pin = sspi->CLK_PIN;
67 GPIO_InitStruct.Alternate = sspi->CLK_GPIO_AlternageFunc;
68 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
69 GPIO_InitStruct.Pull = GPIO_NOPULL;
70 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
71 HAL_GPIO_Init(sspi->CLK_GPIOx, &GPIO_InitStruct);
72 // MISO PIN INIT
73 GPIO_InitStruct.Pin = sspi->MISO_PIN;
74 GPIO_InitStruct.Alternate = sspi->MISO_GPIO_AlternageFunc;
75 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
76 GPIO_InitStruct.Pull = GPIO_NOPULL;
77 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
78 HAL_GPIO_Init(sspi->MISO_GPIOx, &GPIO_InitStruct);
79 // MOSI PIN INIT
80 GPIO_InitStruct.Pin = sspi->MOSI_PIN;
81 GPIO_InitStruct.Alternate = sspi->MOSI_GPIO_AlternageFunc;
82 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
83 GPIO_InitStruct.Pull = GPIO_NOPULL;
84 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
85 HAL_GPIO_Init(sspi->MOSI_GPIOx, &GPIO_InitStruct);
86}
87
88
89void SPI_DMA_Init(SPI_HandleTypeDef *hspi, DMA_HandleTypeDef *hdma_rx, DMA_Stream_TypeDef *DMAChannel, uint32_t DMA_CHANNEL_X)
90{ // function takes spi and dma handlers and dmachannel for spi
91// // for now only dma rx is supported, tx maybe later if needed
92// // calc defines on boot_project_setup.h
93
94// /* SPI3 DMA Init */
95// /* SPI3_RX Init */
96//
97// hdma_rx->Instance = DMAChannel;
98//#if defined(STM32F4xx) // dma channel choose for 407
99// hdma_rx->Init.Channel = DMA_CHANNEL_X;
100//#endif
101// hdma_rx->Init.Direction = DMA_PERIPH_TO_MEMORY;
102// hdma_rx->Init.PeriphInc = DMA_PINC_DISABLE;
103// hdma_rx->Init.MemInc = DMA_MINC_ENABLE;
104// hdma_rx->Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
105// hdma_rx->Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
106// hdma_rx->Init.Mode = DMA_CIRCULAR;
107// hdma_rx->Init.Priority = DMA_PRIORITY_LOW;
108// if (HAL_DMA_Init(hdma_rx) != HAL_OK)
109// {
110// MyLibs_Error_Handler();
111// }
112
113// __USER_LINKDMA(hspi,hdmarx,hdma_rx);
114//
115
116// // __USER_LINKDMA is need because __HAL_LINKDMA is written for global defined hdma_rx
117// // so you get error because hal uses . insted of ->
118}
119
120
121/**
122 * @brief Настройка тактирования и прерываний SPI.
123 * @param hspi Указатель на хендл SPI.
124 * @note Чтобы не генерировать функцию с иницилизацией неиспользуемых SPI,
125 дефайнами @ref SPI_INIT в @ref general_spi.h определяются используемые SPI.
126 */
127void SPI_MspInit(SPI_HandleTypeDef *hspi) // analog for hal function
128{
129 // rcc, dma and interrupt init for SPIs
130 // GPIO init was moved to own functions SPI_GPIO_Init
131 if(0);
132#ifdef USE_SPI1
133 else if(hspi->Instance==SPI1)
134 {
135
136// /* DMA2 clock enable */
137// __HAL_RCC_DMA2_CLK_ENABLE();
138// /* DMA interrupt init */
139// HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 0, 0);
140// HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);
141
142 /* SPI1 clock enable */
143 __HAL_RCC_SPI1_CLK_ENABLE();
144
145 /* SPI1 interrupt Init */
146 HAL_NVIC_SetPriority(SPI1_IRQn, 0, 0);
147 HAL_NVIC_EnableIRQ(SPI1_IRQn);
148 }
149#endif // USE_SPI1
150#ifdef USE_SPI2
151 else if(hspi->Instance==SPI2)
152 {
153// /* DMA1 clock enable */
154// __HAL_RCC_DMA1_CLK_ENABLE();
155// /* DMA interrupt init */
156// HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 0);
157// HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);
158
159 /* SPI2 clock enable */
160 __HAL_RCC_SPI2_CLK_ENABLE();
161
162 /* SPI2 interrupt Init */
163 HAL_NVIC_SetPriority(SPI2_IRQn, 0, 0);
164 HAL_NVIC_EnableIRQ(SPI2_IRQn);
165 }
166#endif // USE_SPI2
167#ifdef USE_SPI3
168 else if(hspi->Instance==SPI3)
169 {
170// /* DMA1 clock enable */
171// __HAL_RCC_DMA1_CLK_ENABLE();
172// /* DMA interrupt init */
173// HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 0);
174// HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
175
176 /* SPI3 clock enable */
177 __HAL_RCC_SPI3_CLK_ENABLE();
178 /* SPI3 interrupt Init */
179 HAL_NVIC_SetPriority(SPI3_IRQn, 0, 0);
180 HAL_NVIC_EnableIRQ(SPI3_IRQn);
181 }
182#endif // USE_SPI3
183}
184
185/**
186 * @brief Деинициализация тактирования и прерываний SPI.
187 * @param hspi Указатель на хендл SPI.
188 * @note Чтобы не генерировать функцию с иницилизацией неиспользуемых SPI,
189 дефайнами @ref SPI_INIT в @ref general_spi.h определяются используемые SPI.
190 */
191void SPI_MspDeInit(SPI_HandleTypeDef *hspi) // analog for hal function
192{
193 // rcc, dma and interrupt init for SPIs
194 // GPIO init was moved to own functions SPI_GPIO_Init
195 if(0);
196#ifdef USE_SPI1
197 else if(hspi->Instance==SPI1)
198 {
199
200// /* DMA2 clock enable */
201// __HAL_RCC_DMA2_CLK_ENABLE();
202// /* DMA interrupt init */
203// HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 0, 0);
204// HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);
205
206 /* SPI1 clock reset */
207 __HAL_RCC_SPI1_FORCE_RESET();
208 __HAL_RCC_SPI1_RELEASE_RESET();
209 }
210#endif // USE_SPI1
211#ifdef USE_SPI2
212 else if(hspi->Instance==SPI2)
213 {
214// /* DMA1 clock enable */
215// __HAL_RCC_DMA1_CLK_ENABLE();
216// /* DMA interrupt init */
217// HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 0);
218// HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);
219
220 /* SPI2 clock reset */
221 __HAL_RCC_SPI2_FORCE_RESET();
222 __HAL_RCC_SPI2_RELEASE_RESET();
223 }
224#endif // USE_SPI2
225#ifdef USE_SPI3
226 else if(hspi->Instance==SPI3)
227 {
228// /* DMA1 clock enable */
229// __HAL_RCC_DMA1_CLK_ENABLE();
230// /* DMA interrupt init */
231// HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 0);
232// HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
233
234 /* SPI3 clock reset */
235 __HAL_RCC_SPI3_FORCE_RESET();
236 __HAL_RCC_SPI3_RELEASE_RESET();
237 }
238#endif // USE_SPI3
239}
240
241/**
242 * @brief Проверка корректности структуры инициализации SPI.
243 * @param sspi Указатель на структуру с настройками SPI.
244 * @return HAL status.
245 */
247{
248 // check is settings are valid
249 if (!IS_SPI_ALL_INSTANCE(sspi->hspi.Instance))
250 return HAL_ERROR;
251
252 // check init settings
253 if (!IS_SPI_MODE(sspi->hspi.Init.Mode))
254 return HAL_ERROR;
255 if (!IS_SPI_DIRECTION(sspi->hspi.Init.Direction))
256 return HAL_ERROR;
257 if (!IS_SPI_DATASIZE(sspi->hspi.Init.DataSize))
258 return HAL_ERROR;
259 if (!IS_SPI_BAUDRATE_PRESCALER(sspi->hspi.Init.BaudRatePrescaler))
260 return HAL_ERROR;
261 if (!IS_SPI_CPOL(sspi->hspi.Init.CLKPolarity))
262 return HAL_ERROR;
263 if (!IS_SPI_CPHA(sspi->hspi.Init.CLKPhase))
264 return HAL_ERROR;
265 if (!IS_SPI_NSS(sspi->hspi.Init.NSS))
266 return HAL_ERROR;
267 if (!IS_SPI_FIRST_BIT(sspi->hspi.Init.FirstBit))
268 return HAL_ERROR;
269 if (!IS_SPI_CRC_CALCULATION(sspi->hspi.Init.CRCCalculation))
270 return HAL_ERROR;
271 if (!IS_SPI_CRC_POLYNOMIAL(sspi->hspi.Init.NSS) &&
272 (sspi->hspi.Init.CRCCalculation != SPI_CRCCALCULATION_DISABLE))
273 return HAL_ERROR;
274 if (!IS_SPI_TIMODE(sspi->hspi.Init.TIMode))
275 return HAL_ERROR;
276
277 // check gpio
278 if (!IS_GPIO_ALL_INSTANCE(sspi->CLK_GPIOx) || !IS_GPIO_ALL_INSTANCE(sspi->MISO_GPIOx) || !IS_GPIO_ALL_INSTANCE(sspi->MOSI_GPIOx))
279 return HAL_ERROR;
280 if (!IS_GPIO_PIN(sspi->CLK_PIN) && !IS_GPIO_PIN(sspi->MISO_PIN) && !IS_GPIO_PIN(sspi->MOSI_PIN)) // if both pins arent set up
281 return HAL_ERROR;
282
283 return HAL_OK;
284}
Заголовочный файл для модуля инициализации портов и работы с ними.
void SPI_GPIO_Init(SPI_SettingsTypeDef *sspi)
Инициализация GPIO для SPI.
Definition general_spi.c:58
Заголовочный файл для модуля инициализации SPI.
#define MyLibs_Error_Handler(params)
Error_Handler который будет вызыватся в библиотеке
Definition mylibs_defs.h:31
HAL_StatusTypeDef SPI_Base_Init(SPI_SettingsTypeDef *sspi)
Инициализация SPI с помощью структуры SPI_SettingsTypeDef.
Definition general_spi.c:28
HAL_StatusTypeDef SPI_Check_Init_Struct(SPI_SettingsTypeDef *sspi)
Проверка корректности структуры инициализации SPI.
void SPI_MspInit(SPI_HandleTypeDef *hspi)
Настройка тактирования и прерываний SPI.
void SPI_MspDeInit(SPI_HandleTypeDef *hspi)
Деинициализация тактирования и прерываний SPI.
HAL_StatusTypeDef GPIO_Clock_Enable(GPIO_TypeDef *GPIOx)
Включить тактирование порта GPIO.
Структура настроек SPI.
GPIO_TypeDef * MOSI_GPIOx
Порт MOSI.
GPIO_TypeDef * MISO_GPIOx
Порт MISO.
uint32_t MISO_PIN
Пин MISO.
uint32_t CLK_PIN
Пин CLK.
uint32_t CLK_GPIO_AlternageFunc
Альтернативная функция для CLK.
GPIO_TypeDef * CLK_GPIOx
Порт CLK.
uint32_t MOSI_PIN
Пин MOSI.
SPI_HandleTypeDef hspi
HAL handle SPI.
uint32_t MISO_GPIO_AlternageFunc
Альтернативная функция для MISO.
uint32_t MOSI_GPIO_AlternageFunc
Альтернативная функция для MOSI.