mbed library sources

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Fri Nov 07 08:15:08 2014 +0000
Revision:
392:2b59412bb664
Parent:
targets/cmsis/TARGET_STM/TARGET_NUCLEO_F091RC/stm32f0xx_hal_spi.c@340:28d1f895c6fe
Child:
441:d2c15dda23c1
Synchronized with git revision eec0be05cd92349bee83c65f9e1302b25b5badf4

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

Targets: STM32F0 - Factorisation of NUCLEO_F030R8/F072RB/F091RC cmsis folders

Who changed what in which revision?

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