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:
Fri Aug 14 13:15:17 2015 +0100
Revision:
610:813dcc80987e
Parent:
573:ad23fe03a082
Synchronized with git revision 6d84db41c6833e0b9b024741eb0616a5f62d5599

Full URL: https://github.com/mbedmicro/mbed/commit/6d84db41c6833e0b9b024741eb0616a5f62d5599/

DISCO_F746NG - Improvements

Who changed what in which revision?

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