mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
186:707f6e361f3e
mbed library release version 165

Who changed what in which revision?

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