1 /**
2 ******************************************************************************
3 * @file stm32u0xx_hal_spi.c
4 * @author MCD Application Team
5 * @brief SPI HAL module driver.
6 * This file provides firmware functions to manage the following
7 * functionalities of the Serial Peripheral Interface (SPI) peripheral:
8 * + Initialization and de-initialization functions
9 * + IO operation functions
10 * + Peripheral Control functions
11 * + Peripheral State functions
12 ******************************************************************************
13 * @attention
14 *
15 * Copyright (c) 2023 STMicroelectronics.
16 * All rights reserved.
17 *
18 * This software is licensed under terms that can be found in the LICENSE file
19 * in the root directory of this software component.
20 * If no LICENSE file comes with this software, it is provided AS-IS.
21 *
22 ******************************************************************************
23 @verbatim
24 ==============================================================================
25 ##### How to use this driver #####
26 ==============================================================================
27 [..]
28 The SPI HAL driver can be used as follows:
29
30 (#) Declare a SPI_HandleTypeDef handle structure, for example:
31 SPI_HandleTypeDef hspi;
32
33 (#)Initialize the SPI low level resources by implementing the HAL_SPI_MspInit() API:
34 (##) Enable the SPIx interface clock
35 (##) SPI pins configuration
36 (+++) Enable the clock for the SPI GPIOs
37 (+++) Configure these SPI pins as alternate function push-pull
38 (##) NVIC configuration if you need to use interrupt process
39 (+++) Configure the SPIx interrupt priority
40 (+++) Enable the NVIC SPI IRQ handle
41 (##) DMA Configuration if you need to use DMA process
42 (+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive Stream/Channel
43 (+++) Enable the DMAx clock
44 (+++) Configure the DMA handle parameters
45 (+++) Configure the DMA Tx or Rx Stream/Channel
46 (+++) Associate the initialized hdma_tx(or _rx) handle to the hspi DMA Tx or Rx handle
47 (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx or Rx Stream/Channel
48
49 (#) Program the Mode, BidirectionalMode , Data size, Baudrate Prescaler, NSS
50 management, Clock polarity and phase, FirstBit and CRC configuration in the hspi Init structure.
51
52 (#) Initialize the SPI registers by calling the HAL_SPI_Init() API:
53 (++) This API configures also the low level Hardware GPIO, CLOCK, CORTEX...etc)
54 by calling the customized HAL_SPI_MspInit() API.
55 [..]
56 Circular mode restriction:
57 (#) The DMA circular mode cannot be used when the SPI is configured in these modes:
58 (##) Master 2Lines RxOnly
59 (##) Master 1Line Rx
60 (#) The CRC feature is not managed when the DMA circular mode is enabled
61 (#) When the SPI DMA Pause/Stop features are used, we must use the following APIs
62 the HAL_SPI_DMAPause()/ HAL_SPI_DMAStop() only under the SPI callbacks
63 [..]
64 Master Receive mode restriction:
65 (#) In Master unidirectional receive-only mode (MSTR =1, BIDIMODE=0, RXONLY=1) or
66 bidirectional receive mode (MSTR=1, BIDIMODE=1, BIDIOE=0), to ensure that the SPI
67 does not initiate a new transfer the following procedure has to be respected:
68 (##) HAL_SPI_DeInit()
69 (##) HAL_SPI_Init()
70 [..]
71 Callback registration:
72
73 (#) The compilation flag USE_HAL_SPI_REGISTER_CALLBACKS when set to 1U
74 allows the user to configure dynamically the driver callbacks.
75 Use Functions HAL_SPI_RegisterCallback() to register an interrupt callback.
76
77 Function HAL_SPI_RegisterCallback() allows to register following callbacks:
78 (++) TxCpltCallback : SPI Tx Completed callback
79 (++) RxCpltCallback : SPI Rx Completed callback
80 (++) TxRxCpltCallback : SPI TxRx Completed callback
81 (++) TxHalfCpltCallback : SPI Tx Half Completed callback
82 (++) RxHalfCpltCallback : SPI Rx Half Completed callback
83 (++) TxRxHalfCpltCallback : SPI TxRx Half Completed callback
84 (++) ErrorCallback : SPI Error callback
85 (++) AbortCpltCallback : SPI Abort callback
86 (++) MspInitCallback : SPI Msp Init callback
87 (++) MspDeInitCallback : SPI Msp DeInit callback
88 This function takes as parameters the HAL peripheral handle, the Callback ID
89 and a pointer to the user callback function.
90
91
92 (#) Use function HAL_SPI_UnRegisterCallback to reset a callback to the default
93 weak function.
94 HAL_SPI_UnRegisterCallback takes as parameters the HAL peripheral handle,
95 and the Callback ID.
96 This function allows to reset following callbacks:
97 (++) TxCpltCallback : SPI Tx Completed callback
98 (++) RxCpltCallback : SPI Rx Completed callback
99 (++) TxRxCpltCallback : SPI TxRx Completed callback
100 (++) TxHalfCpltCallback : SPI Tx Half Completed callback
101 (++) RxHalfCpltCallback : SPI Rx Half Completed callback
102 (++) TxRxHalfCpltCallback : SPI TxRx Half Completed callback
103 (++) ErrorCallback : SPI Error callback
104 (++) AbortCpltCallback : SPI Abort callback
105 (++) MspInitCallback : SPI Msp Init callback
106 (++) MspDeInitCallback : SPI Msp DeInit callback
107
108 [..]
109 By default, after the HAL_SPI_Init() and when the state is HAL_SPI_STATE_RESET
110 all callbacks are set to the corresponding weak functions:
111 examples HAL_SPI_MasterTxCpltCallback(), HAL_SPI_MasterRxCpltCallback().
112 Exception done for MspInit and MspDeInit functions that are
113 reset to the legacy weak functions in the HAL_SPI_Init()/ HAL_SPI_DeInit() only when
114 these callbacks are null (not registered beforehand).
115 If MspInit or MspDeInit are not null, the HAL_SPI_Init()/ HAL_SPI_DeInit()
116 keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state.
117
118 [..]
119 Callbacks can be registered/unregistered in HAL_SPI_STATE_READY state only.
120 Exception done MspInit/MspDeInit functions that can be registered/unregistered
121 in HAL_SPI_STATE_READY or HAL_SPI_STATE_RESET state,
122 thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit.
123 Then, the user first registers the MspInit/MspDeInit user callbacks
124 using HAL_SPI_RegisterCallback() before calling HAL_SPI_DeInit()
125 or HAL_SPI_Init() function.
126
127 [..]
128 When the compilation define USE_HAL_PPP_REGISTER_CALLBACKS is set to 0 or
129 not defined, the callback registering feature is not available
130 and weak (surcharged) callbacks are used.
131
132 [..]
133 Using the HAL it is not possible to reach all supported SPI frequency with the different SPI Modes,
134 the following table resume the max SPI frequency reached with data size 8bits/16bits,
135 according to frequency of the APBx Peripheral Clock (fPCLK) used by the SPI instance.
136
137 @endverbatim
138
139 Additional table :
140
141 DataSize = SPI_DATASIZE_8BIT:
142 +----------------------------------------------------------------------------------------------+
143 | | | 2Lines Fullduplex | 2Lines RxOnly | 1Line |
144 | Process | Transfer mode |---------------------|----------------------|----------------------|
145 | | | Master | Slave | Master | Slave | Master | Slave |
146 |==============================================================================================|
147 | T | Polling | Fpclk/4 | Fpclk/8 | NA | NA | NA | NA |
148 | X |----------------|----------|----------|-----------|----------|-----------|----------|
149 | / | Interrupt | Fpclk/4 | Fpclk/16 | NA | NA | NA | NA |
150 | R |----------------|----------|----------|-----------|----------|-----------|----------|
151 | X | DMA | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA |
152 |=========|================|==========|==========|===========|==========|===========|==========|
153 | | Polling | Fpclk/4 | Fpclk/8 | Fpclk/16 | Fpclk/8 | Fpclk/8 | Fpclk/8 |
154 | |----------------|----------|----------|-----------|----------|-----------|----------|
155 | R | Interrupt | Fpclk/8 | Fpclk/16 | Fpclk/8 | Fpclk/8 | Fpclk/8 | Fpclk/4 |
156 | X |----------------|----------|----------|-----------|----------|-----------|----------|
157 | | DMA | Fpclk/4 | Fpclk/2 | Fpclk/2 | Fpclk/16 | Fpclk/2 | Fpclk/16 |
158 |=========|================|==========|==========|===========|==========|===========|==========|
159 | | Polling | Fpclk/8 | Fpclk/2 | NA | NA | Fpclk/8 | Fpclk/8 |
160 | |----------------|----------|----------|-----------|----------|-----------|----------|
161 | T | Interrupt | Fpclk/2 | Fpclk/4 | NA | NA | Fpclk/16 | Fpclk/8 |
162 | X |----------------|----------|----------|-----------|----------|-----------|----------|
163 | | DMA | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/8 | Fpclk/16 |
164 +----------------------------------------------------------------------------------------------+
165
166 DataSize = SPI_DATASIZE_16BIT:
167 +----------------------------------------------------------------------------------------------+
168 | | | 2Lines Fullduplex | 2Lines RxOnly | 1Line |
169 | Process | Transfer mode |---------------------|----------------------|----------------------|
170 | | | Master | Slave | Master | Slave | Master | Slave |
171 |==============================================================================================|
172 | T | Polling | Fpclk/4 | Fpclk/8 | NA | NA | NA | NA |
173 | X |----------------|----------|----------|-----------|----------|-----------|----------|
174 | / | Interrupt | Fpclk/4 | Fpclk/16 | NA | NA | NA | NA |
175 | R |----------------|----------|----------|-----------|----------|-----------|----------|
176 | X | DMA | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA |
177 |=========|================|==========|==========|===========|==========|===========|==========|
178 | | Polling | Fpclk/4 | Fpclk/8 | Fpclk/16 | Fpclk/8 | Fpclk/8 | Fpclk/8 |
179 | |----------------|----------|----------|-----------|----------|-----------|----------|
180 | R | Interrupt | Fpclk/8 | Fpclk/16 | Fpclk/8 | Fpclk/8 | Fpclk/8 | Fpclk/4 |
181 | X |----------------|----------|----------|-----------|----------|-----------|----------|
182 | | DMA | Fpclk/4 | Fpclk/2 | Fpclk/2 | Fpclk/16 | Fpclk/2 | Fpclk/16 |
183 |=========|================|==========|==========|===========|==========|===========|==========|
184 | | Polling | Fpclk/8 | Fpclk/2 | NA | NA | Fpclk/8 | Fpclk/8 |
185 | |----------------|----------|----------|-----------|----------|-----------|----------|
186 | T | Interrupt | Fpclk/2 | Fpclk/4 | NA | NA | Fpclk/16 | Fpclk/8 |
187 | X |----------------|----------|----------|-----------|----------|-----------|----------|
188 | | DMA | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/8 | Fpclk/16 |
189 +----------------------------------------------------------------------------------------------+
190 @note The max SPI frequency depend on SPI data size (4bits, 5bits,..., 8bits,...15bits, 16bits),
191 SPI mode(2 Lines fullduplex, 2 lines RxOnly, 1 line TX/RX) and Process mode (Polling, IT, DMA).
192 @note
193 (#) TX/RX processes are HAL_SPI_TransmitReceive(), HAL_SPI_TransmitReceive_IT() and HAL_SPI_TransmitReceive_DMA()
194 (#) RX processes are HAL_SPI_Receive(), HAL_SPI_Receive_IT() and HAL_SPI_Receive_DMA()
195 (#) TX processes are HAL_SPI_Transmit(), HAL_SPI_Transmit_IT() and HAL_SPI_Transmit_DMA()
196
197 */
198
199 /* Includes ------------------------------------------------------------------*/
200 #include "stm32u0xx_hal.h"
201
202 /** @addtogroup STM32U0xx_HAL_Driver
203 * @{
204 */
205
206 /** @defgroup SPI SPI
207 * @brief SPI HAL module driver
208 * @{
209 */
210 #ifdef HAL_SPI_MODULE_ENABLED
211
212 /* Private typedef -----------------------------------------------------------*/
213 /* Private defines -----------------------------------------------------------*/
214 /** @defgroup SPI_Private_Constants SPI Private Constants
215 * @{
216 */
217 #define SPI_DEFAULT_TIMEOUT 100U
218 /**
219 * @}
220 */
221
222 /* Private macros ------------------------------------------------------------*/
223 /* Private variables ---------------------------------------------------------*/
224 /* Private function prototypes -----------------------------------------------*/
225 /** @defgroup SPI_Private_Functions SPI Private Functions
226 * @{
227 */
228 static void SPI_DMATransmitCplt(DMA_HandleTypeDef *hdma);
229 static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma);
230 static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma);
231 static void SPI_DMAHalfTransmitCplt(DMA_HandleTypeDef *hdma);
232 static void SPI_DMAHalfReceiveCplt(DMA_HandleTypeDef *hdma);
233 static void SPI_DMAHalfTransmitReceiveCplt(DMA_HandleTypeDef *hdma);
234 static void SPI_DMAError(DMA_HandleTypeDef *hdma);
235 static void SPI_DMAAbortOnError(DMA_HandleTypeDef *hdma);
236 static void SPI_DMATxAbortCallback(DMA_HandleTypeDef *hdma);
237 static void SPI_DMARxAbortCallback(DMA_HandleTypeDef *hdma);
238 static HAL_StatusTypeDef SPI_WaitFlagStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, FlagStatus State,
239 uint32_t Timeout, uint32_t Tickstart);
240 static HAL_StatusTypeDef SPI_WaitFifoStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Fifo, uint32_t State,
241 uint32_t Timeout, uint32_t Tickstart);
242 static void SPI_TxISR_8BIT(struct __SPI_HandleTypeDef *hspi);
243 static void SPI_TxISR_16BIT(struct __SPI_HandleTypeDef *hspi);
244 static void SPI_RxISR_8BIT(struct __SPI_HandleTypeDef *hspi);
245 static void SPI_RxISR_16BIT(struct __SPI_HandleTypeDef *hspi);
246 static void SPI_2linesRxISR_8BIT(struct __SPI_HandleTypeDef *hspi);
247 static void SPI_2linesTxISR_8BIT(struct __SPI_HandleTypeDef *hspi);
248 static void SPI_2linesTxISR_16BIT(struct __SPI_HandleTypeDef *hspi);
249 static void SPI_2linesRxISR_16BIT(struct __SPI_HandleTypeDef *hspi);
250 #if (USE_SPI_CRC != 0U)
251 static void SPI_RxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi);
252 static void SPI_RxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi);
253 static void SPI_2linesRxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi);
254 static void SPI_2linesRxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi);
255 #endif /* USE_SPI_CRC */
256 static void SPI_AbortRx_ISR(SPI_HandleTypeDef *hspi);
257 static void SPI_AbortTx_ISR(SPI_HandleTypeDef *hspi);
258 static void SPI_CloseRxTx_ISR(SPI_HandleTypeDef *hspi);
259 static void SPI_CloseRx_ISR(SPI_HandleTypeDef *hspi);
260 static void SPI_CloseTx_ISR(SPI_HandleTypeDef *hspi);
261 static HAL_StatusTypeDef SPI_EndRxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart);
262 static HAL_StatusTypeDef SPI_EndRxTxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart);
263 /**
264 * @}
265 */
266
267 /* Exported functions --------------------------------------------------------*/
268 /** @defgroup SPI_Exported_Functions SPI Exported Functions
269 * @{
270 */
271
272 /** @defgroup SPI_Exported_Functions_Group1 Initialization and de-initialization functions
273 * @brief Initialization and Configuration functions
274 *
275 @verbatim
276 ===============================================================================
277 ##### Initialization and de-initialization functions #####
278 ===============================================================================
279 [..] This subsection provides a set of functions allowing to initialize and
280 de-initialize the SPIx peripheral:
281
282 (+) User must implement HAL_SPI_MspInit() function in which he configures
283 all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC ).
284
285 (+) Call the function HAL_SPI_Init() to configure the selected device with
286 the selected configuration:
287 (++) Mode
288 (++) Direction
289 (++) Data Size
290 (++) Clock Polarity and Phase
291 (++) NSS Management
292 (++) BaudRate Prescaler
293 (++) FirstBit
294 (++) TIMode
295 (++) CRC Calculation
296 (++) CRC Polynomial if CRC enabled
297 (++) CRC Length, used only with Data8 and Data16
298 (++) FIFO reception threshold
299
300 (+) Call the function HAL_SPI_DeInit() to restore the default configuration
301 of the selected SPIx peripheral.
302
303 @endverbatim
304 * @{
305 */
306
307 /**
308 * @brief Initialize the SPI according to the specified parameters
309 * in the SPI_InitTypeDef and initialize the associated handle.
310 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
311 * the configuration information for SPI module.
312 * @retval HAL status
313 */
HAL_SPI_Init(SPI_HandleTypeDef * hspi)314 HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi)
315 {
316 uint32_t frxth;
317
318 /* Check the SPI handle allocation */
319 if (hspi == NULL)
320 {
321 return HAL_ERROR;
322 }
323
324 /* Check the parameters */
325 assert_param(IS_SPI_ALL_INSTANCE(hspi->Instance));
326 assert_param(IS_SPI_MODE(hspi->Init.Mode));
327 assert_param(IS_SPI_DIRECTION(hspi->Init.Direction));
328 assert_param(IS_SPI_DATASIZE(hspi->Init.DataSize));
329 assert_param(IS_SPI_NSS(hspi->Init.NSS));
330 assert_param(IS_SPI_NSSP(hspi->Init.NSSPMode));
331 assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler));
332 assert_param(IS_SPI_FIRST_BIT(hspi->Init.FirstBit));
333 assert_param(IS_SPI_TIMODE(hspi->Init.TIMode));
334 if (hspi->Init.TIMode == SPI_TIMODE_DISABLE)
335 {
336 assert_param(IS_SPI_CPOL(hspi->Init.CLKPolarity));
337 assert_param(IS_SPI_CPHA(hspi->Init.CLKPhase));
338
339 if (hspi->Init.Mode == SPI_MODE_MASTER)
340 {
341 assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler));
342 }
343 else
344 {
345 /* Baudrate prescaler not use in Motoraola Slave mode. force to default value */
346 hspi->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
347 }
348 }
349 else
350 {
351 assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler));
352
353 /* Force polarity and phase to TI protocaol requirements */
354 hspi->Init.CLKPolarity = SPI_POLARITY_LOW;
355 hspi->Init.CLKPhase = SPI_PHASE_1EDGE;
356 }
357 #if (USE_SPI_CRC != 0U)
358 assert_param(IS_SPI_CRC_CALCULATION(hspi->Init.CRCCalculation));
359 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
360 {
361 assert_param(IS_SPI_CRC_POLYNOMIAL(hspi->Init.CRCPolynomial));
362 assert_param(IS_SPI_CRC_LENGTH(hspi->Init.CRCLength));
363 }
364 #else
365 hspi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
366 #endif /* USE_SPI_CRC */
367
368 if (hspi->State == HAL_SPI_STATE_RESET)
369 {
370 /* Allocate lock resource and initialize it */
371 hspi->Lock = HAL_UNLOCKED;
372
373 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)
374 /* Init the SPI Callback settings */
375 hspi->TxCpltCallback = HAL_SPI_TxCpltCallback; /* Legacy weak TxCpltCallback */
376 hspi->RxCpltCallback = HAL_SPI_RxCpltCallback; /* Legacy weak RxCpltCallback */
377 hspi->TxRxCpltCallback = HAL_SPI_TxRxCpltCallback; /* Legacy weak TxRxCpltCallback */
378 hspi->TxHalfCpltCallback = HAL_SPI_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */
379 hspi->RxHalfCpltCallback = HAL_SPI_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */
380 hspi->TxRxHalfCpltCallback = HAL_SPI_TxRxHalfCpltCallback; /* Legacy weak TxRxHalfCpltCallback */
381 hspi->ErrorCallback = HAL_SPI_ErrorCallback; /* Legacy weak ErrorCallback */
382 hspi->AbortCpltCallback = HAL_SPI_AbortCpltCallback; /* Legacy weak AbortCpltCallback */
383
384 if (hspi->MspInitCallback == NULL)
385 {
386 hspi->MspInitCallback = HAL_SPI_MspInit; /* Legacy weak MspInit */
387 }
388
389 /* Init the low level hardware : GPIO, CLOCK, NVIC... */
390 hspi->MspInitCallback(hspi);
391 #else
392 /* Init the low level hardware : GPIO, CLOCK, NVIC... */
393 HAL_SPI_MspInit(hspi);
394 #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */
395 }
396
397 hspi->State = HAL_SPI_STATE_BUSY;
398
399 /* Disable the selected SPI peripheral */
400 __HAL_SPI_DISABLE(hspi);
401
402 /* Align by default the rs fifo threshold on the data size */
403 if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
404 {
405 frxth = SPI_RXFIFO_THRESHOLD_HF;
406 }
407 else
408 {
409 frxth = SPI_RXFIFO_THRESHOLD_QF;
410 }
411
412 /* CRC calculation is valid only for 16Bit and 8 Bit */
413 if ((hspi->Init.DataSize != SPI_DATASIZE_16BIT) && (hspi->Init.DataSize != SPI_DATASIZE_8BIT))
414 {
415 /* CRC must be disabled */
416 hspi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
417 }
418
419 /*----------------------- SPIx CR1 & CR2 Configuration ---------------------*/
420 /* Configure : SPI Mode, Communication Mode, Clock polarity and phase, NSS management,
421 Communication speed, First bit and CRC calculation state */
422 WRITE_REG(hspi->Instance->CR1, ((hspi->Init.Mode & (SPI_CR1_MSTR | SPI_CR1_SSI)) |
423 (hspi->Init.Direction & (SPI_CR1_RXONLY | SPI_CR1_BIDIMODE)) |
424 (hspi->Init.CLKPolarity & SPI_CR1_CPOL) |
425 (hspi->Init.CLKPhase & SPI_CR1_CPHA) |
426 (hspi->Init.NSS & SPI_CR1_SSM) |
427 (hspi->Init.BaudRatePrescaler & SPI_CR1_BR_Msk) |
428 (hspi->Init.FirstBit & SPI_CR1_LSBFIRST) |
429 (hspi->Init.CRCCalculation & SPI_CR1_CRCEN)));
430 #if (USE_SPI_CRC != 0U)
431 /*---------------------------- SPIx CRCL Configuration -------------------*/
432 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
433 {
434 /* Align the CRC Length on the data size */
435 if (hspi->Init.CRCLength == SPI_CRC_LENGTH_DATASIZE)
436 {
437 /* CRC Length aligned on the data size : value set by default */
438 if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
439 {
440 hspi->Init.CRCLength = SPI_CRC_LENGTH_16BIT;
441 }
442 else
443 {
444 hspi->Init.CRCLength = SPI_CRC_LENGTH_8BIT;
445 }
446 }
447
448 /* Configure : CRC Length */
449 if (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT)
450 {
451 SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCL);
452 }
453 }
454 #endif /* USE_SPI_CRC */
455
456 /* Configure : NSS management, TI Mode, NSS Pulse, Data size and Rx Fifo threshold */
457 WRITE_REG(hspi->Instance->CR2, (((hspi->Init.NSS >> 16U) & SPI_CR2_SSOE) |
458 (hspi->Init.TIMode & SPI_CR2_FRF) |
459 (hspi->Init.NSSPMode & SPI_CR2_NSSP) |
460 (hspi->Init.DataSize & SPI_CR2_DS_Msk) |
461 (frxth & SPI_CR2_FRXTH)));
462
463 #if (USE_SPI_CRC != 0U)
464 /*---------------------------- SPIx CRCPOLY Configuration ------------------*/
465 /* Configure : CRC Polynomial */
466 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
467 {
468 WRITE_REG(hspi->Instance->CRCPR, (hspi->Init.CRCPolynomial & SPI_CRCPR_CRCPOLY_Msk));
469 }
470 #endif /* USE_SPI_CRC */
471
472 #if defined(SPI_I2SCFGR_I2SMOD)
473 /* Activate the SPI mode (Make sure that I2SMOD bit in I2SCFGR register is reset) */
474 CLEAR_BIT(hspi->Instance->I2SCFGR, SPI_I2SCFGR_I2SMOD);
475 #endif /* SPI_I2SCFGR_I2SMOD */
476
477 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
478 hspi->State = HAL_SPI_STATE_READY;
479
480 return HAL_OK;
481 }
482
483 /**
484 * @brief De-Initialize the SPI peripheral.
485 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
486 * the configuration information for SPI module.
487 * @retval HAL status
488 */
HAL_SPI_DeInit(SPI_HandleTypeDef * hspi)489 HAL_StatusTypeDef HAL_SPI_DeInit(SPI_HandleTypeDef *hspi)
490 {
491 /* Check the SPI handle allocation */
492 if (hspi == NULL)
493 {
494 return HAL_ERROR;
495 }
496
497 /* Check SPI Instance parameter */
498 assert_param(IS_SPI_ALL_INSTANCE(hspi->Instance));
499
500 hspi->State = HAL_SPI_STATE_BUSY;
501
502 /* Disable the SPI Peripheral Clock */
503 __HAL_SPI_DISABLE(hspi);
504
505 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)
506 if (hspi->MspDeInitCallback == NULL)
507 {
508 hspi->MspDeInitCallback = HAL_SPI_MspDeInit; /* Legacy weak MspDeInit */
509 }
510
511 /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */
512 hspi->MspDeInitCallback(hspi);
513 #else
514 /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */
515 HAL_SPI_MspDeInit(hspi);
516 #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */
517
518 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
519 hspi->State = HAL_SPI_STATE_RESET;
520
521 /* Release Lock */
522 __HAL_UNLOCK(hspi);
523
524 return HAL_OK;
525 }
526
527 /**
528 * @brief Initialize the SPI MSP.
529 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
530 * the configuration information for SPI module.
531 * @retval None
532 */
HAL_SPI_MspInit(SPI_HandleTypeDef * hspi)533 __weak void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
534 {
535 /* Prevent unused argument(s) compilation warning */
536 UNUSED(hspi);
537
538 /* NOTE : This function should not be modified, when the callback is needed,
539 the HAL_SPI_MspInit should be implemented in the user file
540 */
541 }
542
543 /**
544 * @brief De-Initialize the SPI MSP.
545 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
546 * the configuration information for SPI module.
547 * @retval None
548 */
HAL_SPI_MspDeInit(SPI_HandleTypeDef * hspi)549 __weak void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi)
550 {
551 /* Prevent unused argument(s) compilation warning */
552 UNUSED(hspi);
553
554 /* NOTE : This function should not be modified, when the callback is needed,
555 the HAL_SPI_MspDeInit should be implemented in the user file
556 */
557 }
558
559 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)
560 /**
561 * @brief Register a User SPI Callback
562 * To be used instead of the weak predefined callback
563 * @param hspi Pointer to a SPI_HandleTypeDef structure that contains
564 * the configuration information for the specified SPI.
565 * @param CallbackID ID of the callback to be registered
566 * @param pCallback pointer to the Callback function
567 * @retval HAL status
568 */
HAL_SPI_RegisterCallback(SPI_HandleTypeDef * hspi,HAL_SPI_CallbackIDTypeDef CallbackID,pSPI_CallbackTypeDef pCallback)569 HAL_StatusTypeDef HAL_SPI_RegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID,
570 pSPI_CallbackTypeDef pCallback)
571 {
572 HAL_StatusTypeDef status = HAL_OK;
573
574 if (pCallback == NULL)
575 {
576 /* Update the error code */
577 hspi->ErrorCode |= HAL_SPI_ERROR_INVALID_CALLBACK;
578
579 return HAL_ERROR;
580 }
581 /* Process locked */
582 __HAL_LOCK(hspi);
583
584 if (HAL_SPI_STATE_READY == hspi->State)
585 {
586 switch (CallbackID)
587 {
588 case HAL_SPI_TX_COMPLETE_CB_ID :
589 hspi->TxCpltCallback = pCallback;
590 break;
591
592 case HAL_SPI_RX_COMPLETE_CB_ID :
593 hspi->RxCpltCallback = pCallback;
594 break;
595
596 case HAL_SPI_TX_RX_COMPLETE_CB_ID :
597 hspi->TxRxCpltCallback = pCallback;
598 break;
599
600 case HAL_SPI_TX_HALF_COMPLETE_CB_ID :
601 hspi->TxHalfCpltCallback = pCallback;
602 break;
603
604 case HAL_SPI_RX_HALF_COMPLETE_CB_ID :
605 hspi->RxHalfCpltCallback = pCallback;
606 break;
607
608 case HAL_SPI_TX_RX_HALF_COMPLETE_CB_ID :
609 hspi->TxRxHalfCpltCallback = pCallback;
610 break;
611
612 case HAL_SPI_ERROR_CB_ID :
613 hspi->ErrorCallback = pCallback;
614 break;
615
616 case HAL_SPI_ABORT_CB_ID :
617 hspi->AbortCpltCallback = pCallback;
618 break;
619
620 case HAL_SPI_MSPINIT_CB_ID :
621 hspi->MspInitCallback = pCallback;
622 break;
623
624 case HAL_SPI_MSPDEINIT_CB_ID :
625 hspi->MspDeInitCallback = pCallback;
626 break;
627
628 default :
629 /* Update the error code */
630 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK);
631
632 /* Return error status */
633 status = HAL_ERROR;
634 break;
635 }
636 }
637 else if (HAL_SPI_STATE_RESET == hspi->State)
638 {
639 switch (CallbackID)
640 {
641 case HAL_SPI_MSPINIT_CB_ID :
642 hspi->MspInitCallback = pCallback;
643 break;
644
645 case HAL_SPI_MSPDEINIT_CB_ID :
646 hspi->MspDeInitCallback = pCallback;
647 break;
648
649 default :
650 /* Update the error code */
651 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK);
652
653 /* Return error status */
654 status = HAL_ERROR;
655 break;
656 }
657 }
658 else
659 {
660 /* Update the error code */
661 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK);
662
663 /* Return error status */
664 status = HAL_ERROR;
665 }
666
667 /* Release Lock */
668 __HAL_UNLOCK(hspi);
669 return status;
670 }
671
672 /**
673 * @brief Unregister an SPI Callback
674 * SPI callback is redirected to the weak predefined callback
675 * @param hspi Pointer to a SPI_HandleTypeDef structure that contains
676 * the configuration information for the specified SPI.
677 * @param CallbackID ID of the callback to be unregistered
678 * @retval HAL status
679 */
HAL_SPI_UnRegisterCallback(SPI_HandleTypeDef * hspi,HAL_SPI_CallbackIDTypeDef CallbackID)680 HAL_StatusTypeDef HAL_SPI_UnRegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID)
681 {
682 HAL_StatusTypeDef status = HAL_OK;
683
684 /* Process locked */
685 __HAL_LOCK(hspi);
686
687 if (HAL_SPI_STATE_READY == hspi->State)
688 {
689 switch (CallbackID)
690 {
691 case HAL_SPI_TX_COMPLETE_CB_ID :
692 hspi->TxCpltCallback = HAL_SPI_TxCpltCallback; /* Legacy weak TxCpltCallback */
693 break;
694
695 case HAL_SPI_RX_COMPLETE_CB_ID :
696 hspi->RxCpltCallback = HAL_SPI_RxCpltCallback; /* Legacy weak RxCpltCallback */
697 break;
698
699 case HAL_SPI_TX_RX_COMPLETE_CB_ID :
700 hspi->TxRxCpltCallback = HAL_SPI_TxRxCpltCallback; /* Legacy weak TxRxCpltCallback */
701 break;
702
703 case HAL_SPI_TX_HALF_COMPLETE_CB_ID :
704 hspi->TxHalfCpltCallback = HAL_SPI_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */
705 break;
706
707 case HAL_SPI_RX_HALF_COMPLETE_CB_ID :
708 hspi->RxHalfCpltCallback = HAL_SPI_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */
709 break;
710
711 case HAL_SPI_TX_RX_HALF_COMPLETE_CB_ID :
712 hspi->TxRxHalfCpltCallback = HAL_SPI_TxRxHalfCpltCallback; /* Legacy weak TxRxHalfCpltCallback */
713 break;
714
715 case HAL_SPI_ERROR_CB_ID :
716 hspi->ErrorCallback = HAL_SPI_ErrorCallback; /* Legacy weak ErrorCallback */
717 break;
718
719 case HAL_SPI_ABORT_CB_ID :
720 hspi->AbortCpltCallback = HAL_SPI_AbortCpltCallback; /* Legacy weak AbortCpltCallback */
721 break;
722
723 case HAL_SPI_MSPINIT_CB_ID :
724 hspi->MspInitCallback = HAL_SPI_MspInit; /* Legacy weak MspInit */
725 break;
726
727 case HAL_SPI_MSPDEINIT_CB_ID :
728 hspi->MspDeInitCallback = HAL_SPI_MspDeInit; /* Legacy weak MspDeInit */
729 break;
730
731 default :
732 /* Update the error code */
733 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK);
734
735 /* Return error status */
736 status = HAL_ERROR;
737 break;
738 }
739 }
740 else if (HAL_SPI_STATE_RESET == hspi->State)
741 {
742 switch (CallbackID)
743 {
744 case HAL_SPI_MSPINIT_CB_ID :
745 hspi->MspInitCallback = HAL_SPI_MspInit; /* Legacy weak MspInit */
746 break;
747
748 case HAL_SPI_MSPDEINIT_CB_ID :
749 hspi->MspDeInitCallback = HAL_SPI_MspDeInit; /* Legacy weak MspDeInit */
750 break;
751
752 default :
753 /* Update the error code */
754 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK);
755
756 /* Return error status */
757 status = HAL_ERROR;
758 break;
759 }
760 }
761 else
762 {
763 /* Update the error code */
764 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK);
765
766 /* Return error status */
767 status = HAL_ERROR;
768 }
769
770 /* Release Lock */
771 __HAL_UNLOCK(hspi);
772 return status;
773 }
774 #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */
775 /**
776 * @}
777 */
778
779 /** @defgroup SPI_Exported_Functions_Group2 IO operation functions
780 * @brief Data transfers functions
781 *
782 @verbatim
783 ==============================================================================
784 ##### IO operation functions #####
785 ===============================================================================
786 [..]
787 This subsection provides a set of functions allowing to manage the SPI
788 data transfers.
789
790 [..] The SPI supports master and slave mode :
791
792 (#) There are two modes of transfer:
793 (++) Blocking mode: The communication is performed in polling mode.
794 The HAL status of all data processing is returned by the same function
795 after finishing transfer.
796 (++) No-Blocking mode: The communication is performed using Interrupts
797 or DMA, These APIs return the HAL status.
798 The end of the data processing will be indicated through the
799 dedicated SPI IRQ when using Interrupt mode or the DMA IRQ when
800 using DMA mode.
801 The HAL_SPI_TxCpltCallback(), HAL_SPI_RxCpltCallback() and HAL_SPI_TxRxCpltCallback() user callbacks
802 will be executed respectively at the end of the transmit or Receive process
803 The HAL_SPI_ErrorCallback()user callback will be executed when a communication error is detected
804
805 (#) APIs provided for these 2 transfer modes (Blocking mode or Non blocking mode using either Interrupt or DMA)
806 exist for 1Line (simplex) and 2Lines (full duplex) modes.
807
808 @endverbatim
809 * @{
810 */
811
812 /**
813 * @brief Transmit an amount of data in blocking mode.
814 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
815 * the configuration information for SPI module.
816 * @param pData pointer to data buffer
817 * @param Size amount of data to be sent
818 * @param Timeout Timeout duration
819 * @retval HAL status
820 */
HAL_SPI_Transmit(SPI_HandleTypeDef * hspi,uint8_t * pData,uint16_t Size,uint32_t Timeout)821 HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)
822 {
823 uint32_t tickstart;
824 HAL_StatusTypeDef errorcode = HAL_OK;
825 uint16_t initial_TxXferCount;
826
827 /* Check Direction parameter */
828 assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction));
829
830 /* Process Locked */
831 __HAL_LOCK(hspi);
832
833 /* Init tickstart for timeout management*/
834 tickstart = HAL_GetTick();
835 initial_TxXferCount = Size;
836
837 if (hspi->State != HAL_SPI_STATE_READY)
838 {
839 errorcode = HAL_BUSY;
840 goto error;
841 }
842
843 if ((pData == NULL) || (Size == 0U))
844 {
845 errorcode = HAL_ERROR;
846 goto error;
847 }
848
849 /* Set the transaction information */
850 hspi->State = HAL_SPI_STATE_BUSY_TX;
851 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
852 hspi->pTxBuffPtr = (uint8_t *)pData;
853 hspi->TxXferSize = Size;
854 hspi->TxXferCount = Size;
855
856 /*Init field not used in handle to zero */
857 hspi->pRxBuffPtr = (uint8_t *)NULL;
858 hspi->RxXferSize = 0U;
859 hspi->RxXferCount = 0U;
860 hspi->TxISR = NULL;
861 hspi->RxISR = NULL;
862
863 /* Configure communication direction : 1Line */
864 if (hspi->Init.Direction == SPI_DIRECTION_1LINE)
865 {
866 /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */
867 __HAL_SPI_DISABLE(hspi);
868 SPI_1LINE_TX(hspi);
869 }
870
871 #if (USE_SPI_CRC != 0U)
872 /* Reset CRC Calculation */
873 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
874 {
875 SPI_RESET_CRC(hspi);
876 }
877 #endif /* USE_SPI_CRC */
878
879 /* Check if the SPI is already enabled */
880 if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)
881 {
882 /* Enable SPI peripheral */
883 __HAL_SPI_ENABLE(hspi);
884 }
885
886 /* Transmit data in 16 Bit mode */
887 if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
888 {
889 if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U))
890 {
891 hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);
892 hspi->pTxBuffPtr += sizeof(uint16_t);
893 hspi->TxXferCount--;
894 }
895 /* Transmit data in 16 Bit mode */
896 while (hspi->TxXferCount > 0U)
897 {
898 /* Wait until TXE flag is set to send data */
899 if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE))
900 {
901 hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);
902 hspi->pTxBuffPtr += sizeof(uint16_t);
903 hspi->TxXferCount--;
904 }
905 else
906 {
907 /* Timeout management */
908 if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U))
909 {
910 errorcode = HAL_TIMEOUT;
911 hspi->State = HAL_SPI_STATE_READY;
912 goto error;
913 }
914 }
915 }
916 }
917 /* Transmit data in 8 Bit mode */
918 else
919 {
920 if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U))
921 {
922 *((__IO uint8_t *)&hspi->Instance->DR) = (*hspi->pTxBuffPtr);
923 hspi->pTxBuffPtr += sizeof(uint8_t);
924 hspi->TxXferCount--;
925 }
926 while (hspi->TxXferCount > 0U)
927 {
928 /* Wait until TXE flag is set to send data */
929 if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE))
930 {
931 *((__IO uint8_t *)&hspi->Instance->DR) = (*hspi->pTxBuffPtr);
932 hspi->pTxBuffPtr += sizeof(uint8_t);
933 hspi->TxXferCount--;
934 }
935 else
936 {
937 /* Timeout management */
938 if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U))
939 {
940 errorcode = HAL_TIMEOUT;
941 hspi->State = HAL_SPI_STATE_READY;
942 goto error;
943 }
944 }
945 }
946 }
947 #if (USE_SPI_CRC != 0U)
948 /* Enable CRC Transmission */
949 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
950 {
951 SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);
952 }
953 #endif /* USE_SPI_CRC */
954
955 /* Check the end of the transaction */
956 if (SPI_EndRxTxTransaction(hspi, Timeout, tickstart) != HAL_OK)
957 {
958 hspi->ErrorCode = HAL_SPI_ERROR_FLAG;
959 }
960
961 /* Clear overrun flag in 2 Lines communication mode because received is not read */
962 if (hspi->Init.Direction == SPI_DIRECTION_2LINES)
963 {
964 __HAL_SPI_CLEAR_OVRFLAG(hspi);
965 }
966
967 if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)
968 {
969 errorcode = HAL_ERROR;
970 }
971 else
972 {
973 hspi->State = HAL_SPI_STATE_READY;
974 }
975
976 error:
977 /* Process Unlocked */
978 __HAL_UNLOCK(hspi);
979 return errorcode;
980 }
981
982 /**
983 * @brief Receive an amount of data in blocking mode.
984 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
985 * the configuration information for SPI module.
986 * @param pData pointer to data buffer
987 * @param Size amount of data to be received
988 * @param Timeout Timeout duration
989 * @retval HAL status
990 */
HAL_SPI_Receive(SPI_HandleTypeDef * hspi,uint8_t * pData,uint16_t Size,uint32_t Timeout)991 HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)
992 {
993 #if (USE_SPI_CRC != 0U)
994 __IO uint32_t tmpreg = 0U;
995 __IO uint8_t *ptmpreg8;
996 __IO uint8_t tmpreg8 = 0;
997 #endif /* USE_SPI_CRC */
998 uint32_t tickstart;
999 HAL_StatusTypeDef errorcode = HAL_OK;
1000
1001 if (hspi->State != HAL_SPI_STATE_READY)
1002 {
1003 errorcode = HAL_BUSY;
1004 goto error;
1005 }
1006
1007 if ((hspi->Init.Mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES))
1008 {
1009 hspi->State = HAL_SPI_STATE_BUSY_RX;
1010 /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */
1011 return HAL_SPI_TransmitReceive(hspi, pData, pData, Size, Timeout);
1012 }
1013
1014 /* Process Locked */
1015 __HAL_LOCK(hspi);
1016
1017 /* Init tickstart for timeout management*/
1018 tickstart = HAL_GetTick();
1019
1020 if ((pData == NULL) || (Size == 0U))
1021 {
1022 errorcode = HAL_ERROR;
1023 goto error;
1024 }
1025
1026 /* Set the transaction information */
1027 hspi->State = HAL_SPI_STATE_BUSY_RX;
1028 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
1029 hspi->pRxBuffPtr = (uint8_t *)pData;
1030 hspi->RxXferSize = Size;
1031 hspi->RxXferCount = Size;
1032
1033 /*Init field not used in handle to zero */
1034 hspi->pTxBuffPtr = (uint8_t *)NULL;
1035 hspi->TxXferSize = 0U;
1036 hspi->TxXferCount = 0U;
1037 hspi->RxISR = NULL;
1038 hspi->TxISR = NULL;
1039
1040 #if (USE_SPI_CRC != 0U)
1041 /* Reset CRC Calculation */
1042 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
1043 {
1044 SPI_RESET_CRC(hspi);
1045 /* this is done to handle the CRCNEXT before the latest data */
1046 hspi->RxXferCount--;
1047 }
1048 #endif /* USE_SPI_CRC */
1049
1050 /* Set the Rx Fifo threshold */
1051 if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
1052 {
1053 /* Set RX Fifo threshold according the reception data length: 16bit */
1054 CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);
1055 }
1056 else
1057 {
1058 /* Set RX Fifo threshold according the reception data length: 8bit */
1059 SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);
1060 }
1061
1062 /* Configure communication direction: 1Line */
1063 if (hspi->Init.Direction == SPI_DIRECTION_1LINE)
1064 {
1065 /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */
1066 __HAL_SPI_DISABLE(hspi);
1067 SPI_1LINE_RX(hspi);
1068 }
1069
1070 /* Check if the SPI is already enabled */
1071 if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)
1072 {
1073 /* Enable SPI peripheral */
1074 __HAL_SPI_ENABLE(hspi);
1075 }
1076
1077 /* Receive data in 8 Bit mode */
1078 if (hspi->Init.DataSize <= SPI_DATASIZE_8BIT)
1079 {
1080 /* Transfer loop */
1081 while (hspi->RxXferCount > 0U)
1082 {
1083 /* Check the RXNE flag */
1084 if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE))
1085 {
1086 /* read the received data */
1087 (* (uint8_t *)hspi->pRxBuffPtr) = *(__IO uint8_t *)&hspi->Instance->DR;
1088 hspi->pRxBuffPtr += sizeof(uint8_t);
1089 hspi->RxXferCount--;
1090 }
1091 else
1092 {
1093 /* Timeout management */
1094 if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U))
1095 {
1096 errorcode = HAL_TIMEOUT;
1097 hspi->State = HAL_SPI_STATE_READY;
1098 goto error;
1099 }
1100 }
1101 }
1102 }
1103 else
1104 {
1105 /* Transfer loop */
1106 while (hspi->RxXferCount > 0U)
1107 {
1108 /* Check the RXNE flag */
1109 if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE))
1110 {
1111 *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR;
1112 hspi->pRxBuffPtr += sizeof(uint16_t);
1113 hspi->RxXferCount--;
1114 }
1115 else
1116 {
1117 /* Timeout management */
1118 if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U))
1119 {
1120 errorcode = HAL_TIMEOUT;
1121 hspi->State = HAL_SPI_STATE_READY;
1122 goto error;
1123 }
1124 }
1125 }
1126 }
1127
1128 #if (USE_SPI_CRC != 0U)
1129 /* Handle the CRC Transmission */
1130 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
1131 {
1132 /* freeze the CRC before the latest data */
1133 SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);
1134
1135 /* Read the latest data */
1136 if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK)
1137 {
1138 /* the latest data has not been received */
1139 errorcode = HAL_TIMEOUT;
1140 goto error;
1141 }
1142
1143 /* Receive last data in 16 Bit mode */
1144 if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
1145 {
1146 *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR;
1147 }
1148 /* Receive last data in 8 Bit mode */
1149 else
1150 {
1151 (*(uint8_t *)hspi->pRxBuffPtr) = *(__IO uint8_t *)&hspi->Instance->DR;
1152 }
1153
1154 /* Wait the CRC data */
1155 if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK)
1156 {
1157 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);
1158 errorcode = HAL_TIMEOUT;
1159 goto error;
1160 }
1161
1162 /* Read CRC to Flush DR and RXNE flag */
1163 if (hspi->Init.DataSize == SPI_DATASIZE_16BIT)
1164 {
1165 /* Read 16bit CRC */
1166 tmpreg = READ_REG(hspi->Instance->DR);
1167 /* To avoid GCC warning */
1168 UNUSED(tmpreg);
1169 }
1170 else
1171 {
1172 /* Initialize the 8bit temporary pointer */
1173 ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR;
1174 /* Read 8bit CRC */
1175 tmpreg8 = *ptmpreg8;
1176 /* To avoid GCC warning */
1177 UNUSED(tmpreg8);
1178
1179 if ((hspi->Init.DataSize == SPI_DATASIZE_8BIT) && (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT))
1180 {
1181 if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK)
1182 {
1183 /* Error on the CRC reception */
1184 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);
1185 errorcode = HAL_TIMEOUT;
1186 goto error;
1187 }
1188 /* Read 8bit CRC again in case of 16bit CRC in 8bit Data mode */
1189 tmpreg8 = *ptmpreg8;
1190 /* To avoid GCC warning */
1191 UNUSED(tmpreg8);
1192 }
1193 }
1194 }
1195 #endif /* USE_SPI_CRC */
1196
1197 /* Check the end of the transaction */
1198 if (SPI_EndRxTransaction(hspi, Timeout, tickstart) != HAL_OK)
1199 {
1200 hspi->ErrorCode = HAL_SPI_ERROR_FLAG;
1201 }
1202
1203 #if (USE_SPI_CRC != 0U)
1204 /* Check if CRC error occurred */
1205 if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR))
1206 {
1207 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);
1208 __HAL_SPI_CLEAR_CRCERRFLAG(hspi);
1209 }
1210 #endif /* USE_SPI_CRC */
1211
1212 if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)
1213 {
1214 errorcode = HAL_ERROR;
1215 }
1216 else
1217 {
1218 hspi->State = HAL_SPI_STATE_READY;
1219 }
1220
1221 error :
1222 __HAL_UNLOCK(hspi);
1223 return errorcode;
1224 }
1225
1226 /**
1227 * @brief Transmit and Receive an amount of data in blocking mode.
1228 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
1229 * the configuration information for SPI module.
1230 * @param pTxData pointer to transmission data buffer
1231 * @param pRxData pointer to reception data buffer
1232 * @param Size amount of data to be sent and received
1233 * @param Timeout Timeout duration
1234 * @retval HAL status
1235 */
HAL_SPI_TransmitReceive(SPI_HandleTypeDef * hspi,uint8_t * pTxData,uint8_t * pRxData,uint16_t Size,uint32_t Timeout)1236 HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size,
1237 uint32_t Timeout)
1238 {
1239 uint16_t initial_TxXferCount;
1240 uint32_t tmp_mode;
1241 HAL_SPI_StateTypeDef tmp_state;
1242 uint32_t tickstart;
1243 #if (USE_SPI_CRC != 0U)
1244 __IO uint32_t tmpreg = 0U;
1245 uint32_t spi_cr1;
1246 uint32_t spi_cr2;
1247 __IO uint8_t *ptmpreg8;
1248 __IO uint8_t tmpreg8 = 0;
1249 #endif /* USE_SPI_CRC */
1250
1251 /* Variable used to alternate Rx and Tx during transfer */
1252 uint32_t txallowed = 1U;
1253 HAL_StatusTypeDef errorcode = HAL_OK;
1254
1255 /* Check Direction parameter */
1256 assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));
1257
1258 /* Process Locked */
1259 __HAL_LOCK(hspi);
1260
1261 /* Init tickstart for timeout management*/
1262 tickstart = HAL_GetTick();
1263
1264 /* Init temporary variables */
1265 tmp_state = hspi->State;
1266 tmp_mode = hspi->Init.Mode;
1267 initial_TxXferCount = Size;
1268 #if (USE_SPI_CRC != 0U)
1269 spi_cr1 = READ_REG(hspi->Instance->CR1);
1270 spi_cr2 = READ_REG(hspi->Instance->CR2);
1271 #endif /* USE_SPI_CRC */
1272
1273 if (!((tmp_state == HAL_SPI_STATE_READY) || \
1274 ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_state == HAL_SPI_STATE_BUSY_RX))))
1275 {
1276 errorcode = HAL_BUSY;
1277 goto error;
1278 }
1279
1280 if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U))
1281 {
1282 errorcode = HAL_ERROR;
1283 goto error;
1284 }
1285
1286 /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */
1287 if (hspi->State != HAL_SPI_STATE_BUSY_RX)
1288 {
1289 hspi->State = HAL_SPI_STATE_BUSY_TX_RX;
1290 }
1291
1292 /* Set the transaction information */
1293 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
1294 hspi->pRxBuffPtr = (uint8_t *)pRxData;
1295 hspi->RxXferCount = Size;
1296 hspi->RxXferSize = Size;
1297 hspi->pTxBuffPtr = (uint8_t *)pTxData;
1298 hspi->TxXferCount = Size;
1299 hspi->TxXferSize = Size;
1300
1301 /*Init field not used in handle to zero */
1302 hspi->RxISR = NULL;
1303 hspi->TxISR = NULL;
1304
1305 #if (USE_SPI_CRC != 0U)
1306 /* Reset CRC Calculation */
1307 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
1308 {
1309 SPI_RESET_CRC(hspi);
1310 }
1311 #endif /* USE_SPI_CRC */
1312
1313 /* Set the Rx Fifo threshold */
1314 if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
1315 {
1316 /* Set fiforxthreshold according the reception data length: 16bit */
1317 CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);
1318 }
1319 else
1320 {
1321 /* Set fiforxthreshold according the reception data length: 8bit */
1322 SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);
1323 }
1324
1325 /* Check if the SPI is already enabled */
1326 if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)
1327 {
1328 /* Enable SPI peripheral */
1329 __HAL_SPI_ENABLE(hspi);
1330 }
1331
1332 /* Transmit and Receive data in 16 Bit mode */
1333 if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
1334 {
1335 if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U))
1336 {
1337 hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);
1338 hspi->pTxBuffPtr += sizeof(uint16_t);
1339 hspi->TxXferCount--;
1340
1341 #if (USE_SPI_CRC != 0U)
1342 /* Enable CRC Transmission */
1343 if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE))
1344 {
1345 /* Set NSS Soft to received correctly the CRC on slave mode with NSS pulse activated */
1346 if ((READ_BIT(spi_cr1, SPI_CR1_MSTR) == 0U) && (READ_BIT(spi_cr2, SPI_CR2_NSSP) == SPI_CR2_NSSP))
1347 {
1348 SET_BIT(hspi->Instance->CR1, SPI_CR1_SSM);
1349 }
1350 SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);
1351 }
1352 #endif /* USE_SPI_CRC */
1353
1354 }
1355 while ((hspi->TxXferCount > 0U) || (hspi->RxXferCount > 0U))
1356 {
1357 /* Check TXE flag */
1358 if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) && (hspi->TxXferCount > 0U) && (txallowed == 1U))
1359 {
1360 hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);
1361 hspi->pTxBuffPtr += sizeof(uint16_t);
1362 hspi->TxXferCount--;
1363 /* Next Data is a reception (Rx). Tx not allowed */
1364 txallowed = 0U;
1365
1366 #if (USE_SPI_CRC != 0U)
1367 /* Enable CRC Transmission */
1368 if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE))
1369 {
1370 /* Set NSS Soft to received correctly the CRC on slave mode with NSS pulse activated */
1371 if ((READ_BIT(spi_cr1, SPI_CR1_MSTR) == 0U) && (READ_BIT(spi_cr2, SPI_CR2_NSSP) == SPI_CR2_NSSP))
1372 {
1373 SET_BIT(hspi->Instance->CR1, SPI_CR1_SSM);
1374 }
1375 SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);
1376 }
1377 #endif /* USE_SPI_CRC */
1378 }
1379
1380 /* Check RXNE flag */
1381 if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) && (hspi->RxXferCount > 0U))
1382 {
1383 *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR;
1384 hspi->pRxBuffPtr += sizeof(uint16_t);
1385 hspi->RxXferCount--;
1386 /* Next Data is a Transmission (Tx). Tx is allowed */
1387 txallowed = 1U;
1388 }
1389 if (((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY))
1390 {
1391 errorcode = HAL_TIMEOUT;
1392 hspi->State = HAL_SPI_STATE_READY;
1393 goto error;
1394 }
1395 }
1396 }
1397 /* Transmit and Receive data in 8 Bit mode */
1398 else
1399 {
1400 if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U))
1401 {
1402 *((__IO uint8_t *)&hspi->Instance->DR) = (*hspi->pTxBuffPtr);
1403 hspi->pTxBuffPtr += sizeof(uint8_t);
1404 hspi->TxXferCount--;
1405
1406 #if (USE_SPI_CRC != 0U)
1407 /* Enable CRC Transmission */
1408 if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE))
1409 {
1410 /* Set NSS Soft to received correctly the CRC on slave mode with NSS pulse activated */
1411 if ((READ_BIT(spi_cr1, SPI_CR1_MSTR) == 0U) && (READ_BIT(spi_cr2, SPI_CR2_NSSP) == SPI_CR2_NSSP))
1412 {
1413 SET_BIT(hspi->Instance->CR1, SPI_CR1_SSM);
1414 }
1415 SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);
1416 }
1417 #endif /* USE_SPI_CRC */
1418 }
1419 while ((hspi->TxXferCount > 0U) || (hspi->RxXferCount > 0U))
1420 {
1421 /* Check TXE flag */
1422 if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) && (hspi->TxXferCount > 0U) && (txallowed == 1U))
1423 {
1424 *(__IO uint8_t *)&hspi->Instance->DR = (*hspi->pTxBuffPtr);
1425 hspi->pTxBuffPtr++;
1426 hspi->TxXferCount--;
1427 /* Next Data is a reception (Rx). Tx not allowed */
1428 txallowed = 0U;
1429
1430 #if (USE_SPI_CRC != 0U)
1431 /* Enable CRC Transmission */
1432 if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE))
1433 {
1434 /* Set NSS Soft to received correctly the CRC on slave mode with NSS pulse activated */
1435 if ((READ_BIT(spi_cr1, SPI_CR1_MSTR) == 0U) && (READ_BIT(spi_cr2, SPI_CR2_NSSP) == SPI_CR2_NSSP))
1436 {
1437 SET_BIT(hspi->Instance->CR1, SPI_CR1_SSM);
1438 }
1439 SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);
1440 }
1441 #endif /* USE_SPI_CRC */
1442 }
1443
1444 /* Wait until RXNE flag is reset */
1445 if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) && (hspi->RxXferCount > 0U))
1446 {
1447 (*(uint8_t *)hspi->pRxBuffPtr) = *(__IO uint8_t *)&hspi->Instance->DR;
1448 hspi->pRxBuffPtr++;
1449 hspi->RxXferCount--;
1450 /* Next Data is a Transmission (Tx). Tx is allowed */
1451 txallowed = 1U;
1452 }
1453 if ((((HAL_GetTick() - tickstart) >= Timeout) && ((Timeout != HAL_MAX_DELAY))) || (Timeout == 0U))
1454 {
1455 errorcode = HAL_TIMEOUT;
1456 hspi->State = HAL_SPI_STATE_READY;
1457 goto error;
1458 }
1459 }
1460 }
1461
1462 #if (USE_SPI_CRC != 0U)
1463 /* Read CRC from DR to close CRC calculation process */
1464 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
1465 {
1466 /* Wait until TXE flag */
1467 if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK)
1468 {
1469 /* Error on the CRC reception */
1470 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);
1471 errorcode = HAL_TIMEOUT;
1472 goto error;
1473 }
1474 /* Read CRC */
1475 if (hspi->Init.DataSize == SPI_DATASIZE_16BIT)
1476 {
1477 /* Read 16bit CRC */
1478 tmpreg = READ_REG(hspi->Instance->DR);
1479 /* To avoid GCC warning */
1480 UNUSED(tmpreg);
1481 }
1482 else
1483 {
1484 /* Initialize the 8bit temporary pointer */
1485 ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR;
1486 /* Read 8bit CRC */
1487 tmpreg8 = *ptmpreg8;
1488 /* To avoid GCC warning */
1489 UNUSED(tmpreg8);
1490
1491 if (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT)
1492 {
1493 if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK)
1494 {
1495 /* Error on the CRC reception */
1496 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);
1497 errorcode = HAL_TIMEOUT;
1498 goto error;
1499 }
1500 /* Read 8bit CRC again in case of 16bit CRC in 8bit Data mode */
1501 tmpreg8 = *ptmpreg8;
1502 /* To avoid GCC warning */
1503 UNUSED(tmpreg8);
1504 }
1505 }
1506 }
1507
1508 /* Check if CRC error occurred */
1509 if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR))
1510 {
1511 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);
1512 /* Clear CRC Flag */
1513 __HAL_SPI_CLEAR_CRCERRFLAG(hspi);
1514
1515 errorcode = HAL_ERROR;
1516 }
1517 #endif /* USE_SPI_CRC */
1518
1519 /* Check the end of the transaction */
1520 if (SPI_EndRxTxTransaction(hspi, Timeout, tickstart) != HAL_OK)
1521 {
1522 errorcode = HAL_ERROR;
1523 hspi->ErrorCode = HAL_SPI_ERROR_FLAG;
1524 }
1525
1526 if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)
1527 {
1528 errorcode = HAL_ERROR;
1529 }
1530 else
1531 {
1532 hspi->State = HAL_SPI_STATE_READY;
1533 }
1534
1535 error :
1536 __HAL_UNLOCK(hspi);
1537 return errorcode;
1538 }
1539
1540 /**
1541 * @brief Transmit an amount of data in non-blocking mode with Interrupt.
1542 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
1543 * the configuration information for SPI module.
1544 * @param pData pointer to data buffer
1545 * @param Size amount of data to be sent
1546 * @retval HAL status
1547 */
HAL_SPI_Transmit_IT(SPI_HandleTypeDef * hspi,uint8_t * pData,uint16_t Size)1548 HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
1549 {
1550 HAL_StatusTypeDef errorcode = HAL_OK;
1551
1552 /* Check Direction parameter */
1553 assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction));
1554
1555
1556 if ((pData == NULL) || (Size == 0U))
1557 {
1558 errorcode = HAL_ERROR;
1559 goto error;
1560 }
1561
1562 if (hspi->State != HAL_SPI_STATE_READY)
1563 {
1564 errorcode = HAL_BUSY;
1565 goto error;
1566 }
1567
1568 /* Process Locked */
1569 __HAL_LOCK(hspi);
1570
1571 /* Set the transaction information */
1572 hspi->State = HAL_SPI_STATE_BUSY_TX;
1573 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
1574 hspi->pTxBuffPtr = (uint8_t *)pData;
1575 hspi->TxXferSize = Size;
1576 hspi->TxXferCount = Size;
1577
1578 /* Init field not used in handle to zero */
1579 hspi->pRxBuffPtr = (uint8_t *)NULL;
1580 hspi->RxXferSize = 0U;
1581 hspi->RxXferCount = 0U;
1582 hspi->RxISR = NULL;
1583
1584 /* Set the function for IT treatment */
1585 if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
1586 {
1587 hspi->TxISR = SPI_TxISR_16BIT;
1588 }
1589 else
1590 {
1591 hspi->TxISR = SPI_TxISR_8BIT;
1592 }
1593
1594 /* Configure communication direction : 1Line */
1595 if (hspi->Init.Direction == SPI_DIRECTION_1LINE)
1596 {
1597 /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */
1598 __HAL_SPI_DISABLE(hspi);
1599 SPI_1LINE_TX(hspi);
1600 }
1601
1602 #if (USE_SPI_CRC != 0U)
1603 /* Reset CRC Calculation */
1604 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
1605 {
1606 SPI_RESET_CRC(hspi);
1607 }
1608 #endif /* USE_SPI_CRC */
1609
1610 /* Check if the SPI is already enabled */
1611 if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)
1612 {
1613 /* Enable SPI peripheral */
1614 __HAL_SPI_ENABLE(hspi);
1615 }
1616
1617 /* Process Unlocked */
1618 __HAL_UNLOCK(hspi);
1619 /* Enable TXE and ERR interrupt */
1620 __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_ERR));
1621
1622 error :
1623 return errorcode;
1624 }
1625
1626 /**
1627 * @brief Receive an amount of data in non-blocking mode with Interrupt.
1628 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
1629 * the configuration information for SPI module.
1630 * @param pData pointer to data buffer
1631 * @param Size amount of data to be sent
1632 * @retval HAL status
1633 */
HAL_SPI_Receive_IT(SPI_HandleTypeDef * hspi,uint8_t * pData,uint16_t Size)1634 HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
1635 {
1636 HAL_StatusTypeDef errorcode = HAL_OK;
1637
1638
1639 if (hspi->State != HAL_SPI_STATE_READY)
1640 {
1641 errorcode = HAL_BUSY;
1642 goto error;
1643 }
1644
1645 if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER))
1646 {
1647 hspi->State = HAL_SPI_STATE_BUSY_RX;
1648 /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */
1649 return HAL_SPI_TransmitReceive_IT(hspi, pData, pData, Size);
1650 }
1651
1652
1653 if ((pData == NULL) || (Size == 0U))
1654 {
1655 errorcode = HAL_ERROR;
1656 goto error;
1657 }
1658
1659 /* Process Locked */
1660 __HAL_LOCK(hspi);
1661
1662 /* Set the transaction information */
1663 hspi->State = HAL_SPI_STATE_BUSY_RX;
1664 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
1665 hspi->pRxBuffPtr = (uint8_t *)pData;
1666 hspi->RxXferSize = Size;
1667 hspi->RxXferCount = Size;
1668
1669 /* Init field not used in handle to zero */
1670 hspi->pTxBuffPtr = (uint8_t *)NULL;
1671 hspi->TxXferSize = 0U;
1672 hspi->TxXferCount = 0U;
1673 hspi->TxISR = NULL;
1674
1675 /* Check the data size to adapt Rx threshold and the set the function for IT treatment */
1676 if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
1677 {
1678 /* Set RX Fifo threshold according the reception data length: 16 bit */
1679 CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);
1680 hspi->RxISR = SPI_RxISR_16BIT;
1681 }
1682 else
1683 {
1684 /* Set RX Fifo threshold according the reception data length: 8 bit */
1685 SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);
1686 hspi->RxISR = SPI_RxISR_8BIT;
1687 }
1688
1689 /* Configure communication direction : 1Line */
1690 if (hspi->Init.Direction == SPI_DIRECTION_1LINE)
1691 {
1692 /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */
1693 __HAL_SPI_DISABLE(hspi);
1694 SPI_1LINE_RX(hspi);
1695 }
1696
1697 #if (USE_SPI_CRC != 0U)
1698 /* Reset CRC Calculation */
1699 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
1700 {
1701 hspi->CRCSize = 1U;
1702 if ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT))
1703 {
1704 hspi->CRCSize = 2U;
1705 }
1706 SPI_RESET_CRC(hspi);
1707 }
1708 else
1709 {
1710 hspi->CRCSize = 0U;
1711 }
1712 #endif /* USE_SPI_CRC */
1713
1714 /* Note : The SPI must be enabled after unlocking current process
1715 to avoid the risk of SPI interrupt handle execution before current
1716 process unlock */
1717
1718 /* Check if the SPI is already enabled */
1719 if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)
1720 {
1721 /* Enable SPI peripheral */
1722 __HAL_SPI_ENABLE(hspi);
1723 }
1724
1725 /* Process Unlocked */
1726 __HAL_UNLOCK(hspi);
1727 /* Enable RXNE and ERR interrupt */
1728 __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR));
1729
1730 error :
1731 return errorcode;
1732 }
1733
1734 /**
1735 * @brief Transmit and Receive an amount of data in non-blocking mode with Interrupt.
1736 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
1737 * the configuration information for SPI module.
1738 * @param pTxData pointer to transmission data buffer
1739 * @param pRxData pointer to reception data buffer
1740 * @param Size amount of data to be sent and received
1741 * @retval HAL status
1742 */
HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef * hspi,uint8_t * pTxData,uint8_t * pRxData,uint16_t Size)1743 HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size)
1744 {
1745 uint32_t tmp_mode;
1746 HAL_SPI_StateTypeDef tmp_state;
1747 HAL_StatusTypeDef errorcode = HAL_OK;
1748
1749 /* Check Direction parameter */
1750 assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));
1751
1752 /* Init temporary variables */
1753 tmp_state = hspi->State;
1754 tmp_mode = hspi->Init.Mode;
1755
1756 if (!((tmp_state == HAL_SPI_STATE_READY) || \
1757 ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_state == HAL_SPI_STATE_BUSY_RX))))
1758 {
1759 errorcode = HAL_BUSY;
1760 goto error;
1761 }
1762
1763 if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U))
1764 {
1765 errorcode = HAL_ERROR;
1766 goto error;
1767 }
1768
1769 /* Process locked */
1770 __HAL_LOCK(hspi);
1771
1772 /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */
1773 if (hspi->State != HAL_SPI_STATE_BUSY_RX)
1774 {
1775 hspi->State = HAL_SPI_STATE_BUSY_TX_RX;
1776 }
1777
1778 /* Set the transaction information */
1779 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
1780 hspi->pTxBuffPtr = (uint8_t *)pTxData;
1781 hspi->TxXferSize = Size;
1782 hspi->TxXferCount = Size;
1783 hspi->pRxBuffPtr = (uint8_t *)pRxData;
1784 hspi->RxXferSize = Size;
1785 hspi->RxXferCount = Size;
1786
1787 /* Set the function for IT treatment */
1788 if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
1789 {
1790 hspi->RxISR = SPI_2linesRxISR_16BIT;
1791 hspi->TxISR = SPI_2linesTxISR_16BIT;
1792 }
1793 else
1794 {
1795 hspi->RxISR = SPI_2linesRxISR_8BIT;
1796 hspi->TxISR = SPI_2linesTxISR_8BIT;
1797 }
1798
1799 #if (USE_SPI_CRC != 0U)
1800 /* Reset CRC Calculation */
1801 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
1802 {
1803 hspi->CRCSize = 1U;
1804 if ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT))
1805 {
1806 hspi->CRCSize = 2U;
1807 }
1808 SPI_RESET_CRC(hspi);
1809 }
1810 else
1811 {
1812 hspi->CRCSize = 0U;
1813 }
1814 #endif /* USE_SPI_CRC */
1815
1816 /* Check if packing mode is enabled and if there is more than 2 data to receive */
1817 if ((hspi->Init.DataSize > SPI_DATASIZE_8BIT) || (Size >= 2U))
1818 {
1819 /* Set RX Fifo threshold according the reception data length: 16 bit */
1820 CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);
1821 }
1822 else
1823 {
1824 /* Set RX Fifo threshold according the reception data length: 8 bit */
1825 SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);
1826 }
1827
1828
1829 /* Check if the SPI is already enabled */
1830 if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)
1831 {
1832 /* Enable SPI peripheral */
1833 __HAL_SPI_ENABLE(hspi);
1834 }
1835
1836 /* Process Unlocked */
1837 __HAL_UNLOCK(hspi);
1838 /* Enable TXE, RXNE and ERR interrupt */
1839 __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR));
1840
1841 error :
1842 return errorcode;
1843 }
1844
1845 /**
1846 * @brief Transmit an amount of data in non-blocking mode with DMA.
1847 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
1848 * the configuration information for SPI module.
1849 * @param pData pointer to data buffer
1850 * @param Size amount of data to be sent
1851 * @retval HAL status
1852 */
HAL_SPI_Transmit_DMA(SPI_HandleTypeDef * hspi,uint8_t * pData,uint16_t Size)1853 HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
1854 {
1855 HAL_StatusTypeDef errorcode = HAL_OK;
1856
1857 /* Check tx dma handle */
1858 assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx));
1859
1860 /* Check Direction parameter */
1861 assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction));
1862
1863 /* Process Locked */
1864 __HAL_LOCK(hspi);
1865
1866 if (hspi->State != HAL_SPI_STATE_READY)
1867 {
1868 errorcode = HAL_BUSY;
1869 goto error;
1870 }
1871
1872 if ((pData == NULL) || (Size == 0U))
1873 {
1874 errorcode = HAL_ERROR;
1875 goto error;
1876 }
1877
1878 /* Set the transaction information */
1879 hspi->State = HAL_SPI_STATE_BUSY_TX;
1880 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
1881 hspi->pTxBuffPtr = (uint8_t *)pData;
1882 hspi->TxXferSize = Size;
1883 hspi->TxXferCount = Size;
1884
1885 /* Init field not used in handle to zero */
1886 hspi->pRxBuffPtr = (uint8_t *)NULL;
1887 hspi->TxISR = NULL;
1888 hspi->RxISR = NULL;
1889 hspi->RxXferSize = 0U;
1890 hspi->RxXferCount = 0U;
1891
1892 /* Configure communication direction : 1Line */
1893 if (hspi->Init.Direction == SPI_DIRECTION_1LINE)
1894 {
1895 /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */
1896 __HAL_SPI_DISABLE(hspi);
1897 SPI_1LINE_TX(hspi);
1898 }
1899
1900 #if (USE_SPI_CRC != 0U)
1901 /* Reset CRC Calculation */
1902 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
1903 {
1904 SPI_RESET_CRC(hspi);
1905 }
1906 #endif /* USE_SPI_CRC */
1907
1908 /* Set the SPI TxDMA Half transfer complete callback */
1909 hspi->hdmatx->XferHalfCpltCallback = SPI_DMAHalfTransmitCplt;
1910
1911 /* Set the SPI TxDMA transfer complete callback */
1912 hspi->hdmatx->XferCpltCallback = SPI_DMATransmitCplt;
1913
1914 /* Set the DMA error callback */
1915 hspi->hdmatx->XferErrorCallback = SPI_DMAError;
1916
1917 /* Set the DMA AbortCpltCallback */
1918 hspi->hdmatx->XferAbortCallback = NULL;
1919
1920 CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX);
1921 /* Packing mode is enabled only if the DMA setting is HALWORD */
1922 if ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (hspi->hdmatx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD))
1923 {
1924 /* Check the even/odd of the data size + crc if enabled */
1925 if ((hspi->TxXferCount & 0x1U) == 0U)
1926 {
1927 CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX);
1928 hspi->TxXferCount = (hspi->TxXferCount >> 1U);
1929 }
1930 else
1931 {
1932 SET_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX);
1933 hspi->TxXferCount = (hspi->TxXferCount >> 1U) + 1U;
1934 }
1935 }
1936
1937 /* Enable the Tx DMA Stream/Channel */
1938 if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instance->DR,
1939 hspi->TxXferCount))
1940 {
1941 /* Update SPI error code */
1942 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA);
1943 errorcode = HAL_ERROR;
1944
1945 goto error;
1946 }
1947
1948 /* Check if the SPI is already enabled */
1949 if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)
1950 {
1951 /* Enable SPI peripheral */
1952 __HAL_SPI_ENABLE(hspi);
1953 }
1954
1955 /* Enable the SPI Error Interrupt Bit */
1956 __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR));
1957
1958 /* Enable Tx DMA Request */
1959 SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN);
1960
1961 error :
1962 /* Process Unlocked */
1963 __HAL_UNLOCK(hspi);
1964 return errorcode;
1965 }
1966
1967 /**
1968 * @brief Receive an amount of data in non-blocking mode with DMA.
1969 * @note In case of MASTER mode and SPI_DIRECTION_2LINES direction, hdmatx shall be defined.
1970 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
1971 * the configuration information for SPI module.
1972 * @param pData pointer to data buffer
1973 * @note When the CRC feature is enabled the pData Length must be Size + 1.
1974 * @param Size amount of data to be sent
1975 * @retval HAL status
1976 */
HAL_SPI_Receive_DMA(SPI_HandleTypeDef * hspi,uint8_t * pData,uint16_t Size)1977 HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
1978 {
1979 HAL_StatusTypeDef errorcode = HAL_OK;
1980
1981 /* Check rx dma handle */
1982 assert_param(IS_SPI_DMA_HANDLE(hspi->hdmarx));
1983
1984 if (hspi->State != HAL_SPI_STATE_READY)
1985 {
1986 errorcode = HAL_BUSY;
1987 goto error;
1988 }
1989
1990 if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER))
1991 {
1992 hspi->State = HAL_SPI_STATE_BUSY_RX;
1993
1994 /* Check tx dma handle */
1995 assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx));
1996
1997 /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */
1998 return HAL_SPI_TransmitReceive_DMA(hspi, pData, pData, Size);
1999 }
2000
2001 /* Process Locked */
2002 __HAL_LOCK(hspi);
2003
2004 if ((pData == NULL) || (Size == 0U))
2005 {
2006 errorcode = HAL_ERROR;
2007 goto error;
2008 }
2009
2010 /* Set the transaction information */
2011 hspi->State = HAL_SPI_STATE_BUSY_RX;
2012 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
2013 hspi->pRxBuffPtr = (uint8_t *)pData;
2014 hspi->RxXferSize = Size;
2015 hspi->RxXferCount = Size;
2016
2017 /*Init field not used in handle to zero */
2018 hspi->RxISR = NULL;
2019 hspi->TxISR = NULL;
2020 hspi->TxXferSize = 0U;
2021 hspi->TxXferCount = 0U;
2022
2023 /* Configure communication direction : 1Line */
2024 if (hspi->Init.Direction == SPI_DIRECTION_1LINE)
2025 {
2026 /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */
2027 __HAL_SPI_DISABLE(hspi);
2028 SPI_1LINE_RX(hspi);
2029 }
2030
2031 #if (USE_SPI_CRC != 0U)
2032 /* Reset CRC Calculation */
2033 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
2034 {
2035 SPI_RESET_CRC(hspi);
2036 }
2037 #endif /* USE_SPI_CRC */
2038
2039
2040 CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX);
2041 if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
2042 {
2043 /* Set RX Fifo threshold according the reception data length: 16bit */
2044 CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);
2045 }
2046 else
2047 {
2048 /* Set RX Fifo threshold according the reception data length: 8bit */
2049 SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);
2050
2051 if (hspi->hdmarx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD)
2052 {
2053 /* Set RX Fifo threshold according the reception data length: 16bit */
2054 CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);
2055
2056 if ((hspi->RxXferCount & 0x1U) == 0x0U)
2057 {
2058 CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX);
2059 hspi->RxXferCount = hspi->RxXferCount >> 1U;
2060 }
2061 else
2062 {
2063 SET_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX);
2064 hspi->RxXferCount = (hspi->RxXferCount >> 1U) + 1U;
2065 }
2066 }
2067 }
2068
2069 /* Set the SPI RxDMA Half transfer complete callback */
2070 hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfReceiveCplt;
2071
2072 /* Set the SPI Rx DMA transfer complete callback */
2073 hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt;
2074
2075 /* Set the DMA error callback */
2076 hspi->hdmarx->XferErrorCallback = SPI_DMAError;
2077
2078 /* Set the DMA AbortCpltCallback */
2079 hspi->hdmarx->XferAbortCallback = NULL;
2080
2081 /* Enable the Rx DMA Stream/Channel */
2082 if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBuffPtr,
2083 hspi->RxXferCount))
2084 {
2085 /* Update SPI error code */
2086 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA);
2087 errorcode = HAL_ERROR;
2088
2089 goto error;
2090 }
2091
2092 /* Check if the SPI is already enabled */
2093 if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)
2094 {
2095 /* Enable SPI peripheral */
2096 __HAL_SPI_ENABLE(hspi);
2097 }
2098
2099 /* Enable the SPI Error Interrupt Bit */
2100 __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR));
2101
2102 /* Enable Rx DMA Request */
2103 SET_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN);
2104
2105 error:
2106 /* Process Unlocked */
2107 __HAL_UNLOCK(hspi);
2108 return errorcode;
2109 }
2110
2111 /**
2112 * @brief Transmit and Receive an amount of data in non-blocking mode with DMA.
2113 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
2114 * the configuration information for SPI module.
2115 * @param pTxData pointer to transmission data buffer
2116 * @param pRxData pointer to reception data buffer
2117 * @note When the CRC feature is enabled the pRxData Length must be Size + 1
2118 * @param Size amount of data to be sent
2119 * @retval HAL status
2120 */
HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef * hspi,uint8_t * pTxData,uint8_t * pRxData,uint16_t Size)2121 HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData,
2122 uint16_t Size)
2123 {
2124 uint32_t tmp_mode;
2125 HAL_SPI_StateTypeDef tmp_state;
2126 HAL_StatusTypeDef errorcode = HAL_OK;
2127
2128 /* Check rx & tx dma handles */
2129 assert_param(IS_SPI_DMA_HANDLE(hspi->hdmarx));
2130 assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx));
2131
2132 /* Check Direction parameter */
2133 assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));
2134
2135 /* Process locked */
2136 __HAL_LOCK(hspi);
2137
2138 /* Init temporary variables */
2139 tmp_state = hspi->State;
2140 tmp_mode = hspi->Init.Mode;
2141
2142 if (!((tmp_state == HAL_SPI_STATE_READY) ||
2143 ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_state == HAL_SPI_STATE_BUSY_RX))))
2144 {
2145 errorcode = HAL_BUSY;
2146 goto error;
2147 }
2148
2149 if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U))
2150 {
2151 errorcode = HAL_ERROR;
2152 goto error;
2153 }
2154
2155 /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */
2156 if (hspi->State != HAL_SPI_STATE_BUSY_RX)
2157 {
2158 hspi->State = HAL_SPI_STATE_BUSY_TX_RX;
2159 }
2160
2161 /* Set the transaction information */
2162 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
2163 hspi->pTxBuffPtr = (uint8_t *)pTxData;
2164 hspi->TxXferSize = Size;
2165 hspi->TxXferCount = Size;
2166 hspi->pRxBuffPtr = (uint8_t *)pRxData;
2167 hspi->RxXferSize = Size;
2168 hspi->RxXferCount = Size;
2169
2170 /* Init field not used in handle to zero */
2171 hspi->RxISR = NULL;
2172 hspi->TxISR = NULL;
2173
2174 #if (USE_SPI_CRC != 0U)
2175 /* Reset CRC Calculation */
2176 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
2177 {
2178 SPI_RESET_CRC(hspi);
2179 }
2180 #endif /* USE_SPI_CRC */
2181
2182 /* Reset the threshold bit */
2183 CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX | SPI_CR2_LDMARX);
2184
2185 /* The packing mode management is enabled by the DMA settings according the spi data size */
2186 if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
2187 {
2188 /* Set fiforxthreshold according the reception data length: 16bit */
2189 CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);
2190 }
2191 else
2192 {
2193 /* Set RX Fifo threshold according the reception data length: 8bit */
2194 SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);
2195
2196 if (hspi->hdmatx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD)
2197 {
2198 if ((hspi->TxXferSize & 0x1U) == 0x0U)
2199 {
2200 CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX);
2201 hspi->TxXferCount = hspi->TxXferCount >> 1U;
2202 }
2203 else
2204 {
2205 SET_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX);
2206 hspi->TxXferCount = (hspi->TxXferCount >> 1U) + 1U;
2207 }
2208 }
2209
2210 if (hspi->hdmarx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD)
2211 {
2212 /* Set RX Fifo threshold according the reception data length: 16bit */
2213 CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);
2214
2215 if ((hspi->RxXferCount & 0x1U) == 0x0U)
2216 {
2217 CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX);
2218 hspi->RxXferCount = hspi->RxXferCount >> 1U;
2219 }
2220 else
2221 {
2222 SET_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX);
2223 hspi->RxXferCount = (hspi->RxXferCount >> 1U) + 1U;
2224 }
2225 }
2226 }
2227
2228 /* Check if we are in Rx only or in Rx/Tx Mode and configure the DMA transfer complete callback */
2229 if (hspi->State == HAL_SPI_STATE_BUSY_RX)
2230 {
2231 /* Set the SPI Rx DMA Half transfer complete callback */
2232 hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfReceiveCplt;
2233 hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt;
2234 }
2235 else
2236 {
2237 /* Set the SPI Tx/Rx DMA Half transfer complete callback */
2238 hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfTransmitReceiveCplt;
2239 hspi->hdmarx->XferCpltCallback = SPI_DMATransmitReceiveCplt;
2240 }
2241
2242 /* Set the DMA error callback */
2243 hspi->hdmarx->XferErrorCallback = SPI_DMAError;
2244
2245 /* Set the DMA AbortCpltCallback */
2246 hspi->hdmarx->XferAbortCallback = NULL;
2247
2248 /* Enable the Rx DMA Stream/Channel */
2249 if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBuffPtr,
2250 hspi->RxXferCount))
2251 {
2252 /* Update SPI error code */
2253 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA);
2254 errorcode = HAL_ERROR;
2255
2256 goto error;
2257 }
2258
2259 /* Enable Rx DMA Request */
2260 SET_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN);
2261
2262 /* Set the SPI Tx DMA transfer complete callback as NULL because the communication closing
2263 is performed in DMA reception complete callback */
2264 hspi->hdmatx->XferHalfCpltCallback = NULL;
2265 hspi->hdmatx->XferCpltCallback = NULL;
2266 hspi->hdmatx->XferErrorCallback = NULL;
2267 hspi->hdmatx->XferAbortCallback = NULL;
2268
2269 /* Enable the Tx DMA Stream/Channel */
2270 if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instance->DR,
2271 hspi->TxXferCount))
2272 {
2273 /* Update SPI error code */
2274 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA);
2275 errorcode = HAL_ERROR;
2276
2277 goto error;
2278 }
2279
2280 /* Check if the SPI is already enabled */
2281 if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)
2282 {
2283 /* Enable SPI peripheral */
2284 __HAL_SPI_ENABLE(hspi);
2285 }
2286 /* Enable the SPI Error Interrupt Bit */
2287 __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR));
2288
2289 /* Enable Tx DMA Request */
2290 SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN);
2291
2292 error :
2293 /* Process Unlocked */
2294 __HAL_UNLOCK(hspi);
2295 return errorcode;
2296 }
2297
2298 /**
2299 * @brief Abort ongoing transfer (blocking mode).
2300 * @param hspi SPI handle.
2301 * @note This procedure could be used for aborting any ongoing transfer (Tx and Rx),
2302 * started in Interrupt or DMA mode.
2303 * This procedure performs following operations :
2304 * - Disable SPI Interrupts (depending of transfer direction)
2305 * - Disable the DMA transfer in the peripheral register (if enabled)
2306 * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode)
2307 * - Set handle State to READY
2308 * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed.
2309 * @retval HAL status
2310 */
HAL_SPI_Abort(SPI_HandleTypeDef * hspi)2311 HAL_StatusTypeDef HAL_SPI_Abort(SPI_HandleTypeDef *hspi)
2312 {
2313 HAL_StatusTypeDef errorcode;
2314 __IO uint32_t count;
2315 __IO uint32_t resetcount;
2316
2317 /* Initialized local variable */
2318 errorcode = HAL_OK;
2319 resetcount = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U);
2320 count = resetcount;
2321
2322 /* Clear ERRIE interrupt to avoid error interrupts generation during Abort procedure */
2323 CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_ERRIE);
2324
2325 /* Disable TXEIE, RXNEIE and ERRIE(mode fault event, overrun error, TI frame error) interrupts */
2326 if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXEIE))
2327 {
2328 hspi->TxISR = SPI_AbortTx_ISR;
2329 /* Wait HAL_SPI_STATE_ABORT state */
2330 do
2331 {
2332 if (count == 0U)
2333 {
2334 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);
2335 break;
2336 }
2337 count--;
2338 } while (hspi->State != HAL_SPI_STATE_ABORT);
2339 /* Reset Timeout Counter */
2340 count = resetcount;
2341 }
2342
2343 if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE))
2344 {
2345 hspi->RxISR = SPI_AbortRx_ISR;
2346 /* Wait HAL_SPI_STATE_ABORT state */
2347 do
2348 {
2349 if (count == 0U)
2350 {
2351 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);
2352 break;
2353 }
2354 count--;
2355 } while (hspi->State != HAL_SPI_STATE_ABORT);
2356 /* Reset Timeout Counter */
2357 count = resetcount;
2358 }
2359
2360 /* Disable the SPI DMA Tx request if enabled */
2361 if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN))
2362 {
2363 /* Abort the SPI DMA Tx Stream/Channel : use blocking DMA Abort API (no callback) */
2364 if (hspi->hdmatx != NULL)
2365 {
2366 /* Set the SPI DMA Abort callback :
2367 will lead to call HAL_SPI_AbortCpltCallback() at end of DMA abort procedure */
2368 hspi->hdmatx->XferAbortCallback = NULL;
2369
2370 /* Abort DMA Tx Handle linked to SPI Peripheral */
2371 if (HAL_DMA_Abort(hspi->hdmatx) != HAL_OK)
2372 {
2373 hspi->ErrorCode = HAL_SPI_ERROR_ABORT;
2374 }
2375
2376 /* Disable Tx DMA Request */
2377 CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXDMAEN));
2378
2379 if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)
2380 {
2381 hspi->ErrorCode = HAL_SPI_ERROR_ABORT;
2382 }
2383
2384 /* Disable SPI Peripheral */
2385 __HAL_SPI_DISABLE(hspi);
2386
2387 /* Empty the FRLVL fifo */
2388 if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)
2389 {
2390 hspi->ErrorCode = HAL_SPI_ERROR_ABORT;
2391 }
2392 }
2393 }
2394
2395 /* Disable the SPI DMA Rx request if enabled */
2396 if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN))
2397 {
2398 /* Abort the SPI DMA Rx Stream/Channel : use blocking DMA Abort API (no callback) */
2399 if (hspi->hdmarx != NULL)
2400 {
2401 /* Set the SPI DMA Abort callback :
2402 will lead to call HAL_SPI_AbortCpltCallback() at end of DMA abort procedure */
2403 hspi->hdmarx->XferAbortCallback = NULL;
2404
2405 /* Abort DMA Rx Handle linked to SPI Peripheral */
2406 if (HAL_DMA_Abort(hspi->hdmarx) != HAL_OK)
2407 {
2408 hspi->ErrorCode = HAL_SPI_ERROR_ABORT;
2409 }
2410
2411 /* Disable peripheral */
2412 __HAL_SPI_DISABLE(hspi);
2413
2414 /* Control the BSY flag */
2415 if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)
2416 {
2417 hspi->ErrorCode = HAL_SPI_ERROR_ABORT;
2418 }
2419
2420 /* Empty the FRLVL fifo */
2421 if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)
2422 {
2423 hspi->ErrorCode = HAL_SPI_ERROR_ABORT;
2424 }
2425
2426 /* Disable Rx DMA Request */
2427 CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_RXDMAEN));
2428 }
2429 }
2430 /* Reset Tx and Rx transfer counters */
2431 hspi->RxXferCount = 0U;
2432 hspi->TxXferCount = 0U;
2433
2434 /* Check error during Abort procedure */
2435 if (hspi->ErrorCode == HAL_SPI_ERROR_ABORT)
2436 {
2437 /* return HAL_Error in case of error during Abort procedure */
2438 errorcode = HAL_ERROR;
2439 }
2440 else
2441 {
2442 /* Reset errorCode */
2443 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
2444 }
2445
2446 /* Clear the Error flags in the SR register */
2447 __HAL_SPI_CLEAR_OVRFLAG(hspi);
2448 __HAL_SPI_CLEAR_FREFLAG(hspi);
2449
2450 /* Restore hspi->state to ready */
2451 hspi->State = HAL_SPI_STATE_READY;
2452
2453 return errorcode;
2454 }
2455
2456 /**
2457 * @brief Abort ongoing transfer (Interrupt mode).
2458 * @param hspi SPI handle.
2459 * @note This procedure could be used for aborting any ongoing transfer (Tx and Rx),
2460 * started in Interrupt or DMA mode.
2461 * This procedure performs following operations :
2462 * - Disable SPI Interrupts (depending of transfer direction)
2463 * - Disable the DMA transfer in the peripheral register (if enabled)
2464 * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode)
2465 * - Set handle State to READY
2466 * - At abort completion, call user abort complete callback
2467 * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be
2468 * considered as completed only when user abort complete callback is executed (not when exiting function).
2469 * @retval HAL status
2470 */
HAL_SPI_Abort_IT(SPI_HandleTypeDef * hspi)2471 HAL_StatusTypeDef HAL_SPI_Abort_IT(SPI_HandleTypeDef *hspi)
2472 {
2473 HAL_StatusTypeDef errorcode;
2474 uint32_t abortcplt ;
2475 __IO uint32_t count;
2476 __IO uint32_t resetcount;
2477
2478 /* Initialized local variable */
2479 errorcode = HAL_OK;
2480 abortcplt = 1U;
2481 resetcount = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U);
2482 count = resetcount;
2483
2484 /* Clear ERRIE interrupt to avoid error interrupts generation during Abort procedure */
2485 CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_ERRIE);
2486
2487 /* Change Rx and Tx Irq Handler to Disable TXEIE, RXNEIE and ERRIE interrupts */
2488 if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXEIE))
2489 {
2490 hspi->TxISR = SPI_AbortTx_ISR;
2491 /* Wait HAL_SPI_STATE_ABORT state */
2492 do
2493 {
2494 if (count == 0U)
2495 {
2496 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);
2497 break;
2498 }
2499 count--;
2500 } while (hspi->State != HAL_SPI_STATE_ABORT);
2501 /* Reset Timeout Counter */
2502 count = resetcount;
2503 }
2504
2505 if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE))
2506 {
2507 hspi->RxISR = SPI_AbortRx_ISR;
2508 /* Wait HAL_SPI_STATE_ABORT state */
2509 do
2510 {
2511 if (count == 0U)
2512 {
2513 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);
2514 break;
2515 }
2516 count--;
2517 } while (hspi->State != HAL_SPI_STATE_ABORT);
2518 /* Reset Timeout Counter */
2519 count = resetcount;
2520 }
2521
2522 /* If DMA Tx and/or DMA Rx Handles are associated to SPI Handle, DMA Abort complete callbacks should be initialised
2523 before any call to DMA Abort functions */
2524 /* DMA Tx Handle is valid */
2525 if (hspi->hdmatx != NULL)
2526 {
2527 /* Set DMA Abort Complete callback if UART DMA Tx request if enabled.
2528 Otherwise, set it to NULL */
2529 if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN))
2530 {
2531 hspi->hdmatx->XferAbortCallback = SPI_DMATxAbortCallback;
2532 }
2533 else
2534 {
2535 hspi->hdmatx->XferAbortCallback = NULL;
2536 }
2537 }
2538 /* DMA Rx Handle is valid */
2539 if (hspi->hdmarx != NULL)
2540 {
2541 /* Set DMA Abort Complete callback if UART DMA Rx request if enabled.
2542 Otherwise, set it to NULL */
2543 if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN))
2544 {
2545 hspi->hdmarx->XferAbortCallback = SPI_DMARxAbortCallback;
2546 }
2547 else
2548 {
2549 hspi->hdmarx->XferAbortCallback = NULL;
2550 }
2551 }
2552
2553 /* Disable the SPI DMA Tx request if enabled */
2554 if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN))
2555 {
2556 /* Abort the SPI DMA Tx Stream/Channel */
2557 if (hspi->hdmatx != NULL)
2558 {
2559 /* Abort DMA Tx Handle linked to SPI Peripheral */
2560 if (HAL_DMA_Abort_IT(hspi->hdmatx) != HAL_OK)
2561 {
2562 hspi->hdmatx->XferAbortCallback = NULL;
2563 hspi->ErrorCode = HAL_SPI_ERROR_ABORT;
2564 }
2565 else
2566 {
2567 abortcplt = 0U;
2568 }
2569 }
2570 }
2571 /* Disable the SPI DMA Rx request if enabled */
2572 if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN))
2573 {
2574 /* Abort the SPI DMA Rx Stream/Channel */
2575 if (hspi->hdmarx != NULL)
2576 {
2577 /* Abort DMA Rx Handle linked to SPI Peripheral */
2578 if (HAL_DMA_Abort_IT(hspi->hdmarx) != HAL_OK)
2579 {
2580 hspi->hdmarx->XferAbortCallback = NULL;
2581 hspi->ErrorCode = HAL_SPI_ERROR_ABORT;
2582 }
2583 else
2584 {
2585 abortcplt = 0U;
2586 }
2587 }
2588 }
2589
2590 if (abortcplt == 1U)
2591 {
2592 /* Reset Tx and Rx transfer counters */
2593 hspi->RxXferCount = 0U;
2594 hspi->TxXferCount = 0U;
2595
2596 /* Check error during Abort procedure */
2597 if (hspi->ErrorCode == HAL_SPI_ERROR_ABORT)
2598 {
2599 /* return HAL_Error in case of error during Abort procedure */
2600 errorcode = HAL_ERROR;
2601 }
2602 else
2603 {
2604 /* Reset errorCode */
2605 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
2606 }
2607
2608 /* Clear the Error flags in the SR register */
2609 __HAL_SPI_CLEAR_OVRFLAG(hspi);
2610 __HAL_SPI_CLEAR_FREFLAG(hspi);
2611
2612 /* Restore hspi->State to Ready */
2613 hspi->State = HAL_SPI_STATE_READY;
2614
2615 /* As no DMA to be aborted, call directly user Abort complete callback */
2616 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)
2617 hspi->AbortCpltCallback(hspi);
2618 #else
2619 HAL_SPI_AbortCpltCallback(hspi);
2620 #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */
2621 }
2622
2623 return errorcode;
2624 }
2625
2626 /**
2627 * @brief Pause the DMA Transfer.
2628 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
2629 * the configuration information for the specified SPI module.
2630 * @retval HAL status
2631 */
HAL_SPI_DMAPause(SPI_HandleTypeDef * hspi)2632 HAL_StatusTypeDef HAL_SPI_DMAPause(SPI_HandleTypeDef *hspi)
2633 {
2634 /* Process Locked */
2635 __HAL_LOCK(hspi);
2636
2637 /* Disable the SPI DMA Tx & Rx requests */
2638 CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN);
2639
2640 /* Process Unlocked */
2641 __HAL_UNLOCK(hspi);
2642
2643 return HAL_OK;
2644 }
2645
2646 /**
2647 * @brief Resume the DMA Transfer.
2648 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
2649 * the configuration information for the specified SPI module.
2650 * @retval HAL status
2651 */
HAL_SPI_DMAResume(SPI_HandleTypeDef * hspi)2652 HAL_StatusTypeDef HAL_SPI_DMAResume(SPI_HandleTypeDef *hspi)
2653 {
2654 /* Process Locked */
2655 __HAL_LOCK(hspi);
2656
2657 /* Enable the SPI DMA Tx & Rx requests */
2658 SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN);
2659
2660 /* Process Unlocked */
2661 __HAL_UNLOCK(hspi);
2662
2663 return HAL_OK;
2664 }
2665
2666 /**
2667 * @brief Stop the DMA Transfer.
2668 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
2669 * the configuration information for the specified SPI module.
2670 * @retval HAL status
2671 */
HAL_SPI_DMAStop(SPI_HandleTypeDef * hspi)2672 HAL_StatusTypeDef HAL_SPI_DMAStop(SPI_HandleTypeDef *hspi)
2673 {
2674 HAL_StatusTypeDef errorcode = HAL_OK;
2675 /* The Lock is not implemented on this API to allow the user application
2676 to call the HAL SPI API under callbacks HAL_SPI_TxCpltCallback() or HAL_SPI_RxCpltCallback() or HAL_SPI_TxRxCpltCallback():
2677 when calling HAL_DMA_Abort() API the DMA TX/RX Transfer complete interrupt is generated
2678 and the correspond call back is executed HAL_SPI_TxCpltCallback() or HAL_SPI_RxCpltCallback() or HAL_SPI_TxRxCpltCallback()
2679 */
2680
2681 /* Abort the SPI DMA tx Stream/Channel */
2682 if (hspi->hdmatx != NULL)
2683 {
2684 if (HAL_OK != HAL_DMA_Abort(hspi->hdmatx))
2685 {
2686 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA);
2687 errorcode = HAL_ERROR;
2688 }
2689 }
2690 /* Abort the SPI DMA rx Stream/Channel */
2691 if (hspi->hdmarx != NULL)
2692 {
2693 if (HAL_OK != HAL_DMA_Abort(hspi->hdmarx))
2694 {
2695 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA);
2696 errorcode = HAL_ERROR;
2697 }
2698 }
2699
2700 /* Disable the SPI DMA Tx & Rx requests */
2701 CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN);
2702 hspi->State = HAL_SPI_STATE_READY;
2703 return errorcode;
2704 }
2705
2706 /**
2707 * @brief Handle SPI interrupt request.
2708 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
2709 * the configuration information for the specified SPI module.
2710 * @retval None
2711 */
HAL_SPI_IRQHandler(SPI_HandleTypeDef * hspi)2712 void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi)
2713 {
2714 uint32_t itsource = hspi->Instance->CR2;
2715 uint32_t itflag = hspi->Instance->SR;
2716
2717 /* SPI in mode Receiver ----------------------------------------------------*/
2718 if ((SPI_CHECK_FLAG(itflag, SPI_FLAG_OVR) == RESET) &&
2719 (SPI_CHECK_FLAG(itflag, SPI_FLAG_RXNE) != RESET) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_RXNE) != RESET))
2720 {
2721 hspi->RxISR(hspi);
2722 return;
2723 }
2724
2725 /* SPI in mode Transmitter -------------------------------------------------*/
2726 if ((SPI_CHECK_FLAG(itflag, SPI_FLAG_TXE) != RESET) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_TXE) != RESET))
2727 {
2728 hspi->TxISR(hspi);
2729 return;
2730 }
2731
2732 /* SPI in Error Treatment --------------------------------------------------*/
2733 if (((SPI_CHECK_FLAG(itflag, SPI_FLAG_MODF) != RESET) || (SPI_CHECK_FLAG(itflag, SPI_FLAG_OVR) != RESET)
2734 || (SPI_CHECK_FLAG(itflag, SPI_FLAG_FRE) != RESET)) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_ERR) != RESET))
2735 {
2736 /* SPI Overrun error interrupt occurred ----------------------------------*/
2737 if (SPI_CHECK_FLAG(itflag, SPI_FLAG_OVR) != RESET)
2738 {
2739 if (hspi->State != HAL_SPI_STATE_BUSY_TX)
2740 {
2741 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_OVR);
2742 __HAL_SPI_CLEAR_OVRFLAG(hspi);
2743 }
2744 else
2745 {
2746 __HAL_SPI_CLEAR_OVRFLAG(hspi);
2747 return;
2748 }
2749 }
2750
2751 /* SPI Mode Fault error interrupt occurred -------------------------------*/
2752 if (SPI_CHECK_FLAG(itflag, SPI_FLAG_MODF) != RESET)
2753 {
2754 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_MODF);
2755 __HAL_SPI_CLEAR_MODFFLAG(hspi);
2756 }
2757
2758 /* SPI Frame error interrupt occurred ------------------------------------*/
2759 if (SPI_CHECK_FLAG(itflag, SPI_FLAG_FRE) != RESET)
2760 {
2761 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FRE);
2762 __HAL_SPI_CLEAR_FREFLAG(hspi);
2763 }
2764
2765 if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)
2766 {
2767 /* Disable all interrupts */
2768 __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE | SPI_IT_TXE | SPI_IT_ERR);
2769
2770 hspi->State = HAL_SPI_STATE_READY;
2771 /* Disable the SPI DMA requests if enabled */
2772 if ((HAL_IS_BIT_SET(itsource, SPI_CR2_TXDMAEN)) || (HAL_IS_BIT_SET(itsource, SPI_CR2_RXDMAEN)))
2773 {
2774 CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN));
2775
2776 /* Abort the SPI DMA Rx channel */
2777 if (hspi->hdmarx != NULL)
2778 {
2779 /* Set the SPI DMA Abort callback :
2780 will lead to call HAL_SPI_ErrorCallback() at end of DMA abort procedure */
2781 hspi->hdmarx->XferAbortCallback = SPI_DMAAbortOnError;
2782 if (HAL_OK != HAL_DMA_Abort_IT(hspi->hdmarx))
2783 {
2784 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);
2785 }
2786 }
2787 /* Abort the SPI DMA Tx channel */
2788 if (hspi->hdmatx != NULL)
2789 {
2790 /* Set the SPI DMA Abort callback :
2791 will lead to call HAL_SPI_ErrorCallback() at end of DMA abort procedure */
2792 hspi->hdmatx->XferAbortCallback = SPI_DMAAbortOnError;
2793 if (HAL_OK != HAL_DMA_Abort_IT(hspi->hdmatx))
2794 {
2795 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);
2796 }
2797 }
2798 }
2799 else
2800 {
2801 /* Call user error callback */
2802 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)
2803 hspi->ErrorCallback(hspi);
2804 #else
2805 HAL_SPI_ErrorCallback(hspi);
2806 #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */
2807 }
2808 }
2809 return;
2810 }
2811 }
2812
2813 /**
2814 * @brief Tx Transfer completed callback.
2815 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
2816 * the configuration information for SPI module.
2817 * @retval None
2818 */
HAL_SPI_TxCpltCallback(SPI_HandleTypeDef * hspi)2819 __weak void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
2820 {
2821 /* Prevent unused argument(s) compilation warning */
2822 UNUSED(hspi);
2823
2824 /* NOTE : This function should not be modified, when the callback is needed,
2825 the HAL_SPI_TxCpltCallback should be implemented in the user file
2826 */
2827 }
2828
2829 /**
2830 * @brief Rx Transfer completed callback.
2831 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
2832 * the configuration information for SPI module.
2833 * @retval None
2834 */
HAL_SPI_RxCpltCallback(SPI_HandleTypeDef * hspi)2835 __weak void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
2836 {
2837 /* Prevent unused argument(s) compilation warning */
2838 UNUSED(hspi);
2839
2840 /* NOTE : This function should not be modified, when the callback is needed,
2841 the HAL_SPI_RxCpltCallback should be implemented in the user file
2842 */
2843 }
2844
2845 /**
2846 * @brief Tx and Rx Transfer completed callback.
2847 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
2848 * the configuration information for SPI module.
2849 * @retval None
2850 */
HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef * hspi)2851 __weak void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
2852 {
2853 /* Prevent unused argument(s) compilation warning */
2854 UNUSED(hspi);
2855
2856 /* NOTE : This function should not be modified, when the callback is needed,
2857 the HAL_SPI_TxRxCpltCallback should be implemented in the user file
2858 */
2859 }
2860
2861 /**
2862 * @brief Tx Half Transfer completed callback.
2863 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
2864 * the configuration information for SPI module.
2865 * @retval None
2866 */
HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef * hspi)2867 __weak void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi)
2868 {
2869 /* Prevent unused argument(s) compilation warning */
2870 UNUSED(hspi);
2871
2872 /* NOTE : This function should not be modified, when the callback is needed,
2873 the HAL_SPI_TxHalfCpltCallback should be implemented in the user file
2874 */
2875 }
2876
2877 /**
2878 * @brief Rx Half Transfer completed callback.
2879 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
2880 * the configuration information for SPI module.
2881 * @retval None
2882 */
HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef * hspi)2883 __weak void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi)
2884 {
2885 /* Prevent unused argument(s) compilation warning */
2886 UNUSED(hspi);
2887
2888 /* NOTE : This function should not be modified, when the callback is needed,
2889 the HAL_SPI_RxHalfCpltCallback() should be implemented in the user file
2890 */
2891 }
2892
2893 /**
2894 * @brief Tx and Rx Half Transfer callback.
2895 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
2896 * the configuration information for SPI module.
2897 * @retval None
2898 */
HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef * hspi)2899 __weak void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi)
2900 {
2901 /* Prevent unused argument(s) compilation warning */
2902 UNUSED(hspi);
2903
2904 /* NOTE : This function should not be modified, when the callback is needed,
2905 the HAL_SPI_TxRxHalfCpltCallback() should be implemented in the user file
2906 */
2907 }
2908
2909 /**
2910 * @brief SPI error callback.
2911 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
2912 * the configuration information for SPI module.
2913 * @retval None
2914 */
HAL_SPI_ErrorCallback(SPI_HandleTypeDef * hspi)2915 __weak void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi)
2916 {
2917 /* Prevent unused argument(s) compilation warning */
2918 UNUSED(hspi);
2919
2920 /* NOTE : This function should not be modified, when the callback is needed,
2921 the HAL_SPI_ErrorCallback should be implemented in the user file
2922 */
2923 /* NOTE : The ErrorCode parameter in the hspi handle is updated by the SPI processes
2924 and user can use HAL_SPI_GetError() API to check the latest error occurred
2925 */
2926 }
2927
2928 /**
2929 * @brief SPI Abort Complete callback.
2930 * @param hspi SPI handle.
2931 * @retval None
2932 */
HAL_SPI_AbortCpltCallback(SPI_HandleTypeDef * hspi)2933 __weak void HAL_SPI_AbortCpltCallback(SPI_HandleTypeDef *hspi)
2934 {
2935 /* Prevent unused argument(s) compilation warning */
2936 UNUSED(hspi);
2937
2938 /* NOTE : This function should not be modified, when the callback is needed,
2939 the HAL_SPI_AbortCpltCallback can be implemented in the user file.
2940 */
2941 }
2942
2943 /**
2944 * @}
2945 */
2946
2947 /** @defgroup SPI_Exported_Functions_Group3 Peripheral State and Errors functions
2948 * @brief SPI control functions
2949 *
2950 @verbatim
2951 ===============================================================================
2952 ##### Peripheral State and Errors functions #####
2953 ===============================================================================
2954 [..]
2955 This subsection provides a set of functions allowing to control the SPI.
2956 (+) HAL_SPI_GetState() API can be helpful to check in run-time the state of the SPI peripheral
2957 (+) HAL_SPI_GetError() check in run-time Errors occurring during communication
2958 @endverbatim
2959 * @{
2960 */
2961
2962 /**
2963 * @brief Return the SPI handle state.
2964 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
2965 * the configuration information for SPI module.
2966 * @retval SPI state
2967 */
HAL_SPI_GetState(SPI_HandleTypeDef * hspi)2968 HAL_SPI_StateTypeDef HAL_SPI_GetState(SPI_HandleTypeDef *hspi)
2969 {
2970 /* Return SPI handle state */
2971 return hspi->State;
2972 }
2973
2974 /**
2975 * @brief Return the SPI error code.
2976 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
2977 * the configuration information for SPI module.
2978 * @retval SPI error code in bitmap format
2979 */
HAL_SPI_GetError(SPI_HandleTypeDef * hspi)2980 uint32_t HAL_SPI_GetError(SPI_HandleTypeDef *hspi)
2981 {
2982 /* Return SPI ErrorCode */
2983 return hspi->ErrorCode;
2984 }
2985
2986 /**
2987 * @}
2988 */
2989
2990 /**
2991 * @}
2992 */
2993
2994 /** @addtogroup SPI_Private_Functions
2995 * @brief Private functions
2996 * @{
2997 */
2998
2999 /**
3000 * @brief DMA SPI transmit process complete callback.
3001 * @param hdma pointer to a DMA_HandleTypeDef structure that contains
3002 * the configuration information for the specified DMA module.
3003 * @retval None
3004 */
SPI_DMATransmitCplt(DMA_HandleTypeDef * hdma)3005 static void SPI_DMATransmitCplt(DMA_HandleTypeDef *hdma)
3006 {
3007 SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */
3008 uint32_t tickstart;
3009
3010 /* Init tickstart for timeout management*/
3011 tickstart = HAL_GetTick();
3012
3013 /* DMA Normal Mode */
3014 if ((hdma->Instance->CCR & DMA_CCR_CIRC) != DMA_CCR_CIRC)
3015 {
3016 /* Disable ERR interrupt */
3017 __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR);
3018
3019 /* Disable Tx DMA Request */
3020 CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN);
3021
3022 /* Check the end of the transaction */
3023 if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)
3024 {
3025 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);
3026 }
3027
3028 /* Clear overrun flag in 2 Lines communication mode because received data is not read */
3029 if (hspi->Init.Direction == SPI_DIRECTION_2LINES)
3030 {
3031 __HAL_SPI_CLEAR_OVRFLAG(hspi);
3032 }
3033
3034 hspi->TxXferCount = 0U;
3035 hspi->State = HAL_SPI_STATE_READY;
3036
3037 if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)
3038 {
3039 /* Call user error callback */
3040 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)
3041 hspi->ErrorCallback(hspi);
3042 #else
3043 HAL_SPI_ErrorCallback(hspi);
3044 #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */
3045 return;
3046 }
3047 }
3048 /* Call user Tx complete callback */
3049 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)
3050 hspi->TxCpltCallback(hspi);
3051 #else
3052 HAL_SPI_TxCpltCallback(hspi);
3053 #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */
3054 }
3055
3056 /**
3057 * @brief DMA SPI receive process complete callback.
3058 * @param hdma pointer to a DMA_HandleTypeDef structure that contains
3059 * the configuration information for the specified DMA module.
3060 * @retval None
3061 */
SPI_DMAReceiveCplt(DMA_HandleTypeDef * hdma)3062 static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
3063 {
3064 SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */
3065 uint32_t tickstart;
3066 #if (USE_SPI_CRC != 0U)
3067 __IO uint32_t tmpreg = 0U;
3068 __IO uint8_t *ptmpreg8;
3069 __IO uint8_t tmpreg8 = 0;
3070 #endif /* USE_SPI_CRC */
3071
3072 /* Init tickstart for timeout management*/
3073 tickstart = HAL_GetTick();
3074
3075 /* DMA Normal Mode */
3076 if ((hdma->Instance->CCR & DMA_CCR_CIRC) != DMA_CCR_CIRC)
3077 {
3078 /* Disable ERR interrupt */
3079 __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR);
3080
3081 #if (USE_SPI_CRC != 0U)
3082 /* CRC handling */
3083 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
3084 {
3085 /* Wait until RXNE flag */
3086 if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)
3087 {
3088 /* Error on the CRC reception */
3089 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);
3090 }
3091 /* Read CRC */
3092 if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
3093 {
3094 /* Read 16bit CRC */
3095 tmpreg = READ_REG(hspi->Instance->DR);
3096 /* To avoid GCC warning */
3097 UNUSED(tmpreg);
3098 }
3099 else
3100 {
3101 /* Initialize the 8bit temporary pointer */
3102 ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR;
3103 /* Read 8bit CRC */
3104 tmpreg8 = *ptmpreg8;
3105 /* To avoid GCC warning */
3106 UNUSED(tmpreg8);
3107
3108 if (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT)
3109 {
3110 if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)
3111 {
3112 /* Error on the CRC reception */
3113 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);
3114 }
3115 /* Read 8bit CRC again in case of 16bit CRC in 8bit Data mode */
3116 tmpreg8 = *ptmpreg8;
3117 /* To avoid GCC warning */
3118 UNUSED(tmpreg8);
3119 }
3120 }
3121 }
3122 #endif /* USE_SPI_CRC */
3123
3124 /* Check if we are in Master RX 2 line mode */
3125 if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER))
3126 {
3127 /* Disable Rx/Tx DMA Request (done by default to handle the case master rx direction 2 lines) */
3128 CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN);
3129 }
3130 else
3131 {
3132 /* Normal case */
3133 CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN);
3134 }
3135
3136 /* Check the end of the transaction */
3137 if (SPI_EndRxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)
3138 {
3139 hspi->ErrorCode = HAL_SPI_ERROR_FLAG;
3140 }
3141
3142 hspi->RxXferCount = 0U;
3143 hspi->State = HAL_SPI_STATE_READY;
3144
3145 #if (USE_SPI_CRC != 0U)
3146 /* Check if CRC error occurred */
3147 if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR))
3148 {
3149 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);
3150 __HAL_SPI_CLEAR_CRCERRFLAG(hspi);
3151 }
3152 #endif /* USE_SPI_CRC */
3153
3154 if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)
3155 {
3156 /* Call user error callback */
3157 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)
3158 hspi->ErrorCallback(hspi);
3159 #else
3160 HAL_SPI_ErrorCallback(hspi);
3161 #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */
3162 return;
3163 }
3164 }
3165 /* Call user Rx complete callback */
3166 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)
3167 hspi->RxCpltCallback(hspi);
3168 #else
3169 HAL_SPI_RxCpltCallback(hspi);
3170 #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */
3171 }
3172
3173 /**
3174 * @brief DMA SPI transmit receive process complete callback.
3175 * @param hdma pointer to a DMA_HandleTypeDef structure that contains
3176 * the configuration information for the specified DMA module.
3177 * @retval None
3178 */
SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef * hdma)3179 static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma)
3180 {
3181 SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */
3182 uint32_t tickstart;
3183 #if (USE_SPI_CRC != 0U)
3184 __IO uint32_t tmpreg = 0U;
3185 __IO uint8_t *ptmpreg8;
3186 __IO uint8_t tmpreg8 = 0;
3187 #endif /* USE_SPI_CRC */
3188
3189 /* Init tickstart for timeout management*/
3190 tickstart = HAL_GetTick();
3191
3192 /* DMA Normal Mode */
3193 if ((hdma->Instance->CCR & DMA_CCR_CIRC) != DMA_CCR_CIRC)
3194 {
3195 /* Disable ERR interrupt */
3196 __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR);
3197
3198 #if (USE_SPI_CRC != 0U)
3199 /* CRC handling */
3200 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
3201 {
3202 if ((hspi->Init.DataSize == SPI_DATASIZE_8BIT) && (hspi->Init.CRCLength == SPI_CRC_LENGTH_8BIT))
3203 {
3204 if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_QUARTER_FULL, SPI_DEFAULT_TIMEOUT,
3205 tickstart) != HAL_OK)
3206 {
3207 /* Error on the CRC reception */
3208 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);
3209 }
3210 /* Initialize the 8bit temporary pointer */
3211 ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR;
3212 /* Read 8bit CRC */
3213 tmpreg8 = *ptmpreg8;
3214 /* To avoid GCC warning */
3215 UNUSED(tmpreg8);
3216 }
3217 else
3218 {
3219 if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_HALF_FULL, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)
3220 {
3221 /* Error on the CRC reception */
3222 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);
3223 }
3224 /* Read CRC to Flush DR and RXNE flag */
3225 tmpreg = READ_REG(hspi->Instance->DR);
3226 /* To avoid GCC warning */
3227 UNUSED(tmpreg);
3228 }
3229 }
3230 #endif /* USE_SPI_CRC */
3231
3232 /* Check the end of the transaction */
3233 if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)
3234 {
3235 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);
3236 }
3237
3238 /* Disable Rx/Tx DMA Request */
3239 CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN);
3240
3241 hspi->TxXferCount = 0U;
3242 hspi->RxXferCount = 0U;
3243 hspi->State = HAL_SPI_STATE_READY;
3244
3245 #if (USE_SPI_CRC != 0U)
3246 /* Check if CRC error occurred */
3247 if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR))
3248 {
3249 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);
3250 __HAL_SPI_CLEAR_CRCERRFLAG(hspi);
3251 }
3252 #endif /* USE_SPI_CRC */
3253
3254 if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)
3255 {
3256 /* Call user error callback */
3257 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)
3258 hspi->ErrorCallback(hspi);
3259 #else
3260 HAL_SPI_ErrorCallback(hspi);
3261 #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */
3262 return;
3263 }
3264 }
3265 /* Call user TxRx complete callback */
3266 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)
3267 hspi->TxRxCpltCallback(hspi);
3268 #else
3269 HAL_SPI_TxRxCpltCallback(hspi);
3270 #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */
3271 }
3272
3273 /**
3274 * @brief DMA SPI half transmit process complete callback.
3275 * @param hdma pointer to a DMA_HandleTypeDef structure that contains
3276 * the configuration information for the specified DMA module.
3277 * @retval None
3278 */
SPI_DMAHalfTransmitCplt(DMA_HandleTypeDef * hdma)3279 static void SPI_DMAHalfTransmitCplt(DMA_HandleTypeDef *hdma)
3280 {
3281 SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */
3282
3283 /* Call user Tx half complete callback */
3284 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)
3285 hspi->TxHalfCpltCallback(hspi);
3286 #else
3287 HAL_SPI_TxHalfCpltCallback(hspi);
3288 #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */
3289 }
3290
3291 /**
3292 * @brief DMA SPI half receive process complete callback
3293 * @param hdma pointer to a DMA_HandleTypeDef structure that contains
3294 * the configuration information for the specified DMA module.
3295 * @retval None
3296 */
SPI_DMAHalfReceiveCplt(DMA_HandleTypeDef * hdma)3297 static void SPI_DMAHalfReceiveCplt(DMA_HandleTypeDef *hdma)
3298 {
3299 SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */
3300
3301 /* Call user Rx half complete callback */
3302 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)
3303 hspi->RxHalfCpltCallback(hspi);
3304 #else
3305 HAL_SPI_RxHalfCpltCallback(hspi);
3306 #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */
3307 }
3308
3309 /**
3310 * @brief DMA SPI half transmit receive process complete callback.
3311 * @param hdma pointer to a DMA_HandleTypeDef structure that contains
3312 * the configuration information for the specified DMA module.
3313 * @retval None
3314 */
SPI_DMAHalfTransmitReceiveCplt(DMA_HandleTypeDef * hdma)3315 static void SPI_DMAHalfTransmitReceiveCplt(DMA_HandleTypeDef *hdma)
3316 {
3317 SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */
3318
3319 /* Call user TxRx half complete callback */
3320 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)
3321 hspi->TxRxHalfCpltCallback(hspi);
3322 #else
3323 HAL_SPI_TxRxHalfCpltCallback(hspi);
3324 #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */
3325 }
3326
3327 /**
3328 * @brief DMA SPI communication error callback.
3329 * @param hdma pointer to a DMA_HandleTypeDef structure that contains
3330 * the configuration information for the specified DMA module.
3331 * @retval None
3332 */
SPI_DMAError(DMA_HandleTypeDef * hdma)3333 static void SPI_DMAError(DMA_HandleTypeDef *hdma)
3334 {
3335 SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */
3336
3337 /* Stop the disable DMA transfer on SPI side */
3338 CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN);
3339
3340 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA);
3341 hspi->State = HAL_SPI_STATE_READY;
3342 /* Call user error callback */
3343 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)
3344 hspi->ErrorCallback(hspi);
3345 #else
3346 HAL_SPI_ErrorCallback(hspi);
3347 #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */
3348 }
3349
3350 /**
3351 * @brief DMA SPI communication abort callback, when initiated by HAL services on Error
3352 * (To be called at end of DMA Abort procedure following error occurrence).
3353 * @param hdma DMA handle.
3354 * @retval None
3355 */
SPI_DMAAbortOnError(DMA_HandleTypeDef * hdma)3356 static void SPI_DMAAbortOnError(DMA_HandleTypeDef *hdma)
3357 {
3358 SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */
3359 hspi->RxXferCount = 0U;
3360 hspi->TxXferCount = 0U;
3361
3362 /* Call user error callback */
3363 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)
3364 hspi->ErrorCallback(hspi);
3365 #else
3366 HAL_SPI_ErrorCallback(hspi);
3367 #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */
3368 }
3369
3370 /**
3371 * @brief DMA SPI Tx communication abort callback, when initiated by user
3372 * (To be called at end of DMA Tx Abort procedure following user abort request).
3373 * @note When this callback is executed, User Abort complete call back is called only if no
3374 * Abort still ongoing for Rx DMA Handle.
3375 * @param hdma DMA handle.
3376 * @retval None
3377 */
SPI_DMATxAbortCallback(DMA_HandleTypeDef * hdma)3378 static void SPI_DMATxAbortCallback(DMA_HandleTypeDef *hdma)
3379 {
3380 SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */
3381
3382 hspi->hdmatx->XferAbortCallback = NULL;
3383
3384 /* Disable Tx DMA Request */
3385 CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN);
3386
3387 if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)
3388 {
3389 hspi->ErrorCode = HAL_SPI_ERROR_ABORT;
3390 }
3391
3392 /* Disable SPI Peripheral */
3393 __HAL_SPI_DISABLE(hspi);
3394
3395 /* Empty the FRLVL fifo */
3396 if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)
3397 {
3398 hspi->ErrorCode = HAL_SPI_ERROR_ABORT;
3399 }
3400
3401 /* Check if an Abort process is still ongoing */
3402 if (hspi->hdmarx != NULL)
3403 {
3404 if (hspi->hdmarx->XferAbortCallback != NULL)
3405 {
3406 return;
3407 }
3408 }
3409
3410 /* No Abort process still ongoing : All DMA Stream/Channel are aborted, call user Abort Complete callback */
3411 hspi->RxXferCount = 0U;
3412 hspi->TxXferCount = 0U;
3413
3414 /* Check no error during Abort procedure */
3415 if (hspi->ErrorCode != HAL_SPI_ERROR_ABORT)
3416 {
3417 /* Reset errorCode */
3418 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
3419 }
3420
3421 /* Clear the Error flags in the SR register */
3422 __HAL_SPI_CLEAR_OVRFLAG(hspi);
3423 __HAL_SPI_CLEAR_FREFLAG(hspi);
3424
3425 /* Restore hspi->State to Ready */
3426 hspi->State = HAL_SPI_STATE_READY;
3427
3428 /* Call user Abort complete callback */
3429 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)
3430 hspi->AbortCpltCallback(hspi);
3431 #else
3432 HAL_SPI_AbortCpltCallback(hspi);
3433 #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */
3434 }
3435
3436 /**
3437 * @brief DMA SPI Rx communication abort callback, when initiated by user
3438 * (To be called at end of DMA Rx Abort procedure following user abort request).
3439 * @note When this callback is executed, User Abort complete call back is called only if no
3440 * Abort still ongoing for Tx DMA Handle.
3441 * @param hdma DMA handle.
3442 * @retval None
3443 */
SPI_DMARxAbortCallback(DMA_HandleTypeDef * hdma)3444 static void SPI_DMARxAbortCallback(DMA_HandleTypeDef *hdma)
3445 {
3446 SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */
3447
3448 /* Disable SPI Peripheral */
3449 __HAL_SPI_DISABLE(hspi);
3450
3451 hspi->hdmarx->XferAbortCallback = NULL;
3452
3453 /* Disable Rx DMA Request */
3454 CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN);
3455
3456 /* Control the BSY flag */
3457 if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)
3458 {
3459 hspi->ErrorCode = HAL_SPI_ERROR_ABORT;
3460 }
3461
3462 /* Empty the FRLVL fifo */
3463 if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)
3464 {
3465 hspi->ErrorCode = HAL_SPI_ERROR_ABORT;
3466 }
3467
3468 /* Check if an Abort process is still ongoing */
3469 if (hspi->hdmatx != NULL)
3470 {
3471 if (hspi->hdmatx->XferAbortCallback != NULL)
3472 {
3473 return;
3474 }
3475 }
3476
3477 /* No Abort process still ongoing : All DMA Stream/Channel are aborted, call user Abort Complete callback */
3478 hspi->RxXferCount = 0U;
3479 hspi->TxXferCount = 0U;
3480
3481 /* Check no error during Abort procedure */
3482 if (hspi->ErrorCode != HAL_SPI_ERROR_ABORT)
3483 {
3484 /* Reset errorCode */
3485 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
3486 }
3487
3488 /* Clear the Error flags in the SR register */
3489 __HAL_SPI_CLEAR_OVRFLAG(hspi);
3490 __HAL_SPI_CLEAR_FREFLAG(hspi);
3491
3492 /* Restore hspi->State to Ready */
3493 hspi->State = HAL_SPI_STATE_READY;
3494
3495 /* Call user Abort complete callback */
3496 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)
3497 hspi->AbortCpltCallback(hspi);
3498 #else
3499 HAL_SPI_AbortCpltCallback(hspi);
3500 #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */
3501 }
3502
3503 /**
3504 * @brief Rx 8-bit handler for Transmit and Receive in Interrupt mode.
3505 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
3506 * the configuration information for SPI module.
3507 * @retval None
3508 */
SPI_2linesRxISR_8BIT(struct __SPI_HandleTypeDef * hspi)3509 static void SPI_2linesRxISR_8BIT(struct __SPI_HandleTypeDef *hspi)
3510 {
3511 /* Receive data in packing mode */
3512 if (hspi->RxXferCount > 1U)
3513 {
3514 *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)(hspi->Instance->DR);
3515 hspi->pRxBuffPtr += sizeof(uint16_t);
3516 hspi->RxXferCount -= 2U;
3517 if (hspi->RxXferCount == 1U)
3518 {
3519 /* Set RX Fifo threshold according the reception data length: 8bit */
3520 SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);
3521 }
3522 }
3523 /* Receive data in 8 Bit mode */
3524 else
3525 {
3526 *hspi->pRxBuffPtr = *((__IO uint8_t *)&hspi->Instance->DR);
3527 hspi->pRxBuffPtr++;
3528 hspi->RxXferCount--;
3529 }
3530
3531 /* Check end of the reception */
3532 if (hspi->RxXferCount == 0U)
3533 {
3534 #if (USE_SPI_CRC != 0U)
3535 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
3536 {
3537 SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);
3538 hspi->RxISR = SPI_2linesRxISR_8BITCRC;
3539 return;
3540 }
3541 #endif /* USE_SPI_CRC */
3542
3543 /* Disable RXNE and ERR interrupt */
3544 __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR));
3545
3546 if (hspi->TxXferCount == 0U)
3547 {
3548 SPI_CloseRxTx_ISR(hspi);
3549 }
3550 }
3551 }
3552
3553 #if (USE_SPI_CRC != 0U)
3554 /**
3555 * @brief Rx 8-bit handler for Transmit and Receive in Interrupt mode.
3556 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
3557 * the configuration information for SPI module.
3558 * @retval None
3559 */
SPI_2linesRxISR_8BITCRC(struct __SPI_HandleTypeDef * hspi)3560 static void SPI_2linesRxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi)
3561 {
3562 __IO uint8_t *ptmpreg8;
3563 __IO uint8_t tmpreg8 = 0;
3564
3565 /* Initialize the 8bit temporary pointer */
3566 ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR;
3567 /* Read 8bit CRC to flush Data Register */
3568 tmpreg8 = *ptmpreg8;
3569 /* To avoid GCC warning */
3570 UNUSED(tmpreg8);
3571
3572 hspi->CRCSize--;
3573
3574 /* Check end of the reception */
3575 if (hspi->CRCSize == 0U)
3576 {
3577 /* Disable RXNE and ERR interrupt */
3578 __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR));
3579
3580 if (hspi->TxXferCount == 0U)
3581 {
3582 SPI_CloseRxTx_ISR(hspi);
3583 }
3584 }
3585 }
3586 #endif /* USE_SPI_CRC */
3587
3588 /**
3589 * @brief Tx 8-bit handler for Transmit and Receive in Interrupt mode.
3590 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
3591 * the configuration information for SPI module.
3592 * @retval None
3593 */
SPI_2linesTxISR_8BIT(struct __SPI_HandleTypeDef * hspi)3594 static void SPI_2linesTxISR_8BIT(struct __SPI_HandleTypeDef *hspi)
3595 {
3596 /* Transmit data in packing Bit mode */
3597 if (hspi->TxXferCount >= 2U)
3598 {
3599 hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);
3600 hspi->pTxBuffPtr += sizeof(uint16_t);
3601 hspi->TxXferCount -= 2U;
3602 }
3603 /* Transmit data in 8 Bit mode */
3604 else
3605 {
3606 *(__IO uint8_t *)&hspi->Instance->DR = (*hspi->pTxBuffPtr);
3607 hspi->pTxBuffPtr++;
3608 hspi->TxXferCount--;
3609 }
3610
3611 /* Check the end of the transmission */
3612 if (hspi->TxXferCount == 0U)
3613 {
3614 #if (USE_SPI_CRC != 0U)
3615 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
3616 {
3617 /* Set CRC Next Bit to send CRC */
3618 SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);
3619 /* Disable TXE interrupt */
3620 __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE);
3621 return;
3622 }
3623 #endif /* USE_SPI_CRC */
3624
3625 /* Disable TXE interrupt */
3626 __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE);
3627
3628 if (hspi->RxXferCount == 0U)
3629 {
3630 SPI_CloseRxTx_ISR(hspi);
3631 }
3632 }
3633 }
3634
3635 /**
3636 * @brief Rx 16-bit handler for Transmit and Receive in Interrupt mode.
3637 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
3638 * the configuration information for SPI module.
3639 * @retval None
3640 */
SPI_2linesRxISR_16BIT(struct __SPI_HandleTypeDef * hspi)3641 static void SPI_2linesRxISR_16BIT(struct __SPI_HandleTypeDef *hspi)
3642 {
3643 /* Receive data in 16 Bit mode */
3644 *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)(hspi->Instance->DR);
3645 hspi->pRxBuffPtr += sizeof(uint16_t);
3646 hspi->RxXferCount--;
3647
3648 if (hspi->RxXferCount == 0U)
3649 {
3650 #if (USE_SPI_CRC != 0U)
3651 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
3652 {
3653 hspi->RxISR = SPI_2linesRxISR_16BITCRC;
3654 return;
3655 }
3656 #endif /* USE_SPI_CRC */
3657
3658 /* Disable RXNE interrupt */
3659 __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE);
3660
3661 if (hspi->TxXferCount == 0U)
3662 {
3663 SPI_CloseRxTx_ISR(hspi);
3664 }
3665 }
3666 }
3667
3668 #if (USE_SPI_CRC != 0U)
3669 /**
3670 * @brief Manage the CRC 16-bit receive for Transmit and Receive in Interrupt mode.
3671 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
3672 * the configuration information for SPI module.
3673 * @retval None
3674 */
SPI_2linesRxISR_16BITCRC(struct __SPI_HandleTypeDef * hspi)3675 static void SPI_2linesRxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi)
3676 {
3677 __IO uint32_t tmpreg = 0U;
3678
3679 /* Read 16bit CRC to flush Data Register */
3680 tmpreg = READ_REG(hspi->Instance->DR);
3681 /* To avoid GCC warning */
3682 UNUSED(tmpreg);
3683
3684 /* Disable RXNE interrupt */
3685 __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE);
3686
3687 SPI_CloseRxTx_ISR(hspi);
3688 }
3689 #endif /* USE_SPI_CRC */
3690
3691 /**
3692 * @brief Tx 16-bit handler for Transmit and Receive in Interrupt mode.
3693 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
3694 * the configuration information for SPI module.
3695 * @retval None
3696 */
SPI_2linesTxISR_16BIT(struct __SPI_HandleTypeDef * hspi)3697 static void SPI_2linesTxISR_16BIT(struct __SPI_HandleTypeDef *hspi)
3698 {
3699 /* Transmit data in 16 Bit mode */
3700 hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);
3701 hspi->pTxBuffPtr += sizeof(uint16_t);
3702 hspi->TxXferCount--;
3703
3704 /* Enable CRC Transmission */
3705 if (hspi->TxXferCount == 0U)
3706 {
3707 #if (USE_SPI_CRC != 0U)
3708 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
3709 {
3710 /* Set CRC Next Bit to send CRC */
3711 SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);
3712 /* Disable TXE interrupt */
3713 __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE);
3714 return;
3715 }
3716 #endif /* USE_SPI_CRC */
3717
3718 /* Disable TXE interrupt */
3719 __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE);
3720
3721 if (hspi->RxXferCount == 0U)
3722 {
3723 SPI_CloseRxTx_ISR(hspi);
3724 }
3725 }
3726 }
3727
3728 #if (USE_SPI_CRC != 0U)
3729 /**
3730 * @brief Manage the CRC 8-bit receive in Interrupt context.
3731 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
3732 * the configuration information for SPI module.
3733 * @retval None
3734 */
SPI_RxISR_8BITCRC(struct __SPI_HandleTypeDef * hspi)3735 static void SPI_RxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi)
3736 {
3737 __IO uint8_t *ptmpreg8;
3738 __IO uint8_t tmpreg8 = 0;
3739
3740 /* Initialize the 8bit temporary pointer */
3741 ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR;
3742 /* Read 8bit CRC to flush Data Register */
3743 tmpreg8 = *ptmpreg8;
3744 /* To avoid GCC warning */
3745 UNUSED(tmpreg8);
3746
3747 hspi->CRCSize--;
3748
3749 if (hspi->CRCSize == 0U)
3750 {
3751 SPI_CloseRx_ISR(hspi);
3752 }
3753 }
3754 #endif /* USE_SPI_CRC */
3755
3756 /**
3757 * @brief Manage the receive 8-bit in Interrupt context.
3758 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
3759 * the configuration information for SPI module.
3760 * @retval None
3761 */
SPI_RxISR_8BIT(struct __SPI_HandleTypeDef * hspi)3762 static void SPI_RxISR_8BIT(struct __SPI_HandleTypeDef *hspi)
3763 {
3764 *hspi->pRxBuffPtr = (*(__IO uint8_t *)&hspi->Instance->DR);
3765 hspi->pRxBuffPtr++;
3766 hspi->RxXferCount--;
3767
3768 #if (USE_SPI_CRC != 0U)
3769 /* Enable CRC Transmission */
3770 if ((hspi->RxXferCount == 1U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE))
3771 {
3772 SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);
3773 }
3774 #endif /* USE_SPI_CRC */
3775
3776 if (hspi->RxXferCount == 0U)
3777 {
3778 #if (USE_SPI_CRC != 0U)
3779 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
3780 {
3781 hspi->RxISR = SPI_RxISR_8BITCRC;
3782 return;
3783 }
3784 #endif /* USE_SPI_CRC */
3785 SPI_CloseRx_ISR(hspi);
3786 }
3787 }
3788
3789 #if (USE_SPI_CRC != 0U)
3790 /**
3791 * @brief Manage the CRC 16-bit receive in Interrupt context.
3792 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
3793 * the configuration information for SPI module.
3794 * @retval None
3795 */
SPI_RxISR_16BITCRC(struct __SPI_HandleTypeDef * hspi)3796 static void SPI_RxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi)
3797 {
3798 __IO uint32_t tmpreg = 0U;
3799
3800 /* Read 16bit CRC to flush Data Register */
3801 tmpreg = READ_REG(hspi->Instance->DR);
3802 /* To avoid GCC warning */
3803 UNUSED(tmpreg);
3804
3805 /* Disable RXNE and ERR interrupt */
3806 __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR));
3807
3808 SPI_CloseRx_ISR(hspi);
3809 }
3810 #endif /* USE_SPI_CRC */
3811
3812 /**
3813 * @brief Manage the 16-bit receive in Interrupt context.
3814 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
3815 * the configuration information for SPI module.
3816 * @retval None
3817 */
SPI_RxISR_16BIT(struct __SPI_HandleTypeDef * hspi)3818 static void SPI_RxISR_16BIT(struct __SPI_HandleTypeDef *hspi)
3819 {
3820 *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)(hspi->Instance->DR);
3821 hspi->pRxBuffPtr += sizeof(uint16_t);
3822 hspi->RxXferCount--;
3823
3824 #if (USE_SPI_CRC != 0U)
3825 /* Enable CRC Transmission */
3826 if ((hspi->RxXferCount == 1U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE))
3827 {
3828 SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);
3829 }
3830 #endif /* USE_SPI_CRC */
3831
3832 if (hspi->RxXferCount == 0U)
3833 {
3834 #if (USE_SPI_CRC != 0U)
3835 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
3836 {
3837 hspi->RxISR = SPI_RxISR_16BITCRC;
3838 return;
3839 }
3840 #endif /* USE_SPI_CRC */
3841 SPI_CloseRx_ISR(hspi);
3842 }
3843 }
3844
3845 /**
3846 * @brief Handle the data 8-bit transmit in Interrupt mode.
3847 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
3848 * the configuration information for SPI module.
3849 * @retval None
3850 */
SPI_TxISR_8BIT(struct __SPI_HandleTypeDef * hspi)3851 static void SPI_TxISR_8BIT(struct __SPI_HandleTypeDef *hspi)
3852 {
3853 *(__IO uint8_t *)&hspi->Instance->DR = (*hspi->pTxBuffPtr);
3854 hspi->pTxBuffPtr++;
3855 hspi->TxXferCount--;
3856
3857 if (hspi->TxXferCount == 0U)
3858 {
3859 #if (USE_SPI_CRC != 0U)
3860 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
3861 {
3862 /* Enable CRC Transmission */
3863 SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);
3864 }
3865 #endif /* USE_SPI_CRC */
3866 SPI_CloseTx_ISR(hspi);
3867 }
3868 }
3869
3870 /**
3871 * @brief Handle the data 16-bit transmit in Interrupt mode.
3872 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
3873 * the configuration information for SPI module.
3874 * @retval None
3875 */
SPI_TxISR_16BIT(struct __SPI_HandleTypeDef * hspi)3876 static void SPI_TxISR_16BIT(struct __SPI_HandleTypeDef *hspi)
3877 {
3878 /* Transmit data in 16 Bit mode */
3879 hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);
3880 hspi->pTxBuffPtr += sizeof(uint16_t);
3881 hspi->TxXferCount--;
3882
3883 if (hspi->TxXferCount == 0U)
3884 {
3885 #if (USE_SPI_CRC != 0U)
3886 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
3887 {
3888 /* Enable CRC Transmission */
3889 SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);
3890 }
3891 #endif /* USE_SPI_CRC */
3892 SPI_CloseTx_ISR(hspi);
3893 }
3894 }
3895
3896 /**
3897 * @brief Handle SPI Communication Timeout.
3898 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
3899 * the configuration information for SPI module.
3900 * @param Flag SPI flag to check
3901 * @param State flag state to check
3902 * @param Timeout Timeout duration
3903 * @param Tickstart tick start value
3904 * @retval HAL status
3905 */
SPI_WaitFlagStateUntilTimeout(SPI_HandleTypeDef * hspi,uint32_t Flag,FlagStatus State,uint32_t Timeout,uint32_t Tickstart)3906 static HAL_StatusTypeDef SPI_WaitFlagStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, FlagStatus State,
3907 uint32_t Timeout, uint32_t Tickstart)
3908 {
3909 __IO uint32_t count;
3910 uint32_t tmp_timeout;
3911 uint32_t tmp_tickstart;
3912
3913 /* Adjust Timeout value in case of end of transfer */
3914 tmp_timeout = Timeout - (HAL_GetTick() - Tickstart);
3915 tmp_tickstart = HAL_GetTick();
3916
3917 /* Calculate Timeout based on a software loop to avoid blocking issue if Systick is disabled */
3918 count = tmp_timeout * ((SystemCoreClock * 32U) >> 20U);
3919
3920 while ((__HAL_SPI_GET_FLAG(hspi, Flag) ? SET : RESET) != State)
3921 {
3922 if (Timeout != HAL_MAX_DELAY)
3923 {
3924 if (((HAL_GetTick() - tmp_tickstart) >= tmp_timeout) || (tmp_timeout == 0U))
3925 {
3926 /* Disable the SPI and reset the CRC: the CRC value should be cleared
3927 on both master and slave sides in order to resynchronize the master
3928 and slave for their respective CRC calculation */
3929
3930 /* Disable TXE, RXNE and ERR interrupts for the interrupt process */
3931 __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR));
3932
3933 if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE)
3934 || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY)))
3935 {
3936 /* Disable SPI peripheral */
3937 __HAL_SPI_DISABLE(hspi);
3938 }
3939
3940 /* Reset CRC Calculation */
3941 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
3942 {
3943 SPI_RESET_CRC(hspi);
3944 }
3945
3946 hspi->State = HAL_SPI_STATE_READY;
3947
3948 /* Process Unlocked */
3949 __HAL_UNLOCK(hspi);
3950
3951 return HAL_TIMEOUT;
3952 }
3953 /* If Systick is disabled or not incremented, deactivate timeout to go in disable loop procedure */
3954 if (count == 0U)
3955 {
3956 tmp_timeout = 0U;
3957 }
3958 count--;
3959 }
3960 }
3961
3962 return HAL_OK;
3963 }
3964
3965 /**
3966 * @brief Handle SPI FIFO Communication Timeout.
3967 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
3968 * the configuration information for SPI module.
3969 * @param Fifo Fifo to check
3970 * @param State Fifo state to check
3971 * @param Timeout Timeout duration
3972 * @param Tickstart tick start value
3973 * @retval HAL status
3974 */
SPI_WaitFifoStateUntilTimeout(SPI_HandleTypeDef * hspi,uint32_t Fifo,uint32_t State,uint32_t Timeout,uint32_t Tickstart)3975 static HAL_StatusTypeDef SPI_WaitFifoStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Fifo, uint32_t State,
3976 uint32_t Timeout, uint32_t Tickstart)
3977 {
3978 __IO uint32_t count;
3979 uint32_t tmp_timeout;
3980 uint32_t tmp_tickstart;
3981 __IO uint8_t *ptmpreg8;
3982 __IO uint8_t tmpreg8 = 0;
3983
3984 /* Adjust Timeout value in case of end of transfer */
3985 tmp_timeout = Timeout - (HAL_GetTick() - Tickstart);
3986 tmp_tickstart = HAL_GetTick();
3987
3988 /* Initialize the 8bit temporary pointer */
3989 ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR;
3990
3991 /* Calculate Timeout based on a software loop to avoid blocking issue if Systick is disabled */
3992 count = tmp_timeout * ((SystemCoreClock * 35U) >> 20U);
3993
3994 while ((hspi->Instance->SR & Fifo) != State)
3995 {
3996 if ((Fifo == SPI_SR_FRLVL) && (State == SPI_FRLVL_EMPTY))
3997 {
3998 /* Flush Data Register by a blank read */
3999 tmpreg8 = *ptmpreg8;
4000 /* To avoid GCC warning */
4001 UNUSED(tmpreg8);
4002 }
4003
4004 if (Timeout != HAL_MAX_DELAY)
4005 {
4006 if (((HAL_GetTick() - tmp_tickstart) >= tmp_timeout) || (tmp_timeout == 0U))
4007 {
4008 /* Disable the SPI and reset the CRC: the CRC value should be cleared
4009 on both master and slave sides in order to resynchronize the master
4010 and slave for their respective CRC calculation */
4011
4012 /* Disable TXE, RXNE and ERR interrupts for the interrupt process */
4013 __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR));
4014
4015 if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE)
4016 || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY)))
4017 {
4018 /* Disable SPI peripheral */
4019 __HAL_SPI_DISABLE(hspi);
4020 }
4021
4022 /* Reset CRC Calculation */
4023 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
4024 {
4025 SPI_RESET_CRC(hspi);
4026 }
4027
4028 hspi->State = HAL_SPI_STATE_READY;
4029
4030 /* Process Unlocked */
4031 __HAL_UNLOCK(hspi);
4032
4033 return HAL_TIMEOUT;
4034 }
4035 /* If Systick is disabled or not incremented, deactivate timeout to go in disable loop procedure */
4036 if (count == 0U)
4037 {
4038 tmp_timeout = 0U;
4039 }
4040 count--;
4041 }
4042 }
4043
4044 return HAL_OK;
4045 }
4046
4047 /**
4048 * @brief Handle the check of the RX transaction complete.
4049 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
4050 * the configuration information for SPI module.
4051 * @param Timeout Timeout duration
4052 * @param Tickstart tick start value
4053 * @retval HAL status
4054 */
SPI_EndRxTransaction(SPI_HandleTypeDef * hspi,uint32_t Timeout,uint32_t Tickstart)4055 static HAL_StatusTypeDef SPI_EndRxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart)
4056 {
4057 if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE)
4058 || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY)))
4059 {
4060 /* Disable SPI peripheral */
4061 __HAL_SPI_DISABLE(hspi);
4062 }
4063
4064 /* Control the BSY flag */
4065 if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, Timeout, Tickstart) != HAL_OK)
4066 {
4067 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);
4068 return HAL_TIMEOUT;
4069 }
4070
4071 if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE)
4072 || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY)))
4073 {
4074 /* Empty the FRLVL fifo */
4075 if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, Timeout, Tickstart) != HAL_OK)
4076 {
4077 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);
4078 return HAL_TIMEOUT;
4079 }
4080 }
4081 return HAL_OK;
4082 }
4083
4084 /**
4085 * @brief Handle the check of the RXTX or TX transaction complete.
4086 * @param hspi SPI handle
4087 * @param Timeout Timeout duration
4088 * @param Tickstart tick start value
4089 * @retval HAL status
4090 */
SPI_EndRxTxTransaction(SPI_HandleTypeDef * hspi,uint32_t Timeout,uint32_t Tickstart)4091 static HAL_StatusTypeDef SPI_EndRxTxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart)
4092 {
4093 /* Control if the TX fifo is empty */
4094 if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FTLVL, SPI_FTLVL_EMPTY, Timeout, Tickstart) != HAL_OK)
4095 {
4096 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);
4097 return HAL_TIMEOUT;
4098 }
4099
4100 /* Control the BSY flag */
4101 if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, Timeout, Tickstart) != HAL_OK)
4102 {
4103 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);
4104 return HAL_TIMEOUT;
4105 }
4106
4107 /* Control if the RX fifo is empty */
4108 if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, Timeout, Tickstart) != HAL_OK)
4109 {
4110 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);
4111 return HAL_TIMEOUT;
4112 }
4113
4114 return HAL_OK;
4115 }
4116
4117 /**
4118 * @brief Handle the end of the RXTX transaction.
4119 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
4120 * the configuration information for SPI module.
4121 * @retval None
4122 */
SPI_CloseRxTx_ISR(SPI_HandleTypeDef * hspi)4123 static void SPI_CloseRxTx_ISR(SPI_HandleTypeDef *hspi)
4124 {
4125 uint32_t tickstart;
4126
4127 /* Init tickstart for timeout management */
4128 tickstart = HAL_GetTick();
4129
4130 /* Disable ERR interrupt */
4131 __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR);
4132
4133 /* Check the end of the transaction */
4134 if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)
4135 {
4136 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);
4137 }
4138
4139 #if (USE_SPI_CRC != 0U)
4140 /* Check if CRC error occurred */
4141 if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET)
4142 {
4143 hspi->State = HAL_SPI_STATE_READY;
4144 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);
4145 __HAL_SPI_CLEAR_CRCERRFLAG(hspi);
4146 /* Call user error callback */
4147 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)
4148 hspi->ErrorCallback(hspi);
4149 #else
4150 HAL_SPI_ErrorCallback(hspi);
4151 #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */
4152 }
4153 else
4154 {
4155 #endif /* USE_SPI_CRC */
4156 if (hspi->ErrorCode == HAL_SPI_ERROR_NONE)
4157 {
4158 if (hspi->State == HAL_SPI_STATE_BUSY_RX)
4159 {
4160 hspi->State = HAL_SPI_STATE_READY;
4161 /* Call user Rx complete callback */
4162 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)
4163 hspi->RxCpltCallback(hspi);
4164 #else
4165 HAL_SPI_RxCpltCallback(hspi);
4166 #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */
4167 }
4168 else
4169 {
4170 hspi->State = HAL_SPI_STATE_READY;
4171 /* Call user TxRx complete callback */
4172 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)
4173 hspi->TxRxCpltCallback(hspi);
4174 #else
4175 HAL_SPI_TxRxCpltCallback(hspi);
4176 #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */
4177 }
4178 }
4179 else
4180 {
4181 hspi->State = HAL_SPI_STATE_READY;
4182 /* Call user error callback */
4183 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)
4184 hspi->ErrorCallback(hspi);
4185 #else
4186 HAL_SPI_ErrorCallback(hspi);
4187 #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */
4188 }
4189 #if (USE_SPI_CRC != 0U)
4190 }
4191 #endif /* USE_SPI_CRC */
4192 }
4193
4194 /**
4195 * @brief Handle the end of the RX transaction.
4196 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
4197 * the configuration information for SPI module.
4198 * @retval None
4199 */
SPI_CloseRx_ISR(SPI_HandleTypeDef * hspi)4200 static void SPI_CloseRx_ISR(SPI_HandleTypeDef *hspi)
4201 {
4202 /* Disable RXNE and ERR interrupt */
4203 __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR));
4204
4205 /* Check the end of the transaction */
4206 if (SPI_EndRxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)
4207 {
4208 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);
4209 }
4210 hspi->State = HAL_SPI_STATE_READY;
4211
4212 #if (USE_SPI_CRC != 0U)
4213 /* Check if CRC error occurred */
4214 if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET)
4215 {
4216 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);
4217 __HAL_SPI_CLEAR_CRCERRFLAG(hspi);
4218 /* Call user error callback */
4219 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)
4220 hspi->ErrorCallback(hspi);
4221 #else
4222 HAL_SPI_ErrorCallback(hspi);
4223 #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */
4224 }
4225 else
4226 {
4227 #endif /* USE_SPI_CRC */
4228 if (hspi->ErrorCode == HAL_SPI_ERROR_NONE)
4229 {
4230 /* Call user Rx complete callback */
4231 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)
4232 hspi->RxCpltCallback(hspi);
4233 #else
4234 HAL_SPI_RxCpltCallback(hspi);
4235 #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */
4236 }
4237 else
4238 {
4239 /* Call user error callback */
4240 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)
4241 hspi->ErrorCallback(hspi);
4242 #else
4243 HAL_SPI_ErrorCallback(hspi);
4244 #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */
4245 }
4246 #if (USE_SPI_CRC != 0U)
4247 }
4248 #endif /* USE_SPI_CRC */
4249 }
4250
4251 /**
4252 * @brief Handle the end of the TX transaction.
4253 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
4254 * the configuration information for SPI module.
4255 * @retval None
4256 */
SPI_CloseTx_ISR(SPI_HandleTypeDef * hspi)4257 static void SPI_CloseTx_ISR(SPI_HandleTypeDef *hspi)
4258 {
4259 uint32_t tickstart;
4260
4261 /* Init tickstart for timeout management*/
4262 tickstart = HAL_GetTick();
4263
4264 /* Disable TXE and ERR interrupt */
4265 __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_ERR));
4266
4267 /* Check the end of the transaction */
4268 if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)
4269 {
4270 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);
4271 }
4272
4273 /* Clear overrun flag in 2 Lines communication mode because received is not read */
4274 if (hspi->Init.Direction == SPI_DIRECTION_2LINES)
4275 {
4276 __HAL_SPI_CLEAR_OVRFLAG(hspi);
4277 }
4278
4279 hspi->State = HAL_SPI_STATE_READY;
4280 if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)
4281 {
4282 /* Call user error callback */
4283 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)
4284 hspi->ErrorCallback(hspi);
4285 #else
4286 HAL_SPI_ErrorCallback(hspi);
4287 #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */
4288 }
4289 else
4290 {
4291 /* Call user Rx complete callback */
4292 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)
4293 hspi->TxCpltCallback(hspi);
4294 #else
4295 HAL_SPI_TxCpltCallback(hspi);
4296 #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */
4297 }
4298 }
4299
4300 /**
4301 * @brief Handle abort a Rx transaction.
4302 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
4303 * the configuration information for SPI module.
4304 * @retval None
4305 */
SPI_AbortRx_ISR(SPI_HandleTypeDef * hspi)4306 static void SPI_AbortRx_ISR(SPI_HandleTypeDef *hspi)
4307 {
4308 __IO uint32_t count;
4309
4310 /* Disable SPI Peripheral */
4311 __HAL_SPI_DISABLE(hspi);
4312
4313 count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U);
4314
4315 /* Disable RXNEIE interrupt */
4316 CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_RXNEIE));
4317
4318 /* Check RXNEIE is disabled */
4319 do
4320 {
4321 if (count == 0U)
4322 {
4323 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);
4324 break;
4325 }
4326 count--;
4327 } while (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE));
4328
4329 /* Control the BSY flag */
4330 if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)
4331 {
4332 hspi->ErrorCode = HAL_SPI_ERROR_ABORT;
4333 }
4334
4335 /* Empty the FRLVL fifo */
4336 if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)
4337 {
4338 hspi->ErrorCode = HAL_SPI_ERROR_ABORT;
4339 }
4340
4341 hspi->State = HAL_SPI_STATE_ABORT;
4342 }
4343
4344 /**
4345 * @brief Handle abort a Tx or Rx/Tx transaction.
4346 * @param hspi pointer to a SPI_HandleTypeDef structure that contains
4347 * the configuration information for SPI module.
4348 * @retval None
4349 */
SPI_AbortTx_ISR(SPI_HandleTypeDef * hspi)4350 static void SPI_AbortTx_ISR(SPI_HandleTypeDef *hspi)
4351 {
4352 __IO uint32_t count;
4353
4354 count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U);
4355
4356 /* Disable TXEIE interrupt */
4357 CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXEIE));
4358
4359 /* Check TXEIE is disabled */
4360 do
4361 {
4362 if (count == 0U)
4363 {
4364 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);
4365 break;
4366 }
4367 count--;
4368 } while (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXEIE));
4369
4370 if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)
4371 {
4372 hspi->ErrorCode = HAL_SPI_ERROR_ABORT;
4373 }
4374
4375 /* Disable SPI Peripheral */
4376 __HAL_SPI_DISABLE(hspi);
4377
4378 /* Empty the FRLVL fifo */
4379 if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)
4380 {
4381 hspi->ErrorCode = HAL_SPI_ERROR_ABORT;
4382 }
4383
4384 /* Check case of Full-Duplex Mode and disable directly RXNEIE interrupt */
4385 if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE))
4386 {
4387 /* Disable RXNEIE interrupt */
4388 CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_RXNEIE));
4389
4390 /* Check RXNEIE is disabled */
4391 do
4392 {
4393 if (count == 0U)
4394 {
4395 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);
4396 break;
4397 }
4398 count--;
4399 } while (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE));
4400
4401 /* Control the BSY flag */
4402 if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)
4403 {
4404 hspi->ErrorCode = HAL_SPI_ERROR_ABORT;
4405 }
4406
4407 /* Empty the FRLVL fifo */
4408 if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)
4409 {
4410 hspi->ErrorCode = HAL_SPI_ERROR_ABORT;
4411 }
4412 }
4413 hspi->State = HAL_SPI_STATE_ABORT;
4414 }
4415
4416 /**
4417 * @}
4418 */
4419
4420 #endif /* HAL_SPI_MODULE_ENABLED */
4421
4422 /**
4423 * @}
4424 */
4425
4426 /**
4427 * @}
4428 */
4429
4430