mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

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

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

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

Import librarymbed

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

Committer:
mbed_official
Date:
Mon Sep 28 14:00:11 2015 +0100
Revision:
632:7687fb9c4f91
Parent:
385:be64abf45658
Child:
634:ac7d6880524d
Synchronized with git revision f7ce4ed029cc611121464252ff28d5e8beb895b0

Full URL: https://github.com/mbedmicro/mbed/commit/f7ce4ed029cc611121464252ff28d5e8beb895b0/

NUCLEO_F303K8 - add support of the STM32F303K8

Who changed what in which revision?

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