Aditya Mehrotra / mbed-dev

Dependents:   CAN_TEST SPIne_Plus_DYNO_SENSORS SPIne_Plus_v2 SPIne_Plus_Dyno_v2

Committer:
adimmit
Date:
Tue Mar 09 20:33:24 2021 +0000
Revision:
3:993b4d6ff61e
Parent:
0:083111ae2a11
added CAN3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
saloutos 0:083111ae2a11 1 /**
saloutos 0:083111ae2a11 2 ******************************************************************************
saloutos 0:083111ae2a11 3 * @file stm32f7xx_hal_smartcard.c
saloutos 0:083111ae2a11 4 * @author MCD Application Team
saloutos 0:083111ae2a11 5 * @version V1.2.2
saloutos 0:083111ae2a11 6 * @date 14-April-2017
saloutos 0:083111ae2a11 7 * @brief SMARTCARD HAL module driver.
saloutos 0:083111ae2a11 8 * This file provides firmware functions to manage the following
saloutos 0:083111ae2a11 9 * functionalities of the SMARTCARD peripheral:
saloutos 0:083111ae2a11 10 * + Initialization and de-initialization functions
saloutos 0:083111ae2a11 11 * + IO operation functions
saloutos 0:083111ae2a11 12 * + Peripheral Control functions
saloutos 0:083111ae2a11 13 * + Peripheral State and Error functions
saloutos 0:083111ae2a11 14 *
saloutos 0:083111ae2a11 15 @verbatim
saloutos 0:083111ae2a11 16 ==============================================================================
saloutos 0:083111ae2a11 17 ##### How to use this driver #####
saloutos 0:083111ae2a11 18 ==============================================================================
saloutos 0:083111ae2a11 19 [..]
saloutos 0:083111ae2a11 20 The SMARTCARD HAL driver can be used as follows:
saloutos 0:083111ae2a11 21
saloutos 0:083111ae2a11 22 (#) Declare a SMARTCARD_HandleTypeDef handle structure (eg. SMARTCARD_HandleTypeDef hsmartcard).
saloutos 0:083111ae2a11 23 (#) Associate a USART to the SMARTCARD handle hsmartcard.
saloutos 0:083111ae2a11 24 (#) Initialize the SMARTCARD low level resources by implementing the HAL_SMARTCARD_MspInit() API:
saloutos 0:083111ae2a11 25 (##) Enable the USARTx interface clock.
saloutos 0:083111ae2a11 26 (##) SMARTCARD pins configuration:
saloutos 0:083111ae2a11 27 (+++) Enable the clock for the SMARTCARD GPIOs.
saloutos 0:083111ae2a11 28 (+++) Configure these SMARTCARD pins as alternate function pull-up.
saloutos 0:083111ae2a11 29 (##) NVIC configuration if you need to use interrupt process (HAL_SMARTCARD_Transmit_IT()
saloutos 0:083111ae2a11 30 and HAL_SMARTCARD_Receive_IT() APIs):
saloutos 0:083111ae2a11 31 (+++) Configure the USARTx interrupt priority.
saloutos 0:083111ae2a11 32 (+++) Enable the NVIC USART IRQ handle.
saloutos 0:083111ae2a11 33 (+++) The specific USART interrupts (Transmission complete interrupt,
saloutos 0:083111ae2a11 34 RXNE interrupt and Error Interrupts) will be managed using the macros
saloutos 0:083111ae2a11 35 __HAL_SMARTCARD_ENABLE_IT() and __HAL_SMARTCARD_DISABLE_IT() inside the transmit and receive process.
saloutos 0:083111ae2a11 36 (##) DMA Configuration if you need to use DMA process (HAL_SMARTCARD_Transmit_DMA()
saloutos 0:083111ae2a11 37 and HAL_SMARTCARD_Receive_DMA() APIs):
saloutos 0:083111ae2a11 38 (+++) Declare a DMA handle structure for the Tx/Rx stream.
saloutos 0:083111ae2a11 39 (+++) Enable the DMAx interface clock.
saloutos 0:083111ae2a11 40 (+++) Configure the declared DMA handle structure with the required Tx/Rx parameters.
saloutos 0:083111ae2a11 41 (+++) Configure the DMA Tx/Rx Stream.
saloutos 0:083111ae2a11 42 (+++) Associate the initialized DMA handle to the SMARTCARD DMA Tx/Rx handle.
saloutos 0:083111ae2a11 43 (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx/Rx Stream.
saloutos 0:083111ae2a11 44
saloutos 0:083111ae2a11 45 (#) Program the Baud Rate, Parity, Mode(Receiver/Transmitter), clock enabling/disabling and accordingly,
saloutos 0:083111ae2a11 46 the clock parameters (parity, phase, last bit), prescaler value, guard time and NACK on transmission
saloutos 0:083111ae2a11 47 error enabling or disabling in the hsmartcard handle Init structure.
saloutos 0:083111ae2a11 48
saloutos 0:083111ae2a11 49 (#) If required, program SMARTCARD advanced features (TX/RX pins swap, TimeOut, auto-retry counter,...)
saloutos 0:083111ae2a11 50 in the hsmartcard handle AdvancedInit structure.
saloutos 0:083111ae2a11 51
saloutos 0:083111ae2a11 52 (#) Initialize the SMARTCARD registers by calling the HAL_SMARTCARD_Init() API:
saloutos 0:083111ae2a11 53 (++) This API configures also the low level Hardware GPIO, CLOCK, CORTEX...etc)
saloutos 0:083111ae2a11 54 by calling the customized HAL_SMARTCARD_MspInit() API.
saloutos 0:083111ae2a11 55 [..]
saloutos 0:083111ae2a11 56 (@) The specific SMARTCARD interrupts (Transmission complete interrupt,
saloutos 0:083111ae2a11 57 RXNE interrupt and Error Interrupts) will be managed using the macros
saloutos 0:083111ae2a11 58 __HAL_SMARTCARD_ENABLE_IT() and __HAL_SMARTCARD_DISABLE_IT() inside the transmit and receive process.
saloutos 0:083111ae2a11 59
saloutos 0:083111ae2a11 60 [..]
saloutos 0:083111ae2a11 61 [..] Three operation modes are available within this driver :
saloutos 0:083111ae2a11 62
saloutos 0:083111ae2a11 63 *** Polling mode IO operation ***
saloutos 0:083111ae2a11 64 =================================
saloutos 0:083111ae2a11 65 [..]
saloutos 0:083111ae2a11 66 (+) Send an amount of data in blocking mode using HAL_SMARTCARD_Transmit()
saloutos 0:083111ae2a11 67 (+) Receive an amount of data in blocking mode using HAL_SMARTCARD_Receive()
saloutos 0:083111ae2a11 68
saloutos 0:083111ae2a11 69 *** Interrupt mode IO operation ***
saloutos 0:083111ae2a11 70 ===================================
saloutos 0:083111ae2a11 71 [..]
saloutos 0:083111ae2a11 72 (+) Send an amount of data in non-blocking mode using HAL_SMARTCARD_Transmit_IT()
saloutos 0:083111ae2a11 73 (+) At transmission end of transfer HAL_SMARTCARD_TxCpltCallback() is executed and user can
saloutos 0:083111ae2a11 74 add his own code by customization of function pointer HAL_SMARTCARD_TxCpltCallback()
saloutos 0:083111ae2a11 75 (+) Receive an amount of data in non-blocking mode using HAL_SMARTCARD_Receive_IT()
saloutos 0:083111ae2a11 76 (+) At reception end of transfer HAL_SMARTCARD_RxCpltCallback() is executed and user can
saloutos 0:083111ae2a11 77 add his own code by customization of function pointer HAL_SMARTCARD_RxCpltCallback()
saloutos 0:083111ae2a11 78 (+) In case of transfer Error, HAL_SMARTCARD_ErrorCallback() function is executed and user can
saloutos 0:083111ae2a11 79 add his own code by customization of function pointer HAL_SMARTCARD_ErrorCallback()
saloutos 0:083111ae2a11 80
saloutos 0:083111ae2a11 81 *** DMA mode IO operation ***
saloutos 0:083111ae2a11 82 ==============================
saloutos 0:083111ae2a11 83 [..]
saloutos 0:083111ae2a11 84 (+) Send an amount of data in non-blocking mode (DMA) using HAL_SMARTCARD_Transmit_DMA()
saloutos 0:083111ae2a11 85 (+) At transmission end of transfer HAL_SMARTCARD_TxCpltCallback() is executed and user can
saloutos 0:083111ae2a11 86 add his own code by customization of function pointer HAL_SMARTCARD_TxCpltCallback()
saloutos 0:083111ae2a11 87 (+) Receive an amount of data in non-blocking mode (DMA) using HAL_SMARTCARD_Receive_DMA()
saloutos 0:083111ae2a11 88 (+) At reception end of transfer HAL_SMARTCARD_RxCpltCallback() is executed and user can
saloutos 0:083111ae2a11 89 add his own code by customization of function pointer HAL_SMARTCARD_RxCpltCallback()
saloutos 0:083111ae2a11 90 (+) In case of transfer Error, HAL_SMARTCARD_ErrorCallback() function is executed and user can
saloutos 0:083111ae2a11 91 add his own code by customization of function pointer HAL_SMARTCARD_ErrorCallback()
saloutos 0:083111ae2a11 92
saloutos 0:083111ae2a11 93 *** SMARTCARD HAL driver macros list ***
saloutos 0:083111ae2a11 94 ========================================
saloutos 0:083111ae2a11 95 [..]
saloutos 0:083111ae2a11 96 Below the list of most used macros in SMARTCARD HAL driver.
saloutos 0:083111ae2a11 97
saloutos 0:083111ae2a11 98 (+) __HAL_SMARTCARD_GET_FLAG : Check whether or not the specified SMARTCARD flag is set
saloutos 0:083111ae2a11 99 (+) __HAL_SMARTCARD_CLEAR_FLAG : Clear the specified SMARTCARD pending flag
saloutos 0:083111ae2a11 100 (+) __HAL_SMARTCARD_ENABLE_IT: Enable the specified SMARTCARD interrupt
saloutos 0:083111ae2a11 101 (+) __HAL_SMARTCARD_DISABLE_IT: Disable the specified SMARTCARD interrupt
saloutos 0:083111ae2a11 102 (+) __HAL_SMARTCARD_GET_IT_SOURCE: Check whether or not the specified SMARTCARD interrupt is enabled
saloutos 0:083111ae2a11 103
saloutos 0:083111ae2a11 104 [..]
saloutos 0:083111ae2a11 105 (@) You can refer to the SMARTCARD HAL driver header file for more useful macros
saloutos 0:083111ae2a11 106
saloutos 0:083111ae2a11 107 @endverbatim
saloutos 0:083111ae2a11 108 ******************************************************************************
saloutos 0:083111ae2a11 109 * @attention
saloutos 0:083111ae2a11 110 *
saloutos 0:083111ae2a11 111 * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
saloutos 0:083111ae2a11 112 *
saloutos 0:083111ae2a11 113 * Redistribution and use in source and binary forms, with or without modification,
saloutos 0:083111ae2a11 114 * are permitted provided that the following conditions are met:
saloutos 0:083111ae2a11 115 * 1. Redistributions of source code must retain the above copyright notice,
saloutos 0:083111ae2a11 116 * this list of conditions and the following disclaimer.
saloutos 0:083111ae2a11 117 * 2. Redistributions in binary form must reproduce the above copyright notice,
saloutos 0:083111ae2a11 118 * this list of conditions and the following disclaimer in the documentation
saloutos 0:083111ae2a11 119 * and/or other materials provided with the distribution.
saloutos 0:083111ae2a11 120 * 3. Neither the name of STMicroelectronics nor the names of its contributors
saloutos 0:083111ae2a11 121 * may be used to endorse or promote products derived from this software
saloutos 0:083111ae2a11 122 * without specific prior written permission.
saloutos 0:083111ae2a11 123 *
saloutos 0:083111ae2a11 124 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
saloutos 0:083111ae2a11 125 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
saloutos 0:083111ae2a11 126 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
saloutos 0:083111ae2a11 127 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
saloutos 0:083111ae2a11 128 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
saloutos 0:083111ae2a11 129 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
saloutos 0:083111ae2a11 130 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
saloutos 0:083111ae2a11 131 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
saloutos 0:083111ae2a11 132 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
saloutos 0:083111ae2a11 133 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
saloutos 0:083111ae2a11 134 *
saloutos 0:083111ae2a11 135 ******************************************************************************
saloutos 0:083111ae2a11 136 */
saloutos 0:083111ae2a11 137
saloutos 0:083111ae2a11 138 /* Includes ------------------------------------------------------------------*/
saloutos 0:083111ae2a11 139 #include "stm32f7xx_hal.h"
saloutos 0:083111ae2a11 140
saloutos 0:083111ae2a11 141 /** @addtogroup STM32F7xx_HAL_Driver
saloutos 0:083111ae2a11 142 * @{
saloutos 0:083111ae2a11 143 */
saloutos 0:083111ae2a11 144
saloutos 0:083111ae2a11 145 /** @defgroup SMARTCARD SMARTCARD
saloutos 0:083111ae2a11 146 * @brief HAL SMARTCARD module driver
saloutos 0:083111ae2a11 147 * @{
saloutos 0:083111ae2a11 148 */
saloutos 0:083111ae2a11 149
saloutos 0:083111ae2a11 150 #ifdef HAL_SMARTCARD_MODULE_ENABLED
saloutos 0:083111ae2a11 151
saloutos 0:083111ae2a11 152 /* Private typedef -----------------------------------------------------------*/
saloutos 0:083111ae2a11 153 /* Private define ------------------------------------------------------------*/
saloutos 0:083111ae2a11 154 /** @defgroup SMARTCARD_Private_Constants SMARTCARD Private Constants
saloutos 0:083111ae2a11 155 * @{
saloutos 0:083111ae2a11 156 */
saloutos 0:083111ae2a11 157 #define SMARTCARD_TEACK_REACK_TIMEOUT 1000U
saloutos 0:083111ae2a11 158 #define HAL_SMARTCARD_TXDMA_TIMEOUTVALUE 22000U
saloutos 0:083111ae2a11 159 #define USART_CR1_FIELDS ((uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | \
saloutos 0:083111ae2a11 160 USART_CR1_TE | USART_CR1_RE | USART_CR1_OVER8)) /*!< USART CR1 fields of parameters set by SMARTCARD_SetConfig API */
saloutos 0:083111ae2a11 161 #define USART_CR2_CLK_FIELDS ((uint32_t)(USART_CR2_CLKEN|USART_CR2_CPOL|USART_CR2_CPHA|USART_CR2_LBCL)) /*!< SMARTCARD clock-related USART CR2 fields of parameters */
saloutos 0:083111ae2a11 162 #define USART_CR2_FIELDS ((uint32_t)(USART_CR2_RTOEN|USART_CR2_CLK_FIELDS|USART_CR2_STOP)) /*!< USART CR2 fields of parameters set by SMARTCARD_SetConfig API */
saloutos 0:083111ae2a11 163 #define USART_CR3_FIELDS ((uint32_t)(USART_CR3_ONEBIT|USART_CR3_NACK|USART_CR3_SCARCNT)) /*!< USART CR3 fields of parameters set by SMARTCARD_SetConfig API */
saloutos 0:083111ae2a11 164 /**
saloutos 0:083111ae2a11 165 * @}
saloutos 0:083111ae2a11 166 */
saloutos 0:083111ae2a11 167
saloutos 0:083111ae2a11 168 /* Private macros ------------------------------------------------------------*/
saloutos 0:083111ae2a11 169 /* Private variables ---------------------------------------------------------*/
saloutos 0:083111ae2a11 170 /* Private function prototypes -----------------------------------------------*/
saloutos 0:083111ae2a11 171 /** @addtogroup SMARTCARD_Private_Functions
saloutos 0:083111ae2a11 172 * @{
saloutos 0:083111ae2a11 173 */
saloutos 0:083111ae2a11 174 static HAL_StatusTypeDef SMARTCARD_SetConfig(SMARTCARD_HandleTypeDef *hsmartcard);
saloutos 0:083111ae2a11 175 static void SMARTCARD_AdvFeatureConfig(SMARTCARD_HandleTypeDef *hsmartcard);
saloutos 0:083111ae2a11 176 static HAL_StatusTypeDef SMARTCARD_CheckIdleState(SMARTCARD_HandleTypeDef *hsmartcard);
saloutos 0:083111ae2a11 177 static HAL_StatusTypeDef SMARTCARD_WaitOnFlagUntilTimeout(SMARTCARD_HandleTypeDef *hsmartcard, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout);
saloutos 0:083111ae2a11 178 static void SMARTCARD_EndTxTransfer(SMARTCARD_HandleTypeDef *hsmartcard);
saloutos 0:083111ae2a11 179 static void SMARTCARD_EndRxTransfer(SMARTCARD_HandleTypeDef *hsmartcard);
saloutos 0:083111ae2a11 180 static void SMARTCARD_DMATransmitCplt(DMA_HandleTypeDef *hdma);
saloutos 0:083111ae2a11 181 static void SMARTCARD_DMAReceiveCplt(DMA_HandleTypeDef *hdma);
saloutos 0:083111ae2a11 182 static void SMARTCARD_DMAError(DMA_HandleTypeDef *hdma);
saloutos 0:083111ae2a11 183 static void SMARTCARD_DMAAbortOnError(DMA_HandleTypeDef *hdma);
saloutos 0:083111ae2a11 184 static void SMARTCARD_DMATxAbortCallback(DMA_HandleTypeDef *hdma);
saloutos 0:083111ae2a11 185 static void SMARTCARD_DMARxAbortCallback(DMA_HandleTypeDef *hdma);
saloutos 0:083111ae2a11 186 static void SMARTCARD_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma);
saloutos 0:083111ae2a11 187 static void SMARTCARD_DMARxOnlyAbortCallback(DMA_HandleTypeDef *hdma);
saloutos 0:083111ae2a11 188 static HAL_StatusTypeDef SMARTCARD_Transmit_IT(SMARTCARD_HandleTypeDef *hsmartcard);
saloutos 0:083111ae2a11 189 static HAL_StatusTypeDef SMARTCARD_EndTransmit_IT(SMARTCARD_HandleTypeDef *hsmartcard);
saloutos 0:083111ae2a11 190 static HAL_StatusTypeDef SMARTCARD_Receive_IT(SMARTCARD_HandleTypeDef *hsmartcard);
saloutos 0:083111ae2a11 191 /**
saloutos 0:083111ae2a11 192 * @}
saloutos 0:083111ae2a11 193 */
saloutos 0:083111ae2a11 194
saloutos 0:083111ae2a11 195 /* Exported functions --------------------------------------------------------*/
saloutos 0:083111ae2a11 196
saloutos 0:083111ae2a11 197 /** @defgroup SMARTCARD_Exported_Functions SMARTCARD Exported Functions
saloutos 0:083111ae2a11 198 * @{
saloutos 0:083111ae2a11 199 */
saloutos 0:083111ae2a11 200
saloutos 0:083111ae2a11 201 /** @defgroup SMARTCARD_Exported_Functions_Group1 Initialization and de-initialization functions
saloutos 0:083111ae2a11 202 * @brief Initialization and Configuration functions
saloutos 0:083111ae2a11 203 *
saloutos 0:083111ae2a11 204 @verbatim
saloutos 0:083111ae2a11 205 ==============================================================================
saloutos 0:083111ae2a11 206 ##### Initialization and Configuration functions #####
saloutos 0:083111ae2a11 207 ==============================================================================
saloutos 0:083111ae2a11 208 [..]
saloutos 0:083111ae2a11 209 This subsection provides a set of functions allowing to initialize the USARTx
saloutos 0:083111ae2a11 210 associated to the SmartCard.
saloutos 0:083111ae2a11 211 (+) These parameters can be configured:
saloutos 0:083111ae2a11 212 (++) Baud Rate
saloutos 0:083111ae2a11 213 (++) Parity: parity should be enabled, frame Length is fixed to 8 bits plus parity
saloutos 0:083111ae2a11 214 (++) Receiver/transmitter modes
saloutos 0:083111ae2a11 215 (++) Synchronous mode (and if enabled, phase, polarity and last bit parameters)
saloutos 0:083111ae2a11 216 (++) Prescaler value
saloutos 0:083111ae2a11 217 (++) Guard bit time
saloutos 0:083111ae2a11 218 (++) NACK enabling or disabling on transmission error
saloutos 0:083111ae2a11 219
saloutos 0:083111ae2a11 220 (+) The following advanced features can be configured as well:
saloutos 0:083111ae2a11 221 (++) TX and/or RX pin level inversion
saloutos 0:083111ae2a11 222 (++) data logical level inversion
saloutos 0:083111ae2a11 223 (++) RX and TX pins swap
saloutos 0:083111ae2a11 224 (++) RX overrun detection disabling
saloutos 0:083111ae2a11 225 (++) DMA disabling on RX error
saloutos 0:083111ae2a11 226 (++) MSB first on communication line
saloutos 0:083111ae2a11 227 (++) Time out enabling (and if activated, timeout value)
saloutos 0:083111ae2a11 228 (++) Block length
saloutos 0:083111ae2a11 229 (++) Auto-retry counter
saloutos 0:083111ae2a11 230 [..]
saloutos 0:083111ae2a11 231 The HAL_SMARTCARD_Init() API follows the USART synchronous configuration procedures
saloutos 0:083111ae2a11 232 (details for the procedures are available in reference manual).
saloutos 0:083111ae2a11 233
saloutos 0:083111ae2a11 234 @endverbatim
saloutos 0:083111ae2a11 235
saloutos 0:083111ae2a11 236 The USART frame format is given in the following table:
saloutos 0:083111ae2a11 237
saloutos 0:083111ae2a11 238 Table 1. USART frame format.
saloutos 0:083111ae2a11 239 +---------------------------------------------------------------+
saloutos 0:083111ae2a11 240 | M1M0 bits | PCE bit | USART frame |
saloutos 0:083111ae2a11 241 |-----------------------|---------------------------------------|
saloutos 0:083111ae2a11 242 | 01 | 1 | | SB | 8 bit data | PB | STB | |
saloutos 0:083111ae2a11 243 +---------------------------------------------------------------+
saloutos 0:083111ae2a11 244
saloutos 0:083111ae2a11 245
saloutos 0:083111ae2a11 246 * @{
saloutos 0:083111ae2a11 247 */
saloutos 0:083111ae2a11 248
saloutos 0:083111ae2a11 249 /**
saloutos 0:083111ae2a11 250 * @brief Initialize the SMARTCARD mode according to the specified
saloutos 0:083111ae2a11 251 * parameters in the SMARTCARD_HandleTypeDef and initialize the associated handle.
saloutos 0:083111ae2a11 252 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 253 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 254 * @retval HAL status
saloutos 0:083111ae2a11 255 */
saloutos 0:083111ae2a11 256 HAL_StatusTypeDef HAL_SMARTCARD_Init(SMARTCARD_HandleTypeDef *hsmartcard)
saloutos 0:083111ae2a11 257 {
saloutos 0:083111ae2a11 258 /* Check the SMARTCARD handle allocation */
saloutos 0:083111ae2a11 259 if(hsmartcard == NULL)
saloutos 0:083111ae2a11 260 {
saloutos 0:083111ae2a11 261 return HAL_ERROR;
saloutos 0:083111ae2a11 262 }
saloutos 0:083111ae2a11 263
saloutos 0:083111ae2a11 264 /* Check the USART associated to the SMARTCARD handle */
saloutos 0:083111ae2a11 265 assert_param(IS_SMARTCARD_INSTANCE(hsmartcard->Instance));
saloutos 0:083111ae2a11 266
saloutos 0:083111ae2a11 267 if(hsmartcard->gState == HAL_SMARTCARD_STATE_RESET)
saloutos 0:083111ae2a11 268 {
saloutos 0:083111ae2a11 269 /* Allocate lock resource and initialize it */
saloutos 0:083111ae2a11 270 hsmartcard->Lock = HAL_UNLOCKED;
saloutos 0:083111ae2a11 271
saloutos 0:083111ae2a11 272 /* Init the low level hardware : GPIO, CLOCK */
saloutos 0:083111ae2a11 273 HAL_SMARTCARD_MspInit(hsmartcard);
saloutos 0:083111ae2a11 274 }
saloutos 0:083111ae2a11 275
saloutos 0:083111ae2a11 276 hsmartcard->gState = HAL_SMARTCARD_STATE_BUSY;
saloutos 0:083111ae2a11 277
saloutos 0:083111ae2a11 278 /* Disable the Peripheral to set smartcard mode */
saloutos 0:083111ae2a11 279 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_UE);
saloutos 0:083111ae2a11 280
saloutos 0:083111ae2a11 281 /* In SmartCard mode, the following bits must be kept cleared:
saloutos 0:083111ae2a11 282 - LINEN in the USART_CR2 register,
saloutos 0:083111ae2a11 283 - HDSEL and IREN bits in the USART_CR3 register.*/
saloutos 0:083111ae2a11 284 CLEAR_BIT(hsmartcard->Instance->CR2, USART_CR2_LINEN);
saloutos 0:083111ae2a11 285 CLEAR_BIT(hsmartcard->Instance->CR3, (USART_CR3_HDSEL | USART_CR3_IREN));
saloutos 0:083111ae2a11 286
saloutos 0:083111ae2a11 287 /* set the USART in SMARTCARD mode */
saloutos 0:083111ae2a11 288 SET_BIT(hsmartcard->Instance->CR3, USART_CR3_SCEN);
saloutos 0:083111ae2a11 289
saloutos 0:083111ae2a11 290 /* Set the SMARTCARD Communication parameters */
saloutos 0:083111ae2a11 291 if (SMARTCARD_SetConfig(hsmartcard) == HAL_ERROR)
saloutos 0:083111ae2a11 292 {
saloutos 0:083111ae2a11 293 return HAL_ERROR;
saloutos 0:083111ae2a11 294 }
saloutos 0:083111ae2a11 295
saloutos 0:083111ae2a11 296 /* Set the SMARTCARD transmission completion indication */
saloutos 0:083111ae2a11 297 SMARTCARD_TRANSMISSION_COMPLETION_SETTING(hsmartcard);
saloutos 0:083111ae2a11 298
saloutos 0:083111ae2a11 299 if (hsmartcard->AdvancedInit.AdvFeatureInit != SMARTCARD_ADVFEATURE_NO_INIT)
saloutos 0:083111ae2a11 300 {
saloutos 0:083111ae2a11 301 SMARTCARD_AdvFeatureConfig(hsmartcard);
saloutos 0:083111ae2a11 302 }
saloutos 0:083111ae2a11 303
saloutos 0:083111ae2a11 304 /* Enable the Peripheral */
saloutos 0:083111ae2a11 305 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_UE);
saloutos 0:083111ae2a11 306
saloutos 0:083111ae2a11 307 /* TEACK and/or REACK to check before moving hsmartcard->gState and hsmartcard->RxState to Ready */
saloutos 0:083111ae2a11 308 return (SMARTCARD_CheckIdleState(hsmartcard));
saloutos 0:083111ae2a11 309 }
saloutos 0:083111ae2a11 310
saloutos 0:083111ae2a11 311 /**
saloutos 0:083111ae2a11 312 * @brief DeInitialize the SMARTCARD peripheral.
saloutos 0:083111ae2a11 313 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 314 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 315 * @retval HAL status
saloutos 0:083111ae2a11 316 */
saloutos 0:083111ae2a11 317 HAL_StatusTypeDef HAL_SMARTCARD_DeInit(SMARTCARD_HandleTypeDef *hsmartcard)
saloutos 0:083111ae2a11 318 {
saloutos 0:083111ae2a11 319 /* Check the SMARTCARD handle allocation */
saloutos 0:083111ae2a11 320 if(hsmartcard == NULL)
saloutos 0:083111ae2a11 321 {
saloutos 0:083111ae2a11 322 return HAL_ERROR;
saloutos 0:083111ae2a11 323 }
saloutos 0:083111ae2a11 324
saloutos 0:083111ae2a11 325 /* Check the USART/UART associated to the SMARTCARD handle */
saloutos 0:083111ae2a11 326 assert_param(IS_SMARTCARD_INSTANCE(hsmartcard->Instance));
saloutos 0:083111ae2a11 327
saloutos 0:083111ae2a11 328 hsmartcard->gState = HAL_SMARTCARD_STATE_BUSY;
saloutos 0:083111ae2a11 329
saloutos 0:083111ae2a11 330 /* Disable the Peripheral */
saloutos 0:083111ae2a11 331 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_UE);
saloutos 0:083111ae2a11 332
saloutos 0:083111ae2a11 333 WRITE_REG(hsmartcard->Instance->CR1, 0x0);
saloutos 0:083111ae2a11 334 WRITE_REG(hsmartcard->Instance->CR2, 0x0);
saloutos 0:083111ae2a11 335 WRITE_REG(hsmartcard->Instance->CR3, 0x0);
saloutos 0:083111ae2a11 336 WRITE_REG(hsmartcard->Instance->RTOR, 0x0);
saloutos 0:083111ae2a11 337 WRITE_REG(hsmartcard->Instance->GTPR, 0x0);
saloutos 0:083111ae2a11 338
saloutos 0:083111ae2a11 339 /* DeInit the low level hardware */
saloutos 0:083111ae2a11 340 HAL_SMARTCARD_MspDeInit(hsmartcard);
saloutos 0:083111ae2a11 341
saloutos 0:083111ae2a11 342 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
saloutos 0:083111ae2a11 343 hsmartcard->gState = HAL_SMARTCARD_STATE_RESET;
saloutos 0:083111ae2a11 344 hsmartcard->RxState = HAL_SMARTCARD_STATE_RESET;
saloutos 0:083111ae2a11 345
saloutos 0:083111ae2a11 346 /* Process Unlock */
saloutos 0:083111ae2a11 347 __HAL_UNLOCK(hsmartcard);
saloutos 0:083111ae2a11 348
saloutos 0:083111ae2a11 349 return HAL_OK;
saloutos 0:083111ae2a11 350 }
saloutos 0:083111ae2a11 351
saloutos 0:083111ae2a11 352 /**
saloutos 0:083111ae2a11 353 * @brief Initialize the SMARTCARD MSP.
saloutos 0:083111ae2a11 354 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 355 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 356 * @retval None
saloutos 0:083111ae2a11 357 */
saloutos 0:083111ae2a11 358 __weak void HAL_SMARTCARD_MspInit(SMARTCARD_HandleTypeDef *hsmartcard)
saloutos 0:083111ae2a11 359 {
saloutos 0:083111ae2a11 360 /* Prevent unused argument(s) compilation warning */
saloutos 0:083111ae2a11 361 UNUSED(hsmartcard);
saloutos 0:083111ae2a11 362
saloutos 0:083111ae2a11 363 /* NOTE : This function should not be modified, when the callback is needed,
saloutos 0:083111ae2a11 364 the HAL_SMARTCARD_MspInit can be implemented in the user file
saloutos 0:083111ae2a11 365 */
saloutos 0:083111ae2a11 366 }
saloutos 0:083111ae2a11 367
saloutos 0:083111ae2a11 368 /**
saloutos 0:083111ae2a11 369 * @brief DeInitialize the SMARTCARD MSP.
saloutos 0:083111ae2a11 370 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 371 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 372 * @retval None
saloutos 0:083111ae2a11 373 */
saloutos 0:083111ae2a11 374 __weak void HAL_SMARTCARD_MspDeInit(SMARTCARD_HandleTypeDef *hsmartcard)
saloutos 0:083111ae2a11 375 {
saloutos 0:083111ae2a11 376 /* Prevent unused argument(s) compilation warning */
saloutos 0:083111ae2a11 377 UNUSED(hsmartcard);
saloutos 0:083111ae2a11 378
saloutos 0:083111ae2a11 379 /* NOTE : This function should not be modified, when the callback is needed,
saloutos 0:083111ae2a11 380 the HAL_SMARTCARD_MspDeInit can be implemented in the user file
saloutos 0:083111ae2a11 381 */
saloutos 0:083111ae2a11 382 }
saloutos 0:083111ae2a11 383
saloutos 0:083111ae2a11 384 /**
saloutos 0:083111ae2a11 385 * @}
saloutos 0:083111ae2a11 386 */
saloutos 0:083111ae2a11 387
saloutos 0:083111ae2a11 388 /** @defgroup SMARTCARD_Exported_Functions_Group2 IO operation functions
saloutos 0:083111ae2a11 389 * @brief SMARTCARD Transmit and Receive functions
saloutos 0:083111ae2a11 390 *
saloutos 0:083111ae2a11 391 @verbatim
saloutos 0:083111ae2a11 392 ==============================================================================
saloutos 0:083111ae2a11 393 ##### IO operation functions #####
saloutos 0:083111ae2a11 394 ==============================================================================
saloutos 0:083111ae2a11 395 [..]
saloutos 0:083111ae2a11 396 This subsection provides a set of functions allowing to manage the SMARTCARD data transfers.
saloutos 0:083111ae2a11 397
saloutos 0:083111ae2a11 398 [..]
saloutos 0:083111ae2a11 399 (#) Smartcard is a single wire half duplex communication protocol.
saloutos 0:083111ae2a11 400 The Smartcard interface is designed to support asynchronous protocol Smartcards as
saloutos 0:083111ae2a11 401 defined in the ISO 7816-3 standard.
saloutos 0:083111ae2a11 402 (#) The USART should be configured as:
saloutos 0:083111ae2a11 403 (++) 8 bits plus parity: where M=1 and PCE=1 in the USART_CR1 register
saloutos 0:083111ae2a11 404 (++) 1.5 stop bits when transmitting and receiving: where STOP=11 in the USART_CR2 register.
saloutos 0:083111ae2a11 405
saloutos 0:083111ae2a11 406 (#) There are two modes of transfer:
saloutos 0:083111ae2a11 407 (++) Blocking mode: The communication is performed in polling mode.
saloutos 0:083111ae2a11 408 The HAL status of all data processing is returned by the same function
saloutos 0:083111ae2a11 409 after finishing transfer.
saloutos 0:083111ae2a11 410 (++) Non-Blocking mode: The communication is performed using Interrupts
saloutos 0:083111ae2a11 411 or DMA, the relevant API's return the HAL status.
saloutos 0:083111ae2a11 412 The end of the data processing will be indicated through the
saloutos 0:083111ae2a11 413 dedicated SMARTCARD IRQ when using Interrupt mode or the DMA IRQ when
saloutos 0:083111ae2a11 414 using DMA mode.
saloutos 0:083111ae2a11 415 (++) The HAL_SMARTCARD_TxCpltCallback(), HAL_SMARTCARD_RxCpltCallback() user callbacks
saloutos 0:083111ae2a11 416 will be executed respectively at the end of the Transmit or Receive process
saloutos 0:083111ae2a11 417 The HAL_SMARTCARD_ErrorCallback() user callback will be executed when a communication
saloutos 0:083111ae2a11 418 error is detected.
saloutos 0:083111ae2a11 419
saloutos 0:083111ae2a11 420 (#) Blocking mode APIs are :
saloutos 0:083111ae2a11 421 (++) HAL_SMARTCARD_Transmit()
saloutos 0:083111ae2a11 422 (++) HAL_SMARTCARD_Receive()
saloutos 0:083111ae2a11 423
saloutos 0:083111ae2a11 424 (#) Non Blocking mode APIs with Interrupt are :
saloutos 0:083111ae2a11 425 (++) HAL_SMARTCARD_Transmit_IT()
saloutos 0:083111ae2a11 426 (++) HAL_SMARTCARD_Receive_IT()
saloutos 0:083111ae2a11 427 (++) HAL_SMARTCARD_IRQHandler()
saloutos 0:083111ae2a11 428
saloutos 0:083111ae2a11 429 (#) Non Blocking mode functions with DMA are :
saloutos 0:083111ae2a11 430 (++) HAL_SMARTCARD_Transmit_DMA()
saloutos 0:083111ae2a11 431 (++) HAL_SMARTCARD_Receive_DMA()
saloutos 0:083111ae2a11 432
saloutos 0:083111ae2a11 433 (#) A set of Transfer Complete Callbacks are provided in non Blocking mode:
saloutos 0:083111ae2a11 434 (++) HAL_SMARTCARD_TxCpltCallback()
saloutos 0:083111ae2a11 435 (++) HAL_SMARTCARD_RxCpltCallback()
saloutos 0:083111ae2a11 436 (++) HAL_SMARTCARD_ErrorCallback()
saloutos 0:083111ae2a11 437
saloutos 0:083111ae2a11 438 (#) Non-Blocking mode transfers could be aborted using Abort API's :
saloutos 0:083111ae2a11 439 (++) HAL_SMARTCARD_Abort()
saloutos 0:083111ae2a11 440 (++) HAL_SMARTCARD_AbortTransmit()
saloutos 0:083111ae2a11 441 (++) HAL_SMARTCARD_AbortReceive()
saloutos 0:083111ae2a11 442 (++) HAL_SMARTCARD_Abort_IT()
saloutos 0:083111ae2a11 443 (++) HAL_SMARTCARD_AbortTransmit_IT()
saloutos 0:083111ae2a11 444 (++) HAL_SMARTCARD_AbortReceive_IT()
saloutos 0:083111ae2a11 445
saloutos 0:083111ae2a11 446 (#) For Abort services based on interrupts (HAL_SMARTCARD_Abortxxx_IT), a set of Abort Complete Callbacks are provided:
saloutos 0:083111ae2a11 447 (++) HAL_SMARTCARD_AbortCpltCallback()
saloutos 0:083111ae2a11 448 (++) HAL_SMARTCARD_AbortTransmitCpltCallback()
saloutos 0:083111ae2a11 449 (++) HAL_SMARTCARD_AbortReceiveCpltCallback()
saloutos 0:083111ae2a11 450
saloutos 0:083111ae2a11 451 (#) In Non-Blocking mode transfers, possible errors are split into 2 categories.
saloutos 0:083111ae2a11 452 Errors are handled as follows :
saloutos 0:083111ae2a11 453 (++) Error is considered as Recoverable and non blocking : Transfer could go till end, but error severity is
saloutos 0:083111ae2a11 454 to be evaluated by user : this concerns Frame Error, Parity Error or Noise Error in Interrupt mode reception .
saloutos 0:083111ae2a11 455 Received character is then retrieved and stored in Rx buffer, Error code is set to allow user to identify error type,
saloutos 0:083111ae2a11 456 and HAL_SMARTCARD_ErrorCallback() user callback is executed. Transfer is kept ongoing on SMARTCARD side.
saloutos 0:083111ae2a11 457 If user wants to abort it, Abort services should be called by user.
saloutos 0:083111ae2a11 458 (++) Error is considered as Blocking : Transfer could not be completed properly and is aborted.
saloutos 0:083111ae2a11 459 This concerns Frame Error in Interrupt mode tranmission, Overrun Error in Interrupt mode reception and all errors in DMA mode.
saloutos 0:083111ae2a11 460 Error code is set to allow user to identify error type, and HAL_SMARTCARD_ErrorCallback() user callback is executed.
saloutos 0:083111ae2a11 461
saloutos 0:083111ae2a11 462 @endverbatim
saloutos 0:083111ae2a11 463 * @{
saloutos 0:083111ae2a11 464 */
saloutos 0:083111ae2a11 465
saloutos 0:083111ae2a11 466 /**
saloutos 0:083111ae2a11 467 * @brief Send an amount of data in blocking mode.
saloutos 0:083111ae2a11 468 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 469 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 470 * @param pData pointer to data buffer.
saloutos 0:083111ae2a11 471 * @param Size amount of data to be sent.
saloutos 0:083111ae2a11 472 * @param Timeout Timeout duration.
saloutos 0:083111ae2a11 473 * @retval HAL status
saloutos 0:083111ae2a11 474 */
saloutos 0:083111ae2a11 475 HAL_StatusTypeDef HAL_SMARTCARD_Transmit(SMARTCARD_HandleTypeDef *hsmartcard, uint8_t *pData, uint16_t Size, uint32_t Timeout)
saloutos 0:083111ae2a11 476 {
saloutos 0:083111ae2a11 477 uint32_t tickstart = 0;
saloutos 0:083111ae2a11 478
saloutos 0:083111ae2a11 479 /* Check that a Tx process is not already ongoing */
saloutos 0:083111ae2a11 480 if (hsmartcard->gState == HAL_SMARTCARD_STATE_READY)
saloutos 0:083111ae2a11 481 {
saloutos 0:083111ae2a11 482 if((pData == NULL) || (Size == 0))
saloutos 0:083111ae2a11 483 {
saloutos 0:083111ae2a11 484 return HAL_ERROR;
saloutos 0:083111ae2a11 485 }
saloutos 0:083111ae2a11 486
saloutos 0:083111ae2a11 487 /* Process Locked */
saloutos 0:083111ae2a11 488 __HAL_LOCK(hsmartcard);
saloutos 0:083111ae2a11 489
saloutos 0:083111ae2a11 490 hsmartcard->gState = HAL_SMARTCARD_STATE_BUSY_TX;
saloutos 0:083111ae2a11 491
saloutos 0:083111ae2a11 492 /* Init tickstart for timeout managment*/
saloutos 0:083111ae2a11 493 tickstart = HAL_GetTick();
saloutos 0:083111ae2a11 494
saloutos 0:083111ae2a11 495 /* Disable the Peripheral first to update mode for TX master */
saloutos 0:083111ae2a11 496 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_UE);
saloutos 0:083111ae2a11 497
saloutos 0:083111ae2a11 498 /* Disable Rx, enable Tx */
saloutos 0:083111ae2a11 499 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_RE);
saloutos 0:083111ae2a11 500 SET_BIT(hsmartcard->Instance->RQR, SMARTCARD_RXDATA_FLUSH_REQUEST);
saloutos 0:083111ae2a11 501 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_TE);
saloutos 0:083111ae2a11 502
saloutos 0:083111ae2a11 503 /* Enable the Peripheral */
saloutos 0:083111ae2a11 504 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_UE);
saloutos 0:083111ae2a11 505
saloutos 0:083111ae2a11 506 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
saloutos 0:083111ae2a11 507 hsmartcard->TxXferSize = Size;
saloutos 0:083111ae2a11 508 hsmartcard->TxXferCount = Size;
saloutos 0:083111ae2a11 509
saloutos 0:083111ae2a11 510 while(hsmartcard->TxXferCount > 0)
saloutos 0:083111ae2a11 511 {
saloutos 0:083111ae2a11 512 hsmartcard->TxXferCount--;
saloutos 0:083111ae2a11 513 if(SMARTCARD_WaitOnFlagUntilTimeout(hsmartcard, SMARTCARD_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
saloutos 0:083111ae2a11 514 {
saloutos 0:083111ae2a11 515 return HAL_TIMEOUT;
saloutos 0:083111ae2a11 516 }
saloutos 0:083111ae2a11 517 hsmartcard->Instance->TDR = (*pData++ & (uint8_t)0xFF);
saloutos 0:083111ae2a11 518 }
saloutos 0:083111ae2a11 519 if(SMARTCARD_WaitOnFlagUntilTimeout(hsmartcard, SMARTCARD_TRANSMISSION_COMPLETION_FLAG(hsmartcard), RESET, tickstart, Timeout) != HAL_OK)
saloutos 0:083111ae2a11 520 {
saloutos 0:083111ae2a11 521 return HAL_TIMEOUT;
saloutos 0:083111ae2a11 522 }
saloutos 0:083111ae2a11 523 /* Re-enable Rx at end of transmission if initial mode is Rx/Tx */
saloutos 0:083111ae2a11 524 if(hsmartcard->Init.Mode == SMARTCARD_MODE_TX_RX)
saloutos 0:083111ae2a11 525 {
saloutos 0:083111ae2a11 526 /* Disable the Peripheral first to update modes */
saloutos 0:083111ae2a11 527 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_UE);
saloutos 0:083111ae2a11 528 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_RE);
saloutos 0:083111ae2a11 529 /* Enable the Peripheral */
saloutos 0:083111ae2a11 530 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_UE);
saloutos 0:083111ae2a11 531 }
saloutos 0:083111ae2a11 532
saloutos 0:083111ae2a11 533 /* At end of Tx process, restore hsmartcard->gState to Ready */
saloutos 0:083111ae2a11 534 hsmartcard->gState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 535
saloutos 0:083111ae2a11 536 /* Process Unlocked */
saloutos 0:083111ae2a11 537 __HAL_UNLOCK(hsmartcard);
saloutos 0:083111ae2a11 538
saloutos 0:083111ae2a11 539 return HAL_OK;
saloutos 0:083111ae2a11 540 }
saloutos 0:083111ae2a11 541 else
saloutos 0:083111ae2a11 542 {
saloutos 0:083111ae2a11 543 return HAL_BUSY;
saloutos 0:083111ae2a11 544 }
saloutos 0:083111ae2a11 545 }
saloutos 0:083111ae2a11 546
saloutos 0:083111ae2a11 547 /**
saloutos 0:083111ae2a11 548 * @brief Receive an amount of data in blocking mode.
saloutos 0:083111ae2a11 549 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 550 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 551 * @param pData pointer to data buffer.
saloutos 0:083111ae2a11 552 * @param Size amount of data to be received.
saloutos 0:083111ae2a11 553 * @param Timeout Timeout duration.
saloutos 0:083111ae2a11 554 * @retval HAL status
saloutos 0:083111ae2a11 555 */
saloutos 0:083111ae2a11 556 HAL_StatusTypeDef HAL_SMARTCARD_Receive(SMARTCARD_HandleTypeDef *hsmartcard, uint8_t *pData, uint16_t Size, uint32_t Timeout)
saloutos 0:083111ae2a11 557 {
saloutos 0:083111ae2a11 558 uint32_t tickstart = 0;
saloutos 0:083111ae2a11 559
saloutos 0:083111ae2a11 560 /* Check that a Rx process is not already ongoing */
saloutos 0:083111ae2a11 561 if(hsmartcard->RxState == HAL_SMARTCARD_STATE_READY)
saloutos 0:083111ae2a11 562 {
saloutos 0:083111ae2a11 563 if((pData == NULL) || (Size == 0))
saloutos 0:083111ae2a11 564 {
saloutos 0:083111ae2a11 565 return HAL_ERROR;
saloutos 0:083111ae2a11 566 }
saloutos 0:083111ae2a11 567
saloutos 0:083111ae2a11 568 /* Process Locked */
saloutos 0:083111ae2a11 569 __HAL_LOCK(hsmartcard);
saloutos 0:083111ae2a11 570
saloutos 0:083111ae2a11 571 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
saloutos 0:083111ae2a11 572 hsmartcard->RxState = HAL_SMARTCARD_STATE_BUSY_RX;
saloutos 0:083111ae2a11 573
saloutos 0:083111ae2a11 574 /* Init tickstart for timeout managment*/
saloutos 0:083111ae2a11 575 tickstart = HAL_GetTick();
saloutos 0:083111ae2a11 576
saloutos 0:083111ae2a11 577 hsmartcard->RxXferSize = Size;
saloutos 0:083111ae2a11 578 hsmartcard->RxXferCount = Size;
saloutos 0:083111ae2a11 579
saloutos 0:083111ae2a11 580 /* Check the remain data to be received */
saloutos 0:083111ae2a11 581 while(hsmartcard->RxXferCount > 0)
saloutos 0:083111ae2a11 582 {
saloutos 0:083111ae2a11 583 hsmartcard->RxXferCount--;
saloutos 0:083111ae2a11 584
saloutos 0:083111ae2a11 585 if(SMARTCARD_WaitOnFlagUntilTimeout(hsmartcard, SMARTCARD_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK)
saloutos 0:083111ae2a11 586 {
saloutos 0:083111ae2a11 587 return HAL_TIMEOUT;
saloutos 0:083111ae2a11 588 }
saloutos 0:083111ae2a11 589 *pData++ = (uint8_t)(hsmartcard->Instance->RDR & (uint8_t)0x00FF);
saloutos 0:083111ae2a11 590 }
saloutos 0:083111ae2a11 591
saloutos 0:083111ae2a11 592 /* At end of Rx process, restore hsmartcard->RxState to Ready */
saloutos 0:083111ae2a11 593 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 594
saloutos 0:083111ae2a11 595 /* Process Unlocked */
saloutos 0:083111ae2a11 596 __HAL_UNLOCK(hsmartcard);
saloutos 0:083111ae2a11 597
saloutos 0:083111ae2a11 598 return HAL_OK;
saloutos 0:083111ae2a11 599 }
saloutos 0:083111ae2a11 600 else
saloutos 0:083111ae2a11 601 {
saloutos 0:083111ae2a11 602 return HAL_BUSY;
saloutos 0:083111ae2a11 603 }
saloutos 0:083111ae2a11 604 }
saloutos 0:083111ae2a11 605
saloutos 0:083111ae2a11 606 /**
saloutos 0:083111ae2a11 607 * @brief Send an amount of data in interrupt mode.
saloutos 0:083111ae2a11 608 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 609 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 610 * @param pData pointer to data buffer.
saloutos 0:083111ae2a11 611 * @param Size amount of data to be sent.
saloutos 0:083111ae2a11 612 * @retval HAL status
saloutos 0:083111ae2a11 613 */
saloutos 0:083111ae2a11 614 HAL_StatusTypeDef HAL_SMARTCARD_Transmit_IT(SMARTCARD_HandleTypeDef *hsmartcard, uint8_t *pData, uint16_t Size)
saloutos 0:083111ae2a11 615 {
saloutos 0:083111ae2a11 616 /* Check that a Tx process is not already ongoing */
saloutos 0:083111ae2a11 617 if (hsmartcard->gState == HAL_SMARTCARD_STATE_READY)
saloutos 0:083111ae2a11 618 {
saloutos 0:083111ae2a11 619 if((pData == NULL) || (Size == 0))
saloutos 0:083111ae2a11 620 {
saloutos 0:083111ae2a11 621 return HAL_ERROR;
saloutos 0:083111ae2a11 622 }
saloutos 0:083111ae2a11 623
saloutos 0:083111ae2a11 624 /* Process Locked */
saloutos 0:083111ae2a11 625 __HAL_LOCK(hsmartcard);
saloutos 0:083111ae2a11 626
saloutos 0:083111ae2a11 627 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
saloutos 0:083111ae2a11 628 hsmartcard->gState = HAL_SMARTCARD_STATE_BUSY_TX;
saloutos 0:083111ae2a11 629
saloutos 0:083111ae2a11 630 hsmartcard->pTxBuffPtr = pData;
saloutos 0:083111ae2a11 631 hsmartcard->TxXferSize = Size;
saloutos 0:083111ae2a11 632 hsmartcard->TxXferCount = Size;
saloutos 0:083111ae2a11 633
saloutos 0:083111ae2a11 634 /* Disable the Peripheral first to update mode for TX master */
saloutos 0:083111ae2a11 635 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_UE);
saloutos 0:083111ae2a11 636
saloutos 0:083111ae2a11 637 /* Disable Rx, enable Tx */
saloutos 0:083111ae2a11 638 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_RE);
saloutos 0:083111ae2a11 639 SET_BIT(hsmartcard->Instance->RQR, SMARTCARD_RXDATA_FLUSH_REQUEST);
saloutos 0:083111ae2a11 640 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_TE);
saloutos 0:083111ae2a11 641
saloutos 0:083111ae2a11 642 /* Enable the Peripheral */
saloutos 0:083111ae2a11 643 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_UE);
saloutos 0:083111ae2a11 644
saloutos 0:083111ae2a11 645 /* Process Unlocked */
saloutos 0:083111ae2a11 646 __HAL_UNLOCK(hsmartcard);
saloutos 0:083111ae2a11 647
saloutos 0:083111ae2a11 648 /* Enable the SMARTCARD Error Interrupt: (Frame error) */
saloutos 0:083111ae2a11 649 SET_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
saloutos 0:083111ae2a11 650
saloutos 0:083111ae2a11 651 /* Enable the SMARTCARD Transmit Data Register Empty Interrupt */
saloutos 0:083111ae2a11 652 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_TXEIE);
saloutos 0:083111ae2a11 653
saloutos 0:083111ae2a11 654 return HAL_OK;
saloutos 0:083111ae2a11 655 }
saloutos 0:083111ae2a11 656 else
saloutos 0:083111ae2a11 657 {
saloutos 0:083111ae2a11 658 return HAL_BUSY;
saloutos 0:083111ae2a11 659 }
saloutos 0:083111ae2a11 660 }
saloutos 0:083111ae2a11 661
saloutos 0:083111ae2a11 662 /**
saloutos 0:083111ae2a11 663 * @brief Receive an amount of data in interrupt mode.
saloutos 0:083111ae2a11 664 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 665 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 666 * @param pData pointer to data buffer.
saloutos 0:083111ae2a11 667 * @param Size amount of data to be received.
saloutos 0:083111ae2a11 668 * @retval HAL status
saloutos 0:083111ae2a11 669 */
saloutos 0:083111ae2a11 670 HAL_StatusTypeDef HAL_SMARTCARD_Receive_IT(SMARTCARD_HandleTypeDef *hsmartcard, uint8_t *pData, uint16_t Size)
saloutos 0:083111ae2a11 671 {
saloutos 0:083111ae2a11 672 /* Check that a Rx process is not already ongoing */
saloutos 0:083111ae2a11 673 if(hsmartcard->RxState == HAL_SMARTCARD_STATE_READY)
saloutos 0:083111ae2a11 674 {
saloutos 0:083111ae2a11 675 if((pData == NULL) || (Size == 0))
saloutos 0:083111ae2a11 676 {
saloutos 0:083111ae2a11 677 return HAL_ERROR;
saloutos 0:083111ae2a11 678 }
saloutos 0:083111ae2a11 679
saloutos 0:083111ae2a11 680 /* Process Locked */
saloutos 0:083111ae2a11 681 __HAL_LOCK(hsmartcard);
saloutos 0:083111ae2a11 682
saloutos 0:083111ae2a11 683 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
saloutos 0:083111ae2a11 684 hsmartcard->RxState = HAL_SMARTCARD_STATE_BUSY_RX;
saloutos 0:083111ae2a11 685
saloutos 0:083111ae2a11 686 hsmartcard->pRxBuffPtr = pData;
saloutos 0:083111ae2a11 687 hsmartcard->RxXferSize = Size;
saloutos 0:083111ae2a11 688 hsmartcard->RxXferCount = Size;
saloutos 0:083111ae2a11 689
saloutos 0:083111ae2a11 690 /* Process Unlocked */
saloutos 0:083111ae2a11 691 __HAL_UNLOCK(hsmartcard);
saloutos 0:083111ae2a11 692
saloutos 0:083111ae2a11 693 /* Enable the SMARTCARD Parity Error and Data Register not empty Interrupts */
saloutos 0:083111ae2a11 694 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_PEIE| USART_CR1_RXNEIE);
saloutos 0:083111ae2a11 695
saloutos 0:083111ae2a11 696 /* Enable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */
saloutos 0:083111ae2a11 697 SET_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
saloutos 0:083111ae2a11 698
saloutos 0:083111ae2a11 699 return HAL_OK;
saloutos 0:083111ae2a11 700 }
saloutos 0:083111ae2a11 701 else
saloutos 0:083111ae2a11 702 {
saloutos 0:083111ae2a11 703 return HAL_BUSY;
saloutos 0:083111ae2a11 704 }
saloutos 0:083111ae2a11 705 }
saloutos 0:083111ae2a11 706
saloutos 0:083111ae2a11 707 /**
saloutos 0:083111ae2a11 708 * @brief Send an amount of data in DMA mode.
saloutos 0:083111ae2a11 709 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 710 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 711 * @param pData pointer to data buffer.
saloutos 0:083111ae2a11 712 * @param Size amount of data to be sent.
saloutos 0:083111ae2a11 713 * @retval HAL status
saloutos 0:083111ae2a11 714 */
saloutos 0:083111ae2a11 715 HAL_StatusTypeDef HAL_SMARTCARD_Transmit_DMA(SMARTCARD_HandleTypeDef *hsmartcard, uint8_t *pData, uint16_t Size)
saloutos 0:083111ae2a11 716 {
saloutos 0:083111ae2a11 717 /* Check that a Tx process is not already ongoing */
saloutos 0:083111ae2a11 718 if (hsmartcard->gState == HAL_SMARTCARD_STATE_READY)
saloutos 0:083111ae2a11 719 {
saloutos 0:083111ae2a11 720 if((pData == NULL) || (Size == 0))
saloutos 0:083111ae2a11 721 {
saloutos 0:083111ae2a11 722 return HAL_ERROR;
saloutos 0:083111ae2a11 723 }
saloutos 0:083111ae2a11 724
saloutos 0:083111ae2a11 725 /* Process Locked */
saloutos 0:083111ae2a11 726 __HAL_LOCK(hsmartcard);
saloutos 0:083111ae2a11 727
saloutos 0:083111ae2a11 728 hsmartcard->gState = HAL_SMARTCARD_STATE_BUSY_TX;
saloutos 0:083111ae2a11 729
saloutos 0:083111ae2a11 730 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
saloutos 0:083111ae2a11 731 hsmartcard->pTxBuffPtr = pData;
saloutos 0:083111ae2a11 732 hsmartcard->TxXferSize = Size;
saloutos 0:083111ae2a11 733 hsmartcard->TxXferCount = Size;
saloutos 0:083111ae2a11 734
saloutos 0:083111ae2a11 735 /* Disable the Peripheral first to update mode for TX master */
saloutos 0:083111ae2a11 736 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_UE);
saloutos 0:083111ae2a11 737
saloutos 0:083111ae2a11 738 /* Disable Rx, enable Tx */
saloutos 0:083111ae2a11 739 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_RE);
saloutos 0:083111ae2a11 740 SET_BIT(hsmartcard->Instance->RQR, SMARTCARD_RXDATA_FLUSH_REQUEST);
saloutos 0:083111ae2a11 741 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_TE);
saloutos 0:083111ae2a11 742
saloutos 0:083111ae2a11 743 /* Enable the Peripheral */
saloutos 0:083111ae2a11 744 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_UE);
saloutos 0:083111ae2a11 745
saloutos 0:083111ae2a11 746 /* Set the SMARTCARD DMA transfer complete callback */
saloutos 0:083111ae2a11 747 hsmartcard->hdmatx->XferCpltCallback = SMARTCARD_DMATransmitCplt;
saloutos 0:083111ae2a11 748
saloutos 0:083111ae2a11 749 /* Set the SMARTCARD error callback */
saloutos 0:083111ae2a11 750 hsmartcard->hdmatx->XferErrorCallback = SMARTCARD_DMAError;
saloutos 0:083111ae2a11 751
saloutos 0:083111ae2a11 752 /* Set the DMA abort callback */
saloutos 0:083111ae2a11 753 hsmartcard->hdmatx->XferAbortCallback = NULL;
saloutos 0:083111ae2a11 754
saloutos 0:083111ae2a11 755 /* Enable the SMARTCARD transmit DMA channel */
saloutos 0:083111ae2a11 756 HAL_DMA_Start_IT(hsmartcard->hdmatx, (uint32_t)hsmartcard->pTxBuffPtr, (uint32_t)&hsmartcard->Instance->TDR, Size);
saloutos 0:083111ae2a11 757
saloutos 0:083111ae2a11 758 /* Clear the TC flag in the ICR register */
saloutos 0:083111ae2a11 759 CLEAR_BIT(hsmartcard->Instance->ICR, USART_ICR_TCCF);
saloutos 0:083111ae2a11 760
saloutos 0:083111ae2a11 761 /* Process Unlocked */
saloutos 0:083111ae2a11 762 __HAL_UNLOCK(hsmartcard);
saloutos 0:083111ae2a11 763
saloutos 0:083111ae2a11 764 /* Enable the UART Error Interrupt: (Frame error) */
saloutos 0:083111ae2a11 765 SET_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
saloutos 0:083111ae2a11 766
saloutos 0:083111ae2a11 767 /* Enable the DMA transfer for transmit request by setting the DMAT bit
saloutos 0:083111ae2a11 768 in the SMARTCARD associated USART CR3 register */
saloutos 0:083111ae2a11 769 SET_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAT);
saloutos 0:083111ae2a11 770
saloutos 0:083111ae2a11 771 return HAL_OK;
saloutos 0:083111ae2a11 772 }
saloutos 0:083111ae2a11 773 else
saloutos 0:083111ae2a11 774 {
saloutos 0:083111ae2a11 775 return HAL_BUSY;
saloutos 0:083111ae2a11 776 }
saloutos 0:083111ae2a11 777 }
saloutos 0:083111ae2a11 778
saloutos 0:083111ae2a11 779 /**
saloutos 0:083111ae2a11 780 * @brief Receive an amount of data in DMA mode.
saloutos 0:083111ae2a11 781 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 782 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 783 * @param pData pointer to data buffer.
saloutos 0:083111ae2a11 784 * @param Size amount of data to be received.
saloutos 0:083111ae2a11 785 * @note The SMARTCARD-associated USART parity is enabled (PCE = 1),
saloutos 0:083111ae2a11 786 * the received data contain the parity bit (MSB position).
saloutos 0:083111ae2a11 787 * @retval HAL status
saloutos 0:083111ae2a11 788 */
saloutos 0:083111ae2a11 789 HAL_StatusTypeDef HAL_SMARTCARD_Receive_DMA(SMARTCARD_HandleTypeDef *hsmartcard, uint8_t *pData, uint16_t Size)
saloutos 0:083111ae2a11 790 {
saloutos 0:083111ae2a11 791 /* Check that a Rx process is not already ongoing */
saloutos 0:083111ae2a11 792 if(hsmartcard->RxState == HAL_SMARTCARD_STATE_READY)
saloutos 0:083111ae2a11 793 {
saloutos 0:083111ae2a11 794 if((pData == NULL) || (Size == 0))
saloutos 0:083111ae2a11 795 {
saloutos 0:083111ae2a11 796 return HAL_ERROR;
saloutos 0:083111ae2a11 797 }
saloutos 0:083111ae2a11 798
saloutos 0:083111ae2a11 799 /* Process Locked */
saloutos 0:083111ae2a11 800 __HAL_LOCK(hsmartcard);
saloutos 0:083111ae2a11 801
saloutos 0:083111ae2a11 802 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
saloutos 0:083111ae2a11 803 hsmartcard->RxState = HAL_SMARTCARD_STATE_BUSY_RX;
saloutos 0:083111ae2a11 804
saloutos 0:083111ae2a11 805 hsmartcard->pRxBuffPtr = pData;
saloutos 0:083111ae2a11 806 hsmartcard->RxXferSize = Size;
saloutos 0:083111ae2a11 807
saloutos 0:083111ae2a11 808 /* Set the SMARTCARD DMA transfer complete callback */
saloutos 0:083111ae2a11 809 hsmartcard->hdmarx->XferCpltCallback = SMARTCARD_DMAReceiveCplt;
saloutos 0:083111ae2a11 810
saloutos 0:083111ae2a11 811 /* Set the SMARTCARD DMA error callback */
saloutos 0:083111ae2a11 812 hsmartcard->hdmarx->XferErrorCallback = SMARTCARD_DMAError;
saloutos 0:083111ae2a11 813
saloutos 0:083111ae2a11 814 /* Set the DMA abort callback */
saloutos 0:083111ae2a11 815 hsmartcard->hdmarx->XferAbortCallback = NULL;
saloutos 0:083111ae2a11 816
saloutos 0:083111ae2a11 817 /* Enable the DMA channel */
saloutos 0:083111ae2a11 818 HAL_DMA_Start_IT(hsmartcard->hdmarx, (uint32_t)&hsmartcard->Instance->RDR, (uint32_t)hsmartcard->pRxBuffPtr, Size);
saloutos 0:083111ae2a11 819
saloutos 0:083111ae2a11 820 /* Process Unlocked */
saloutos 0:083111ae2a11 821 __HAL_UNLOCK(hsmartcard);
saloutos 0:083111ae2a11 822
saloutos 0:083111ae2a11 823 /* Enable the UART Parity Error Interrupt */
saloutos 0:083111ae2a11 824 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_PEIE);
saloutos 0:083111ae2a11 825
saloutos 0:083111ae2a11 826 /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
saloutos 0:083111ae2a11 827 SET_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
saloutos 0:083111ae2a11 828
saloutos 0:083111ae2a11 829 /* Enable the DMA transfer for the receiver request by setting the DMAR bit
saloutos 0:083111ae2a11 830 in the SMARTCARD associated USART CR3 register */
saloutos 0:083111ae2a11 831 SET_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAR);
saloutos 0:083111ae2a11 832
saloutos 0:083111ae2a11 833 return HAL_OK;
saloutos 0:083111ae2a11 834 }
saloutos 0:083111ae2a11 835 else
saloutos 0:083111ae2a11 836 {
saloutos 0:083111ae2a11 837 return HAL_BUSY;
saloutos 0:083111ae2a11 838 }
saloutos 0:083111ae2a11 839 }
saloutos 0:083111ae2a11 840
saloutos 0:083111ae2a11 841 /**
saloutos 0:083111ae2a11 842 * @brief Abort ongoing transfers (blocking mode).
saloutos 0:083111ae2a11 843 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 844 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 845 * @note This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode.
saloutos 0:083111ae2a11 846 * This procedure performs following operations :
saloutos 0:083111ae2a11 847 * - Disable SMARTCARD Interrupts (Tx and Rx)
saloutos 0:083111ae2a11 848 * - Disable the DMA transfer in the peripheral register (if enabled)
saloutos 0:083111ae2a11 849 * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode)
saloutos 0:083111ae2a11 850 * - Set handle State to READY
saloutos 0:083111ae2a11 851 * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed.
saloutos 0:083111ae2a11 852 * @retval HAL status
saloutos 0:083111ae2a11 853 */
saloutos 0:083111ae2a11 854 HAL_StatusTypeDef HAL_SMARTCARD_Abort(SMARTCARD_HandleTypeDef *hsmartcard)
saloutos 0:083111ae2a11 855 {
saloutos 0:083111ae2a11 856 /* Disable RTOIE, EOBIE, TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
saloutos 0:083111ae2a11 857 CLEAR_BIT(hsmartcard->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE | USART_CR1_RTOIE | USART_CR1_EOBIE));
saloutos 0:083111ae2a11 858 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
saloutos 0:083111ae2a11 859
saloutos 0:083111ae2a11 860 /* Disable the SMARTCARD DMA Tx request if enabled */
saloutos 0:083111ae2a11 861 if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAT))
saloutos 0:083111ae2a11 862 {
saloutos 0:083111ae2a11 863 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAT);
saloutos 0:083111ae2a11 864
saloutos 0:083111ae2a11 865 /* Abort the SMARTCARD DMA Tx channel : use blocking DMA Abort API (no callback) */
saloutos 0:083111ae2a11 866 if(hsmartcard->hdmatx != NULL)
saloutos 0:083111ae2a11 867 {
saloutos 0:083111ae2a11 868 /* Set the SMARTCARD DMA Abort callback to Null.
saloutos 0:083111ae2a11 869 No call back execution at end of DMA abort procedure */
saloutos 0:083111ae2a11 870 hsmartcard->hdmatx->XferAbortCallback = NULL;
saloutos 0:083111ae2a11 871
saloutos 0:083111ae2a11 872 HAL_DMA_Abort(hsmartcard->hdmatx);
saloutos 0:083111ae2a11 873 }
saloutos 0:083111ae2a11 874 }
saloutos 0:083111ae2a11 875
saloutos 0:083111ae2a11 876 /* Disable the SMARTCARD DMA Rx request if enabled */
saloutos 0:083111ae2a11 877 if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAR))
saloutos 0:083111ae2a11 878 {
saloutos 0:083111ae2a11 879 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAR);
saloutos 0:083111ae2a11 880
saloutos 0:083111ae2a11 881 /* Abort the SMARTCARD DMA Rx channel : use blocking DMA Abort API (no callback) */
saloutos 0:083111ae2a11 882 if(hsmartcard->hdmarx != NULL)
saloutos 0:083111ae2a11 883 {
saloutos 0:083111ae2a11 884 /* Set the SMARTCARD DMA Abort callback to Null.
saloutos 0:083111ae2a11 885 No call back execution at end of DMA abort procedure */
saloutos 0:083111ae2a11 886 hsmartcard->hdmarx->XferAbortCallback = NULL;
saloutos 0:083111ae2a11 887
saloutos 0:083111ae2a11 888 HAL_DMA_Abort(hsmartcard->hdmarx);
saloutos 0:083111ae2a11 889 }
saloutos 0:083111ae2a11 890 }
saloutos 0:083111ae2a11 891
saloutos 0:083111ae2a11 892 /* Reset Tx and Rx transfer counters */
saloutos 0:083111ae2a11 893 hsmartcard->TxXferCount = 0;
saloutos 0:083111ae2a11 894 hsmartcard->RxXferCount = 0;
saloutos 0:083111ae2a11 895
saloutos 0:083111ae2a11 896 /* Clear the Error flags in the ICR register */
saloutos 0:083111ae2a11 897 __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard, SMARTCARD_CLEAR_OREF | SMARTCARD_CLEAR_NEF | SMARTCARD_CLEAR_PEF | SMARTCARD_CLEAR_FEF | SMARTCARD_CLEAR_RTOF | SMARTCARD_CLEAR_EOBF);
saloutos 0:083111ae2a11 898
saloutos 0:083111ae2a11 899 /* Restore hsmartcard->gState and hsmartcard->RxState to Ready */
saloutos 0:083111ae2a11 900 hsmartcard->gState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 901 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 902
saloutos 0:083111ae2a11 903 /* Reset Handle ErrorCode to No Error */
saloutos 0:083111ae2a11 904 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
saloutos 0:083111ae2a11 905
saloutos 0:083111ae2a11 906 return HAL_OK;
saloutos 0:083111ae2a11 907 }
saloutos 0:083111ae2a11 908
saloutos 0:083111ae2a11 909 /**
saloutos 0:083111ae2a11 910 * @brief Abort ongoing Transmit transfer (blocking mode).
saloutos 0:083111ae2a11 911 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 912 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 913 * @note This procedure could be used for aborting any ongoing Tx transfer started in Interrupt or DMA mode.
saloutos 0:083111ae2a11 914 * This procedure performs following operations :
saloutos 0:083111ae2a11 915 * - Disable SMARTCARD Interrupts (Tx)
saloutos 0:083111ae2a11 916 * - Disable the DMA transfer in the peripheral register (if enabled)
saloutos 0:083111ae2a11 917 * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode)
saloutos 0:083111ae2a11 918 * - Set handle State to READY
saloutos 0:083111ae2a11 919 * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed.
saloutos 0:083111ae2a11 920 * @retval HAL status
saloutos 0:083111ae2a11 921 */
saloutos 0:083111ae2a11 922 HAL_StatusTypeDef HAL_SMARTCARD_AbortTransmit(SMARTCARD_HandleTypeDef *hsmartcard)
saloutos 0:083111ae2a11 923 {
saloutos 0:083111ae2a11 924 /* Disable TXEIE and TCIE interrupts */
saloutos 0:083111ae2a11 925 CLEAR_BIT(hsmartcard->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));
saloutos 0:083111ae2a11 926
saloutos 0:083111ae2a11 927 /* Check if a receive process is ongoing or not. If not disable ERR IT */
saloutos 0:083111ae2a11 928 if(hsmartcard->RxState == HAL_SMARTCARD_STATE_READY)
saloutos 0:083111ae2a11 929 {
saloutos 0:083111ae2a11 930 /* Disable the SMARTCARD Error Interrupt: (Frame error) */
saloutos 0:083111ae2a11 931 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
saloutos 0:083111ae2a11 932 }
saloutos 0:083111ae2a11 933
saloutos 0:083111ae2a11 934 /* Disable the SMARTCARD DMA Tx request if enabled */
saloutos 0:083111ae2a11 935 if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAT))
saloutos 0:083111ae2a11 936 {
saloutos 0:083111ae2a11 937 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAT);
saloutos 0:083111ae2a11 938
saloutos 0:083111ae2a11 939 /* Abort the SMARTCARD DMA Tx channel : use blocking DMA Abort API (no callback) */
saloutos 0:083111ae2a11 940 if(hsmartcard->hdmatx != NULL)
saloutos 0:083111ae2a11 941 {
saloutos 0:083111ae2a11 942 /* Set the SMARTCARD DMA Abort callback to Null.
saloutos 0:083111ae2a11 943 No call back execution at end of DMA abort procedure */
saloutos 0:083111ae2a11 944 hsmartcard->hdmatx->XferAbortCallback = NULL;
saloutos 0:083111ae2a11 945
saloutos 0:083111ae2a11 946 HAL_DMA_Abort(hsmartcard->hdmatx);
saloutos 0:083111ae2a11 947 }
saloutos 0:083111ae2a11 948 }
saloutos 0:083111ae2a11 949
saloutos 0:083111ae2a11 950 /* Reset Tx transfer counter */
saloutos 0:083111ae2a11 951 hsmartcard->TxXferCount = 0;
saloutos 0:083111ae2a11 952
saloutos 0:083111ae2a11 953 /* Clear the Error flags in the ICR register */
saloutos 0:083111ae2a11 954 __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard, SMARTCARD_CLEAR_FEF);
saloutos 0:083111ae2a11 955
saloutos 0:083111ae2a11 956 /* Restore hsmartcard->gState to Ready */
saloutos 0:083111ae2a11 957 hsmartcard->gState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 958
saloutos 0:083111ae2a11 959 return HAL_OK;
saloutos 0:083111ae2a11 960 }
saloutos 0:083111ae2a11 961
saloutos 0:083111ae2a11 962 /**
saloutos 0:083111ae2a11 963 * @brief Abort ongoing Receive transfer (blocking mode).
saloutos 0:083111ae2a11 964 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 965 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 966 * @note This procedure could be used for aborting any ongoing Rx transfer started in Interrupt or DMA mode.
saloutos 0:083111ae2a11 967 * This procedure performs following operations :
saloutos 0:083111ae2a11 968 * - Disable SMARTCARD Interrupts (Rx)
saloutos 0:083111ae2a11 969 * - Disable the DMA transfer in the peripheral register (if enabled)
saloutos 0:083111ae2a11 970 * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode)
saloutos 0:083111ae2a11 971 * - Set handle State to READY
saloutos 0:083111ae2a11 972 * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed.
saloutos 0:083111ae2a11 973 * @retval HAL status
saloutos 0:083111ae2a11 974 */
saloutos 0:083111ae2a11 975 HAL_StatusTypeDef HAL_SMARTCARD_AbortReceive(SMARTCARD_HandleTypeDef *hsmartcard)
saloutos 0:083111ae2a11 976 {
saloutos 0:083111ae2a11 977 /* Disable RTOIE, EOBIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
saloutos 0:083111ae2a11 978 CLEAR_BIT(hsmartcard->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_RTOIE | USART_CR1_EOBIE));
saloutos 0:083111ae2a11 979
saloutos 0:083111ae2a11 980 /* Check if a Transmit process is ongoing or not. If not disable ERR IT */
saloutos 0:083111ae2a11 981 if(hsmartcard->gState == HAL_SMARTCARD_STATE_READY)
saloutos 0:083111ae2a11 982 {
saloutos 0:083111ae2a11 983 /* Disable the SMARTCARD Error Interrupt: (Frame error) */
saloutos 0:083111ae2a11 984 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
saloutos 0:083111ae2a11 985 }
saloutos 0:083111ae2a11 986
saloutos 0:083111ae2a11 987 /* Disable the SMARTCARD DMA Rx request if enabled */
saloutos 0:083111ae2a11 988 if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAR))
saloutos 0:083111ae2a11 989 {
saloutos 0:083111ae2a11 990 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAR);
saloutos 0:083111ae2a11 991
saloutos 0:083111ae2a11 992 /* Abort the SMARTCARD DMA Rx channel : use blocking DMA Abort API (no callback) */
saloutos 0:083111ae2a11 993 if(hsmartcard->hdmarx != NULL)
saloutos 0:083111ae2a11 994 {
saloutos 0:083111ae2a11 995 /* Set the SMARTCARD DMA Abort callback to Null.
saloutos 0:083111ae2a11 996 No call back execution at end of DMA abort procedure */
saloutos 0:083111ae2a11 997 hsmartcard->hdmarx->XferAbortCallback = NULL;
saloutos 0:083111ae2a11 998
saloutos 0:083111ae2a11 999 HAL_DMA_Abort(hsmartcard->hdmarx);
saloutos 0:083111ae2a11 1000 }
saloutos 0:083111ae2a11 1001 }
saloutos 0:083111ae2a11 1002
saloutos 0:083111ae2a11 1003 /* Reset Rx transfer counter */
saloutos 0:083111ae2a11 1004 hsmartcard->RxXferCount = 0;
saloutos 0:083111ae2a11 1005
saloutos 0:083111ae2a11 1006 /* Clear the Error flags in the ICR register */
saloutos 0:083111ae2a11 1007 __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard, SMARTCARD_CLEAR_OREF | SMARTCARD_CLEAR_NEF | SMARTCARD_CLEAR_PEF | SMARTCARD_CLEAR_FEF | SMARTCARD_CLEAR_RTOF | SMARTCARD_CLEAR_EOBF);
saloutos 0:083111ae2a11 1008
saloutos 0:083111ae2a11 1009 /* Restore hsmartcard->RxState to Ready */
saloutos 0:083111ae2a11 1010 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 1011
saloutos 0:083111ae2a11 1012 return HAL_OK;
saloutos 0:083111ae2a11 1013 }
saloutos 0:083111ae2a11 1014
saloutos 0:083111ae2a11 1015 /**
saloutos 0:083111ae2a11 1016 * @brief Abort ongoing transfers (Interrupt mode).
saloutos 0:083111ae2a11 1017 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 1018 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 1019 * @note This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode.
saloutos 0:083111ae2a11 1020 * This procedure performs following operations :
saloutos 0:083111ae2a11 1021 * - Disable SMARTCARD Interrupts (Tx and Rx)
saloutos 0:083111ae2a11 1022 * - Disable the DMA transfer in the peripheral register (if enabled)
saloutos 0:083111ae2a11 1023 * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode)
saloutos 0:083111ae2a11 1024 * - Set handle State to READY
saloutos 0:083111ae2a11 1025 * - At abort completion, call user abort complete callback
saloutos 0:083111ae2a11 1026 * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be
saloutos 0:083111ae2a11 1027 * considered as completed only when user abort complete callback is executed (not when exiting function).
saloutos 0:083111ae2a11 1028 * @retval HAL status
saloutos 0:083111ae2a11 1029 */
saloutos 0:083111ae2a11 1030 HAL_StatusTypeDef HAL_SMARTCARD_Abort_IT(SMARTCARD_HandleTypeDef *hsmartcard)
saloutos 0:083111ae2a11 1031 {
saloutos 0:083111ae2a11 1032 uint32_t abortcplt = 1;
saloutos 0:083111ae2a11 1033
saloutos 0:083111ae2a11 1034 /* Disable RTOIE, EOBIE, TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
saloutos 0:083111ae2a11 1035 CLEAR_BIT(hsmartcard->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE | USART_CR1_RTOIE | USART_CR1_EOBIE));
saloutos 0:083111ae2a11 1036 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
saloutos 0:083111ae2a11 1037
saloutos 0:083111ae2a11 1038 /* If DMA Tx and/or DMA Rx Handles are associated to SMARTCARD Handle, DMA Abort complete callbacks should be initialised
saloutos 0:083111ae2a11 1039 before any call to DMA Abort functions */
saloutos 0:083111ae2a11 1040 /* DMA Tx Handle is valid */
saloutos 0:083111ae2a11 1041 if(hsmartcard->hdmatx != NULL)
saloutos 0:083111ae2a11 1042 {
saloutos 0:083111ae2a11 1043 /* Set DMA Abort Complete callback if SMARTCARD DMA Tx request if enabled.
saloutos 0:083111ae2a11 1044 Otherwise, set it to NULL */
saloutos 0:083111ae2a11 1045 if(HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAT))
saloutos 0:083111ae2a11 1046 {
saloutos 0:083111ae2a11 1047 hsmartcard->hdmatx->XferAbortCallback = SMARTCARD_DMATxAbortCallback;
saloutos 0:083111ae2a11 1048 }
saloutos 0:083111ae2a11 1049 else
saloutos 0:083111ae2a11 1050 {
saloutos 0:083111ae2a11 1051 hsmartcard->hdmatx->XferAbortCallback = NULL;
saloutos 0:083111ae2a11 1052 }
saloutos 0:083111ae2a11 1053 }
saloutos 0:083111ae2a11 1054 /* DMA Rx Handle is valid */
saloutos 0:083111ae2a11 1055 if(hsmartcard->hdmarx != NULL)
saloutos 0:083111ae2a11 1056 {
saloutos 0:083111ae2a11 1057 /* Set DMA Abort Complete callback if SMARTCARD DMA Rx request if enabled.
saloutos 0:083111ae2a11 1058 Otherwise, set it to NULL */
saloutos 0:083111ae2a11 1059 if(HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAR))
saloutos 0:083111ae2a11 1060 {
saloutos 0:083111ae2a11 1061 hsmartcard->hdmarx->XferAbortCallback = SMARTCARD_DMARxAbortCallback;
saloutos 0:083111ae2a11 1062 }
saloutos 0:083111ae2a11 1063 else
saloutos 0:083111ae2a11 1064 {
saloutos 0:083111ae2a11 1065 hsmartcard->hdmarx->XferAbortCallback = NULL;
saloutos 0:083111ae2a11 1066 }
saloutos 0:083111ae2a11 1067 }
saloutos 0:083111ae2a11 1068
saloutos 0:083111ae2a11 1069 /* Disable the SMARTCARD DMA Tx request if enabled */
saloutos 0:083111ae2a11 1070 if(HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAT))
saloutos 0:083111ae2a11 1071 {
saloutos 0:083111ae2a11 1072 /* Disable DMA Tx at UART level */
saloutos 0:083111ae2a11 1073 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAT);
saloutos 0:083111ae2a11 1074
saloutos 0:083111ae2a11 1075 /* Abort the SMARTCARD DMA Tx channel : use non blocking DMA Abort API (callback) */
saloutos 0:083111ae2a11 1076 if(hsmartcard->hdmatx != NULL)
saloutos 0:083111ae2a11 1077 {
saloutos 0:083111ae2a11 1078 /* SMARTCARD Tx DMA Abort callback has already been initialised :
saloutos 0:083111ae2a11 1079 will lead to call HAL_SMARTCARD_AbortCpltCallback() at end of DMA abort procedure */
saloutos 0:083111ae2a11 1080
saloutos 0:083111ae2a11 1081 /* Abort DMA TX */
saloutos 0:083111ae2a11 1082 if(HAL_DMA_Abort_IT(hsmartcard->hdmatx) != HAL_OK)
saloutos 0:083111ae2a11 1083 {
saloutos 0:083111ae2a11 1084 hsmartcard->hdmatx->XferAbortCallback = NULL;
saloutos 0:083111ae2a11 1085 }
saloutos 0:083111ae2a11 1086 else
saloutos 0:083111ae2a11 1087 {
saloutos 0:083111ae2a11 1088 abortcplt = 0;
saloutos 0:083111ae2a11 1089 }
saloutos 0:083111ae2a11 1090 }
saloutos 0:083111ae2a11 1091 }
saloutos 0:083111ae2a11 1092
saloutos 0:083111ae2a11 1093 /* Disable the SMARTCARD DMA Rx request if enabled */
saloutos 0:083111ae2a11 1094 if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAR))
saloutos 0:083111ae2a11 1095 {
saloutos 0:083111ae2a11 1096 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAR);
saloutos 0:083111ae2a11 1097
saloutos 0:083111ae2a11 1098 /* Abort the SMARTCARD DMA Rx channel : use non blocking DMA Abort API (callback) */
saloutos 0:083111ae2a11 1099 if(hsmartcard->hdmarx != NULL)
saloutos 0:083111ae2a11 1100 {
saloutos 0:083111ae2a11 1101 /* SMARTCARD Rx DMA Abort callback has already been initialised :
saloutos 0:083111ae2a11 1102 will lead to call HAL_SMARTCARD_AbortCpltCallback() at end of DMA abort procedure */
saloutos 0:083111ae2a11 1103
saloutos 0:083111ae2a11 1104 /* Abort DMA RX */
saloutos 0:083111ae2a11 1105 if(HAL_DMA_Abort_IT(hsmartcard->hdmarx) != HAL_OK)
saloutos 0:083111ae2a11 1106 {
saloutos 0:083111ae2a11 1107 hsmartcard->hdmarx->XferAbortCallback = NULL;
saloutos 0:083111ae2a11 1108 abortcplt = 1;
saloutos 0:083111ae2a11 1109 }
saloutos 0:083111ae2a11 1110 else
saloutos 0:083111ae2a11 1111 {
saloutos 0:083111ae2a11 1112 abortcplt = 0;
saloutos 0:083111ae2a11 1113 }
saloutos 0:083111ae2a11 1114 }
saloutos 0:083111ae2a11 1115 }
saloutos 0:083111ae2a11 1116
saloutos 0:083111ae2a11 1117 /* if no DMA abort complete callback execution is required => call user Abort Complete callback */
saloutos 0:083111ae2a11 1118 if (abortcplt == 1)
saloutos 0:083111ae2a11 1119 {
saloutos 0:083111ae2a11 1120 /* Reset Tx and Rx transfer counters */
saloutos 0:083111ae2a11 1121 hsmartcard->TxXferCount = 0;
saloutos 0:083111ae2a11 1122 hsmartcard->RxXferCount = 0;
saloutos 0:083111ae2a11 1123
saloutos 0:083111ae2a11 1124 /* Reset errorCode */
saloutos 0:083111ae2a11 1125 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
saloutos 0:083111ae2a11 1126
saloutos 0:083111ae2a11 1127 /* Clear the Error flags in the ICR register */
saloutos 0:083111ae2a11 1128 __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard, SMARTCARD_CLEAR_OREF | SMARTCARD_CLEAR_NEF | SMARTCARD_CLEAR_PEF | SMARTCARD_CLEAR_FEF | SMARTCARD_CLEAR_RTOF | SMARTCARD_CLEAR_EOBF);
saloutos 0:083111ae2a11 1129
saloutos 0:083111ae2a11 1130 /* Restore hsmartcard->gState and hsmartcard->RxState to Ready */
saloutos 0:083111ae2a11 1131 hsmartcard->gState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 1132 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 1133
saloutos 0:083111ae2a11 1134 /* As no DMA to be aborted, call directly user Abort complete callback */
saloutos 0:083111ae2a11 1135 HAL_SMARTCARD_AbortCpltCallback(hsmartcard);
saloutos 0:083111ae2a11 1136 }
saloutos 0:083111ae2a11 1137
saloutos 0:083111ae2a11 1138 return HAL_OK;
saloutos 0:083111ae2a11 1139 }
saloutos 0:083111ae2a11 1140
saloutos 0:083111ae2a11 1141 /**
saloutos 0:083111ae2a11 1142 * @brief Abort ongoing Transmit transfer (Interrupt mode).
saloutos 0:083111ae2a11 1143 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 1144 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 1145 * @note This procedure could be used for aborting any ongoing Tx transfer started in Interrupt or DMA mode.
saloutos 0:083111ae2a11 1146 * This procedure performs following operations :
saloutos 0:083111ae2a11 1147 * - Disable SMARTCARD Interrupts (Tx)
saloutos 0:083111ae2a11 1148 * - Disable the DMA transfer in the peripheral register (if enabled)
saloutos 0:083111ae2a11 1149 * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode)
saloutos 0:083111ae2a11 1150 * - Set handle State to READY
saloutos 0:083111ae2a11 1151 * - At abort completion, call user abort complete callback
saloutos 0:083111ae2a11 1152 * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be
saloutos 0:083111ae2a11 1153 * considered as completed only when user abort complete callback is executed (not when exiting function).
saloutos 0:083111ae2a11 1154 * @retval HAL status
saloutos 0:083111ae2a11 1155 */
saloutos 0:083111ae2a11 1156 HAL_StatusTypeDef HAL_SMARTCARD_AbortTransmit_IT(SMARTCARD_HandleTypeDef *hsmartcard)
saloutos 0:083111ae2a11 1157 {
saloutos 0:083111ae2a11 1158 /* Disable TXEIE and TCIE interrupts */
saloutos 0:083111ae2a11 1159 CLEAR_BIT(hsmartcard->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));
saloutos 0:083111ae2a11 1160
saloutos 0:083111ae2a11 1161 /* Check if a receive process is ongoing or not. If not disable ERR IT */
saloutos 0:083111ae2a11 1162 if(hsmartcard->RxState == HAL_SMARTCARD_STATE_READY)
saloutos 0:083111ae2a11 1163 {
saloutos 0:083111ae2a11 1164 /* Disable the SMARTCARD Error Interrupt: (Frame error) */
saloutos 0:083111ae2a11 1165 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
saloutos 0:083111ae2a11 1166 }
saloutos 0:083111ae2a11 1167
saloutos 0:083111ae2a11 1168 /* Disable the SMARTCARD DMA Tx request if enabled */
saloutos 0:083111ae2a11 1169 if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAT))
saloutos 0:083111ae2a11 1170 {
saloutos 0:083111ae2a11 1171 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAT);
saloutos 0:083111ae2a11 1172
saloutos 0:083111ae2a11 1173 /* Abort the SMARTCARD DMA Tx channel : use non blocking DMA Abort API (callback) */
saloutos 0:083111ae2a11 1174 if(hsmartcard->hdmatx != NULL)
saloutos 0:083111ae2a11 1175 {
saloutos 0:083111ae2a11 1176 /* Set the SMARTCARD DMA Abort callback :
saloutos 0:083111ae2a11 1177 will lead to call HAL_SMARTCARD_AbortCpltCallback() at end of DMA abort procedure */
saloutos 0:083111ae2a11 1178 hsmartcard->hdmatx->XferAbortCallback = SMARTCARD_DMATxOnlyAbortCallback;
saloutos 0:083111ae2a11 1179
saloutos 0:083111ae2a11 1180 /* Abort DMA TX */
saloutos 0:083111ae2a11 1181 if(HAL_DMA_Abort_IT(hsmartcard->hdmatx) != HAL_OK)
saloutos 0:083111ae2a11 1182 {
saloutos 0:083111ae2a11 1183 /* Call Directly hsmartcard->hdmatx->XferAbortCallback function in case of error */
saloutos 0:083111ae2a11 1184 hsmartcard->hdmatx->XferAbortCallback(hsmartcard->hdmatx);
saloutos 0:083111ae2a11 1185 }
saloutos 0:083111ae2a11 1186 }
saloutos 0:083111ae2a11 1187 else
saloutos 0:083111ae2a11 1188 {
saloutos 0:083111ae2a11 1189 /* Reset Tx transfer counter */
saloutos 0:083111ae2a11 1190 hsmartcard->TxXferCount = 0;
saloutos 0:083111ae2a11 1191
saloutos 0:083111ae2a11 1192 /* Restore hsmartcard->gState to Ready */
saloutos 0:083111ae2a11 1193 hsmartcard->gState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 1194
saloutos 0:083111ae2a11 1195 /* As no DMA to be aborted, call directly user Abort complete callback */
saloutos 0:083111ae2a11 1196 HAL_SMARTCARD_AbortTransmitCpltCallback(hsmartcard);
saloutos 0:083111ae2a11 1197 }
saloutos 0:083111ae2a11 1198 }
saloutos 0:083111ae2a11 1199 else
saloutos 0:083111ae2a11 1200 {
saloutos 0:083111ae2a11 1201 /* Reset Tx transfer counter */
saloutos 0:083111ae2a11 1202 hsmartcard->TxXferCount = 0;
saloutos 0:083111ae2a11 1203
saloutos 0:083111ae2a11 1204 /* Clear the Error flags in the ICR register */
saloutos 0:083111ae2a11 1205 __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard, SMARTCARD_CLEAR_FEF);
saloutos 0:083111ae2a11 1206
saloutos 0:083111ae2a11 1207 /* Restore hsmartcard->gState to Ready */
saloutos 0:083111ae2a11 1208 hsmartcard->gState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 1209
saloutos 0:083111ae2a11 1210 /* As no DMA to be aborted, call directly user Abort complete callback */
saloutos 0:083111ae2a11 1211 HAL_SMARTCARD_AbortTransmitCpltCallback(hsmartcard);
saloutos 0:083111ae2a11 1212 }
saloutos 0:083111ae2a11 1213
saloutos 0:083111ae2a11 1214 return HAL_OK;
saloutos 0:083111ae2a11 1215 }
saloutos 0:083111ae2a11 1216
saloutos 0:083111ae2a11 1217 /**
saloutos 0:083111ae2a11 1218 * @brief Abort ongoing Receive transfer (Interrupt mode).
saloutos 0:083111ae2a11 1219 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 1220 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 1221 * @note This procedure could be used for aborting any ongoing Rx transfer started in Interrupt or DMA mode.
saloutos 0:083111ae2a11 1222 * This procedure performs following operations :
saloutos 0:083111ae2a11 1223 * - Disable SMARTCARD Interrupts (Rx)
saloutos 0:083111ae2a11 1224 * - Disable the DMA transfer in the peripheral register (if enabled)
saloutos 0:083111ae2a11 1225 * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode)
saloutos 0:083111ae2a11 1226 * - Set handle State to READY
saloutos 0:083111ae2a11 1227 * - At abort completion, call user abort complete callback
saloutos 0:083111ae2a11 1228 * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be
saloutos 0:083111ae2a11 1229 * considered as completed only when user abort complete callback is executed (not when exiting function).
saloutos 0:083111ae2a11 1230 * @retval HAL status
saloutos 0:083111ae2a11 1231 */
saloutos 0:083111ae2a11 1232 HAL_StatusTypeDef HAL_SMARTCARD_AbortReceive_IT(SMARTCARD_HandleTypeDef *hsmartcard)
saloutos 0:083111ae2a11 1233 {
saloutos 0:083111ae2a11 1234 /* Disable RTOIE, EOBIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
saloutos 0:083111ae2a11 1235 CLEAR_BIT(hsmartcard->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_RTOIE | USART_CR1_EOBIE));
saloutos 0:083111ae2a11 1236
saloutos 0:083111ae2a11 1237 /* Check if a Transmit process is ongoing or not. If not disable ERR IT */
saloutos 0:083111ae2a11 1238 if(hsmartcard->gState == HAL_SMARTCARD_STATE_READY)
saloutos 0:083111ae2a11 1239 {
saloutos 0:083111ae2a11 1240 /* Disable the SMARTCARD Error Interrupt: (Frame error) */
saloutos 0:083111ae2a11 1241 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
saloutos 0:083111ae2a11 1242 }
saloutos 0:083111ae2a11 1243
saloutos 0:083111ae2a11 1244 /* Disable the SMARTCARD DMA Rx request if enabled */
saloutos 0:083111ae2a11 1245 if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAR))
saloutos 0:083111ae2a11 1246 {
saloutos 0:083111ae2a11 1247 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAR);
saloutos 0:083111ae2a11 1248
saloutos 0:083111ae2a11 1249 /* Abort the SMARTCARD DMA Rx channel : use non blocking DMA Abort API (callback) */
saloutos 0:083111ae2a11 1250 if(hsmartcard->hdmarx != NULL)
saloutos 0:083111ae2a11 1251 {
saloutos 0:083111ae2a11 1252 /* Set the SMARTCARD DMA Abort callback :
saloutos 0:083111ae2a11 1253 will lead to call HAL_SMARTCARD_AbortCpltCallback() at end of DMA abort procedure */
saloutos 0:083111ae2a11 1254 hsmartcard->hdmarx->XferAbortCallback = SMARTCARD_DMARxOnlyAbortCallback;
saloutos 0:083111ae2a11 1255
saloutos 0:083111ae2a11 1256 /* Abort DMA RX */
saloutos 0:083111ae2a11 1257 if(HAL_DMA_Abort_IT(hsmartcard->hdmarx) != HAL_OK)
saloutos 0:083111ae2a11 1258 {
saloutos 0:083111ae2a11 1259 /* Call Directly hsmartcard->hdmarx->XferAbortCallback function in case of error */
saloutos 0:083111ae2a11 1260 hsmartcard->hdmarx->XferAbortCallback(hsmartcard->hdmarx);
saloutos 0:083111ae2a11 1261 }
saloutos 0:083111ae2a11 1262 }
saloutos 0:083111ae2a11 1263 else
saloutos 0:083111ae2a11 1264 {
saloutos 0:083111ae2a11 1265 /* Reset Rx transfer counter */
saloutos 0:083111ae2a11 1266 hsmartcard->RxXferCount = 0;
saloutos 0:083111ae2a11 1267
saloutos 0:083111ae2a11 1268 /* Clear the Error flags in the ICR register */
saloutos 0:083111ae2a11 1269 __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard, SMARTCARD_CLEAR_OREF | SMARTCARD_CLEAR_NEF | SMARTCARD_CLEAR_PEF | SMARTCARD_CLEAR_FEF | SMARTCARD_CLEAR_RTOF | SMARTCARD_CLEAR_EOBF);
saloutos 0:083111ae2a11 1270
saloutos 0:083111ae2a11 1271 /* Restore hsmartcard->RxState to Ready */
saloutos 0:083111ae2a11 1272 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 1273
saloutos 0:083111ae2a11 1274 /* As no DMA to be aborted, call directly user Abort complete callback */
saloutos 0:083111ae2a11 1275 HAL_SMARTCARD_AbortReceiveCpltCallback(hsmartcard);
saloutos 0:083111ae2a11 1276 }
saloutos 0:083111ae2a11 1277 }
saloutos 0:083111ae2a11 1278 else
saloutos 0:083111ae2a11 1279 {
saloutos 0:083111ae2a11 1280 /* Reset Rx transfer counter */
saloutos 0:083111ae2a11 1281 hsmartcard->RxXferCount = 0;
saloutos 0:083111ae2a11 1282
saloutos 0:083111ae2a11 1283 /* Clear the Error flags in the ICR register */
saloutos 0:083111ae2a11 1284 __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard, SMARTCARD_CLEAR_OREF | SMARTCARD_CLEAR_NEF | SMARTCARD_CLEAR_PEF | SMARTCARD_CLEAR_FEF | SMARTCARD_CLEAR_RTOF | SMARTCARD_CLEAR_EOBF);
saloutos 0:083111ae2a11 1285
saloutos 0:083111ae2a11 1286 /* Restore hsmartcard->RxState to Ready */
saloutos 0:083111ae2a11 1287 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 1288
saloutos 0:083111ae2a11 1289 /* As no DMA to be aborted, call directly user Abort complete callback */
saloutos 0:083111ae2a11 1290 HAL_SMARTCARD_AbortReceiveCpltCallback(hsmartcard);
saloutos 0:083111ae2a11 1291 }
saloutos 0:083111ae2a11 1292
saloutos 0:083111ae2a11 1293 return HAL_OK;
saloutos 0:083111ae2a11 1294 }
saloutos 0:083111ae2a11 1295
saloutos 0:083111ae2a11 1296 /**
saloutos 0:083111ae2a11 1297 * @brief Handle SMARTCARD interrupt requests.
saloutos 0:083111ae2a11 1298 * @param hsmartcard: Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 1299 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 1300 * @retval None
saloutos 0:083111ae2a11 1301 */
saloutos 0:083111ae2a11 1302 void HAL_SMARTCARD_IRQHandler(SMARTCARD_HandleTypeDef *hsmartcard)
saloutos 0:083111ae2a11 1303 {
saloutos 0:083111ae2a11 1304 uint32_t isrflags = READ_REG(hsmartcard->Instance->ISR);
saloutos 0:083111ae2a11 1305 uint32_t cr1its = READ_REG(hsmartcard->Instance->CR1);
saloutos 0:083111ae2a11 1306 uint32_t cr3its;
saloutos 0:083111ae2a11 1307 uint32_t errorflags;
saloutos 0:083111ae2a11 1308
saloutos 0:083111ae2a11 1309 /* If no error occurs */
saloutos 0:083111ae2a11 1310 errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE | USART_ISR_RTOF));
saloutos 0:083111ae2a11 1311 if (errorflags == RESET)
saloutos 0:083111ae2a11 1312 {
saloutos 0:083111ae2a11 1313 /* SMARTCARD in mode Receiver ---------------------------------------------------*/
saloutos 0:083111ae2a11 1314 if(((isrflags & USART_ISR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
saloutos 0:083111ae2a11 1315 {
saloutos 0:083111ae2a11 1316 SMARTCARD_Receive_IT(hsmartcard);
saloutos 0:083111ae2a11 1317 /* Clear RXNE interrupt flag done by reading RDR in SMARTCARD_Receive_IT() */
saloutos 0:083111ae2a11 1318 return;
saloutos 0:083111ae2a11 1319 }
saloutos 0:083111ae2a11 1320 }
saloutos 0:083111ae2a11 1321
saloutos 0:083111ae2a11 1322 /* If some errors occur */
saloutos 0:083111ae2a11 1323 cr3its = READ_REG(hsmartcard->Instance->CR3);
saloutos 0:083111ae2a11 1324 if( (errorflags != RESET)
saloutos 0:083111ae2a11 1325 && ( ((cr3its & USART_CR3_EIE) != RESET)
saloutos 0:083111ae2a11 1326 || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_RTOIE)) != RESET)) )
saloutos 0:083111ae2a11 1327 {
saloutos 0:083111ae2a11 1328 /* SMARTCARD parity error interrupt occurred -------------------------------------*/
saloutos 0:083111ae2a11 1329 if(((isrflags & USART_ISR_PE) != RESET) && ((cr1its & USART_CR1_PEIE) != RESET))
saloutos 0:083111ae2a11 1330 {
saloutos 0:083111ae2a11 1331 __HAL_SMARTCARD_CLEAR_IT(hsmartcard, SMARTCARD_CLEAR_PEF);
saloutos 0:083111ae2a11 1332
saloutos 0:083111ae2a11 1333 hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_PE;
saloutos 0:083111ae2a11 1334 }
saloutos 0:083111ae2a11 1335
saloutos 0:083111ae2a11 1336 /* SMARTCARD frame error interrupt occurred --------------------------------------*/
saloutos 0:083111ae2a11 1337 if(((isrflags & USART_ISR_FE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
saloutos 0:083111ae2a11 1338 {
saloutos 0:083111ae2a11 1339 __HAL_SMARTCARD_CLEAR_IT(hsmartcard, SMARTCARD_CLEAR_FEF);
saloutos 0:083111ae2a11 1340
saloutos 0:083111ae2a11 1341 hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_FE;
saloutos 0:083111ae2a11 1342 }
saloutos 0:083111ae2a11 1343
saloutos 0:083111ae2a11 1344 /* SMARTCARD noise error interrupt occurred --------------------------------------*/
saloutos 0:083111ae2a11 1345 if(((isrflags & USART_ISR_NE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
saloutos 0:083111ae2a11 1346 {
saloutos 0:083111ae2a11 1347 __HAL_SMARTCARD_CLEAR_IT(hsmartcard, SMARTCARD_CLEAR_NEF);
saloutos 0:083111ae2a11 1348
saloutos 0:083111ae2a11 1349 hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_NE;
saloutos 0:083111ae2a11 1350 }
saloutos 0:083111ae2a11 1351
saloutos 0:083111ae2a11 1352 /* SMARTCARD Over-Run interrupt occurred -----------------------------------------*/
saloutos 0:083111ae2a11 1353 if(((isrflags & USART_ISR_ORE) != RESET) &&
saloutos 0:083111ae2a11 1354 (((cr1its & USART_CR1_RXNEIE) != RESET) || ((cr3its & USART_CR3_EIE) != RESET)))
saloutos 0:083111ae2a11 1355 {
saloutos 0:083111ae2a11 1356 __HAL_SMARTCARD_CLEAR_IT(hsmartcard, SMARTCARD_CLEAR_OREF);
saloutos 0:083111ae2a11 1357
saloutos 0:083111ae2a11 1358 hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_ORE;
saloutos 0:083111ae2a11 1359 }
saloutos 0:083111ae2a11 1360
saloutos 0:083111ae2a11 1361 /* SMARTCARD receiver timeout interrupt occurred -----------------------------------------*/
saloutos 0:083111ae2a11 1362 if(((isrflags & USART_ISR_RTOF) != RESET) && ((cr1its & USART_CR1_RTOIE) != RESET))
saloutos 0:083111ae2a11 1363 {
saloutos 0:083111ae2a11 1364 __HAL_SMARTCARD_CLEAR_IT(hsmartcard, SMARTCARD_CLEAR_RTOF);
saloutos 0:083111ae2a11 1365
saloutos 0:083111ae2a11 1366 hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_RTO;
saloutos 0:083111ae2a11 1367 }
saloutos 0:083111ae2a11 1368
saloutos 0:083111ae2a11 1369 /* Call SMARTCARD Error Call back function if need be --------------------------*/
saloutos 0:083111ae2a11 1370 if(hsmartcard->ErrorCode != HAL_SMARTCARD_ERROR_NONE)
saloutos 0:083111ae2a11 1371 {
saloutos 0:083111ae2a11 1372 /* SMARTCARD in mode Receiver ---------------------------------------------------*/
saloutos 0:083111ae2a11 1373 if(((isrflags & USART_ISR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
saloutos 0:083111ae2a11 1374 {
saloutos 0:083111ae2a11 1375 SMARTCARD_Receive_IT(hsmartcard);
saloutos 0:083111ae2a11 1376 }
saloutos 0:083111ae2a11 1377
saloutos 0:083111ae2a11 1378 /* If Error is to be considered as blocking :
saloutos 0:083111ae2a11 1379 - Receiver Timeout error in Reception
saloutos 0:083111ae2a11 1380 - Overrun error in Reception
saloutos 0:083111ae2a11 1381 - any error occurs in DMA mode reception
saloutos 0:083111ae2a11 1382 */
saloutos 0:083111ae2a11 1383 if ( ((hsmartcard->ErrorCode & (HAL_SMARTCARD_ERROR_RTO | HAL_SMARTCARD_ERROR_ORE)) != RESET)
saloutos 0:083111ae2a11 1384 || (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAR)))
saloutos 0:083111ae2a11 1385 {
saloutos 0:083111ae2a11 1386 /* Blocking error : transfer is aborted
saloutos 0:083111ae2a11 1387 Set the SMARTCARD state ready to be able to start again the process,
saloutos 0:083111ae2a11 1388 Disable Rx Interrupts, and disable Rx DMA request, if ongoing */
saloutos 0:083111ae2a11 1389 SMARTCARD_EndRxTransfer(hsmartcard);
saloutos 0:083111ae2a11 1390
saloutos 0:083111ae2a11 1391 /* Disable the SMARTCARD DMA Rx request if enabled */
saloutos 0:083111ae2a11 1392 if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAR))
saloutos 0:083111ae2a11 1393 {
saloutos 0:083111ae2a11 1394 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAR);
saloutos 0:083111ae2a11 1395
saloutos 0:083111ae2a11 1396 /* Abort the SMARTCARD DMA Rx channel */
saloutos 0:083111ae2a11 1397 if(hsmartcard->hdmarx != NULL)
saloutos 0:083111ae2a11 1398 {
saloutos 0:083111ae2a11 1399 /* Set the SMARTCARD DMA Abort callback :
saloutos 0:083111ae2a11 1400 will lead to call HAL_SMARTCARD_ErrorCallback() at end of DMA abort procedure */
saloutos 0:083111ae2a11 1401 hsmartcard->hdmarx->XferAbortCallback = SMARTCARD_DMAAbortOnError;
saloutos 0:083111ae2a11 1402
saloutos 0:083111ae2a11 1403 /* Abort DMA RX */
saloutos 0:083111ae2a11 1404 if(HAL_DMA_Abort_IT(hsmartcard->hdmarx) != HAL_OK)
saloutos 0:083111ae2a11 1405 {
saloutos 0:083111ae2a11 1406 /* Call Directly hsmartcard->hdmarx->XferAbortCallback function in case of error */
saloutos 0:083111ae2a11 1407 hsmartcard->hdmarx->XferAbortCallback(hsmartcard->hdmarx);
saloutos 0:083111ae2a11 1408 }
saloutos 0:083111ae2a11 1409 }
saloutos 0:083111ae2a11 1410 else
saloutos 0:083111ae2a11 1411 {
saloutos 0:083111ae2a11 1412 /* Call user error callback */
saloutos 0:083111ae2a11 1413 HAL_SMARTCARD_ErrorCallback(hsmartcard);
saloutos 0:083111ae2a11 1414 }
saloutos 0:083111ae2a11 1415 }
saloutos 0:083111ae2a11 1416 else
saloutos 0:083111ae2a11 1417 {
saloutos 0:083111ae2a11 1418 /* Call user error callback */
saloutos 0:083111ae2a11 1419 HAL_SMARTCARD_ErrorCallback(hsmartcard);
saloutos 0:083111ae2a11 1420 }
saloutos 0:083111ae2a11 1421 }
saloutos 0:083111ae2a11 1422 /* other error type to be considered as blocking :
saloutos 0:083111ae2a11 1423 - Frame error in Transmission
saloutos 0:083111ae2a11 1424 */
saloutos 0:083111ae2a11 1425 else if ((hsmartcard->gState == HAL_SMARTCARD_STATE_BUSY_TX) && ((hsmartcard->ErrorCode & HAL_SMARTCARD_ERROR_FE) != RESET))
saloutos 0:083111ae2a11 1426 {
saloutos 0:083111ae2a11 1427 /* Blocking error : transfer is aborted
saloutos 0:083111ae2a11 1428 Set the SMARTCARD state ready to be able to start again the process,
saloutos 0:083111ae2a11 1429 Disable Tx Interrupts, and disable Tx DMA request, if ongoing */
saloutos 0:083111ae2a11 1430 SMARTCARD_EndTxTransfer(hsmartcard);
saloutos 0:083111ae2a11 1431
saloutos 0:083111ae2a11 1432 /* Disable the SMARTCARD DMA Tx request if enabled */
saloutos 0:083111ae2a11 1433 if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAT))
saloutos 0:083111ae2a11 1434 {
saloutos 0:083111ae2a11 1435 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAT);
saloutos 0:083111ae2a11 1436
saloutos 0:083111ae2a11 1437 /* Abort the SMARTCARD DMA Tx channel */
saloutos 0:083111ae2a11 1438 if(hsmartcard->hdmatx != NULL)
saloutos 0:083111ae2a11 1439 {
saloutos 0:083111ae2a11 1440 /* Set the SMARTCARD DMA Abort callback :
saloutos 0:083111ae2a11 1441 will lead to call HAL_SMARTCARD_ErrorCallback() at end of DMA abort procedure */
saloutos 0:083111ae2a11 1442 hsmartcard->hdmatx->XferAbortCallback = SMARTCARD_DMAAbortOnError;
saloutos 0:083111ae2a11 1443
saloutos 0:083111ae2a11 1444 /* Abort DMA TX */
saloutos 0:083111ae2a11 1445 if(HAL_DMA_Abort_IT(hsmartcard->hdmatx) != HAL_OK)
saloutos 0:083111ae2a11 1446 {
saloutos 0:083111ae2a11 1447 /* Call Directly hsmartcard->hdmatx->XferAbortCallback function in case of error */
saloutos 0:083111ae2a11 1448 hsmartcard->hdmatx->XferAbortCallback(hsmartcard->hdmatx);
saloutos 0:083111ae2a11 1449 }
saloutos 0:083111ae2a11 1450 }
saloutos 0:083111ae2a11 1451 else
saloutos 0:083111ae2a11 1452 {
saloutos 0:083111ae2a11 1453 /* Call user error callback */
saloutos 0:083111ae2a11 1454 HAL_SMARTCARD_ErrorCallback(hsmartcard);
saloutos 0:083111ae2a11 1455 }
saloutos 0:083111ae2a11 1456 }
saloutos 0:083111ae2a11 1457 else
saloutos 0:083111ae2a11 1458 {
saloutos 0:083111ae2a11 1459 /* Call user error callback */
saloutos 0:083111ae2a11 1460 HAL_SMARTCARD_ErrorCallback(hsmartcard);
saloutos 0:083111ae2a11 1461 }
saloutos 0:083111ae2a11 1462 }
saloutos 0:083111ae2a11 1463 else
saloutos 0:083111ae2a11 1464 {
saloutos 0:083111ae2a11 1465 /* Non Blocking error : transfer could go on.
saloutos 0:083111ae2a11 1466 Error is notified to user through user error callback */
saloutos 0:083111ae2a11 1467 HAL_SMARTCARD_ErrorCallback(hsmartcard);
saloutos 0:083111ae2a11 1468 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
saloutos 0:083111ae2a11 1469 }
saloutos 0:083111ae2a11 1470 }
saloutos 0:083111ae2a11 1471 return;
saloutos 0:083111ae2a11 1472
saloutos 0:083111ae2a11 1473 } /* End if some error occurs */
saloutos 0:083111ae2a11 1474
saloutos 0:083111ae2a11 1475 /* SMARTCARD in mode Receiver, end of block interruption ------------------------*/
saloutos 0:083111ae2a11 1476 if(((isrflags & USART_ISR_EOBF) != RESET) && ((cr1its & USART_CR1_EOBIE) != RESET))
saloutos 0:083111ae2a11 1477 {
saloutos 0:083111ae2a11 1478 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 1479 __HAL_UNLOCK(hsmartcard);
saloutos 0:083111ae2a11 1480 HAL_SMARTCARD_RxCpltCallback(hsmartcard);
saloutos 0:083111ae2a11 1481 /* Clear EOBF interrupt after HAL_SMARTCARD_RxCpltCallback() call for the End of Block information
saloutos 0:083111ae2a11 1482 * to be available during HAL_SMARTCARD_RxCpltCallback() processing */
saloutos 0:083111ae2a11 1483 __HAL_SMARTCARD_CLEAR_IT(hsmartcard, SMARTCARD_CLEAR_EOBF);
saloutos 0:083111ae2a11 1484 return;
saloutos 0:083111ae2a11 1485 }
saloutos 0:083111ae2a11 1486
saloutos 0:083111ae2a11 1487 /* SMARTCARD in mode Transmitter ------------------------------------------------*/
saloutos 0:083111ae2a11 1488 if(((isrflags & USART_ISR_TXE) != RESET) && ((cr1its & USART_CR1_TXEIE) != RESET))
saloutos 0:083111ae2a11 1489 {
saloutos 0:083111ae2a11 1490 SMARTCARD_Transmit_IT(hsmartcard);
saloutos 0:083111ae2a11 1491 return;
saloutos 0:083111ae2a11 1492 }
saloutos 0:083111ae2a11 1493
saloutos 0:083111ae2a11 1494 /* SMARTCARD in mode Transmitter (transmission end) ------------------------*/
saloutos 0:083111ae2a11 1495 if((__HAL_SMARTCARD_GET_IT(hsmartcard, hsmartcard->AdvancedInit.TxCompletionIndication) != RESET) &&(__HAL_SMARTCARD_GET_IT_SOURCE(hsmartcard, hsmartcard->AdvancedInit.TxCompletionIndication) != RESET))
saloutos 0:083111ae2a11 1496 {
saloutos 0:083111ae2a11 1497 SMARTCARD_EndTransmit_IT(hsmartcard);
saloutos 0:083111ae2a11 1498 return;
saloutos 0:083111ae2a11 1499 }
saloutos 0:083111ae2a11 1500 }
saloutos 0:083111ae2a11 1501
saloutos 0:083111ae2a11 1502 /**
saloutos 0:083111ae2a11 1503 * @brief Tx Transfer completed callback.
saloutos 0:083111ae2a11 1504 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 1505 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 1506 * @retval None
saloutos 0:083111ae2a11 1507 */
saloutos 0:083111ae2a11 1508 __weak void HAL_SMARTCARD_TxCpltCallback(SMARTCARD_HandleTypeDef *hsmartcard)
saloutos 0:083111ae2a11 1509 {
saloutos 0:083111ae2a11 1510 /* Prevent unused argument(s) compilation warning */
saloutos 0:083111ae2a11 1511 UNUSED(hsmartcard);
saloutos 0:083111ae2a11 1512
saloutos 0:083111ae2a11 1513 /* NOTE : This function should not be modified, when the callback is needed,
saloutos 0:083111ae2a11 1514 the HAL_SMARTCARD_TxCpltCallback can be implemented in the user file.
saloutos 0:083111ae2a11 1515 */
saloutos 0:083111ae2a11 1516 }
saloutos 0:083111ae2a11 1517
saloutos 0:083111ae2a11 1518 /**
saloutos 0:083111ae2a11 1519 * @brief Rx Transfer completed callback.
saloutos 0:083111ae2a11 1520 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 1521 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 1522 * @retval None
saloutos 0:083111ae2a11 1523 */
saloutos 0:083111ae2a11 1524 __weak void HAL_SMARTCARD_RxCpltCallback(SMARTCARD_HandleTypeDef *hsmartcard)
saloutos 0:083111ae2a11 1525 {
saloutos 0:083111ae2a11 1526 /* Prevent unused argument(s) compilation warning */
saloutos 0:083111ae2a11 1527 UNUSED(hsmartcard);
saloutos 0:083111ae2a11 1528
saloutos 0:083111ae2a11 1529 /* NOTE : This function should not be modified, when the callback is needed,
saloutos 0:083111ae2a11 1530 the HAL_SMARTCARD_RxCpltCallback can be implemented in the user file.
saloutos 0:083111ae2a11 1531 */
saloutos 0:083111ae2a11 1532 }
saloutos 0:083111ae2a11 1533
saloutos 0:083111ae2a11 1534 /**
saloutos 0:083111ae2a11 1535 * @brief SMARTCARD error callback.
saloutos 0:083111ae2a11 1536 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 1537 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 1538 * @retval None
saloutos 0:083111ae2a11 1539 */
saloutos 0:083111ae2a11 1540 __weak void HAL_SMARTCARD_ErrorCallback(SMARTCARD_HandleTypeDef *hsmartcard)
saloutos 0:083111ae2a11 1541 {
saloutos 0:083111ae2a11 1542 /* Prevent unused argument(s) compilation warning */
saloutos 0:083111ae2a11 1543 UNUSED(hsmartcard);
saloutos 0:083111ae2a11 1544
saloutos 0:083111ae2a11 1545 /* NOTE : This function should not be modified, when the callback is needed,
saloutos 0:083111ae2a11 1546 the HAL_SMARTCARD_ErrorCallback can be implemented in the user file.
saloutos 0:083111ae2a11 1547 */
saloutos 0:083111ae2a11 1548 }
saloutos 0:083111ae2a11 1549
saloutos 0:083111ae2a11 1550 /**
saloutos 0:083111ae2a11 1551 * @brief SMARTCARD Abort Complete callback.
saloutos 0:083111ae2a11 1552 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 1553 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 1554 * @retval None
saloutos 0:083111ae2a11 1555 */
saloutos 0:083111ae2a11 1556 __weak void HAL_SMARTCARD_AbortCpltCallback (SMARTCARD_HandleTypeDef *hsmartcard)
saloutos 0:083111ae2a11 1557 {
saloutos 0:083111ae2a11 1558 /* Prevent unused argument(s) compilation warning */
saloutos 0:083111ae2a11 1559 UNUSED(hsmartcard);
saloutos 0:083111ae2a11 1560
saloutos 0:083111ae2a11 1561 /* NOTE : This function should not be modified, when the callback is needed,
saloutos 0:083111ae2a11 1562 the HAL_SMARTCARD_AbortCpltCallback can be implemented in the user file.
saloutos 0:083111ae2a11 1563 */
saloutos 0:083111ae2a11 1564 }
saloutos 0:083111ae2a11 1565
saloutos 0:083111ae2a11 1566 /**
saloutos 0:083111ae2a11 1567 * @brief SMARTCARD Abort Complete callback.
saloutos 0:083111ae2a11 1568 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 1569 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 1570 * @retval None
saloutos 0:083111ae2a11 1571 */
saloutos 0:083111ae2a11 1572 __weak void HAL_SMARTCARD_AbortTransmitCpltCallback (SMARTCARD_HandleTypeDef *hsmartcard)
saloutos 0:083111ae2a11 1573 {
saloutos 0:083111ae2a11 1574 /* Prevent unused argument(s) compilation warning */
saloutos 0:083111ae2a11 1575 UNUSED(hsmartcard);
saloutos 0:083111ae2a11 1576
saloutos 0:083111ae2a11 1577 /* NOTE : This function should not be modified, when the callback is needed,
saloutos 0:083111ae2a11 1578 the HAL_SMARTCARD_AbortTransmitCpltCallback can be implemented in the user file.
saloutos 0:083111ae2a11 1579 */
saloutos 0:083111ae2a11 1580 }
saloutos 0:083111ae2a11 1581
saloutos 0:083111ae2a11 1582 /**
saloutos 0:083111ae2a11 1583 * @brief SMARTCARD Abort Receive Complete callback.
saloutos 0:083111ae2a11 1584 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 1585 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 1586 * @retval None
saloutos 0:083111ae2a11 1587 */
saloutos 0:083111ae2a11 1588 __weak void HAL_SMARTCARD_AbortReceiveCpltCallback (SMARTCARD_HandleTypeDef *hsmartcard)
saloutos 0:083111ae2a11 1589 {
saloutos 0:083111ae2a11 1590 /* Prevent unused argument(s) compilation warning */
saloutos 0:083111ae2a11 1591 UNUSED(hsmartcard);
saloutos 0:083111ae2a11 1592
saloutos 0:083111ae2a11 1593 /* NOTE : This function should not be modified, when the callback is needed,
saloutos 0:083111ae2a11 1594 the HAL_SMARTCARD_AbortReceiveCpltCallback can be implemented in the user file.
saloutos 0:083111ae2a11 1595 */
saloutos 0:083111ae2a11 1596 }
saloutos 0:083111ae2a11 1597
saloutos 0:083111ae2a11 1598 /**
saloutos 0:083111ae2a11 1599 * @}
saloutos 0:083111ae2a11 1600 */
saloutos 0:083111ae2a11 1601
saloutos 0:083111ae2a11 1602 /** @defgroup SMARTCARD_Exported_Functions_Group4 Peripheral State and Errors functions
saloutos 0:083111ae2a11 1603 * @brief SMARTCARD State and Errors functions
saloutos 0:083111ae2a11 1604 *
saloutos 0:083111ae2a11 1605 @verbatim
saloutos 0:083111ae2a11 1606 ==============================================================================
saloutos 0:083111ae2a11 1607 ##### Peripheral State and Errors functions #####
saloutos 0:083111ae2a11 1608 ==============================================================================
saloutos 0:083111ae2a11 1609 [..]
saloutos 0:083111ae2a11 1610 This subsection provides a set of functions allowing to return the State of SmartCard
saloutos 0:083111ae2a11 1611 handle and also return Peripheral Errors occurred during communication process
saloutos 0:083111ae2a11 1612 (+) HAL_SMARTCARD_GetState() API can be helpful to check in run-time the state
saloutos 0:083111ae2a11 1613 of the SMARTCARD peripheral.
saloutos 0:083111ae2a11 1614 (+) HAL_SMARTCARD_GetError() checks in run-time errors that could occur during
saloutos 0:083111ae2a11 1615 communication.
saloutos 0:083111ae2a11 1616
saloutos 0:083111ae2a11 1617 @endverbatim
saloutos 0:083111ae2a11 1618 * @{
saloutos 0:083111ae2a11 1619 */
saloutos 0:083111ae2a11 1620
saloutos 0:083111ae2a11 1621 /**
saloutos 0:083111ae2a11 1622 * @brief Return the SMARTCARD handle state.
saloutos 0:083111ae2a11 1623 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 1624 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 1625 * @retval SMARTCARD handle state
saloutos 0:083111ae2a11 1626 */
saloutos 0:083111ae2a11 1627 HAL_SMARTCARD_StateTypeDef HAL_SMARTCARD_GetState(SMARTCARD_HandleTypeDef *hsmartcard)
saloutos 0:083111ae2a11 1628 {
saloutos 0:083111ae2a11 1629 /* Return SMARTCARD handle state */
saloutos 0:083111ae2a11 1630 uint32_t temp1= 0x00, temp2 = 0x00;
saloutos 0:083111ae2a11 1631 temp1 = hsmartcard->gState;
saloutos 0:083111ae2a11 1632 temp2 = hsmartcard->RxState;
saloutos 0:083111ae2a11 1633
saloutos 0:083111ae2a11 1634 return (HAL_SMARTCARD_StateTypeDef)(temp1 | temp2);
saloutos 0:083111ae2a11 1635 }
saloutos 0:083111ae2a11 1636
saloutos 0:083111ae2a11 1637 /**
saloutos 0:083111ae2a11 1638 * @brief Return the SMARTCARD handle error code.
saloutos 0:083111ae2a11 1639 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 1640 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 1641 * @retval SMARTCARD handle Error Code
saloutos 0:083111ae2a11 1642 */
saloutos 0:083111ae2a11 1643 uint32_t HAL_SMARTCARD_GetError(SMARTCARD_HandleTypeDef *hsmartcard)
saloutos 0:083111ae2a11 1644 {
saloutos 0:083111ae2a11 1645 return hsmartcard->ErrorCode;
saloutos 0:083111ae2a11 1646 }
saloutos 0:083111ae2a11 1647
saloutos 0:083111ae2a11 1648 /**
saloutos 0:083111ae2a11 1649 * @}
saloutos 0:083111ae2a11 1650 */
saloutos 0:083111ae2a11 1651
saloutos 0:083111ae2a11 1652 /**
saloutos 0:083111ae2a11 1653 * @}
saloutos 0:083111ae2a11 1654 */
saloutos 0:083111ae2a11 1655
saloutos 0:083111ae2a11 1656 /** @defgroup SMARTCARD_Private_Functions SMARTCARD Private Functions
saloutos 0:083111ae2a11 1657 * @{
saloutos 0:083111ae2a11 1658 */
saloutos 0:083111ae2a11 1659
saloutos 0:083111ae2a11 1660 /**
saloutos 0:083111ae2a11 1661 * @brief Configure the SMARTCARD associated USART peripheral.
saloutos 0:083111ae2a11 1662 * @param hsmartcard: Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 1663 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 1664 * @retval None
saloutos 0:083111ae2a11 1665 */
saloutos 0:083111ae2a11 1666 static HAL_StatusTypeDef SMARTCARD_SetConfig(SMARTCARD_HandleTypeDef *hsmartcard)
saloutos 0:083111ae2a11 1667 {
saloutos 0:083111ae2a11 1668 uint32_t tmpreg = 0x00000000;
saloutos 0:083111ae2a11 1669 SMARTCARD_ClockSourceTypeDef clocksource = SMARTCARD_CLOCKSOURCE_UNDEFINED;
saloutos 0:083111ae2a11 1670 HAL_StatusTypeDef ret = HAL_OK;
saloutos 0:083111ae2a11 1671
saloutos 0:083111ae2a11 1672 /* Check the parameters */
saloutos 0:083111ae2a11 1673 assert_param(IS_SMARTCARD_INSTANCE(hsmartcard->Instance));
saloutos 0:083111ae2a11 1674 assert_param(IS_SMARTCARD_BAUDRATE(hsmartcard->Init.BaudRate));
saloutos 0:083111ae2a11 1675 assert_param(IS_SMARTCARD_WORD_LENGTH(hsmartcard->Init.WordLength));
saloutos 0:083111ae2a11 1676 assert_param(IS_SMARTCARD_STOPBITS(hsmartcard->Init.StopBits));
saloutos 0:083111ae2a11 1677 assert_param(IS_SMARTCARD_PARITY(hsmartcard->Init.Parity));
saloutos 0:083111ae2a11 1678 assert_param(IS_SMARTCARD_MODE(hsmartcard->Init.Mode));
saloutos 0:083111ae2a11 1679 assert_param(IS_SMARTCARD_POLARITY(hsmartcard->Init.CLKPolarity));
saloutos 0:083111ae2a11 1680 assert_param(IS_SMARTCARD_PHASE(hsmartcard->Init.CLKPhase));
saloutos 0:083111ae2a11 1681 assert_param(IS_SMARTCARD_LASTBIT(hsmartcard->Init.CLKLastBit));
saloutos 0:083111ae2a11 1682 assert_param(IS_SMARTCARD_ONE_BIT_SAMPLE(hsmartcard->Init.OneBitSampling));
saloutos 0:083111ae2a11 1683 assert_param(IS_SMARTCARD_NACK(hsmartcard->Init.NACKEnable));
saloutos 0:083111ae2a11 1684 assert_param(IS_SMARTCARD_TIMEOUT(hsmartcard->Init.TimeOutEnable));
saloutos 0:083111ae2a11 1685 assert_param(IS_SMARTCARD_AUTORETRY_COUNT(hsmartcard->Init.AutoRetryCount));
saloutos 0:083111ae2a11 1686
saloutos 0:083111ae2a11 1687 /*-------------------------- USART CR1 Configuration -----------------------*/
saloutos 0:083111ae2a11 1688 /* In SmartCard mode, M and PCE are forced to 1 (8 bits + parity).
saloutos 0:083111ae2a11 1689 * Oversampling is forced to 16 (OVER8 = 0).
saloutos 0:083111ae2a11 1690 * Configure the Parity and Mode:
saloutos 0:083111ae2a11 1691 * set PS bit according to hsmartcard->Init.Parity value
saloutos 0:083111ae2a11 1692 * set TE and RE bits according to hsmartcard->Init.Mode value */
saloutos 0:083111ae2a11 1693 tmpreg = (uint32_t) hsmartcard->Init.Parity | hsmartcard->Init.Mode;
saloutos 0:083111ae2a11 1694 tmpreg |= (uint32_t) hsmartcard->Init.WordLength;
saloutos 0:083111ae2a11 1695 MODIFY_REG(hsmartcard->Instance->CR1, USART_CR1_FIELDS, tmpreg);
saloutos 0:083111ae2a11 1696
saloutos 0:083111ae2a11 1697 /*-------------------------- USART CR2 Configuration -----------------------*/
saloutos 0:083111ae2a11 1698 tmpreg = hsmartcard->Init.StopBits;
saloutos 0:083111ae2a11 1699 /* Synchronous mode is activated by default */
saloutos 0:083111ae2a11 1700 tmpreg |= (uint32_t) USART_CR2_CLKEN | hsmartcard->Init.CLKPolarity;
saloutos 0:083111ae2a11 1701 tmpreg |= (uint32_t) hsmartcard->Init.CLKPhase | hsmartcard->Init.CLKLastBit;
saloutos 0:083111ae2a11 1702 tmpreg |= (uint32_t) hsmartcard->Init.TimeOutEnable;
saloutos 0:083111ae2a11 1703 MODIFY_REG(hsmartcard->Instance->CR2, USART_CR2_FIELDS, tmpreg);
saloutos 0:083111ae2a11 1704
saloutos 0:083111ae2a11 1705 /*-------------------------- USART CR3 Configuration -----------------------*/
saloutos 0:083111ae2a11 1706 /* Configure
saloutos 0:083111ae2a11 1707 * - one-bit sampling method versus three samples' majority rule
saloutos 0:083111ae2a11 1708 * according to hsmartcard->Init.OneBitSampling
saloutos 0:083111ae2a11 1709 * - NACK transmission in case of parity error according
saloutos 0:083111ae2a11 1710 * to hsmartcard->Init.NACKEnable
saloutos 0:083111ae2a11 1711 * - autoretry counter according to hsmartcard->Init.AutoRetryCount */
saloutos 0:083111ae2a11 1712 tmpreg = (uint32_t) hsmartcard->Init.OneBitSampling | hsmartcard->Init.NACKEnable;
saloutos 0:083111ae2a11 1713 tmpreg |= ((uint32_t)hsmartcard->Init.AutoRetryCount << SMARTCARD_CR3_SCARCNT_LSB_POS);
saloutos 0:083111ae2a11 1714 MODIFY_REG(hsmartcard->Instance-> CR3,USART_CR3_FIELDS, tmpreg);
saloutos 0:083111ae2a11 1715
saloutos 0:083111ae2a11 1716 /*-------------------------- USART GTPR Configuration ----------------------*/
saloutos 0:083111ae2a11 1717 tmpreg = (hsmartcard->Init.Prescaler | ((uint32_t)hsmartcard->Init.GuardTime << SMARTCARD_GTPR_GT_LSB_POS));
saloutos 0:083111ae2a11 1718 MODIFY_REG(hsmartcard->Instance->GTPR, (USART_GTPR_GT|USART_GTPR_PSC), tmpreg);
saloutos 0:083111ae2a11 1719
saloutos 0:083111ae2a11 1720 /*-------------------------- USART RTOR Configuration ----------------------*/
saloutos 0:083111ae2a11 1721 tmpreg = ((uint32_t)hsmartcard->Init.BlockLength << SMARTCARD_RTOR_BLEN_LSB_POS);
saloutos 0:083111ae2a11 1722 if (hsmartcard->Init.TimeOutEnable == SMARTCARD_TIMEOUT_ENABLE)
saloutos 0:083111ae2a11 1723 {
saloutos 0:083111ae2a11 1724 assert_param(IS_SMARTCARD_TIMEOUT_VALUE(hsmartcard->Init.TimeOutValue));
saloutos 0:083111ae2a11 1725 tmpreg |= (uint32_t) hsmartcard->Init.TimeOutValue;
saloutos 0:083111ae2a11 1726 }
saloutos 0:083111ae2a11 1727 MODIFY_REG(hsmartcard->Instance->RTOR, (USART_RTOR_RTO|USART_RTOR_BLEN), tmpreg);
saloutos 0:083111ae2a11 1728
saloutos 0:083111ae2a11 1729 /*-------------------------- USART BRR Configuration -----------------------*/
saloutos 0:083111ae2a11 1730 SMARTCARD_GETCLOCKSOURCE(hsmartcard, clocksource);
saloutos 0:083111ae2a11 1731 switch (clocksource)
saloutos 0:083111ae2a11 1732 {
saloutos 0:083111ae2a11 1733 case SMARTCARD_CLOCKSOURCE_PCLK1:
saloutos 0:083111ae2a11 1734 hsmartcard->Instance->BRR = (uint16_t)((HAL_RCC_GetPCLK1Freq() + (hsmartcard->Init.BaudRate/2)) / hsmartcard->Init.BaudRate);
saloutos 0:083111ae2a11 1735 break;
saloutos 0:083111ae2a11 1736 case SMARTCARD_CLOCKSOURCE_PCLK2:
saloutos 0:083111ae2a11 1737 hsmartcard->Instance->BRR = (uint16_t)((HAL_RCC_GetPCLK2Freq() + (hsmartcard->Init.BaudRate/2)) / hsmartcard->Init.BaudRate);
saloutos 0:083111ae2a11 1738 break;
saloutos 0:083111ae2a11 1739 case SMARTCARD_CLOCKSOURCE_HSI:
saloutos 0:083111ae2a11 1740 hsmartcard->Instance->BRR = (uint16_t)((HSI_VALUE + (hsmartcard->Init.BaudRate/2)) / hsmartcard->Init.BaudRate);
saloutos 0:083111ae2a11 1741 break;
saloutos 0:083111ae2a11 1742 case SMARTCARD_CLOCKSOURCE_SYSCLK:
saloutos 0:083111ae2a11 1743 hsmartcard->Instance->BRR = (uint16_t)((HAL_RCC_GetSysClockFreq() + (hsmartcard->Init.BaudRate/2)) / hsmartcard->Init.BaudRate);
saloutos 0:083111ae2a11 1744 break;
saloutos 0:083111ae2a11 1745 case SMARTCARD_CLOCKSOURCE_LSE:
saloutos 0:083111ae2a11 1746 hsmartcard->Instance->BRR = (uint16_t)((LSE_VALUE + (hsmartcard->Init.BaudRate/2)) / hsmartcard->Init.BaudRate);
saloutos 0:083111ae2a11 1747 break;
saloutos 0:083111ae2a11 1748 case SMARTCARD_CLOCKSOURCE_UNDEFINED:
saloutos 0:083111ae2a11 1749 default:
saloutos 0:083111ae2a11 1750 ret = HAL_ERROR;
saloutos 0:083111ae2a11 1751 break;
saloutos 0:083111ae2a11 1752 }
saloutos 0:083111ae2a11 1753
saloutos 0:083111ae2a11 1754 return ret;
saloutos 0:083111ae2a11 1755 }
saloutos 0:083111ae2a11 1756
saloutos 0:083111ae2a11 1757
saloutos 0:083111ae2a11 1758 /**
saloutos 0:083111ae2a11 1759 * @brief Configure the SMARTCARD associated USART peripheral advanced features.
saloutos 0:083111ae2a11 1760 * @param hsmartcard: Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 1761 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 1762 * @retval None
saloutos 0:083111ae2a11 1763 */
saloutos 0:083111ae2a11 1764 static void SMARTCARD_AdvFeatureConfig(SMARTCARD_HandleTypeDef *hsmartcard)
saloutos 0:083111ae2a11 1765 {
saloutos 0:083111ae2a11 1766 /* Check whether the set of advanced features to configure is properly set */
saloutos 0:083111ae2a11 1767 assert_param(IS_SMARTCARD_ADVFEATURE_INIT(hsmartcard->AdvancedInit.AdvFeatureInit));
saloutos 0:083111ae2a11 1768
saloutos 0:083111ae2a11 1769 /* if required, configure TX pin active level inversion */
saloutos 0:083111ae2a11 1770 if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_TXINVERT_INIT))
saloutos 0:083111ae2a11 1771 {
saloutos 0:083111ae2a11 1772 assert_param(IS_SMARTCARD_ADVFEATURE_TXINV(hsmartcard->AdvancedInit.TxPinLevelInvert));
saloutos 0:083111ae2a11 1773 MODIFY_REG(hsmartcard->Instance->CR2, USART_CR2_TXINV, hsmartcard->AdvancedInit.TxPinLevelInvert);
saloutos 0:083111ae2a11 1774 }
saloutos 0:083111ae2a11 1775
saloutos 0:083111ae2a11 1776 /* if required, configure RX pin active level inversion */
saloutos 0:083111ae2a11 1777 if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_RXINVERT_INIT))
saloutos 0:083111ae2a11 1778 {
saloutos 0:083111ae2a11 1779 assert_param(IS_SMARTCARD_ADVFEATURE_RXINV(hsmartcard->AdvancedInit.RxPinLevelInvert));
saloutos 0:083111ae2a11 1780 MODIFY_REG(hsmartcard->Instance->CR2, USART_CR2_RXINV, hsmartcard->AdvancedInit.RxPinLevelInvert);
saloutos 0:083111ae2a11 1781 }
saloutos 0:083111ae2a11 1782
saloutos 0:083111ae2a11 1783 /* if required, configure data inversion */
saloutos 0:083111ae2a11 1784 if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_DATAINVERT_INIT))
saloutos 0:083111ae2a11 1785 {
saloutos 0:083111ae2a11 1786 assert_param(IS_SMARTCARD_ADVFEATURE_DATAINV(hsmartcard->AdvancedInit.DataInvert));
saloutos 0:083111ae2a11 1787 MODIFY_REG(hsmartcard->Instance->CR2, USART_CR2_DATAINV, hsmartcard->AdvancedInit.DataInvert);
saloutos 0:083111ae2a11 1788 }
saloutos 0:083111ae2a11 1789
saloutos 0:083111ae2a11 1790 /* if required, configure RX/TX pins swap */
saloutos 0:083111ae2a11 1791 if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_SWAP_INIT))
saloutos 0:083111ae2a11 1792 {
saloutos 0:083111ae2a11 1793 assert_param(IS_SMARTCARD_ADVFEATURE_SWAP(hsmartcard->AdvancedInit.Swap));
saloutos 0:083111ae2a11 1794 MODIFY_REG(hsmartcard->Instance->CR2, USART_CR2_SWAP, hsmartcard->AdvancedInit.Swap);
saloutos 0:083111ae2a11 1795 }
saloutos 0:083111ae2a11 1796
saloutos 0:083111ae2a11 1797 /* if required, configure RX overrun detection disabling */
saloutos 0:083111ae2a11 1798 if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_RXOVERRUNDISABLE_INIT))
saloutos 0:083111ae2a11 1799 {
saloutos 0:083111ae2a11 1800 assert_param(IS_SMARTCARD_OVERRUN(hsmartcard->AdvancedInit.OverrunDisable));
saloutos 0:083111ae2a11 1801 MODIFY_REG(hsmartcard->Instance->CR3, USART_CR3_OVRDIS, hsmartcard->AdvancedInit.OverrunDisable);
saloutos 0:083111ae2a11 1802 }
saloutos 0:083111ae2a11 1803
saloutos 0:083111ae2a11 1804 /* if required, configure DMA disabling on reception error */
saloutos 0:083111ae2a11 1805 if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_DMADISABLEONERROR_INIT))
saloutos 0:083111ae2a11 1806 {
saloutos 0:083111ae2a11 1807 assert_param(IS_SMARTCARD_ADVFEATURE_DMAONRXERROR(hsmartcard->AdvancedInit.DMADisableonRxError));
saloutos 0:083111ae2a11 1808 MODIFY_REG(hsmartcard->Instance->CR3, USART_CR3_DDRE, hsmartcard->AdvancedInit.DMADisableonRxError);
saloutos 0:083111ae2a11 1809 }
saloutos 0:083111ae2a11 1810
saloutos 0:083111ae2a11 1811 /* if required, configure MSB first on communication line */
saloutos 0:083111ae2a11 1812 if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_MSBFIRST_INIT))
saloutos 0:083111ae2a11 1813 {
saloutos 0:083111ae2a11 1814 assert_param(IS_SMARTCARD_ADVFEATURE_MSBFIRST(hsmartcard->AdvancedInit.MSBFirst));
saloutos 0:083111ae2a11 1815 MODIFY_REG(hsmartcard->Instance->CR2, USART_CR2_MSBFIRST, hsmartcard->AdvancedInit.MSBFirst);
saloutos 0:083111ae2a11 1816 }
saloutos 0:083111ae2a11 1817
saloutos 0:083111ae2a11 1818 }
saloutos 0:083111ae2a11 1819
saloutos 0:083111ae2a11 1820 /**
saloutos 0:083111ae2a11 1821 * @brief Check the SMARTCARD Idle State.
saloutos 0:083111ae2a11 1822 * @param hsmartcard: Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 1823 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 1824 * @retval HAL status
saloutos 0:083111ae2a11 1825 */
saloutos 0:083111ae2a11 1826 static HAL_StatusTypeDef SMARTCARD_CheckIdleState(SMARTCARD_HandleTypeDef *hsmartcard)
saloutos 0:083111ae2a11 1827 {
saloutos 0:083111ae2a11 1828 uint32_t tickstart = 0;
saloutos 0:083111ae2a11 1829
saloutos 0:083111ae2a11 1830 /* Initialize the SMARTCARD ErrorCode */
saloutos 0:083111ae2a11 1831 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
saloutos 0:083111ae2a11 1832
saloutos 0:083111ae2a11 1833 /* Init tickstart for timeout managment*/
saloutos 0:083111ae2a11 1834 tickstart = HAL_GetTick();
saloutos 0:083111ae2a11 1835
saloutos 0:083111ae2a11 1836 /* Check if the Transmitter is enabled */
saloutos 0:083111ae2a11 1837 if((hsmartcard->Instance->CR1 & USART_CR1_TE) == USART_CR1_TE)
saloutos 0:083111ae2a11 1838 {
saloutos 0:083111ae2a11 1839 /* Wait until TEACK flag is set */
saloutos 0:083111ae2a11 1840 if(SMARTCARD_WaitOnFlagUntilTimeout(hsmartcard, USART_ISR_TEACK, RESET, tickstart, SMARTCARD_TEACK_REACK_TIMEOUT) != HAL_OK)
saloutos 0:083111ae2a11 1841 {
saloutos 0:083111ae2a11 1842 /* Timeout occurred */
saloutos 0:083111ae2a11 1843 return HAL_TIMEOUT;
saloutos 0:083111ae2a11 1844 }
saloutos 0:083111ae2a11 1845 }
saloutos 0:083111ae2a11 1846
saloutos 0:083111ae2a11 1847 /* Initialize the SMARTCARD states */
saloutos 0:083111ae2a11 1848 hsmartcard->gState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 1849 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 1850
saloutos 0:083111ae2a11 1851 /* Process Unlocked */
saloutos 0:083111ae2a11 1852 __HAL_UNLOCK(hsmartcard);
saloutos 0:083111ae2a11 1853
saloutos 0:083111ae2a11 1854 return HAL_OK;
saloutos 0:083111ae2a11 1855 }
saloutos 0:083111ae2a11 1856
saloutos 0:083111ae2a11 1857 /**
saloutos 0:083111ae2a11 1858 * @brief Handle SMARTCARD Communication Timeout.
saloutos 0:083111ae2a11 1859 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 1860 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 1861 * @param Flag Specifies the SMARTCARD flag to check.
saloutos 0:083111ae2a11 1862 * @param Status The new Flag status (SET or RESET).
saloutos 0:083111ae2a11 1863 * @param Tickstart Tick start value
saloutos 0:083111ae2a11 1864 * @param Timeout Timeout duration.
saloutos 0:083111ae2a11 1865 * @retval HAL status
saloutos 0:083111ae2a11 1866 */
saloutos 0:083111ae2a11 1867 static HAL_StatusTypeDef SMARTCARD_WaitOnFlagUntilTimeout(SMARTCARD_HandleTypeDef *hsmartcard, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout)
saloutos 0:083111ae2a11 1868 {
saloutos 0:083111ae2a11 1869 /* Wait until flag is set */
saloutos 0:083111ae2a11 1870 while((__HAL_SMARTCARD_GET_FLAG(hsmartcard, Flag) ? SET : RESET) == Status)
saloutos 0:083111ae2a11 1871 {
saloutos 0:083111ae2a11 1872 /* Check for the Timeout */
saloutos 0:083111ae2a11 1873 if(Timeout != HAL_MAX_DELAY)
saloutos 0:083111ae2a11 1874 {
saloutos 0:083111ae2a11 1875 if((Timeout == 0) || ((HAL_GetTick()-Tickstart) > Timeout))
saloutos 0:083111ae2a11 1876 {
saloutos 0:083111ae2a11 1877 /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
saloutos 0:083111ae2a11 1878 CLEAR_BIT(hsmartcard->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE));
saloutos 0:083111ae2a11 1879 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
saloutos 0:083111ae2a11 1880
saloutos 0:083111ae2a11 1881 hsmartcard->gState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 1882 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 1883
saloutos 0:083111ae2a11 1884 /* Process Unlocked */
saloutos 0:083111ae2a11 1885 __HAL_UNLOCK(hsmartcard);
saloutos 0:083111ae2a11 1886 return HAL_TIMEOUT;
saloutos 0:083111ae2a11 1887 }
saloutos 0:083111ae2a11 1888 }
saloutos 0:083111ae2a11 1889 }
saloutos 0:083111ae2a11 1890 return HAL_OK;
saloutos 0:083111ae2a11 1891 }
saloutos 0:083111ae2a11 1892
saloutos 0:083111ae2a11 1893
saloutos 0:083111ae2a11 1894 /**
saloutos 0:083111ae2a11 1895 * @brief End ongoing Tx transfer on SMARTCARD peripheral (following error detection or Transmit completion).
saloutos 0:083111ae2a11 1896 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 1897 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 1898 * @retval None
saloutos 0:083111ae2a11 1899 */
saloutos 0:083111ae2a11 1900 static void SMARTCARD_EndTxTransfer(SMARTCARD_HandleTypeDef *hsmartcard)
saloutos 0:083111ae2a11 1901 {
saloutos 0:083111ae2a11 1902 /* Disable TXEIE, TCIE and ERR (Frame error, noise error, overrun error) interrupts */
saloutos 0:083111ae2a11 1903 CLEAR_BIT(hsmartcard->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));
saloutos 0:083111ae2a11 1904 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
saloutos 0:083111ae2a11 1905
saloutos 0:083111ae2a11 1906 /* At end of Tx process, restore hsmartcard->gState to Ready */
saloutos 0:083111ae2a11 1907 hsmartcard->gState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 1908 }
saloutos 0:083111ae2a11 1909
saloutos 0:083111ae2a11 1910
saloutos 0:083111ae2a11 1911 /**
saloutos 0:083111ae2a11 1912 * @brief End ongoing Rx transfer on UART peripheral (following error detection or Reception completion).
saloutos 0:083111ae2a11 1913 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 1914 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 1915 * @retval None
saloutos 0:083111ae2a11 1916 */
saloutos 0:083111ae2a11 1917 static void SMARTCARD_EndRxTransfer(SMARTCARD_HandleTypeDef *hsmartcard)
saloutos 0:083111ae2a11 1918 {
saloutos 0:083111ae2a11 1919 /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
saloutos 0:083111ae2a11 1920 CLEAR_BIT(hsmartcard->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
saloutos 0:083111ae2a11 1921 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
saloutos 0:083111ae2a11 1922
saloutos 0:083111ae2a11 1923 /* At end of Rx process, restore hsmartcard->RxState to Ready */
saloutos 0:083111ae2a11 1924 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 1925 }
saloutos 0:083111ae2a11 1926
saloutos 0:083111ae2a11 1927
saloutos 0:083111ae2a11 1928 /**
saloutos 0:083111ae2a11 1929 * @brief DMA SMARTCARD transmit process complete callback.
saloutos 0:083111ae2a11 1930 * @param hdma Pointer to a DMA_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 1931 * the configuration information for the specified DMA module.
saloutos 0:083111ae2a11 1932 * @retval None
saloutos 0:083111ae2a11 1933 */
saloutos 0:083111ae2a11 1934 static void SMARTCARD_DMATransmitCplt(DMA_HandleTypeDef *hdma)
saloutos 0:083111ae2a11 1935 {
saloutos 0:083111ae2a11 1936 SMARTCARD_HandleTypeDef* hsmartcard = (SMARTCARD_HandleTypeDef*)(hdma->Parent);
saloutos 0:083111ae2a11 1937 hsmartcard->TxXferCount = 0;
saloutos 0:083111ae2a11 1938
saloutos 0:083111ae2a11 1939 /* Disable the DMA transfer for transmit request by resetting the DMAT bit
saloutos 0:083111ae2a11 1940 in the SMARTCARD associated USART CR3 register */
saloutos 0:083111ae2a11 1941 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAT);
saloutos 0:083111ae2a11 1942
saloutos 0:083111ae2a11 1943 /* Enable the SMARTCARD Transmit Complete Interrupt */
saloutos 0:083111ae2a11 1944 __HAL_SMARTCARD_ENABLE_IT(hsmartcard, hsmartcard->AdvancedInit.TxCompletionIndication);
saloutos 0:083111ae2a11 1945 }
saloutos 0:083111ae2a11 1946
saloutos 0:083111ae2a11 1947 /**
saloutos 0:083111ae2a11 1948 * @brief DMA SMARTCARD receive process complete callback.
saloutos 0:083111ae2a11 1949 * @param hdma Pointer to a DMA_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 1950 * the configuration information for the specified DMA module.
saloutos 0:083111ae2a11 1951 * @retval None
saloutos 0:083111ae2a11 1952 */
saloutos 0:083111ae2a11 1953 static void SMARTCARD_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
saloutos 0:083111ae2a11 1954 {
saloutos 0:083111ae2a11 1955 SMARTCARD_HandleTypeDef* hsmartcard = (SMARTCARD_HandleTypeDef*)(hdma->Parent);
saloutos 0:083111ae2a11 1956 hsmartcard->RxXferCount = 0;
saloutos 0:083111ae2a11 1957
saloutos 0:083111ae2a11 1958 /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */
saloutos 0:083111ae2a11 1959 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_PEIE);
saloutos 0:083111ae2a11 1960 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
saloutos 0:083111ae2a11 1961
saloutos 0:083111ae2a11 1962 /* Disable the DMA transfer for the receiver request by resetting the DMAR bit
saloutos 0:083111ae2a11 1963 in the SMARTCARD associated USART CR3 register */
saloutos 0:083111ae2a11 1964 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAR);
saloutos 0:083111ae2a11 1965
saloutos 0:083111ae2a11 1966 /* At end of Rx process, restore hsmartcard->RxState to Ready */
saloutos 0:083111ae2a11 1967 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 1968
saloutos 0:083111ae2a11 1969 HAL_SMARTCARD_RxCpltCallback(hsmartcard);
saloutos 0:083111ae2a11 1970 }
saloutos 0:083111ae2a11 1971
saloutos 0:083111ae2a11 1972 /**
saloutos 0:083111ae2a11 1973 * @brief DMA SMARTCARD communication error callback.
saloutos 0:083111ae2a11 1974 * @param hdma Pointer to a DMA_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 1975 * the configuration information for the specified DMA module.
saloutos 0:083111ae2a11 1976 * @retval None
saloutos 0:083111ae2a11 1977 */
saloutos 0:083111ae2a11 1978 static void SMARTCARD_DMAError(DMA_HandleTypeDef *hdma)
saloutos 0:083111ae2a11 1979 {
saloutos 0:083111ae2a11 1980 SMARTCARD_HandleTypeDef* hsmartcard = (SMARTCARD_HandleTypeDef*)(hdma->Parent);
saloutos 0:083111ae2a11 1981
saloutos 0:083111ae2a11 1982 /* Stop SMARTCARD DMA Tx request if ongoing */
saloutos 0:083111ae2a11 1983 if ( (hsmartcard->gState == HAL_SMARTCARD_STATE_BUSY_TX)
saloutos 0:083111ae2a11 1984 &&(HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAT)) )
saloutos 0:083111ae2a11 1985 {
saloutos 0:083111ae2a11 1986 hsmartcard->TxXferCount = 0;
saloutos 0:083111ae2a11 1987 SMARTCARD_EndTxTransfer(hsmartcard);
saloutos 0:083111ae2a11 1988 }
saloutos 0:083111ae2a11 1989
saloutos 0:083111ae2a11 1990 /* Stop SMARTCARD DMA Rx request if ongoing */
saloutos 0:083111ae2a11 1991 if ( (hsmartcard->RxState == HAL_SMARTCARD_STATE_BUSY_RX)
saloutos 0:083111ae2a11 1992 &&(HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAR)) )
saloutos 0:083111ae2a11 1993 {
saloutos 0:083111ae2a11 1994 hsmartcard->RxXferCount = 0;
saloutos 0:083111ae2a11 1995 SMARTCARD_EndRxTransfer(hsmartcard);
saloutos 0:083111ae2a11 1996 }
saloutos 0:083111ae2a11 1997
saloutos 0:083111ae2a11 1998 hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_DMA;
saloutos 0:083111ae2a11 1999 HAL_SMARTCARD_ErrorCallback(hsmartcard);
saloutos 0:083111ae2a11 2000 }
saloutos 0:083111ae2a11 2001
saloutos 0:083111ae2a11 2002 /**
saloutos 0:083111ae2a11 2003 * @brief DMA SMARTCARD communication abort callback, when initiated by HAL services on Error
saloutos 0:083111ae2a11 2004 * (To be called at end of DMA Abort procedure following error occurrence).
saloutos 0:083111ae2a11 2005 * @param hdma DMA handle.
saloutos 0:083111ae2a11 2006 * @retval None
saloutos 0:083111ae2a11 2007 */
saloutos 0:083111ae2a11 2008 static void SMARTCARD_DMAAbortOnError(DMA_HandleTypeDef *hdma)
saloutos 0:083111ae2a11 2009 {
saloutos 0:083111ae2a11 2010 SMARTCARD_HandleTypeDef* hsmartcard = (SMARTCARD_HandleTypeDef*)(hdma->Parent);
saloutos 0:083111ae2a11 2011 hsmartcard->RxXferCount = 0;
saloutos 0:083111ae2a11 2012 hsmartcard->TxXferCount = 0;
saloutos 0:083111ae2a11 2013
saloutos 0:083111ae2a11 2014 HAL_SMARTCARD_ErrorCallback(hsmartcard);
saloutos 0:083111ae2a11 2015 }
saloutos 0:083111ae2a11 2016
saloutos 0:083111ae2a11 2017 /**
saloutos 0:083111ae2a11 2018 * @brief DMA SMARTCARD Tx communication abort callback, when initiated by user
saloutos 0:083111ae2a11 2019 * (To be called at end of DMA Tx Abort procedure following user abort request).
saloutos 0:083111ae2a11 2020 * @note When this callback is executed, User Abort complete call back is called only if no
saloutos 0:083111ae2a11 2021 * Abort still ongoing for Rx DMA Handle.
saloutos 0:083111ae2a11 2022 * @param hdma DMA handle.
saloutos 0:083111ae2a11 2023 * @retval None
saloutos 0:083111ae2a11 2024 */
saloutos 0:083111ae2a11 2025 static void SMARTCARD_DMATxAbortCallback(DMA_HandleTypeDef *hdma)
saloutos 0:083111ae2a11 2026 {
saloutos 0:083111ae2a11 2027 SMARTCARD_HandleTypeDef* hsmartcard = (SMARTCARD_HandleTypeDef* )(hdma->Parent);
saloutos 0:083111ae2a11 2028
saloutos 0:083111ae2a11 2029 hsmartcard->hdmatx->XferAbortCallback = NULL;
saloutos 0:083111ae2a11 2030
saloutos 0:083111ae2a11 2031 /* Check if an Abort process is still ongoing */
saloutos 0:083111ae2a11 2032 if(hsmartcard->hdmarx != NULL)
saloutos 0:083111ae2a11 2033 {
saloutos 0:083111ae2a11 2034 if(hsmartcard->hdmarx->XferAbortCallback != NULL)
saloutos 0:083111ae2a11 2035 {
saloutos 0:083111ae2a11 2036 return;
saloutos 0:083111ae2a11 2037 }
saloutos 0:083111ae2a11 2038 }
saloutos 0:083111ae2a11 2039
saloutos 0:083111ae2a11 2040 /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */
saloutos 0:083111ae2a11 2041 hsmartcard->TxXferCount = 0;
saloutos 0:083111ae2a11 2042 hsmartcard->RxXferCount = 0;
saloutos 0:083111ae2a11 2043
saloutos 0:083111ae2a11 2044 /* Reset errorCode */
saloutos 0:083111ae2a11 2045 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
saloutos 0:083111ae2a11 2046
saloutos 0:083111ae2a11 2047 /* Clear the Error flags in the ICR register */
saloutos 0:083111ae2a11 2048 __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard, SMARTCARD_CLEAR_OREF | SMARTCARD_CLEAR_NEF | SMARTCARD_CLEAR_PEF | SMARTCARD_CLEAR_FEF | SMARTCARD_CLEAR_RTOF | SMARTCARD_CLEAR_EOBF);
saloutos 0:083111ae2a11 2049
saloutos 0:083111ae2a11 2050 /* Restore hsmartcard->gState and hsmartcard->RxState to Ready */
saloutos 0:083111ae2a11 2051 hsmartcard->gState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 2052 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 2053
saloutos 0:083111ae2a11 2054 /* Call user Abort complete callback */
saloutos 0:083111ae2a11 2055 HAL_SMARTCARD_AbortCpltCallback(hsmartcard);
saloutos 0:083111ae2a11 2056 }
saloutos 0:083111ae2a11 2057
saloutos 0:083111ae2a11 2058
saloutos 0:083111ae2a11 2059 /**
saloutos 0:083111ae2a11 2060 * @brief DMA SMARTCARD Rx communication abort callback, when initiated by user
saloutos 0:083111ae2a11 2061 * (To be called at end of DMA Rx Abort procedure following user abort request).
saloutos 0:083111ae2a11 2062 * @note When this callback is executed, User Abort complete call back is called only if no
saloutos 0:083111ae2a11 2063 * Abort still ongoing for Tx DMA Handle.
saloutos 0:083111ae2a11 2064 * @param hdma DMA handle.
saloutos 0:083111ae2a11 2065 * @retval None
saloutos 0:083111ae2a11 2066 */
saloutos 0:083111ae2a11 2067 static void SMARTCARD_DMARxAbortCallback(DMA_HandleTypeDef *hdma)
saloutos 0:083111ae2a11 2068 {
saloutos 0:083111ae2a11 2069 SMARTCARD_HandleTypeDef* hsmartcard = (SMARTCARD_HandleTypeDef* )(hdma->Parent);
saloutos 0:083111ae2a11 2070
saloutos 0:083111ae2a11 2071 hsmartcard->hdmarx->XferAbortCallback = NULL;
saloutos 0:083111ae2a11 2072
saloutos 0:083111ae2a11 2073 /* Check if an Abort process is still ongoing */
saloutos 0:083111ae2a11 2074 if(hsmartcard->hdmatx != NULL)
saloutos 0:083111ae2a11 2075 {
saloutos 0:083111ae2a11 2076 if(hsmartcard->hdmatx->XferAbortCallback != NULL)
saloutos 0:083111ae2a11 2077 {
saloutos 0:083111ae2a11 2078 return;
saloutos 0:083111ae2a11 2079 }
saloutos 0:083111ae2a11 2080 }
saloutos 0:083111ae2a11 2081
saloutos 0:083111ae2a11 2082 /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */
saloutos 0:083111ae2a11 2083 hsmartcard->TxXferCount = 0;
saloutos 0:083111ae2a11 2084 hsmartcard->RxXferCount = 0;
saloutos 0:083111ae2a11 2085
saloutos 0:083111ae2a11 2086 /* Reset errorCode */
saloutos 0:083111ae2a11 2087 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
saloutos 0:083111ae2a11 2088
saloutos 0:083111ae2a11 2089 /* Clear the Error flags in the ICR register */
saloutos 0:083111ae2a11 2090 __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard, SMARTCARD_CLEAR_OREF | SMARTCARD_CLEAR_NEF | SMARTCARD_CLEAR_PEF | SMARTCARD_CLEAR_FEF | SMARTCARD_CLEAR_RTOF | SMARTCARD_CLEAR_EOBF);
saloutos 0:083111ae2a11 2091
saloutos 0:083111ae2a11 2092 /* Restore hsmartcard->gState and hsmartcard->RxState to Ready */
saloutos 0:083111ae2a11 2093 hsmartcard->gState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 2094 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 2095
saloutos 0:083111ae2a11 2096 /* Call user Abort complete callback */
saloutos 0:083111ae2a11 2097 HAL_SMARTCARD_AbortCpltCallback(hsmartcard);
saloutos 0:083111ae2a11 2098 }
saloutos 0:083111ae2a11 2099
saloutos 0:083111ae2a11 2100
saloutos 0:083111ae2a11 2101 /**
saloutos 0:083111ae2a11 2102 * @brief DMA SMARTCARD Tx communication abort callback, when initiated by user by a call to
saloutos 0:083111ae2a11 2103 * HAL_SMARTCARD_AbortTransmit_IT API (Abort only Tx transfer)
saloutos 0:083111ae2a11 2104 * (This callback is executed at end of DMA Tx Abort procedure following user abort request,
saloutos 0:083111ae2a11 2105 * and leads to user Tx Abort Complete callback execution).
saloutos 0:083111ae2a11 2106 * @param hdma DMA handle.
saloutos 0:083111ae2a11 2107 * @retval None
saloutos 0:083111ae2a11 2108 */
saloutos 0:083111ae2a11 2109 static void SMARTCARD_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma)
saloutos 0:083111ae2a11 2110 {
saloutos 0:083111ae2a11 2111 SMARTCARD_HandleTypeDef* hsmartcard = (SMARTCARD_HandleTypeDef*)(hdma->Parent);
saloutos 0:083111ae2a11 2112
saloutos 0:083111ae2a11 2113 hsmartcard->TxXferCount = 0;
saloutos 0:083111ae2a11 2114
saloutos 0:083111ae2a11 2115 /* Clear the Error flags in the ICR register */
saloutos 0:083111ae2a11 2116 __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard, SMARTCARD_CLEAR_FEF);
saloutos 0:083111ae2a11 2117
saloutos 0:083111ae2a11 2118 /* Restore hsmartcard->gState to Ready */
saloutos 0:083111ae2a11 2119 hsmartcard->gState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 2120
saloutos 0:083111ae2a11 2121 /* Call user Abort complete callback */
saloutos 0:083111ae2a11 2122 HAL_SMARTCARD_AbortTransmitCpltCallback(hsmartcard);
saloutos 0:083111ae2a11 2123 }
saloutos 0:083111ae2a11 2124
saloutos 0:083111ae2a11 2125 /**
saloutos 0:083111ae2a11 2126 * @brief DMA SMARTCARD Rx communication abort callback, when initiated by user by a call to
saloutos 0:083111ae2a11 2127 * HAL_SMARTCARD_AbortReceive_IT API (Abort only Rx transfer)
saloutos 0:083111ae2a11 2128 * (This callback is executed at end of DMA Rx Abort procedure following user abort request,
saloutos 0:083111ae2a11 2129 * and leads to user Rx Abort Complete callback execution).
saloutos 0:083111ae2a11 2130 * @param hdma DMA handle.
saloutos 0:083111ae2a11 2131 * @retval None
saloutos 0:083111ae2a11 2132 */
saloutos 0:083111ae2a11 2133 static void SMARTCARD_DMARxOnlyAbortCallback(DMA_HandleTypeDef *hdma)
saloutos 0:083111ae2a11 2134 {
saloutos 0:083111ae2a11 2135 SMARTCARD_HandleTypeDef* hsmartcard = ( SMARTCARD_HandleTypeDef* )(hdma->Parent);
saloutos 0:083111ae2a11 2136
saloutos 0:083111ae2a11 2137 hsmartcard->RxXferCount = 0;
saloutos 0:083111ae2a11 2138
saloutos 0:083111ae2a11 2139 /* Clear the Error flags in the ICR register */
saloutos 0:083111ae2a11 2140 __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard, SMARTCARD_CLEAR_OREF | SMARTCARD_CLEAR_NEF | SMARTCARD_CLEAR_PEF | SMARTCARD_CLEAR_FEF | SMARTCARD_CLEAR_RTOF | SMARTCARD_CLEAR_EOBF);
saloutos 0:083111ae2a11 2141
saloutos 0:083111ae2a11 2142 /* Restore hsmartcard->RxState to Ready */
saloutos 0:083111ae2a11 2143 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 2144
saloutos 0:083111ae2a11 2145 /* Call user Abort complete callback */
saloutos 0:083111ae2a11 2146 HAL_SMARTCARD_AbortReceiveCpltCallback(hsmartcard);
saloutos 0:083111ae2a11 2147 }
saloutos 0:083111ae2a11 2148
saloutos 0:083111ae2a11 2149 /**
saloutos 0:083111ae2a11 2150 * @brief Send an amount of data in non-blocking mode.
saloutos 0:083111ae2a11 2151 * @param hsmartcard: Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 2152 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 2153 * Function called under interruption only, once
saloutos 0:083111ae2a11 2154 * interruptions have been enabled by HAL_SMARTCARD_Transmit_IT()
saloutos 0:083111ae2a11 2155 * @retval HAL status
saloutos 0:083111ae2a11 2156 */
saloutos 0:083111ae2a11 2157 static HAL_StatusTypeDef SMARTCARD_Transmit_IT(SMARTCARD_HandleTypeDef *hsmartcard)
saloutos 0:083111ae2a11 2158 {
saloutos 0:083111ae2a11 2159 /* Check that a Tx process is ongoing */
saloutos 0:083111ae2a11 2160 if (hsmartcard->gState == HAL_SMARTCARD_STATE_BUSY_TX)
saloutos 0:083111ae2a11 2161 {
saloutos 0:083111ae2a11 2162 if(hsmartcard->TxXferCount == 0)
saloutos 0:083111ae2a11 2163 {
saloutos 0:083111ae2a11 2164 /* Disable the SMARTCARD Transmit Data Register Empty Interrupt */
saloutos 0:083111ae2a11 2165 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_TXEIE);
saloutos 0:083111ae2a11 2166
saloutos 0:083111ae2a11 2167 /* Enable the SMARTCARD Transmit Complete Interrupt */
saloutos 0:083111ae2a11 2168 __HAL_SMARTCARD_ENABLE_IT(hsmartcard, hsmartcard->AdvancedInit.TxCompletionIndication);
saloutos 0:083111ae2a11 2169
saloutos 0:083111ae2a11 2170 return HAL_OK;
saloutos 0:083111ae2a11 2171 }
saloutos 0:083111ae2a11 2172 else
saloutos 0:083111ae2a11 2173 {
saloutos 0:083111ae2a11 2174 hsmartcard->Instance->TDR = (*hsmartcard->pTxBuffPtr++ & (uint8_t)0xFF);
saloutos 0:083111ae2a11 2175 hsmartcard->TxXferCount--;
saloutos 0:083111ae2a11 2176
saloutos 0:083111ae2a11 2177 return HAL_OK;
saloutos 0:083111ae2a11 2178 }
saloutos 0:083111ae2a11 2179 }
saloutos 0:083111ae2a11 2180 else
saloutos 0:083111ae2a11 2181 {
saloutos 0:083111ae2a11 2182 return HAL_BUSY;
saloutos 0:083111ae2a11 2183 }
saloutos 0:083111ae2a11 2184 }
saloutos 0:083111ae2a11 2185
saloutos 0:083111ae2a11 2186 /**
saloutos 0:083111ae2a11 2187 * @brief Wrap up transmission in non-blocking mode.
saloutos 0:083111ae2a11 2188 * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 2189 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 2190 * @retval HAL status
saloutos 0:083111ae2a11 2191 */
saloutos 0:083111ae2a11 2192 static HAL_StatusTypeDef SMARTCARD_EndTransmit_IT(SMARTCARD_HandleTypeDef *hsmartcard)
saloutos 0:083111ae2a11 2193 {
saloutos 0:083111ae2a11 2194 /* Disable the SMARTCARD Transmit Complete Interrupt */
saloutos 0:083111ae2a11 2195 __HAL_SMARTCARD_DISABLE_IT(hsmartcard, hsmartcard->AdvancedInit.TxCompletionIndication);
saloutos 0:083111ae2a11 2196
saloutos 0:083111ae2a11 2197 /* Check if a receive process is ongoing or not. If not disable ERR IT */
saloutos 0:083111ae2a11 2198 if(hsmartcard->RxState == HAL_SMARTCARD_STATE_READY)
saloutos 0:083111ae2a11 2199 {
saloutos 0:083111ae2a11 2200 /* Disable the SMARTCARD Error Interrupt: (Frame error) */
saloutos 0:083111ae2a11 2201 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
saloutos 0:083111ae2a11 2202 }
saloutos 0:083111ae2a11 2203
saloutos 0:083111ae2a11 2204 /* Re-enable Rx at end of transmission if initial mode is Rx/Tx */
saloutos 0:083111ae2a11 2205 if(hsmartcard->Init.Mode == SMARTCARD_MODE_TX_RX)
saloutos 0:083111ae2a11 2206 {
saloutos 0:083111ae2a11 2207 /* Disable the Peripheral first to update modes */
saloutos 0:083111ae2a11 2208 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_UE);
saloutos 0:083111ae2a11 2209 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_RE);
saloutos 0:083111ae2a11 2210 /* Enable the Peripheral */
saloutos 0:083111ae2a11 2211 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_UE);
saloutos 0:083111ae2a11 2212 }
saloutos 0:083111ae2a11 2213
saloutos 0:083111ae2a11 2214 /* Tx process is ended, restore hsmartcard->gState to Ready */
saloutos 0:083111ae2a11 2215 hsmartcard->gState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 2216
saloutos 0:083111ae2a11 2217 HAL_SMARTCARD_TxCpltCallback(hsmartcard);
saloutos 0:083111ae2a11 2218
saloutos 0:083111ae2a11 2219 return HAL_OK;
saloutos 0:083111ae2a11 2220 }
saloutos 0:083111ae2a11 2221
saloutos 0:083111ae2a11 2222 /**
saloutos 0:083111ae2a11 2223 * @brief Receive an amount of data in non-blocking mode.
saloutos 0:083111ae2a11 2224 * @param hsmartcard: Pointer to a SMARTCARD_HandleTypeDef structure that contains
saloutos 0:083111ae2a11 2225 * the configuration information for the specified SMARTCARD module.
saloutos 0:083111ae2a11 2226 * Function called under interruption only, once
saloutos 0:083111ae2a11 2227 * interruptions have been enabled by HAL_SMARTCARD_Receive_IT().
saloutos 0:083111ae2a11 2228 * @retval HAL status
saloutos 0:083111ae2a11 2229 */
saloutos 0:083111ae2a11 2230 static HAL_StatusTypeDef SMARTCARD_Receive_IT(SMARTCARD_HandleTypeDef *hsmartcard)
saloutos 0:083111ae2a11 2231 {
saloutos 0:083111ae2a11 2232 /* Check that a Rx process is ongoing */
saloutos 0:083111ae2a11 2233 if (hsmartcard->RxState == HAL_SMARTCARD_STATE_BUSY_RX)
saloutos 0:083111ae2a11 2234 {
saloutos 0:083111ae2a11 2235 *hsmartcard->pRxBuffPtr++ = (uint8_t)(hsmartcard->Instance->RDR & (uint8_t)0xFF);
saloutos 0:083111ae2a11 2236
saloutos 0:083111ae2a11 2237 if(--hsmartcard->RxXferCount == 0)
saloutos 0:083111ae2a11 2238 {
saloutos 0:083111ae2a11 2239 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_RXNEIE);
saloutos 0:083111ae2a11 2240
saloutos 0:083111ae2a11 2241 /* Check if a transmit process is ongoing or not. If not disable ERR IT */
saloutos 0:083111ae2a11 2242 if(hsmartcard->gState == HAL_SMARTCARD_STATE_READY)
saloutos 0:083111ae2a11 2243 {
saloutos 0:083111ae2a11 2244 /* Disable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */
saloutos 0:083111ae2a11 2245 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
saloutos 0:083111ae2a11 2246 }
saloutos 0:083111ae2a11 2247
saloutos 0:083111ae2a11 2248 /* Disable the SMARTCARD Parity Error Interrupt */
saloutos 0:083111ae2a11 2249 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_PEIE);
saloutos 0:083111ae2a11 2250
saloutos 0:083111ae2a11 2251 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
saloutos 0:083111ae2a11 2252
saloutos 0:083111ae2a11 2253 HAL_SMARTCARD_RxCpltCallback(hsmartcard);
saloutos 0:083111ae2a11 2254
saloutos 0:083111ae2a11 2255 return HAL_OK;
saloutos 0:083111ae2a11 2256 }
saloutos 0:083111ae2a11 2257
saloutos 0:083111ae2a11 2258 return HAL_OK;
saloutos 0:083111ae2a11 2259 }
saloutos 0:083111ae2a11 2260 else
saloutos 0:083111ae2a11 2261 {
saloutos 0:083111ae2a11 2262 /* Clear RXNE interrupt flag */
saloutos 0:083111ae2a11 2263 __HAL_SMARTCARD_SEND_REQ(hsmartcard, SMARTCARD_RXDATA_FLUSH_REQUEST);
saloutos 0:083111ae2a11 2264
saloutos 0:083111ae2a11 2265 return HAL_BUSY;
saloutos 0:083111ae2a11 2266 }
saloutos 0:083111ae2a11 2267 }
saloutos 0:083111ae2a11 2268
saloutos 0:083111ae2a11 2269 /**
saloutos 0:083111ae2a11 2270 * @}
saloutos 0:083111ae2a11 2271 */
saloutos 0:083111ae2a11 2272
saloutos 0:083111ae2a11 2273 #endif /* HAL_SMARTCARD_MODULE_ENABLED */
saloutos 0:083111ae2a11 2274 /**
saloutos 0:083111ae2a11 2275 * @}
saloutos 0:083111ae2a11 2276 */
saloutos 0:083111ae2a11 2277
saloutos 0:083111ae2a11 2278 /**
saloutos 0:083111ae2a11 2279 * @}
saloutos 0:083111ae2a11 2280 */
saloutos 0:083111ae2a11 2281
saloutos 0:083111ae2a11 2282 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/