]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c
Rename STM32Cube to GCC for STM32L4 Discovery projects as GCC is
[freertos] / FreeRTOS / Demo / CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube / ST_Code / Drivers / STM32L4xx_HAL_Driver / Src / stm32l4xx_hal_spi.c
diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c
deleted file mode 100644 (file)
index 3be342c..0000000
+++ /dev/null
@@ -1,4273 +0,0 @@
-/**\r
-  ******************************************************************************\r
-  * @file    stm32l4xx_hal_spi.c\r
-  * @author  MCD Application Team\r
-  * @brief   SPI HAL module driver.\r
-  *          This file provides firmware functions to manage the following\r
-  *          functionalities of the Serial Peripheral Interface (SPI) peripheral:\r
-  *           + Initialization and de-initialization functions\r
-  *           + IO operation functions\r
-  *           + Peripheral Control functions\r
-  *           + Peripheral State functions\r
-  *\r
-  @verbatim\r
-  ==============================================================================\r
-                        ##### How to use this driver #####\r
-  ==============================================================================\r
-    [..]\r
-      The SPI HAL driver can be used as follows:\r
-\r
-      (#) Declare a SPI_HandleTypeDef handle structure, for example:\r
-          SPI_HandleTypeDef  hspi;\r
-\r
-      (#)Initialize the SPI low level resources by implementing the HAL_SPI_MspInit() API:\r
-          (##) Enable the SPIx interface clock\r
-          (##) SPI pins configuration\r
-              (+++) Enable the clock for the SPI GPIOs\r
-              (+++) Configure these SPI pins as alternate function push-pull\r
-          (##) NVIC configuration if you need to use interrupt process\r
-              (+++) Configure the SPIx interrupt priority\r
-              (+++) Enable the NVIC SPI IRQ handle\r
-          (##) DMA Configuration if you need to use DMA process\r
-              (+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive Stream/Channel\r
-              (+++) Enable the DMAx clock\r
-              (+++) Configure the DMA handle parameters\r
-              (+++) Configure the DMA Tx or Rx Stream/Channel\r
-              (+++) Associate the initialized hdma_tx(or _rx)  handle to the hspi DMA Tx or Rx handle\r
-              (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx or Rx Stream/Channel\r
-\r
-      (#) Program the Mode, BidirectionalMode , Data size, Baudrate Prescaler, NSS\r
-          management, Clock polarity and phase, FirstBit and CRC configuration in the hspi Init structure.\r
-\r
-      (#) Initialize the SPI registers by calling the HAL_SPI_Init() API:\r
-          (++) This API configures also the low level Hardware GPIO, CLOCK, CORTEX...etc)\r
-              by calling the customized HAL_SPI_MspInit() API.\r
-     [..]\r
-       Circular mode restriction:\r
-      (#) The DMA circular mode cannot be used when the SPI is configured in these modes:\r
-          (##) Master 2Lines RxOnly\r
-          (##) Master 1Line Rx\r
-      (#) The CRC feature is not managed when the DMA circular mode is enabled\r
-      (#) When the SPI DMA Pause/Stop features are used, we must use the following APIs\r
-          the HAL_SPI_DMAPause()/ HAL_SPI_DMAStop() only under the SPI callbacks\r
-     [..]\r
-       Master Receive mode restriction:\r
-      (#) In Master unidirectional receive-only mode (MSTR =1, BIDIMODE=0, RXONLY=1) or\r
-          bidirectional receive mode (MSTR=1, BIDIMODE=1, BIDIOE=0), to ensure that the SPI\r
-          does not initiate a new transfer the following procedure has to be respected:\r
-          (##) HAL_SPI_DeInit()\r
-          (##) HAL_SPI_Init()\r
-     [..]\r
-       Callback registration:\r
-\r
-      (#) The compilation flag USE_HAL_SPI_REGISTER_CALLBACKS when set to 1U\r
-          allows the user to configure dynamically the driver callbacks.\r
-          Use Functions HAL_SPI_RegisterCallback() to register an interrupt callback.\r
-\r
-          Function HAL_SPI_RegisterCallback() allows to register following callbacks:\r
-            (+) TxCpltCallback        : SPI Tx Completed callback\r
-            (+) RxCpltCallback        : SPI Rx Completed callback\r
-            (+) TxRxCpltCallback      : SPI TxRx Completed callback\r
-            (+) TxHalfCpltCallback    : SPI Tx Half Completed callback\r
-            (+) RxHalfCpltCallback    : SPI Rx Half Completed callback\r
-            (+) TxRxHalfCpltCallback  : SPI TxRx Half Completed callback\r
-            (+) ErrorCallback         : SPI Error callback\r
-            (+) AbortCpltCallback     : SPI Abort callback\r
-            (+) MspInitCallback       : SPI Msp Init callback\r
-            (+) MspDeInitCallback     : SPI Msp DeInit callback\r
-          This function takes as parameters the HAL peripheral handle, the Callback ID\r
-          and a pointer to the user callback function.\r
-\r
-\r
-      (#) Use function HAL_SPI_UnRegisterCallback to reset a callback to the default\r
-          weak function.\r
-          HAL_SPI_UnRegisterCallback takes as parameters the HAL peripheral handle,\r
-          and the Callback ID.\r
-          This function allows to reset following callbacks:\r
-            (+) TxCpltCallback        : SPI Tx Completed callback\r
-            (+) RxCpltCallback        : SPI Rx Completed callback\r
-            (+) TxRxCpltCallback      : SPI TxRx Completed callback\r
-            (+) TxHalfCpltCallback    : SPI Tx Half Completed callback\r
-            (+) RxHalfCpltCallback    : SPI Rx Half Completed callback\r
-            (+) TxRxHalfCpltCallback  : SPI TxRx Half Completed callback\r
-            (+) ErrorCallback         : SPI Error callback\r
-            (+) AbortCpltCallback     : SPI Abort callback\r
-            (+) MspInitCallback       : SPI Msp Init callback\r
-            (+) MspDeInitCallback     : SPI Msp DeInit callback\r
-\r
-       By default, after the HAL_SPI_Init() and when the state is HAL_SPI_STATE_RESET\r
-       all callbacks are set to the corresponding weak functions:\r
-       examples HAL_SPI_MasterTxCpltCallback(), HAL_SPI_MasterRxCpltCallback().\r
-       Exception done for MspInit and MspDeInit functions that are\r
-       reset to the legacy weak functions in the HAL_SPI_Init()/ HAL_SPI_DeInit() only when\r
-       these callbacks are null (not registered beforehand).\r
-       If MspInit or MspDeInit are not null, the HAL_SPI_Init()/ HAL_SPI_DeInit()\r
-       keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state.\r
-\r
-       Callbacks can be registered/unregistered in HAL_SPI_STATE_READY state only.\r
-       Exception done MspInit/MspDeInit functions that can be registered/unregistered\r
-       in HAL_SPI_STATE_READY or HAL_SPI_STATE_RESET state,\r
-       thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit.\r
-       Then, the user first registers the MspInit/MspDeInit user callbacks\r
-       using HAL_SPI_RegisterCallback() before calling HAL_SPI_DeInit()\r
-       or HAL_SPI_Init() function.\r
-\r
-       When The compilation define USE_HAL_PPP_REGISTER_CALLBACKS is set to 0 or\r
-       not defined, the callback registering feature is not available\r
-       and weak (surcharged) callbacks are used.\r
-\r
-     [..]\r
-       Using the HAL it is not possible to reach all supported SPI frequency with the different SPI Modes,\r
-       the following table resume the max SPI frequency reached with data size 8bits/16bits,\r
-         according to frequency of the APBx Peripheral Clock (fPCLK) used by the SPI instance.\r
-\r
-  @endverbatim\r
-\r
-  Additional table :\r
-\r
-       DataSize = SPI_DATASIZE_8BIT:\r
-       +----------------------------------------------------------------------------------------------+\r
-       |         |                | 2Lines Fullduplex   |     2Lines RxOnly    |         1Line        |\r
-       | Process | Tranfert mode  |---------------------|----------------------|----------------------|\r
-       |         |                |  Master  |  Slave   |  Master   |  Slave   |  Master   |  Slave   |\r
-       |==============================================================================================|\r
-       |    T    |     Polling    | Fpclk/4  | Fpclk/8  |    NA     |    NA    |    NA     |   NA     |\r
-       |    X    |----------------|----------|----------|-----------|----------|-----------|----------|\r
-       |    /    |     Interrupt  | Fpclk/4  | Fpclk/16 |    NA     |    NA    |    NA     |   NA     |\r
-       |    R    |----------------|----------|----------|-----------|----------|-----------|----------|\r
-       |    X    |       DMA      | Fpclk/2  | Fpclk/2  |    NA     |    NA    |    NA     |   NA     |\r
-       |=========|================|==========|==========|===========|==========|===========|==========|\r
-       |         |     Polling    | Fpclk/4  | Fpclk/8  | Fpclk/16  | Fpclk/8  | Fpclk/8   | Fpclk/8  |\r
-       |         |----------------|----------|----------|-----------|----------|-----------|----------|\r
-       |    R    |     Interrupt  | Fpclk/8  | Fpclk/16 | Fpclk/8   | Fpclk/8  | Fpclk/8   | Fpclk/4  |\r
-       |    X    |----------------|----------|----------|-----------|----------|-----------|----------|\r
-       |         |       DMA      | Fpclk/4  | Fpclk/2  | Fpclk/2   | Fpclk/16 | Fpclk/2   | Fpclk/16 |\r
-       |=========|================|==========|==========|===========|==========|===========|==========|\r
-       |         |     Polling    | Fpclk/8  | Fpclk/2  |     NA    |    NA    | Fpclk/8   | Fpclk/8  |\r
-       |         |----------------|----------|----------|-----------|----------|-----------|----------|\r
-       |    T    |     Interrupt  | Fpclk/2  | Fpclk/4  |     NA    |    NA    | Fpclk/16  | Fpclk/8  |\r
-       |    X    |----------------|----------|----------|-----------|----------|-----------|----------|\r
-       |         |       DMA      | Fpclk/2  | Fpclk/2  |     NA    |    NA    | Fpclk/8   | Fpclk/16 |\r
-       +----------------------------------------------------------------------------------------------+\r
-\r
-       DataSize = SPI_DATASIZE_16BIT:\r
-       +----------------------------------------------------------------------------------------------+\r
-       |         |                | 2Lines Fullduplex   |     2Lines RxOnly    |         1Line        |\r
-       | Process | Tranfert mode  |---------------------|----------------------|----------------------|\r
-       |         |                |  Master  |  Slave   |  Master   |  Slave   |  Master   |  Slave   |\r
-       |==============================================================================================|\r
-       |    T    |     Polling    | Fpclk/4  | Fpclk/8  |    NA     |    NA    |    NA     |   NA     |\r
-       |    X    |----------------|----------|----------|-----------|----------|-----------|----------|\r
-       |    /    |     Interrupt  | Fpclk/4  | Fpclk/16 |    NA     |    NA    |    NA     |   NA     |\r
-       |    R    |----------------|----------|----------|-----------|----------|-----------|----------|\r
-       |    X    |       DMA      | Fpclk/2  | Fpclk/2  |    NA     |    NA    |    NA     |   NA     |\r
-       |=========|================|==========|==========|===========|==========|===========|==========|\r
-       |         |     Polling    | Fpclk/4  | Fpclk/8  | Fpclk/16  | Fpclk/8  | Fpclk/8   | Fpclk/8  |\r
-       |         |----------------|----------|----------|-----------|----------|-----------|----------|\r
-       |    R    |     Interrupt  | Fpclk/8  | Fpclk/16 | Fpclk/8   | Fpclk/8  | Fpclk/8   | Fpclk/4  |\r
-       |    X    |----------------|----------|----------|-----------|----------|-----------|----------|\r
-       |         |       DMA      | Fpclk/4  | Fpclk/2  | Fpclk/2   | Fpclk/16 | Fpclk/2   | Fpclk/16 |\r
-       |=========|================|==========|==========|===========|==========|===========|==========|\r
-       |         |     Polling    | Fpclk/8  | Fpclk/2  |     NA    |    NA    | Fpclk/8   | Fpclk/8  |\r
-       |         |----------------|----------|----------|-----------|----------|-----------|----------|\r
-       |    T    |     Interrupt  | Fpclk/2  | Fpclk/4  |     NA    |    NA    | Fpclk/16  | Fpclk/8  |\r
-       |    X    |----------------|----------|----------|-----------|----------|-----------|----------|\r
-       |         |       DMA      | Fpclk/2  | Fpclk/2  |     NA    |    NA    | Fpclk/8   | Fpclk/16 |\r
-       +----------------------------------------------------------------------------------------------+\r
-       @note The max SPI frequency depend on SPI data size (4bits, 5bits,..., 8bits,...15bits, 16bits),\r
-             SPI mode(2 Lines fullduplex, 2 lines RxOnly, 1 line TX/RX) and Process mode (Polling, IT, DMA).\r
-       @note\r
-            (#) TX/RX processes are HAL_SPI_TransmitReceive(), HAL_SPI_TransmitReceive_IT() and HAL_SPI_TransmitReceive_DMA()\r
-            (#) RX processes are HAL_SPI_Receive(), HAL_SPI_Receive_IT() and HAL_SPI_Receive_DMA()\r
-            (#) TX processes are HAL_SPI_Transmit(), HAL_SPI_Transmit_IT() and HAL_SPI_Transmit_DMA()\r
-\r
-  ******************************************************************************\r
-  * @attention\r
-  *\r
-  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.\r
-  * All rights reserved.</center></h2>\r
-  *\r
-  * This software component is licensed by ST under BSD 3-Clause license,\r
-  * the "License"; You may not use this file except in compliance with the\r
-  * License. You may obtain a copy of the License at:\r
-  *                        opensource.org/licenses/BSD-3-Clause\r
-  *\r
-  ******************************************************************************\r
-  */\r
-\r
-/* Includes ------------------------------------------------------------------*/\r
-#include "stm32l4xx_hal.h"\r
-\r
-/** @addtogroup STM32L4xx_HAL_Driver\r
-  * @{\r
-  */\r
-\r
-/** @defgroup SPI SPI\r
-  * @brief SPI HAL module driver\r
-  * @{\r
-  */\r
-#ifdef HAL_SPI_MODULE_ENABLED\r
-\r
-/* Private typedef -----------------------------------------------------------*/\r
-/* Private defines -----------------------------------------------------------*/\r
-/** @defgroup SPI_Private_Constants SPI Private Constants\r
-  * @{\r
-  */\r
-#define SPI_DEFAULT_TIMEOUT 100U\r
-/**\r
-  * @}\r
-  */\r
-\r
-/* Private macros ------------------------------------------------------------*/\r
-/* Private variables ---------------------------------------------------------*/\r
-/* Private function prototypes -----------------------------------------------*/\r
-/** @defgroup SPI_Private_Functions SPI Private Functions\r
-  * @{\r
-  */\r
-static void SPI_DMATransmitCplt(DMA_HandleTypeDef *hdma);\r
-static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma);\r
-static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma);\r
-static void SPI_DMAHalfTransmitCplt(DMA_HandleTypeDef *hdma);\r
-static void SPI_DMAHalfReceiveCplt(DMA_HandleTypeDef *hdma);\r
-static void SPI_DMAHalfTransmitReceiveCplt(DMA_HandleTypeDef *hdma);\r
-static void SPI_DMAError(DMA_HandleTypeDef *hdma);\r
-static void SPI_DMAAbortOnError(DMA_HandleTypeDef *hdma);\r
-static void SPI_DMATxAbortCallback(DMA_HandleTypeDef *hdma);\r
-static void SPI_DMARxAbortCallback(DMA_HandleTypeDef *hdma);\r
-static HAL_StatusTypeDef SPI_WaitFlagStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, FlagStatus State,\r
-                                                       uint32_t Timeout, uint32_t Tickstart);\r
-static HAL_StatusTypeDef SPI_WaitFifoStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Fifo, uint32_t State,\r
-                                                       uint32_t Timeout, uint32_t Tickstart);\r
-static void SPI_TxISR_8BIT(struct __SPI_HandleTypeDef *hspi);\r
-static void SPI_TxISR_16BIT(struct __SPI_HandleTypeDef *hspi);\r
-static void SPI_RxISR_8BIT(struct __SPI_HandleTypeDef *hspi);\r
-static void SPI_RxISR_16BIT(struct __SPI_HandleTypeDef *hspi);\r
-static void SPI_2linesRxISR_8BIT(struct __SPI_HandleTypeDef *hspi);\r
-static void SPI_2linesTxISR_8BIT(struct __SPI_HandleTypeDef *hspi);\r
-static void SPI_2linesTxISR_16BIT(struct __SPI_HandleTypeDef *hspi);\r
-static void SPI_2linesRxISR_16BIT(struct __SPI_HandleTypeDef *hspi);\r
-#if (USE_SPI_CRC != 0U)\r
-static void SPI_RxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi);\r
-static void SPI_RxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi);\r
-static void SPI_2linesRxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi);\r
-static void SPI_2linesRxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi);\r
-#endif /* USE_SPI_CRC */\r
-static void SPI_AbortRx_ISR(SPI_HandleTypeDef *hspi);\r
-static void SPI_AbortTx_ISR(SPI_HandleTypeDef *hspi);\r
-static void SPI_CloseRxTx_ISR(SPI_HandleTypeDef *hspi);\r
-static void SPI_CloseRx_ISR(SPI_HandleTypeDef *hspi);\r
-static void SPI_CloseTx_ISR(SPI_HandleTypeDef *hspi);\r
-static HAL_StatusTypeDef SPI_EndRxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart);\r
-static HAL_StatusTypeDef SPI_EndRxTxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart);\r
-/**\r
-  * @}\r
-  */\r
-\r
-/* Exported functions --------------------------------------------------------*/\r
-/** @defgroup SPI_Exported_Functions SPI Exported Functions\r
-  * @{\r
-  */\r
-\r
-/** @defgroup SPI_Exported_Functions_Group1 Initialization and de-initialization functions\r
- *  @brief    Initialization and Configuration functions\r
- *\r
-@verbatim\r
- ===============================================================================\r
-              ##### Initialization and de-initialization functions #####\r
- ===============================================================================\r
-    [..]  This subsection provides a set of functions allowing to initialize and\r
-          de-initialize the SPIx peripheral:\r
-\r
-      (+) User must implement HAL_SPI_MspInit() function in which he configures\r
-          all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC ).\r
-\r
-      (+) Call the function HAL_SPI_Init() to configure the selected device with\r
-          the selected configuration:\r
-        (++) Mode\r
-        (++) Direction\r
-        (++) Data Size\r
-        (++) Clock Polarity and Phase\r
-        (++) NSS Management\r
-        (++) BaudRate Prescaler\r
-        (++) FirstBit\r
-        (++) TIMode\r
-        (++) CRC Calculation\r
-        (++) CRC Polynomial if CRC enabled\r
-        (++) CRC Length, used only with Data8 and Data16\r
-        (++) FIFO reception threshold\r
-\r
-      (+) Call the function HAL_SPI_DeInit() to restore the default configuration\r
-          of the selected SPIx peripheral.\r
-\r
-@endverbatim\r
-  * @{\r
-  */\r
-\r
-/**\r
-  * @brief  Initialize the SPI according to the specified parameters\r
-  *         in the SPI_InitTypeDef and initialize the associated handle.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval HAL status\r
-  */\r
-HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi)\r
-{\r
-  uint32_t frxth;\r
-\r
-  /* Check the SPI handle allocation */\r
-  if (hspi == NULL)\r
-  {\r
-    return HAL_ERROR;\r
-  }\r
-\r
-  /* Check the parameters */\r
-  assert_param(IS_SPI_ALL_INSTANCE(hspi->Instance));\r
-  assert_param(IS_SPI_MODE(hspi->Init.Mode));\r
-  assert_param(IS_SPI_DIRECTION(hspi->Init.Direction));\r
-  assert_param(IS_SPI_DATASIZE(hspi->Init.DataSize));\r
-  assert_param(IS_SPI_NSS(hspi->Init.NSS));\r
-  assert_param(IS_SPI_NSSP(hspi->Init.NSSPMode));\r
-  assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler));\r
-  assert_param(IS_SPI_FIRST_BIT(hspi->Init.FirstBit));\r
-  assert_param(IS_SPI_TIMODE(hspi->Init.TIMode));\r
-  if (hspi->Init.TIMode == SPI_TIMODE_DISABLE)\r
-  {\r
-    assert_param(IS_SPI_CPOL(hspi->Init.CLKPolarity));\r
-    assert_param(IS_SPI_CPHA(hspi->Init.CLKPhase));\r
-  }\r
-#if (USE_SPI_CRC != 0U)\r
-  assert_param(IS_SPI_CRC_CALCULATION(hspi->Init.CRCCalculation));\r
-  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)\r
-  {\r
-    assert_param(IS_SPI_CRC_POLYNOMIAL(hspi->Init.CRCPolynomial));\r
-    assert_param(IS_SPI_CRC_LENGTH(hspi->Init.CRCLength));\r
-  }\r
-#else\r
-  hspi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;\r
-#endif /* USE_SPI_CRC */\r
-\r
-  if (hspi->State == HAL_SPI_STATE_RESET)\r
-  {\r
-    /* Allocate lock resource and initialize it */\r
-    hspi->Lock = HAL_UNLOCKED;\r
-\r
-#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)\r
-    /* Init the SPI Callback settings */\r
-    hspi->TxCpltCallback       = HAL_SPI_TxCpltCallback;       /* Legacy weak TxCpltCallback       */\r
-    hspi->RxCpltCallback       = HAL_SPI_RxCpltCallback;       /* Legacy weak RxCpltCallback       */\r
-    hspi->TxRxCpltCallback     = HAL_SPI_TxRxCpltCallback;     /* Legacy weak TxRxCpltCallback     */\r
-    hspi->TxHalfCpltCallback   = HAL_SPI_TxHalfCpltCallback;   /* Legacy weak TxHalfCpltCallback   */\r
-    hspi->RxHalfCpltCallback   = HAL_SPI_RxHalfCpltCallback;   /* Legacy weak RxHalfCpltCallback   */\r
-    hspi->TxRxHalfCpltCallback = HAL_SPI_TxRxHalfCpltCallback; /* Legacy weak TxRxHalfCpltCallback */\r
-    hspi->ErrorCallback        = HAL_SPI_ErrorCallback;        /* Legacy weak ErrorCallback        */\r
-    hspi->AbortCpltCallback    = HAL_SPI_AbortCpltCallback;    /* Legacy weak AbortCpltCallback    */\r
-\r
-    if (hspi->MspInitCallback == NULL)\r
-    {\r
-      hspi->MspInitCallback = HAL_SPI_MspInit; /* Legacy weak MspInit  */\r
-    }\r
-\r
-    /* Init the low level hardware : GPIO, CLOCK, NVIC... */\r
-    hspi->MspInitCallback(hspi);\r
-#else\r
-    /* Init the low level hardware : GPIO, CLOCK, NVIC... */\r
-    HAL_SPI_MspInit(hspi);\r
-#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */\r
-  }\r
-\r
-  hspi->State = HAL_SPI_STATE_BUSY;\r
-\r
-  /* Disable the selected SPI peripheral */\r
-  __HAL_SPI_DISABLE(hspi);\r
-\r
-  /* Align by default the rs fifo threshold on the data size */\r
-  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)\r
-  {\r
-    frxth = SPI_RXFIFO_THRESHOLD_HF;\r
-  }\r
-  else\r
-  {\r
-    frxth = SPI_RXFIFO_THRESHOLD_QF;\r
-  }\r
-\r
-  /* CRC calculation is valid only for 16Bit and 8 Bit */\r
-  if ((hspi->Init.DataSize != SPI_DATASIZE_16BIT) && (hspi->Init.DataSize != SPI_DATASIZE_8BIT))\r
-  {\r
-    /* CRC must be disabled */\r
-    hspi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;\r
-  }\r
-\r
-  /* Align the CRC Length on the data size */\r
-  if (hspi->Init.CRCLength == SPI_CRC_LENGTH_DATASIZE)\r
-  {\r
-    /* CRC Length aligned on the data size : value set by default */\r
-    if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)\r
-    {\r
-      hspi->Init.CRCLength = SPI_CRC_LENGTH_16BIT;\r
-    }\r
-    else\r
-    {\r
-      hspi->Init.CRCLength = SPI_CRC_LENGTH_8BIT;\r
-    }\r
-  }\r
-\r
-  /*----------------------- SPIx CR1 & CR2 Configuration ---------------------*/\r
-  /* Configure : SPI Mode, Communication Mode, Clock polarity and phase, NSS management,\r
-  Communication speed, First bit and CRC calculation state */\r
-  WRITE_REG(hspi->Instance->CR1, (hspi->Init.Mode | hspi->Init.Direction |\r
-                                  hspi->Init.CLKPolarity | hspi->Init.CLKPhase | (hspi->Init.NSS & SPI_CR1_SSM) |\r
-                                  hspi->Init.BaudRatePrescaler | hspi->Init.FirstBit  | hspi->Init.CRCCalculation));\r
-#if (USE_SPI_CRC != 0U)\r
-  /* Configure : CRC Length */\r
-  if (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT)\r
-  {\r
-    hspi->Instance->CR1 |= SPI_CR1_CRCL;\r
-  }\r
-#endif /* USE_SPI_CRC */\r
-\r
-  /* Configure : NSS management, TI Mode, NSS Pulse, Data size and Rx Fifo threshold */\r
-  WRITE_REG(hspi->Instance->CR2, (((hspi->Init.NSS >> 16U) & SPI_CR2_SSOE) | hspi->Init.TIMode |\r
-                                  hspi->Init.NSSPMode | hspi->Init.DataSize) | frxth);\r
-\r
-#if (USE_SPI_CRC != 0U)\r
-  /*---------------------------- SPIx CRCPOLY Configuration ------------------*/\r
-  /* Configure : CRC Polynomial */\r
-  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)\r
-  {\r
-    WRITE_REG(hspi->Instance->CRCPR, hspi->Init.CRCPolynomial);\r
-  }\r
-#endif /* USE_SPI_CRC */\r
-\r
-#if defined(SPI_I2SCFGR_I2SMOD)\r
-  /* Activate the SPI mode (Make sure that I2SMOD bit in I2SCFGR register is reset) */\r
-  CLEAR_BIT(hspi->Instance->I2SCFGR, SPI_I2SCFGR_I2SMOD);\r
-#endif /* SPI_I2SCFGR_I2SMOD */\r
-\r
-  hspi->ErrorCode = HAL_SPI_ERROR_NONE;\r
-  hspi->State     = HAL_SPI_STATE_READY;\r
-\r
-  return HAL_OK;\r
-}\r
-\r
-/**\r
-  * @brief  De-Initialize the SPI peripheral.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval HAL status\r
-  */\r
-HAL_StatusTypeDef HAL_SPI_DeInit(SPI_HandleTypeDef *hspi)\r
-{\r
-  /* Check the SPI handle allocation */\r
-  if (hspi == NULL)\r
-  {\r
-    return HAL_ERROR;\r
-  }\r
-\r
-  /* Check SPI Instance parameter */\r
-  assert_param(IS_SPI_ALL_INSTANCE(hspi->Instance));\r
-\r
-  hspi->State = HAL_SPI_STATE_BUSY;\r
-\r
-  /* Disable the SPI Peripheral Clock */\r
-  __HAL_SPI_DISABLE(hspi);\r
-\r
-#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)\r
-  if (hspi->MspDeInitCallback == NULL)\r
-  {\r
-    hspi->MspDeInitCallback = HAL_SPI_MspDeInit; /* Legacy weak MspDeInit  */\r
-  }\r
-\r
-  /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */\r
-  hspi->MspDeInitCallback(hspi);\r
-#else\r
-  /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */\r
-  HAL_SPI_MspDeInit(hspi);\r
-#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */\r
-\r
-  hspi->ErrorCode = HAL_SPI_ERROR_NONE;\r
-  hspi->State = HAL_SPI_STATE_RESET;\r
-\r
-  /* Release Lock */\r
-  __HAL_UNLOCK(hspi);\r
-\r
-  return HAL_OK;\r
-}\r
-\r
-/**\r
-  * @brief  Initialize the SPI MSP.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval None\r
-  */\r
-__weak void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)\r
-{\r
-  /* Prevent unused argument(s) compilation warning */\r
-  UNUSED(hspi);\r
-\r
-  /* NOTE : This function should not be modified, when the callback is needed,\r
-            the HAL_SPI_MspInit should be implemented in the user file\r
-   */\r
-}\r
-\r
-/**\r
-  * @brief  De-Initialize the SPI MSP.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval None\r
-  */\r
-__weak void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi)\r
-{\r
-  /* Prevent unused argument(s) compilation warning */\r
-  UNUSED(hspi);\r
-\r
-  /* NOTE : This function should not be modified, when the callback is needed,\r
-            the HAL_SPI_MspDeInit should be implemented in the user file\r
-   */\r
-}\r
-\r
-#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)\r
-/**\r
-  * @brief  Register a User SPI Callback\r
-  *         To be used instead of the weak predefined callback\r
-  * @param  hspi Pointer to a SPI_HandleTypeDef structure that contains\r
-  *                the configuration information for the specified SPI.\r
-  * @param  CallbackID ID of the callback to be registered\r
-  * @param  pCallback pointer to the Callback function\r
-  * @retval HAL status\r
-  */\r
-HAL_StatusTypeDef HAL_SPI_RegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID, pSPI_CallbackTypeDef pCallback)\r
-{\r
-  HAL_StatusTypeDef status = HAL_OK;\r
-\r
-  if (pCallback == NULL)\r
-  {\r
-    /* Update the error code */\r
-    hspi->ErrorCode |= HAL_SPI_ERROR_INVALID_CALLBACK;\r
-\r
-    return HAL_ERROR;\r
-  }\r
-  /* Process locked */\r
-  __HAL_LOCK(hspi);\r
-\r
-  if (HAL_SPI_STATE_READY == hspi->State)\r
-  {\r
-    switch (CallbackID)\r
-    {\r
-      case HAL_SPI_TX_COMPLETE_CB_ID :\r
-        hspi->TxCpltCallback = pCallback;\r
-        break;\r
-\r
-      case HAL_SPI_RX_COMPLETE_CB_ID :\r
-        hspi->RxCpltCallback = pCallback;\r
-        break;\r
-\r
-      case HAL_SPI_TX_RX_COMPLETE_CB_ID :\r
-        hspi->TxRxCpltCallback = pCallback;\r
-        break;\r
-\r
-      case HAL_SPI_TX_HALF_COMPLETE_CB_ID :\r
-        hspi->TxHalfCpltCallback = pCallback;\r
-        break;\r
-\r
-      case HAL_SPI_RX_HALF_COMPLETE_CB_ID :\r
-        hspi->RxHalfCpltCallback = pCallback;\r
-        break;\r
-\r
-      case HAL_SPI_TX_RX_HALF_COMPLETE_CB_ID :\r
-        hspi->TxRxHalfCpltCallback = pCallback;\r
-        break;\r
-\r
-      case HAL_SPI_ERROR_CB_ID :\r
-        hspi->ErrorCallback = pCallback;\r
-        break;\r
-\r
-      case HAL_SPI_ABORT_CB_ID :\r
-        hspi->AbortCpltCallback = pCallback;\r
-        break;\r
-\r
-      case HAL_SPI_MSPINIT_CB_ID :\r
-        hspi->MspInitCallback = pCallback;\r
-        break;\r
-\r
-      case HAL_SPI_MSPDEINIT_CB_ID :\r
-        hspi->MspDeInitCallback = pCallback;\r
-        break;\r
-\r
-      default :\r
-        /* Update the error code */\r
-        SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK);\r
-\r
-        /* Return error status */\r
-        status =  HAL_ERROR;\r
-        break;\r
-    }\r
-  }\r
-  else if (HAL_SPI_STATE_RESET == hspi->State)\r
-  {\r
-    switch (CallbackID)\r
-    {\r
-      case HAL_SPI_MSPINIT_CB_ID :\r
-        hspi->MspInitCallback = pCallback;\r
-        break;\r
-\r
-      case HAL_SPI_MSPDEINIT_CB_ID :\r
-        hspi->MspDeInitCallback = pCallback;\r
-        break;\r
-\r
-      default :\r
-        /* Update the error code */\r
-        SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK);\r
-\r
-        /* Return error status */\r
-        status =  HAL_ERROR;\r
-        break;\r
-    }\r
-  }\r
-  else\r
-  {\r
-    /* Update the error code */\r
-    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK);\r
-\r
-    /* Return error status */\r
-    status =  HAL_ERROR;\r
-  }\r
-\r
-  /* Release Lock */\r
-  __HAL_UNLOCK(hspi);\r
-  return status;\r
-}\r
-\r
-/**\r
-  * @brief  Unregister an SPI Callback\r
-  *         SPI callback is redirected to the weak predefined callback\r
-  * @param  hspi Pointer to a SPI_HandleTypeDef structure that contains\r
-  *                the configuration information for the specified SPI.\r
-  * @param  CallbackID ID of the callback to be unregistered\r
-  * @retval HAL status\r
-  */\r
-HAL_StatusTypeDef HAL_SPI_UnRegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID)\r
-{\r
-  HAL_StatusTypeDef status = HAL_OK;\r
-\r
-  /* Process locked */\r
-  __HAL_LOCK(hspi);\r
-\r
-  if (HAL_SPI_STATE_READY == hspi->State)\r
-  {\r
-    switch (CallbackID)\r
-    {\r
-      case HAL_SPI_TX_COMPLETE_CB_ID :\r
-        hspi->TxCpltCallback = HAL_SPI_TxCpltCallback;             /* Legacy weak TxCpltCallback       */\r
-        break;\r
-\r
-      case HAL_SPI_RX_COMPLETE_CB_ID :\r
-        hspi->RxCpltCallback = HAL_SPI_RxCpltCallback;             /* Legacy weak RxCpltCallback       */\r
-        break;\r
-\r
-      case HAL_SPI_TX_RX_COMPLETE_CB_ID :\r
-        hspi->TxRxCpltCallback = HAL_SPI_TxRxCpltCallback;         /* Legacy weak TxRxCpltCallback     */\r
-        break;\r
-\r
-      case HAL_SPI_TX_HALF_COMPLETE_CB_ID :\r
-        hspi->TxHalfCpltCallback = HAL_SPI_TxHalfCpltCallback;     /* Legacy weak TxHalfCpltCallback   */\r
-        break;\r
-\r
-      case HAL_SPI_RX_HALF_COMPLETE_CB_ID :\r
-        hspi->RxHalfCpltCallback = HAL_SPI_RxHalfCpltCallback;     /* Legacy weak RxHalfCpltCallback   */\r
-        break;\r
-\r
-      case HAL_SPI_TX_RX_HALF_COMPLETE_CB_ID :\r
-        hspi->TxRxHalfCpltCallback = HAL_SPI_TxRxHalfCpltCallback; /* Legacy weak TxRxHalfCpltCallback */\r
-        break;\r
-\r
-      case HAL_SPI_ERROR_CB_ID :\r
-        hspi->ErrorCallback = HAL_SPI_ErrorCallback;               /* Legacy weak ErrorCallback        */\r
-        break;\r
-\r
-      case HAL_SPI_ABORT_CB_ID :\r
-        hspi->AbortCpltCallback = HAL_SPI_AbortCpltCallback;       /* Legacy weak AbortCpltCallback    */\r
-        break;\r
-\r
-      case HAL_SPI_MSPINIT_CB_ID :\r
-        hspi->MspInitCallback = HAL_SPI_MspInit;                   /* Legacy weak MspInit              */\r
-        break;\r
-\r
-      case HAL_SPI_MSPDEINIT_CB_ID :\r
-        hspi->MspDeInitCallback = HAL_SPI_MspDeInit;               /* Legacy weak MspDeInit            */\r
-        break;\r
-\r
-      default :\r
-        /* Update the error code */\r
-        SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK);\r
-\r
-        /* Return error status */\r
-        status =  HAL_ERROR;\r
-        break;\r
-    }\r
-  }\r
-  else if (HAL_SPI_STATE_RESET == hspi->State)\r
-  {\r
-    switch (CallbackID)\r
-    {\r
-      case HAL_SPI_MSPINIT_CB_ID :\r
-        hspi->MspInitCallback = HAL_SPI_MspInit;                   /* Legacy weak MspInit              */\r
-        break;\r
-\r
-      case HAL_SPI_MSPDEINIT_CB_ID :\r
-        hspi->MspDeInitCallback = HAL_SPI_MspDeInit;               /* Legacy weak MspDeInit            */\r
-        break;\r
-\r
-      default :\r
-        /* Update the error code */\r
-        SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK);\r
-\r
-        /* Return error status */\r
-        status =  HAL_ERROR;\r
-        break;\r
-    }\r
-  }\r
-  else\r
-  {\r
-    /* Update the error code */\r
-    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK);\r
-\r
-    /* Return error status */\r
-    status =  HAL_ERROR;\r
-  }\r
-\r
-  /* Release Lock */\r
-  __HAL_UNLOCK(hspi);\r
-  return status;\r
-}\r
-#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */\r
-/**\r
-  * @}\r
-  */\r
-\r
-/** @defgroup SPI_Exported_Functions_Group2 IO operation functions\r
- *  @brief   Data transfers functions\r
- *\r
-@verbatim\r
-  ==============================================================================\r
-                      ##### IO operation functions #####\r
- ===============================================================================\r
- [..]\r
-    This subsection provides a set of functions allowing to manage the SPI\r
-    data transfers.\r
-\r
-    [..] The SPI supports master and slave mode :\r
-\r
-    (#) There are two modes of transfer:\r
-       (++) Blocking mode: The communication is performed in polling mode.\r
-            The HAL status of all data processing is returned by the same function\r
-            after finishing transfer.\r
-       (++) No-Blocking mode: The communication is performed using Interrupts\r
-            or DMA, These APIs return the HAL status.\r
-            The end of the data processing will be indicated through the\r
-            dedicated SPI IRQ when using Interrupt mode or the DMA IRQ when\r
-            using DMA mode.\r
-            The HAL_SPI_TxCpltCallback(), HAL_SPI_RxCpltCallback() and HAL_SPI_TxRxCpltCallback() user callbacks\r
-            will be executed respectively at the end of the transmit or Receive process\r
-            The HAL_SPI_ErrorCallback()user callback will be executed when a communication error is detected\r
-\r
-    (#) APIs provided for these 2 transfer modes (Blocking mode or Non blocking mode using either Interrupt or DMA)\r
-        exist for 1Line (simplex) and 2Lines (full duplex) modes.\r
-\r
-@endverbatim\r
-  * @{\r
-  */\r
-\r
-/**\r
-  * @brief  Transmit an amount of data in blocking mode.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @param  pData pointer to data buffer\r
-  * @param  Size amount of data to be sent\r
-  * @param  Timeout Timeout duration\r
-  * @retval HAL status\r
-  */\r
-HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)\r
-{\r
-  uint32_t tickstart;\r
-  HAL_StatusTypeDef errorcode = HAL_OK;\r
-  uint16_t initial_TxXferCount;\r
-\r
-  /* Check Direction parameter */\r
-  assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction));\r
-\r
-  /* Process Locked */\r
-  __HAL_LOCK(hspi);\r
-\r
-  /* Init tickstart for timeout management*/\r
-  tickstart = HAL_GetTick();\r
-  initial_TxXferCount = Size;\r
-\r
-  if (hspi->State != HAL_SPI_STATE_READY)\r
-  {\r
-    errorcode = HAL_BUSY;\r
-    goto error;\r
-  }\r
-\r
-  if ((pData == NULL) || (Size == 0U))\r
-  {\r
-    errorcode = HAL_ERROR;\r
-    goto error;\r
-  }\r
-\r
-  /* Set the transaction information */\r
-  hspi->State       = HAL_SPI_STATE_BUSY_TX;\r
-  hspi->ErrorCode   = HAL_SPI_ERROR_NONE;\r
-  hspi->pTxBuffPtr  = (uint8_t *)pData;\r
-  hspi->TxXferSize  = Size;\r
-  hspi->TxXferCount = Size;\r
-\r
-  /*Init field not used in handle to zero */\r
-  hspi->pRxBuffPtr  = (uint8_t *)NULL;\r
-  hspi->RxXferSize  = 0U;\r
-  hspi->RxXferCount = 0U;\r
-  hspi->TxISR       = NULL;\r
-  hspi->RxISR       = NULL;\r
-\r
-  /* Configure communication direction : 1Line */\r
-  if (hspi->Init.Direction == SPI_DIRECTION_1LINE)\r
-  {\r
-    SPI_1LINE_TX(hspi);\r
-  }\r
-\r
-#if (USE_SPI_CRC != 0U)\r
-  /* Reset CRC Calculation */\r
-  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)\r
-  {\r
-    SPI_RESET_CRC(hspi);\r
-  }\r
-#endif /* USE_SPI_CRC */\r
-\r
-  /* Check if the SPI is already enabled */\r
-  if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)\r
-  {\r
-    /* Enable SPI peripheral */\r
-    __HAL_SPI_ENABLE(hspi);\r
-  }\r
-\r
-  /* Transmit data in 16 Bit mode */\r
-  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)\r
-  {\r
-    if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U))\r
-    {\r
-      hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);\r
-      hspi->pTxBuffPtr += sizeof(uint16_t);\r
-      hspi->TxXferCount--;\r
-    }\r
-    /* Transmit data in 16 Bit mode */\r
-    while (hspi->TxXferCount > 0U)\r
-    {\r
-      /* Wait until TXE flag is set to send data */\r
-      if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE))\r
-      {\r
-        hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);\r
-        hspi->pTxBuffPtr += sizeof(uint16_t);\r
-        hspi->TxXferCount--;\r
-      }\r
-      else\r
-      {\r
-        /* Timeout management */\r
-        if ((((HAL_GetTick() - tickstart) >=  Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U))\r
-        {\r
-          errorcode = HAL_TIMEOUT;\r
-          goto error;\r
-        }\r
-      }\r
-    }\r
-  }\r
-  /* Transmit data in 8 Bit mode */\r
-  else\r
-  {\r
-    if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U))\r
-    {\r
-      if (hspi->TxXferCount > 1U)\r
-      {\r
-        /* write on the data register in packing mode */\r
-        hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);\r
-        hspi->pTxBuffPtr += sizeof(uint16_t);\r
-        hspi->TxXferCount -= 2U;\r
-      }\r
-      else\r
-      {\r
-        *((__IO uint8_t *)&hspi->Instance->DR) = (*hspi->pTxBuffPtr);\r
-        hspi->pTxBuffPtr ++;\r
-        hspi->TxXferCount--;\r
-      }\r
-    }\r
-    while (hspi->TxXferCount > 0U)\r
-    {\r
-      /* Wait until TXE flag is set to send data */\r
-      if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE))\r
-      {\r
-        if (hspi->TxXferCount > 1U)\r
-        {\r
-          /* write on the data register in packing mode */\r
-          hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);\r
-          hspi->pTxBuffPtr += sizeof(uint16_t);\r
-          hspi->TxXferCount -= 2U;\r
-        }\r
-        else\r
-        {\r
-          *((__IO uint8_t *)&hspi->Instance->DR) = (*hspi->pTxBuffPtr);\r
-          hspi->pTxBuffPtr++;\r
-          hspi->TxXferCount--;\r
-        }\r
-      }\r
-      else\r
-      {\r
-        /* Timeout management */\r
-        if ((((HAL_GetTick() - tickstart) >=  Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U))\r
-        {\r
-          errorcode = HAL_TIMEOUT;\r
-          goto error;\r
-        }\r
-      }\r
-    }\r
-  }\r
-#if (USE_SPI_CRC != 0U)\r
-  /* Enable CRC Transmission */\r
-  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)\r
-  {\r
-    SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);\r
-  }\r
-#endif /* USE_SPI_CRC */\r
-\r
-  /* Check the end of the transaction */\r
-  if (SPI_EndRxTxTransaction(hspi, Timeout, tickstart) != HAL_OK)\r
-  {\r
-    hspi->ErrorCode = HAL_SPI_ERROR_FLAG;\r
-  }\r
-\r
-  /* Clear overrun flag in 2 Lines communication mode because received is not read */\r
-  if (hspi->Init.Direction == SPI_DIRECTION_2LINES)\r
-  {\r
-    __HAL_SPI_CLEAR_OVRFLAG(hspi);\r
-  }\r
-\r
-  if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)\r
-  {\r
-    errorcode = HAL_ERROR;\r
-  }\r
-\r
-error:\r
-  hspi->State = HAL_SPI_STATE_READY;\r
-  /* Process Unlocked */\r
-  __HAL_UNLOCK(hspi);\r
-  return errorcode;\r
-}\r
-\r
-/**\r
-  * @brief  Receive an amount of data in blocking mode.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @param  pData pointer to data buffer\r
-  * @param  Size amount of data to be received\r
-  * @param  Timeout Timeout duration\r
-  * @retval HAL status\r
-  */\r
-HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)\r
-{\r
-  uint32_t tickstart;\r
-  HAL_StatusTypeDef errorcode = HAL_OK;\r
-\r
-  if ((hspi->Init.Mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES))\r
-  {\r
-    hspi->State = HAL_SPI_STATE_BUSY_RX;\r
-    /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */\r
-    return HAL_SPI_TransmitReceive(hspi, pData, pData, Size, Timeout);\r
-  }\r
-\r
-  /* Process Locked */\r
-  __HAL_LOCK(hspi);\r
-\r
-  /* Init tickstart for timeout management*/\r
-  tickstart = HAL_GetTick();\r
-\r
-  if (hspi->State != HAL_SPI_STATE_READY)\r
-  {\r
-    errorcode = HAL_BUSY;\r
-    goto error;\r
-  }\r
-\r
-  if ((pData == NULL) || (Size == 0U))\r
-  {\r
-    errorcode = HAL_ERROR;\r
-    goto error;\r
-  }\r
-\r
-  /* Set the transaction information */\r
-  hspi->State       = HAL_SPI_STATE_BUSY_RX;\r
-  hspi->ErrorCode   = HAL_SPI_ERROR_NONE;\r
-  hspi->pRxBuffPtr  = (uint8_t *)pData;\r
-  hspi->RxXferSize  = Size;\r
-  hspi->RxXferCount = Size;\r
-\r
-  /*Init field not used in handle to zero */\r
-  hspi->pTxBuffPtr  = (uint8_t *)NULL;\r
-  hspi->TxXferSize  = 0U;\r
-  hspi->TxXferCount = 0U;\r
-  hspi->RxISR       = NULL;\r
-  hspi->TxISR       = NULL;\r
-\r
-#if (USE_SPI_CRC != 0U)\r
-  /* Reset CRC Calculation */\r
-  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)\r
-  {\r
-    SPI_RESET_CRC(hspi);\r
-    /* this is done to handle the CRCNEXT before the latest data */\r
-    hspi->RxXferCount--;\r
-  }\r
-#endif /* USE_SPI_CRC */\r
-\r
-  /* Set the Rx Fifo threshold */\r
-  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)\r
-  {\r
-    /* Set RX Fifo threshold according the reception data length: 16bit */\r
-    CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);\r
-  }\r
-  else\r
-  {\r
-    /* Set RX Fifo threshold according the reception data length: 8bit */\r
-    SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);\r
-  }\r
-\r
-  /* Configure communication direction: 1Line */\r
-  if (hspi->Init.Direction == SPI_DIRECTION_1LINE)\r
-  {\r
-    SPI_1LINE_RX(hspi);\r
-  }\r
-\r
-  /* Check if the SPI is already enabled */\r
-  if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)\r
-  {\r
-    /* Enable SPI peripheral */\r
-    __HAL_SPI_ENABLE(hspi);\r
-  }\r
-\r
-  /* Receive data in 8 Bit mode */\r
-  if (hspi->Init.DataSize <= SPI_DATASIZE_8BIT)\r
-  {\r
-    /* Transfer loop */\r
-    while (hspi->RxXferCount > 0U)\r
-    {\r
-      /* Check the RXNE flag */\r
-      if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE))\r
-      {\r
-        /* read the received data */\r
-        (* (uint8_t *)hspi->pRxBuffPtr) = *(__IO uint8_t *)&hspi->Instance->DR;\r
-        hspi->pRxBuffPtr += sizeof(uint8_t);\r
-        hspi->RxXferCount--;\r
-      }\r
-      else\r
-      {\r
-        /* Timeout management */\r
-        if ((((HAL_GetTick() - tickstart) >=  Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U))\r
-        {\r
-          errorcode = HAL_TIMEOUT;\r
-          goto error;\r
-        }\r
-      }\r
-    }\r
-  }\r
-  else\r
-  {\r
-    /* Transfer loop */\r
-    while (hspi->RxXferCount > 0U)\r
-    {\r
-      /* Check the RXNE flag */\r
-      if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE))\r
-      {\r
-        *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR;\r
-        hspi->pRxBuffPtr += sizeof(uint16_t);\r
-        hspi->RxXferCount--;\r
-      }\r
-      else\r
-      {\r
-        /* Timeout management */\r
-        if ((((HAL_GetTick() - tickstart) >=  Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U))\r
-        {\r
-          errorcode = HAL_TIMEOUT;\r
-          goto error;\r
-        }\r
-      }\r
-    }\r
-  }\r
-\r
-#if (USE_SPI_CRC != 0U)\r
-  /* Handle the CRC Transmission */\r
-  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)\r
-  {\r
-    /* freeze the CRC before the latest data */\r
-    SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);\r
-\r
-    /* Read the latest data */\r
-    if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK)\r
-    {\r
-      /* the latest data has not been received */\r
-      errorcode = HAL_TIMEOUT;\r
-      goto error;\r
-    }\r
-\r
-    /* Receive last data in 16 Bit mode */\r
-    if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)\r
-    {\r
-      *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR;\r
-    }\r
-    /* Receive last data in 8 Bit mode */\r
-    else\r
-    {\r
-      (*(uint8_t *)hspi->pRxBuffPtr) = *(__IO uint8_t *)&hspi->Instance->DR;\r
-    }\r
-\r
-    /* Wait the CRC data */\r
-    if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK)\r
-    {\r
-      SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);\r
-      errorcode = HAL_TIMEOUT;\r
-      goto error;\r
-    }\r
-\r
-    /* Read CRC to Flush DR and RXNE flag */\r
-    if (hspi->Init.DataSize == SPI_DATASIZE_16BIT)\r
-    {\r
-      /* Read 16bit CRC */\r
-      READ_REG(hspi->Instance->DR);\r
-    }\r
-    else\r
-    {\r
-      /* Read 8bit CRC */\r
-      READ_REG(*(__IO uint8_t *)&hspi->Instance->DR);\r
-\r
-      if ((hspi->Init.DataSize == SPI_DATASIZE_8BIT) && (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT))\r
-      {\r
-        if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK)\r
-        {\r
-          /* Error on the CRC reception */\r
-          SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);\r
-          errorcode = HAL_TIMEOUT;\r
-          goto error;\r
-        }\r
-        /* Read 8bit CRC again in case of 16bit CRC in 8bit Data mode */\r
-        READ_REG(*(__IO uint8_t *)&hspi->Instance->DR);\r
-      }\r
-    }\r
-  }\r
-#endif /* USE_SPI_CRC */\r
-\r
-  /* Check the end of the transaction */\r
-  if (SPI_EndRxTransaction(hspi, Timeout, tickstart) != HAL_OK)\r
-  {\r
-    hspi->ErrorCode = HAL_SPI_ERROR_FLAG;\r
-  }\r
-\r
-#if (USE_SPI_CRC != 0U)\r
-  /* Check if CRC error occurred */\r
-  if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR))\r
-  {\r
-    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);\r
-    __HAL_SPI_CLEAR_CRCERRFLAG(hspi);\r
-  }\r
-#endif /* USE_SPI_CRC */\r
-\r
-  if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)\r
-  {\r
-    errorcode = HAL_ERROR;\r
-  }\r
-\r
-error :\r
-  hspi->State = HAL_SPI_STATE_READY;\r
-  __HAL_UNLOCK(hspi);\r
-  return errorcode;\r
-}\r
-\r
-/**\r
-  * @brief  Transmit and Receive an amount of data in blocking mode.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @param  pTxData pointer to transmission data buffer\r
-  * @param  pRxData pointer to reception data buffer\r
-  * @param  Size amount of data to be sent and received\r
-  * @param  Timeout Timeout duration\r
-  * @retval HAL status\r
-  */\r
-HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size,\r
-                                          uint32_t Timeout)\r
-{\r
-  uint16_t             initial_TxXferCount;\r
-  uint16_t             initial_RxXferCount;\r
-  uint32_t             tmp_mode;\r
-  HAL_SPI_StateTypeDef tmp_state;\r
-  uint32_t             tickstart;\r
-#if (USE_SPI_CRC != 0U)\r
-  uint32_t             spi_cr1;\r
-  uint32_t             spi_cr2;\r
-#endif /* USE_SPI_CRC */\r
-\r
-  /* Variable used to alternate Rx and Tx during transfer */\r
-  uint32_t             txallowed = 1U;\r
-  HAL_StatusTypeDef    errorcode = HAL_OK;\r
-\r
-  /* Check Direction parameter */\r
-  assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));\r
-\r
-  /* Process Locked */\r
-  __HAL_LOCK(hspi);\r
-\r
-  /* Init tickstart for timeout management*/\r
-  tickstart = HAL_GetTick();\r
-\r
-  /* Init temporary variables */\r
-  tmp_state           = hspi->State;\r
-  tmp_mode            = hspi->Init.Mode;\r
-  initial_TxXferCount = Size;\r
-  initial_RxXferCount = Size;\r
-#if (USE_SPI_CRC != 0U)\r
-  spi_cr1             = READ_REG(hspi->Instance->CR1);\r
-  spi_cr2             = READ_REG(hspi->Instance->CR2);\r
-#endif /* USE_SPI_CRC */\r
-\r
-  if (!((tmp_state == HAL_SPI_STATE_READY) || \\r
-        ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_state == HAL_SPI_STATE_BUSY_RX))))\r
-  {\r
-    errorcode = HAL_BUSY;\r
-    goto error;\r
-  }\r
-\r
-  if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U))\r
-  {\r
-    errorcode = HAL_ERROR;\r
-    goto error;\r
-  }\r
-\r
-  /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */\r
-  if (hspi->State != HAL_SPI_STATE_BUSY_RX)\r
-  {\r
-    hspi->State = HAL_SPI_STATE_BUSY_TX_RX;\r
-  }\r
-\r
-  /* Set the transaction information */\r
-  hspi->ErrorCode   = HAL_SPI_ERROR_NONE;\r
-  hspi->pRxBuffPtr  = (uint8_t *)pRxData;\r
-  hspi->RxXferCount = Size;\r
-  hspi->RxXferSize  = Size;\r
-  hspi->pTxBuffPtr  = (uint8_t *)pTxData;\r
-  hspi->TxXferCount = Size;\r
-  hspi->TxXferSize  = Size;\r
-\r
-  /*Init field not used in handle to zero */\r
-  hspi->RxISR       = NULL;\r
-  hspi->TxISR       = NULL;\r
-\r
-#if (USE_SPI_CRC != 0U)\r
-  /* Reset CRC Calculation */\r
-  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)\r
-  {\r
-    SPI_RESET_CRC(hspi);\r
-  }\r
-#endif /* USE_SPI_CRC */\r
-\r
-  /* Set the Rx Fifo threshold */\r
-  if ((hspi->Init.DataSize > SPI_DATASIZE_8BIT) || (initial_RxXferCount > 1U))\r
-  {\r
-    /* Set fiforxthreshold according the reception data length: 16bit */\r
-    CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);\r
-  }\r
-  else\r
-  {\r
-    /* Set fiforxthreshold according the reception data length: 8bit */\r
-    SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);\r
-  }\r
-\r
-  /* Check if the SPI is already enabled */\r
-  if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)\r
-  {\r
-    /* Enable SPI peripheral */\r
-    __HAL_SPI_ENABLE(hspi);\r
-  }\r
-\r
-  /* Transmit and Receive data in 16 Bit mode */\r
-  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)\r
-  {\r
-    if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U))\r
-    {\r
-      hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);\r
-      hspi->pTxBuffPtr += sizeof(uint16_t);\r
-      hspi->TxXferCount--;\r
-    }\r
-    while ((hspi->TxXferCount > 0U) || (hspi->RxXferCount > 0U))\r
-    {\r
-      /* Check TXE flag */\r
-      if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) && (hspi->TxXferCount > 0U) && (txallowed == 1U))\r
-      {\r
-        hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);\r
-        hspi->pTxBuffPtr += sizeof(uint16_t);\r
-        hspi->TxXferCount--;\r
-        /* Next Data is a reception (Rx). Tx not allowed */\r
-        txallowed = 0U;\r
-\r
-#if (USE_SPI_CRC != 0U)\r
-        /* Enable CRC Transmission */\r
-        if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE))\r
-        {\r
-          /* Set NSS Soft to received correctly the CRC on slave mode with NSS pulse activated */\r
-          if ((READ_BIT(spi_cr1, SPI_CR1_MSTR) == 0U) && (READ_BIT(spi_cr2, SPI_CR2_NSSP) == SPI_CR2_NSSP))\r
-          {\r
-            SET_BIT(hspi->Instance->CR1, SPI_CR1_SSM);\r
-          }\r
-          SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);\r
-        }\r
-#endif /* USE_SPI_CRC */\r
-      }\r
-\r
-      /* Check RXNE flag */\r
-      if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) && (hspi->RxXferCount > 0U))\r
-      {\r
-        *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR;\r
-        hspi->pRxBuffPtr += sizeof(uint16_t);\r
-        hspi->RxXferCount--;\r
-        /* Next Data is a Transmission (Tx). Tx is allowed */\r
-        txallowed = 1U;\r
-      }\r
-      if (((HAL_GetTick() - tickstart) >=  Timeout) && (Timeout != HAL_MAX_DELAY))\r
-      {\r
-        errorcode = HAL_TIMEOUT;\r
-        goto error;\r
-      }\r
-    }\r
-  }\r
-  /* Transmit and Receive data in 8 Bit mode */\r
-  else\r
-  {\r
-    if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U))\r
-    {\r
-      if (hspi->TxXferCount > 1U)\r
-      {\r
-        hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);\r
-        hspi->pTxBuffPtr += sizeof(uint16_t);\r
-        hspi->TxXferCount -= 2U;\r
-      }\r
-      else\r
-      {\r
-        *(__IO uint8_t *)&hspi->Instance->DR = (*hspi->pTxBuffPtr);\r
-        hspi->pTxBuffPtr++;\r
-        hspi->TxXferCount--;\r
-      }\r
-    }\r
-    while ((hspi->TxXferCount > 0U) || (hspi->RxXferCount > 0U))\r
-    {\r
-      /* Check TXE flag */\r
-      if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) && (hspi->TxXferCount > 0U) && (txallowed == 1U))\r
-      {\r
-        if (hspi->TxXferCount > 1U)\r
-        {\r
-          hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);\r
-          hspi->pTxBuffPtr += sizeof(uint16_t);\r
-          hspi->TxXferCount -= 2U;\r
-        }\r
-        else\r
-        {\r
-          *(__IO uint8_t *)&hspi->Instance->DR = (*hspi->pTxBuffPtr);\r
-          hspi->pTxBuffPtr++;\r
-          hspi->TxXferCount--;\r
-        }\r
-        /* Next Data is a reception (Rx). Tx not allowed */\r
-        txallowed = 0U;\r
-\r
-#if (USE_SPI_CRC != 0U)\r
-        /* Enable CRC Transmission */\r
-        if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE))\r
-        {\r
-          /* Set NSS Soft to received correctly the CRC on slave mode with NSS pulse activated */\r
-          if ((READ_BIT(spi_cr1, SPI_CR1_MSTR) == 0U) && (READ_BIT(spi_cr2, SPI_CR2_NSSP) == SPI_CR2_NSSP))\r
-          {\r
-            SET_BIT(hspi->Instance->CR1, SPI_CR1_SSM);\r
-          }\r
-          SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);\r
-        }\r
-#endif /* USE_SPI_CRC */\r
-      }\r
-\r
-      /* Wait until RXNE flag is reset */\r
-      if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) && (hspi->RxXferCount > 0U))\r
-      {\r
-        if (hspi->RxXferCount > 1U)\r
-        {\r
-          *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR;\r
-          hspi->pRxBuffPtr += sizeof(uint16_t);\r
-          hspi->RxXferCount -= 2U;\r
-          if (hspi->RxXferCount <= 1U)\r
-          {\r
-            /* Set RX Fifo threshold before to switch on 8 bit data size */\r
-            SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);\r
-          }\r
-        }\r
-        else\r
-        {\r
-          (*(uint8_t *)hspi->pRxBuffPtr) = *(__IO uint8_t *)&hspi->Instance->DR;\r
-          hspi->pRxBuffPtr++;\r
-          hspi->RxXferCount--;\r
-        }\r
-        /* Next Data is a Transmission (Tx). Tx is allowed */\r
-        txallowed = 1U;\r
-      }\r
-      if ((((HAL_GetTick() - tickstart) >=  Timeout) && ((Timeout != HAL_MAX_DELAY))) || (Timeout == 0U))\r
-      {\r
-        errorcode = HAL_TIMEOUT;\r
-        goto error;\r
-      }\r
-    }\r
-  }\r
-\r
-#if (USE_SPI_CRC != 0U)\r
-  /* Read CRC from DR to close CRC calculation process */\r
-  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)\r
-  {\r
-    /* Wait until TXE flag */\r
-    if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK)\r
-    {\r
-      /* Error on the CRC reception */\r
-      SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);\r
-      errorcode = HAL_TIMEOUT;\r
-      goto error;\r
-    }\r
-    /* Read CRC */\r
-    if (hspi->Init.DataSize == SPI_DATASIZE_16BIT)\r
-    {\r
-      /* Read 16bit CRC */\r
-      READ_REG(hspi->Instance->DR);\r
-    }\r
-    else\r
-    {\r
-      /* Read 8bit CRC */\r
-      READ_REG(*(__IO uint8_t *)&hspi->Instance->DR);\r
-\r
-      if (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT)\r
-      {\r
-        if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK)\r
-        {\r
-          /* Error on the CRC reception */\r
-          SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);\r
-          errorcode = HAL_TIMEOUT;\r
-          goto error;\r
-        }\r
-        /* Read 8bit CRC again in case of 16bit CRC in 8bit Data mode */\r
-        READ_REG(*(__IO uint8_t *)&hspi->Instance->DR);\r
-      }\r
-    }\r
-  }\r
-\r
-  /* Check if CRC error occurred */\r
-  if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR))\r
-  {\r
-    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);\r
-    /* Clear CRC Flag */\r
-    __HAL_SPI_CLEAR_CRCERRFLAG(hspi);\r
-\r
-    errorcode = HAL_ERROR;\r
-  }\r
-#endif /* USE_SPI_CRC */\r
-\r
-  /* Check the end of the transaction */\r
-  if (SPI_EndRxTxTransaction(hspi, Timeout, tickstart) != HAL_OK)\r
-  {\r
-    errorcode = HAL_ERROR;\r
-    hspi->ErrorCode = HAL_SPI_ERROR_FLAG;\r
-  }\r
-\r
-error :\r
-  hspi->State = HAL_SPI_STATE_READY;\r
-  __HAL_UNLOCK(hspi);\r
-  return errorcode;\r
-}\r
-\r
-/**\r
-  * @brief  Transmit an amount of data in non-blocking mode with Interrupt.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @param  pData pointer to data buffer\r
-  * @param  Size amount of data to be sent\r
-  * @retval HAL status\r
-  */\r
-HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)\r
-{\r
-  HAL_StatusTypeDef errorcode = HAL_OK;\r
-\r
-  /* Check Direction parameter */\r
-  assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction));\r
-\r
-  /* Process Locked */\r
-  __HAL_LOCK(hspi);\r
-\r
-  if ((pData == NULL) || (Size == 0U))\r
-  {\r
-    errorcode = HAL_ERROR;\r
-    goto error;\r
-  }\r
-\r
-  if (hspi->State != HAL_SPI_STATE_READY)\r
-  {\r
-    errorcode = HAL_BUSY;\r
-    goto error;\r
-  }\r
-\r
-  /* Set the transaction information */\r
-  hspi->State       = HAL_SPI_STATE_BUSY_TX;\r
-  hspi->ErrorCode   = HAL_SPI_ERROR_NONE;\r
-  hspi->pTxBuffPtr  = (uint8_t *)pData;\r
-  hspi->TxXferSize  = Size;\r
-  hspi->TxXferCount = Size;\r
-\r
-  /* Init field not used in handle to zero */\r
-  hspi->pRxBuffPtr  = (uint8_t *)NULL;\r
-  hspi->RxXferSize  = 0U;\r
-  hspi->RxXferCount = 0U;\r
-  hspi->RxISR       = NULL;\r
-\r
-  /* Set the function for IT treatment */\r
-  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)\r
-  {\r
-    hspi->TxISR = SPI_TxISR_16BIT;\r
-  }\r
-  else\r
-  {\r
-    hspi->TxISR = SPI_TxISR_8BIT;\r
-  }\r
-\r
-  /* Configure communication direction : 1Line */\r
-  if (hspi->Init.Direction == SPI_DIRECTION_1LINE)\r
-  {\r
-    SPI_1LINE_TX(hspi);\r
-  }\r
-\r
-#if (USE_SPI_CRC != 0U)\r
-  /* Reset CRC Calculation */\r
-  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)\r
-  {\r
-    SPI_RESET_CRC(hspi);\r
-  }\r
-#endif /* USE_SPI_CRC */\r
-\r
-  /* Enable TXE and ERR interrupt */\r
-  __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_ERR));\r
-\r
-\r
-  /* Check if the SPI is already enabled */\r
-  if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)\r
-  {\r
-    /* Enable SPI peripheral */\r
-    __HAL_SPI_ENABLE(hspi);\r
-  }\r
-\r
-error :\r
-  __HAL_UNLOCK(hspi);\r
-  return errorcode;\r
-}\r
-\r
-/**\r
-  * @brief  Receive an amount of data in non-blocking mode with Interrupt.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @param  pData pointer to data buffer\r
-  * @param  Size amount of data to be sent\r
-  * @retval HAL status\r
-  */\r
-HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)\r
-{\r
-  HAL_StatusTypeDef errorcode = HAL_OK;\r
-\r
-  if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER))\r
-  {\r
-    hspi->State = HAL_SPI_STATE_BUSY_RX;\r
-    /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */\r
-    return HAL_SPI_TransmitReceive_IT(hspi, pData, pData, Size);\r
-  }\r
-\r
-  /* Process Locked */\r
-  __HAL_LOCK(hspi);\r
-\r
-  if (hspi->State != HAL_SPI_STATE_READY)\r
-  {\r
-    errorcode = HAL_BUSY;\r
-    goto error;\r
-  }\r
-\r
-  if ((pData == NULL) || (Size == 0U))\r
-  {\r
-    errorcode = HAL_ERROR;\r
-    goto error;\r
-  }\r
-\r
-  /* Set the transaction information */\r
-  hspi->State       = HAL_SPI_STATE_BUSY_RX;\r
-  hspi->ErrorCode   = HAL_SPI_ERROR_NONE;\r
-  hspi->pRxBuffPtr  = (uint8_t *)pData;\r
-  hspi->RxXferSize  = Size;\r
-  hspi->RxXferCount = Size;\r
-\r
-  /* Init field not used in handle to zero */\r
-  hspi->pTxBuffPtr  = (uint8_t *)NULL;\r
-  hspi->TxXferSize  = 0U;\r
-  hspi->TxXferCount = 0U;\r
-  hspi->TxISR       = NULL;\r
-\r
-  /* Check the data size to adapt Rx threshold and the set the function for IT treatment */\r
-  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)\r
-  {\r
-    /* Set RX Fifo threshold according the reception data length: 16 bit */\r
-    CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);\r
-    hspi->RxISR = SPI_RxISR_16BIT;\r
-  }\r
-  else\r
-  {\r
-    /* Set RX Fifo threshold according the reception data length: 8 bit */\r
-    SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);\r
-    hspi->RxISR = SPI_RxISR_8BIT;\r
-  }\r
-\r
-  /* Configure communication direction : 1Line */\r
-  if (hspi->Init.Direction == SPI_DIRECTION_1LINE)\r
-  {\r
-    SPI_1LINE_RX(hspi);\r
-  }\r
-\r
-#if (USE_SPI_CRC != 0U)\r
-  /* Reset CRC Calculation */\r
-  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)\r
-  {\r
-    hspi->CRCSize = 1U;\r
-    if ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT))\r
-    {\r
-      hspi->CRCSize = 2U;\r
-    }\r
-    SPI_RESET_CRC(hspi);\r
-  }\r
-  else\r
-  {\r
-    hspi->CRCSize = 0U;\r
-  }\r
-#endif /* USE_SPI_CRC */\r
-\r
-  /* Enable TXE and ERR interrupt */\r
-  __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR));\r
-\r
-  /* Note : The SPI must be enabled after unlocking current process\r
-            to avoid the risk of SPI interrupt handle execution before current\r
-            process unlock */\r
-\r
-  /* Check if the SPI is already enabled */\r
-  if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)\r
-  {\r
-    /* Enable SPI peripheral */\r
-    __HAL_SPI_ENABLE(hspi);\r
-  }\r
-\r
-error :\r
-  /* Process Unlocked */\r
-  __HAL_UNLOCK(hspi);\r
-  return errorcode;\r
-}\r
-\r
-/**\r
-  * @brief  Transmit and Receive an amount of data in non-blocking mode with Interrupt.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @param  pTxData pointer to transmission data buffer\r
-  * @param  pRxData pointer to reception data buffer\r
-  * @param  Size amount of data to be sent and received\r
-  * @retval HAL status\r
-  */\r
-HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size)\r
-{\r
-  uint32_t             tmp_mode;\r
-  HAL_SPI_StateTypeDef tmp_state;\r
-  HAL_StatusTypeDef    errorcode = HAL_OK;\r
-\r
-  /* Check Direction parameter */\r
-  assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));\r
-\r
-  /* Process locked */\r
-  __HAL_LOCK(hspi);\r
-\r
-  /* Init temporary variables */\r
-  tmp_state           = hspi->State;\r
-  tmp_mode            = hspi->Init.Mode;\r
-\r
-  if (!((tmp_state == HAL_SPI_STATE_READY) || \\r
-        ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_state == HAL_SPI_STATE_BUSY_RX))))\r
-  {\r
-    errorcode = HAL_BUSY;\r
-    goto error;\r
-  }\r
-\r
-  if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U))\r
-  {\r
-    errorcode = HAL_ERROR;\r
-    goto error;\r
-  }\r
-\r
-  /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */\r
-  if (hspi->State != HAL_SPI_STATE_BUSY_RX)\r
-  {\r
-    hspi->State = HAL_SPI_STATE_BUSY_TX_RX;\r
-  }\r
-\r
-  /* Set the transaction information */\r
-  hspi->ErrorCode   = HAL_SPI_ERROR_NONE;\r
-  hspi->pTxBuffPtr  = (uint8_t *)pTxData;\r
-  hspi->TxXferSize  = Size;\r
-  hspi->TxXferCount = Size;\r
-  hspi->pRxBuffPtr  = (uint8_t *)pRxData;\r
-  hspi->RxXferSize  = Size;\r
-  hspi->RxXferCount = Size;\r
-\r
-  /* Set the function for IT treatment */\r
-  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)\r
-  {\r
-    hspi->RxISR     = SPI_2linesRxISR_16BIT;\r
-    hspi->TxISR     = SPI_2linesTxISR_16BIT;\r
-  }\r
-  else\r
-  {\r
-    hspi->RxISR     = SPI_2linesRxISR_8BIT;\r
-    hspi->TxISR     = SPI_2linesTxISR_8BIT;\r
-  }\r
-\r
-#if (USE_SPI_CRC != 0U)\r
-  /* Reset CRC Calculation */\r
-  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)\r
-  {\r
-    hspi->CRCSize = 1U;\r
-    if ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT))\r
-    {\r
-      hspi->CRCSize = 2U;\r
-    }\r
-    SPI_RESET_CRC(hspi);\r
-  }\r
-  else\r
-  {\r
-    hspi->CRCSize = 0U;\r
-  }\r
-#endif /* USE_SPI_CRC */\r
-\r
-  /* Check if packing mode is enabled and if there is more than 2 data to receive */\r
-  if ((hspi->Init.DataSize > SPI_DATASIZE_8BIT) || (Size >= 2U))\r
-  {\r
-    /* Set RX Fifo threshold according the reception data length: 16 bit */\r
-    CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);\r
-  }\r
-  else\r
-  {\r
-    /* Set RX Fifo threshold according the reception data length: 8 bit */\r
-    SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);\r
-  }\r
-\r
-  /* Enable TXE, RXNE and ERR interrupt */\r
-  __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR));\r
-\r
-  /* Check if the SPI is already enabled */\r
-  if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)\r
-  {\r
-    /* Enable SPI peripheral */\r
-    __HAL_SPI_ENABLE(hspi);\r
-  }\r
-\r
-error :\r
-  /* Process Unlocked */\r
-  __HAL_UNLOCK(hspi);\r
-  return errorcode;\r
-}\r
-\r
-/**\r
-  * @brief  Transmit an amount of data in non-blocking mode with DMA.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @param  pData pointer to data buffer\r
-  * @param  Size amount of data to be sent\r
-  * @retval HAL status\r
-  */\r
-HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)\r
-{\r
-  HAL_StatusTypeDef errorcode = HAL_OK;\r
-\r
-  /* Check tx dma handle */\r
-  assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx));\r
-\r
-  /* Check Direction parameter */\r
-  assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction));\r
-\r
-  /* Process Locked */\r
-  __HAL_LOCK(hspi);\r
-\r
-  if (hspi->State != HAL_SPI_STATE_READY)\r
-  {\r
-    errorcode = HAL_BUSY;\r
-    goto error;\r
-  }\r
-\r
-  if ((pData == NULL) || (Size == 0U))\r
-  {\r
-    errorcode = HAL_ERROR;\r
-    goto error;\r
-  }\r
-\r
-  /* Set the transaction information */\r
-  hspi->State       = HAL_SPI_STATE_BUSY_TX;\r
-  hspi->ErrorCode   = HAL_SPI_ERROR_NONE;\r
-  hspi->pTxBuffPtr  = (uint8_t *)pData;\r
-  hspi->TxXferSize  = Size;\r
-  hspi->TxXferCount = Size;\r
-\r
-  /* Init field not used in handle to zero */\r
-  hspi->pRxBuffPtr  = (uint8_t *)NULL;\r
-  hspi->TxISR       = NULL;\r
-  hspi->RxISR       = NULL;\r
-  hspi->RxXferSize  = 0U;\r
-  hspi->RxXferCount = 0U;\r
-\r
-  /* Configure communication direction : 1Line */\r
-  if (hspi->Init.Direction == SPI_DIRECTION_1LINE)\r
-  {\r
-    SPI_1LINE_TX(hspi);\r
-  }\r
-\r
-#if (USE_SPI_CRC != 0U)\r
-  /* Reset CRC Calculation */\r
-  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)\r
-  {\r
-    SPI_RESET_CRC(hspi);\r
-  }\r
-#endif /* USE_SPI_CRC */\r
-\r
-  /* Set the SPI TxDMA Half transfer complete callback */\r
-  hspi->hdmatx->XferHalfCpltCallback = SPI_DMAHalfTransmitCplt;\r
-\r
-  /* Set the SPI TxDMA transfer complete callback */\r
-  hspi->hdmatx->XferCpltCallback = SPI_DMATransmitCplt;\r
-\r
-  /* Set the DMA error callback */\r
-  hspi->hdmatx->XferErrorCallback = SPI_DMAError;\r
-\r
-  /* Set the DMA AbortCpltCallback */\r
-  hspi->hdmatx->XferAbortCallback = NULL;\r
-\r
-  CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX);\r
-  /* Packing mode is enabled only if the DMA setting is HALWORD */\r
-  if ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (hspi->hdmatx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD))\r
-  {\r
-    /* Check the even/odd of the data size + crc if enabled */\r
-    if ((hspi->TxXferCount & 0x1U) == 0U)\r
-    {\r
-      CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX);\r
-      hspi->TxXferCount = (hspi->TxXferCount >> 1U);\r
-    }\r
-    else\r
-    {\r
-      SET_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX);\r
-      hspi->TxXferCount = (hspi->TxXferCount >> 1U) + 1U;\r
-    }\r
-  }\r
-\r
-  /* Enable the Tx DMA Stream/Channel */\r
-  if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instance->DR, hspi->TxXferCount))\r
-  {\r
-    /* Update SPI error code */\r
-    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA);\r
-    errorcode = HAL_ERROR;\r
-\r
-    hspi->State = HAL_SPI_STATE_READY;\r
-    goto error;\r
-  }\r
-\r
-  /* Check if the SPI is already enabled */\r
-  if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)\r
-  {\r
-    /* Enable SPI peripheral */\r
-    __HAL_SPI_ENABLE(hspi);\r
-  }\r
-\r
-  /* Enable the SPI Error Interrupt Bit */\r
-  __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR));\r
-\r
-  /* Enable Tx DMA Request */\r
-  SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN);\r
-\r
-error :\r
-  /* Process Unlocked */\r
-  __HAL_UNLOCK(hspi);\r
-  return errorcode;\r
-}\r
-\r
-/**\r
-  * @brief  Receive an amount of data in non-blocking mode with DMA.\r
-  * @note   In case of MASTER mode and SPI_DIRECTION_2LINES direction, hdmatx shall be defined.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @param  pData pointer to data buffer\r
-  * @note   When the CRC feature is enabled the pData Length must be Size + 1.\r
-  * @param  Size amount of data to be sent\r
-  * @retval HAL status\r
-  */\r
-HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)\r
-{\r
-  HAL_StatusTypeDef errorcode = HAL_OK;\r
-\r
-  /* Check rx dma handle */\r
-  assert_param(IS_SPI_DMA_HANDLE(hspi->hdmarx));\r
-\r
-  if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER))\r
-  {\r
-    hspi->State = HAL_SPI_STATE_BUSY_RX;\r
-\r
-    /* Check tx dma handle */\r
-    assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx));\r
-\r
-    /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */\r
-    return HAL_SPI_TransmitReceive_DMA(hspi, pData, pData, Size);\r
-  }\r
-\r
-  /* Process Locked */\r
-  __HAL_LOCK(hspi);\r
-\r
-  if (hspi->State != HAL_SPI_STATE_READY)\r
-  {\r
-    errorcode = HAL_BUSY;\r
-    goto error;\r
-  }\r
-\r
-  if ((pData == NULL) || (Size == 0U))\r
-  {\r
-    errorcode = HAL_ERROR;\r
-    goto error;\r
-  }\r
-\r
-  /* Set the transaction information */\r
-  hspi->State       = HAL_SPI_STATE_BUSY_RX;\r
-  hspi->ErrorCode   = HAL_SPI_ERROR_NONE;\r
-  hspi->pRxBuffPtr  = (uint8_t *)pData;\r
-  hspi->RxXferSize  = Size;\r
-  hspi->RxXferCount = Size;\r
-\r
-  /*Init field not used in handle to zero */\r
-  hspi->RxISR       = NULL;\r
-  hspi->TxISR       = NULL;\r
-  hspi->TxXferSize  = 0U;\r
-  hspi->TxXferCount = 0U;\r
-\r
-  /* Configure communication direction : 1Line */\r
-  if (hspi->Init.Direction == SPI_DIRECTION_1LINE)\r
-  {\r
-    SPI_1LINE_RX(hspi);\r
-  }\r
-\r
-#if (USE_SPI_CRC != 0U)\r
-  /* Reset CRC Calculation */\r
-  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)\r
-  {\r
-    SPI_RESET_CRC(hspi);\r
-  }\r
-#endif /* USE_SPI_CRC */\r
-\r
-\r
-  CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX);\r
-  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)\r
-  {\r
-    /* Set RX Fifo threshold according the reception data length: 16bit */\r
-    CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);\r
-  }\r
-  else\r
-  {\r
-    /* Set RX Fifo threshold according the reception data length: 8bit */\r
-    SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);\r
-\r
-    if (hspi->hdmarx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD)\r
-    {\r
-      /* Set RX Fifo threshold according the reception data length: 16bit */\r
-      CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);\r
-\r
-      if ((hspi->RxXferCount & 0x1U) == 0x0U)\r
-      {\r
-        CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX);\r
-        hspi->RxXferCount = hspi->RxXferCount >> 1U;\r
-      }\r
-      else\r
-      {\r
-        SET_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX);\r
-        hspi->RxXferCount = (hspi->RxXferCount >> 1U) + 1U;\r
-      }\r
-    }\r
-  }\r
-\r
-  /* Set the SPI RxDMA Half transfer complete callback */\r
-  hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfReceiveCplt;\r
-\r
-  /* Set the SPI Rx DMA transfer complete callback */\r
-  hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt;\r
-\r
-  /* Set the DMA error callback */\r
-  hspi->hdmarx->XferErrorCallback = SPI_DMAError;\r
-\r
-  /* Set the DMA AbortCpltCallback */\r
-  hspi->hdmarx->XferAbortCallback = NULL;\r
-\r
-  /* Enable the Rx DMA Stream/Channel  */\r
-  if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBuffPtr, hspi->RxXferCount))\r
-  {\r
-    /* Update SPI error code */\r
-    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA);\r
-    errorcode = HAL_ERROR;\r
-\r
-    hspi->State = HAL_SPI_STATE_READY;\r
-    goto error;\r
-  }\r
-\r
-  /* Check if the SPI is already enabled */\r
-  if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)\r
-  {\r
-    /* Enable SPI peripheral */\r
-    __HAL_SPI_ENABLE(hspi);\r
-  }\r
-\r
-  /* Enable the SPI Error Interrupt Bit */\r
-  __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR));\r
-\r
-  /* Enable Rx DMA Request */\r
-  SET_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN);\r
-\r
-error:\r
-  /* Process Unlocked */\r
-  __HAL_UNLOCK(hspi);\r
-  return errorcode;\r
-}\r
-\r
-/**\r
-  * @brief  Transmit and Receive an amount of data in non-blocking mode with DMA.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @param  pTxData pointer to transmission data buffer\r
-  * @param  pRxData pointer to reception data buffer\r
-  * @note   When the CRC feature is enabled the pRxData Length must be Size + 1\r
-  * @param  Size amount of data to be sent\r
-  * @retval HAL status\r
-  */\r
-HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData,\r
-                                              uint16_t Size)\r
-{\r
-  uint32_t             tmp_mode;\r
-  HAL_SPI_StateTypeDef tmp_state;\r
-  HAL_StatusTypeDef errorcode = HAL_OK;\r
-\r
-  /* Check rx & tx dma handles */\r
-  assert_param(IS_SPI_DMA_HANDLE(hspi->hdmarx));\r
-  assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx));\r
-\r
-  /* Check Direction parameter */\r
-  assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));\r
-\r
-  /* Process locked */\r
-  __HAL_LOCK(hspi);\r
-\r
-  /* Init temporary variables */\r
-  tmp_state           = hspi->State;\r
-  tmp_mode            = hspi->Init.Mode;\r
-\r
-  if (!((tmp_state == HAL_SPI_STATE_READY) ||\r
-        ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_state == HAL_SPI_STATE_BUSY_RX))))\r
-  {\r
-    errorcode = HAL_BUSY;\r
-    goto error;\r
-  }\r
-\r
-  if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U))\r
-  {\r
-    errorcode = HAL_ERROR;\r
-    goto error;\r
-  }\r
-\r
-  /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */\r
-  if (hspi->State != HAL_SPI_STATE_BUSY_RX)\r
-  {\r
-    hspi->State = HAL_SPI_STATE_BUSY_TX_RX;\r
-  }\r
-\r
-  /* Set the transaction information */\r
-  hspi->ErrorCode   = HAL_SPI_ERROR_NONE;\r
-  hspi->pTxBuffPtr  = (uint8_t *)pTxData;\r
-  hspi->TxXferSize  = Size;\r
-  hspi->TxXferCount = Size;\r
-  hspi->pRxBuffPtr  = (uint8_t *)pRxData;\r
-  hspi->RxXferSize  = Size;\r
-  hspi->RxXferCount = Size;\r
-\r
-  /* Init field not used in handle to zero */\r
-  hspi->RxISR       = NULL;\r
-  hspi->TxISR       = NULL;\r
-\r
-#if (USE_SPI_CRC != 0U)\r
-  /* Reset CRC Calculation */\r
-  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)\r
-  {\r
-    SPI_RESET_CRC(hspi);\r
-  }\r
-#endif /* USE_SPI_CRC */\r
-\r
-  /* Reset the threshold bit */\r
-  CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX | SPI_CR2_LDMARX);\r
-\r
-  /* The packing mode management is enabled by the DMA settings according the spi data size */\r
-  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)\r
-  {\r
-    /* Set fiforxthreshold according the reception data length: 16bit */\r
-    CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);\r
-  }\r
-  else\r
-  {\r
-    /* Set RX Fifo threshold according the reception data length: 8bit */\r
-    SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);\r
-\r
-    if (hspi->hdmatx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD)\r
-    {\r
-      if ((hspi->TxXferSize & 0x1U) == 0x0U)\r
-      {\r
-        CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX);\r
-        hspi->TxXferCount = hspi->TxXferCount >> 1U;\r
-      }\r
-      else\r
-      {\r
-        SET_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX);\r
-        hspi->TxXferCount = (hspi->TxXferCount >> 1U) + 1U;\r
-      }\r
-    }\r
-\r
-    if (hspi->hdmarx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD)\r
-    {\r
-      /* Set RX Fifo threshold according the reception data length: 16bit */\r
-      CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);\r
-\r
-      if ((hspi->RxXferCount & 0x1U) == 0x0U)\r
-      {\r
-        CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX);\r
-        hspi->RxXferCount = hspi->RxXferCount >> 1U;\r
-      }\r
-      else\r
-      {\r
-        SET_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX);\r
-        hspi->RxXferCount = (hspi->RxXferCount >> 1U) + 1U;\r
-      }\r
-    }\r
-  }\r
-\r
-  /* Check if we are in Rx only or in Rx/Tx Mode and configure the DMA transfer complete callback */\r
-  if (hspi->State == HAL_SPI_STATE_BUSY_RX)\r
-  {\r
-    /* Set the SPI Rx DMA Half transfer complete callback */\r
-    hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfReceiveCplt;\r
-    hspi->hdmarx->XferCpltCallback     = SPI_DMAReceiveCplt;\r
-  }\r
-  else\r
-  {\r
-    /* Set the SPI Tx/Rx DMA Half transfer complete callback */\r
-    hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfTransmitReceiveCplt;\r
-    hspi->hdmarx->XferCpltCallback     = SPI_DMATransmitReceiveCplt;\r
-  }\r
-\r
-  /* Set the DMA error callback */\r
-  hspi->hdmarx->XferErrorCallback = SPI_DMAError;\r
-\r
-  /* Set the DMA AbortCpltCallback */\r
-  hspi->hdmarx->XferAbortCallback = NULL;\r
-\r
-  /* Enable the Rx DMA Stream/Channel  */\r
-  if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBuffPtr, hspi->RxXferCount))\r
-  {\r
-    /* Update SPI error code */\r
-    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA);\r
-    errorcode = HAL_ERROR;\r
-\r
-    hspi->State = HAL_SPI_STATE_READY;\r
-    goto error;\r
-  }\r
-\r
-  /* Enable Rx DMA Request */\r
-  SET_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN);\r
-\r
-  /* Set the SPI Tx DMA transfer complete callback as NULL because the communication closing\r
-  is performed in DMA reception complete callback  */\r
-  hspi->hdmatx->XferHalfCpltCallback = NULL;\r
-  hspi->hdmatx->XferCpltCallback     = NULL;\r
-  hspi->hdmatx->XferErrorCallback    = NULL;\r
-  hspi->hdmatx->XferAbortCallback    = NULL;\r
-\r
-  /* Enable the Tx DMA Stream/Channel  */\r
-  if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instance->DR, hspi->TxXferCount))\r
-  {\r
-    /* Update SPI error code */\r
-    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA);\r
-    errorcode = HAL_ERROR;\r
-\r
-    hspi->State = HAL_SPI_STATE_READY;\r
-    goto error;\r
-  }\r
-\r
-  /* Check if the SPI is already enabled */\r
-  if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)\r
-  {\r
-    /* Enable SPI peripheral */\r
-    __HAL_SPI_ENABLE(hspi);\r
-  }\r
-  /* Enable the SPI Error Interrupt Bit */\r
-  __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR));\r
-\r
-  /* Enable Tx DMA Request */\r
-  SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN);\r
-\r
-error :\r
-  /* Process Unlocked */\r
-  __HAL_UNLOCK(hspi);\r
-  return errorcode;\r
-}\r
-\r
-/**\r
-  * @brief  Abort ongoing transfer (blocking mode).\r
-  * @param  hspi SPI handle.\r
-  * @note   This procedure could be used for aborting any ongoing transfer (Tx and Rx),\r
-  *         started in Interrupt or DMA mode.\r
-  *         This procedure performs following operations :\r
-  *           - Disable SPI Interrupts (depending of transfer direction)\r
-  *           - Disable the DMA transfer in the peripheral register (if enabled)\r
-  *           - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode)\r
-  *           - Set handle State to READY\r
-  * @note   This procedure is executed in blocking mode : when exiting function, Abort is considered as completed.\r
-  * @retval HAL status\r
-*/\r
-HAL_StatusTypeDef HAL_SPI_Abort(SPI_HandleTypeDef *hspi)\r
-{\r
-  HAL_StatusTypeDef errorcode;\r
-  __IO uint32_t count, resetcount;\r
-\r
-  /* Initialized local variable  */\r
-  errorcode = HAL_OK;\r
-  resetcount = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U);\r
-  count = resetcount;\r
-\r
-  /* Clear ERRIE interrupt to avoid error interrupts generation during Abort procedure */\r
-  CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_ERRIE);\r
-\r
-  /* Disable TXEIE, RXNEIE and ERRIE(mode fault event, overrun error, TI frame error) interrupts */\r
-  if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXEIE))\r
-  {\r
-    hspi->TxISR = SPI_AbortTx_ISR;\r
-    /* Wait HAL_SPI_STATE_ABORT state */\r
-    do\r
-    {\r
-      if (count == 0U)\r
-      {\r
-        SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);\r
-        break;\r
-      }\r
-      count--;\r
-    }\r
-    while (hspi->State != HAL_SPI_STATE_ABORT);\r
-    /* Reset Timeout Counter */\r
-    count = resetcount;\r
-  }\r
-\r
-  if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE))\r
-  {\r
-    hspi->RxISR = SPI_AbortRx_ISR;\r
-    /* Wait HAL_SPI_STATE_ABORT state */\r
-    do\r
-    {\r
-      if (count == 0U)\r
-      {\r
-        SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);\r
-        break;\r
-      }\r
-      count--;\r
-    }\r
-    while (hspi->State != HAL_SPI_STATE_ABORT);\r
-    /* Reset Timeout Counter */\r
-    count = resetcount;\r
-  }\r
-\r
-  /* Disable the SPI DMA Tx request if enabled */\r
-  if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN))\r
-  {\r
-    /* Abort the SPI DMA Tx Stream/Channel : use blocking DMA Abort API (no callback) */\r
-    if (hspi->hdmatx != NULL)\r
-    {\r
-      /* Set the SPI DMA Abort callback :\r
-      will lead to call HAL_SPI_AbortCpltCallback() at end of DMA abort procedure */\r
-      hspi->hdmatx->XferAbortCallback = NULL;\r
-\r
-      /* Abort DMA Tx Handle linked to SPI Peripheral */\r
-      if (HAL_DMA_Abort(hspi->hdmatx) != HAL_OK)\r
-      {\r
-        hspi->ErrorCode = HAL_SPI_ERROR_ABORT;\r
-      }\r
-\r
-      /* Disable Tx DMA Request */\r
-      CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXDMAEN));\r
-\r
-      if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)\r
-      {\r
-        hspi->ErrorCode = HAL_SPI_ERROR_ABORT;\r
-      }\r
-\r
-      /* Disable SPI Peripheral */\r
-      __HAL_SPI_DISABLE(hspi);\r
-\r
-      /* Empty the FRLVL fifo */\r
-      if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)\r
-      {\r
-        hspi->ErrorCode = HAL_SPI_ERROR_ABORT;\r
-      }\r
-    }\r
-  }\r
-\r
-  /* Disable the SPI DMA Rx request if enabled */\r
-  if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN))\r
-  {\r
-    /* Abort the SPI DMA Rx Stream/Channel : use blocking DMA Abort API (no callback) */\r
-    if (hspi->hdmarx != NULL)\r
-    {\r
-      /* Set the SPI DMA Abort callback :\r
-      will lead to call HAL_SPI_AbortCpltCallback() at end of DMA abort procedure */\r
-      hspi->hdmarx->XferAbortCallback = NULL;\r
-\r
-      /* Abort DMA Rx Handle linked to SPI Peripheral */\r
-      if (HAL_DMA_Abort(hspi->hdmarx) != HAL_OK)\r
-      {\r
-        hspi->ErrorCode = HAL_SPI_ERROR_ABORT;\r
-      }\r
-\r
-      /* Disable peripheral */\r
-      __HAL_SPI_DISABLE(hspi);\r
-\r
-      /* Control the BSY flag */\r
-      if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)\r
-      {\r
-        hspi->ErrorCode = HAL_SPI_ERROR_ABORT;\r
-      }\r
-\r
-      /* Empty the FRLVL fifo */\r
-      if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)\r
-      {\r
-        hspi->ErrorCode = HAL_SPI_ERROR_ABORT;\r
-      }\r
-\r
-      /* Disable Rx DMA Request */\r
-      CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_RXDMAEN));\r
-    }\r
-  }\r
-  /* Reset Tx and Rx transfer counters */\r
-  hspi->RxXferCount = 0U;\r
-  hspi->TxXferCount = 0U;\r
-\r
-  /* Check error during Abort procedure */\r
-  if (hspi->ErrorCode == HAL_SPI_ERROR_ABORT)\r
-  {\r
-    /* return HAL_Error in case of error during Abort procedure */\r
-    errorcode = HAL_ERROR;\r
-  }\r
-  else\r
-  {\r
-    /* Reset errorCode */\r
-    hspi->ErrorCode = HAL_SPI_ERROR_NONE;\r
-  }\r
-\r
-  /* Clear the Error flags in the SR register */\r
-  __HAL_SPI_CLEAR_OVRFLAG(hspi);\r
-  __HAL_SPI_CLEAR_FREFLAG(hspi);\r
-\r
-  /* Restore hspi->state to ready */\r
-  hspi->State = HAL_SPI_STATE_READY;\r
-\r
-  return errorcode;\r
-}\r
-\r
-/**\r
-  * @brief  Abort ongoing transfer (Interrupt mode).\r
-  * @param  hspi SPI handle.\r
-  * @note   This procedure could be used for aborting any ongoing transfer (Tx and Rx),\r
-  *         started in Interrupt or DMA mode.\r
-  *         This procedure performs following operations :\r
-  *           - Disable SPI Interrupts (depending of transfer direction)\r
-  *           - Disable the DMA transfer in the peripheral register (if enabled)\r
-  *           - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode)\r
-  *           - Set handle State to READY\r
-  *           - At abort completion, call user abort complete callback\r
-  * @note   This procedure is executed in Interrupt mode, meaning that abort procedure could be\r
-  *         considered as completed only when user abort complete callback is executed (not when exiting function).\r
-  * @retval HAL status\r
-*/\r
-HAL_StatusTypeDef HAL_SPI_Abort_IT(SPI_HandleTypeDef *hspi)\r
-{\r
-  HAL_StatusTypeDef errorcode;\r
-  uint32_t abortcplt ;\r
-  __IO uint32_t count, resetcount;\r
-\r
-  /* Initialized local variable  */\r
-  errorcode = HAL_OK;\r
-  abortcplt = 1U;\r
-  resetcount = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U);\r
-  count = resetcount;\r
-\r
-  /* Clear ERRIE interrupt to avoid error interrupts generation during Abort procedure */\r
-  CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_ERRIE);\r
-\r
-  /* Change Rx and Tx Irq Handler to Disable TXEIE, RXNEIE and ERRIE interrupts */\r
-  if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXEIE))\r
-  {\r
-    hspi->TxISR = SPI_AbortTx_ISR;\r
-    /* Wait HAL_SPI_STATE_ABORT state */\r
-    do\r
-    {\r
-      if (count == 0U)\r
-      {\r
-        SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);\r
-        break;\r
-      }\r
-      count--;\r
-    }\r
-    while (hspi->State != HAL_SPI_STATE_ABORT);\r
-    /* Reset Timeout Counter */\r
-    count = resetcount;\r
-  }\r
-\r
-  if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE))\r
-  {\r
-    hspi->RxISR = SPI_AbortRx_ISR;\r
-    /* Wait HAL_SPI_STATE_ABORT state */\r
-    do\r
-    {\r
-      if (count == 0U)\r
-      {\r
-        SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);\r
-        break;\r
-      }\r
-      count--;\r
-    }\r
-    while (hspi->State != HAL_SPI_STATE_ABORT);\r
-    /* Reset Timeout Counter */\r
-    count = resetcount;\r
-  }\r
-\r
-  /* If DMA Tx and/or DMA Rx Handles are associated to SPI Handle, DMA Abort complete callbacks should be initialised\r
-     before any call to DMA Abort functions */\r
-  /* DMA Tx Handle is valid */\r
-  if (hspi->hdmatx != NULL)\r
-  {\r
-    /* Set DMA Abort Complete callback if UART DMA Tx request if enabled.\r
-       Otherwise, set it to NULL */\r
-    if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN))\r
-    {\r
-      hspi->hdmatx->XferAbortCallback = SPI_DMATxAbortCallback;\r
-    }\r
-    else\r
-    {\r
-      hspi->hdmatx->XferAbortCallback = NULL;\r
-    }\r
-  }\r
-  /* DMA Rx Handle is valid */\r
-  if (hspi->hdmarx != NULL)\r
-  {\r
-    /* Set DMA Abort Complete callback if UART DMA Rx request if enabled.\r
-       Otherwise, set it to NULL */\r
-    if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN))\r
-    {\r
-      hspi->hdmarx->XferAbortCallback = SPI_DMARxAbortCallback;\r
-    }\r
-    else\r
-    {\r
-      hspi->hdmarx->XferAbortCallback = NULL;\r
-    }\r
-  }\r
-\r
-  /* Disable the SPI DMA Tx request if enabled */\r
-  if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN))\r
-  {\r
-    /* Abort the SPI DMA Tx Stream/Channel */\r
-    if (hspi->hdmatx != NULL)\r
-    {\r
-      /* Abort DMA Tx Handle linked to SPI Peripheral */\r
-      if (HAL_DMA_Abort_IT(hspi->hdmatx) != HAL_OK)\r
-      {\r
-        hspi->hdmatx->XferAbortCallback = NULL;\r
-        hspi->ErrorCode = HAL_SPI_ERROR_ABORT;\r
-      }\r
-      else\r
-      {\r
-        abortcplt = 0U;\r
-      }\r
-    }\r
-  }\r
-  /* Disable the SPI DMA Rx request if enabled */\r
-  if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN))\r
-  {\r
-    /* Abort the SPI DMA Rx Stream/Channel */\r
-    if (hspi->hdmarx != NULL)\r
-    {\r
-      /* Abort DMA Rx Handle linked to SPI Peripheral */\r
-      if (HAL_DMA_Abort_IT(hspi->hdmarx) !=  HAL_OK)\r
-      {\r
-        hspi->hdmarx->XferAbortCallback = NULL;\r
-        hspi->ErrorCode = HAL_SPI_ERROR_ABORT;\r
-      }\r
-      else\r
-      {\r
-        abortcplt = 0U;\r
-      }\r
-    }\r
-  }\r
-\r
-  if (abortcplt == 1U)\r
-  {\r
-    /* Reset Tx and Rx transfer counters */\r
-    hspi->RxXferCount = 0U;\r
-    hspi->TxXferCount = 0U;\r
-\r
-    /* Check error during Abort procedure */\r
-    if (hspi->ErrorCode == HAL_SPI_ERROR_ABORT)\r
-    {\r
-      /* return HAL_Error in case of error during Abort procedure */\r
-      errorcode = HAL_ERROR;\r
-    }\r
-    else\r
-    {\r
-      /* Reset errorCode */\r
-      hspi->ErrorCode = HAL_SPI_ERROR_NONE;\r
-    }\r
-\r
-    /* Clear the Error flags in the SR register */\r
-    __HAL_SPI_CLEAR_OVRFLAG(hspi);\r
-    __HAL_SPI_CLEAR_FREFLAG(hspi);\r
-\r
-    /* Restore hspi->State to Ready */\r
-    hspi->State = HAL_SPI_STATE_READY;\r
-\r
-    /* As no DMA to be aborted, call directly user Abort complete callback */\r
-#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)\r
-    hspi->AbortCpltCallback(hspi);\r
-#else\r
-    HAL_SPI_AbortCpltCallback(hspi);\r
-#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */\r
-  }\r
-\r
-  return errorcode;\r
-}\r
-\r
-/**\r
-  * @brief  Pause the DMA Transfer.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for the specified SPI module.\r
-  * @retval HAL status\r
-  */\r
-HAL_StatusTypeDef HAL_SPI_DMAPause(SPI_HandleTypeDef *hspi)\r
-{\r
-  /* Process Locked */\r
-  __HAL_LOCK(hspi);\r
-\r
-  /* Disable the SPI DMA Tx & Rx requests */\r
-  CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN);\r
-\r
-  /* Process Unlocked */\r
-  __HAL_UNLOCK(hspi);\r
-\r
-  return HAL_OK;\r
-}\r
-\r
-/**\r
-  * @brief  Resume the DMA Transfer.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for the specified SPI module.\r
-  * @retval HAL status\r
-  */\r
-HAL_StatusTypeDef HAL_SPI_DMAResume(SPI_HandleTypeDef *hspi)\r
-{\r
-  /* Process Locked */\r
-  __HAL_LOCK(hspi);\r
-\r
-  /* Enable the SPI DMA Tx & Rx requests */\r
-  SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN);\r
-\r
-  /* Process Unlocked */\r
-  __HAL_UNLOCK(hspi);\r
-\r
-  return HAL_OK;\r
-}\r
-\r
-/**\r
-  * @brief  Stop the DMA Transfer.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for the specified SPI module.\r
-  * @retval HAL status\r
-  */\r
-HAL_StatusTypeDef HAL_SPI_DMAStop(SPI_HandleTypeDef *hspi)\r
-{\r
-  HAL_StatusTypeDef errorcode = HAL_OK;\r
-  /* The Lock is not implemented on this API to allow the user application\r
-     to call the HAL SPI API under callbacks HAL_SPI_TxCpltCallback() or HAL_SPI_RxCpltCallback() or HAL_SPI_TxRxCpltCallback():\r
-     when calling HAL_DMA_Abort() API the DMA TX/RX Transfer complete interrupt is generated\r
-     and the correspond call back is executed HAL_SPI_TxCpltCallback() or HAL_SPI_RxCpltCallback() or HAL_SPI_TxRxCpltCallback()\r
-     */\r
-\r
-  /* Abort the SPI DMA tx Stream/Channel  */\r
-  if (hspi->hdmatx != NULL)\r
-  {\r
-    if (HAL_OK != HAL_DMA_Abort(hspi->hdmatx))\r
-    {\r
-      SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA);\r
-      errorcode = HAL_ERROR;\r
-    }\r
-  }\r
-  /* Abort the SPI DMA rx Stream/Channel  */\r
-  if (hspi->hdmarx != NULL)\r
-  {\r
-    if (HAL_OK != HAL_DMA_Abort(hspi->hdmarx))\r
-    {\r
-      SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA);\r
-      errorcode = HAL_ERROR;\r
-    }\r
-  }\r
-\r
-  /* Disable the SPI DMA Tx & Rx requests */\r
-  CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN);\r
-  hspi->State = HAL_SPI_STATE_READY;\r
-  return errorcode;\r
-}\r
-\r
-/**\r
-  * @brief  Handle SPI interrupt request.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for the specified SPI module.\r
-  * @retval None\r
-  */\r
-void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi)\r
-{\r
-  uint32_t itsource = hspi->Instance->CR2;\r
-  uint32_t itflag   = hspi->Instance->SR;\r
-\r
-  /* SPI in mode Receiver ----------------------------------------------------*/\r
-  if ((SPI_CHECK_FLAG(itflag, SPI_FLAG_OVR) == RESET) &&\r
-      (SPI_CHECK_FLAG(itflag, SPI_FLAG_RXNE) != RESET) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_RXNE) != RESET))\r
-  {\r
-    hspi->RxISR(hspi);\r
-    return;\r
-  }\r
-\r
-  /* SPI in mode Transmitter -------------------------------------------------*/\r
-  if ((SPI_CHECK_FLAG(itflag, SPI_FLAG_TXE) != RESET) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_TXE) != RESET))\r
-  {\r
-    hspi->TxISR(hspi);\r
-    return;\r
-  }\r
-\r
-  /* SPI in Error Treatment --------------------------------------------------*/\r
-  if (((SPI_CHECK_FLAG(itflag, SPI_FLAG_MODF) != RESET) || (SPI_CHECK_FLAG(itflag, SPI_FLAG_OVR) != RESET) || (SPI_CHECK_FLAG(itflag, SPI_FLAG_FRE) != RESET)) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_ERR) != RESET))\r
-  {\r
-    /* SPI Overrun error interrupt occurred ----------------------------------*/\r
-    if (SPI_CHECK_FLAG(itflag, SPI_FLAG_OVR) != RESET)\r
-    {\r
-      if (hspi->State != HAL_SPI_STATE_BUSY_TX)\r
-      {\r
-        SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_OVR);\r
-        __HAL_SPI_CLEAR_OVRFLAG(hspi);\r
-      }\r
-      else\r
-      {\r
-        __HAL_SPI_CLEAR_OVRFLAG(hspi);\r
-        return;\r
-      }\r
-    }\r
-\r
-    /* SPI Mode Fault error interrupt occurred -------------------------------*/\r
-    if (SPI_CHECK_FLAG(itflag, SPI_FLAG_MODF) != RESET)\r
-    {\r
-      SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_MODF);\r
-      __HAL_SPI_CLEAR_MODFFLAG(hspi);\r
-    }\r
-\r
-    /* SPI Frame error interrupt occurred ------------------------------------*/\r
-    if (SPI_CHECK_FLAG(itflag, SPI_FLAG_FRE) != RESET)\r
-    {\r
-      SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FRE);\r
-      __HAL_SPI_CLEAR_FREFLAG(hspi);\r
-    }\r
-\r
-    if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)\r
-    {\r
-      /* Disable all interrupts */\r
-      __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE | SPI_IT_TXE | SPI_IT_ERR);\r
-\r
-      hspi->State = HAL_SPI_STATE_READY;\r
-      /* Disable the SPI DMA requests if enabled */\r
-      if ((HAL_IS_BIT_SET(itsource, SPI_CR2_TXDMAEN)) || (HAL_IS_BIT_SET(itsource, SPI_CR2_RXDMAEN)))\r
-      {\r
-        CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN));\r
-\r
-        /* Abort the SPI DMA Rx channel */\r
-        if (hspi->hdmarx != NULL)\r
-        {\r
-          /* Set the SPI DMA Abort callback :\r
-          will lead to call HAL_SPI_ErrorCallback() at end of DMA abort procedure */\r
-          hspi->hdmarx->XferAbortCallback = SPI_DMAAbortOnError;\r
-          if (HAL_OK != HAL_DMA_Abort_IT(hspi->hdmarx))\r
-          {\r
-            SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);\r
-          }\r
-        }\r
-        /* Abort the SPI DMA Tx channel */\r
-        if (hspi->hdmatx != NULL)\r
-        {\r
-          /* Set the SPI DMA Abort callback :\r
-          will lead to call HAL_SPI_ErrorCallback() at end of DMA abort procedure */\r
-          hspi->hdmatx->XferAbortCallback = SPI_DMAAbortOnError;\r
-          if (HAL_OK != HAL_DMA_Abort_IT(hspi->hdmatx))\r
-          {\r
-            SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);\r
-          }\r
-        }\r
-      }\r
-      else\r
-      {\r
-        /* Call user error callback */\r
-#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)\r
-        hspi->ErrorCallback(hspi);\r
-#else\r
-        HAL_SPI_ErrorCallback(hspi);\r
-#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */\r
-      }\r
-    }\r
-    return;\r
-  }\r
-}\r
-\r
-/**\r
-  * @brief  Tx Transfer completed callback.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval None\r
-  */\r
-__weak void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)\r
-{\r
-  /* Prevent unused argument(s) compilation warning */\r
-  UNUSED(hspi);\r
-\r
-  /* NOTE : This function should not be modified, when the callback is needed,\r
-            the HAL_SPI_TxCpltCallback should be implemented in the user file\r
-   */\r
-}\r
-\r
-/**\r
-  * @brief  Rx Transfer completed callback.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval None\r
-  */\r
-__weak void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)\r
-{\r
-  /* Prevent unused argument(s) compilation warning */\r
-  UNUSED(hspi);\r
-\r
-  /* NOTE : This function should not be modified, when the callback is needed,\r
-            the HAL_SPI_RxCpltCallback should be implemented in the user file\r
-   */\r
-}\r
-\r
-/**\r
-  * @brief  Tx and Rx Transfer completed callback.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval None\r
-  */\r
-__weak void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)\r
-{\r
-  /* Prevent unused argument(s) compilation warning */\r
-  UNUSED(hspi);\r
-\r
-  /* NOTE : This function should not be modified, when the callback is needed,\r
-            the HAL_SPI_TxRxCpltCallback should be implemented in the user file\r
-   */\r
-}\r
-\r
-/**\r
-  * @brief  Tx Half Transfer completed callback.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval None\r
-  */\r
-__weak void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi)\r
-{\r
-  /* Prevent unused argument(s) compilation warning */\r
-  UNUSED(hspi);\r
-\r
-  /* NOTE : This function should not be modified, when the callback is needed,\r
-            the HAL_SPI_TxHalfCpltCallback should be implemented in the user file\r
-   */\r
-}\r
-\r
-/**\r
-  * @brief  Rx Half Transfer completed callback.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval None\r
-  */\r
-__weak void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi)\r
-{\r
-  /* Prevent unused argument(s) compilation warning */\r
-  UNUSED(hspi);\r
-\r
-  /* NOTE : This function should not be modified, when the callback is needed,\r
-            the HAL_SPI_RxHalfCpltCallback() should be implemented in the user file\r
-   */\r
-}\r
-\r
-/**\r
-  * @brief  Tx and Rx Half Transfer callback.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval None\r
-  */\r
-__weak void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi)\r
-{\r
-  /* Prevent unused argument(s) compilation warning */\r
-  UNUSED(hspi);\r
-\r
-  /* NOTE : This function should not be modified, when the callback is needed,\r
-            the HAL_SPI_TxRxHalfCpltCallback() should be implemented in the user file\r
-   */\r
-}\r
-\r
-/**\r
-  * @brief  SPI error callback.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval None\r
-  */\r
-__weak void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi)\r
-{\r
-  /* Prevent unused argument(s) compilation warning */\r
-  UNUSED(hspi);\r
-\r
-  /* NOTE : This function should not be modified, when the callback is needed,\r
-            the HAL_SPI_ErrorCallback should be implemented in the user file\r
-   */\r
-  /* NOTE : The ErrorCode parameter in the hspi handle is updated by the SPI processes\r
-            and user can use HAL_SPI_GetError() API to check the latest error occurred\r
-   */\r
-}\r
-\r
-/**\r
-  * @brief  SPI Abort Complete callback.\r
-  * @param  hspi SPI handle.\r
-  * @retval None\r
-  */\r
-__weak void HAL_SPI_AbortCpltCallback(SPI_HandleTypeDef *hspi)\r
-{\r
-  /* Prevent unused argument(s) compilation warning */\r
-  UNUSED(hspi);\r
-\r
-  /* NOTE : This function should not be modified, when the callback is needed,\r
-            the HAL_SPI_AbortCpltCallback can be implemented in the user file.\r
-   */\r
-}\r
-\r
-/**\r
-  * @}\r
-  */\r
-\r
-/** @defgroup SPI_Exported_Functions_Group3 Peripheral State and Errors functions\r
-  * @brief   SPI control functions\r
-  *\r
-@verbatim\r
- ===============================================================================\r
-                      ##### Peripheral State and Errors functions #####\r
- ===============================================================================\r
-    [..]\r
-    This subsection provides a set of functions allowing to control the SPI.\r
-     (+) HAL_SPI_GetState() API can be helpful to check in run-time the state of the SPI peripheral\r
-     (+) HAL_SPI_GetError() check in run-time Errors occurring during communication\r
-@endverbatim\r
-  * @{\r
-  */\r
-\r
-/**\r
-  * @brief  Return the SPI handle state.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval SPI state\r
-  */\r
-HAL_SPI_StateTypeDef HAL_SPI_GetState(SPI_HandleTypeDef *hspi)\r
-{\r
-  /* Return SPI handle state */\r
-  return hspi->State;\r
-}\r
-\r
-/**\r
-  * @brief  Return the SPI error code.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval SPI error code in bitmap format\r
-  */\r
-uint32_t HAL_SPI_GetError(SPI_HandleTypeDef *hspi)\r
-{\r
-  /* Return SPI ErrorCode */\r
-  return hspi->ErrorCode;\r
-}\r
-\r
-/**\r
-  * @}\r
-  */\r
-\r
-/**\r
-  * @}\r
-  */\r
-\r
-/** @addtogroup SPI_Private_Functions\r
-  * @brief   Private functions\r
-  * @{\r
-  */\r
-\r
-/**\r
-  * @brief  DMA SPI transmit process complete callback.\r
-  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains\r
-  *               the configuration information for the specified DMA module.\r
-  * @retval None\r
-  */\r
-static void SPI_DMATransmitCplt(DMA_HandleTypeDef *hdma)\r
-{\r
-  SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */\r
-  uint32_t tickstart;\r
-\r
-  /* Init tickstart for timeout management*/\r
-  tickstart = HAL_GetTick();\r
-\r
-  /* DMA Normal Mode */\r
-  if ((hdma->Instance->CCR & DMA_CCR_CIRC) != DMA_CCR_CIRC)\r
-  {\r
-    /* Disable ERR interrupt */\r
-    __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR);\r
-\r
-    /* Disable Tx DMA Request */\r
-    CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN);\r
-\r
-    /* Check the end of the transaction */\r
-    if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)\r
-    {\r
-      SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);\r
-    }\r
-\r
-    /* Clear overrun flag in 2 Lines communication mode because received data is not read */\r
-    if (hspi->Init.Direction == SPI_DIRECTION_2LINES)\r
-    {\r
-      __HAL_SPI_CLEAR_OVRFLAG(hspi);\r
-    }\r
-\r
-    hspi->TxXferCount = 0U;\r
-    hspi->State = HAL_SPI_STATE_READY;\r
-\r
-    if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)\r
-    {\r
-      /* Call user error callback */\r
-#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)\r
-      hspi->ErrorCallback(hspi);\r
-#else\r
-      HAL_SPI_ErrorCallback(hspi);\r
-#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */\r
-      return;\r
-    }\r
-  }\r
-  /* Call user Tx complete callback */\r
-#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)\r
-  hspi->TxCpltCallback(hspi);\r
-#else\r
-  HAL_SPI_TxCpltCallback(hspi);\r
-#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */\r
-}\r
-\r
-/**\r
-  * @brief  DMA SPI receive process complete callback.\r
-  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains\r
-  *               the configuration information for the specified DMA module.\r
-  * @retval None\r
-  */\r
-static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma)\r
-{\r
-  SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */\r
-  uint32_t tickstart;\r
-\r
-  /* Init tickstart for timeout management*/\r
-  tickstart = HAL_GetTick();\r
-\r
-  /* DMA Normal Mode */\r
-  if ((hdma->Instance->CCR & DMA_CCR_CIRC) != DMA_CCR_CIRC)\r
-  {\r
-    /* Disable ERR interrupt */\r
-    __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR);\r
-\r
-#if (USE_SPI_CRC != 0U)\r
-    /* CRC handling */\r
-    if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)\r
-    {\r
-      /* Wait until RXNE flag */\r
-      if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)\r
-      {\r
-        /* Error on the CRC reception */\r
-        SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);\r
-      }\r
-      /* Read CRC */\r
-      if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)\r
-      {\r
-        /* Read 16bit CRC */\r
-        READ_REG(hspi->Instance->DR);\r
-      }\r
-      else\r
-      {\r
-        /* Read 8bit CRC */\r
-        READ_REG(*(__IO uint8_t *)&hspi->Instance->DR);\r
-\r
-        if (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT)\r
-        {\r
-          if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)\r
-          {\r
-            /* Error on the CRC reception */\r
-            SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);\r
-          }\r
-          /* Read 8bit CRC again in case of 16bit CRC in 8bit Data mode */\r
-          READ_REG(*(__IO uint8_t *)&hspi->Instance->DR);\r
-        }\r
-      }\r
-    }\r
-#endif /* USE_SPI_CRC */\r
-\r
-    /* Disable Rx/Tx DMA Request (done by default to handle the case master rx direction 2 lines) */\r
-    CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN);\r
-\r
-    /* Check the end of the transaction */\r
-    if (SPI_EndRxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)\r
-    {\r
-      hspi->ErrorCode = HAL_SPI_ERROR_FLAG;\r
-    }\r
-\r
-    hspi->RxXferCount = 0U;\r
-    hspi->State = HAL_SPI_STATE_READY;\r
-\r
-#if (USE_SPI_CRC != 0U)\r
-    /* Check if CRC error occurred */\r
-    if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR))\r
-    {\r
-      SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);\r
-      __HAL_SPI_CLEAR_CRCERRFLAG(hspi);\r
-    }\r
-#endif /* USE_SPI_CRC */\r
-\r
-    if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)\r
-    {\r
-      /* Call user error callback */\r
-#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)\r
-      hspi->ErrorCallback(hspi);\r
-#else\r
-      HAL_SPI_ErrorCallback(hspi);\r
-#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */\r
-      return;\r
-    }\r
-  }\r
-  /* Call user Rx complete callback */\r
-#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)\r
-  hspi->RxCpltCallback(hspi);\r
-#else\r
-  HAL_SPI_RxCpltCallback(hspi);\r
-#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */\r
-}\r
-\r
-/**\r
-  * @brief  DMA SPI transmit receive process complete callback.\r
-  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains\r
-  *               the configuration information for the specified DMA module.\r
-  * @retval None\r
-  */\r
-static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma)\r
-{\r
-  SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */\r
-  uint32_t tickstart;\r
-\r
-  /* Init tickstart for timeout management*/\r
-  tickstart = HAL_GetTick();\r
-\r
-  /* DMA Normal Mode */\r
-  if ((hdma->Instance->CCR & DMA_CCR_CIRC) != DMA_CCR_CIRC)\r
-  {\r
-    /* Disable ERR interrupt */\r
-    __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR);\r
-\r
-#if (USE_SPI_CRC != 0U)\r
-    /* CRC handling */\r
-    if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)\r
-    {\r
-      if ((hspi->Init.DataSize == SPI_DATASIZE_8BIT) && (hspi->Init.CRCLength == SPI_CRC_LENGTH_8BIT))\r
-      {\r
-        if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_QUARTER_FULL, SPI_DEFAULT_TIMEOUT,\r
-                                          tickstart) != HAL_OK)\r
-        {\r
-          /* Error on the CRC reception */\r
-          SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);\r
-        }\r
-        /* Read CRC to Flush DR and RXNE flag */\r
-        READ_REG(*(__IO uint8_t *)&hspi->Instance->DR);\r
-      }\r
-      else\r
-      {\r
-        if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_HALF_FULL, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)\r
-        {\r
-          /* Error on the CRC reception */\r
-          SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);\r
-        }\r
-        /* Read CRC to Flush DR and RXNE flag */\r
-        READ_REG(hspi->Instance->DR);\r
-      }\r
-    }\r
-#endif /* USE_SPI_CRC */\r
-\r
-    /* Check the end of the transaction */\r
-    if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)\r
-    {\r
-      SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);\r
-    }\r
-\r
-    /* Disable Rx/Tx DMA Request */\r
-    CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN);\r
-\r
-    hspi->TxXferCount = 0U;\r
-    hspi->RxXferCount = 0U;\r
-    hspi->State = HAL_SPI_STATE_READY;\r
-\r
-#if (USE_SPI_CRC != 0U)\r
-    /* Check if CRC error occurred */\r
-    if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR))\r
-    {\r
-      SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);\r
-      __HAL_SPI_CLEAR_CRCERRFLAG(hspi);\r
-    }\r
-#endif /* USE_SPI_CRC */\r
-\r
-    if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)\r
-    {\r
-      /* Call user error callback */\r
-#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)\r
-      hspi->ErrorCallback(hspi);\r
-#else\r
-      HAL_SPI_ErrorCallback(hspi);\r
-#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */\r
-      return;\r
-    }\r
-  }\r
-  /* Call user TxRx complete callback */\r
-#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)\r
-  hspi->TxRxCpltCallback(hspi);\r
-#else\r
-  HAL_SPI_TxRxCpltCallback(hspi);\r
-#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */\r
-}\r
-\r
-/**\r
-  * @brief  DMA SPI half transmit process complete callback.\r
-  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains\r
-  *               the configuration information for the specified DMA module.\r
-  * @retval None\r
-  */\r
-static void SPI_DMAHalfTransmitCplt(DMA_HandleTypeDef *hdma)\r
-{\r
-  SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */\r
-\r
-  /* Call user Tx half complete callback */\r
-#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)\r
-  hspi->TxHalfCpltCallback(hspi);\r
-#else\r
-  HAL_SPI_TxHalfCpltCallback(hspi);\r
-#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */\r
-}\r
-\r
-/**\r
-  * @brief  DMA SPI half receive process complete callback\r
-  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains\r
-  *               the configuration information for the specified DMA module.\r
-  * @retval None\r
-  */\r
-static void SPI_DMAHalfReceiveCplt(DMA_HandleTypeDef *hdma)\r
-{\r
-  SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */\r
-\r
-  /* Call user Rx half complete callback */\r
-#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)\r
-  hspi->RxHalfCpltCallback(hspi);\r
-#else\r
-  HAL_SPI_RxHalfCpltCallback(hspi);\r
-#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */\r
-}\r
-\r
-/**\r
-  * @brief  DMA SPI half transmit receive process complete callback.\r
-  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains\r
-  *               the configuration information for the specified DMA module.\r
-  * @retval None\r
-  */\r
-static void SPI_DMAHalfTransmitReceiveCplt(DMA_HandleTypeDef *hdma)\r
-{\r
-  SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */\r
-\r
-  /* Call user TxRx half complete callback */\r
-#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)\r
-  hspi->TxRxHalfCpltCallback(hspi);\r
-#else\r
-  HAL_SPI_TxRxHalfCpltCallback(hspi);\r
-#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */\r
-}\r
-\r
-/**\r
-  * @brief  DMA SPI communication error callback.\r
-  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains\r
-  *               the configuration information for the specified DMA module.\r
-  * @retval None\r
-  */\r
-static void SPI_DMAError(DMA_HandleTypeDef *hdma)\r
-{\r
-  SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */\r
-\r
-  /* Stop the disable DMA transfer on SPI side */\r
-  CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN);\r
-\r
-  SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA);\r
-  hspi->State = HAL_SPI_STATE_READY;\r
-  /* Call user error callback */\r
-#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)\r
-  hspi->ErrorCallback(hspi);\r
-#else\r
-  HAL_SPI_ErrorCallback(hspi);\r
-#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */\r
-}\r
-\r
-/**\r
-  * @brief  DMA SPI communication abort callback, when initiated by HAL services on Error\r
-  *         (To be called at end of DMA Abort procedure following error occurrence).\r
-  * @param  hdma DMA handle.\r
-  * @retval None\r
-  */\r
-static void SPI_DMAAbortOnError(DMA_HandleTypeDef *hdma)\r
-{\r
-  SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */\r
-  hspi->RxXferCount = 0U;\r
-  hspi->TxXferCount = 0U;\r
-\r
-  /* Call user error callback */\r
-#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)\r
-  hspi->ErrorCallback(hspi);\r
-#else\r
-  HAL_SPI_ErrorCallback(hspi);\r
-#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */\r
-}\r
-\r
-/**\r
-  * @brief  DMA SPI Tx communication abort callback, when initiated by user\r
-  *         (To be called at end of DMA Tx Abort procedure following user abort request).\r
-  * @note   When this callback is executed, User Abort complete call back is called only if no\r
-  *         Abort still ongoing for Rx DMA Handle.\r
-  * @param  hdma DMA handle.\r
-  * @retval None\r
-  */\r
-static void SPI_DMATxAbortCallback(DMA_HandleTypeDef *hdma)\r
-{\r
-  SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */\r
-\r
-  hspi->hdmatx->XferAbortCallback = NULL;\r
-\r
-  /* Disable Tx DMA Request */\r
-  CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN);\r
-\r
-  if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)\r
-  {\r
-    hspi->ErrorCode = HAL_SPI_ERROR_ABORT;\r
-  }\r
-\r
-  /* Disable SPI Peripheral */\r
-  __HAL_SPI_DISABLE(hspi);\r
-\r
-  /* Empty the FRLVL fifo */\r
-  if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)\r
-  {\r
-    hspi->ErrorCode = HAL_SPI_ERROR_ABORT;\r
-  }\r
-\r
-  /* Check if an Abort process is still ongoing */\r
-  if (hspi->hdmarx != NULL)\r
-  {\r
-    if (hspi->hdmarx->XferAbortCallback != NULL)\r
-    {\r
-      return;\r
-    }\r
-  }\r
-\r
-  /* No Abort process still ongoing : All DMA Stream/Channel are aborted, call user Abort Complete callback */\r
-  hspi->RxXferCount = 0U;\r
-  hspi->TxXferCount = 0U;\r
-\r
-  /* Check no error during Abort procedure */\r
-  if (hspi->ErrorCode != HAL_SPI_ERROR_ABORT)\r
-  {\r
-    /* Reset errorCode */\r
-    hspi->ErrorCode = HAL_SPI_ERROR_NONE;\r
-  }\r
-\r
-  /* Clear the Error flags in the SR register */\r
-  __HAL_SPI_CLEAR_OVRFLAG(hspi);\r
-  __HAL_SPI_CLEAR_FREFLAG(hspi);\r
-\r
-  /* Restore hspi->State to Ready */\r
-  hspi->State  = HAL_SPI_STATE_READY;\r
-\r
-  /* Call user Abort complete callback */\r
-#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)\r
-  hspi->AbortCpltCallback(hspi);\r
-#else\r
-  HAL_SPI_AbortCpltCallback(hspi);\r
-#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */\r
-}\r
-\r
-/**\r
-  * @brief  DMA SPI Rx communication abort callback, when initiated by user\r
-  *         (To be called at end of DMA Rx Abort procedure following user abort request).\r
-  * @note   When this callback is executed, User Abort complete call back is called only if no\r
-  *         Abort still ongoing for Tx DMA Handle.\r
-  * @param  hdma DMA handle.\r
-  * @retval None\r
-  */\r
-static void SPI_DMARxAbortCallback(DMA_HandleTypeDef *hdma)\r
-{\r
-  SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */\r
-\r
-  /* Disable SPI Peripheral */\r
-  __HAL_SPI_DISABLE(hspi);\r
-\r
-  hspi->hdmarx->XferAbortCallback = NULL;\r
-\r
-  /* Disable Rx DMA Request */\r
-  CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN);\r
-\r
-  /* Control the BSY flag */\r
-  if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)\r
-  {\r
-    hspi->ErrorCode = HAL_SPI_ERROR_ABORT;\r
-  }\r
-\r
-  /* Empty the FRLVL fifo */\r
-  if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)\r
-  {\r
-    hspi->ErrorCode = HAL_SPI_ERROR_ABORT;\r
-  }\r
-\r
-  /* Check if an Abort process is still ongoing */\r
-  if (hspi->hdmatx != NULL)\r
-  {\r
-    if (hspi->hdmatx->XferAbortCallback != NULL)\r
-    {\r
-      return;\r
-    }\r
-  }\r
-\r
-  /* No Abort process still ongoing : All DMA Stream/Channel are aborted, call user Abort Complete callback */\r
-  hspi->RxXferCount = 0U;\r
-  hspi->TxXferCount = 0U;\r
-\r
-  /* Check no error during Abort procedure */\r
-  if (hspi->ErrorCode != HAL_SPI_ERROR_ABORT)\r
-  {\r
-    /* Reset errorCode */\r
-    hspi->ErrorCode = HAL_SPI_ERROR_NONE;\r
-  }\r
-\r
-  /* Clear the Error flags in the SR register */\r
-  __HAL_SPI_CLEAR_OVRFLAG(hspi);\r
-  __HAL_SPI_CLEAR_FREFLAG(hspi);\r
-\r
-  /* Restore hspi->State to Ready */\r
-  hspi->State  = HAL_SPI_STATE_READY;\r
-\r
-  /* Call user Abort complete callback */\r
-#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)\r
-  hspi->AbortCpltCallback(hspi);\r
-#else\r
-  HAL_SPI_AbortCpltCallback(hspi);\r
-#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */\r
-}\r
-\r
-/**\r
-  * @brief  Rx 8-bit handler for Transmit and Receive in Interrupt mode.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval None\r
-  */\r
-static void SPI_2linesRxISR_8BIT(struct __SPI_HandleTypeDef *hspi)\r
-{\r
-  /* Receive data in packing mode */\r
-  if (hspi->RxXferCount > 1U)\r
-  {\r
-    *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)(hspi->Instance->DR);\r
-    hspi->pRxBuffPtr += sizeof(uint16_t);\r
-    hspi->RxXferCount -= 2U;\r
-    if (hspi->RxXferCount == 1U)\r
-    {\r
-      /* Set RX Fifo threshold according the reception data length: 8bit */\r
-      SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);\r
-    }\r
-  }\r
-  /* Receive data in 8 Bit mode */\r
-  else\r
-  {\r
-    *hspi->pRxBuffPtr = *((__IO uint8_t *)&hspi->Instance->DR);\r
-    hspi->pRxBuffPtr++;\r
-    hspi->RxXferCount--;\r
-  }\r
-\r
-  /* Check end of the reception */\r
-  if (hspi->RxXferCount == 0U)\r
-  {\r
-#if (USE_SPI_CRC != 0U)\r
-    if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)\r
-    {\r
-      SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);\r
-      hspi->RxISR =  SPI_2linesRxISR_8BITCRC;\r
-      return;\r
-    }\r
-#endif /* USE_SPI_CRC */\r
-\r
-    /* Disable RXNE  and ERR interrupt */\r
-    __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR));\r
-\r
-    if (hspi->TxXferCount == 0U)\r
-    {\r
-      SPI_CloseRxTx_ISR(hspi);\r
-    }\r
-  }\r
-}\r
-\r
-#if (USE_SPI_CRC != 0U)\r
-/**\r
-  * @brief  Rx 8-bit handler for Transmit and Receive in Interrupt mode.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval None\r
-  */\r
-static void SPI_2linesRxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi)\r
-{\r
-  /* Read 8bit CRC to flush Data Regsiter */\r
-  READ_REG(*(__IO uint8_t *)&hspi->Instance->DR);\r
-\r
-  hspi->CRCSize--;\r
-\r
-  /* Check end of the reception */\r
-  if (hspi->CRCSize == 0U)\r
-  {\r
-    /* Disable RXNE and ERR interrupt */\r
-    __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR));\r
-\r
-    if (hspi->TxXferCount == 0U)\r
-    {\r
-      SPI_CloseRxTx_ISR(hspi);\r
-    }\r
-  }\r
-}\r
-#endif /* USE_SPI_CRC */\r
-\r
-/**\r
-  * @brief  Tx 8-bit handler for Transmit and Receive in Interrupt mode.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval None\r
-  */\r
-static void SPI_2linesTxISR_8BIT(struct __SPI_HandleTypeDef *hspi)\r
-{\r
-  /* Transmit data in packing Bit mode */\r
-  if (hspi->TxXferCount >= 2U)\r
-  {\r
-    hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);\r
-    hspi->pTxBuffPtr += sizeof(uint16_t);\r
-    hspi->TxXferCount -= 2U;\r
-  }\r
-  /* Transmit data in 8 Bit mode */\r
-  else\r
-  {\r
-    *(__IO uint8_t *)&hspi->Instance->DR = (*hspi->pTxBuffPtr);\r
-    hspi->pTxBuffPtr++;\r
-    hspi->TxXferCount--;\r
-  }\r
-\r
-  /* Check the end of the transmission */\r
-  if (hspi->TxXferCount == 0U)\r
-  {\r
-#if (USE_SPI_CRC != 0U)\r
-    if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)\r
-    {\r
-      /* Set CRC Next Bit to send CRC */\r
-      SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);\r
-      /* Disable TXE interrupt */\r
-      __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE);\r
-      return;\r
-    }\r
-#endif /* USE_SPI_CRC */\r
-\r
-    /* Disable TXE interrupt */\r
-    __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE);\r
-\r
-    if (hspi->RxXferCount == 0U)\r
-    {\r
-      SPI_CloseRxTx_ISR(hspi);\r
-    }\r
-  }\r
-}\r
-\r
-/**\r
-  * @brief  Rx 16-bit handler for Transmit and Receive in Interrupt mode.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval None\r
-  */\r
-static void SPI_2linesRxISR_16BIT(struct __SPI_HandleTypeDef *hspi)\r
-{\r
-  /* Receive data in 16 Bit mode */\r
-  *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)(hspi->Instance->DR);\r
-  hspi->pRxBuffPtr += sizeof(uint16_t);\r
-  hspi->RxXferCount--;\r
-\r
-  if (hspi->RxXferCount == 0U)\r
-  {\r
-#if (USE_SPI_CRC != 0U)\r
-    if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)\r
-    {\r
-      hspi->RxISR =  SPI_2linesRxISR_16BITCRC;\r
-      return;\r
-    }\r
-#endif /* USE_SPI_CRC */\r
-\r
-    /* Disable RXNE interrupt */\r
-    __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE);\r
-\r
-    if (hspi->TxXferCount == 0U)\r
-    {\r
-      SPI_CloseRxTx_ISR(hspi);\r
-    }\r
-  }\r
-}\r
-\r
-#if (USE_SPI_CRC != 0U)\r
-/**\r
-  * @brief  Manage the CRC 16-bit receive for Transmit and Receive in Interrupt mode.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval None\r
-  */\r
-static void SPI_2linesRxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi)\r
-{\r
-  /* Read 16bit CRC to flush Data Regsiter */\r
-  READ_REG(hspi->Instance->DR);\r
-\r
-  /* Disable RXNE interrupt */\r
-  __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE);\r
-\r
-  SPI_CloseRxTx_ISR(hspi);\r
-}\r
-#endif /* USE_SPI_CRC */\r
-\r
-/**\r
-  * @brief  Tx 16-bit handler for Transmit and Receive in Interrupt mode.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval None\r
-  */\r
-static void SPI_2linesTxISR_16BIT(struct __SPI_HandleTypeDef *hspi)\r
-{\r
-  /* Transmit data in 16 Bit mode */\r
-  hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);\r
-  hspi->pTxBuffPtr += sizeof(uint16_t);\r
-  hspi->TxXferCount--;\r
-\r
-  /* Enable CRC Transmission */\r
-  if (hspi->TxXferCount == 0U)\r
-  {\r
-#if (USE_SPI_CRC != 0U)\r
-    if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)\r
-    {\r
-      /* Set CRC Next Bit to send CRC */\r
-      SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);\r
-      /* Disable TXE interrupt */\r
-      __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE);\r
-      return;\r
-    }\r
-#endif /* USE_SPI_CRC */\r
-\r
-    /* Disable TXE interrupt */\r
-    __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE);\r
-\r
-    if (hspi->RxXferCount == 0U)\r
-    {\r
-      SPI_CloseRxTx_ISR(hspi);\r
-    }\r
-  }\r
-}\r
-\r
-#if (USE_SPI_CRC != 0U)\r
-/**\r
-  * @brief  Manage the CRC 8-bit receive in Interrupt context.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval None\r
-  */\r
-static void SPI_RxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi)\r
-{\r
-  /* Read 8bit CRC to flush Data Register */\r
-  READ_REG(*(__IO uint8_t *)&hspi->Instance->DR);\r
-\r
-  hspi->CRCSize--;\r
-\r
-  if (hspi->CRCSize == 0U)\r
-  {\r
-    SPI_CloseRx_ISR(hspi);\r
-  }\r
-}\r
-#endif /* USE_SPI_CRC */\r
-\r
-/**\r
-  * @brief  Manage the receive 8-bit in Interrupt context.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval None\r
-  */\r
-static void SPI_RxISR_8BIT(struct __SPI_HandleTypeDef *hspi)\r
-{\r
-  *hspi->pRxBuffPtr = (*(__IO uint8_t *)&hspi->Instance->DR);\r
-  hspi->pRxBuffPtr++;\r
-  hspi->RxXferCount--;\r
-\r
-#if (USE_SPI_CRC != 0U)\r
-  /* Enable CRC Transmission */\r
-  if ((hspi->RxXferCount == 1U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE))\r
-  {\r
-    SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);\r
-  }\r
-#endif /* USE_SPI_CRC */\r
-\r
-  if (hspi->RxXferCount == 0U)\r
-  {\r
-#if (USE_SPI_CRC != 0U)\r
-    if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)\r
-    {\r
-      hspi->RxISR =  SPI_RxISR_8BITCRC;\r
-      return;\r
-    }\r
-#endif /* USE_SPI_CRC */\r
-    SPI_CloseRx_ISR(hspi);\r
-  }\r
-}\r
-\r
-#if (USE_SPI_CRC != 0U)\r
-/**\r
-  * @brief  Manage the CRC 16-bit receive in Interrupt context.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval None\r
-  */\r
-static void SPI_RxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi)\r
-{\r
-  /* Read 16bit CRC to flush Data Register */\r
-  READ_REG(hspi->Instance->DR);\r
-\r
-  /* Disable RXNE and ERR interrupt */\r
-  __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR));\r
-\r
-  SPI_CloseRx_ISR(hspi);\r
-}\r
-#endif /* USE_SPI_CRC */\r
-\r
-/**\r
-  * @brief  Manage the 16-bit receive in Interrupt context.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval None\r
-  */\r
-static void SPI_RxISR_16BIT(struct __SPI_HandleTypeDef *hspi)\r
-{\r
-  *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)(hspi->Instance->DR);\r
-  hspi->pRxBuffPtr += sizeof(uint16_t);\r
-  hspi->RxXferCount--;\r
-\r
-#if (USE_SPI_CRC != 0U)\r
-  /* Enable CRC Transmission */\r
-  if ((hspi->RxXferCount == 1U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE))\r
-  {\r
-    SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);\r
-  }\r
-#endif /* USE_SPI_CRC */\r
-\r
-  if (hspi->RxXferCount == 0U)\r
-  {\r
-#if (USE_SPI_CRC != 0U)\r
-    if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)\r
-    {\r
-      hspi->RxISR = SPI_RxISR_16BITCRC;\r
-      return;\r
-    }\r
-#endif /* USE_SPI_CRC */\r
-    SPI_CloseRx_ISR(hspi);\r
-  }\r
-}\r
-\r
-/**\r
-  * @brief  Handle the data 8-bit transmit in Interrupt mode.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval None\r
-  */\r
-static void SPI_TxISR_8BIT(struct __SPI_HandleTypeDef *hspi)\r
-{\r
-  *(__IO uint8_t *)&hspi->Instance->DR = (*hspi->pTxBuffPtr);\r
-  hspi->pTxBuffPtr++;\r
-  hspi->TxXferCount--;\r
-\r
-  if (hspi->TxXferCount == 0U)\r
-  {\r
-#if (USE_SPI_CRC != 0U)\r
-    if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)\r
-    {\r
-      /* Enable CRC Transmission */\r
-      SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);\r
-    }\r
-#endif /* USE_SPI_CRC */\r
-    SPI_CloseTx_ISR(hspi);\r
-  }\r
-}\r
-\r
-/**\r
-  * @brief  Handle the data 16-bit transmit in Interrupt mode.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval None\r
-  */\r
-static void SPI_TxISR_16BIT(struct __SPI_HandleTypeDef *hspi)\r
-{\r
-  /* Transmit data in 16 Bit mode */\r
-  hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);\r
-  hspi->pTxBuffPtr += sizeof(uint16_t);\r
-  hspi->TxXferCount--;\r
-\r
-  if (hspi->TxXferCount == 0U)\r
-  {\r
-#if (USE_SPI_CRC != 0U)\r
-    if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)\r
-    {\r
-      /* Enable CRC Transmission */\r
-      SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);\r
-    }\r
-#endif /* USE_SPI_CRC */\r
-    SPI_CloseTx_ISR(hspi);\r
-  }\r
-}\r
-\r
-/**\r
-  * @brief  Handle SPI Communication Timeout.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *              the configuration information for SPI module.\r
-  * @param  Flag SPI flag to check\r
-  * @param  State flag state to check\r
-  * @param  Timeout Timeout duration\r
-  * @param  Tickstart tick start value\r
-  * @retval HAL status\r
-  */\r
-static HAL_StatusTypeDef SPI_WaitFlagStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, FlagStatus State,\r
-                                                       uint32_t Timeout, uint32_t Tickstart)\r
-{\r
-  while ((__HAL_SPI_GET_FLAG(hspi, Flag) ? SET : RESET) != State)\r
-  {\r
-    if (Timeout != HAL_MAX_DELAY)\r
-    {\r
-      if (((HAL_GetTick() - Tickstart) >= Timeout) || (Timeout == 0U))\r
-      {\r
-        /* Disable the SPI and reset the CRC: the CRC value should be cleared\r
-        on both master and slave sides in order to resynchronize the master\r
-        and slave for their respective CRC calculation */\r
-\r
-        /* Disable TXE, RXNE and ERR interrupts for the interrupt process */\r
-        __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR));\r
-\r
-        if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE)\r
-                                                     || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY)))\r
-        {\r
-          /* Disable SPI peripheral */\r
-          __HAL_SPI_DISABLE(hspi);\r
-        }\r
-\r
-        /* Reset CRC Calculation */\r
-        if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)\r
-        {\r
-          SPI_RESET_CRC(hspi);\r
-        }\r
-\r
-        hspi->State = HAL_SPI_STATE_READY;\r
-\r
-        /* Process Unlocked */\r
-        __HAL_UNLOCK(hspi);\r
-\r
-        return HAL_TIMEOUT;\r
-      }\r
-    }\r
-  }\r
-\r
-  return HAL_OK;\r
-}\r
-\r
-/**\r
-  * @brief  Handle SPI FIFO Communication Timeout.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *              the configuration information for SPI module.\r
-  * @param  Fifo Fifo to check\r
-  * @param  State Fifo state to check\r
-  * @param  Timeout Timeout duration\r
-  * @param  Tickstart tick start value\r
-  * @retval HAL status\r
-  */\r
-static HAL_StatusTypeDef SPI_WaitFifoStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Fifo, uint32_t State,\r
-                                                       uint32_t Timeout, uint32_t Tickstart)\r
-{\r
-  while ((hspi->Instance->SR & Fifo) != State)\r
-  {\r
-    if ((Fifo == SPI_SR_FRLVL) && (State == SPI_FRLVL_EMPTY))\r
-    {\r
-      /* Read 8bit CRC to flush Data Register */\r
-      READ_REG(*((__IO uint8_t *)&hspi->Instance->DR));\r
-    }\r
-\r
-    if (Timeout != HAL_MAX_DELAY)\r
-    {\r
-      if (((HAL_GetTick() - Tickstart) >= Timeout) || (Timeout == 0U))\r
-      {\r
-        /* Disable the SPI and reset the CRC: the CRC value should be cleared\r
-           on both master and slave sides in order to resynchronize the master\r
-           and slave for their respective CRC calculation */\r
-\r
-        /* Disable TXE, RXNE and ERR interrupts for the interrupt process */\r
-        __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR));\r
-\r
-        if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE)\r
-                                                     || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY)))\r
-        {\r
-          /* Disable SPI peripheral */\r
-          __HAL_SPI_DISABLE(hspi);\r
-        }\r
-\r
-        /* Reset CRC Calculation */\r
-        if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)\r
-        {\r
-          SPI_RESET_CRC(hspi);\r
-        }\r
-\r
-        hspi->State = HAL_SPI_STATE_READY;\r
-\r
-        /* Process Unlocked */\r
-        __HAL_UNLOCK(hspi);\r
-\r
-        return HAL_TIMEOUT;\r
-      }\r
-    }\r
-  }\r
-\r
-  return HAL_OK;\r
-}\r
-\r
-/**\r
-  * @brief  Handle the check of the RX transaction complete.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @param  Timeout Timeout duration\r
-  * @param  Tickstart tick start value\r
-  * @retval HAL status\r
-  */\r
-static HAL_StatusTypeDef SPI_EndRxTransaction(SPI_HandleTypeDef *hspi,  uint32_t Timeout, uint32_t Tickstart)\r
-{\r
-  if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE)\r
-                                               || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY)))\r
-  {\r
-    /* Disable SPI peripheral */\r
-    __HAL_SPI_DISABLE(hspi);\r
-  }\r
-\r
-  /* Control the BSY flag */\r
-  if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, Timeout, Tickstart) != HAL_OK)\r
-  {\r
-    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);\r
-    return HAL_TIMEOUT;\r
-  }\r
-\r
-  if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE)\r
-                                               || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY)))\r
-  {\r
-    /* Empty the FRLVL fifo */\r
-    if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, Timeout, Tickstart) != HAL_OK)\r
-    {\r
-      SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);\r
-      return HAL_TIMEOUT;\r
-    }\r
-  }\r
-  return HAL_OK;\r
-}\r
-\r
-/**\r
-  * @brief  Handle the check of the RXTX or TX transaction complete.\r
-  * @param  hspi SPI handle\r
-  * @param  Timeout Timeout duration\r
-  * @param  Tickstart tick start value\r
-  * @retval HAL status\r
-  */\r
-static HAL_StatusTypeDef SPI_EndRxTxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart)\r
-{\r
-  /* Control if the TX fifo is empty */\r
-  if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FTLVL, SPI_FTLVL_EMPTY, Timeout, Tickstart) != HAL_OK)\r
-  {\r
-    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);\r
-    return HAL_TIMEOUT;\r
-  }\r
-\r
-  /* Control the BSY flag */\r
-  if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, Timeout, Tickstart) != HAL_OK)\r
-  {\r
-    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);\r
-    return HAL_TIMEOUT;\r
-  }\r
-\r
-  /* Control if the RX fifo is empty */\r
-  if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, Timeout, Tickstart) != HAL_OK)\r
-  {\r
-    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);\r
-    return HAL_TIMEOUT;\r
-  }\r
-\r
-  return HAL_OK;\r
-}\r
-\r
-/**\r
-  * @brief  Handle the end of the RXTX transaction.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval None\r
-  */\r
-static void SPI_CloseRxTx_ISR(SPI_HandleTypeDef *hspi)\r
-{\r
-  uint32_t tickstart;\r
-\r
-  /* Init tickstart for timeout managment*/\r
-  tickstart = HAL_GetTick();\r
-\r
-  /* Disable ERR interrupt */\r
-  __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR);\r
-\r
-  /* Check the end of the transaction */\r
-  if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)\r
-  {\r
-    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);\r
-  }\r
-\r
-#if (USE_SPI_CRC != 0U)\r
-  /* Check if CRC error occurred */\r
-  if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET)\r
-  {\r
-    hspi->State = HAL_SPI_STATE_READY;\r
-    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);\r
-    __HAL_SPI_CLEAR_CRCERRFLAG(hspi);\r
-    /* Call user error callback */\r
-#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)\r
-    hspi->ErrorCallback(hspi);\r
-#else\r
-    HAL_SPI_ErrorCallback(hspi);\r
-#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */\r
-  }\r
-  else\r
-  {\r
-#endif /* USE_SPI_CRC */\r
-    if (hspi->ErrorCode == HAL_SPI_ERROR_NONE)\r
-    {\r
-      if (hspi->State == HAL_SPI_STATE_BUSY_RX)\r
-      {\r
-        hspi->State = HAL_SPI_STATE_READY;\r
-        /* Call user Rx complete callback */\r
-#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)\r
-        hspi->RxCpltCallback(hspi);\r
-#else\r
-        HAL_SPI_RxCpltCallback(hspi);\r
-#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */\r
-      }\r
-      else\r
-      {\r
-        hspi->State = HAL_SPI_STATE_READY;\r
-        /* Call user TxRx complete callback */\r
-#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)\r
-        hspi->TxRxCpltCallback(hspi);\r
-#else\r
-        HAL_SPI_TxRxCpltCallback(hspi);\r
-#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */\r
-      }\r
-    }\r
-    else\r
-    {\r
-      hspi->State = HAL_SPI_STATE_READY;\r
-      /* Call user error callback */\r
-#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)\r
-      hspi->ErrorCallback(hspi);\r
-#else\r
-      HAL_SPI_ErrorCallback(hspi);\r
-#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */\r
-    }\r
-#if (USE_SPI_CRC != 0U)\r
-  }\r
-#endif /* USE_SPI_CRC */\r
-}\r
-\r
-/**\r
-  * @brief  Handle the end of the RX transaction.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval None\r
-  */\r
-static void SPI_CloseRx_ISR(SPI_HandleTypeDef *hspi)\r
-{\r
-  /* Disable RXNE and ERR interrupt */\r
-  __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR));\r
-\r
-  /* Check the end of the transaction */\r
-  if (SPI_EndRxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)\r
-  {\r
-    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);\r
-  }\r
-  hspi->State = HAL_SPI_STATE_READY;\r
-\r
-#if (USE_SPI_CRC != 0U)\r
-  /* Check if CRC error occurred */\r
-  if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET)\r
-  {\r
-    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);\r
-    __HAL_SPI_CLEAR_CRCERRFLAG(hspi);\r
-    /* Call user error callback */\r
-#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)\r
-    hspi->ErrorCallback(hspi);\r
-#else\r
-    HAL_SPI_ErrorCallback(hspi);\r
-#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */\r
-  }\r
-  else\r
-  {\r
-#endif /* USE_SPI_CRC */\r
-    if (hspi->ErrorCode == HAL_SPI_ERROR_NONE)\r
-    {\r
-      /* Call user Rx complete callback */\r
-#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)\r
-      hspi->RxCpltCallback(hspi);\r
-#else\r
-      HAL_SPI_RxCpltCallback(hspi);\r
-#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */\r
-    }\r
-    else\r
-    {\r
-      /* Call user error callback */\r
-#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)\r
-      hspi->ErrorCallback(hspi);\r
-#else\r
-      HAL_SPI_ErrorCallback(hspi);\r
-#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */\r
-    }\r
-#if (USE_SPI_CRC != 0U)\r
-  }\r
-#endif /* USE_SPI_CRC */\r
-}\r
-\r
-/**\r
-  * @brief  Handle the end of the TX transaction.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval None\r
-  */\r
-static void SPI_CloseTx_ISR(SPI_HandleTypeDef *hspi)\r
-{\r
-  uint32_t tickstart;\r
-\r
-  /* Init tickstart for timeout management*/\r
-  tickstart = HAL_GetTick();\r
-\r
-  /* Disable TXE and ERR interrupt */\r
-  __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_ERR));\r
-\r
-  /* Check the end of the transaction */\r
-  if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)\r
-  {\r
-    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);\r
-  }\r
-\r
-  /* Clear overrun flag in 2 Lines communication mode because received is not read */\r
-  if (hspi->Init.Direction == SPI_DIRECTION_2LINES)\r
-  {\r
-    __HAL_SPI_CLEAR_OVRFLAG(hspi);\r
-  }\r
-\r
-  hspi->State = HAL_SPI_STATE_READY;\r
-  if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)\r
-  {\r
-    /* Call user error callback */\r
-#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)\r
-    hspi->ErrorCallback(hspi);\r
-#else\r
-    HAL_SPI_ErrorCallback(hspi);\r
-#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */\r
-  }\r
-  else\r
-  {\r
-    /* Call user Rx complete callback */\r
-#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)\r
-    hspi->TxCpltCallback(hspi);\r
-#else\r
-    HAL_SPI_TxCpltCallback(hspi);\r
-#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */\r
-  }\r
-}\r
-\r
-/**\r
-  * @brief  Handle abort a Rx transaction.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval None\r
-  */\r
-static void SPI_AbortRx_ISR(SPI_HandleTypeDef *hspi)\r
-{\r
-  __IO uint32_t count;\r
-\r
-  /* Disable SPI Peripheral */\r
-  __HAL_SPI_DISABLE(hspi);\r
-\r
-  count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U);\r
-\r
-  /* Disable RXNEIE interrupt */\r
-  CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_RXNEIE));\r
-\r
-  /* Check RXNEIE is disabled */\r
-  do\r
-  {\r
-    if (count == 0U)\r
-    {\r
-      SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);\r
-      break;\r
-    }\r
-    count--;\r
-  }\r
-  while (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE));\r
-\r
-  /* Control the BSY flag */\r
-  if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)\r
-  {\r
-    hspi->ErrorCode = HAL_SPI_ERROR_ABORT;\r
-  }\r
-\r
-  /* Empty the FRLVL fifo */\r
-  if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)\r
-  {\r
-    hspi->ErrorCode = HAL_SPI_ERROR_ABORT;\r
-  }\r
-\r
-  hspi->State = HAL_SPI_STATE_ABORT;\r
-}\r
-\r
-/**\r
-  * @brief  Handle abort a Tx or Rx/Tx transaction.\r
-  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains\r
-  *               the configuration information for SPI module.\r
-  * @retval None\r
-  */\r
-static void SPI_AbortTx_ISR(SPI_HandleTypeDef *hspi)\r
-{\r
-  __IO uint32_t count;\r
-\r
-  count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U);\r
-\r
-  /* Disable TXEIE interrupt */\r
-  CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXEIE));\r
-\r
-  /* Check TXEIE is disabled */\r
-  do\r
-  {\r
-    if (count == 0U)\r
-    {\r
-      SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);\r
-      break;\r
-    }\r
-    count--;\r
-  }\r
-  while (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXEIE));\r
-\r
-  if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)\r
-  {\r
-    hspi->ErrorCode = HAL_SPI_ERROR_ABORT;\r
-  }\r
-\r
-  /* Disable SPI Peripheral */\r
-  __HAL_SPI_DISABLE(hspi);\r
-\r
-  /* Empty the FRLVL fifo */\r
-  if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)\r
-  {\r
-    hspi->ErrorCode = HAL_SPI_ERROR_ABORT;\r
-  }\r
-\r
-  /* Check case of Full-Duplex Mode and disable directly RXNEIE interrupt */\r
-  if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE))\r
-  {\r
-    /* Disable RXNEIE interrupt */\r
-    CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_RXNEIE));\r
-\r
-    /* Check RXNEIE is disabled */\r
-    do\r
-    {\r
-      if (count == 0U)\r
-      {\r
-        SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);\r
-        break;\r
-      }\r
-      count--;\r
-    }\r
-    while (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE));\r
-\r
-    /* Control the BSY flag */\r
-    if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)\r
-    {\r
-      hspi->ErrorCode = HAL_SPI_ERROR_ABORT;\r
-    }\r
-\r
-    /* Empty the FRLVL fifo */\r
-    if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)\r
-    {\r
-      hspi->ErrorCode = HAL_SPI_ERROR_ABORT;\r
-    }\r
-  }\r
-  hspi->State = HAL_SPI_STATE_ABORT;\r
-}\r
-\r
-/**\r
-  * @}\r
-  */\r
-\r
-#endif /* HAL_SPI_MODULE_ENABLED */\r
-\r
-/**\r
-  * @}\r
-  */\r
-\r
-/**\r
-  * @}\r
-  */\r
-\r
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\r