mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

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

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

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

Import librarymbed

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

Committer:
mbed_official
Date:
Mon Sep 28 20:15:09 2015 +0100
Revision:
634:ac7d6880524d
Parent:
632:7687fb9c4f91
Synchronized with git revision 9b7d23d47153c298a6d24de9a415202705889d11

Full URL: https://github.com/mbedmicro/mbed/commit/9b7d23d47153c298a6d24de9a415202705889d11/

Revert "[NUCLEO_F303K8] add support of the STM32F303K8"

Who changed what in which revision?

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