2 ******************************************************************************
\r
3 * @file stm32f4xx_hal_spi.c
\r
4 * @author MCD Application Team
\r
6 * @date 18-February-2014
\r
7 * @brief SPI HAL module driver.
\r
9 * This file provides firmware functions to manage the following
\r
10 * functionalities of the Serial Peripheral Interface (SPI) peripheral:
\r
11 * + Initialization and de-initialization functions
\r
12 * + IO operation functions
\r
13 * + Peripheral Control functions
\r
14 * + Peripheral State functions
\r
16 ==============================================================================
\r
17 ##### How to use this driver #####
\r
18 ==============================================================================
\r
20 The SPI HAL driver can be used as follows:
\r
22 (#) Declare a SPI_HandleTypeDef handle structure, for example:
\r
23 SPI_HandleTypeDef hspi;
\r
25 (#)Initialize the SPI low level resources by implement the HAL_SPI_MspInit ()API:
\r
26 (##) Enable the SPIx interface clock
\r
27 (##) SPI pins configuration
\r
28 (+++) Enable the clock for the SPI GPIOs
\r
29 (+++) Configure these SPI pins as alternate function push-pull
\r
30 (##) NVIC configuration if you need to use interrupt process
\r
31 (+++) Configure the SPIx interrupt priority
\r
32 (+++) Enable the NVIC SPI IRQ handle
\r
33 (##) DMA Configuration if you need to use DMA process
\r
34 (+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive stream
\r
35 (+++) Enable the DMAx interface clock using
\r
36 (+++) Configure the DMA handle parameters
\r
37 (+++) Configure the DMA Tx or Rx Stream
\r
38 (+++) Associate the initilalized hdma_tx handle to the hspi DMA Tx or Rx handle
\r
39 (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx or Rx Stream
\r
41 (#) Program the Mode, Direction , Data size, Baudrate Prescaler, NSS
\r
42 management, Clock polarity and phase, FirstBit and CRC configuration in the hspi Init structure.
\r
44 (#) Initialize the SPI registers by calling the HAL_SPI_Init() API:
\r
45 (++) This API configures also the low level Hardware GPIO, CLOCK, CORTEX...etc)
\r
46 by calling the customed HAL_SPI_MspInit(&hspi) API.
\r
49 ******************************************************************************
\r
52 * <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
\r
54 * Redistribution and use in source and binary forms, with or without modification,
\r
55 * are permitted provided that the following conditions are met:
\r
56 * 1. Redistributions of source code must retain the above copyright notice,
\r
57 * this list of conditions and the following disclaimer.
\r
58 * 2. Redistributions in binary form must reproduce the above copyright notice,
\r
59 * this list of conditions and the following disclaimer in the documentation
\r
60 * and/or other materials provided with the distribution.
\r
61 * 3. Neither the name of STMicroelectronics nor the names of its contributors
\r
62 * may be used to endorse or promote products derived from this software
\r
63 * without specific prior written permission.
\r
65 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
\r
66 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
\r
67 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
\r
68 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
\r
69 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
\r
70 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
\r
71 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
\r
72 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
\r
73 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
\r
74 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\r
76 ******************************************************************************
\r
79 /* Includes ------------------------------------------------------------------*/
\r
80 #include "stm32f4xx_hal.h"
\r
82 /** @addtogroup STM32F4xx_HAL_Driver
\r
87 * @brief SPI HAL module driver
\r
91 #ifdef HAL_SPI_MODULE_ENABLED
\r
93 /* Private typedef -----------------------------------------------------------*/
\r
94 /* Private define ------------------------------------------------------------*/
\r
95 #define SPI_TIMEOUT_VALUE 10
\r
96 /* Private macro -------------------------------------------------------------*/
\r
97 /* Private variables ---------------------------------------------------------*/
\r
98 /* Private function prototypes -----------------------------------------------*/
\r
99 static void SPI_TxCloseIRQHandler(SPI_HandleTypeDef *hspi);
\r
100 static void SPI_TxISR(SPI_HandleTypeDef *hspi);
\r
101 static void SPI_RxCloseIRQHandler(SPI_HandleTypeDef *hspi);
\r
102 static void SPI_2LinesRxISR(SPI_HandleTypeDef *hspi);
\r
103 static void SPI_RxISR(SPI_HandleTypeDef *hspi);
\r
104 static void SPI_DMATransmitCplt(DMA_HandleTypeDef *hdma);
\r
105 static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma);
\r
106 static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma);
\r
107 static void SPI_DMAError(DMA_HandleTypeDef *hdma);
\r
108 static HAL_StatusTypeDef SPI_WaitOnFlagUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, FlagStatus Status, uint32_t Timeout);
\r
110 /* Private functions ---------------------------------------------------------*/
\r
112 /** @defgroup SPI_Private_Functions
\r
116 /** @defgroup SPI_Group1 Initialization and de-initialization functions
\r
117 * @brief Initialization and Configuration functions
\r
120 ===============================================================================
\r
121 ##### Initialization and de-initialization functions #####
\r
122 ===============================================================================
\r
123 [..] This subsection provides a set of functions allowing to initialize and
\r
124 de-initialiaze the SPIx peripheral:
\r
126 (+) User must Implement HAL_SPI_MspInit() function in which he configures
\r
127 all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC ).
\r
129 (+) Call the function HAL_SPI_Init() to configure the selected device with
\r
130 the selected configuration:
\r
134 (++) Clock Polarity and Phase
\r
135 (++) NSS Management
\r
136 (++) BaudRate Prescaler
\r
139 (++) CRC Calculation
\r
140 (++) CRC Polynomial if CRC enabled
\r
142 (+) Call the function HAL_SPI_DeInit() to restore the default configuration
\r
143 of the selected SPIx periperal.
\r
150 * @brief Initializes the SPI according to the specified parameters
\r
151 * in the SPI_InitTypeDef and create the associated handle.
\r
152 * @param hspi: SPI handle
\r
153 * @retval HAL status
\r
155 HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi)
\r
157 /* Check the SPI handle allocation */
\r
163 /* Check the parameters */
\r
164 assert_param(IS_SPI_MODE(hspi->Init.Mode));
\r
165 assert_param(IS_SPI_DIRECTION_MODE(hspi->Init.Direction));
\r
166 assert_param(IS_SPI_DATASIZE(hspi->Init.DataSize));
\r
167 assert_param(IS_SPI_CPOL(hspi->Init.CLKPolarity));
\r
168 assert_param(IS_SPI_CPHA(hspi->Init.CLKPhase));
\r
169 assert_param(IS_SPI_NSS(hspi->Init.NSS));
\r
170 assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler));
\r
171 assert_param(IS_SPI_FIRST_BIT(hspi->Init.FirstBit));
\r
172 assert_param(IS_SPI_TIMODE(hspi->Init.TIMode));
\r
173 assert_param(IS_SPI_CRC_CALCULATION(hspi->Init.CRCCalculation));
\r
174 assert_param(IS_SPI_CRC_POLYNOMIAL(hspi->Init.CRCPolynomial));
\r
176 if(hspi->State == HAL_SPI_STATE_RESET)
\r
178 /* Init the low level hardware : GPIO, CLOCK, NVIC... */
\r
179 HAL_SPI_MspInit(hspi);
\r
182 hspi->State = HAL_SPI_STATE_BUSY;
\r
184 /* Disble the selected SPI peripheral */
\r
185 __HAL_SPI_DISABLE(hspi);
\r
187 /*----------------------- SPIx CR1 & CR2 Configuration ---------------------*/
\r
188 /* Configure : SPI Mode, Communication Mode, Data size, Clock polarity and phase, NSS management,
\r
189 Communication speed, First bit and CRC calculation state */
\r
190 hspi->Instance->CR1 = (hspi->Init.Mode | hspi->Init.Direction | hspi->Init.DataSize |
\r
191 hspi->Init.CLKPolarity | hspi->Init.CLKPhase | (hspi->Init.NSS & SPI_CR1_SSM) |
\r
192 hspi->Init.BaudRatePrescaler | hspi->Init.FirstBit | hspi->Init.CRCCalculation);
\r
194 /* Configure : NSS management */
\r
195 hspi->Instance->CR2 = (((hspi->Init.NSS >> 16) & SPI_CR2_SSOE) | hspi->Init.TIMode);
\r
197 /*---------------------------- SPIx CRCPOLY Configuration ------------------*/
\r
198 /* Configure : CRC Polynomial */
\r
199 hspi->Instance->CRCPR = hspi->Init.CRCPolynomial;
\r
201 /* Activate the SPI mode (Make sure that I2SMOD bit in I2SCFGR register is reset) */
\r
202 hspi->Instance->I2SCFGR &= (uint32_t)(~SPI_I2SCFGR_I2SMOD);
\r
204 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
\r
205 hspi->State = HAL_SPI_STATE_READY;
\r
211 * @brief DeInitializes the SPI peripheral
\r
212 * @param hspi: SPI handle
\r
213 * @retval HAL status
\r
215 HAL_StatusTypeDef HAL_SPI_DeInit(SPI_HandleTypeDef *hspi)
\r
217 /* Check the SPI handle allocation */
\r
223 /* Disable the SPI Peripheral Clock */
\r
224 __HAL_SPI_DISABLE(hspi);
\r
226 /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */
\r
227 HAL_SPI_MspDeInit(hspi);
\r
229 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
\r
230 hspi->State = HAL_SPI_STATE_RESET;
\r
233 __HAL_UNLOCK(hspi);
\r
239 * @brief SPI MSP Init
\r
240 * @param hspi: SPI handle
\r
243 __weak void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
\r
245 /* NOTE : This function Should not be modified, when the callback is needed,
\r
246 the HAL_SPI_MspInit could be implenetd in the user file
\r
251 * @brief SPI MSP DeInit
\r
252 * @param hspi: SPI handle
\r
255 __weak void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi)
\r
257 /* NOTE : This function Should not be modified, when the callback is needed,
\r
258 the HAL_SPI_MspDeInit could be implenetd in the user file
\r
266 /** @defgroup SPI_Group2 IO operation functions
\r
267 * @brief Data transfers functions
\r
270 ==============================================================================
\r
271 ##### IO operation functions #####
\r
272 ===============================================================================
\r
273 This subsection provides a set of functions allowing to manage the SPI
\r
276 [..] The SPI supports master and slave mode :
\r
278 (#) There are two mode of transfer:
\r
279 (++) Blocking mode: The communication is performed in polling mode.
\r
280 The HAL status of all data processing is returned by the same function
\r
281 after finishing transfer.
\r
282 (++) No-Blocking mode: The communication is performed using Interrupts
\r
283 or DMA, These API's return the HAL status.
\r
284 The end of the data processing will be indicated through the
\r
285 dedicated SPI IRQ when using Interrupt mode or the DMA IRQ when
\r
287 The HAL_SPI_TxCpltCallback(), HAL_SPI_RxCpltCallback() and HAL_SPI_TxRxCpltCallback() user callbacks
\r
288 will be executed respectivelly at the end of the transmit or Receive process
\r
289 The HAL_SPI_ErrorCallback()user callback will be executed when a communication error is detected
\r
291 (#) Blocking mode API's are :
\r
292 (++) HAL_SPI_Transmit()in 1Line (simplex) and 2Lines (full duplex) mode
\r
293 (++) HAL_SPI_Receive() in 1Line (simplex) and 2Lines (full duplex) mode
\r
294 (++) HAL_SPI_TransmitReceive() in full duplex mode
\r
296 (#) Non-Blocking mode API's with Interrupt are :
\r
297 (++) HAL_SPI_Transmit_IT()in 1Line (simplex) and 2Lines (full duplex) mode
\r
298 (++) HAL_SPI_Receive_IT() in 1Line (simplex) and 2Lines (full duplex) mode
\r
299 (++) HAL_SPI_TransmitReceive_IT()in full duplex mode
\r
300 (++) HAL_SPI_IRQHandler()
\r
302 (#) No-Blocking mode functions with DMA are :
\r
303 (++) HAL_SPI_Transmit_DMA()in 1Line (simplex) and 2Lines (full duplex) mode
\r
304 (++) HAL_SPI_Receive_DMA() in 1Line (simplex) and 2Lines (full duplex) mode
\r
305 (++) HAL_SPI_TransmitReceie_DMA() in full duplex mode
\r
307 (#) A set of Transfer Complete Callbacks are provided in No_Blocking mode:
\r
308 (++) HAL_SPI_TxCpltCallback()
\r
309 (++) HAL_SPI_RxCpltCallback()
\r
310 (++) HAL_SPI_ErrorCallback()
\r
311 (++) HAL_SPI_TxRxCpltCallback()
\r
318 * @brief Transmit an amount of data in blocking mode
\r
319 * @param hspi: SPI handle
\r
320 * @param pData: pointer to data buffer
\r
321 * @param Size: amount of data to be sent
\r
322 * @param Timeout: Timeout duration
\r
323 * @retval HAL status
\r
325 HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)
\r
328 if(hspi->State == HAL_SPI_STATE_READY)
\r
330 if((pData == NULL ) || (Size == 0))
\r
335 /* Check the parameters */
\r
336 assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction));
\r
338 /* Process Locked */
\r
341 /* Configure communication */
\r
342 hspi->State = HAL_SPI_STATE_BUSY_TX;
\r
343 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
\r
345 hspi->pTxBuffPtr = pData;
\r
346 hspi->TxXferSize = Size;
\r
347 hspi->TxXferCount = Size;
\r
349 /*Init field not used in handle to zero */
\r
352 hspi->RxXferSize = 0;
\r
353 hspi->RxXferCount = 0;
\r
355 /* Reset CRC Calculation */
\r
356 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
\r
358 __HAL_SPI_RESET_CRC(hspi);
\r
361 if(hspi->Init.Direction == SPI_DIRECTION_1LINE)
\r
363 /* Configure communication direction : 1Line */
\r
364 __HAL_SPI_1LINE_TX(hspi);
\r
367 /* Check if the SPI is already enabled */
\r
368 if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE)
\r
370 /* Enable SPI peripheral */
\r
371 __HAL_SPI_ENABLE(hspi);
\r
374 /* Transmit data in 8 Bit mode */
\r
375 if(hspi->Init.DataSize == SPI_DATASIZE_8BIT)
\r
378 hspi->Instance->DR = (*hspi->pTxBuffPtr++);
\r
379 hspi->TxXferCount--;
\r
381 while(hspi->TxXferCount > 0)
\r
383 /* Wait until TXE flag is set to send data */
\r
384 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, Timeout) != HAL_OK)
\r
386 return HAL_TIMEOUT;
\r
388 hspi->Instance->DR = (*hspi->pTxBuffPtr++);
\r
389 hspi->TxXferCount--;
\r
391 /* Enable CRC Transmission */
\r
392 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
\r
394 hspi->Instance->CR1 |= SPI_CR1_CRCNEXT;
\r
397 /* Transmit data in 16 Bit mode */
\r
400 hspi->Instance->DR = *((uint16_t*)hspi->pTxBuffPtr);
\r
401 hspi->pTxBuffPtr+=2;
\r
402 hspi->TxXferCount--;
\r
404 while(hspi->TxXferCount > 0)
\r
406 /* Wait until TXE flag is set to send data */
\r
407 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, Timeout) != HAL_OK)
\r
409 return HAL_TIMEOUT;
\r
411 hspi->Instance->DR = *((uint16_t*)hspi->pTxBuffPtr);
\r
412 hspi->pTxBuffPtr+=2;
\r
413 hspi->TxXferCount--;
\r
415 /* Enable CRC Transmission */
\r
416 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
\r
418 hspi->Instance->CR1 |= SPI_CR1_CRCNEXT;
\r
422 /* Wait until TXE flag is set to send data */
\r
423 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, Timeout) != HAL_OK)
\r
425 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
\r
426 return HAL_TIMEOUT;
\r
429 /* Wait until Busy flag is reset before disabling SPI */
\r
430 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_BSY, SET, Timeout) != HAL_OK)
\r
432 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
\r
433 return HAL_TIMEOUT;
\r
436 /* Clear OVERUN flag in 2 Lines communication mode because received is not read */
\r
437 if(hspi->Init.Direction == SPI_DIRECTION_2LINES)
\r
439 __HAL_SPI_CLEAR_OVRFLAG(hspi);
\r
442 hspi->State = HAL_SPI_STATE_READY;
\r
444 /* Process Unlocked */
\r
445 __HAL_UNLOCK(hspi);
\r
456 * @brief Receive an amount of data in blocking mode
\r
457 * @param hspi: SPI handle
\r
458 * @param pData: pointer to data buffer
\r
459 * @param Size: amount of data to be sent
\r
460 * @param Timeout: Timeout duration
\r
461 * @retval HAL status
\r
463 HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)
\r
465 __IO uint16_t tmpreg = 0;
\r
469 if(hspi->State == HAL_SPI_STATE_READY)
\r
471 if((pData == NULL ) || (Size == 0))
\r
476 /* Process Locked */
\r
479 /* Configure communication */
\r
480 hspi->State = HAL_SPI_STATE_BUSY_RX;
\r
481 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
\r
483 hspi->pRxBuffPtr = pData;
\r
484 hspi->RxXferSize = Size;
\r
485 hspi->RxXferCount = Size;
\r
487 /*Init field not used in handle to zero */
\r
490 hspi->TxXferSize = 0;
\r
491 hspi->TxXferCount = 0;
\r
493 /* Configure communication direction : 1Line */
\r
494 if(hspi->Init.Direction == SPI_DIRECTION_1LINE)
\r
496 __HAL_SPI_1LINE_RX(hspi);
\r
499 /* Reset CRC Calculation */
\r
500 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
\r
502 __HAL_SPI_RESET_CRC(hspi);
\r
505 if((hspi->Init.Mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES))
\r
507 /* Process Unlocked */
\r
508 __HAL_UNLOCK(hspi);
\r
510 /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */
\r
511 return HAL_SPI_TransmitReceive(hspi, pData, pData, Size, Timeout);
\r
514 /* Check if the SPI is already enabled */
\r
515 if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE)
\r
517 /* Enable SPI peripheral */
\r
518 __HAL_SPI_ENABLE(hspi);
\r
521 /* Receive data in 8 Bit mode */
\r
522 if(hspi->Init.DataSize == SPI_DATASIZE_8BIT)
\r
524 while(hspi->RxXferCount > 1)
\r
526 /* Wait until RXNE flag is set */
\r
527 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK)
\r
529 return HAL_TIMEOUT;
\r
532 (*hspi->pRxBuffPtr++) = hspi->Instance->DR;
\r
533 hspi->RxXferCount--;
\r
535 /* Enable CRC Transmission */
\r
536 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
\r
538 hspi->Instance->CR1 |= SPI_CR1_CRCNEXT;
\r
541 /* Receive data in 16 Bit mode */
\r
544 while(hspi->RxXferCount > 1)
\r
546 /* Wait until RXNE flag is set to read data */
\r
547 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK)
\r
549 return HAL_TIMEOUT;
\r
552 *((uint16_t*)hspi->pRxBuffPtr) = hspi->Instance->DR;
\r
553 hspi->pRxBuffPtr+=2;
\r
554 hspi->RxXferCount--;
\r
556 /* Enable CRC Transmission */
\r
557 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
\r
559 hspi->Instance->CR1 |= SPI_CR1_CRCNEXT;
\r
563 /* Wait until RXNE flag is set */
\r
564 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK)
\r
566 return HAL_TIMEOUT;
\r
569 /* Receive last data in 8 Bit mode */
\r
570 if(hspi->Init.DataSize == SPI_DATASIZE_8BIT)
\r
572 (*hspi->pRxBuffPtr++) = hspi->Instance->DR;
\r
574 /* Receive last data in 16 Bit mode */
\r
577 *((uint16_t*)hspi->pRxBuffPtr) = hspi->Instance->DR;
\r
578 hspi->pRxBuffPtr+=2;
\r
580 hspi->RxXferCount--;
\r
582 /* Wait until RXNE flag is set: CRC Received */
\r
583 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
\r
585 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK)
\r
587 hspi->ErrorCode |= HAL_SPI_ERROR_CRC;
\r
588 return HAL_TIMEOUT;
\r
591 /* Read CRC to Flush RXNE flag */
\r
592 tmpreg = hspi->Instance->DR;
\r
595 if((hspi->Init.Mode == SPI_MODE_MASTER)&&((hspi->Init.Direction == SPI_DIRECTION_1LINE)||(hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY)))
\r
597 /* Disable SPI peripheral */
\r
598 __HAL_SPI_DISABLE(hspi);
\r
601 hspi->State = HAL_SPI_STATE_READY;
\r
603 tmp = __HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR);
\r
604 /* Check if CRC error occurred */
\r
605 if((hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED) && (tmp != RESET))
\r
607 hspi->ErrorCode |= HAL_SPI_ERROR_CRC;
\r
609 /* Reset CRC Calculation */
\r
610 __HAL_SPI_RESET_CRC(hspi);
\r
612 /* Process Unlocked */
\r
613 __HAL_UNLOCK(hspi);
\r
618 /* Process Unlocked */
\r
619 __HAL_UNLOCK(hspi);
\r
630 * @brief Transmit and Receive an amount of data in blocking mode
\r
631 * @param hspi: SPI handle
\r
632 * @param pTxData: pointer to transmission data buffer
\r
633 * @param pRxData: pointer to reception data buffer to be
\r
634 * @param Size: amount of data to be sent
\r
635 * @param Timeout: Timeout duration
\r
636 * @retval HAL status
\r
638 HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)
\r
640 __IO uint16_t tmpreg = 0;
\r
644 tmp = hspi->State;
\r
645 if((tmp == HAL_SPI_STATE_READY) || (tmp == HAL_SPI_STATE_BUSY_RX))
\r
647 if((pTxData == NULL ) || (pRxData == NULL ) || (Size == 0))
\r
652 /* Check the parameters */
\r
653 assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));
\r
655 /* Process Locked */
\r
658 /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */
\r
659 if(hspi->State == HAL_SPI_STATE_READY)
\r
661 hspi->State = HAL_SPI_STATE_BUSY_TX_RX;
\r
664 /* Configure communication */
\r
665 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
\r
667 hspi->pRxBuffPtr = pRxData;
\r
668 hspi->RxXferSize = Size;
\r
669 hspi->RxXferCount = Size;
\r
671 hspi->pTxBuffPtr = pTxData;
\r
672 hspi->TxXferSize = Size;
\r
673 hspi->TxXferCount = Size;
\r
675 /*Init field not used in handle to zero */
\r
679 /* Reset CRC Calculation */
\r
680 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
\r
682 __HAL_SPI_RESET_CRC(hspi);
\r
685 /* Check if the SPI is already enabled */
\r
686 if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE)
\r
688 /* Enable SPI peripheral */
\r
689 __HAL_SPI_ENABLE(hspi);
\r
692 /* Transmit and Receive data in 16 Bit mode */
\r
693 if(hspi->Init.DataSize == SPI_DATASIZE_16BIT)
\r
695 hspi->Instance->DR = *((uint16_t*)hspi->pTxBuffPtr);
\r
696 hspi->pTxBuffPtr+=2;
\r
697 hspi->TxXferCount--;
\r
699 if(hspi->TxXferCount == 0)
\r
701 /* Enable CRC Transmission */
\r
702 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
\r
704 hspi->Instance->CR1 |= SPI_CR1_CRCNEXT;
\r
707 /* Wait until RXNE flag is set */
\r
708 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK)
\r
710 return HAL_TIMEOUT;
\r
713 *((uint16_t*)hspi->pRxBuffPtr) = hspi->Instance->DR;
\r
714 hspi->pRxBuffPtr+=2;
\r
715 hspi->RxXferCount--;
\r
719 while(hspi->TxXferCount > 0)
\r
721 /* Wait until TXE flag is set to send data */
\r
722 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, Timeout) != HAL_OK)
\r
724 return HAL_TIMEOUT;
\r
727 hspi->Instance->DR = *((uint16_t*)hspi->pTxBuffPtr);
\r
728 hspi->pTxBuffPtr+=2;
\r
729 hspi->TxXferCount--;
\r
731 /* Enable CRC Transmission */
\r
732 if((hspi->TxXferCount == 0) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED))
\r
734 hspi->Instance->CR1 |= SPI_CR1_CRCNEXT;
\r
737 /* Wait until RXNE flag is set */
\r
738 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK)
\r
740 return HAL_TIMEOUT;
\r
743 *((uint16_t*)hspi->pRxBuffPtr) = hspi->Instance->DR;
\r
744 hspi->pRxBuffPtr+=2;
\r
745 hspi->RxXferCount--;
\r
748 /* Wait until RXNE flag is set */
\r
749 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK)
\r
751 return HAL_TIMEOUT;
\r
754 *((uint16_t*)hspi->pRxBuffPtr) = hspi->Instance->DR;
\r
755 hspi->pRxBuffPtr+=2;
\r
756 hspi->RxXferCount--;
\r
759 /* Transmit and Receive data in 8 Bit mode */
\r
763 hspi->Instance->DR = (*hspi->pTxBuffPtr++);
\r
764 hspi->TxXferCount--;
\r
766 if(hspi->TxXferCount == 0)
\r
768 /* Enable CRC Transmission */
\r
769 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
\r
771 hspi->Instance->CR1 |= SPI_CR1_CRCNEXT;
\r
774 /* Wait until RXNE flag is set */
\r
775 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK)
\r
777 return HAL_TIMEOUT;
\r
780 (*hspi->pRxBuffPtr) = hspi->Instance->DR;
\r
781 hspi->RxXferCount--;
\r
785 while(hspi->TxXferCount > 0)
\r
787 /* Wait until TXE flag is set to send data */
\r
788 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, Timeout) != HAL_OK)
\r
790 return HAL_TIMEOUT;
\r
793 hspi->Instance->DR = (*hspi->pTxBuffPtr++);
\r
794 hspi->TxXferCount--;
\r
796 /* Enable CRC Transmission */
\r
797 if((hspi->TxXferCount == 0) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED))
\r
799 hspi->Instance->CR1 |= SPI_CR1_CRCNEXT;
\r
802 /* Wait until RXNE flag is set */
\r
803 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK)
\r
805 return HAL_TIMEOUT;
\r
808 (*hspi->pRxBuffPtr++) = hspi->Instance->DR;
\r
809 hspi->RxXferCount--;
\r
812 /* Wait until RXNE flag is set */
\r
813 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK)
\r
815 return HAL_TIMEOUT;
\r
818 (*hspi->pRxBuffPtr++) = hspi->Instance->DR;
\r
819 hspi->RxXferCount--;
\r
823 /* Read CRC from DR to close CRC calculation process */
\r
824 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
\r
826 /* Wait until RXNE flag is set */
\r
827 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK)
\r
829 hspi->ErrorCode |= HAL_SPI_ERROR_CRC;
\r
830 return HAL_TIMEOUT;
\r
833 tmpreg = hspi->Instance->DR;
\r
836 /* Wait until Busy flag is reset before disabling SPI */
\r
837 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_BSY, SET, Timeout) != HAL_OK)
\r
839 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
\r
840 return HAL_TIMEOUT;
\r
843 hspi->State = HAL_SPI_STATE_READY;
\r
845 tmp = __HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR);
\r
846 /* Check if CRC error occurred */
\r
847 if((hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED) && (tmp != RESET))
\r
849 hspi->ErrorCode |= HAL_SPI_ERROR_CRC;
\r
851 /* Reset CRC Calculation */
\r
852 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
\r
854 __HAL_SPI_RESET_CRC(hspi);
\r
857 /* Process Unlocked */
\r
858 __HAL_UNLOCK(hspi);
\r
863 /* Process Unlocked */
\r
864 __HAL_UNLOCK(hspi);
\r
875 * @brief Transmit an amount of data in no-blocking mode with Interrupt
\r
876 * @param hspi: SPI handle
\r
877 * @param pData: pointer to data buffer
\r
878 * @param Size: amount of data to be sent
\r
879 * @retval HAL status
\r
881 HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
\r
883 if(hspi->State == HAL_SPI_STATE_READY)
\r
885 if((pData == NULL) || (Size == 0))
\r
890 /* Check the parameters */
\r
891 assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction));
\r
893 /* Process Locked */
\r
896 /* Configure communication */
\r
897 hspi->State = HAL_SPI_STATE_BUSY_TX;
\r
898 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
\r
900 hspi->TxISR = &SPI_TxISR;
\r
901 hspi->pTxBuffPtr = pData;
\r
902 hspi->TxXferSize = Size;
\r
903 hspi->TxXferCount = Size;
\r
905 /*Init field not used in handle to zero */
\r
907 hspi->RxXferSize = 0;
\r
908 hspi->RxXferCount = 0;
\r
910 /* Configure communication direction : 1Line */
\r
911 if(hspi->Init.Direction == SPI_DIRECTION_1LINE)
\r
913 __HAL_SPI_1LINE_TX(hspi);
\r
916 /* Reset CRC Calculation */
\r
917 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
\r
919 __HAL_SPI_RESET_CRC(hspi);
\r
922 if (hspi->Init.Direction == SPI_DIRECTION_2LINES)
\r
924 __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE));
\r
927 /* Enable TXE and ERR interrupt */
\r
928 __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_ERR));
\r
930 /* Process Unlocked */
\r
931 __HAL_UNLOCK(hspi);
\r
933 /* Check if the SPI is already enabled */
\r
934 if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE)
\r
936 /* Enable SPI peripheral */
\r
937 __HAL_SPI_ENABLE(hspi);
\r
949 * @brief Receive an amount of data in no-blocking mode with Interrupt
\r
950 * @param hspi: SPI handle
\r
951 * @param pData: pointer to data buffer
\r
952 * @param Size: amount of data to be sent
\r
953 * @retval HAL status
\r
955 HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
\r
957 if(hspi->State == HAL_SPI_STATE_READY)
\r
959 if((pData == NULL) || (Size == 0))
\r
964 /* Process Locked */
\r
967 /* Configure communication */
\r
968 hspi->State = HAL_SPI_STATE_BUSY_RX;
\r
969 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
\r
971 hspi->RxISR = &SPI_RxISR;
\r
972 hspi->pRxBuffPtr = pData;
\r
973 hspi->RxXferSize = Size;
\r
974 hspi->RxXferCount = Size ;
\r
976 /*Init field not used in handle to zero */
\r
978 hspi->TxXferSize = 0;
\r
979 hspi->TxXferCount = 0;
\r
981 /* Configure communication direction : 1Line */
\r
982 if(hspi->Init.Direction == SPI_DIRECTION_1LINE)
\r
984 __HAL_SPI_1LINE_RX(hspi);
\r
986 else if((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER))
\r
988 /* Process Unlocked */
\r
989 __HAL_UNLOCK(hspi);
\r
991 /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */
\r
992 return HAL_SPI_TransmitReceive_IT(hspi, pData, pData, Size);
\r
995 /* Reset CRC Calculation */
\r
996 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
\r
998 __HAL_SPI_RESET_CRC(hspi);
\r
1001 /* Enable TXE and ERR interrupt */
\r
1002 __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR));
\r
1004 /* Process Unlocked */
\r
1005 __HAL_UNLOCK(hspi);
\r
1007 /* Note : The SPI must be enabled after unlocking current process
\r
1008 to avoid the risk of SPI interrupt handle execution before current
\r
1011 /* Check if the SPI is already enabled */
\r
1012 if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE)
\r
1014 /* Enable SPI peripheral */
\r
1015 __HAL_SPI_ENABLE(hspi);
\r
1027 * @brief Transmit and Receive an amount of data in no-blocking mode with Interrupt
\r
1028 * @param hspi: SPI handle
\r
1029 * @param pTxData: pointer to transmission data buffer
\r
1030 * @param pRxData: pointer to reception data buffer to be
\r
1031 * @param Size: amount of data to be sent
\r
1032 * @retval HAL status
\r
1034 HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size)
\r
1038 tmp = hspi->State;
\r
1039 if((tmp == HAL_SPI_STATE_READY) || (tmp == HAL_SPI_STATE_BUSY_RX))
\r
1041 if((pTxData == NULL ) || (pRxData == NULL ) || (Size == 0))
\r
1046 /* Check the parameters */
\r
1047 assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));
\r
1049 /* Process locked */
\r
1052 /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */
\r
1053 if(hspi->State == HAL_SPI_STATE_READY)
\r
1055 hspi->State = HAL_SPI_STATE_BUSY_TX_RX;
\r
1058 /* Configure communication */
\r
1059 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
\r
1061 hspi->TxISR = &SPI_TxISR;
\r
1062 hspi->pTxBuffPtr = pTxData;
\r
1063 hspi->TxXferSize = Size;
\r
1064 hspi->TxXferCount = Size;
\r
1066 hspi->RxISR = &SPI_2LinesRxISR;
\r
1067 hspi->pRxBuffPtr = pRxData;
\r
1068 hspi->RxXferSize = Size;
\r
1069 hspi->RxXferCount = Size;
\r
1071 /* Reset CRC Calculation */
\r
1072 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
\r
1074 __HAL_SPI_RESET_CRC(hspi);
\r
1077 /* Enable TXE, RXNE and ERR interrupt */
\r
1078 __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR));
\r
1080 /* Process Unlocked */
\r
1081 __HAL_UNLOCK(hspi);
\r
1083 /* Check if the SPI is already enabled */
\r
1084 if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE)
\r
1086 /* Enable SPI peripheral */
\r
1087 __HAL_SPI_ENABLE(hspi);
\r
1099 * @brief Transmit an amount of data in no-blocking mode with DMA
\r
1100 * @param hspi: SPI handle
\r
1101 * @param pData: pointer to data buffer
\r
1102 * @param Size: amount of data to be sent
\r
1103 * @retval HAL status
\r
1105 HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
\r
1107 if(hspi->State == HAL_SPI_STATE_READY)
\r
1109 if((pData == NULL) || (Size == 0))
\r
1114 /* Check the parameters */
\r
1115 assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction));
\r
1117 /* Process Locked */
\r
1120 /* Configure communication */
\r
1121 hspi->State = HAL_SPI_STATE_BUSY_TX;
\r
1122 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
\r
1124 hspi->pTxBuffPtr = pData;
\r
1125 hspi->TxXferSize = Size;
\r
1126 hspi->TxXferCount = Size;
\r
1128 /*Init field not used in handle to zero */
\r
1131 hspi->RxXferSize = 0;
\r
1132 hspi->RxXferCount = 0;
\r
1134 /* Configure communication direction : 1Line */
\r
1135 if(hspi->Init.Direction == SPI_DIRECTION_1LINE)
\r
1137 __HAL_SPI_1LINE_TX(hspi);
\r
1140 /* Reset CRC Calculation */
\r
1141 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
\r
1143 __HAL_SPI_RESET_CRC(hspi);
\r
1146 /* Set the SPI TxDMA transfer complete callback */
\r
1147 hspi->hdmatx->XferCpltCallback = SPI_DMATransmitCplt;
\r
1149 /* Set the DMA error callback */
\r
1150 hspi->hdmatx->XferErrorCallback = SPI_DMAError;
\r
1152 /* Enable the Tx DMA Stream */
\r
1153 HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instance->DR, hspi->TxXferCount);
\r
1155 /* Enable Tx DMA Request */
\r
1156 hspi->Instance->CR2 |= SPI_CR2_TXDMAEN;
\r
1158 /* Process Unlocked */
\r
1159 __HAL_UNLOCK(hspi);
\r
1161 /* Check if the SPI is already enabled */
\r
1162 if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE)
\r
1164 /* Enable SPI peripheral */
\r
1165 __HAL_SPI_ENABLE(hspi);
\r
1177 * @brief Receive an amount of data in no-blocking mode with DMA
\r
1178 * @param hspi: SPI handle
\r
1179 * @param pData: pointer to data buffer
\r
1180 * @note When the CRC feature is enabled the pData Length must be Size + 1.
\r
1181 * @param Size: amount of data to be sent
\r
1182 * @retval HAL status
\r
1184 HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
\r
1186 if(hspi->State == HAL_SPI_STATE_READY)
\r
1188 if((pData == NULL) || (Size == 0))
\r
1193 /* Process Locked */
\r
1196 /* Configure communication */
\r
1197 hspi->State = HAL_SPI_STATE_BUSY_RX;
\r
1198 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
\r
1200 hspi->pRxBuffPtr = pData;
\r
1201 hspi->RxXferSize = Size;
\r
1202 hspi->RxXferCount = Size;
\r
1204 /*Init field not used in handle to zero */
\r
1207 hspi->TxXferSize = 0;
\r
1208 hspi->TxXferCount = 0;
\r
1210 /* Configure communication direction : 1Line */
\r
1211 if(hspi->Init.Direction == SPI_DIRECTION_1LINE)
\r
1213 __HAL_SPI_1LINE_RX(hspi);
\r
1215 else if((hspi->Init.Direction == SPI_DIRECTION_2LINES)&&(hspi->Init.Mode == SPI_MODE_MASTER))
\r
1217 /* Process Unlocked */
\r
1218 __HAL_UNLOCK(hspi);
\r
1220 /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */
\r
1221 return HAL_SPI_TransmitReceive_DMA(hspi, pData, pData, Size);
\r
1224 /* Reset CRC Calculation */
\r
1225 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
\r
1227 __HAL_SPI_RESET_CRC(hspi);
\r
1230 /* Set the SPI Rx DMA transfer complete callback */
\r
1231 hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt;
\r
1233 /* Set the DMA error callback */
\r
1234 hspi->hdmarx->XferErrorCallback = SPI_DMAError;
\r
1236 /* Enable the Rx DMA Stream */
\r
1237 HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBuffPtr, hspi->RxXferCount);
\r
1239 /* Enable Rx DMA Request */
\r
1240 hspi->Instance->CR2 |= SPI_CR2_RXDMAEN;
\r
1242 /* Process Unlocked */
\r
1243 __HAL_UNLOCK(hspi);
\r
1245 /* Check if the SPI is already enabled */
\r
1246 if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE)
\r
1248 /* Enable SPI peripheral */
\r
1249 __HAL_SPI_ENABLE(hspi);
\r
1261 * @brief Transmit and Receive an amount of data in no-blocking mode with DMA
\r
1262 * @param hspi: SPI handle
\r
1263 * @param pTxData: pointer to transmission data buffer
\r
1264 * @param pRxData: pointer to reception data buffer
\r
1265 * @note When the CRC feature is enabled the pRxData Length must be Size + 1
\r
1266 * @param Size: amount of data to be sent
\r
1267 * @retval HAL status
\r
1269 HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size)
\r
1271 uint32_t tmpstate = 0;
\r
1272 tmpstate = hspi->State;
\r
1273 if((tmpstate == HAL_SPI_STATE_READY) || (tmpstate == HAL_SPI_STATE_BUSY_RX))
\r
1275 if((pTxData == NULL ) || (pRxData == NULL ) || (Size == 0))
\r
1280 /* Check the parameters */
\r
1281 assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));
\r
1283 /* Process locked */
\r
1286 /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */
\r
1287 if(hspi->State == HAL_SPI_STATE_READY)
\r
1289 hspi->State = HAL_SPI_STATE_BUSY_TX_RX;
\r
1292 /* Configure communication */
\r
1293 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
\r
1295 hspi->pTxBuffPtr = (uint8_t*)pTxData;
\r
1296 hspi->TxXferSize = Size;
\r
1297 hspi->TxXferCount = Size;
\r
1299 hspi->pRxBuffPtr = (uint8_t*)pRxData;
\r
1300 hspi->RxXferSize = Size;
\r
1301 hspi->RxXferCount = Size;
\r
1303 /*Init field not used in handle to zero */
\r
1307 /* Reset CRC Calculation */
\r
1308 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
\r
1310 __HAL_SPI_RESET_CRC(hspi);
\r
1313 /* Check if we are in Rx only or in Rx/Tx Mode and configure the DMA transfer complete callback */
\r
1314 if(hspi->State == HAL_SPI_STATE_BUSY_RX)
\r
1316 hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt;
\r
1320 hspi->hdmarx->XferCpltCallback = SPI_DMATransmitReceiveCplt;
\r
1323 /* Set the DMA error callback */
\r
1324 hspi->hdmarx->XferErrorCallback = SPI_DMAError;
\r
1326 /* Enable the Rx DMA Stream */
\r
1327 HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBuffPtr, hspi->RxXferCount);
\r
1329 /* Enable Rx DMA Request */
\r
1330 hspi->Instance->CR2 |= SPI_CR2_RXDMAEN;
\r
1332 /* Set the SPI Tx DMA transfer complete callback as NULL because the communication closing
\r
1333 is performed in DMA reception complete callback */
\r
1334 hspi->hdmatx->XferCpltCallback = NULL;
\r
1336 /* Set the DMA error callback */
\r
1337 hspi->hdmatx->XferErrorCallback = SPI_DMAError;
\r
1339 /* Enable the Tx DMA Stream */
\r
1340 HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instance->DR, hspi->TxXferCount);
\r
1342 /* Enable Tx DMA Request */
\r
1343 hspi->Instance->CR2 |= SPI_CR2_TXDMAEN;
\r
1345 /* Process Unlocked */
\r
1346 __HAL_UNLOCK(hspi);
\r
1348 /* Check if the SPI is already enabled */
\r
1349 if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE)
\r
1351 /* Enable SPI peripheral */
\r
1352 __HAL_SPI_ENABLE(hspi);
\r
1364 * @brief This function handles SPI interrupt request.
\r
1365 * @param hspi: SPI handle
\r
1366 * @retval HAL status
\r
1368 void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi)
\r
1370 uint32_t tmp1 = 0, tmp2 = 0, tmp3 = 0;
\r
1372 tmp1 = __HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE);
\r
1373 tmp2 = __HAL_SPI_GET_IT_SOURCE(hspi, SPI_IT_RXNE);
\r
1374 tmp3 = __HAL_SPI_GET_FLAG(hspi, SPI_FLAG_OVR);
\r
1375 /* SPI in mode Receiver and Overrun not occurred ---------------------------*/
\r
1376 if((tmp1 != RESET) && (tmp2 != RESET) && (tmp3 == RESET))
\r
1378 hspi->RxISR(hspi);
\r
1382 tmp1 = __HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE);
\r
1383 tmp2 = __HAL_SPI_GET_IT_SOURCE(hspi, SPI_IT_TXE);
\r
1384 /* SPI in mode Tramitter ---------------------------------------------------*/
\r
1385 if((tmp1 != RESET) && (tmp2 != RESET))
\r
1387 hspi->TxISR(hspi);
\r
1391 if(__HAL_SPI_GET_IT_SOURCE(hspi, SPI_IT_ERR) != RESET)
\r
1393 /* SPI CRC error interrupt occured ---------------------------------------*/
\r
1394 if(__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET)
\r
1396 hspi->ErrorCode |= HAL_SPI_ERROR_CRC;
\r
1397 __HAL_SPI_CLEAR_CRCERRFLAG(hspi);
\r
1399 /* SPI Mode Fault error interrupt occured --------------------------------*/
\r
1400 if(__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_MODF) != RESET)
\r
1402 hspi->ErrorCode |= HAL_SPI_ERROR_MODF;
\r
1403 __HAL_SPI_CLEAR_MODFFLAG(hspi);
\r
1406 /* SPI Overrun error interrupt occured -----------------------------------*/
\r
1407 if(__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_OVR) != RESET)
\r
1409 if(hspi->State != HAL_SPI_STATE_BUSY_TX)
\r
1411 hspi->ErrorCode |= HAL_SPI_ERROR_OVR;
\r
1412 __HAL_SPI_CLEAR_OVRFLAG(hspi);
\r
1416 /* SPI Frame error interrupt occured -------------------------------------*/
\r
1417 if(__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_FRE) != RESET)
\r
1419 hspi->ErrorCode |= HAL_SPI_ERROR_FRE;
\r
1420 __HAL_SPI_CLEAR_FREFLAG(hspi);
\r
1423 /* Call the Error call Back in case of Errors */
\r
1424 if(hspi->ErrorCode!=HAL_SPI_ERROR_NONE)
\r
1426 hspi->State = HAL_SPI_STATE_READY;
\r
1427 HAL_SPI_ErrorCallback(hspi);
\r
1433 * @brief Tx Transfer completed callbacks
\r
1434 * @param hspi: SPI handle
\r
1437 __weak void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
\r
1439 /* NOTE : This function Should not be modified, when the callback is needed,
\r
1440 the HAL_SPI_TxCpltCallback could be implenetd in the user file
\r
1445 * @brief Rx Transfer completed callbacks
\r
1446 * @param hspi: SPI handle
\r
1449 __weak void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
\r
1451 /* NOTE : This function Should not be modified, when the callback is needed,
\r
1452 the HAL_SPI_RxCpltCallback() could be implenetd in the user file
\r
1457 * @brief Tx and Rx Transfer completed callbacks
\r
1458 * @param hspi: SPI handle
\r
1461 __weak void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
\r
1463 /* NOTE : This function Should not be modified, when the callback is needed,
\r
1464 the HAL_SPI_TxRxCpltCallback() could be implenetd in the user file
\r
1469 * @brief SPI error callbacks
\r
1470 * @param hspi: SPI handle
\r
1473 __weak void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi)
\r
1475 /* NOTE : - This function Should not be modified, when the callback is needed,
\r
1476 the HAL_SPI_ErrorCallback() could be implenetd in the user file.
\r
1477 - The ErrorCode parameter in the hspi handle is updated by the SPI processes
\r
1478 and user can use HAL_SPI_GetError() API to check the latest error occured.
\r
1486 /** @defgroup SPI_Group3 Peripheral State and Errors functions
\r
1487 * @brief SPI control functions
\r
1490 ===============================================================================
\r
1491 ##### Peripheral State and Errors functions #####
\r
1492 ===============================================================================
\r
1494 This subsection provides a set of functions allowing to control the SPI.
\r
1495 (+) HAL_SPI_GetState() API can be helpful to check in run-time the state of the SPI peripheral
\r
1496 (+) HAL_SPI_GetError() check in run-time Errors occurring during communication
\r
1502 * @brief Return the SPI state
\r
1503 * @param hspi : SPI handle
\r
1504 * @retval SPI state
\r
1506 HAL_SPI_StateTypeDef HAL_SPI_GetState(SPI_HandleTypeDef *hspi)
\r
1508 return hspi->State;
\r
1512 * @brief Return the SPI error code
\r
1513 * @param hspi : SPI handle
\r
1514 * @retval SPI Error Code
\r
1516 HAL_SPI_ErrorTypeDef HAL_SPI_GetError(SPI_HandleTypeDef *hspi)
\r
1518 return hspi->ErrorCode;
\r
1526 * @brief Interrupt Handler to close Tx transfer
\r
1527 * @param hspi: SPI handle
\r
1530 static void SPI_TxCloseIRQHandler(SPI_HandleTypeDef *hspi)
\r
1532 /* Wait until TXE flag is set to send data */
\r
1533 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, SPI_TIMEOUT_VALUE) != HAL_OK)
\r
1535 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
\r
1538 /* Disable TXE interrupt */
\r
1539 __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE ));
\r
1541 /* Disable ERR interrupt if Receive process is finished */
\r
1542 if(__HAL_SPI_GET_IT_SOURCE(hspi, SPI_IT_RXNE) == RESET)
\r
1544 __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_ERR));
\r
1546 /* Wait until Busy flag is reset before disabling SPI */
\r
1547 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_BSY, SET, SPI_TIMEOUT_VALUE) != HAL_OK)
\r
1549 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
\r
1552 /* Clear OVERUN flag in 2 Lines communication mode because received is not read */
\r
1553 if(hspi->Init.Direction == SPI_DIRECTION_2LINES)
\r
1555 __HAL_SPI_CLEAR_OVRFLAG(hspi);
\r
1558 /* Check if Errors has been detected during transfer */
\r
1559 if(hspi->ErrorCode == HAL_SPI_ERROR_NONE)
\r
1561 /* Check if we are in Tx or in Rx/Tx Mode */
\r
1562 if(hspi->State == HAL_SPI_STATE_BUSY_TX_RX)
\r
1564 /* Set state to READY before run the Callback Complete */
\r
1565 hspi->State = HAL_SPI_STATE_READY;
\r
1566 HAL_SPI_TxRxCpltCallback(hspi);
\r
1570 /* Set state to READY before run the Callback Complete */
\r
1571 hspi->State = HAL_SPI_STATE_READY;
\r
1572 HAL_SPI_TxCpltCallback(hspi);
\r
1577 /* Set state to READY before run the Callback Complete */
\r
1578 hspi->State = HAL_SPI_STATE_READY;
\r
1579 /* Call Error call back in case of Error */
\r
1580 HAL_SPI_ErrorCallback(hspi);
\r
1586 * @brief Interrupt Handler to transmit amount of data in no-blocking mode
\r
1587 * @param hspi: SPI handle
\r
1590 static void SPI_TxISR(SPI_HandleTypeDef *hspi)
\r
1592 /* Transmit data in 8 Bit mode */
\r
1593 if(hspi->Init.DataSize == SPI_DATASIZE_8BIT)
\r
1595 hspi->Instance->DR = (*hspi->pTxBuffPtr++);
\r
1597 /* Transmit data in 16 Bit mode */
\r
1600 hspi->Instance->DR = *((uint16_t*)hspi->pTxBuffPtr);
\r
1601 hspi->pTxBuffPtr+=2;
\r
1603 hspi->TxXferCount--;
\r
1605 if(hspi->TxXferCount == 0)
\r
1607 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
\r
1609 /* calculate and transfer CRC on Tx line */
\r
1610 hspi->Instance->CR1 |= SPI_CR1_CRCNEXT;
\r
1612 SPI_TxCloseIRQHandler(hspi);
\r
1617 * @brief Interrupt Handler to close Rx transfer
\r
1618 * @param hspi: SPI handle
\r
1621 static void SPI_RxCloseIRQHandler(SPI_HandleTypeDef *hspi)
\r
1623 __IO uint16_t tmpreg = 0;
\r
1625 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
\r
1627 /* Wait until RXNE flag is set to send data */
\r
1628 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, SPI_TIMEOUT_VALUE) != HAL_OK)
\r
1630 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
\r
1633 /* Read CRC to reset RXNE flag */
\r
1634 tmpreg = hspi->Instance->DR;
\r
1636 /* Wait until RXNE flag is set to send data */
\r
1637 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_TIMEOUT_VALUE) != HAL_OK)
\r
1639 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
\r
1642 /* Check if CRC error occurred */
\r
1643 if(__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET)
\r
1645 hspi->ErrorCode |= HAL_SPI_ERROR_CRC;
\r
1647 /* Reset CRC Calculation */
\r
1648 __HAL_SPI_RESET_CRC(hspi);
\r
1652 /* Disable RXNE and ERR interrupt */
\r
1653 __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE));
\r
1655 /* if Transmit process is finished */
\r
1656 if(__HAL_SPI_GET_IT_SOURCE(hspi, SPI_IT_TXE) == RESET)
\r
1658 /* Disable ERR interrupt */
\r
1659 __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_ERR));
\r
1661 if((hspi->Init.Mode == SPI_MODE_MASTER)&&((hspi->Init.Direction == SPI_DIRECTION_1LINE)||(hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY)))
\r
1663 /* Disable SPI peripheral */
\r
1664 __HAL_SPI_DISABLE(hspi);
\r
1667 /* Check if Errors has been detected during transfer */
\r
1668 if(hspi->ErrorCode == HAL_SPI_ERROR_NONE)
\r
1670 /* Check if we are in Rx or in Rx/Tx Mode */
\r
1671 if(hspi->State == HAL_SPI_STATE_BUSY_TX_RX)
\r
1673 /* Set state to READY before run the Callback Complete */
\r
1674 hspi->State = HAL_SPI_STATE_READY;
\r
1675 HAL_SPI_TxRxCpltCallback(hspi);
\r
1678 /* Set state to READY before run the Callback Complete */
\r
1679 hspi->State = HAL_SPI_STATE_READY;
\r
1680 HAL_SPI_RxCpltCallback(hspi);
\r
1685 /* Set state to READY before run the Callback Complete */
\r
1686 hspi->State = HAL_SPI_STATE_READY;
\r
1687 /* Call Error call back in case of Error */
\r
1688 HAL_SPI_ErrorCallback(hspi);
\r
1694 * @brief Interrupt Handler to receive amount of data in 2Lines mode
\r
1695 * @param hspi: SPI handle
\r
1698 static void SPI_2LinesRxISR(SPI_HandleTypeDef *hspi)
\r
1700 /* Receive data in 8 Bit mode */
\r
1701 if(hspi->Init.DataSize == SPI_DATASIZE_8BIT)
\r
1703 (*hspi->pRxBuffPtr++) = hspi->Instance->DR;
\r
1705 /* Receive data in 16 Bit mode */
\r
1708 *((uint16_t*)hspi->pRxBuffPtr) = hspi->Instance->DR;
\r
1709 hspi->pRxBuffPtr+=2;
\r
1711 hspi->RxXferCount--;
\r
1713 if(hspi->RxXferCount==0)
\r
1715 SPI_RxCloseIRQHandler(hspi);
\r
1720 * @brief Interrupt Handler to receive amount of data in no-blocking mode
\r
1721 * @param hspi: SPI handle
\r
1724 static void SPI_RxISR(SPI_HandleTypeDef *hspi)
\r
1726 /* Receive data in 8 Bit mode */
\r
1727 if(hspi->Init.DataSize == SPI_DATASIZE_8BIT)
\r
1729 (*hspi->pRxBuffPtr++) = hspi->Instance->DR;
\r
1731 /* Receive data in 16 Bit mode */
\r
1734 *((uint16_t*)hspi->pRxBuffPtr) = hspi->Instance->DR;
\r
1735 hspi->pRxBuffPtr+=2;
\r
1737 hspi->RxXferCount--;
\r
1739 /* Enable CRC Transmission */
\r
1740 if((hspi->RxXferCount == 1) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED))
\r
1742 /* Set CRC Next to calculate CRC on Rx side */
\r
1743 hspi->Instance->CR1 |= SPI_CR1_CRCNEXT;
\r
1746 if(hspi->RxXferCount == 0)
\r
1748 SPI_RxCloseIRQHandler(hspi);
\r
1753 * @brief DMA SPI transmit process complete callback
\r
1754 * @param hdma : DMA handle
\r
1757 static void SPI_DMATransmitCplt(DMA_HandleTypeDef *hdma)
\r
1759 SPI_HandleTypeDef* hspi = ( SPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
\r
1761 /* Wait until TXE flag is set to send data */
\r
1762 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, SPI_TIMEOUT_VALUE) != HAL_OK)
\r
1764 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
\r
1767 /* Disable Tx DMA Request */
\r
1768 hspi->Instance->CR2 &= (uint32_t)(~SPI_CR2_TXDMAEN);
\r
1770 /* Wait until Busy flag is reset before disabling SPI */
\r
1771 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_BSY, SET, SPI_TIMEOUT_VALUE) != HAL_OK)
\r
1773 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
\r
1776 hspi->TxXferCount = 0;
\r
1778 hspi->State = HAL_SPI_STATE_READY;
\r
1780 /* Clear OVERUN flag in 2 Lines communication mode because received is not read */
\r
1781 if(hspi->Init.Direction == SPI_DIRECTION_2LINES)
\r
1783 __HAL_SPI_CLEAR_OVRFLAG(hspi);
\r
1786 /* Check if Errors has been detected during transfer */
\r
1787 if(hspi->ErrorCode != HAL_SPI_ERROR_NONE)
\r
1789 HAL_SPI_ErrorCallback(hspi);
\r
1793 HAL_SPI_TxCpltCallback(hspi);
\r
1798 * @brief DMA SPI receive process complete callback
\r
1799 * @param hdma : DMA handle
\r
1802 static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
\r
1804 __IO uint16_t tmpreg = 0;
\r
1806 SPI_HandleTypeDef* hspi = ( SPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
\r
1808 if((hspi->Init.Mode == SPI_MODE_MASTER)&&((hspi->Init.Direction == SPI_DIRECTION_1LINE)||(hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY)))
\r
1810 /* Disable SPI peripheral */
\r
1811 __HAL_SPI_DISABLE(hspi);
\r
1814 /* Disable Rx DMA Request */
\r
1815 hspi->Instance->CR2 &= (uint32_t)(~SPI_CR2_RXDMAEN);
\r
1817 /* Reset CRC Calculation */
\r
1818 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
\r
1820 /* Wait until RXNE flag is set to send data */
\r
1821 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, SPI_TIMEOUT_VALUE) != HAL_OK)
\r
1823 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
\r
1827 tmpreg = hspi->Instance->DR;
\r
1829 /* Wait until RXNE flag is set to send data */
\r
1830 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_TIMEOUT_VALUE) != HAL_OK)
\r
1832 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
\r
1836 hspi->RxXferCount = 0;
\r
1837 hspi->State = HAL_SPI_STATE_READY;
\r
1839 /* Check if CRC error occurred */
\r
1840 if(__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET)
\r
1842 hspi->ErrorCode |= HAL_SPI_ERROR_CRC;
\r
1843 __HAL_SPI_CLEAR_CRCERRFLAG(hspi);
\r
1846 /* Check if Errors has been detected during transfer */
\r
1847 if(hspi->ErrorCode != HAL_SPI_ERROR_NONE)
\r
1849 HAL_SPI_ErrorCallback(hspi);
\r
1853 HAL_SPI_RxCpltCallback(hspi);
\r
1858 * @brief DMA SPI transmit receive process complete callback
\r
1859 * @param hdma : DMA handle
\r
1862 static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma)
\r
1864 __IO uint16_t tmpreg = 0;
\r
1866 SPI_HandleTypeDef* hspi = ( SPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
\r
1868 /* Reset CRC Calculation */
\r
1869 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
\r
1871 /* Check if CRC is done on going (RXNE flag set) */
\r
1872 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_TIMEOUT_VALUE) == HAL_OK)
\r
1874 /* Wait until RXNE flag is set to send data */
\r
1875 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, SPI_TIMEOUT_VALUE) != HAL_OK)
\r
1877 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
\r
1881 tmpreg = hspi->Instance->DR;
\r
1884 /* Wait until TXE flag is set to send data */
\r
1885 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, SPI_TIMEOUT_VALUE) != HAL_OK)
\r
1887 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
\r
1889 /* Disable Tx DMA Request */
\r
1890 hspi->Instance->CR2 &= (uint32_t)(~SPI_CR2_TXDMAEN);
\r
1892 /* Wait until Busy flag is reset before disabling SPI */
\r
1893 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_BSY, SET, SPI_TIMEOUT_VALUE) != HAL_OK)
\r
1895 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
\r
1898 /* Disable Rx DMA Request */
\r
1899 hspi->Instance->CR2 &= (uint32_t)(~SPI_CR2_RXDMAEN);
\r
1901 hspi->TxXferCount = 0;
\r
1902 hspi->RxXferCount = 0;
\r
1904 hspi->State = HAL_SPI_STATE_READY;
\r
1906 /* Check if CRC error occurred */
\r
1907 if(__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET)
\r
1909 hspi->ErrorCode |= HAL_SPI_ERROR_CRC;
\r
1910 __HAL_SPI_CLEAR_CRCERRFLAG(hspi);
\r
1913 /* Check if Errors has been detected during transfer */
\r
1914 if(hspi->ErrorCode != HAL_SPI_ERROR_NONE)
\r
1916 HAL_SPI_ErrorCallback(hspi);
\r
1920 HAL_SPI_TxRxCpltCallback(hspi);
\r
1925 * @brief DMA SPI communication error callback
\r
1926 * @param hdma : DMA handle
\r
1929 static void SPI_DMAError(DMA_HandleTypeDef *hdma)
\r
1931 SPI_HandleTypeDef* hspi = (SPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
\r
1932 hspi->TxXferCount = 0;
\r
1933 hspi->RxXferCount = 0;
\r
1934 hspi->State= HAL_SPI_STATE_READY;
\r
1935 hspi->ErrorCode |= HAL_SPI_ERROR_DMA;
\r
1936 HAL_SPI_ErrorCallback(hspi);
\r
1940 * @brief This function handles SPI Communication Timeout.
\r
1941 * @param hspi: SPI handle
\r
1942 * @retval HAL status
\r
1944 static HAL_StatusTypeDef SPI_WaitOnFlagUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, FlagStatus Status, uint32_t Timeout)
\r
1946 uint32_t timeout = 0;
\r
1948 timeout = HAL_GetTick() + Timeout;
\r
1950 /* Wait until flag is set */
\r
1951 if(Status == RESET)
\r
1953 while(__HAL_SPI_GET_FLAG(hspi, Flag) == RESET)
\r
1955 if(Timeout != HAL_MAX_DELAY)
\r
1957 if(HAL_GetTick() >= timeout)
\r
1959 /* Disable the SPI and reset the CRC: the CRC value should be cleared
\r
1960 on both master and slave sides in order to resynchronize the master
\r
1961 and slave for their respective CRC calculation */
\r
1963 /* Disable TXE, RXNE and ERR interrupts for the interrupt process */
\r
1964 __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR));
\r
1966 /* Disable SPI peripheral */
\r
1967 __HAL_SPI_DISABLE(hspi);
\r
1969 /* Reset CRC Calculation */
\r
1970 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
\r
1972 __HAL_SPI_RESET_CRC(hspi);
\r
1975 hspi->State= HAL_SPI_STATE_READY;
\r
1977 /* Process Unlocked */
\r
1978 __HAL_UNLOCK(hspi);
\r
1980 return HAL_TIMEOUT;
\r
1987 while(__HAL_SPI_GET_FLAG(hspi, Flag) != RESET)
\r
1989 if(Timeout != HAL_MAX_DELAY)
\r
1991 if(HAL_GetTick() >= timeout)
\r
1993 /* Disable the SPI and reset the CRC: the CRC value should be cleared
\r
1994 on both master and slave sides in order to resynchronize the master
\r
1995 and slave for their respective CRC calculation */
\r
1997 /* Disable TXE, RXNE and ERR interrupts for the interrupt process */
\r
1998 __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR));
\r
2000 /* Disable SPI peripheral */
\r
2001 __HAL_SPI_DISABLE(hspi);
\r
2003 /* Reset CRC Calculation */
\r
2004 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
\r
2006 __HAL_SPI_RESET_CRC(hspi);
\r
2009 hspi->State= HAL_SPI_STATE_READY;
\r
2011 /* Process Unlocked */
\r
2012 __HAL_UNLOCK(hspi);
\r
2014 return HAL_TIMEOUT;
\r
2027 #endif /* HAL_SPI_MODULE_ENABLED */
\r
2036 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
\r