mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Mon Nov 03 10:15:07 2014 +0000
Revision:
380:510f0c3515e3
Parent:
targets/cmsis/TARGET_STM/TARGET_NUCLEO_F401RE/stm32f4xx_hal_spi.c@369:2e96f1b71984
Child:
532:fe11edbda85c
Synchronized with git revision 417f470ba9f4882d7079611cbc576afd9c49b0ef

Full URL: https://github.com/mbedmicro/mbed/commit/417f470ba9f4882d7079611cbc576afd9c49b0ef/

Targets: Factorisation of NUCLEO_F401RE and F411RE cmsis folders

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 87:085cde657901 1 /**
mbed_official 87:085cde657901 2 ******************************************************************************
mbed_official 87:085cde657901 3 * @file stm32f4xx_hal_spi.c
mbed_official 87:085cde657901 4 * @author MCD Application Team
mbed_official 369:2e96f1b71984 5 * @version V1.1.0
mbed_official 369:2e96f1b71984 6 * @date 19-June-2014
mbed_official 87:085cde657901 7 * @brief SPI HAL module driver.
mbed_official 87:085cde657901 8 *
mbed_official 87:085cde657901 9 * This file provides firmware functions to manage the following
mbed_official 87:085cde657901 10 * functionalities of the Serial Peripheral Interface (SPI) peripheral:
mbed_official 87:085cde657901 11 * + Initialization and de-initialization functions
mbed_official 87:085cde657901 12 * + IO operation functions
mbed_official 87:085cde657901 13 * + Peripheral Control functions
mbed_official 87:085cde657901 14 * + Peripheral State functions
mbed_official 87:085cde657901 15 @verbatim
mbed_official 87:085cde657901 16 ==============================================================================
mbed_official 87:085cde657901 17 ##### How to use this driver #####
mbed_official 87:085cde657901 18 ==============================================================================
mbed_official 87:085cde657901 19 [..]
mbed_official 87:085cde657901 20 The SPI HAL driver can be used as follows:
mbed_official 87:085cde657901 21
mbed_official 87:085cde657901 22 (#) Declare a SPI_HandleTypeDef handle structure, for example:
mbed_official 87:085cde657901 23 SPI_HandleTypeDef hspi;
mbed_official 87:085cde657901 24
mbed_official 226:b062af740e40 25 (#)Initialize the SPI low level resources by implementing the HAL_SPI_MspInit ()API:
mbed_official 87:085cde657901 26 (##) Enable the SPIx interface clock
mbed_official 87:085cde657901 27 (##) SPI pins configuration
mbed_official 87:085cde657901 28 (+++) Enable the clock for the SPI GPIOs
mbed_official 87:085cde657901 29 (+++) Configure these SPI pins as alternate function push-pull
mbed_official 87:085cde657901 30 (##) NVIC configuration if you need to use interrupt process
mbed_official 87:085cde657901 31 (+++) Configure the SPIx interrupt priority
mbed_official 87:085cde657901 32 (+++) Enable the NVIC SPI IRQ handle
mbed_official 87:085cde657901 33 (##) DMA Configuration if you need to use DMA process
mbed_official 87:085cde657901 34 (+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive stream
mbed_official 87:085cde657901 35 (+++) Enable the DMAx interface clock using
mbed_official 87:085cde657901 36 (+++) Configure the DMA handle parameters
mbed_official 87:085cde657901 37 (+++) Configure the DMA Tx or Rx Stream
mbed_official 87:085cde657901 38 (+++) Associate the initilalized hdma_tx handle to the hspi DMA Tx or Rx handle
mbed_official 87:085cde657901 39 (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx or Rx Stream
mbed_official 87:085cde657901 40
mbed_official 87:085cde657901 41 (#) Program the Mode, Direction , Data size, Baudrate Prescaler, NSS
mbed_official 87:085cde657901 42 management, Clock polarity and phase, FirstBit and CRC configuration in the hspi Init structure.
mbed_official 87:085cde657901 43
mbed_official 87:085cde657901 44 (#) Initialize the SPI registers by calling the HAL_SPI_Init() API:
mbed_official 87:085cde657901 45 (++) This API configures also the low level Hardware GPIO, CLOCK, CORTEX...etc)
mbed_official 226:b062af740e40 46 by calling the customed HAL_SPI_MspInit() API.
mbed_official 369:2e96f1b71984 47 [..]
mbed_official 369:2e96f1b71984 48 Circular mode restriction:
mbed_official 369:2e96f1b71984 49 (#) The DMA circular mode cannot be used when the SPI is configured in these modes:
mbed_official 369:2e96f1b71984 50 (##) Master 2Lines RxOnly
mbed_official 369:2e96f1b71984 51 (##) Master 1Line Rx
mbed_official 369:2e96f1b71984 52 (#) The CRC feature is not managed when the DMA circular mode is enabled
mbed_official 369:2e96f1b71984 53 (#) When the SPI DMA Pause/Stop features are used, we must use the following APIs
mbed_official 369:2e96f1b71984 54 the HAL_SPI_DMAPause()/ HAL_SPI_DMAStop() only under the SPI callbacks
mbed_official 369:2e96f1b71984 55
mbed_official 369:2e96f1b71984 56
mbed_official 87:085cde657901 57
mbed_official 87:085cde657901 58 @endverbatim
mbed_official 87:085cde657901 59 ******************************************************************************
mbed_official 87:085cde657901 60 * @attention
mbed_official 87:085cde657901 61 *
mbed_official 87:085cde657901 62 * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
mbed_official 87:085cde657901 63 *
mbed_official 87:085cde657901 64 * Redistribution and use in source and binary forms, with or without modification,
mbed_official 87:085cde657901 65 * are permitted provided that the following conditions are met:
mbed_official 87:085cde657901 66 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 87:085cde657901 67 * this list of conditions and the following disclaimer.
mbed_official 87:085cde657901 68 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 87:085cde657901 69 * this list of conditions and the following disclaimer in the documentation
mbed_official 87:085cde657901 70 * and/or other materials provided with the distribution.
mbed_official 87:085cde657901 71 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 87:085cde657901 72 * may be used to endorse or promote products derived from this software
mbed_official 87:085cde657901 73 * without specific prior written permission.
mbed_official 87:085cde657901 74 *
mbed_official 87:085cde657901 75 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 87:085cde657901 76 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 87:085cde657901 77 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 87:085cde657901 78 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 87:085cde657901 79 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 87:085cde657901 80 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 87:085cde657901 81 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 87:085cde657901 82 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 87:085cde657901 83 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 87:085cde657901 84 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 87:085cde657901 85 *
mbed_official 87:085cde657901 86 ******************************************************************************
mbed_official 87:085cde657901 87 */
mbed_official 87:085cde657901 88
mbed_official 87:085cde657901 89 /* Includes ------------------------------------------------------------------*/
mbed_official 87:085cde657901 90 #include "stm32f4xx_hal.h"
mbed_official 87:085cde657901 91
mbed_official 87:085cde657901 92 /** @addtogroup STM32F4xx_HAL_Driver
mbed_official 87:085cde657901 93 * @{
mbed_official 87:085cde657901 94 */
mbed_official 87:085cde657901 95
mbed_official 87:085cde657901 96 /** @defgroup SPI
mbed_official 87:085cde657901 97 * @brief SPI HAL module driver
mbed_official 87:085cde657901 98 * @{
mbed_official 87:085cde657901 99 */
mbed_official 87:085cde657901 100
mbed_official 87:085cde657901 101 #ifdef HAL_SPI_MODULE_ENABLED
mbed_official 87:085cde657901 102
mbed_official 87:085cde657901 103 /* Private typedef -----------------------------------------------------------*/
mbed_official 87:085cde657901 104 /* Private define ------------------------------------------------------------*/
mbed_official 87:085cde657901 105 #define SPI_TIMEOUT_VALUE 10
mbed_official 87:085cde657901 106 /* Private macro -------------------------------------------------------------*/
mbed_official 87:085cde657901 107 /* Private variables ---------------------------------------------------------*/
mbed_official 87:085cde657901 108 /* Private function prototypes -----------------------------------------------*/
mbed_official 87:085cde657901 109 static void SPI_TxCloseIRQHandler(SPI_HandleTypeDef *hspi);
mbed_official 87:085cde657901 110 static void SPI_TxISR(SPI_HandleTypeDef *hspi);
mbed_official 106:ced8cbb51063 111 static void SPI_RxCloseIRQHandler(SPI_HandleTypeDef *hspi);
mbed_official 87:085cde657901 112 static void SPI_2LinesRxISR(SPI_HandleTypeDef *hspi);
mbed_official 87:085cde657901 113 static void SPI_RxISR(SPI_HandleTypeDef *hspi);
mbed_official 87:085cde657901 114 static void SPI_DMATransmitCplt(DMA_HandleTypeDef *hdma);
mbed_official 87:085cde657901 115 static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma);
mbed_official 87:085cde657901 116 static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma);
mbed_official 369:2e96f1b71984 117 static void SPI_DMAHalfTransmitCplt(DMA_HandleTypeDef *hdma);
mbed_official 369:2e96f1b71984 118 static void SPI_DMAHalfReceiveCplt(DMA_HandleTypeDef *hdma);
mbed_official 369:2e96f1b71984 119 static void SPI_DMAHalfTransmitReceiveCplt(DMA_HandleTypeDef *hdma);
mbed_official 87:085cde657901 120 static void SPI_DMAError(DMA_HandleTypeDef *hdma);
mbed_official 87:085cde657901 121 static HAL_StatusTypeDef SPI_WaitOnFlagUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, FlagStatus Status, uint32_t Timeout);
mbed_official 87:085cde657901 122
mbed_official 87:085cde657901 123 /* Private functions ---------------------------------------------------------*/
mbed_official 87:085cde657901 124
mbed_official 87:085cde657901 125 /** @defgroup SPI_Private_Functions
mbed_official 87:085cde657901 126 * @{
mbed_official 87:085cde657901 127 */
mbed_official 87:085cde657901 128
mbed_official 87:085cde657901 129 /** @defgroup SPI_Group1 Initialization and de-initialization functions
mbed_official 87:085cde657901 130 * @brief Initialization and Configuration functions
mbed_official 87:085cde657901 131 *
mbed_official 87:085cde657901 132 @verbatim
mbed_official 87:085cde657901 133 ===============================================================================
mbed_official 87:085cde657901 134 ##### Initialization and de-initialization functions #####
mbed_official 87:085cde657901 135 ===============================================================================
mbed_official 87:085cde657901 136 [..] This subsection provides a set of functions allowing to initialize and
mbed_official 87:085cde657901 137 de-initialiaze the SPIx peripheral:
mbed_official 87:085cde657901 138
mbed_official 226:b062af740e40 139 (+) User must implement HAL_SPI_MspInit() function in which he configures
mbed_official 87:085cde657901 140 all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC ).
mbed_official 87:085cde657901 141
mbed_official 87:085cde657901 142 (+) Call the function HAL_SPI_Init() to configure the selected device with
mbed_official 87:085cde657901 143 the selected configuration:
mbed_official 87:085cde657901 144 (++) Mode
mbed_official 87:085cde657901 145 (++) Direction
mbed_official 87:085cde657901 146 (++) Data Size
mbed_official 87:085cde657901 147 (++) Clock Polarity and Phase
mbed_official 87:085cde657901 148 (++) NSS Management
mbed_official 87:085cde657901 149 (++) BaudRate Prescaler
mbed_official 87:085cde657901 150 (++) FirstBit
mbed_official 87:085cde657901 151 (++) TIMode
mbed_official 87:085cde657901 152 (++) CRC Calculation
mbed_official 87:085cde657901 153 (++) CRC Polynomial if CRC enabled
mbed_official 87:085cde657901 154
mbed_official 87:085cde657901 155 (+) Call the function HAL_SPI_DeInit() to restore the default configuration
mbed_official 87:085cde657901 156 of the selected SPIx periperal.
mbed_official 87:085cde657901 157
mbed_official 87:085cde657901 158 @endverbatim
mbed_official 87:085cde657901 159 * @{
mbed_official 87:085cde657901 160 */
mbed_official 87:085cde657901 161
mbed_official 87:085cde657901 162 /**
mbed_official 87:085cde657901 163 * @brief Initializes the SPI according to the specified parameters
mbed_official 87:085cde657901 164 * in the SPI_InitTypeDef and create the associated handle.
mbed_official 226:b062af740e40 165 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 166 * the configuration information for SPI module.
mbed_official 87:085cde657901 167 * @retval HAL status
mbed_official 87:085cde657901 168 */
mbed_official 87:085cde657901 169 HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi)
mbed_official 87:085cde657901 170 {
mbed_official 87:085cde657901 171 /* Check the SPI handle allocation */
mbed_official 369:2e96f1b71984 172 if(hspi == HAL_NULL)
mbed_official 87:085cde657901 173 {
mbed_official 87:085cde657901 174 return HAL_ERROR;
mbed_official 87:085cde657901 175 }
mbed_official 87:085cde657901 176
mbed_official 87:085cde657901 177 /* Check the parameters */
mbed_official 87:085cde657901 178 assert_param(IS_SPI_MODE(hspi->Init.Mode));
mbed_official 87:085cde657901 179 assert_param(IS_SPI_DIRECTION_MODE(hspi->Init.Direction));
mbed_official 87:085cde657901 180 assert_param(IS_SPI_DATASIZE(hspi->Init.DataSize));
mbed_official 87:085cde657901 181 assert_param(IS_SPI_CPOL(hspi->Init.CLKPolarity));
mbed_official 87:085cde657901 182 assert_param(IS_SPI_CPHA(hspi->Init.CLKPhase));
mbed_official 87:085cde657901 183 assert_param(IS_SPI_NSS(hspi->Init.NSS));
mbed_official 87:085cde657901 184 assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler));
mbed_official 87:085cde657901 185 assert_param(IS_SPI_FIRST_BIT(hspi->Init.FirstBit));
mbed_official 87:085cde657901 186 assert_param(IS_SPI_TIMODE(hspi->Init.TIMode));
mbed_official 87:085cde657901 187 assert_param(IS_SPI_CRC_CALCULATION(hspi->Init.CRCCalculation));
mbed_official 87:085cde657901 188 assert_param(IS_SPI_CRC_POLYNOMIAL(hspi->Init.CRCPolynomial));
mbed_official 87:085cde657901 189
mbed_official 87:085cde657901 190 if(hspi->State == HAL_SPI_STATE_RESET)
mbed_official 87:085cde657901 191 {
mbed_official 87:085cde657901 192 /* Init the low level hardware : GPIO, CLOCK, NVIC... */
mbed_official 87:085cde657901 193 HAL_SPI_MspInit(hspi);
mbed_official 87:085cde657901 194 }
mbed_official 87:085cde657901 195
mbed_official 87:085cde657901 196 hspi->State = HAL_SPI_STATE_BUSY;
mbed_official 87:085cde657901 197
mbed_official 87:085cde657901 198 /* Disble the selected SPI peripheral */
mbed_official 87:085cde657901 199 __HAL_SPI_DISABLE(hspi);
mbed_official 87:085cde657901 200
mbed_official 87:085cde657901 201 /*----------------------- SPIx CR1 & CR2 Configuration ---------------------*/
mbed_official 87:085cde657901 202 /* Configure : SPI Mode, Communication Mode, Data size, Clock polarity and phase, NSS management,
mbed_official 87:085cde657901 203 Communication speed, First bit and CRC calculation state */
mbed_official 87:085cde657901 204 hspi->Instance->CR1 = (hspi->Init.Mode | hspi->Init.Direction | hspi->Init.DataSize |
mbed_official 87:085cde657901 205 hspi->Init.CLKPolarity | hspi->Init.CLKPhase | (hspi->Init.NSS & SPI_CR1_SSM) |
mbed_official 87:085cde657901 206 hspi->Init.BaudRatePrescaler | hspi->Init.FirstBit | hspi->Init.CRCCalculation);
mbed_official 87:085cde657901 207
mbed_official 87:085cde657901 208 /* Configure : NSS management */
mbed_official 87:085cde657901 209 hspi->Instance->CR2 = (((hspi->Init.NSS >> 16) & SPI_CR2_SSOE) | hspi->Init.TIMode);
mbed_official 87:085cde657901 210
mbed_official 87:085cde657901 211 /*---------------------------- SPIx CRCPOLY Configuration ------------------*/
mbed_official 87:085cde657901 212 /* Configure : CRC Polynomial */
mbed_official 87:085cde657901 213 hspi->Instance->CRCPR = hspi->Init.CRCPolynomial;
mbed_official 87:085cde657901 214
mbed_official 87:085cde657901 215 /* Activate the SPI mode (Make sure that I2SMOD bit in I2SCFGR register is reset) */
mbed_official 87:085cde657901 216 hspi->Instance->I2SCFGR &= (uint32_t)(~SPI_I2SCFGR_I2SMOD);
mbed_official 87:085cde657901 217
mbed_official 87:085cde657901 218 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
mbed_official 87:085cde657901 219 hspi->State = HAL_SPI_STATE_READY;
mbed_official 87:085cde657901 220
mbed_official 87:085cde657901 221 return HAL_OK;
mbed_official 87:085cde657901 222 }
mbed_official 87:085cde657901 223
mbed_official 87:085cde657901 224 /**
mbed_official 87:085cde657901 225 * @brief DeInitializes the SPI peripheral
mbed_official 226:b062af740e40 226 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 227 * the configuration information for SPI module.
mbed_official 87:085cde657901 228 * @retval HAL status
mbed_official 87:085cde657901 229 */
mbed_official 87:085cde657901 230 HAL_StatusTypeDef HAL_SPI_DeInit(SPI_HandleTypeDef *hspi)
mbed_official 87:085cde657901 231 {
mbed_official 87:085cde657901 232 /* Check the SPI handle allocation */
mbed_official 369:2e96f1b71984 233 if(hspi == HAL_NULL)
mbed_official 87:085cde657901 234 {
mbed_official 87:085cde657901 235 return HAL_ERROR;
mbed_official 87:085cde657901 236 }
mbed_official 87:085cde657901 237
mbed_official 87:085cde657901 238 /* Disable the SPI Peripheral Clock */
mbed_official 87:085cde657901 239 __HAL_SPI_DISABLE(hspi);
mbed_official 87:085cde657901 240
mbed_official 87:085cde657901 241 /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */
mbed_official 87:085cde657901 242 HAL_SPI_MspDeInit(hspi);
mbed_official 87:085cde657901 243
mbed_official 87:085cde657901 244 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
mbed_official 87:085cde657901 245 hspi->State = HAL_SPI_STATE_RESET;
mbed_official 87:085cde657901 246
mbed_official 106:ced8cbb51063 247 /* Release Lock */
mbed_official 106:ced8cbb51063 248 __HAL_UNLOCK(hspi);
mbed_official 106:ced8cbb51063 249
mbed_official 87:085cde657901 250 return HAL_OK;
mbed_official 87:085cde657901 251 }
mbed_official 87:085cde657901 252
mbed_official 87:085cde657901 253 /**
mbed_official 87:085cde657901 254 * @brief SPI MSP Init
mbed_official 226:b062af740e40 255 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 256 * the configuration information for SPI module.
mbed_official 87:085cde657901 257 * @retval None
mbed_official 87:085cde657901 258 */
mbed_official 87:085cde657901 259 __weak void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
mbed_official 87:085cde657901 260 {
mbed_official 87:085cde657901 261 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 262 the HAL_SPI_MspInit could be implenetd in the user file
mbed_official 87:085cde657901 263 */
mbed_official 87:085cde657901 264 }
mbed_official 87:085cde657901 265
mbed_official 87:085cde657901 266 /**
mbed_official 87:085cde657901 267 * @brief SPI MSP DeInit
mbed_official 226:b062af740e40 268 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 269 * the configuration information for SPI module.
mbed_official 87:085cde657901 270 * @retval None
mbed_official 87:085cde657901 271 */
mbed_official 87:085cde657901 272 __weak void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi)
mbed_official 87:085cde657901 273 {
mbed_official 87:085cde657901 274 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 275 the HAL_SPI_MspDeInit could be implenetd in the user file
mbed_official 87:085cde657901 276 */
mbed_official 87:085cde657901 277 }
mbed_official 87:085cde657901 278
mbed_official 87:085cde657901 279 /**
mbed_official 87:085cde657901 280 * @}
mbed_official 87:085cde657901 281 */
mbed_official 87:085cde657901 282
mbed_official 87:085cde657901 283 /** @defgroup SPI_Group2 IO operation functions
mbed_official 87:085cde657901 284 * @brief Data transfers functions
mbed_official 87:085cde657901 285 *
mbed_official 87:085cde657901 286 @verbatim
mbed_official 87:085cde657901 287 ==============================================================================
mbed_official 87:085cde657901 288 ##### IO operation functions #####
mbed_official 87:085cde657901 289 ===============================================================================
mbed_official 87:085cde657901 290 This subsection provides a set of functions allowing to manage the SPI
mbed_official 87:085cde657901 291 data transfers.
mbed_official 87:085cde657901 292
mbed_official 87:085cde657901 293 [..] The SPI supports master and slave mode :
mbed_official 87:085cde657901 294
mbed_official 226:b062af740e40 295 (#) There are two modes of transfer:
mbed_official 87:085cde657901 296 (++) Blocking mode: The communication is performed in polling mode.
mbed_official 87:085cde657901 297 The HAL status of all data processing is returned by the same function
mbed_official 87:085cde657901 298 after finishing transfer.
mbed_official 87:085cde657901 299 (++) No-Blocking mode: The communication is performed using Interrupts
mbed_official 226:b062af740e40 300 or DMA, These APIs return the HAL status.
mbed_official 87:085cde657901 301 The end of the data processing will be indicated through the
mbed_official 87:085cde657901 302 dedicated SPI IRQ when using Interrupt mode or the DMA IRQ when
mbed_official 87:085cde657901 303 using DMA mode.
mbed_official 87:085cde657901 304 The HAL_SPI_TxCpltCallback(), HAL_SPI_RxCpltCallback() and HAL_SPI_TxRxCpltCallback() user callbacks
mbed_official 87:085cde657901 305 will be executed respectivelly at the end of the transmit or Receive process
mbed_official 87:085cde657901 306 The HAL_SPI_ErrorCallback()user callback will be executed when a communication error is detected
mbed_official 87:085cde657901 307
mbed_official 226:b062af740e40 308 (#) Blocking mode APIs are :
mbed_official 87:085cde657901 309 (++) HAL_SPI_Transmit()in 1Line (simplex) and 2Lines (full duplex) mode
mbed_official 87:085cde657901 310 (++) HAL_SPI_Receive() in 1Line (simplex) and 2Lines (full duplex) mode
mbed_official 87:085cde657901 311 (++) HAL_SPI_TransmitReceive() in full duplex mode
mbed_official 87:085cde657901 312
mbed_official 226:b062af740e40 313 (#) Non Blocking mode API's with Interrupt are :
mbed_official 87:085cde657901 314 (++) HAL_SPI_Transmit_IT()in 1Line (simplex) and 2Lines (full duplex) mode
mbed_official 87:085cde657901 315 (++) HAL_SPI_Receive_IT() in 1Line (simplex) and 2Lines (full duplex) mode
mbed_official 87:085cde657901 316 (++) HAL_SPI_TransmitReceive_IT()in full duplex mode
mbed_official 87:085cde657901 317 (++) HAL_SPI_IRQHandler()
mbed_official 87:085cde657901 318
mbed_official 226:b062af740e40 319 (#) Non Blocking mode functions with DMA are :
mbed_official 87:085cde657901 320 (++) HAL_SPI_Transmit_DMA()in 1Line (simplex) and 2Lines (full duplex) mode
mbed_official 87:085cde657901 321 (++) HAL_SPI_Receive_DMA() in 1Line (simplex) and 2Lines (full duplex) mode
mbed_official 87:085cde657901 322 (++) HAL_SPI_TransmitReceie_DMA() in full duplex mode
mbed_official 87:085cde657901 323
mbed_official 226:b062af740e40 324 (#) A set of Transfer Complete Callbacks are provided in non Blocking mode:
mbed_official 87:085cde657901 325 (++) HAL_SPI_TxCpltCallback()
mbed_official 87:085cde657901 326 (++) HAL_SPI_RxCpltCallback()
mbed_official 87:085cde657901 327 (++) HAL_SPI_ErrorCallback()
mbed_official 87:085cde657901 328 (++) HAL_SPI_TxRxCpltCallback()
mbed_official 87:085cde657901 329
mbed_official 87:085cde657901 330 @endverbatim
mbed_official 87:085cde657901 331 * @{
mbed_official 87:085cde657901 332 */
mbed_official 87:085cde657901 333
mbed_official 87:085cde657901 334 /**
mbed_official 87:085cde657901 335 * @brief Transmit an amount of data in blocking mode
mbed_official 226:b062af740e40 336 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 337 * the configuration information for SPI module.
mbed_official 87:085cde657901 338 * @param pData: pointer to data buffer
mbed_official 87:085cde657901 339 * @param Size: amount of data to be sent
mbed_official 87:085cde657901 340 * @param Timeout: Timeout duration
mbed_official 87:085cde657901 341 * @retval HAL status
mbed_official 87:085cde657901 342 */
mbed_official 87:085cde657901 343 HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)
mbed_official 87:085cde657901 344 {
mbed_official 87:085cde657901 345
mbed_official 87:085cde657901 346 if(hspi->State == HAL_SPI_STATE_READY)
mbed_official 87:085cde657901 347 {
mbed_official 369:2e96f1b71984 348 if((pData == HAL_NULL ) || (Size == 0))
mbed_official 87:085cde657901 349 {
mbed_official 87:085cde657901 350 return HAL_ERROR;
mbed_official 87:085cde657901 351 }
mbed_official 87:085cde657901 352
mbed_official 87:085cde657901 353 /* Check the parameters */
mbed_official 87:085cde657901 354 assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction));
mbed_official 87:085cde657901 355
mbed_official 87:085cde657901 356 /* Process Locked */
mbed_official 87:085cde657901 357 __HAL_LOCK(hspi);
mbed_official 87:085cde657901 358
mbed_official 87:085cde657901 359 /* Configure communication */
mbed_official 87:085cde657901 360 hspi->State = HAL_SPI_STATE_BUSY_TX;
mbed_official 87:085cde657901 361 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
mbed_official 87:085cde657901 362
mbed_official 87:085cde657901 363 hspi->pTxBuffPtr = pData;
mbed_official 87:085cde657901 364 hspi->TxXferSize = Size;
mbed_official 87:085cde657901 365 hspi->TxXferCount = Size;
mbed_official 87:085cde657901 366
mbed_official 87:085cde657901 367 /*Init field not used in handle to zero */
mbed_official 87:085cde657901 368 hspi->TxISR = 0;
mbed_official 87:085cde657901 369 hspi->RxISR = 0;
mbed_official 87:085cde657901 370 hspi->RxXferSize = 0;
mbed_official 87:085cde657901 371 hspi->RxXferCount = 0;
mbed_official 87:085cde657901 372
mbed_official 87:085cde657901 373 /* Reset CRC Calculation */
mbed_official 87:085cde657901 374 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
mbed_official 87:085cde657901 375 {
mbed_official 87:085cde657901 376 __HAL_SPI_RESET_CRC(hspi);
mbed_official 87:085cde657901 377 }
mbed_official 87:085cde657901 378
mbed_official 87:085cde657901 379 if(hspi->Init.Direction == SPI_DIRECTION_1LINE)
mbed_official 87:085cde657901 380 {
mbed_official 87:085cde657901 381 /* Configure communication direction : 1Line */
mbed_official 87:085cde657901 382 __HAL_SPI_1LINE_TX(hspi);
mbed_official 87:085cde657901 383 }
mbed_official 87:085cde657901 384
mbed_official 87:085cde657901 385 /* Check if the SPI is already enabled */
mbed_official 87:085cde657901 386 if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE)
mbed_official 87:085cde657901 387 {
mbed_official 87:085cde657901 388 /* Enable SPI peripheral */
mbed_official 87:085cde657901 389 __HAL_SPI_ENABLE(hspi);
mbed_official 87:085cde657901 390 }
mbed_official 87:085cde657901 391
mbed_official 87:085cde657901 392 /* Transmit data in 8 Bit mode */
mbed_official 87:085cde657901 393 if(hspi->Init.DataSize == SPI_DATASIZE_8BIT)
mbed_official 87:085cde657901 394 {
mbed_official 369:2e96f1b71984 395 if((hspi->Init.Mode == SPI_MODE_SLAVE)|| (hspi->TxXferCount == 0x01))
mbed_official 369:2e96f1b71984 396 {
mbed_official 369:2e96f1b71984 397 hspi->Instance->DR = (*hspi->pTxBuffPtr++);
mbed_official 369:2e96f1b71984 398 hspi->TxXferCount--;
mbed_official 369:2e96f1b71984 399 }
mbed_official 87:085cde657901 400 while(hspi->TxXferCount > 0)
mbed_official 87:085cde657901 401 {
mbed_official 87:085cde657901 402 /* Wait until TXE flag is set to send data */
mbed_official 87:085cde657901 403 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 404 {
mbed_official 87:085cde657901 405 return HAL_TIMEOUT;
mbed_official 87:085cde657901 406 }
mbed_official 87:085cde657901 407 hspi->Instance->DR = (*hspi->pTxBuffPtr++);
mbed_official 87:085cde657901 408 hspi->TxXferCount--;
mbed_official 87:085cde657901 409 }
mbed_official 87:085cde657901 410 /* Enable CRC Transmission */
mbed_official 87:085cde657901 411 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
mbed_official 87:085cde657901 412 {
mbed_official 87:085cde657901 413 hspi->Instance->CR1 |= SPI_CR1_CRCNEXT;
mbed_official 87:085cde657901 414 }
mbed_official 87:085cde657901 415 }
mbed_official 87:085cde657901 416 /* Transmit data in 16 Bit mode */
mbed_official 87:085cde657901 417 else
mbed_official 87:085cde657901 418 {
mbed_official 369:2e96f1b71984 419 if((hspi->Init.Mode == SPI_MODE_SLAVE) || (hspi->TxXferCount == 0x01))
mbed_official 369:2e96f1b71984 420 {
mbed_official 369:2e96f1b71984 421 hspi->Instance->DR = *((uint16_t*)hspi->pTxBuffPtr);
mbed_official 369:2e96f1b71984 422 hspi->pTxBuffPtr+=2;
mbed_official 369:2e96f1b71984 423 hspi->TxXferCount--;
mbed_official 369:2e96f1b71984 424 }
mbed_official 87:085cde657901 425 while(hspi->TxXferCount > 0)
mbed_official 87:085cde657901 426 {
mbed_official 87:085cde657901 427 /* Wait until TXE flag is set to send data */
mbed_official 87:085cde657901 428 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 429 {
mbed_official 87:085cde657901 430 return HAL_TIMEOUT;
mbed_official 87:085cde657901 431 }
mbed_official 87:085cde657901 432 hspi->Instance->DR = *((uint16_t*)hspi->pTxBuffPtr);
mbed_official 87:085cde657901 433 hspi->pTxBuffPtr+=2;
mbed_official 87:085cde657901 434 hspi->TxXferCount--;
mbed_official 87:085cde657901 435 }
mbed_official 87:085cde657901 436 /* Enable CRC Transmission */
mbed_official 87:085cde657901 437 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
mbed_official 87:085cde657901 438 {
mbed_official 87:085cde657901 439 hspi->Instance->CR1 |= SPI_CR1_CRCNEXT;
mbed_official 87:085cde657901 440 }
mbed_official 87:085cde657901 441 }
mbed_official 87:085cde657901 442
mbed_official 87:085cde657901 443 /* Wait until TXE flag is set to send data */
mbed_official 87:085cde657901 444 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 445 {
mbed_official 87:085cde657901 446 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
mbed_official 87:085cde657901 447 return HAL_TIMEOUT;
mbed_official 87:085cde657901 448 }
mbed_official 87:085cde657901 449
mbed_official 87:085cde657901 450 /* Wait until Busy flag is reset before disabling SPI */
mbed_official 87:085cde657901 451 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_BSY, SET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 452 {
mbed_official 87:085cde657901 453 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
mbed_official 87:085cde657901 454 return HAL_TIMEOUT;
mbed_official 87:085cde657901 455 }
mbed_official 87:085cde657901 456
mbed_official 87:085cde657901 457 /* Clear OVERUN flag in 2 Lines communication mode because received is not read */
mbed_official 87:085cde657901 458 if(hspi->Init.Direction == SPI_DIRECTION_2LINES)
mbed_official 87:085cde657901 459 {
mbed_official 87:085cde657901 460 __HAL_SPI_CLEAR_OVRFLAG(hspi);
mbed_official 87:085cde657901 461 }
mbed_official 87:085cde657901 462
mbed_official 87:085cde657901 463 hspi->State = HAL_SPI_STATE_READY;
mbed_official 87:085cde657901 464
mbed_official 87:085cde657901 465 /* Process Unlocked */
mbed_official 87:085cde657901 466 __HAL_UNLOCK(hspi);
mbed_official 87:085cde657901 467
mbed_official 87:085cde657901 468 return HAL_OK;
mbed_official 87:085cde657901 469 }
mbed_official 87:085cde657901 470 else
mbed_official 87:085cde657901 471 {
mbed_official 87:085cde657901 472 return HAL_BUSY;
mbed_official 87:085cde657901 473 }
mbed_official 87:085cde657901 474 }
mbed_official 87:085cde657901 475
mbed_official 87:085cde657901 476 /**
mbed_official 87:085cde657901 477 * @brief Receive an amount of data in blocking mode
mbed_official 226:b062af740e40 478 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 479 * the configuration information for SPI module.
mbed_official 87:085cde657901 480 * @param pData: pointer to data buffer
mbed_official 87:085cde657901 481 * @param Size: amount of data to be sent
mbed_official 87:085cde657901 482 * @param Timeout: Timeout duration
mbed_official 87:085cde657901 483 * @retval HAL status
mbed_official 87:085cde657901 484 */
mbed_official 87:085cde657901 485 HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)
mbed_official 87:085cde657901 486 {
mbed_official 87:085cde657901 487 __IO uint16_t tmpreg;
mbed_official 87:085cde657901 488 uint32_t tmp = 0;
mbed_official 87:085cde657901 489
mbed_official 87:085cde657901 490 if(hspi->State == HAL_SPI_STATE_READY)
mbed_official 87:085cde657901 491 {
mbed_official 369:2e96f1b71984 492 if((pData == HAL_NULL ) || (Size == 0))
mbed_official 87:085cde657901 493 {
mbed_official 87:085cde657901 494 return HAL_ERROR;
mbed_official 87:085cde657901 495 }
mbed_official 87:085cde657901 496
mbed_official 87:085cde657901 497 /* Process Locked */
mbed_official 87:085cde657901 498 __HAL_LOCK(hspi);
mbed_official 87:085cde657901 499
mbed_official 87:085cde657901 500 /* Configure communication */
mbed_official 87:085cde657901 501 hspi->State = HAL_SPI_STATE_BUSY_RX;
mbed_official 87:085cde657901 502 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
mbed_official 87:085cde657901 503
mbed_official 87:085cde657901 504 hspi->pRxBuffPtr = pData;
mbed_official 87:085cde657901 505 hspi->RxXferSize = Size;
mbed_official 87:085cde657901 506 hspi->RxXferCount = Size;
mbed_official 87:085cde657901 507
mbed_official 87:085cde657901 508 /*Init field not used in handle to zero */
mbed_official 87:085cde657901 509 hspi->RxISR = 0;
mbed_official 87:085cde657901 510 hspi->TxISR = 0;
mbed_official 87:085cde657901 511 hspi->TxXferSize = 0;
mbed_official 87:085cde657901 512 hspi->TxXferCount = 0;
mbed_official 87:085cde657901 513
mbed_official 87:085cde657901 514 /* Configure communication direction : 1Line */
mbed_official 87:085cde657901 515 if(hspi->Init.Direction == SPI_DIRECTION_1LINE)
mbed_official 87:085cde657901 516 {
mbed_official 87:085cde657901 517 __HAL_SPI_1LINE_RX(hspi);
mbed_official 87:085cde657901 518 }
mbed_official 87:085cde657901 519
mbed_official 87:085cde657901 520 /* Reset CRC Calculation */
mbed_official 87:085cde657901 521 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
mbed_official 87:085cde657901 522 {
mbed_official 87:085cde657901 523 __HAL_SPI_RESET_CRC(hspi);
mbed_official 87:085cde657901 524 }
mbed_official 87:085cde657901 525
mbed_official 87:085cde657901 526 if((hspi->Init.Mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES))
mbed_official 87:085cde657901 527 {
mbed_official 87:085cde657901 528 /* Process Unlocked */
mbed_official 87:085cde657901 529 __HAL_UNLOCK(hspi);
mbed_official 87:085cde657901 530
mbed_official 87:085cde657901 531 /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */
mbed_official 87:085cde657901 532 return HAL_SPI_TransmitReceive(hspi, pData, pData, Size, Timeout);
mbed_official 87:085cde657901 533 }
mbed_official 87:085cde657901 534
mbed_official 87:085cde657901 535 /* Check if the SPI is already enabled */
mbed_official 87:085cde657901 536 if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE)
mbed_official 87:085cde657901 537 {
mbed_official 87:085cde657901 538 /* Enable SPI peripheral */
mbed_official 87:085cde657901 539 __HAL_SPI_ENABLE(hspi);
mbed_official 87:085cde657901 540 }
mbed_official 87:085cde657901 541
mbed_official 87:085cde657901 542 /* Receive data in 8 Bit mode */
mbed_official 87:085cde657901 543 if(hspi->Init.DataSize == SPI_DATASIZE_8BIT)
mbed_official 87:085cde657901 544 {
mbed_official 87:085cde657901 545 while(hspi->RxXferCount > 1)
mbed_official 87:085cde657901 546 {
mbed_official 87:085cde657901 547 /* Wait until RXNE flag is set */
mbed_official 87:085cde657901 548 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 549 {
mbed_official 87:085cde657901 550 return HAL_TIMEOUT;
mbed_official 87:085cde657901 551 }
mbed_official 87:085cde657901 552
mbed_official 87:085cde657901 553 (*hspi->pRxBuffPtr++) = hspi->Instance->DR;
mbed_official 87:085cde657901 554 hspi->RxXferCount--;
mbed_official 87:085cde657901 555 }
mbed_official 87:085cde657901 556 /* Enable CRC Transmission */
mbed_official 87:085cde657901 557 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
mbed_official 87:085cde657901 558 {
mbed_official 87:085cde657901 559 hspi->Instance->CR1 |= SPI_CR1_CRCNEXT;
mbed_official 87:085cde657901 560 }
mbed_official 87:085cde657901 561 }
mbed_official 87:085cde657901 562 /* Receive data in 16 Bit mode */
mbed_official 87:085cde657901 563 else
mbed_official 87:085cde657901 564 {
mbed_official 87:085cde657901 565 while(hspi->RxXferCount > 1)
mbed_official 87:085cde657901 566 {
mbed_official 87:085cde657901 567 /* Wait until RXNE flag is set to read data */
mbed_official 87:085cde657901 568 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 569 {
mbed_official 87:085cde657901 570 return HAL_TIMEOUT;
mbed_official 87:085cde657901 571 }
mbed_official 87:085cde657901 572
mbed_official 87:085cde657901 573 *((uint16_t*)hspi->pRxBuffPtr) = hspi->Instance->DR;
mbed_official 87:085cde657901 574 hspi->pRxBuffPtr+=2;
mbed_official 87:085cde657901 575 hspi->RxXferCount--;
mbed_official 87:085cde657901 576 }
mbed_official 87:085cde657901 577 /* Enable CRC Transmission */
mbed_official 87:085cde657901 578 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
mbed_official 87:085cde657901 579 {
mbed_official 87:085cde657901 580 hspi->Instance->CR1 |= SPI_CR1_CRCNEXT;
mbed_official 87:085cde657901 581 }
mbed_official 87:085cde657901 582 }
mbed_official 87:085cde657901 583
mbed_official 87:085cde657901 584 /* Wait until RXNE flag is set */
mbed_official 87:085cde657901 585 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 586 {
mbed_official 87:085cde657901 587 return HAL_TIMEOUT;
mbed_official 87:085cde657901 588 }
mbed_official 87:085cde657901 589
mbed_official 87:085cde657901 590 /* Receive last data in 8 Bit mode */
mbed_official 87:085cde657901 591 if(hspi->Init.DataSize == SPI_DATASIZE_8BIT)
mbed_official 87:085cde657901 592 {
mbed_official 87:085cde657901 593 (*hspi->pRxBuffPtr++) = hspi->Instance->DR;
mbed_official 87:085cde657901 594 }
mbed_official 87:085cde657901 595 /* Receive last data in 16 Bit mode */
mbed_official 87:085cde657901 596 else
mbed_official 87:085cde657901 597 {
mbed_official 87:085cde657901 598 *((uint16_t*)hspi->pRxBuffPtr) = hspi->Instance->DR;
mbed_official 87:085cde657901 599 hspi->pRxBuffPtr+=2;
mbed_official 87:085cde657901 600 }
mbed_official 87:085cde657901 601 hspi->RxXferCount--;
mbed_official 87:085cde657901 602
mbed_official 87:085cde657901 603 /* Wait until RXNE flag is set: CRC Received */
mbed_official 87:085cde657901 604 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
mbed_official 87:085cde657901 605 {
mbed_official 87:085cde657901 606 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 607 {
mbed_official 87:085cde657901 608 hspi->ErrorCode |= HAL_SPI_ERROR_CRC;
mbed_official 87:085cde657901 609 return HAL_TIMEOUT;
mbed_official 87:085cde657901 610 }
mbed_official 87:085cde657901 611
mbed_official 87:085cde657901 612 /* Read CRC to Flush RXNE flag */
mbed_official 87:085cde657901 613 tmpreg = hspi->Instance->DR;
mbed_official 87:085cde657901 614 }
mbed_official 87:085cde657901 615
mbed_official 87:085cde657901 616 if((hspi->Init.Mode == SPI_MODE_MASTER)&&((hspi->Init.Direction == SPI_DIRECTION_1LINE)||(hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY)))
mbed_official 87:085cde657901 617 {
mbed_official 87:085cde657901 618 /* Disable SPI peripheral */
mbed_official 87:085cde657901 619 __HAL_SPI_DISABLE(hspi);
mbed_official 87:085cde657901 620 }
mbed_official 87:085cde657901 621
mbed_official 87:085cde657901 622 hspi->State = HAL_SPI_STATE_READY;
mbed_official 87:085cde657901 623
mbed_official 87:085cde657901 624 tmp = __HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR);
mbed_official 87:085cde657901 625 /* Check if CRC error occurred */
mbed_official 87:085cde657901 626 if((hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED) && (tmp != RESET))
mbed_official 87:085cde657901 627 {
mbed_official 87:085cde657901 628 hspi->ErrorCode |= HAL_SPI_ERROR_CRC;
mbed_official 87:085cde657901 629
mbed_official 87:085cde657901 630 /* Reset CRC Calculation */
mbed_official 87:085cde657901 631 __HAL_SPI_RESET_CRC(hspi);
mbed_official 87:085cde657901 632
mbed_official 87:085cde657901 633 /* Process Unlocked */
mbed_official 87:085cde657901 634 __HAL_UNLOCK(hspi);
mbed_official 87:085cde657901 635
mbed_official 87:085cde657901 636 return HAL_ERROR;
mbed_official 87:085cde657901 637 }
mbed_official 87:085cde657901 638
mbed_official 87:085cde657901 639 /* Process Unlocked */
mbed_official 87:085cde657901 640 __HAL_UNLOCK(hspi);
mbed_official 87:085cde657901 641
mbed_official 87:085cde657901 642 return HAL_OK;
mbed_official 87:085cde657901 643 }
mbed_official 87:085cde657901 644 else
mbed_official 87:085cde657901 645 {
mbed_official 87:085cde657901 646 return HAL_BUSY;
mbed_official 87:085cde657901 647 }
mbed_official 87:085cde657901 648 }
mbed_official 87:085cde657901 649
mbed_official 87:085cde657901 650 /**
mbed_official 87:085cde657901 651 * @brief Transmit and Receive an amount of data in blocking mode
mbed_official 226:b062af740e40 652 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 653 * the configuration information for SPI module.
mbed_official 87:085cde657901 654 * @param pTxData: pointer to transmission data buffer
mbed_official 87:085cde657901 655 * @param pRxData: pointer to reception data buffer to be
mbed_official 87:085cde657901 656 * @param Size: amount of data to be sent
mbed_official 87:085cde657901 657 * @param Timeout: Timeout duration
mbed_official 87:085cde657901 658 * @retval HAL status
mbed_official 87:085cde657901 659 */
mbed_official 87:085cde657901 660 HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)
mbed_official 87:085cde657901 661 {
mbed_official 87:085cde657901 662 __IO uint16_t tmpreg;
mbed_official 369:2e96f1b71984 663 uint32_t tmpstate = 0, tmp = 0;
mbed_official 87:085cde657901 664
mbed_official 369:2e96f1b71984 665 tmpstate = hspi->State;
mbed_official 369:2e96f1b71984 666 if((tmpstate == HAL_SPI_STATE_READY) || (tmpstate == HAL_SPI_STATE_BUSY_RX))
mbed_official 87:085cde657901 667 {
mbed_official 369:2e96f1b71984 668 if((pTxData == HAL_NULL ) || (pRxData == HAL_NULL ) || (Size == 0))
mbed_official 87:085cde657901 669 {
mbed_official 87:085cde657901 670 return HAL_ERROR;
mbed_official 87:085cde657901 671 }
mbed_official 87:085cde657901 672
mbed_official 87:085cde657901 673 /* Check the parameters */
mbed_official 87:085cde657901 674 assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));
mbed_official 87:085cde657901 675
mbed_official 87:085cde657901 676 /* Process Locked */
mbed_official 87:085cde657901 677 __HAL_LOCK(hspi);
mbed_official 87:085cde657901 678
mbed_official 87:085cde657901 679 /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */
mbed_official 87:085cde657901 680 if(hspi->State == HAL_SPI_STATE_READY)
mbed_official 87:085cde657901 681 {
mbed_official 106:ced8cbb51063 682 hspi->State = HAL_SPI_STATE_BUSY_TX_RX;
mbed_official 87:085cde657901 683 }
mbed_official 87:085cde657901 684
mbed_official 87:085cde657901 685 /* Configure communication */
mbed_official 87:085cde657901 686 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
mbed_official 87:085cde657901 687
mbed_official 87:085cde657901 688 hspi->pRxBuffPtr = pRxData;
mbed_official 87:085cde657901 689 hspi->RxXferSize = Size;
mbed_official 87:085cde657901 690 hspi->RxXferCount = Size;
mbed_official 87:085cde657901 691
mbed_official 87:085cde657901 692 hspi->pTxBuffPtr = pTxData;
mbed_official 87:085cde657901 693 hspi->TxXferSize = Size;
mbed_official 87:085cde657901 694 hspi->TxXferCount = Size;
mbed_official 87:085cde657901 695
mbed_official 87:085cde657901 696 /*Init field not used in handle to zero */
mbed_official 87:085cde657901 697 hspi->RxISR = 0;
mbed_official 87:085cde657901 698 hspi->TxISR = 0;
mbed_official 87:085cde657901 699
mbed_official 87:085cde657901 700 /* Reset CRC Calculation */
mbed_official 87:085cde657901 701 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
mbed_official 87:085cde657901 702 {
mbed_official 87:085cde657901 703 __HAL_SPI_RESET_CRC(hspi);
mbed_official 87:085cde657901 704 }
mbed_official 87:085cde657901 705
mbed_official 87:085cde657901 706 /* Check if the SPI is already enabled */
mbed_official 87:085cde657901 707 if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE)
mbed_official 87:085cde657901 708 {
mbed_official 87:085cde657901 709 /* Enable SPI peripheral */
mbed_official 87:085cde657901 710 __HAL_SPI_ENABLE(hspi);
mbed_official 87:085cde657901 711 }
mbed_official 87:085cde657901 712
mbed_official 87:085cde657901 713 /* Transmit and Receive data in 16 Bit mode */
mbed_official 87:085cde657901 714 if(hspi->Init.DataSize == SPI_DATASIZE_16BIT)
mbed_official 87:085cde657901 715 {
mbed_official 369:2e96f1b71984 716 if((hspi->Init.Mode == SPI_MODE_SLAVE) || ((hspi->Init.Mode == SPI_MODE_MASTER) && (hspi->TxXferCount == 0x01)))
mbed_official 369:2e96f1b71984 717 {
mbed_official 369:2e96f1b71984 718 hspi->Instance->DR = *((uint16_t*)hspi->pTxBuffPtr);
mbed_official 369:2e96f1b71984 719 hspi->pTxBuffPtr+=2;
mbed_official 369:2e96f1b71984 720 hspi->TxXferCount--;
mbed_official 369:2e96f1b71984 721 }
mbed_official 87:085cde657901 722 if(hspi->TxXferCount == 0)
mbed_official 87:085cde657901 723 {
mbed_official 87:085cde657901 724 /* Enable CRC Transmission */
mbed_official 87:085cde657901 725 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
mbed_official 87:085cde657901 726 {
mbed_official 87:085cde657901 727 hspi->Instance->CR1 |= SPI_CR1_CRCNEXT;
mbed_official 87:085cde657901 728 }
mbed_official 87:085cde657901 729
mbed_official 87:085cde657901 730 /* Wait until RXNE flag is set */
mbed_official 87:085cde657901 731 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 732 {
mbed_official 87:085cde657901 733 return HAL_TIMEOUT;
mbed_official 87:085cde657901 734 }
mbed_official 87:085cde657901 735
mbed_official 87:085cde657901 736 *((uint16_t*)hspi->pRxBuffPtr) = hspi->Instance->DR;
mbed_official 87:085cde657901 737 hspi->pRxBuffPtr+=2;
mbed_official 87:085cde657901 738 hspi->RxXferCount--;
mbed_official 87:085cde657901 739 }
mbed_official 87:085cde657901 740 else
mbed_official 87:085cde657901 741 {
mbed_official 87:085cde657901 742 while(hspi->TxXferCount > 0)
mbed_official 87:085cde657901 743 {
mbed_official 87:085cde657901 744 /* Wait until TXE flag is set to send data */
mbed_official 87:085cde657901 745 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 746 {
mbed_official 87:085cde657901 747 return HAL_TIMEOUT;
mbed_official 87:085cde657901 748 }
mbed_official 87:085cde657901 749
mbed_official 87:085cde657901 750 hspi->Instance->DR = *((uint16_t*)hspi->pTxBuffPtr);
mbed_official 87:085cde657901 751 hspi->pTxBuffPtr+=2;
mbed_official 87:085cde657901 752 hspi->TxXferCount--;
mbed_official 87:085cde657901 753
mbed_official 87:085cde657901 754 /* Enable CRC Transmission */
mbed_official 87:085cde657901 755 if((hspi->TxXferCount == 0) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED))
mbed_official 87:085cde657901 756 {
mbed_official 87:085cde657901 757 hspi->Instance->CR1 |= SPI_CR1_CRCNEXT;
mbed_official 87:085cde657901 758 }
mbed_official 87:085cde657901 759
mbed_official 87:085cde657901 760 /* Wait until RXNE flag is set */
mbed_official 87:085cde657901 761 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 762 {
mbed_official 87:085cde657901 763 return HAL_TIMEOUT;
mbed_official 87:085cde657901 764 }
mbed_official 369:2e96f1b71984 765
mbed_official 87:085cde657901 766 *((uint16_t*)hspi->pRxBuffPtr) = hspi->Instance->DR;
mbed_official 87:085cde657901 767 hspi->pRxBuffPtr+=2;
mbed_official 87:085cde657901 768 hspi->RxXferCount--;
mbed_official 87:085cde657901 769 }
mbed_official 369:2e96f1b71984 770 /* Receive the last byte */
mbed_official 369:2e96f1b71984 771 if(hspi->Init.Mode == SPI_MODE_SLAVE)
mbed_official 87:085cde657901 772 {
mbed_official 369:2e96f1b71984 773 /* Wait until RXNE flag is set */
mbed_official 369:2e96f1b71984 774 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK)
mbed_official 369:2e96f1b71984 775 {
mbed_official 369:2e96f1b71984 776 return HAL_TIMEOUT;
mbed_official 369:2e96f1b71984 777 }
mbed_official 369:2e96f1b71984 778
mbed_official 369:2e96f1b71984 779 *((uint16_t*)hspi->pRxBuffPtr) = hspi->Instance->DR;
mbed_official 369:2e96f1b71984 780 hspi->pRxBuffPtr+=2;
mbed_official 369:2e96f1b71984 781 hspi->RxXferCount--;
mbed_official 87:085cde657901 782 }
mbed_official 87:085cde657901 783 }
mbed_official 87:085cde657901 784 }
mbed_official 87:085cde657901 785 /* Transmit and Receive data in 8 Bit mode */
mbed_official 87:085cde657901 786 else
mbed_official 87:085cde657901 787 {
mbed_official 369:2e96f1b71984 788 if((hspi->Init.Mode == SPI_MODE_SLAVE) || ((hspi->Init.Mode == SPI_MODE_MASTER) && (hspi->TxXferCount == 0x01)))
mbed_official 369:2e96f1b71984 789 {
mbed_official 369:2e96f1b71984 790 hspi->Instance->DR = (*hspi->pTxBuffPtr++);
mbed_official 369:2e96f1b71984 791 hspi->TxXferCount--;
mbed_official 369:2e96f1b71984 792 }
mbed_official 87:085cde657901 793 if(hspi->TxXferCount == 0)
mbed_official 87:085cde657901 794 {
mbed_official 87:085cde657901 795 /* Enable CRC Transmission */
mbed_official 87:085cde657901 796 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
mbed_official 87:085cde657901 797 {
mbed_official 87:085cde657901 798 hspi->Instance->CR1 |= SPI_CR1_CRCNEXT;
mbed_official 87:085cde657901 799 }
mbed_official 87:085cde657901 800
mbed_official 87:085cde657901 801 /* Wait until RXNE flag is set */
mbed_official 87:085cde657901 802 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 803 {
mbed_official 87:085cde657901 804 return HAL_TIMEOUT;
mbed_official 87:085cde657901 805 }
mbed_official 87:085cde657901 806
mbed_official 87:085cde657901 807 (*hspi->pRxBuffPtr) = hspi->Instance->DR;
mbed_official 87:085cde657901 808 hspi->RxXferCount--;
mbed_official 87:085cde657901 809 }
mbed_official 87:085cde657901 810 else
mbed_official 87:085cde657901 811 {
mbed_official 87:085cde657901 812 while(hspi->TxXferCount > 0)
mbed_official 87:085cde657901 813 {
mbed_official 87:085cde657901 814 /* Wait until TXE flag is set to send data */
mbed_official 87:085cde657901 815 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 816 {
mbed_official 87:085cde657901 817 return HAL_TIMEOUT;
mbed_official 87:085cde657901 818 }
mbed_official 87:085cde657901 819
mbed_official 87:085cde657901 820 hspi->Instance->DR = (*hspi->pTxBuffPtr++);
mbed_official 87:085cde657901 821 hspi->TxXferCount--;
mbed_official 87:085cde657901 822
mbed_official 87:085cde657901 823 /* Enable CRC Transmission */
mbed_official 87:085cde657901 824 if((hspi->TxXferCount == 0) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED))
mbed_official 87:085cde657901 825 {
mbed_official 87:085cde657901 826 hspi->Instance->CR1 |= SPI_CR1_CRCNEXT;
mbed_official 87:085cde657901 827 }
mbed_official 87:085cde657901 828
mbed_official 369:2e96f1b71984 829 /* Wait until RXNE flag is set */
mbed_official 369:2e96f1b71984 830 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK)
mbed_official 369:2e96f1b71984 831 {
mbed_official 369:2e96f1b71984 832 return HAL_TIMEOUT;
mbed_official 369:2e96f1b71984 833 }
mbed_official 369:2e96f1b71984 834
mbed_official 369:2e96f1b71984 835 (*hspi->pRxBuffPtr++) = hspi->Instance->DR;
mbed_official 369:2e96f1b71984 836 hspi->RxXferCount--;
mbed_official 369:2e96f1b71984 837 }
mbed_official 369:2e96f1b71984 838 if(hspi->Init.Mode == SPI_MODE_SLAVE)
mbed_official 369:2e96f1b71984 839 {
mbed_official 87:085cde657901 840 /* Wait until RXNE flag is set */
mbed_official 87:085cde657901 841 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 842 {
mbed_official 87:085cde657901 843 return HAL_TIMEOUT;
mbed_official 87:085cde657901 844 }
mbed_official 369:2e96f1b71984 845
mbed_official 87:085cde657901 846 (*hspi->pRxBuffPtr++) = hspi->Instance->DR;
mbed_official 87:085cde657901 847 hspi->RxXferCount--;
mbed_official 87:085cde657901 848 }
mbed_official 87:085cde657901 849 }
mbed_official 87:085cde657901 850 }
mbed_official 87:085cde657901 851
mbed_official 87:085cde657901 852 /* Read CRC from DR to close CRC calculation process */
mbed_official 87:085cde657901 853 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
mbed_official 87:085cde657901 854 {
mbed_official 87:085cde657901 855 /* Wait until RXNE flag is set */
mbed_official 87:085cde657901 856 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 857 {
mbed_official 87:085cde657901 858 hspi->ErrorCode |= HAL_SPI_ERROR_CRC;
mbed_official 87:085cde657901 859 return HAL_TIMEOUT;
mbed_official 87:085cde657901 860 }
mbed_official 87:085cde657901 861 /* Read CRC */
mbed_official 87:085cde657901 862 tmpreg = hspi->Instance->DR;
mbed_official 87:085cde657901 863 }
mbed_official 87:085cde657901 864
mbed_official 87:085cde657901 865 /* Wait until Busy flag is reset before disabling SPI */
mbed_official 87:085cde657901 866 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_BSY, SET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 867 {
mbed_official 87:085cde657901 868 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
mbed_official 87:085cde657901 869 return HAL_TIMEOUT;
mbed_official 87:085cde657901 870 }
mbed_official 87:085cde657901 871
mbed_official 87:085cde657901 872 hspi->State = HAL_SPI_STATE_READY;
mbed_official 87:085cde657901 873
mbed_official 87:085cde657901 874 tmp = __HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR);
mbed_official 87:085cde657901 875 /* Check if CRC error occurred */
mbed_official 87:085cde657901 876 if((hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED) && (tmp != RESET))
mbed_official 87:085cde657901 877 {
mbed_official 87:085cde657901 878 hspi->ErrorCode |= HAL_SPI_ERROR_CRC;
mbed_official 87:085cde657901 879
mbed_official 87:085cde657901 880 /* Reset CRC Calculation */
mbed_official 87:085cde657901 881 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
mbed_official 87:085cde657901 882 {
mbed_official 87:085cde657901 883 __HAL_SPI_RESET_CRC(hspi);
mbed_official 87:085cde657901 884 }
mbed_official 87:085cde657901 885
mbed_official 87:085cde657901 886 /* Process Unlocked */
mbed_official 87:085cde657901 887 __HAL_UNLOCK(hspi);
mbed_official 87:085cde657901 888
mbed_official 87:085cde657901 889 return HAL_ERROR;
mbed_official 87:085cde657901 890 }
mbed_official 87:085cde657901 891
mbed_official 87:085cde657901 892 /* Process Unlocked */
mbed_official 87:085cde657901 893 __HAL_UNLOCK(hspi);
mbed_official 87:085cde657901 894
mbed_official 87:085cde657901 895 return HAL_OK;
mbed_official 87:085cde657901 896 }
mbed_official 87:085cde657901 897 else
mbed_official 87:085cde657901 898 {
mbed_official 87:085cde657901 899 return HAL_BUSY;
mbed_official 87:085cde657901 900 }
mbed_official 87:085cde657901 901 }
mbed_official 87:085cde657901 902
mbed_official 87:085cde657901 903 /**
mbed_official 87:085cde657901 904 * @brief Transmit an amount of data in no-blocking mode with Interrupt
mbed_official 226:b062af740e40 905 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 906 * the configuration information for SPI module.
mbed_official 87:085cde657901 907 * @param pData: pointer to data buffer
mbed_official 87:085cde657901 908 * @param Size: amount of data to be sent
mbed_official 87:085cde657901 909 * @retval HAL status
mbed_official 87:085cde657901 910 */
mbed_official 87:085cde657901 911 HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
mbed_official 87:085cde657901 912 {
mbed_official 87:085cde657901 913 if(hspi->State == HAL_SPI_STATE_READY)
mbed_official 87:085cde657901 914 {
mbed_official 369:2e96f1b71984 915 if((pData == HAL_NULL) || (Size == 0))
mbed_official 87:085cde657901 916 {
mbed_official 87:085cde657901 917 return HAL_ERROR;
mbed_official 87:085cde657901 918 }
mbed_official 87:085cde657901 919
mbed_official 87:085cde657901 920 /* Check the parameters */
mbed_official 87:085cde657901 921 assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction));
mbed_official 87:085cde657901 922
mbed_official 87:085cde657901 923 /* Process Locked */
mbed_official 87:085cde657901 924 __HAL_LOCK(hspi);
mbed_official 87:085cde657901 925
mbed_official 87:085cde657901 926 /* Configure communication */
mbed_official 87:085cde657901 927 hspi->State = HAL_SPI_STATE_BUSY_TX;
mbed_official 87:085cde657901 928 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
mbed_official 87:085cde657901 929
mbed_official 87:085cde657901 930 hspi->TxISR = &SPI_TxISR;
mbed_official 87:085cde657901 931 hspi->pTxBuffPtr = pData;
mbed_official 87:085cde657901 932 hspi->TxXferSize = Size;
mbed_official 87:085cde657901 933 hspi->TxXferCount = Size;
mbed_official 87:085cde657901 934
mbed_official 87:085cde657901 935 /*Init field not used in handle to zero */
mbed_official 87:085cde657901 936 hspi->RxISR = 0;
mbed_official 87:085cde657901 937 hspi->RxXferSize = 0;
mbed_official 87:085cde657901 938 hspi->RxXferCount = 0;
mbed_official 87:085cde657901 939
mbed_official 87:085cde657901 940 /* Configure communication direction : 1Line */
mbed_official 87:085cde657901 941 if(hspi->Init.Direction == SPI_DIRECTION_1LINE)
mbed_official 87:085cde657901 942 {
mbed_official 87:085cde657901 943 __HAL_SPI_1LINE_TX(hspi);
mbed_official 87:085cde657901 944 }
mbed_official 87:085cde657901 945
mbed_official 87:085cde657901 946 /* Reset CRC Calculation */
mbed_official 87:085cde657901 947 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
mbed_official 87:085cde657901 948 {
mbed_official 87:085cde657901 949 __HAL_SPI_RESET_CRC(hspi);
mbed_official 87:085cde657901 950 }
mbed_official 87:085cde657901 951
mbed_official 87:085cde657901 952 if (hspi->Init.Direction == SPI_DIRECTION_2LINES)
mbed_official 87:085cde657901 953 {
mbed_official 87:085cde657901 954 __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE));
mbed_official 87:085cde657901 955 }else
mbed_official 87:085cde657901 956 {
mbed_official 87:085cde657901 957 /* Enable TXE and ERR interrupt */
mbed_official 87:085cde657901 958 __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_ERR));
mbed_official 87:085cde657901 959 }
mbed_official 87:085cde657901 960 /* Process Unlocked */
mbed_official 87:085cde657901 961 __HAL_UNLOCK(hspi);
mbed_official 87:085cde657901 962
mbed_official 87:085cde657901 963 /* Check if the SPI is already enabled */
mbed_official 87:085cde657901 964 if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE)
mbed_official 87:085cde657901 965 {
mbed_official 87:085cde657901 966 /* Enable SPI peripheral */
mbed_official 87:085cde657901 967 __HAL_SPI_ENABLE(hspi);
mbed_official 87:085cde657901 968 }
mbed_official 87:085cde657901 969
mbed_official 87:085cde657901 970 return HAL_OK;
mbed_official 87:085cde657901 971 }
mbed_official 87:085cde657901 972 else
mbed_official 87:085cde657901 973 {
mbed_official 87:085cde657901 974 return HAL_BUSY;
mbed_official 87:085cde657901 975 }
mbed_official 87:085cde657901 976 }
mbed_official 87:085cde657901 977
mbed_official 87:085cde657901 978 /**
mbed_official 87:085cde657901 979 * @brief Receive an amount of data in no-blocking mode with Interrupt
mbed_official 226:b062af740e40 980 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 981 * the configuration information for SPI module.
mbed_official 87:085cde657901 982 * @param pData: pointer to data buffer
mbed_official 87:085cde657901 983 * @param Size: amount of data to be sent
mbed_official 87:085cde657901 984 * @retval HAL status
mbed_official 87:085cde657901 985 */
mbed_official 87:085cde657901 986 HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
mbed_official 87:085cde657901 987 {
mbed_official 87:085cde657901 988 if(hspi->State == HAL_SPI_STATE_READY)
mbed_official 87:085cde657901 989 {
mbed_official 369:2e96f1b71984 990 if((pData == HAL_NULL) || (Size == 0))
mbed_official 87:085cde657901 991 {
mbed_official 87:085cde657901 992 return HAL_ERROR;
mbed_official 87:085cde657901 993 }
mbed_official 87:085cde657901 994
mbed_official 87:085cde657901 995 /* Process Locked */
mbed_official 87:085cde657901 996 __HAL_LOCK(hspi);
mbed_official 87:085cde657901 997
mbed_official 87:085cde657901 998 /* Configure communication */
mbed_official 87:085cde657901 999 hspi->State = HAL_SPI_STATE_BUSY_RX;
mbed_official 87:085cde657901 1000 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
mbed_official 87:085cde657901 1001
mbed_official 87:085cde657901 1002 hspi->RxISR = &SPI_RxISR;
mbed_official 87:085cde657901 1003 hspi->pRxBuffPtr = pData;
mbed_official 87:085cde657901 1004 hspi->RxXferSize = Size;
mbed_official 87:085cde657901 1005 hspi->RxXferCount = Size ;
mbed_official 87:085cde657901 1006
mbed_official 87:085cde657901 1007 /*Init field not used in handle to zero */
mbed_official 87:085cde657901 1008 hspi->TxISR = 0;
mbed_official 87:085cde657901 1009 hspi->TxXferSize = 0;
mbed_official 87:085cde657901 1010 hspi->TxXferCount = 0;
mbed_official 87:085cde657901 1011
mbed_official 87:085cde657901 1012 /* Configure communication direction : 1Line */
mbed_official 87:085cde657901 1013 if(hspi->Init.Direction == SPI_DIRECTION_1LINE)
mbed_official 87:085cde657901 1014 {
mbed_official 87:085cde657901 1015 __HAL_SPI_1LINE_RX(hspi);
mbed_official 87:085cde657901 1016 }
mbed_official 87:085cde657901 1017 else if((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER))
mbed_official 87:085cde657901 1018 {
mbed_official 87:085cde657901 1019 /* Process Unlocked */
mbed_official 87:085cde657901 1020 __HAL_UNLOCK(hspi);
mbed_official 87:085cde657901 1021
mbed_official 87:085cde657901 1022 /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */
mbed_official 87:085cde657901 1023 return HAL_SPI_TransmitReceive_IT(hspi, pData, pData, Size);
mbed_official 87:085cde657901 1024 }
mbed_official 87:085cde657901 1025
mbed_official 87:085cde657901 1026 /* Reset CRC Calculation */
mbed_official 87:085cde657901 1027 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
mbed_official 87:085cde657901 1028 {
mbed_official 87:085cde657901 1029 __HAL_SPI_RESET_CRC(hspi);
mbed_official 87:085cde657901 1030 }
mbed_official 87:085cde657901 1031
mbed_official 87:085cde657901 1032 /* Enable TXE and ERR interrupt */
mbed_official 87:085cde657901 1033 __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR));
mbed_official 87:085cde657901 1034
mbed_official 87:085cde657901 1035 /* Process Unlocked */
mbed_official 87:085cde657901 1036 __HAL_UNLOCK(hspi);
mbed_official 87:085cde657901 1037
mbed_official 87:085cde657901 1038 /* Note : The SPI must be enabled after unlocking current process
mbed_official 87:085cde657901 1039 to avoid the risk of SPI interrupt handle execution before current
mbed_official 87:085cde657901 1040 process unlock */
mbed_official 87:085cde657901 1041
mbed_official 87:085cde657901 1042 /* Check if the SPI is already enabled */
mbed_official 87:085cde657901 1043 if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE)
mbed_official 87:085cde657901 1044 {
mbed_official 87:085cde657901 1045 /* Enable SPI peripheral */
mbed_official 87:085cde657901 1046 __HAL_SPI_ENABLE(hspi);
mbed_official 87:085cde657901 1047 }
mbed_official 87:085cde657901 1048
mbed_official 87:085cde657901 1049 return HAL_OK;
mbed_official 87:085cde657901 1050 }
mbed_official 87:085cde657901 1051 else
mbed_official 87:085cde657901 1052 {
mbed_official 87:085cde657901 1053 return HAL_BUSY;
mbed_official 87:085cde657901 1054 }
mbed_official 87:085cde657901 1055 }
mbed_official 87:085cde657901 1056
mbed_official 87:085cde657901 1057 /**
mbed_official 87:085cde657901 1058 * @brief Transmit and Receive an amount of data in no-blocking mode with Interrupt
mbed_official 226:b062af740e40 1059 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1060 * the configuration information for SPI module.
mbed_official 87:085cde657901 1061 * @param pTxData: pointer to transmission data buffer
mbed_official 87:085cde657901 1062 * @param pRxData: pointer to reception data buffer to be
mbed_official 87:085cde657901 1063 * @param Size: amount of data to be sent
mbed_official 87:085cde657901 1064 * @retval HAL status
mbed_official 87:085cde657901 1065 */
mbed_official 87:085cde657901 1066 HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size)
mbed_official 87:085cde657901 1067 {
mbed_official 369:2e96f1b71984 1068 uint32_t tmpstate = 0;
mbed_official 87:085cde657901 1069
mbed_official 369:2e96f1b71984 1070 tmpstate = hspi->State;
mbed_official 369:2e96f1b71984 1071 if((tmpstate == HAL_SPI_STATE_READY) || \
mbed_official 369:2e96f1b71984 1072 ((hspi->Init.Mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmpstate == HAL_SPI_STATE_BUSY_RX)))
mbed_official 87:085cde657901 1073 {
mbed_official 369:2e96f1b71984 1074 if((pTxData == HAL_NULL ) || (pRxData == HAL_NULL ) || (Size == 0))
mbed_official 87:085cde657901 1075 {
mbed_official 87:085cde657901 1076 return HAL_ERROR;
mbed_official 87:085cde657901 1077 }
mbed_official 87:085cde657901 1078
mbed_official 87:085cde657901 1079 /* Check the parameters */
mbed_official 87:085cde657901 1080 assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));
mbed_official 87:085cde657901 1081
mbed_official 87:085cde657901 1082 /* Process locked */
mbed_official 87:085cde657901 1083 __HAL_LOCK(hspi);
mbed_official 87:085cde657901 1084
mbed_official 87:085cde657901 1085 /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */
mbed_official 369:2e96f1b71984 1086 if(hspi->State != HAL_SPI_STATE_BUSY_RX)
mbed_official 87:085cde657901 1087 {
mbed_official 106:ced8cbb51063 1088 hspi->State = HAL_SPI_STATE_BUSY_TX_RX;
mbed_official 87:085cde657901 1089 }
mbed_official 87:085cde657901 1090
mbed_official 87:085cde657901 1091 /* Configure communication */
mbed_official 87:085cde657901 1092 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
mbed_official 87:085cde657901 1093
mbed_official 87:085cde657901 1094 hspi->TxISR = &SPI_TxISR;
mbed_official 87:085cde657901 1095 hspi->pTxBuffPtr = pTxData;
mbed_official 87:085cde657901 1096 hspi->TxXferSize = Size;
mbed_official 87:085cde657901 1097 hspi->TxXferCount = Size;
mbed_official 87:085cde657901 1098
mbed_official 87:085cde657901 1099 hspi->RxISR = &SPI_2LinesRxISR;
mbed_official 87:085cde657901 1100 hspi->pRxBuffPtr = pRxData;
mbed_official 87:085cde657901 1101 hspi->RxXferSize = Size;
mbed_official 87:085cde657901 1102 hspi->RxXferCount = Size;
mbed_official 87:085cde657901 1103
mbed_official 87:085cde657901 1104 /* Reset CRC Calculation */
mbed_official 87:085cde657901 1105 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
mbed_official 87:085cde657901 1106 {
mbed_official 87:085cde657901 1107 __HAL_SPI_RESET_CRC(hspi);
mbed_official 87:085cde657901 1108 }
mbed_official 87:085cde657901 1109
mbed_official 87:085cde657901 1110 /* Enable TXE, RXNE and ERR interrupt */
mbed_official 87:085cde657901 1111 __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR));
mbed_official 87:085cde657901 1112
mbed_official 87:085cde657901 1113 /* Process Unlocked */
mbed_official 87:085cde657901 1114 __HAL_UNLOCK(hspi);
mbed_official 87:085cde657901 1115
mbed_official 87:085cde657901 1116 /* Check if the SPI is already enabled */
mbed_official 87:085cde657901 1117 if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE)
mbed_official 87:085cde657901 1118 {
mbed_official 87:085cde657901 1119 /* Enable SPI peripheral */
mbed_official 87:085cde657901 1120 __HAL_SPI_ENABLE(hspi);
mbed_official 87:085cde657901 1121 }
mbed_official 87:085cde657901 1122
mbed_official 87:085cde657901 1123 return HAL_OK;
mbed_official 87:085cde657901 1124 }
mbed_official 87:085cde657901 1125 else
mbed_official 87:085cde657901 1126 {
mbed_official 87:085cde657901 1127 return HAL_BUSY;
mbed_official 87:085cde657901 1128 }
mbed_official 87:085cde657901 1129 }
mbed_official 87:085cde657901 1130
mbed_official 87:085cde657901 1131 /**
mbed_official 87:085cde657901 1132 * @brief Transmit an amount of data in no-blocking mode with DMA
mbed_official 226:b062af740e40 1133 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1134 * the configuration information for SPI module.
mbed_official 87:085cde657901 1135 * @param pData: pointer to data buffer
mbed_official 87:085cde657901 1136 * @param Size: amount of data to be sent
mbed_official 87:085cde657901 1137 * @retval HAL status
mbed_official 87:085cde657901 1138 */
mbed_official 87:085cde657901 1139 HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
mbed_official 87:085cde657901 1140 {
mbed_official 87:085cde657901 1141 if(hspi->State == HAL_SPI_STATE_READY)
mbed_official 87:085cde657901 1142 {
mbed_official 369:2e96f1b71984 1143 if((pData == HAL_NULL) || (Size == 0))
mbed_official 87:085cde657901 1144 {
mbed_official 87:085cde657901 1145 return HAL_ERROR;
mbed_official 87:085cde657901 1146 }
mbed_official 87:085cde657901 1147
mbed_official 87:085cde657901 1148 /* Check the parameters */
mbed_official 87:085cde657901 1149 assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction));
mbed_official 87:085cde657901 1150
mbed_official 87:085cde657901 1151 /* Process Locked */
mbed_official 87:085cde657901 1152 __HAL_LOCK(hspi);
mbed_official 87:085cde657901 1153
mbed_official 87:085cde657901 1154 /* Configure communication */
mbed_official 87:085cde657901 1155 hspi->State = HAL_SPI_STATE_BUSY_TX;
mbed_official 87:085cde657901 1156 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
mbed_official 87:085cde657901 1157
mbed_official 87:085cde657901 1158 hspi->pTxBuffPtr = pData;
mbed_official 87:085cde657901 1159 hspi->TxXferSize = Size;
mbed_official 87:085cde657901 1160 hspi->TxXferCount = Size;
mbed_official 87:085cde657901 1161
mbed_official 87:085cde657901 1162 /*Init field not used in handle to zero */
mbed_official 87:085cde657901 1163 hspi->TxISR = 0;
mbed_official 87:085cde657901 1164 hspi->RxISR = 0;
mbed_official 87:085cde657901 1165 hspi->RxXferSize = 0;
mbed_official 87:085cde657901 1166 hspi->RxXferCount = 0;
mbed_official 87:085cde657901 1167
mbed_official 87:085cde657901 1168 /* Configure communication direction : 1Line */
mbed_official 87:085cde657901 1169 if(hspi->Init.Direction == SPI_DIRECTION_1LINE)
mbed_official 87:085cde657901 1170 {
mbed_official 87:085cde657901 1171 __HAL_SPI_1LINE_TX(hspi);
mbed_official 87:085cde657901 1172 }
mbed_official 87:085cde657901 1173
mbed_official 87:085cde657901 1174 /* Reset CRC Calculation */
mbed_official 87:085cde657901 1175 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
mbed_official 87:085cde657901 1176 {
mbed_official 87:085cde657901 1177 __HAL_SPI_RESET_CRC(hspi);
mbed_official 87:085cde657901 1178 }
mbed_official 87:085cde657901 1179
mbed_official 369:2e96f1b71984 1180 /* Set the SPI TxDMA Half transfer complete callback */
mbed_official 369:2e96f1b71984 1181 hspi->hdmatx->XferHalfCpltCallback = SPI_DMAHalfTransmitCplt;
mbed_official 369:2e96f1b71984 1182
mbed_official 87:085cde657901 1183 /* Set the SPI TxDMA transfer complete callback */
mbed_official 87:085cde657901 1184 hspi->hdmatx->XferCpltCallback = SPI_DMATransmitCplt;
mbed_official 87:085cde657901 1185
mbed_official 87:085cde657901 1186 /* Set the DMA error callback */
mbed_official 87:085cde657901 1187 hspi->hdmatx->XferErrorCallback = SPI_DMAError;
mbed_official 87:085cde657901 1188
mbed_official 87:085cde657901 1189 /* Enable the Tx DMA Stream */
mbed_official 87:085cde657901 1190 HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instance->DR, hspi->TxXferCount);
mbed_official 87:085cde657901 1191
mbed_official 87:085cde657901 1192 /* Enable Tx DMA Request */
mbed_official 87:085cde657901 1193 hspi->Instance->CR2 |= SPI_CR2_TXDMAEN;
mbed_official 87:085cde657901 1194
mbed_official 87:085cde657901 1195 /* Process Unlocked */
mbed_official 87:085cde657901 1196 __HAL_UNLOCK(hspi);
mbed_official 87:085cde657901 1197
mbed_official 87:085cde657901 1198 /* Check if the SPI is already enabled */
mbed_official 87:085cde657901 1199 if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE)
mbed_official 87:085cde657901 1200 {
mbed_official 87:085cde657901 1201 /* Enable SPI peripheral */
mbed_official 87:085cde657901 1202 __HAL_SPI_ENABLE(hspi);
mbed_official 87:085cde657901 1203 }
mbed_official 87:085cde657901 1204
mbed_official 87:085cde657901 1205 return HAL_OK;
mbed_official 87:085cde657901 1206 }
mbed_official 87:085cde657901 1207 else
mbed_official 87:085cde657901 1208 {
mbed_official 87:085cde657901 1209 return HAL_BUSY;
mbed_official 87:085cde657901 1210 }
mbed_official 87:085cde657901 1211 }
mbed_official 87:085cde657901 1212
mbed_official 87:085cde657901 1213 /**
mbed_official 87:085cde657901 1214 * @brief Receive an amount of data in no-blocking mode with DMA
mbed_official 226:b062af740e40 1215 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1216 * the configuration information for SPI module.
mbed_official 87:085cde657901 1217 * @param pData: pointer to data buffer
mbed_official 87:085cde657901 1218 * @note When the CRC feature is enabled the pData Length must be Size + 1.
mbed_official 87:085cde657901 1219 * @param Size: amount of data to be sent
mbed_official 87:085cde657901 1220 * @retval HAL status
mbed_official 87:085cde657901 1221 */
mbed_official 87:085cde657901 1222 HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
mbed_official 87:085cde657901 1223 {
mbed_official 87:085cde657901 1224 if(hspi->State == HAL_SPI_STATE_READY)
mbed_official 87:085cde657901 1225 {
mbed_official 369:2e96f1b71984 1226 if((pData == HAL_NULL) || (Size == 0))
mbed_official 87:085cde657901 1227 {
mbed_official 87:085cde657901 1228 return HAL_ERROR;
mbed_official 87:085cde657901 1229 }
mbed_official 87:085cde657901 1230
mbed_official 87:085cde657901 1231 /* Process Locked */
mbed_official 87:085cde657901 1232 __HAL_LOCK(hspi);
mbed_official 87:085cde657901 1233
mbed_official 87:085cde657901 1234 /* Configure communication */
mbed_official 87:085cde657901 1235 hspi->State = HAL_SPI_STATE_BUSY_RX;
mbed_official 87:085cde657901 1236 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
mbed_official 87:085cde657901 1237
mbed_official 87:085cde657901 1238 hspi->pRxBuffPtr = pData;
mbed_official 87:085cde657901 1239 hspi->RxXferSize = Size;
mbed_official 87:085cde657901 1240 hspi->RxXferCount = Size;
mbed_official 87:085cde657901 1241
mbed_official 87:085cde657901 1242 /*Init field not used in handle to zero */
mbed_official 87:085cde657901 1243 hspi->RxISR = 0;
mbed_official 87:085cde657901 1244 hspi->TxISR = 0;
mbed_official 87:085cde657901 1245 hspi->TxXferSize = 0;
mbed_official 87:085cde657901 1246 hspi->TxXferCount = 0;
mbed_official 87:085cde657901 1247
mbed_official 87:085cde657901 1248 /* Configure communication direction : 1Line */
mbed_official 87:085cde657901 1249 if(hspi->Init.Direction == SPI_DIRECTION_1LINE)
mbed_official 87:085cde657901 1250 {
mbed_official 87:085cde657901 1251 __HAL_SPI_1LINE_RX(hspi);
mbed_official 87:085cde657901 1252 }
mbed_official 87:085cde657901 1253 else if((hspi->Init.Direction == SPI_DIRECTION_2LINES)&&(hspi->Init.Mode == SPI_MODE_MASTER))
mbed_official 87:085cde657901 1254 {
mbed_official 87:085cde657901 1255 /* Process Unlocked */
mbed_official 87:085cde657901 1256 __HAL_UNLOCK(hspi);
mbed_official 87:085cde657901 1257
mbed_official 87:085cde657901 1258 /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */
mbed_official 87:085cde657901 1259 return HAL_SPI_TransmitReceive_DMA(hspi, pData, pData, Size);
mbed_official 87:085cde657901 1260 }
mbed_official 87:085cde657901 1261
mbed_official 87:085cde657901 1262 /* Reset CRC Calculation */
mbed_official 87:085cde657901 1263 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
mbed_official 87:085cde657901 1264 {
mbed_official 87:085cde657901 1265 __HAL_SPI_RESET_CRC(hspi);
mbed_official 87:085cde657901 1266 }
mbed_official 87:085cde657901 1267
mbed_official 369:2e96f1b71984 1268 /* Set the SPI RxDMA Half transfer complete callback */
mbed_official 369:2e96f1b71984 1269 hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfReceiveCplt;
mbed_official 369:2e96f1b71984 1270
mbed_official 87:085cde657901 1271 /* Set the SPI Rx DMA transfer complete callback */
mbed_official 87:085cde657901 1272 hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt;
mbed_official 87:085cde657901 1273
mbed_official 87:085cde657901 1274 /* Set the DMA error callback */
mbed_official 87:085cde657901 1275 hspi->hdmarx->XferErrorCallback = SPI_DMAError;
mbed_official 87:085cde657901 1276
mbed_official 87:085cde657901 1277 /* Enable the Rx DMA Stream */
mbed_official 87:085cde657901 1278 HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBuffPtr, hspi->RxXferCount);
mbed_official 87:085cde657901 1279
mbed_official 87:085cde657901 1280 /* Enable Rx DMA Request */
mbed_official 87:085cde657901 1281 hspi->Instance->CR2 |= SPI_CR2_RXDMAEN;
mbed_official 87:085cde657901 1282
mbed_official 87:085cde657901 1283 /* Process Unlocked */
mbed_official 87:085cde657901 1284 __HAL_UNLOCK(hspi);
mbed_official 87:085cde657901 1285
mbed_official 87:085cde657901 1286 /* Check if the SPI is already enabled */
mbed_official 87:085cde657901 1287 if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE)
mbed_official 87:085cde657901 1288 {
mbed_official 87:085cde657901 1289 /* Enable SPI peripheral */
mbed_official 87:085cde657901 1290 __HAL_SPI_ENABLE(hspi);
mbed_official 87:085cde657901 1291 }
mbed_official 87:085cde657901 1292
mbed_official 87:085cde657901 1293 return HAL_OK;
mbed_official 87:085cde657901 1294 }
mbed_official 87:085cde657901 1295 else
mbed_official 87:085cde657901 1296 {
mbed_official 87:085cde657901 1297 return HAL_BUSY;
mbed_official 87:085cde657901 1298 }
mbed_official 87:085cde657901 1299 }
mbed_official 87:085cde657901 1300
mbed_official 87:085cde657901 1301 /**
mbed_official 87:085cde657901 1302 * @brief Transmit and Receive an amount of data in no-blocking mode with DMA
mbed_official 226:b062af740e40 1303 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1304 * the configuration information for SPI module.
mbed_official 87:085cde657901 1305 * @param pTxData: pointer to transmission data buffer
mbed_official 87:085cde657901 1306 * @param pRxData: pointer to reception data buffer
mbed_official 87:085cde657901 1307 * @note When the CRC feature is enabled the pRxData Length must be Size + 1
mbed_official 87:085cde657901 1308 * @param Size: amount of data to be sent
mbed_official 87:085cde657901 1309 * @retval HAL status
mbed_official 87:085cde657901 1310 */
mbed_official 87:085cde657901 1311 HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size)
mbed_official 87:085cde657901 1312 {
mbed_official 87:085cde657901 1313 uint32_t tmpstate = 0;
mbed_official 87:085cde657901 1314 tmpstate = hspi->State;
mbed_official 369:2e96f1b71984 1315 if((tmpstate == HAL_SPI_STATE_READY) || ((hspi->Init.Mode == SPI_MODE_MASTER) && \
mbed_official 369:2e96f1b71984 1316 (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmpstate == HAL_SPI_STATE_BUSY_RX)))
mbed_official 87:085cde657901 1317 {
mbed_official 369:2e96f1b71984 1318 if((pTxData == HAL_NULL ) || (pRxData == HAL_NULL ) || (Size == 0))
mbed_official 87:085cde657901 1319 {
mbed_official 87:085cde657901 1320 return HAL_ERROR;
mbed_official 87:085cde657901 1321 }
mbed_official 87:085cde657901 1322
mbed_official 87:085cde657901 1323 /* Check the parameters */
mbed_official 87:085cde657901 1324 assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));
mbed_official 87:085cde657901 1325
mbed_official 87:085cde657901 1326 /* Process locked */
mbed_official 87:085cde657901 1327 __HAL_LOCK(hspi);
mbed_official 87:085cde657901 1328
mbed_official 87:085cde657901 1329 /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */
mbed_official 369:2e96f1b71984 1330 if(hspi->State != HAL_SPI_STATE_BUSY_RX)
mbed_official 87:085cde657901 1331 {
mbed_official 106:ced8cbb51063 1332 hspi->State = HAL_SPI_STATE_BUSY_TX_RX;
mbed_official 87:085cde657901 1333 }
mbed_official 87:085cde657901 1334
mbed_official 87:085cde657901 1335 /* Configure communication */
mbed_official 87:085cde657901 1336 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
mbed_official 87:085cde657901 1337
mbed_official 87:085cde657901 1338 hspi->pTxBuffPtr = (uint8_t*)pTxData;
mbed_official 87:085cde657901 1339 hspi->TxXferSize = Size;
mbed_official 87:085cde657901 1340 hspi->TxXferCount = Size;
mbed_official 87:085cde657901 1341
mbed_official 87:085cde657901 1342 hspi->pRxBuffPtr = (uint8_t*)pRxData;
mbed_official 87:085cde657901 1343 hspi->RxXferSize = Size;
mbed_official 87:085cde657901 1344 hspi->RxXferCount = Size;
mbed_official 87:085cde657901 1345
mbed_official 87:085cde657901 1346 /*Init field not used in handle to zero */
mbed_official 87:085cde657901 1347 hspi->RxISR = 0;
mbed_official 87:085cde657901 1348 hspi->TxISR = 0;
mbed_official 87:085cde657901 1349
mbed_official 87:085cde657901 1350 /* Reset CRC Calculation */
mbed_official 87:085cde657901 1351 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
mbed_official 87:085cde657901 1352 {
mbed_official 87:085cde657901 1353 __HAL_SPI_RESET_CRC(hspi);
mbed_official 87:085cde657901 1354 }
mbed_official 87:085cde657901 1355
mbed_official 106:ced8cbb51063 1356 /* Check if we are in Rx only or in Rx/Tx Mode and configure the DMA transfer complete callback */
mbed_official 106:ced8cbb51063 1357 if(hspi->State == HAL_SPI_STATE_BUSY_RX)
mbed_official 106:ced8cbb51063 1358 {
mbed_official 369:2e96f1b71984 1359 /* Set the SPI Rx DMA Half transfer complete callback */
mbed_official 369:2e96f1b71984 1360 hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfReceiveCplt;
mbed_official 369:2e96f1b71984 1361
mbed_official 106:ced8cbb51063 1362 hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt;
mbed_official 106:ced8cbb51063 1363 }
mbed_official 106:ced8cbb51063 1364 else
mbed_official 106:ced8cbb51063 1365 {
mbed_official 369:2e96f1b71984 1366 /* Set the SPI Tx/Rx DMA Half transfer complete callback */
mbed_official 369:2e96f1b71984 1367 hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfTransmitReceiveCplt;
mbed_official 369:2e96f1b71984 1368
mbed_official 106:ced8cbb51063 1369 hspi->hdmarx->XferCpltCallback = SPI_DMATransmitReceiveCplt;
mbed_official 106:ced8cbb51063 1370 }
mbed_official 87:085cde657901 1371
mbed_official 87:085cde657901 1372 /* Set the DMA error callback */
mbed_official 87:085cde657901 1373 hspi->hdmarx->XferErrorCallback = SPI_DMAError;
mbed_official 87:085cde657901 1374
mbed_official 87:085cde657901 1375 /* Enable the Rx DMA Stream */
mbed_official 87:085cde657901 1376 HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBuffPtr, hspi->RxXferCount);
mbed_official 87:085cde657901 1377
mbed_official 87:085cde657901 1378 /* Enable Rx DMA Request */
mbed_official 87:085cde657901 1379 hspi->Instance->CR2 |= SPI_CR2_RXDMAEN;
mbed_official 87:085cde657901 1380
mbed_official 369:2e96f1b71984 1381 /* Set the SPI Tx DMA transfer complete callback as HAL_NULL because the communication closing
mbed_official 87:085cde657901 1382 is performed in DMA reception complete callback */
mbed_official 369:2e96f1b71984 1383 hspi->hdmatx->XferCpltCallback = HAL_NULL;
mbed_official 87:085cde657901 1384
mbed_official 87:085cde657901 1385 /* Set the DMA error callback */
mbed_official 87:085cde657901 1386 hspi->hdmatx->XferErrorCallback = SPI_DMAError;
mbed_official 87:085cde657901 1387
mbed_official 87:085cde657901 1388 /* Enable the Tx DMA Stream */
mbed_official 87:085cde657901 1389 HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instance->DR, hspi->TxXferCount);
mbed_official 87:085cde657901 1390
mbed_official 369:2e96f1b71984 1391 /* Check if the SPI is already enabled */
mbed_official 87:085cde657901 1392 if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE)
mbed_official 87:085cde657901 1393 {
mbed_official 87:085cde657901 1394 /* Enable SPI peripheral */
mbed_official 87:085cde657901 1395 __HAL_SPI_ENABLE(hspi);
mbed_official 87:085cde657901 1396 }
mbed_official 87:085cde657901 1397
mbed_official 369:2e96f1b71984 1398 /* Enable Tx DMA Request */
mbed_official 369:2e96f1b71984 1399 hspi->Instance->CR2 |= SPI_CR2_TXDMAEN;
mbed_official 369:2e96f1b71984 1400
mbed_official 369:2e96f1b71984 1401 /* Process Unlocked */
mbed_official 369:2e96f1b71984 1402 __HAL_UNLOCK(hspi);
mbed_official 87:085cde657901 1403 return HAL_OK;
mbed_official 87:085cde657901 1404 }
mbed_official 87:085cde657901 1405 else
mbed_official 87:085cde657901 1406 {
mbed_official 87:085cde657901 1407 return HAL_BUSY;
mbed_official 87:085cde657901 1408 }
mbed_official 87:085cde657901 1409 }
mbed_official 87:085cde657901 1410
mbed_official 369:2e96f1b71984 1411
mbed_official 369:2e96f1b71984 1412 /**
mbed_official 369:2e96f1b71984 1413 * @brief Pauses the DMA Transfer.
mbed_official 369:2e96f1b71984 1414 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 369:2e96f1b71984 1415 * the configuration information for the specified SPI module.
mbed_official 369:2e96f1b71984 1416 * @retval HAL status
mbed_official 369:2e96f1b71984 1417 */
mbed_official 369:2e96f1b71984 1418 HAL_StatusTypeDef HAL_SPI_DMAPause(SPI_HandleTypeDef *hspi)
mbed_official 369:2e96f1b71984 1419 {
mbed_official 369:2e96f1b71984 1420 /* Process Locked */
mbed_official 369:2e96f1b71984 1421 __HAL_LOCK(hspi);
mbed_official 369:2e96f1b71984 1422
mbed_official 369:2e96f1b71984 1423 /* Disable the SPI DMA Tx & Rx requests */
mbed_official 369:2e96f1b71984 1424 hspi->Instance->CR2 &= (uint32_t)(~SPI_CR2_TXDMAEN);
mbed_official 369:2e96f1b71984 1425 hspi->Instance->CR2 &= (uint32_t)(~SPI_CR2_RXDMAEN);
mbed_official 369:2e96f1b71984 1426
mbed_official 369:2e96f1b71984 1427 /* Process Unlocked */
mbed_official 369:2e96f1b71984 1428 __HAL_UNLOCK(hspi);
mbed_official 369:2e96f1b71984 1429
mbed_official 369:2e96f1b71984 1430 return HAL_OK;
mbed_official 369:2e96f1b71984 1431 }
mbed_official 369:2e96f1b71984 1432
mbed_official 369:2e96f1b71984 1433 /**
mbed_official 369:2e96f1b71984 1434 * @brief Resumes the DMA Transfer.
mbed_official 369:2e96f1b71984 1435 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 369:2e96f1b71984 1436 * the configuration information for the specified SPI module.
mbed_official 369:2e96f1b71984 1437 * @retval HAL status
mbed_official 369:2e96f1b71984 1438 */
mbed_official 369:2e96f1b71984 1439 HAL_StatusTypeDef HAL_SPI_DMAResume(SPI_HandleTypeDef *hspi)
mbed_official 369:2e96f1b71984 1440 {
mbed_official 369:2e96f1b71984 1441 /* Process Locked */
mbed_official 369:2e96f1b71984 1442 __HAL_LOCK(hspi);
mbed_official 369:2e96f1b71984 1443
mbed_official 369:2e96f1b71984 1444 /* Enable the SPI DMA Tx & Rx requests */
mbed_official 369:2e96f1b71984 1445 hspi->Instance->CR2 |= SPI_CR2_TXDMAEN;
mbed_official 369:2e96f1b71984 1446 hspi->Instance->CR2 |= SPI_CR2_RXDMAEN;
mbed_official 369:2e96f1b71984 1447
mbed_official 369:2e96f1b71984 1448 /* Process Unlocked */
mbed_official 369:2e96f1b71984 1449 __HAL_UNLOCK(hspi);
mbed_official 369:2e96f1b71984 1450
mbed_official 369:2e96f1b71984 1451 return HAL_OK;
mbed_official 369:2e96f1b71984 1452 }
mbed_official 369:2e96f1b71984 1453
mbed_official 369:2e96f1b71984 1454 /**
mbed_official 369:2e96f1b71984 1455 * @brief Stops the DMA Transfer.
mbed_official 369:2e96f1b71984 1456 * @param huart: pointer to a UART_HandleTypeDef structure that contains
mbed_official 369:2e96f1b71984 1457 * the configuration information for the specified UART module.
mbed_official 369:2e96f1b71984 1458 * @retval HAL status
mbed_official 369:2e96f1b71984 1459 */
mbed_official 369:2e96f1b71984 1460 HAL_StatusTypeDef HAL_SPI_DMAStop(SPI_HandleTypeDef *hspi)
mbed_official 369:2e96f1b71984 1461 {
mbed_official 369:2e96f1b71984 1462 /* The Lock is not implemented on this API to allow the user application
mbed_official 369:2e96f1b71984 1463 to call the HAL SPI API under callbacks HAL_SPI_TxCpltCallback() or HAL_SPI_RxCpltCallback() or HAL_SPI_TxRxCpltCallback():
mbed_official 369:2e96f1b71984 1464 when calling HAL_DMA_Abort() API the DMA TX/RX Transfer complete interrupt is generated
mbed_official 369:2e96f1b71984 1465 and the correspond call back is executed HAL_SPI_TxCpltCallback() or HAL_SPI_RxCpltCallback() or HAL_SPI_TxRxCpltCallback()
mbed_official 369:2e96f1b71984 1466 */
mbed_official 369:2e96f1b71984 1467
mbed_official 369:2e96f1b71984 1468 /* Abort the SPI DMA tx Stream */
mbed_official 369:2e96f1b71984 1469 if(hspi->hdmatx != HAL_NULL)
mbed_official 369:2e96f1b71984 1470 {
mbed_official 369:2e96f1b71984 1471 HAL_DMA_Abort(hspi->hdmatx);
mbed_official 369:2e96f1b71984 1472 }
mbed_official 369:2e96f1b71984 1473 /* Abort the SPI DMA rx Stream */
mbed_official 369:2e96f1b71984 1474 if(hspi->hdmarx != HAL_NULL)
mbed_official 369:2e96f1b71984 1475 {
mbed_official 369:2e96f1b71984 1476 HAL_DMA_Abort(hspi->hdmarx);
mbed_official 369:2e96f1b71984 1477 }
mbed_official 369:2e96f1b71984 1478
mbed_official 369:2e96f1b71984 1479 /* Disable the SPI DMA Tx & Rx requests */
mbed_official 369:2e96f1b71984 1480 hspi->Instance->CR2 &= (uint32_t)(~SPI_CR2_TXDMAEN);
mbed_official 369:2e96f1b71984 1481 hspi->Instance->CR2 &= (uint32_t)(~SPI_CR2_RXDMAEN);
mbed_official 369:2e96f1b71984 1482
mbed_official 369:2e96f1b71984 1483 hspi->State = HAL_SPI_STATE_READY;
mbed_official 369:2e96f1b71984 1484
mbed_official 369:2e96f1b71984 1485 return HAL_OK;
mbed_official 369:2e96f1b71984 1486 }
mbed_official 369:2e96f1b71984 1487
mbed_official 87:085cde657901 1488 /**
mbed_official 87:085cde657901 1489 * @brief This function handles SPI interrupt request.
mbed_official 226:b062af740e40 1490 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1491 * the configuration information for SPI module.
mbed_official 87:085cde657901 1492 * @retval HAL status
mbed_official 87:085cde657901 1493 */
mbed_official 87:085cde657901 1494 void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi)
mbed_official 87:085cde657901 1495 {
mbed_official 87:085cde657901 1496 uint32_t tmp1 = 0, tmp2 = 0, tmp3 = 0;
mbed_official 87:085cde657901 1497
mbed_official 87:085cde657901 1498 tmp1 = __HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE);
mbed_official 87:085cde657901 1499 tmp2 = __HAL_SPI_GET_IT_SOURCE(hspi, SPI_IT_RXNE);
mbed_official 87:085cde657901 1500 tmp3 = __HAL_SPI_GET_FLAG(hspi, SPI_FLAG_OVR);
mbed_official 87:085cde657901 1501 /* SPI in mode Receiver and Overrun not occurred ---------------------------*/
mbed_official 87:085cde657901 1502 if((tmp1 != RESET) && (tmp2 != RESET) && (tmp3 == RESET))
mbed_official 87:085cde657901 1503 {
mbed_official 87:085cde657901 1504 hspi->RxISR(hspi);
mbed_official 87:085cde657901 1505 return;
mbed_official 87:085cde657901 1506 }
mbed_official 87:085cde657901 1507
mbed_official 87:085cde657901 1508 tmp1 = __HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE);
mbed_official 87:085cde657901 1509 tmp2 = __HAL_SPI_GET_IT_SOURCE(hspi, SPI_IT_TXE);
mbed_official 87:085cde657901 1510 /* SPI in mode Tramitter ---------------------------------------------------*/
mbed_official 87:085cde657901 1511 if((tmp1 != RESET) && (tmp2 != RESET))
mbed_official 87:085cde657901 1512 {
mbed_official 87:085cde657901 1513 hspi->TxISR(hspi);
mbed_official 87:085cde657901 1514 return;
mbed_official 87:085cde657901 1515 }
mbed_official 87:085cde657901 1516
mbed_official 87:085cde657901 1517 if(__HAL_SPI_GET_IT_SOURCE(hspi, SPI_IT_ERR) != RESET)
mbed_official 87:085cde657901 1518 {
mbed_official 226:b062af740e40 1519 /* SPI CRC error interrupt occurred ---------------------------------------*/
mbed_official 87:085cde657901 1520 if(__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET)
mbed_official 87:085cde657901 1521 {
mbed_official 87:085cde657901 1522 hspi->ErrorCode |= HAL_SPI_ERROR_CRC;
mbed_official 87:085cde657901 1523 __HAL_SPI_CLEAR_CRCERRFLAG(hspi);
mbed_official 87:085cde657901 1524 }
mbed_official 226:b062af740e40 1525 /* SPI Mode Fault error interrupt occurred --------------------------------*/
mbed_official 87:085cde657901 1526 if(__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_MODF) != RESET)
mbed_official 87:085cde657901 1527 {
mbed_official 87:085cde657901 1528 hspi->ErrorCode |= HAL_SPI_ERROR_MODF;
mbed_official 87:085cde657901 1529 __HAL_SPI_CLEAR_MODFFLAG(hspi);
mbed_official 87:085cde657901 1530 }
mbed_official 87:085cde657901 1531
mbed_official 226:b062af740e40 1532 /* SPI Overrun error interrupt occurred -----------------------------------*/
mbed_official 87:085cde657901 1533 if(__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_OVR) != RESET)
mbed_official 87:085cde657901 1534 {
mbed_official 87:085cde657901 1535 if(hspi->State != HAL_SPI_STATE_BUSY_TX)
mbed_official 87:085cde657901 1536 {
mbed_official 87:085cde657901 1537 hspi->ErrorCode |= HAL_SPI_ERROR_OVR;
mbed_official 87:085cde657901 1538 __HAL_SPI_CLEAR_OVRFLAG(hspi);
mbed_official 87:085cde657901 1539 }
mbed_official 87:085cde657901 1540 }
mbed_official 87:085cde657901 1541
mbed_official 226:b062af740e40 1542 /* SPI Frame error interrupt occurred -------------------------------------*/
mbed_official 87:085cde657901 1543 if(__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_FRE) != RESET)
mbed_official 87:085cde657901 1544 {
mbed_official 87:085cde657901 1545 hspi->ErrorCode |= HAL_SPI_ERROR_FRE;
mbed_official 87:085cde657901 1546 __HAL_SPI_CLEAR_FREFLAG(hspi);
mbed_official 87:085cde657901 1547 }
mbed_official 87:085cde657901 1548
mbed_official 87:085cde657901 1549 /* Call the Error call Back in case of Errors */
mbed_official 87:085cde657901 1550 if(hspi->ErrorCode!=HAL_SPI_ERROR_NONE)
mbed_official 87:085cde657901 1551 {
mbed_official 87:085cde657901 1552 hspi->State = HAL_SPI_STATE_READY;
mbed_official 87:085cde657901 1553 HAL_SPI_ErrorCallback(hspi);
mbed_official 87:085cde657901 1554 }
mbed_official 87:085cde657901 1555 }
mbed_official 87:085cde657901 1556 }
mbed_official 87:085cde657901 1557
mbed_official 87:085cde657901 1558 /**
mbed_official 87:085cde657901 1559 * @brief Tx Transfer completed callbacks
mbed_official 226:b062af740e40 1560 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1561 * the configuration information for SPI module.
mbed_official 87:085cde657901 1562 * @retval None
mbed_official 87:085cde657901 1563 */
mbed_official 87:085cde657901 1564 __weak void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
mbed_official 87:085cde657901 1565 {
mbed_official 87:085cde657901 1566 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 1567 the HAL_SPI_TxCpltCallback could be implenetd in the user file
mbed_official 87:085cde657901 1568 */
mbed_official 87:085cde657901 1569 }
mbed_official 87:085cde657901 1570
mbed_official 87:085cde657901 1571 /**
mbed_official 87:085cde657901 1572 * @brief Rx Transfer completed callbacks
mbed_official 226:b062af740e40 1573 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1574 * the configuration information for SPI module.
mbed_official 87:085cde657901 1575 * @retval None
mbed_official 87:085cde657901 1576 */
mbed_official 87:085cde657901 1577 __weak void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
mbed_official 87:085cde657901 1578 {
mbed_official 87:085cde657901 1579 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 1580 the HAL_SPI_RxCpltCallback() could be implenetd in the user file
mbed_official 87:085cde657901 1581 */
mbed_official 87:085cde657901 1582 }
mbed_official 87:085cde657901 1583
mbed_official 87:085cde657901 1584 /**
mbed_official 87:085cde657901 1585 * @brief Tx and Rx Transfer completed callbacks
mbed_official 226:b062af740e40 1586 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1587 * the configuration information for SPI module.
mbed_official 87:085cde657901 1588 * @retval None
mbed_official 87:085cde657901 1589 */
mbed_official 87:085cde657901 1590 __weak void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
mbed_official 87:085cde657901 1591 {
mbed_official 87:085cde657901 1592 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 1593 the HAL_SPI_TxRxCpltCallback() could be implenetd in the user file
mbed_official 87:085cde657901 1594 */
mbed_official 87:085cde657901 1595 }
mbed_official 87:085cde657901 1596
mbed_official 87:085cde657901 1597 /**
mbed_official 369:2e96f1b71984 1598 * @brief Tx Half Transfer completed callbacks
mbed_official 369:2e96f1b71984 1599 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 369:2e96f1b71984 1600 * the configuration information for SPI module.
mbed_official 369:2e96f1b71984 1601 * @retval None
mbed_official 369:2e96f1b71984 1602 */
mbed_official 369:2e96f1b71984 1603 __weak void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi)
mbed_official 369:2e96f1b71984 1604 {
mbed_official 369:2e96f1b71984 1605 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 369:2e96f1b71984 1606 the HAL_SPI_TxHalfCpltCallback could be implenetd in the user file
mbed_official 369:2e96f1b71984 1607 */
mbed_official 369:2e96f1b71984 1608 }
mbed_official 369:2e96f1b71984 1609
mbed_official 369:2e96f1b71984 1610 /**
mbed_official 369:2e96f1b71984 1611 * @brief Rx Half Transfer completed callbacks
mbed_official 369:2e96f1b71984 1612 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 369:2e96f1b71984 1613 * the configuration information for SPI module.
mbed_official 369:2e96f1b71984 1614 * @retval None
mbed_official 369:2e96f1b71984 1615 */
mbed_official 369:2e96f1b71984 1616 __weak void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi)
mbed_official 369:2e96f1b71984 1617 {
mbed_official 369:2e96f1b71984 1618 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 369:2e96f1b71984 1619 the HAL_SPI_RxHalfCpltCallback() could be implenetd in the user file
mbed_official 369:2e96f1b71984 1620 */
mbed_official 369:2e96f1b71984 1621 }
mbed_official 369:2e96f1b71984 1622
mbed_official 369:2e96f1b71984 1623 /**
mbed_official 369:2e96f1b71984 1624 * @brief Tx and Rx Transfer completed callbacks
mbed_official 369:2e96f1b71984 1625 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 369:2e96f1b71984 1626 * the configuration information for SPI module.
mbed_official 369:2e96f1b71984 1627 * @retval None
mbed_official 369:2e96f1b71984 1628 */
mbed_official 369:2e96f1b71984 1629 __weak void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi)
mbed_official 369:2e96f1b71984 1630 {
mbed_official 369:2e96f1b71984 1631 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 369:2e96f1b71984 1632 the HAL_SPI_TxRxHalfCpltCallback() could be implenetd in the user file
mbed_official 369:2e96f1b71984 1633 */
mbed_official 369:2e96f1b71984 1634 }
mbed_official 369:2e96f1b71984 1635
mbed_official 369:2e96f1b71984 1636 /**
mbed_official 87:085cde657901 1637 * @brief SPI error callbacks
mbed_official 226:b062af740e40 1638 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1639 * the configuration information for SPI module.
mbed_official 87:085cde657901 1640 * @retval None
mbed_official 87:085cde657901 1641 */
mbed_official 87:085cde657901 1642 __weak void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi)
mbed_official 87:085cde657901 1643 {
mbed_official 87:085cde657901 1644 /* NOTE : - This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 1645 the HAL_SPI_ErrorCallback() could be implenetd in the user file.
mbed_official 87:085cde657901 1646 - The ErrorCode parameter in the hspi handle is updated by the SPI processes
mbed_official 226:b062af740e40 1647 and user can use HAL_SPI_GetError() API to check the latest error occurred.
mbed_official 87:085cde657901 1648 */
mbed_official 87:085cde657901 1649 }
mbed_official 87:085cde657901 1650
mbed_official 87:085cde657901 1651 /**
mbed_official 87:085cde657901 1652 * @}
mbed_official 87:085cde657901 1653 */
mbed_official 87:085cde657901 1654
mbed_official 87:085cde657901 1655 /** @defgroup SPI_Group3 Peripheral State and Errors functions
mbed_official 87:085cde657901 1656 * @brief SPI control functions
mbed_official 87:085cde657901 1657 *
mbed_official 87:085cde657901 1658 @verbatim
mbed_official 87:085cde657901 1659 ===============================================================================
mbed_official 87:085cde657901 1660 ##### Peripheral State and Errors functions #####
mbed_official 87:085cde657901 1661 ===============================================================================
mbed_official 87:085cde657901 1662 [..]
mbed_official 87:085cde657901 1663 This subsection provides a set of functions allowing to control the SPI.
mbed_official 87:085cde657901 1664 (+) HAL_SPI_GetState() API can be helpful to check in run-time the state of the SPI peripheral
mbed_official 87:085cde657901 1665 (+) HAL_SPI_GetError() check in run-time Errors occurring during communication
mbed_official 87:085cde657901 1666 @endverbatim
mbed_official 87:085cde657901 1667 * @{
mbed_official 87:085cde657901 1668 */
mbed_official 87:085cde657901 1669
mbed_official 87:085cde657901 1670 /**
mbed_official 87:085cde657901 1671 * @brief Return the SPI state
mbed_official 226:b062af740e40 1672 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1673 * the configuration information for SPI module.
mbed_official 226:b062af740e40 1674 * @retval HAL state
mbed_official 87:085cde657901 1675 */
mbed_official 87:085cde657901 1676 HAL_SPI_StateTypeDef HAL_SPI_GetState(SPI_HandleTypeDef *hspi)
mbed_official 87:085cde657901 1677 {
mbed_official 87:085cde657901 1678 return hspi->State;
mbed_official 87:085cde657901 1679 }
mbed_official 87:085cde657901 1680
mbed_official 87:085cde657901 1681 /**
mbed_official 87:085cde657901 1682 * @brief Return the SPI error code
mbed_official 226:b062af740e40 1683 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1684 * the configuration information for SPI module.
mbed_official 87:085cde657901 1685 * @retval SPI Error Code
mbed_official 87:085cde657901 1686 */
mbed_official 87:085cde657901 1687 HAL_SPI_ErrorTypeDef HAL_SPI_GetError(SPI_HandleTypeDef *hspi)
mbed_official 87:085cde657901 1688 {
mbed_official 87:085cde657901 1689 return hspi->ErrorCode;
mbed_official 87:085cde657901 1690 }
mbed_official 87:085cde657901 1691
mbed_official 87:085cde657901 1692 /**
mbed_official 87:085cde657901 1693 * @}
mbed_official 87:085cde657901 1694 */
mbed_official 87:085cde657901 1695
mbed_official 87:085cde657901 1696 /**
mbed_official 87:085cde657901 1697 * @brief Interrupt Handler to close Tx transfer
mbed_official 226:b062af740e40 1698 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1699 * the configuration information for SPI module.
mbed_official 87:085cde657901 1700 * @retval void
mbed_official 87:085cde657901 1701 */
mbed_official 87:085cde657901 1702 static void SPI_TxCloseIRQHandler(SPI_HandleTypeDef *hspi)
mbed_official 87:085cde657901 1703 {
mbed_official 106:ced8cbb51063 1704 /* Wait until TXE flag is set to send data */
mbed_official 106:ced8cbb51063 1705 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, SPI_TIMEOUT_VALUE) != HAL_OK)
mbed_official 87:085cde657901 1706 {
mbed_official 106:ced8cbb51063 1707 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
mbed_official 87:085cde657901 1708 }
mbed_official 87:085cde657901 1709
mbed_official 87:085cde657901 1710 /* Disable TXE interrupt */
mbed_official 87:085cde657901 1711 __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE ));
mbed_official 87:085cde657901 1712
mbed_official 87:085cde657901 1713 /* Disable ERR interrupt if Receive process is finished */
mbed_official 87:085cde657901 1714 if(__HAL_SPI_GET_IT_SOURCE(hspi, SPI_IT_RXNE) == RESET)
mbed_official 87:085cde657901 1715 {
mbed_official 87:085cde657901 1716 __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_ERR));
mbed_official 87:085cde657901 1717
mbed_official 87:085cde657901 1718 /* Wait until Busy flag is reset before disabling SPI */
mbed_official 87:085cde657901 1719 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_BSY, SET, SPI_TIMEOUT_VALUE) != HAL_OK)
mbed_official 87:085cde657901 1720 {
mbed_official 87:085cde657901 1721 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
mbed_official 87:085cde657901 1722 }
mbed_official 87:085cde657901 1723
mbed_official 87:085cde657901 1724 /* Clear OVERUN flag in 2 Lines communication mode because received is not read */
mbed_official 87:085cde657901 1725 if(hspi->Init.Direction == SPI_DIRECTION_2LINES)
mbed_official 87:085cde657901 1726 {
mbed_official 87:085cde657901 1727 __HAL_SPI_CLEAR_OVRFLAG(hspi);
mbed_official 87:085cde657901 1728 }
mbed_official 87:085cde657901 1729
mbed_official 87:085cde657901 1730 /* Check if Errors has been detected during transfer */
mbed_official 87:085cde657901 1731 if(hspi->ErrorCode == HAL_SPI_ERROR_NONE)
mbed_official 87:085cde657901 1732 {
mbed_official 87:085cde657901 1733 /* Check if we are in Tx or in Rx/Tx Mode */
mbed_official 87:085cde657901 1734 if(hspi->State == HAL_SPI_STATE_BUSY_TX_RX)
mbed_official 87:085cde657901 1735 {
mbed_official 106:ced8cbb51063 1736 /* Set state to READY before run the Callback Complete */
mbed_official 106:ced8cbb51063 1737 hspi->State = HAL_SPI_STATE_READY;
mbed_official 87:085cde657901 1738 HAL_SPI_TxRxCpltCallback(hspi);
mbed_official 87:085cde657901 1739 }
mbed_official 87:085cde657901 1740 else
mbed_official 87:085cde657901 1741 {
mbed_official 106:ced8cbb51063 1742 /* Set state to READY before run the Callback Complete */
mbed_official 106:ced8cbb51063 1743 hspi->State = HAL_SPI_STATE_READY;
mbed_official 106:ced8cbb51063 1744 HAL_SPI_TxCpltCallback(hspi);
mbed_official 87:085cde657901 1745 }
mbed_official 87:085cde657901 1746 }
mbed_official 87:085cde657901 1747 else
mbed_official 87:085cde657901 1748 {
mbed_official 106:ced8cbb51063 1749 /* Set state to READY before run the Callback Complete */
mbed_official 106:ced8cbb51063 1750 hspi->State = HAL_SPI_STATE_READY;
mbed_official 87:085cde657901 1751 /* Call Error call back in case of Error */
mbed_official 87:085cde657901 1752 HAL_SPI_ErrorCallback(hspi);
mbed_official 87:085cde657901 1753 }
mbed_official 87:085cde657901 1754 }
mbed_official 87:085cde657901 1755 }
mbed_official 87:085cde657901 1756
mbed_official 87:085cde657901 1757 /**
mbed_official 87:085cde657901 1758 * @brief Interrupt Handler to transmit amount of data in no-blocking mode
mbed_official 226:b062af740e40 1759 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1760 * the configuration information for SPI module.
mbed_official 87:085cde657901 1761 * @retval void
mbed_official 87:085cde657901 1762 */
mbed_official 87:085cde657901 1763 static void SPI_TxISR(SPI_HandleTypeDef *hspi)
mbed_official 87:085cde657901 1764 {
mbed_official 87:085cde657901 1765 /* Transmit data in 8 Bit mode */
mbed_official 87:085cde657901 1766 if(hspi->Init.DataSize == SPI_DATASIZE_8BIT)
mbed_official 87:085cde657901 1767 {
mbed_official 87:085cde657901 1768 hspi->Instance->DR = (*hspi->pTxBuffPtr++);
mbed_official 87:085cde657901 1769 }
mbed_official 87:085cde657901 1770 /* Transmit data in 16 Bit mode */
mbed_official 87:085cde657901 1771 else
mbed_official 87:085cde657901 1772 {
mbed_official 87:085cde657901 1773 hspi->Instance->DR = *((uint16_t*)hspi->pTxBuffPtr);
mbed_official 87:085cde657901 1774 hspi->pTxBuffPtr+=2;
mbed_official 87:085cde657901 1775 }
mbed_official 87:085cde657901 1776 hspi->TxXferCount--;
mbed_official 87:085cde657901 1777
mbed_official 87:085cde657901 1778 if(hspi->TxXferCount == 0)
mbed_official 87:085cde657901 1779 {
mbed_official 87:085cde657901 1780 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
mbed_official 87:085cde657901 1781 {
mbed_official 87:085cde657901 1782 /* calculate and transfer CRC on Tx line */
mbed_official 87:085cde657901 1783 hspi->Instance->CR1 |= SPI_CR1_CRCNEXT;
mbed_official 87:085cde657901 1784 }
mbed_official 87:085cde657901 1785 SPI_TxCloseIRQHandler(hspi);
mbed_official 87:085cde657901 1786 }
mbed_official 87:085cde657901 1787 }
mbed_official 87:085cde657901 1788
mbed_official 87:085cde657901 1789 /**
mbed_official 87:085cde657901 1790 * @brief Interrupt Handler to close Rx transfer
mbed_official 226:b062af740e40 1791 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1792 * the configuration information for SPI module.
mbed_official 87:085cde657901 1793 * @retval void
mbed_official 87:085cde657901 1794 */
mbed_official 106:ced8cbb51063 1795 static void SPI_RxCloseIRQHandler(SPI_HandleTypeDef *hspi)
mbed_official 87:085cde657901 1796 {
mbed_official 87:085cde657901 1797 __IO uint16_t tmpreg;
mbed_official 87:085cde657901 1798
mbed_official 87:085cde657901 1799 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
mbed_official 87:085cde657901 1800 {
mbed_official 87:085cde657901 1801 /* Wait until RXNE flag is set to send data */
mbed_official 87:085cde657901 1802 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, SPI_TIMEOUT_VALUE) != HAL_OK)
mbed_official 87:085cde657901 1803 {
mbed_official 87:085cde657901 1804 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
mbed_official 87:085cde657901 1805 }
mbed_official 87:085cde657901 1806
mbed_official 87:085cde657901 1807 /* Read CRC to reset RXNE flag */
mbed_official 87:085cde657901 1808 tmpreg = hspi->Instance->DR;
mbed_official 87:085cde657901 1809
mbed_official 87:085cde657901 1810 /* Wait until RXNE flag is set to send data */
mbed_official 87:085cde657901 1811 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_TIMEOUT_VALUE) != HAL_OK)
mbed_official 87:085cde657901 1812 {
mbed_official 87:085cde657901 1813 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
mbed_official 87:085cde657901 1814 }
mbed_official 87:085cde657901 1815
mbed_official 87:085cde657901 1816 /* Check if CRC error occurred */
mbed_official 87:085cde657901 1817 if(__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET)
mbed_official 87:085cde657901 1818 {
mbed_official 87:085cde657901 1819 hspi->ErrorCode |= HAL_SPI_ERROR_CRC;
mbed_official 87:085cde657901 1820
mbed_official 87:085cde657901 1821 /* Reset CRC Calculation */
mbed_official 87:085cde657901 1822 __HAL_SPI_RESET_CRC(hspi);
mbed_official 87:085cde657901 1823 }
mbed_official 87:085cde657901 1824 }
mbed_official 87:085cde657901 1825
mbed_official 87:085cde657901 1826 /* Disable RXNE and ERR interrupt */
mbed_official 87:085cde657901 1827 __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE));
mbed_official 87:085cde657901 1828
mbed_official 87:085cde657901 1829 /* if Transmit process is finished */
mbed_official 87:085cde657901 1830 if(__HAL_SPI_GET_IT_SOURCE(hspi, SPI_IT_TXE) == RESET)
mbed_official 87:085cde657901 1831 {
mbed_official 87:085cde657901 1832 /* Disable ERR interrupt */
mbed_official 87:085cde657901 1833 __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_ERR));
mbed_official 87:085cde657901 1834
mbed_official 87:085cde657901 1835 if((hspi->Init.Mode == SPI_MODE_MASTER)&&((hspi->Init.Direction == SPI_DIRECTION_1LINE)||(hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY)))
mbed_official 87:085cde657901 1836 {
mbed_official 87:085cde657901 1837 /* Disable SPI peripheral */
mbed_official 87:085cde657901 1838 __HAL_SPI_DISABLE(hspi);
mbed_official 87:085cde657901 1839 }
mbed_official 87:085cde657901 1840
mbed_official 87:085cde657901 1841 /* Check if Errors has been detected during transfer */
mbed_official 87:085cde657901 1842 if(hspi->ErrorCode == HAL_SPI_ERROR_NONE)
mbed_official 87:085cde657901 1843 {
mbed_official 87:085cde657901 1844 /* Check if we are in Rx or in Rx/Tx Mode */
mbed_official 87:085cde657901 1845 if(hspi->State == HAL_SPI_STATE_BUSY_TX_RX)
mbed_official 87:085cde657901 1846 {
mbed_official 106:ced8cbb51063 1847 /* Set state to READY before run the Callback Complete */
mbed_official 106:ced8cbb51063 1848 hspi->State = HAL_SPI_STATE_READY;
mbed_official 87:085cde657901 1849 HAL_SPI_TxRxCpltCallback(hspi);
mbed_official 369:2e96f1b71984 1850 }
mbed_official 369:2e96f1b71984 1851 else
mbed_official 87:085cde657901 1852 {
mbed_official 106:ced8cbb51063 1853 /* Set state to READY before run the Callback Complete */
mbed_official 106:ced8cbb51063 1854 hspi->State = HAL_SPI_STATE_READY;
mbed_official 87:085cde657901 1855 HAL_SPI_RxCpltCallback(hspi);
mbed_official 87:085cde657901 1856 }
mbed_official 87:085cde657901 1857 }
mbed_official 87:085cde657901 1858 else
mbed_official 87:085cde657901 1859 {
mbed_official 106:ced8cbb51063 1860 /* Set state to READY before run the Callback Complete */
mbed_official 106:ced8cbb51063 1861 hspi->State = HAL_SPI_STATE_READY;
mbed_official 87:085cde657901 1862 /* Call Error call back in case of Error */
mbed_official 87:085cde657901 1863 HAL_SPI_ErrorCallback(hspi);
mbed_official 87:085cde657901 1864 }
mbed_official 87:085cde657901 1865 }
mbed_official 87:085cde657901 1866 }
mbed_official 87:085cde657901 1867
mbed_official 87:085cde657901 1868 /**
mbed_official 87:085cde657901 1869 * @brief Interrupt Handler to receive amount of data in 2Lines mode
mbed_official 226:b062af740e40 1870 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1871 * the configuration information for SPI module.
mbed_official 87:085cde657901 1872 * @retval void
mbed_official 87:085cde657901 1873 */
mbed_official 87:085cde657901 1874 static void SPI_2LinesRxISR(SPI_HandleTypeDef *hspi)
mbed_official 87:085cde657901 1875 {
mbed_official 87:085cde657901 1876 /* Receive data in 8 Bit mode */
mbed_official 87:085cde657901 1877 if(hspi->Init.DataSize == SPI_DATASIZE_8BIT)
mbed_official 87:085cde657901 1878 {
mbed_official 87:085cde657901 1879 (*hspi->pRxBuffPtr++) = hspi->Instance->DR;
mbed_official 87:085cde657901 1880 }
mbed_official 87:085cde657901 1881 /* Receive data in 16 Bit mode */
mbed_official 87:085cde657901 1882 else
mbed_official 87:085cde657901 1883 {
mbed_official 87:085cde657901 1884 *((uint16_t*)hspi->pRxBuffPtr) = hspi->Instance->DR;
mbed_official 87:085cde657901 1885 hspi->pRxBuffPtr+=2;
mbed_official 87:085cde657901 1886 }
mbed_official 87:085cde657901 1887 hspi->RxXferCount--;
mbed_official 87:085cde657901 1888
mbed_official 87:085cde657901 1889 if(hspi->RxXferCount==0)
mbed_official 87:085cde657901 1890 {
mbed_official 106:ced8cbb51063 1891 SPI_RxCloseIRQHandler(hspi);
mbed_official 87:085cde657901 1892 }
mbed_official 87:085cde657901 1893 }
mbed_official 87:085cde657901 1894
mbed_official 87:085cde657901 1895 /**
mbed_official 87:085cde657901 1896 * @brief Interrupt Handler to receive amount of data in no-blocking mode
mbed_official 226:b062af740e40 1897 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1898 * the configuration information for SPI module.
mbed_official 87:085cde657901 1899 * @retval void
mbed_official 87:085cde657901 1900 */
mbed_official 87:085cde657901 1901 static void SPI_RxISR(SPI_HandleTypeDef *hspi)
mbed_official 87:085cde657901 1902 {
mbed_official 87:085cde657901 1903 /* Receive data in 8 Bit mode */
mbed_official 87:085cde657901 1904 if(hspi->Init.DataSize == SPI_DATASIZE_8BIT)
mbed_official 87:085cde657901 1905 {
mbed_official 87:085cde657901 1906 (*hspi->pRxBuffPtr++) = hspi->Instance->DR;
mbed_official 87:085cde657901 1907 }
mbed_official 87:085cde657901 1908 /* Receive data in 16 Bit mode */
mbed_official 87:085cde657901 1909 else
mbed_official 87:085cde657901 1910 {
mbed_official 87:085cde657901 1911 *((uint16_t*)hspi->pRxBuffPtr) = hspi->Instance->DR;
mbed_official 87:085cde657901 1912 hspi->pRxBuffPtr+=2;
mbed_official 87:085cde657901 1913 }
mbed_official 87:085cde657901 1914 hspi->RxXferCount--;
mbed_official 87:085cde657901 1915
mbed_official 87:085cde657901 1916 /* Enable CRC Transmission */
mbed_official 87:085cde657901 1917 if((hspi->RxXferCount == 1) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED))
mbed_official 87:085cde657901 1918 {
mbed_official 87:085cde657901 1919 /* Set CRC Next to calculate CRC on Rx side */
mbed_official 87:085cde657901 1920 hspi->Instance->CR1 |= SPI_CR1_CRCNEXT;
mbed_official 87:085cde657901 1921 }
mbed_official 87:085cde657901 1922
mbed_official 87:085cde657901 1923 if(hspi->RxXferCount == 0)
mbed_official 87:085cde657901 1924 {
mbed_official 106:ced8cbb51063 1925 SPI_RxCloseIRQHandler(hspi);
mbed_official 87:085cde657901 1926 }
mbed_official 87:085cde657901 1927 }
mbed_official 87:085cde657901 1928
mbed_official 87:085cde657901 1929 /**
mbed_official 87:085cde657901 1930 * @brief DMA SPI transmit process complete callback
mbed_official 226:b062af740e40 1931 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1932 * the configuration information for the specified DMA module.
mbed_official 87:085cde657901 1933 * @retval None
mbed_official 87:085cde657901 1934 */
mbed_official 87:085cde657901 1935 static void SPI_DMATransmitCplt(DMA_HandleTypeDef *hdma)
mbed_official 87:085cde657901 1936 {
mbed_official 87:085cde657901 1937 SPI_HandleTypeDef* hspi = ( SPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 87:085cde657901 1938
mbed_official 369:2e96f1b71984 1939 /* DMA Normal Mode */
mbed_official 369:2e96f1b71984 1940 if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0)
mbed_official 87:085cde657901 1941 {
mbed_official 369:2e96f1b71984 1942 /* Wait until TXE flag is set to send data */
mbed_official 369:2e96f1b71984 1943 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, SPI_TIMEOUT_VALUE) != HAL_OK)
mbed_official 369:2e96f1b71984 1944 {
mbed_official 369:2e96f1b71984 1945 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
mbed_official 369:2e96f1b71984 1946 }
mbed_official 369:2e96f1b71984 1947 /* Disable Tx DMA Request */
mbed_official 369:2e96f1b71984 1948 hspi->Instance->CR2 &= (uint32_t)(~SPI_CR2_TXDMAEN);
mbed_official 87:085cde657901 1949
mbed_official 369:2e96f1b71984 1950 /* Wait until Busy flag is reset before disabling SPI */
mbed_official 369:2e96f1b71984 1951 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_BSY, SET, SPI_TIMEOUT_VALUE) != HAL_OK)
mbed_official 369:2e96f1b71984 1952 {
mbed_official 369:2e96f1b71984 1953 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
mbed_official 369:2e96f1b71984 1954 }
mbed_official 369:2e96f1b71984 1955
mbed_official 369:2e96f1b71984 1956 hspi->TxXferCount = 0;
mbed_official 369:2e96f1b71984 1957
mbed_official 369:2e96f1b71984 1958 hspi->State = HAL_SPI_STATE_READY;
mbed_official 87:085cde657901 1959 }
mbed_official 87:085cde657901 1960
mbed_official 87:085cde657901 1961 /* Clear OVERUN flag in 2 Lines communication mode because received is not read */
mbed_official 87:085cde657901 1962 if(hspi->Init.Direction == SPI_DIRECTION_2LINES)
mbed_official 87:085cde657901 1963 {
mbed_official 369:2e96f1b71984 1964 __HAL_SPI_CLEAR_OVRFLAG(hspi);
mbed_official 87:085cde657901 1965 }
mbed_official 87:085cde657901 1966
mbed_official 87:085cde657901 1967 /* Check if Errors has been detected during transfer */
mbed_official 87:085cde657901 1968 if(hspi->ErrorCode != HAL_SPI_ERROR_NONE)
mbed_official 87:085cde657901 1969 {
mbed_official 87:085cde657901 1970 HAL_SPI_ErrorCallback(hspi);
mbed_official 87:085cde657901 1971 }
mbed_official 87:085cde657901 1972 else
mbed_official 87:085cde657901 1973 {
mbed_official 87:085cde657901 1974 HAL_SPI_TxCpltCallback(hspi);
mbed_official 87:085cde657901 1975 }
mbed_official 87:085cde657901 1976 }
mbed_official 87:085cde657901 1977
mbed_official 87:085cde657901 1978 /**
mbed_official 87:085cde657901 1979 * @brief DMA SPI receive process complete callback
mbed_official 226:b062af740e40 1980 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1981 * the configuration information for the specified DMA module.
mbed_official 87:085cde657901 1982 * @retval None
mbed_official 87:085cde657901 1983 */
mbed_official 87:085cde657901 1984 static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
mbed_official 87:085cde657901 1985 {
mbed_official 87:085cde657901 1986 __IO uint16_t tmpreg;
mbed_official 369:2e96f1b71984 1987
mbed_official 87:085cde657901 1988 SPI_HandleTypeDef* hspi = ( SPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 369:2e96f1b71984 1989 /* DMA Normal mode */
mbed_official 369:2e96f1b71984 1990 if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0)
mbed_official 87:085cde657901 1991 {
mbed_official 369:2e96f1b71984 1992 if((hspi->Init.Mode == SPI_MODE_MASTER)&&((hspi->Init.Direction == SPI_DIRECTION_1LINE)||(hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY)))
mbed_official 87:085cde657901 1993 {
mbed_official 369:2e96f1b71984 1994 /* Disable SPI peripheral */
mbed_official 369:2e96f1b71984 1995 __HAL_SPI_DISABLE(hspi);
mbed_official 87:085cde657901 1996 }
mbed_official 369:2e96f1b71984 1997
mbed_official 369:2e96f1b71984 1998 /* Disable Rx DMA Request */
mbed_official 369:2e96f1b71984 1999 hspi->Instance->CR2 &= (uint32_t)(~SPI_CR2_RXDMAEN);
mbed_official 369:2e96f1b71984 2000 /* Disable Tx DMA Request (done by default to handle the case Master RX direction 2 lines) */
mbed_official 369:2e96f1b71984 2001 hspi->Instance->CR2 &= (uint32_t)(~SPI_CR2_TXDMAEN);
mbed_official 369:2e96f1b71984 2002
mbed_official 369:2e96f1b71984 2003 hspi->RxXferCount = 0;
mbed_official 369:2e96f1b71984 2004 hspi->State = HAL_SPI_STATE_READY;
mbed_official 369:2e96f1b71984 2005
mbed_official 369:2e96f1b71984 2006
mbed_official 369:2e96f1b71984 2007 /* Reset CRC Calculation */
mbed_official 369:2e96f1b71984 2008 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
mbed_official 87:085cde657901 2009 {
mbed_official 369:2e96f1b71984 2010 /* Wait until RXNE flag is set to send data */
mbed_official 369:2e96f1b71984 2011 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, SPI_TIMEOUT_VALUE) != HAL_OK)
mbed_official 369:2e96f1b71984 2012 {
mbed_official 369:2e96f1b71984 2013 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
mbed_official 369:2e96f1b71984 2014 }
mbed_official 369:2e96f1b71984 2015
mbed_official 369:2e96f1b71984 2016 /* Read CRC */
mbed_official 369:2e96f1b71984 2017 tmpreg = hspi->Instance->DR;
mbed_official 369:2e96f1b71984 2018
mbed_official 369:2e96f1b71984 2019 /* Wait until RXNE flag is set */
mbed_official 369:2e96f1b71984 2020 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_TIMEOUT_VALUE) != HAL_OK)
mbed_official 369:2e96f1b71984 2021 {
mbed_official 369:2e96f1b71984 2022 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
mbed_official 369:2e96f1b71984 2023 }
mbed_official 369:2e96f1b71984 2024
mbed_official 369:2e96f1b71984 2025 /* Check if CRC error occurred */
mbed_official 369:2e96f1b71984 2026 if(__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET)
mbed_official 369:2e96f1b71984 2027 {
mbed_official 369:2e96f1b71984 2028 hspi->ErrorCode |= HAL_SPI_ERROR_CRC;
mbed_official 369:2e96f1b71984 2029 __HAL_SPI_CLEAR_CRCERRFLAG(hspi);
mbed_official 369:2e96f1b71984 2030 }
mbed_official 87:085cde657901 2031 }
mbed_official 369:2e96f1b71984 2032
mbed_official 369:2e96f1b71984 2033 /* Check if Errors has been detected during transfer */
mbed_official 369:2e96f1b71984 2034 if(hspi->ErrorCode != HAL_SPI_ERROR_NONE)
mbed_official 369:2e96f1b71984 2035 {
mbed_official 369:2e96f1b71984 2036 HAL_SPI_ErrorCallback(hspi);
mbed_official 369:2e96f1b71984 2037 }
mbed_official 369:2e96f1b71984 2038 else
mbed_official 369:2e96f1b71984 2039 {
mbed_official 369:2e96f1b71984 2040 HAL_SPI_RxCpltCallback(hspi);
mbed_official 369:2e96f1b71984 2041 }
mbed_official 87:085cde657901 2042 }
mbed_official 87:085cde657901 2043 else
mbed_official 87:085cde657901 2044 {
mbed_official 87:085cde657901 2045 HAL_SPI_RxCpltCallback(hspi);
mbed_official 87:085cde657901 2046 }
mbed_official 87:085cde657901 2047 }
mbed_official 87:085cde657901 2048
mbed_official 87:085cde657901 2049 /**
mbed_official 87:085cde657901 2050 * @brief DMA SPI transmit receive process complete callback
mbed_official 226:b062af740e40 2051 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2052 * the configuration information for the specified DMA module.
mbed_official 87:085cde657901 2053 * @retval None
mbed_official 87:085cde657901 2054 */
mbed_official 87:085cde657901 2055 static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma)
mbed_official 87:085cde657901 2056 {
mbed_official 87:085cde657901 2057 __IO uint16_t tmpreg;
mbed_official 369:2e96f1b71984 2058
mbed_official 87:085cde657901 2059 SPI_HandleTypeDef* hspi = ( SPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 369:2e96f1b71984 2060 if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0)
mbed_official 87:085cde657901 2061 {
mbed_official 369:2e96f1b71984 2062 /* Reset CRC Calculation */
mbed_official 369:2e96f1b71984 2063 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
mbed_official 87:085cde657901 2064 {
mbed_official 369:2e96f1b71984 2065 /* Check if CRC is done on going (RXNE flag set) */
mbed_official 369:2e96f1b71984 2066 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_TIMEOUT_VALUE) == HAL_OK)
mbed_official 87:085cde657901 2067 {
mbed_official 369:2e96f1b71984 2068 /* Wait until RXNE flag is set to send data */
mbed_official 369:2e96f1b71984 2069 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, SPI_TIMEOUT_VALUE) != HAL_OK)
mbed_official 369:2e96f1b71984 2070 {
mbed_official 369:2e96f1b71984 2071 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
mbed_official 369:2e96f1b71984 2072 }
mbed_official 369:2e96f1b71984 2073 }
mbed_official 369:2e96f1b71984 2074 /* Read CRC */
mbed_official 369:2e96f1b71984 2075 tmpreg = hspi->Instance->DR;
mbed_official 369:2e96f1b71984 2076
mbed_official 369:2e96f1b71984 2077 /* Check if CRC error occurred */
mbed_official 369:2e96f1b71984 2078 if(__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET)
mbed_official 369:2e96f1b71984 2079 {
mbed_official 369:2e96f1b71984 2080 hspi->ErrorCode |= HAL_SPI_ERROR_CRC;
mbed_official 369:2e96f1b71984 2081 __HAL_SPI_CLEAR_CRCERRFLAG(hspi);
mbed_official 87:085cde657901 2082 }
mbed_official 87:085cde657901 2083 }
mbed_official 87:085cde657901 2084
mbed_official 369:2e96f1b71984 2085 /* Wait until TXE flag is set to send data */
mbed_official 369:2e96f1b71984 2086 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, SPI_TIMEOUT_VALUE) != HAL_OK)
mbed_official 369:2e96f1b71984 2087 {
mbed_official 369:2e96f1b71984 2088 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
mbed_official 369:2e96f1b71984 2089 }
mbed_official 369:2e96f1b71984 2090 /* Disable Tx DMA Request */
mbed_official 369:2e96f1b71984 2091 hspi->Instance->CR2 &= (uint32_t)(~SPI_CR2_TXDMAEN);
mbed_official 369:2e96f1b71984 2092
mbed_official 369:2e96f1b71984 2093 /* Wait until Busy flag is reset before disabling SPI */
mbed_official 369:2e96f1b71984 2094 if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_BSY, SET, SPI_TIMEOUT_VALUE) != HAL_OK)
mbed_official 369:2e96f1b71984 2095 {
mbed_official 369:2e96f1b71984 2096 hspi->ErrorCode |= HAL_SPI_ERROR_FLAG;
mbed_official 369:2e96f1b71984 2097 }
mbed_official 369:2e96f1b71984 2098
mbed_official 369:2e96f1b71984 2099 /* Disable Rx DMA Request */
mbed_official 369:2e96f1b71984 2100 hspi->Instance->CR2 &= (uint32_t)(~SPI_CR2_RXDMAEN);
mbed_official 369:2e96f1b71984 2101
mbed_official 369:2e96f1b71984 2102 hspi->TxXferCount = 0;
mbed_official 369:2e96f1b71984 2103 hspi->RxXferCount = 0;
mbed_official 369:2e96f1b71984 2104
mbed_official 369:2e96f1b71984 2105 hspi->State = HAL_SPI_STATE_READY;
mbed_official 369:2e96f1b71984 2106
mbed_official 369:2e96f1b71984 2107
mbed_official 369:2e96f1b71984 2108 /* Check if Errors has been detected during transfer */
mbed_official 369:2e96f1b71984 2109 if(hspi->ErrorCode != HAL_SPI_ERROR_NONE)
mbed_official 369:2e96f1b71984 2110 {
mbed_official 369:2e96f1b71984 2111 HAL_SPI_ErrorCallback(hspi);
mbed_official 369:2e96f1b71984 2112 }
mbed_official 369:2e96f1b71984 2113 else
mbed_official 369:2e96f1b71984 2114 {
mbed_official 369:2e96f1b71984 2115 HAL_SPI_TxRxCpltCallback(hspi);
mbed_official 369:2e96f1b71984 2116 }
mbed_official 87:085cde657901 2117 }
mbed_official 87:085cde657901 2118 else
mbed_official 87:085cde657901 2119 {
mbed_official 87:085cde657901 2120 HAL_SPI_TxRxCpltCallback(hspi);
mbed_official 87:085cde657901 2121 }
mbed_official 87:085cde657901 2122 }
mbed_official 87:085cde657901 2123
mbed_official 87:085cde657901 2124 /**
mbed_official 369:2e96f1b71984 2125 * @brief DMA SPI half transmit process complete callback
mbed_official 369:2e96f1b71984 2126 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 369:2e96f1b71984 2127 * the configuration information for the specified DMA module.
mbed_official 369:2e96f1b71984 2128 * @retval None
mbed_official 369:2e96f1b71984 2129 */
mbed_official 369:2e96f1b71984 2130 static void SPI_DMAHalfTransmitCplt(DMA_HandleTypeDef *hdma)
mbed_official 369:2e96f1b71984 2131 {
mbed_official 369:2e96f1b71984 2132 SPI_HandleTypeDef* hspi = ( SPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 369:2e96f1b71984 2133
mbed_official 369:2e96f1b71984 2134 HAL_SPI_TxHalfCpltCallback(hspi);
mbed_official 369:2e96f1b71984 2135 }
mbed_official 369:2e96f1b71984 2136
mbed_official 369:2e96f1b71984 2137 /**
mbed_official 369:2e96f1b71984 2138 * @brief DMA SPI half receive process complete callback
mbed_official 369:2e96f1b71984 2139 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 369:2e96f1b71984 2140 * the configuration information for the specified DMA module.
mbed_official 369:2e96f1b71984 2141 * @retval None
mbed_official 369:2e96f1b71984 2142 */
mbed_official 369:2e96f1b71984 2143 static void SPI_DMAHalfReceiveCplt(DMA_HandleTypeDef *hdma)
mbed_official 369:2e96f1b71984 2144 {
mbed_official 369:2e96f1b71984 2145 SPI_HandleTypeDef* hspi = ( SPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 369:2e96f1b71984 2146
mbed_official 369:2e96f1b71984 2147 HAL_SPI_RxHalfCpltCallback(hspi);
mbed_official 369:2e96f1b71984 2148 }
mbed_official 369:2e96f1b71984 2149
mbed_official 369:2e96f1b71984 2150 /**
mbed_official 369:2e96f1b71984 2151 * @brief DMA SPI Half transmit receive process complete callback
mbed_official 369:2e96f1b71984 2152 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 369:2e96f1b71984 2153 * the configuration information for the specified DMA module.
mbed_official 369:2e96f1b71984 2154 * @retval None
mbed_official 369:2e96f1b71984 2155 */
mbed_official 369:2e96f1b71984 2156 static void SPI_DMAHalfTransmitReceiveCplt(DMA_HandleTypeDef *hdma)
mbed_official 369:2e96f1b71984 2157 {
mbed_official 369:2e96f1b71984 2158 SPI_HandleTypeDef* hspi = ( SPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 369:2e96f1b71984 2159
mbed_official 369:2e96f1b71984 2160 HAL_SPI_TxRxHalfCpltCallback(hspi);
mbed_official 369:2e96f1b71984 2161 }
mbed_official 369:2e96f1b71984 2162
mbed_official 369:2e96f1b71984 2163 /**
mbed_official 87:085cde657901 2164 * @brief DMA SPI communication error callback
mbed_official 226:b062af740e40 2165 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2166 * the configuration information for the specified DMA module.
mbed_official 87:085cde657901 2167 * @retval None
mbed_official 87:085cde657901 2168 */
mbed_official 87:085cde657901 2169 static void SPI_DMAError(DMA_HandleTypeDef *hdma)
mbed_official 87:085cde657901 2170 {
mbed_official 87:085cde657901 2171 SPI_HandleTypeDef* hspi = (SPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 87:085cde657901 2172 hspi->TxXferCount = 0;
mbed_official 87:085cde657901 2173 hspi->RxXferCount = 0;
mbed_official 87:085cde657901 2174 hspi->State= HAL_SPI_STATE_READY;
mbed_official 87:085cde657901 2175 hspi->ErrorCode |= HAL_SPI_ERROR_DMA;
mbed_official 87:085cde657901 2176 HAL_SPI_ErrorCallback(hspi);
mbed_official 87:085cde657901 2177 }
mbed_official 87:085cde657901 2178
mbed_official 87:085cde657901 2179 /**
mbed_official 87:085cde657901 2180 * @brief This function handles SPI Communication Timeout.
mbed_official 226:b062af740e40 2181 * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2182 * the configuration information for SPI module.
mbed_official 87:085cde657901 2183 * @retval HAL status
mbed_official 87:085cde657901 2184 */
mbed_official 87:085cde657901 2185 static HAL_StatusTypeDef SPI_WaitOnFlagUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, FlagStatus Status, uint32_t Timeout)
mbed_official 87:085cde657901 2186 {
mbed_official 369:2e96f1b71984 2187 uint32_t tickstart = 0;
mbed_official 87:085cde657901 2188
mbed_official 369:2e96f1b71984 2189 /* Get tick */
mbed_official 369:2e96f1b71984 2190 tickstart = HAL_GetTick();
mbed_official 87:085cde657901 2191
mbed_official 87:085cde657901 2192 /* Wait until flag is set */
mbed_official 87:085cde657901 2193 if(Status == RESET)
mbed_official 87:085cde657901 2194 {
mbed_official 87:085cde657901 2195 while(__HAL_SPI_GET_FLAG(hspi, Flag) == RESET)
mbed_official 87:085cde657901 2196 {
mbed_official 87:085cde657901 2197 if(Timeout != HAL_MAX_DELAY)
mbed_official 87:085cde657901 2198 {
mbed_official 369:2e96f1b71984 2199 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
mbed_official 87:085cde657901 2200 {
mbed_official 87:085cde657901 2201 /* Disable the SPI and reset the CRC: the CRC value should be cleared
mbed_official 87:085cde657901 2202 on both master and slave sides in order to resynchronize the master
mbed_official 87:085cde657901 2203 and slave for their respective CRC calculation */
mbed_official 87:085cde657901 2204
mbed_official 87:085cde657901 2205 /* Disable TXE, RXNE and ERR interrupts for the interrupt process */
mbed_official 87:085cde657901 2206 __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR));
mbed_official 87:085cde657901 2207
mbed_official 87:085cde657901 2208 /* Disable SPI peripheral */
mbed_official 87:085cde657901 2209 __HAL_SPI_DISABLE(hspi);
mbed_official 87:085cde657901 2210
mbed_official 87:085cde657901 2211 /* Reset CRC Calculation */
mbed_official 87:085cde657901 2212 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
mbed_official 87:085cde657901 2213 {
mbed_official 87:085cde657901 2214 __HAL_SPI_RESET_CRC(hspi);
mbed_official 87:085cde657901 2215 }
mbed_official 87:085cde657901 2216
mbed_official 87:085cde657901 2217 hspi->State= HAL_SPI_STATE_READY;
mbed_official 87:085cde657901 2218
mbed_official 87:085cde657901 2219 /* Process Unlocked */
mbed_official 87:085cde657901 2220 __HAL_UNLOCK(hspi);
mbed_official 87:085cde657901 2221
mbed_official 87:085cde657901 2222 return HAL_TIMEOUT;
mbed_official 87:085cde657901 2223 }
mbed_official 87:085cde657901 2224 }
mbed_official 87:085cde657901 2225 }
mbed_official 87:085cde657901 2226 }
mbed_official 87:085cde657901 2227 else
mbed_official 87:085cde657901 2228 {
mbed_official 87:085cde657901 2229 while(__HAL_SPI_GET_FLAG(hspi, Flag) != RESET)
mbed_official 87:085cde657901 2230 {
mbed_official 87:085cde657901 2231 if(Timeout != HAL_MAX_DELAY)
mbed_official 87:085cde657901 2232 {
mbed_official 369:2e96f1b71984 2233 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
mbed_official 87:085cde657901 2234 {
mbed_official 87:085cde657901 2235 /* Disable the SPI and reset the CRC: the CRC value should be cleared
mbed_official 87:085cde657901 2236 on both master and slave sides in order to resynchronize the master
mbed_official 87:085cde657901 2237 and slave for their respective CRC calculation */
mbed_official 87:085cde657901 2238
mbed_official 87:085cde657901 2239 /* Disable TXE, RXNE and ERR interrupts for the interrupt process */
mbed_official 87:085cde657901 2240 __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR));
mbed_official 87:085cde657901 2241
mbed_official 87:085cde657901 2242 /* Disable SPI peripheral */
mbed_official 87:085cde657901 2243 __HAL_SPI_DISABLE(hspi);
mbed_official 87:085cde657901 2244
mbed_official 87:085cde657901 2245 /* Reset CRC Calculation */
mbed_official 87:085cde657901 2246 if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED)
mbed_official 87:085cde657901 2247 {
mbed_official 87:085cde657901 2248 __HAL_SPI_RESET_CRC(hspi);
mbed_official 87:085cde657901 2249 }
mbed_official 87:085cde657901 2250
mbed_official 87:085cde657901 2251 hspi->State= HAL_SPI_STATE_READY;
mbed_official 87:085cde657901 2252
mbed_official 87:085cde657901 2253 /* Process Unlocked */
mbed_official 87:085cde657901 2254 __HAL_UNLOCK(hspi);
mbed_official 87:085cde657901 2255
mbed_official 87:085cde657901 2256 return HAL_TIMEOUT;
mbed_official 87:085cde657901 2257 }
mbed_official 87:085cde657901 2258 }
mbed_official 87:085cde657901 2259 }
mbed_official 87:085cde657901 2260 }
mbed_official 87:085cde657901 2261 return HAL_OK;
mbed_official 87:085cde657901 2262 }
mbed_official 87:085cde657901 2263
mbed_official 87:085cde657901 2264
mbed_official 87:085cde657901 2265 /**
mbed_official 87:085cde657901 2266 * @}
mbed_official 87:085cde657901 2267 */
mbed_official 87:085cde657901 2268
mbed_official 87:085cde657901 2269 #endif /* HAL_SPI_MODULE_ENABLED */
mbed_official 87:085cde657901 2270 /**
mbed_official 87:085cde657901 2271 * @}
mbed_official 87:085cde657901 2272 */
mbed_official 87:085cde657901 2273
mbed_official 87:085cde657901 2274 /**
mbed_official 87:085cde657901 2275 * @}
mbed_official 87:085cde657901 2276 */
mbed_official 87:085cde657901 2277
mbed_official 87:085cde657901 2278 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/