mbed library sources

Fork of mbed-src by mbed official

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

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

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

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 340:28d1f895c6fe 1 /**
mbed_official 340:28d1f895c6fe 2 ******************************************************************************
mbed_official 340:28d1f895c6fe 3 * @file stm32f0xx_hal_smartcard.c
mbed_official 340:28d1f895c6fe 4 * @author MCD Application Team
mbed_official 340:28d1f895c6fe 5 * @version V1.1.0
mbed_official 340:28d1f895c6fe 6 * @date 03-Oct-2014
mbed_official 340:28d1f895c6fe 7 * @brief SMARTCARD HAL module driver.
mbed_official 340:28d1f895c6fe 8 * This file provides firmware functions to manage the following
mbed_official 340:28d1f895c6fe 9 * functionalities of the SMARTCARD peripheral:
mbed_official 340:28d1f895c6fe 10 * + Initialization and de-initialization functions
mbed_official 340:28d1f895c6fe 11 * + IO operation functions
mbed_official 340:28d1f895c6fe 12 * + Peripheral State and Errors functions
mbed_official 340:28d1f895c6fe 13 * + Peripheral Control functions
mbed_official 340:28d1f895c6fe 14 *
mbed_official 340:28d1f895c6fe 15 @verbatim
mbed_official 340:28d1f895c6fe 16 ===============================================================================
mbed_official 340:28d1f895c6fe 17 ##### How to use this driver #####
mbed_official 340:28d1f895c6fe 18 ===============================================================================
mbed_official 340:28d1f895c6fe 19 [..]
mbed_official 340:28d1f895c6fe 20 The SMARTCARD HAL driver can be used as follows:
mbed_official 340:28d1f895c6fe 21
mbed_official 340:28d1f895c6fe 22 (#) Declare a SMARTCARD_HandleTypeDef handle structure.
mbed_official 340:28d1f895c6fe 23 (#) Initialize the SMARTCARD low level resources by implementing the HAL_SMARTCARD_MspInit ()API:
mbed_official 340:28d1f895c6fe 24 (++) Enable the USARTx interface clock.
mbed_official 340:28d1f895c6fe 25 (++) SMARTCARD pins configuration:
mbed_official 340:28d1f895c6fe 26 (+++) Enable the clock for the SMARTCARD GPIOs.
mbed_official 340:28d1f895c6fe 27 (+++) Configure these SMARTCARD pins as alternate function pull-up.
mbed_official 340:28d1f895c6fe 28 (++) NVIC configuration if you need to use interrupt process (HAL_SMARTCARD_Transmit_IT()
mbed_official 340:28d1f895c6fe 29 and HAL_SMARTCARD_Receive_IT() APIs):
mbed_official 340:28d1f895c6fe 30 (+++) Configure the USARTx interrupt priority.
mbed_official 340:28d1f895c6fe 31 (+++) Enable the NVIC USART IRQ handle.
mbed_official 340:28d1f895c6fe 32 (++) DMA Configuration if you need to use DMA process (HAL_SMARTCARD_Transmit_DMA()
mbed_official 340:28d1f895c6fe 33 and HAL_SMARTCARD_Receive_DMA() APIs):
mbed_official 340:28d1f895c6fe 34 (+++) Declare a DMA handle structure for the Tx/Rx channel.
mbed_official 340:28d1f895c6fe 35 (+++) Enable the DMAx interface clock.
mbed_official 340:28d1f895c6fe 36 (+++) Configure the declared DMA handle structure with the required Tx/Rx parameters.
mbed_official 340:28d1f895c6fe 37 (+++) Configure the DMA Tx/Rx channel.
mbed_official 340:28d1f895c6fe 38 (+++) Associate the initialized DMA handle to the SMARTCARD DMA Tx/Rx handle.
mbed_official 340:28d1f895c6fe 39 (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx/Rx channel.
mbed_official 340:28d1f895c6fe 40
mbed_official 340:28d1f895c6fe 41 (#) Program the Baud Rate, Parity, Mode(Receiver/Transmitter), clock enabling/disabling and accordingly,
mbed_official 340:28d1f895c6fe 42 the clock parameters (parity, phase, last bit), prescaler value, guard time and NACK on transmission
mbed_official 340:28d1f895c6fe 43 error enabling or disabling in the hsmartcard Init structure.
mbed_official 340:28d1f895c6fe 44
mbed_official 340:28d1f895c6fe 45 (#) If required, program SMARTCARD advanced features (TX/RX pins swap, TimeOut, auto-retry counter,...)
mbed_official 340:28d1f895c6fe 46 in the hsmartcard AdvancedInit structure.
mbed_official 340:28d1f895c6fe 47
mbed_official 340:28d1f895c6fe 48 (#) Initialize the SMARTCARD associated USART registers by calling the HAL_SMARTCARD_Init() API:
mbed_official 340:28d1f895c6fe 49 (++) This API configures also the low level Hardware GPIO, CLOCK, CORTEX...etc) by
mbed_official 340:28d1f895c6fe 50 calling the customed HAL_SMARTCARD_MspInit() API.
mbed_official 340:28d1f895c6fe 51
mbed_official 340:28d1f895c6fe 52 -@@- The specific SMARTCARD interrupts (Transmission complete interrupt,
mbed_official 340:28d1f895c6fe 53 RXNE interrupt and Error Interrupts) will be managed using the macros
mbed_official 340:28d1f895c6fe 54 __HAL_SMARTCARD_ENABLE_IT() and __HAL_SMARTCARD_DISABLE_IT() inside the transmit and receive process.
mbed_official 340:28d1f895c6fe 55
mbed_official 340:28d1f895c6fe 56 (#) Three operation modes are available within this driver :
mbed_official 340:28d1f895c6fe 57
mbed_official 340:28d1f895c6fe 58 *** Polling mode IO operation ***
mbed_official 340:28d1f895c6fe 59 =================================
mbed_official 340:28d1f895c6fe 60 [..]
mbed_official 340:28d1f895c6fe 61 (+) Send an amount of data in blocking mode using HAL_SMARTCARD_Transmit()
mbed_official 340:28d1f895c6fe 62 (+) Receive an amount of data in blocking mode using HAL_SMARTCARD_Receive()
mbed_official 340:28d1f895c6fe 63
mbed_official 340:28d1f895c6fe 64 *** Interrupt mode IO operation ***
mbed_official 340:28d1f895c6fe 65 ===================================
mbed_official 340:28d1f895c6fe 66 [..]
mbed_official 340:28d1f895c6fe 67 (+) Send an amount of data in non blocking mode using HAL_SMARTCARD_Transmit_IT()
mbed_official 340:28d1f895c6fe 68 (+) At transmission end of transfer HAL_SMARTCARD_TxCpltCallback is executed and user can
mbed_official 340:28d1f895c6fe 69 add his own code by customization of function pointer HAL_SMARTCARD_TxCpltCallback
mbed_official 340:28d1f895c6fe 70 (+) Receive an amount of data in non blocking mode using HAL_SMARTCARD_Receive_IT()
mbed_official 340:28d1f895c6fe 71 (+) At reception end of transfer HAL_SMARTCARD_RxCpltCallback is executed and user can
mbed_official 340:28d1f895c6fe 72 add his own code by customization of function pointer HAL_SMARTCARD_RxCpltCallback
mbed_official 340:28d1f895c6fe 73 (+) In case of transfer Error, HAL_SMARTCARD_ErrorCallback() function is executed and user can
mbed_official 340:28d1f895c6fe 74 add his own code by customization of function pointer HAL_SMARTCARD_ErrorCallback
mbed_official 340:28d1f895c6fe 75
mbed_official 340:28d1f895c6fe 76 *** DMA mode IO operation ***
mbed_official 340:28d1f895c6fe 77 ==============================
mbed_official 340:28d1f895c6fe 78 [..]
mbed_official 340:28d1f895c6fe 79 (+) Send an amount of data in non blocking mode (DMA) using HAL_SMARTCARD_Transmit_DMA()
mbed_official 340:28d1f895c6fe 80 (+) At transmission end of transfer HAL_SMARTCARD_TxCpltCallback is executed and user can
mbed_official 340:28d1f895c6fe 81 add his own code by customization of function pointer HAL_SMARTCARD_TxCpltCallback
mbed_official 340:28d1f895c6fe 82 (+) Receive an amount of data in non blocking mode (DMA) using HAL_SMARTCARD_Receive_DMA()
mbed_official 340:28d1f895c6fe 83 (+) At reception end of transfer HAL_SMARTCARD_RxCpltCallback is executed and user can
mbed_official 340:28d1f895c6fe 84 add his own code by customization of function pointer HAL_SMARTCARD_RxCpltCallback
mbed_official 340:28d1f895c6fe 85 (+) In case of transfer Error, HAL_SMARTCARD_ErrorCallback() function is executed and user can
mbed_official 340:28d1f895c6fe 86 add his own code by customization of function pointer HAL_SMARTCARD_ErrorCallback
mbed_official 340:28d1f895c6fe 87
mbed_official 340:28d1f895c6fe 88 *** SMARTCARD HAL driver macros list ***
mbed_official 340:28d1f895c6fe 89 ========================================
mbed_official 340:28d1f895c6fe 90 [..]
mbed_official 340:28d1f895c6fe 91 Below the list of most used macros in SMARTCARD HAL driver.
mbed_official 340:28d1f895c6fe 92
mbed_official 340:28d1f895c6fe 93 (+) __HAL_SMARTCARD_ENABLE: Enable the SMARTCARD peripheral
mbed_official 340:28d1f895c6fe 94 (+) __HAL_SMARTCARD_DISABLE: Disable the SMARTCARD peripheral
mbed_official 340:28d1f895c6fe 95 (+) __HAL_SMARTCARD_GET_FLAG : Check whether the specified SMARTCARD flag is set or not
mbed_official 340:28d1f895c6fe 96 (+) __HAL_SMARTCARD_CLEAR_FLAG : Clear the specified SMARTCARD pending flag
mbed_official 340:28d1f895c6fe 97 (+) __HAL_SMARTCARD_ENABLE_IT: Enable the specified SMARTCARD interrupt
mbed_official 340:28d1f895c6fe 98 (+) __HAL_SMARTCARD_DISABLE_IT: Disable the specified SMARTCARD interrupt
mbed_official 340:28d1f895c6fe 99
mbed_official 340:28d1f895c6fe 100 [..]
mbed_official 340:28d1f895c6fe 101 (@) You can refer to the SMARTCARD HAL driver header file for more useful macros
mbed_official 340:28d1f895c6fe 102
mbed_official 340:28d1f895c6fe 103 @endverbatim
mbed_official 340:28d1f895c6fe 104 ******************************************************************************
mbed_official 340:28d1f895c6fe 105 * @attention
mbed_official 340:28d1f895c6fe 106 *
mbed_official 340:28d1f895c6fe 107 * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
mbed_official 340:28d1f895c6fe 108 *
mbed_official 340:28d1f895c6fe 109 * Redistribution and use in source and binary forms, with or without modification,
mbed_official 340:28d1f895c6fe 110 * are permitted provided that the following conditions are met:
mbed_official 340:28d1f895c6fe 111 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 340:28d1f895c6fe 112 * this list of conditions and the following disclaimer.
mbed_official 340:28d1f895c6fe 113 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 340:28d1f895c6fe 114 * this list of conditions and the following disclaimer in the documentation
mbed_official 340:28d1f895c6fe 115 * and/or other materials provided with the distribution.
mbed_official 340:28d1f895c6fe 116 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 340:28d1f895c6fe 117 * may be used to endorse or promote products derived from this software
mbed_official 340:28d1f895c6fe 118 * without specific prior written permission.
mbed_official 340:28d1f895c6fe 119 *
mbed_official 340:28d1f895c6fe 120 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 340:28d1f895c6fe 121 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 340:28d1f895c6fe 122 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 340:28d1f895c6fe 123 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 340:28d1f895c6fe 124 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 340:28d1f895c6fe 125 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 340:28d1f895c6fe 126 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 340:28d1f895c6fe 127 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 340:28d1f895c6fe 128 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 340:28d1f895c6fe 129 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 340:28d1f895c6fe 130 *
mbed_official 340:28d1f895c6fe 131 ******************************************************************************
mbed_official 340:28d1f895c6fe 132 */
mbed_official 340:28d1f895c6fe 133
mbed_official 340:28d1f895c6fe 134 /* Includes ------------------------------------------------------------------*/
mbed_official 340:28d1f895c6fe 135 #include "stm32f0xx_hal.h"
mbed_official 340:28d1f895c6fe 136
mbed_official 340:28d1f895c6fe 137 /** @addtogroup STM32F0xx_HAL_Driver
mbed_official 340:28d1f895c6fe 138 * @{
mbed_official 340:28d1f895c6fe 139 */
mbed_official 340:28d1f895c6fe 140
mbed_official 340:28d1f895c6fe 141 /** @defgroup SMARTCARD SMARTCARD HAL module driver
mbed_official 340:28d1f895c6fe 142 * @brief HAL SMARTCARD module driver
mbed_official 340:28d1f895c6fe 143 * @{
mbed_official 340:28d1f895c6fe 144 */
mbed_official 340:28d1f895c6fe 145 #ifdef HAL_SMARTCARD_MODULE_ENABLED
mbed_official 340:28d1f895c6fe 146
mbed_official 340:28d1f895c6fe 147 #if !defined(STM32F030x6) && !defined(STM32F030x8)
mbed_official 340:28d1f895c6fe 148
mbed_official 340:28d1f895c6fe 149 /* Private typedef -----------------------------------------------------------*/
mbed_official 340:28d1f895c6fe 150 /* Private define ------------------------------------------------------------*/
mbed_official 340:28d1f895c6fe 151 /** @defgroup SMARTCARD_Private_Constants SMARTCARD Private Constants
mbed_official 340:28d1f895c6fe 152 * @{
mbed_official 340:28d1f895c6fe 153 */
mbed_official 340:28d1f895c6fe 154 #define TEACK_REACK_TIMEOUT 1000
mbed_official 340:28d1f895c6fe 155 #define SMARTCARD_TXDMA_TIMEOUTVALUE 22000
mbed_official 340:28d1f895c6fe 156 #define SMARTCARD_TIMEOUT_VALUE 22000
mbed_official 340:28d1f895c6fe 157 #define USART_CR1_FIELDS ((uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | \
mbed_official 340:28d1f895c6fe 158 USART_CR1_TE | USART_CR1_RE | USART_CR1_OVER8))
mbed_official 340:28d1f895c6fe 159 #define USART_CR2_CLK_FIELDS ((uint32_t)(USART_CR2_CLKEN|USART_CR2_CPOL|USART_CR2_CPHA|USART_CR2_LBCL))
mbed_official 340:28d1f895c6fe 160 #define USART_CR2_FIELDS ((uint32_t)(USART_CR2_RTOEN|USART_CR2_CLK_FIELDS|USART_CR2_STOP))
mbed_official 340:28d1f895c6fe 161 #define USART_CR3_FIELDS ((uint32_t)(USART_CR3_ONEBIT|USART_CR3_NACK|USART_CR3_SCARCNT))
mbed_official 340:28d1f895c6fe 162 /**
mbed_official 340:28d1f895c6fe 163 * @}
mbed_official 340:28d1f895c6fe 164 */
mbed_official 340:28d1f895c6fe 165
mbed_official 340:28d1f895c6fe 166 /* Private macro -------------------------------------------------------------*/
mbed_official 340:28d1f895c6fe 167 /* Private variables ---------------------------------------------------------*/
mbed_official 340:28d1f895c6fe 168 /* Private function prototypes -----------------------------------------------*/
mbed_official 340:28d1f895c6fe 169 /** @addtogroup SMARTCARD_Private_Functions SMARTCARD Private Functions
mbed_official 340:28d1f895c6fe 170 * @{
mbed_official 340:28d1f895c6fe 171 */
mbed_official 340:28d1f895c6fe 172 static void SMARTCARD_DMATransmitCplt(DMA_HandleTypeDef *hdma);
mbed_official 340:28d1f895c6fe 173 static void SMARTCARD_DMAReceiveCplt(DMA_HandleTypeDef *hdma);
mbed_official 340:28d1f895c6fe 174 static void SMARTCARD_DMAError(DMA_HandleTypeDef *hdma);
mbed_official 340:28d1f895c6fe 175 static HAL_StatusTypeDef SMARTCARD_SetConfig(SMARTCARD_HandleTypeDef *hsmartcard);
mbed_official 340:28d1f895c6fe 176 static HAL_StatusTypeDef SMARTCARD_WaitOnFlagUntilTimeout(SMARTCARD_HandleTypeDef *hsmartcard, uint32_t Flag, FlagStatus Status, uint32_t Timeout);
mbed_official 340:28d1f895c6fe 177 static HAL_StatusTypeDef SMARTCARD_CheckIdleState(SMARTCARD_HandleTypeDef *hsmartcard);
mbed_official 340:28d1f895c6fe 178 static HAL_StatusTypeDef SMARTCARD_Transmit_IT(SMARTCARD_HandleTypeDef *hsmartcard);
mbed_official 340:28d1f895c6fe 179 static HAL_StatusTypeDef SMARTCARD_EndTransmit_IT(SMARTCARD_HandleTypeDef *hsmartcard);
mbed_official 340:28d1f895c6fe 180 static HAL_StatusTypeDef SMARTCARD_Receive_IT(SMARTCARD_HandleTypeDef *hsmartcard);
mbed_official 340:28d1f895c6fe 181 static void SMARTCARD_AdvFeatureConfig(SMARTCARD_HandleTypeDef *hsmartcard);
mbed_official 340:28d1f895c6fe 182 /**
mbed_official 340:28d1f895c6fe 183 * @}
mbed_official 340:28d1f895c6fe 184 */
mbed_official 340:28d1f895c6fe 185
mbed_official 340:28d1f895c6fe 186 /* Exported functions ---------------------------------------------------------*/
mbed_official 340:28d1f895c6fe 187
mbed_official 340:28d1f895c6fe 188 /** @defgroup SMARTCARD_Exported_Functions SMARTCARD Exported Functions
mbed_official 340:28d1f895c6fe 189 * @{
mbed_official 340:28d1f895c6fe 190 */
mbed_official 340:28d1f895c6fe 191
mbed_official 340:28d1f895c6fe 192 /** @defgroup SMARTCARD_Exported_Functions_Group1 Initialization and de-initialization functions
mbed_official 340:28d1f895c6fe 193 * @brief Initialization and Configuration functions
mbed_official 340:28d1f895c6fe 194 *
mbed_official 340:28d1f895c6fe 195 @verbatim
mbed_official 340:28d1f895c6fe 196 ===============================================================================
mbed_official 340:28d1f895c6fe 197 ##### Initialization and Configuration functions #####
mbed_official 340:28d1f895c6fe 198 ===============================================================================
mbed_official 340:28d1f895c6fe 199 [..]
mbed_official 340:28d1f895c6fe 200 This subsection provides a set of functions allowing to initialize the USART
mbed_official 340:28d1f895c6fe 201 in Smartcard mode.
mbed_official 340:28d1f895c6fe 202 [..]
mbed_official 340:28d1f895c6fe 203 The Smartcard interface is designed to support asynchronous protocol Smartcards as
mbed_official 340:28d1f895c6fe 204 defined in the ISO 7816-3 standard.
mbed_official 340:28d1f895c6fe 205 [..]
mbed_official 340:28d1f895c6fe 206 The USART can provide a clock to the smartcard through the SCLK output.
mbed_official 340:28d1f895c6fe 207 In smartcard mode, SCLK is not associated to the communication but is simply derived
mbed_official 340:28d1f895c6fe 208 from the internal peripheral input clock through a 5-bit prescaler.
mbed_official 340:28d1f895c6fe 209 [..]
mbed_official 340:28d1f895c6fe 210 (+) For the Smartcard mode only these parameters can be configured:
mbed_official 340:28d1f895c6fe 211 (++) Baud Rate
mbed_official 340:28d1f895c6fe 212 (++) Parity: parity should be enabled,
mbed_official 340:28d1f895c6fe 213 Frame Length is fixed to 8 bits plus parity:
mbed_official 340:28d1f895c6fe 214 the USART frame format is given in the following table:
mbed_official 340:28d1f895c6fe 215 +---------------------------------------------------------------+
mbed_official 340:28d1f895c6fe 216 | M bit | PCE bit | USART frame |
mbed_official 340:28d1f895c6fe 217 |---------------------|-----------------------------------------|
mbed_official 340:28d1f895c6fe 218 | 1 | 1 | | SB | 8 bit data | PB | STB | |
mbed_official 340:28d1f895c6fe 219 +---------------------------------------------------------------+
mbed_official 340:28d1f895c6fe 220 or
mbed_official 340:28d1f895c6fe 221 +---------------------------------------------------------------+
mbed_official 340:28d1f895c6fe 222 | M1M0 bits | PCE bit | USART frame |
mbed_official 340:28d1f895c6fe 223 |-----------------------|---------------------------------------|
mbed_official 340:28d1f895c6fe 224 | 01 | 1 | | SB | 8 bit data | PB | STB | |
mbed_official 340:28d1f895c6fe 225 +---------------------------------------------------------------+
mbed_official 340:28d1f895c6fe 226
mbed_official 340:28d1f895c6fe 227 (++) Receiver/transmitter modes
mbed_official 340:28d1f895c6fe 228 (++) Synchronous mode (and if enabled, phase, polarity and last bit parameters)
mbed_official 340:28d1f895c6fe 229 (++) Prescaler value
mbed_official 340:28d1f895c6fe 230 (++) Guard bit time
mbed_official 340:28d1f895c6fe 231 (++) NACK enabling or disabling on transmission error
mbed_official 340:28d1f895c6fe 232
mbed_official 340:28d1f895c6fe 233 (+) The following advanced features can be configured as well:
mbed_official 340:28d1f895c6fe 234 (++) TX and/or RX pin level inversion
mbed_official 340:28d1f895c6fe 235 (++) data logical level inversion
mbed_official 340:28d1f895c6fe 236 (++) RX and TX pins swap
mbed_official 340:28d1f895c6fe 237 (++) RX overrun detection disabling
mbed_official 340:28d1f895c6fe 238 (++) DMA disabling on RX error
mbed_official 340:28d1f895c6fe 239 (++) MSB first on communication line
mbed_official 340:28d1f895c6fe 240 (++) Time out enabling (and if activated, timeout value)
mbed_official 340:28d1f895c6fe 241 (++) Block length
mbed_official 340:28d1f895c6fe 242 (++) Auto-retry counter
mbed_official 340:28d1f895c6fe 243
mbed_official 340:28d1f895c6fe 244 [..]
mbed_official 340:28d1f895c6fe 245 The HAL_SMARTCARD_Init() API follow respectively the USART (a)synchronous configuration procedures
mbed_official 340:28d1f895c6fe 246 (details for the procedures are available in reference manual).
mbed_official 340:28d1f895c6fe 247
mbed_official 340:28d1f895c6fe 248 @endverbatim
mbed_official 340:28d1f895c6fe 249 * @{
mbed_official 340:28d1f895c6fe 250 */
mbed_official 340:28d1f895c6fe 251
mbed_official 340:28d1f895c6fe 252 /**
mbed_official 340:28d1f895c6fe 253 * @brief Initializes the SMARTCARD mode according to the specified
mbed_official 340:28d1f895c6fe 254 * parameters in the SMARTCARD_InitTypeDef and creates the associated handle .
mbed_official 340:28d1f895c6fe 255 * @param hsmartcard: SMARTCARD handle
mbed_official 340:28d1f895c6fe 256 * @retval HAL status
mbed_official 340:28d1f895c6fe 257 */
mbed_official 340:28d1f895c6fe 258 HAL_StatusTypeDef HAL_SMARTCARD_Init(SMARTCARD_HandleTypeDef *hsmartcard)
mbed_official 340:28d1f895c6fe 259 {
mbed_official 340:28d1f895c6fe 260 /* Check the SMARTCARD handle allocation */
mbed_official 340:28d1f895c6fe 261 if(hsmartcard == HAL_NULL)
mbed_official 340:28d1f895c6fe 262 {
mbed_official 340:28d1f895c6fe 263 return HAL_ERROR;
mbed_official 340:28d1f895c6fe 264 }
mbed_official 340:28d1f895c6fe 265
mbed_official 340:28d1f895c6fe 266 /* Check the USART associated to the SmartCard */
mbed_official 340:28d1f895c6fe 267 assert_param(IS_SMARTCARD_INSTANCE(hsmartcard->Instance));
mbed_official 340:28d1f895c6fe 268
mbed_official 340:28d1f895c6fe 269 if(hsmartcard->State == HAL_SMARTCARD_STATE_RESET)
mbed_official 340:28d1f895c6fe 270 {
mbed_official 340:28d1f895c6fe 271 /* Init the low level hardware : GPIO, CLOCK */
mbed_official 340:28d1f895c6fe 272 HAL_SMARTCARD_MspInit(hsmartcard);
mbed_official 340:28d1f895c6fe 273 }
mbed_official 340:28d1f895c6fe 274
mbed_official 340:28d1f895c6fe 275 hsmartcard->State = HAL_SMARTCARD_STATE_BUSY;
mbed_official 340:28d1f895c6fe 276
mbed_official 340:28d1f895c6fe 277 /* Disable the Peripheral */
mbed_official 340:28d1f895c6fe 278 __HAL_SMARTCARD_DISABLE(hsmartcard);
mbed_official 340:28d1f895c6fe 279
mbed_official 340:28d1f895c6fe 280 /* Set the SMARTCARD Communication parameters */
mbed_official 340:28d1f895c6fe 281 if (SMARTCARD_SetConfig(hsmartcard) == HAL_ERROR)
mbed_official 340:28d1f895c6fe 282 {
mbed_official 340:28d1f895c6fe 283 return HAL_ERROR;
mbed_official 340:28d1f895c6fe 284 }
mbed_official 340:28d1f895c6fe 285
mbed_official 340:28d1f895c6fe 286 if (hsmartcard->AdvancedInit.AdvFeatureInit != SMARTCARD_ADVFEATURE_NO_INIT)
mbed_official 340:28d1f895c6fe 287 {
mbed_official 340:28d1f895c6fe 288 SMARTCARD_AdvFeatureConfig(hsmartcard);
mbed_official 340:28d1f895c6fe 289 }
mbed_official 340:28d1f895c6fe 290
mbed_official 340:28d1f895c6fe 291 /* In SmartCard mode, the following bits must be kept cleared:
mbed_official 340:28d1f895c6fe 292 - LINEN in the USART_CR2 register,
mbed_official 340:28d1f895c6fe 293 - HDSEL and IREN bits in the USART_CR3 register.*/
mbed_official 340:28d1f895c6fe 294 hsmartcard->Instance->CR2 &= ~(USART_CR2_LINEN);
mbed_official 340:28d1f895c6fe 295 hsmartcard->Instance->CR3 &= ~(USART_CR3_HDSEL | USART_CR3_IREN);
mbed_official 340:28d1f895c6fe 296
mbed_official 340:28d1f895c6fe 297 /* set the USART in SMARTCARD mode */
mbed_official 340:28d1f895c6fe 298 hsmartcard->Instance->CR3 |= USART_CR3_SCEN;
mbed_official 340:28d1f895c6fe 299
mbed_official 340:28d1f895c6fe 300 /* Enable the Peripheral */
mbed_official 340:28d1f895c6fe 301 __HAL_SMARTCARD_ENABLE(hsmartcard);
mbed_official 340:28d1f895c6fe 302
mbed_official 340:28d1f895c6fe 303 /* TEACK and/or REACK to check before moving hsmartcard->State to Ready */
mbed_official 340:28d1f895c6fe 304 return (SMARTCARD_CheckIdleState(hsmartcard));
mbed_official 340:28d1f895c6fe 305 }
mbed_official 340:28d1f895c6fe 306
mbed_official 340:28d1f895c6fe 307
mbed_official 340:28d1f895c6fe 308 /**
mbed_official 340:28d1f895c6fe 309 * @brief DeInitializes the SMARTCARD peripheral
mbed_official 340:28d1f895c6fe 310 * @param hsmartcard: SMARTCARD handle
mbed_official 340:28d1f895c6fe 311 * @retval HAL status
mbed_official 340:28d1f895c6fe 312 */
mbed_official 340:28d1f895c6fe 313 HAL_StatusTypeDef HAL_SMARTCARD_DeInit(SMARTCARD_HandleTypeDef *hsmartcard)
mbed_official 340:28d1f895c6fe 314 {
mbed_official 340:28d1f895c6fe 315 /* Check the SMARTCARD handle allocation */
mbed_official 340:28d1f895c6fe 316 if(hsmartcard == HAL_NULL)
mbed_official 340:28d1f895c6fe 317 {
mbed_official 340:28d1f895c6fe 318 return HAL_ERROR;
mbed_official 340:28d1f895c6fe 319 }
mbed_official 340:28d1f895c6fe 320
mbed_official 340:28d1f895c6fe 321 /* Check the parameters */
mbed_official 340:28d1f895c6fe 322 assert_param(IS_SMARTCARD_INSTANCE(hsmartcard->Instance));
mbed_official 340:28d1f895c6fe 323
mbed_official 340:28d1f895c6fe 324 hsmartcard->State = HAL_SMARTCARD_STATE_BUSY;
mbed_official 340:28d1f895c6fe 325
mbed_official 340:28d1f895c6fe 326 /* Disable the Peripheral */
mbed_official 340:28d1f895c6fe 327 __HAL_SMARTCARD_DISABLE(hsmartcard);
mbed_official 340:28d1f895c6fe 328
mbed_official 340:28d1f895c6fe 329 hsmartcard->Instance->CR1 = 0x0;
mbed_official 340:28d1f895c6fe 330 hsmartcard->Instance->CR2 = 0x0;
mbed_official 340:28d1f895c6fe 331 hsmartcard->Instance->CR3 = 0x0;
mbed_official 340:28d1f895c6fe 332 hsmartcard->Instance->RTOR = 0x0;
mbed_official 340:28d1f895c6fe 333 hsmartcard->Instance->GTPR = 0x0;
mbed_official 340:28d1f895c6fe 334
mbed_official 340:28d1f895c6fe 335 /* DeInit the low level hardware */
mbed_official 340:28d1f895c6fe 336 HAL_SMARTCARD_MspDeInit(hsmartcard);
mbed_official 340:28d1f895c6fe 337
mbed_official 340:28d1f895c6fe 338 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
mbed_official 340:28d1f895c6fe 339 hsmartcard->State = HAL_SMARTCARD_STATE_RESET;
mbed_official 340:28d1f895c6fe 340
mbed_official 340:28d1f895c6fe 341 /* Process Unlock */
mbed_official 340:28d1f895c6fe 342 __HAL_UNLOCK(hsmartcard);
mbed_official 340:28d1f895c6fe 343
mbed_official 340:28d1f895c6fe 344 return HAL_OK;
mbed_official 340:28d1f895c6fe 345 }
mbed_official 340:28d1f895c6fe 346
mbed_official 340:28d1f895c6fe 347 /**
mbed_official 340:28d1f895c6fe 348 * @brief SMARTCARD MSP Init
mbed_official 340:28d1f895c6fe 349 * @param hsmartcard: SMARTCARD handle
mbed_official 340:28d1f895c6fe 350 * @retval None
mbed_official 340:28d1f895c6fe 351 */
mbed_official 340:28d1f895c6fe 352 __weak void HAL_SMARTCARD_MspInit(SMARTCARD_HandleTypeDef *hsmartcard)
mbed_official 340:28d1f895c6fe 353 {
mbed_official 340:28d1f895c6fe 354 /* NOTE : This function should not be modified, when the callback is needed,
mbed_official 340:28d1f895c6fe 355 the HAL_SMARTCARD_MspInit can be implemented in the user file
mbed_official 340:28d1f895c6fe 356 */
mbed_official 340:28d1f895c6fe 357 }
mbed_official 340:28d1f895c6fe 358
mbed_official 340:28d1f895c6fe 359 /**
mbed_official 340:28d1f895c6fe 360 * @brief SMARTCARD MSP DeInit
mbed_official 340:28d1f895c6fe 361 * @param hsmartcard: SMARTCARD handle
mbed_official 340:28d1f895c6fe 362 * @retval None
mbed_official 340:28d1f895c6fe 363 */
mbed_official 340:28d1f895c6fe 364 __weak void HAL_SMARTCARD_MspDeInit(SMARTCARD_HandleTypeDef *hsmartcard)
mbed_official 340:28d1f895c6fe 365 {
mbed_official 340:28d1f895c6fe 366 /* NOTE : This function should not be modified, when the callback is needed,
mbed_official 340:28d1f895c6fe 367 the HAL_SMARTCARD_MspDeInit can be implemented in the user file
mbed_official 340:28d1f895c6fe 368 */
mbed_official 340:28d1f895c6fe 369 }
mbed_official 340:28d1f895c6fe 370
mbed_official 340:28d1f895c6fe 371 /**
mbed_official 340:28d1f895c6fe 372 * @}
mbed_official 340:28d1f895c6fe 373 */
mbed_official 340:28d1f895c6fe 374
mbed_official 340:28d1f895c6fe 375 /** @defgroup SMARTCARD_Exported_Functions_Group2 IO operation functions
mbed_official 340:28d1f895c6fe 376 * @brief SMARTCARD Transmit and Receive functions
mbed_official 340:28d1f895c6fe 377 *
mbed_official 340:28d1f895c6fe 378 @verbatim
mbed_official 340:28d1f895c6fe 379 ===============================================================================
mbed_official 340:28d1f895c6fe 380 ##### IO operation functions #####
mbed_official 340:28d1f895c6fe 381 ===============================================================================
mbed_official 340:28d1f895c6fe 382 [..]
mbed_official 340:28d1f895c6fe 383 This subsection provides a set of functions allowing to manage the SMARTCARD data transfers.
mbed_official 340:28d1f895c6fe 384
mbed_official 340:28d1f895c6fe 385 [..]
mbed_official 340:28d1f895c6fe 386 Smartcard is a single wire half duplex communication protocol.
mbed_official 340:28d1f895c6fe 387 The Smartcard interface is designed to support asynchronous protocol Smartcards as
mbed_official 340:28d1f895c6fe 388 defined in the ISO 7816-3 standard. The USART should be configured as:
mbed_official 340:28d1f895c6fe 389 - 8 bits plus parity: where M=1 and PCE=1 in the USART_CR1 register
mbed_official 340:28d1f895c6fe 390 - 1.5 stop bits when transmitting and receiving: where STOP=11 in the USART_CR2 register.
mbed_official 340:28d1f895c6fe 391
mbed_official 340:28d1f895c6fe 392 (#) There are two modes of transfer:
mbed_official 340:28d1f895c6fe 393 (++) Blocking mode: The communication is performed in polling mode.
mbed_official 340:28d1f895c6fe 394 The HAL status of all data processing is returned by the same function
mbed_official 340:28d1f895c6fe 395 after finishing transfer.
mbed_official 340:28d1f895c6fe 396 (++) No-Blocking mode: The communication is performed using Interrupts
mbed_official 340:28d1f895c6fe 397 or DMA, These API s return the HAL status.
mbed_official 340:28d1f895c6fe 398 The end of the data processing will be indicated through the
mbed_official 340:28d1f895c6fe 399 dedicated SMARTCARD IRQ when using Interrupt mode or the DMA IRQ when
mbed_official 340:28d1f895c6fe 400 using DMA mode.
mbed_official 340:28d1f895c6fe 401 The HAL_SMARTCARD_TxCpltCallback(), HAL_SMARTCARD_RxCpltCallback() user callbacks
mbed_official 340:28d1f895c6fe 402 will be executed respectivelly at the end of the transmit or Receive process
mbed_official 340:28d1f895c6fe 403 The HAL_SMARTCARD_ErrorCallback()user callback will be executed when a communication error is detected
mbed_official 340:28d1f895c6fe 404
mbed_official 340:28d1f895c6fe 405 (#) Blocking mode API s are :
mbed_official 340:28d1f895c6fe 406 (++) HAL_SMARTCARD_Transmit()
mbed_official 340:28d1f895c6fe 407 (++) HAL_SMARTCARD_Receive()
mbed_official 340:28d1f895c6fe 408
mbed_official 340:28d1f895c6fe 409 (#) Non Blocking mode API s with Interrupt are :
mbed_official 340:28d1f895c6fe 410 (++) HAL_SMARTCARD_Transmit_IT()
mbed_official 340:28d1f895c6fe 411 (++) HAL_SMARTCARD_Receive_IT()
mbed_official 340:28d1f895c6fe 412 (++) HAL_SMARTCARD_IRQHandler()
mbed_official 340:28d1f895c6fe 413
mbed_official 340:28d1f895c6fe 414 (#) Non Blocking mode functions with DMA are :
mbed_official 340:28d1f895c6fe 415 (++) HAL_SMARTCARD_Transmit_DMA()
mbed_official 340:28d1f895c6fe 416 (++) HAL_SMARTCARD_Receive_DMA()
mbed_official 340:28d1f895c6fe 417
mbed_official 340:28d1f895c6fe 418 (#) A set of Transfer Complete Callbacks are provided in non Blocking mode:
mbed_official 340:28d1f895c6fe 419 (++) HAL_SMARTCARD_TxCpltCallback()
mbed_official 340:28d1f895c6fe 420 (++) HAL_SMARTCARD_RxCpltCallback()
mbed_official 340:28d1f895c6fe 421 (++) HAL_SMARTCARD_ErrorCallback()
mbed_official 340:28d1f895c6fe 422
mbed_official 340:28d1f895c6fe 423 @endverbatim
mbed_official 340:28d1f895c6fe 424 * @{
mbed_official 340:28d1f895c6fe 425 */
mbed_official 340:28d1f895c6fe 426
mbed_official 340:28d1f895c6fe 427 /**
mbed_official 340:28d1f895c6fe 428 * @brief Send an amount of data in blocking mode
mbed_official 340:28d1f895c6fe 429 * @param hsmartcard: SMARTCARD handle
mbed_official 340:28d1f895c6fe 430 * @param pData: pointer to data buffer
mbed_official 340:28d1f895c6fe 431 * @param Size: amount of data to be sent
mbed_official 340:28d1f895c6fe 432 * @param Timeout : Timeout duration
mbed_official 340:28d1f895c6fe 433 * @retval HAL status
mbed_official 340:28d1f895c6fe 434 */
mbed_official 340:28d1f895c6fe 435 HAL_StatusTypeDef HAL_SMARTCARD_Transmit(SMARTCARD_HandleTypeDef *hsmartcard, uint8_t *pData, uint16_t Size, uint32_t Timeout)
mbed_official 340:28d1f895c6fe 436 {
mbed_official 340:28d1f895c6fe 437 if ((hsmartcard->State == HAL_SMARTCARD_STATE_READY) || (hsmartcard->State == HAL_SMARTCARD_STATE_BUSY_RX))
mbed_official 340:28d1f895c6fe 438 {
mbed_official 340:28d1f895c6fe 439 if((pData == HAL_NULL) || (Size == 0))
mbed_official 340:28d1f895c6fe 440 {
mbed_official 340:28d1f895c6fe 441 return HAL_ERROR;
mbed_official 340:28d1f895c6fe 442 }
mbed_official 340:28d1f895c6fe 443
mbed_official 340:28d1f895c6fe 444 /* Process Locked */
mbed_official 340:28d1f895c6fe 445 __HAL_LOCK(hsmartcard);
mbed_official 340:28d1f895c6fe 446 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
mbed_official 340:28d1f895c6fe 447 /* Check if a non-blocking receive process is ongoing or not */
mbed_official 340:28d1f895c6fe 448 if(hsmartcard->State == HAL_SMARTCARD_STATE_BUSY_RX)
mbed_official 340:28d1f895c6fe 449 {
mbed_official 340:28d1f895c6fe 450 hsmartcard->State = HAL_SMARTCARD_STATE_BUSY_TX_RX;
mbed_official 340:28d1f895c6fe 451 }
mbed_official 340:28d1f895c6fe 452 else
mbed_official 340:28d1f895c6fe 453 {
mbed_official 340:28d1f895c6fe 454 hsmartcard->State = HAL_SMARTCARD_STATE_BUSY_TX;
mbed_official 340:28d1f895c6fe 455 }
mbed_official 340:28d1f895c6fe 456
mbed_official 340:28d1f895c6fe 457 hsmartcard->TxXferSize = Size;
mbed_official 340:28d1f895c6fe 458 hsmartcard->TxXferCount = Size;
mbed_official 340:28d1f895c6fe 459 while(hsmartcard->TxXferCount > 0)
mbed_official 340:28d1f895c6fe 460 {
mbed_official 340:28d1f895c6fe 461 hsmartcard->TxXferCount--;
mbed_official 340:28d1f895c6fe 462 if(SMARTCARD_WaitOnFlagUntilTimeout(hsmartcard, SMARTCARD_FLAG_TXE, RESET, Timeout) != HAL_OK)
mbed_official 340:28d1f895c6fe 463 {
mbed_official 340:28d1f895c6fe 464 return HAL_TIMEOUT;
mbed_official 340:28d1f895c6fe 465 }
mbed_official 340:28d1f895c6fe 466 hsmartcard->Instance->TDR = (*pData++ & (uint8_t)0xFF);
mbed_official 340:28d1f895c6fe 467 }
mbed_official 340:28d1f895c6fe 468 if(SMARTCARD_WaitOnFlagUntilTimeout(hsmartcard, SMARTCARD_FLAG_TC, RESET, Timeout) != HAL_OK)
mbed_official 340:28d1f895c6fe 469 {
mbed_official 340:28d1f895c6fe 470 return HAL_TIMEOUT;
mbed_official 340:28d1f895c6fe 471 }
mbed_official 340:28d1f895c6fe 472 /* Check if a non-blocking receive Process is ongoing or not */
mbed_official 340:28d1f895c6fe 473 if(hsmartcard->State == HAL_SMARTCARD_STATE_BUSY_TX_RX)
mbed_official 340:28d1f895c6fe 474 {
mbed_official 340:28d1f895c6fe 475 hsmartcard->State = HAL_SMARTCARD_STATE_BUSY_RX;
mbed_official 340:28d1f895c6fe 476 }
mbed_official 340:28d1f895c6fe 477 else
mbed_official 340:28d1f895c6fe 478 {
mbed_official 340:28d1f895c6fe 479 hsmartcard->State = HAL_SMARTCARD_STATE_READY;
mbed_official 340:28d1f895c6fe 480 }
mbed_official 340:28d1f895c6fe 481
mbed_official 340:28d1f895c6fe 482 /* Process Unlocked */
mbed_official 340:28d1f895c6fe 483 __HAL_UNLOCK(hsmartcard);
mbed_official 340:28d1f895c6fe 484
mbed_official 340:28d1f895c6fe 485 return HAL_OK;
mbed_official 340:28d1f895c6fe 486 }
mbed_official 340:28d1f895c6fe 487 else
mbed_official 340:28d1f895c6fe 488 {
mbed_official 340:28d1f895c6fe 489 return HAL_BUSY;
mbed_official 340:28d1f895c6fe 490 }
mbed_official 340:28d1f895c6fe 491 }
mbed_official 340:28d1f895c6fe 492
mbed_official 340:28d1f895c6fe 493 /**
mbed_official 340:28d1f895c6fe 494 * @brief Receive an amount of data in blocking mode
mbed_official 340:28d1f895c6fe 495 * @param hsmartcard: SMARTCARD handle
mbed_official 340:28d1f895c6fe 496 * @param pData: pointer to data buffer
mbed_official 340:28d1f895c6fe 497 * @param Size: amount of data to be received
mbed_official 340:28d1f895c6fe 498 * @param Timeout : Timeout duration
mbed_official 340:28d1f895c6fe 499 * @retval HAL status
mbed_official 340:28d1f895c6fe 500 */
mbed_official 340:28d1f895c6fe 501 HAL_StatusTypeDef HAL_SMARTCARD_Receive(SMARTCARD_HandleTypeDef *hsmartcard, uint8_t *pData, uint16_t Size, uint32_t Timeout)
mbed_official 340:28d1f895c6fe 502 {
mbed_official 340:28d1f895c6fe 503 if ((hsmartcard->State == HAL_SMARTCARD_STATE_READY) || (hsmartcard->State == HAL_SMARTCARD_STATE_BUSY_TX))
mbed_official 340:28d1f895c6fe 504 {
mbed_official 340:28d1f895c6fe 505 if((pData == HAL_NULL) || (Size == 0))
mbed_official 340:28d1f895c6fe 506 {
mbed_official 340:28d1f895c6fe 507 return HAL_ERROR;
mbed_official 340:28d1f895c6fe 508 }
mbed_official 340:28d1f895c6fe 509
mbed_official 340:28d1f895c6fe 510 /* Process Locked */
mbed_official 340:28d1f895c6fe 511 __HAL_LOCK(hsmartcard);
mbed_official 340:28d1f895c6fe 512
mbed_official 340:28d1f895c6fe 513 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
mbed_official 340:28d1f895c6fe 514 /* Check if a non-blocking transmit process is ongoing or not */
mbed_official 340:28d1f895c6fe 515 if(hsmartcard->State == HAL_SMARTCARD_STATE_BUSY_TX)
mbed_official 340:28d1f895c6fe 516 {
mbed_official 340:28d1f895c6fe 517 hsmartcard->State = HAL_SMARTCARD_STATE_BUSY_TX_RX;
mbed_official 340:28d1f895c6fe 518 }
mbed_official 340:28d1f895c6fe 519 else
mbed_official 340:28d1f895c6fe 520 {
mbed_official 340:28d1f895c6fe 521 hsmartcard->State = HAL_SMARTCARD_STATE_BUSY_RX;
mbed_official 340:28d1f895c6fe 522 }
mbed_official 340:28d1f895c6fe 523
mbed_official 340:28d1f895c6fe 524 hsmartcard->RxXferSize = Size;
mbed_official 340:28d1f895c6fe 525 hsmartcard->RxXferCount = Size;
mbed_official 340:28d1f895c6fe 526 /* Check the remain data to be received */
mbed_official 340:28d1f895c6fe 527 while(hsmartcard->RxXferCount > 0)
mbed_official 340:28d1f895c6fe 528 {
mbed_official 340:28d1f895c6fe 529 hsmartcard->RxXferCount--;
mbed_official 340:28d1f895c6fe 530 if(SMARTCARD_WaitOnFlagUntilTimeout(hsmartcard, SMARTCARD_FLAG_RXNE, RESET, Timeout) != HAL_OK)
mbed_official 340:28d1f895c6fe 531 {
mbed_official 340:28d1f895c6fe 532 return HAL_TIMEOUT;
mbed_official 340:28d1f895c6fe 533 }
mbed_official 340:28d1f895c6fe 534 *pData++ = (uint8_t)(hsmartcard->Instance->RDR & (uint8_t)0x00FF);
mbed_official 340:28d1f895c6fe 535 }
mbed_official 340:28d1f895c6fe 536
mbed_official 340:28d1f895c6fe 537 /* Check if a non-blocking transmit Process is ongoing or not */
mbed_official 340:28d1f895c6fe 538 if(hsmartcard->State == HAL_SMARTCARD_STATE_BUSY_TX_RX)
mbed_official 340:28d1f895c6fe 539 {
mbed_official 340:28d1f895c6fe 540 hsmartcard->State = HAL_SMARTCARD_STATE_BUSY_TX;
mbed_official 340:28d1f895c6fe 541 }
mbed_official 340:28d1f895c6fe 542 else
mbed_official 340:28d1f895c6fe 543 {
mbed_official 340:28d1f895c6fe 544 hsmartcard->State = HAL_SMARTCARD_STATE_READY;
mbed_official 340:28d1f895c6fe 545 }
mbed_official 340:28d1f895c6fe 546
mbed_official 340:28d1f895c6fe 547 /* Process Unlocked */
mbed_official 340:28d1f895c6fe 548 __HAL_UNLOCK(hsmartcard);
mbed_official 340:28d1f895c6fe 549
mbed_official 340:28d1f895c6fe 550 return HAL_OK;
mbed_official 340:28d1f895c6fe 551 }
mbed_official 340:28d1f895c6fe 552 else
mbed_official 340:28d1f895c6fe 553 {
mbed_official 340:28d1f895c6fe 554 return HAL_BUSY;
mbed_official 340:28d1f895c6fe 555 }
mbed_official 340:28d1f895c6fe 556 }
mbed_official 340:28d1f895c6fe 557
mbed_official 340:28d1f895c6fe 558 /**
mbed_official 340:28d1f895c6fe 559 * @brief Send an amount of data in interrupt mode
mbed_official 340:28d1f895c6fe 560 * @param hsmartcard: SMARTCARD handle
mbed_official 340:28d1f895c6fe 561 * @param pData: pointer to data buffer
mbed_official 340:28d1f895c6fe 562 * @param Size: amount of data to be sent
mbed_official 340:28d1f895c6fe 563 * @retval HAL status
mbed_official 340:28d1f895c6fe 564 */
mbed_official 340:28d1f895c6fe 565 HAL_StatusTypeDef HAL_SMARTCARD_Transmit_IT(SMARTCARD_HandleTypeDef *hsmartcard, uint8_t *pData, uint16_t Size)
mbed_official 340:28d1f895c6fe 566 {
mbed_official 340:28d1f895c6fe 567 if ((hsmartcard->State == HAL_SMARTCARD_STATE_READY) || (hsmartcard->State == HAL_SMARTCARD_STATE_BUSY_RX))
mbed_official 340:28d1f895c6fe 568 {
mbed_official 340:28d1f895c6fe 569 if((pData == HAL_NULL) || (Size == 0))
mbed_official 340:28d1f895c6fe 570 {
mbed_official 340:28d1f895c6fe 571 return HAL_ERROR;
mbed_official 340:28d1f895c6fe 572 }
mbed_official 340:28d1f895c6fe 573
mbed_official 340:28d1f895c6fe 574 /* Process Locked */
mbed_official 340:28d1f895c6fe 575 __HAL_LOCK(hsmartcard);
mbed_official 340:28d1f895c6fe 576
mbed_official 340:28d1f895c6fe 577 hsmartcard->pTxBuffPtr = pData;
mbed_official 340:28d1f895c6fe 578 hsmartcard->TxXferSize = Size;
mbed_official 340:28d1f895c6fe 579 hsmartcard->TxXferCount = Size;
mbed_official 340:28d1f895c6fe 580
mbed_official 340:28d1f895c6fe 581 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
mbed_official 340:28d1f895c6fe 582 /* Check if a receive process is ongoing or not */
mbed_official 340:28d1f895c6fe 583 if(hsmartcard->State == HAL_SMARTCARD_STATE_BUSY_RX)
mbed_official 340:28d1f895c6fe 584 {
mbed_official 340:28d1f895c6fe 585 hsmartcard->State = HAL_SMARTCARD_STATE_BUSY_TX_RX;
mbed_official 340:28d1f895c6fe 586 }
mbed_official 340:28d1f895c6fe 587 else
mbed_official 340:28d1f895c6fe 588 {
mbed_official 340:28d1f895c6fe 589 hsmartcard->State = HAL_SMARTCARD_STATE_BUSY_TX;
mbed_official 340:28d1f895c6fe 590 }
mbed_official 340:28d1f895c6fe 591
mbed_official 340:28d1f895c6fe 592 /* Enable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */
mbed_official 340:28d1f895c6fe 593 __HAL_SMARTCARD_ENABLE_IT(hsmartcard, SMARTCARD_IT_ERR);
mbed_official 340:28d1f895c6fe 594
mbed_official 340:28d1f895c6fe 595 /* Process Unlocked */
mbed_official 340:28d1f895c6fe 596 __HAL_UNLOCK(hsmartcard);
mbed_official 340:28d1f895c6fe 597
mbed_official 340:28d1f895c6fe 598 /* Enable the SMARTCARD Transmit Data Register Empty Interrupt */
mbed_official 340:28d1f895c6fe 599 __HAL_SMARTCARD_ENABLE_IT(hsmartcard, SMARTCARD_IT_TXE);
mbed_official 340:28d1f895c6fe 600
mbed_official 340:28d1f895c6fe 601 return HAL_OK;
mbed_official 340:28d1f895c6fe 602 }
mbed_official 340:28d1f895c6fe 603 else
mbed_official 340:28d1f895c6fe 604 {
mbed_official 340:28d1f895c6fe 605 return HAL_BUSY;
mbed_official 340:28d1f895c6fe 606 }
mbed_official 340:28d1f895c6fe 607 }
mbed_official 340:28d1f895c6fe 608
mbed_official 340:28d1f895c6fe 609 /**
mbed_official 340:28d1f895c6fe 610 * @brief Receive an amount of data in interrupt mode
mbed_official 340:28d1f895c6fe 611 * @param hsmartcard: SMARTCARD handle
mbed_official 340:28d1f895c6fe 612 * @param pData: pointer to data buffer
mbed_official 340:28d1f895c6fe 613 * @param Size: amount of data to be received
mbed_official 340:28d1f895c6fe 614 * @retval HAL status
mbed_official 340:28d1f895c6fe 615 */
mbed_official 340:28d1f895c6fe 616 HAL_StatusTypeDef HAL_SMARTCARD_Receive_IT(SMARTCARD_HandleTypeDef *hsmartcard, uint8_t *pData, uint16_t Size)
mbed_official 340:28d1f895c6fe 617 {
mbed_official 340:28d1f895c6fe 618 if ((hsmartcard->State == HAL_SMARTCARD_STATE_READY) || (hsmartcard->State == HAL_SMARTCARD_STATE_BUSY_TX))
mbed_official 340:28d1f895c6fe 619 {
mbed_official 340:28d1f895c6fe 620 if((pData == HAL_NULL) || (Size == 0))
mbed_official 340:28d1f895c6fe 621 {
mbed_official 340:28d1f895c6fe 622 return HAL_ERROR;
mbed_official 340:28d1f895c6fe 623 }
mbed_official 340:28d1f895c6fe 624
mbed_official 340:28d1f895c6fe 625 /* Process Locked */
mbed_official 340:28d1f895c6fe 626 __HAL_LOCK(hsmartcard);
mbed_official 340:28d1f895c6fe 627
mbed_official 340:28d1f895c6fe 628 hsmartcard->pRxBuffPtr = pData;
mbed_official 340:28d1f895c6fe 629 hsmartcard->RxXferSize = Size;
mbed_official 340:28d1f895c6fe 630 hsmartcard->RxXferCount = Size;
mbed_official 340:28d1f895c6fe 631
mbed_official 340:28d1f895c6fe 632 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
mbed_official 340:28d1f895c6fe 633 /* Check if a transmit process is ongoing or not */
mbed_official 340:28d1f895c6fe 634 if(hsmartcard->State == HAL_SMARTCARD_STATE_BUSY_TX)
mbed_official 340:28d1f895c6fe 635 {
mbed_official 340:28d1f895c6fe 636 hsmartcard->State = HAL_SMARTCARD_STATE_BUSY_TX_RX;
mbed_official 340:28d1f895c6fe 637 }
mbed_official 340:28d1f895c6fe 638 else
mbed_official 340:28d1f895c6fe 639 {
mbed_official 340:28d1f895c6fe 640 hsmartcard->State = HAL_SMARTCARD_STATE_BUSY_RX;
mbed_official 340:28d1f895c6fe 641 }
mbed_official 340:28d1f895c6fe 642
mbed_official 340:28d1f895c6fe 643 /* Enable the SMARTCARD Parity Error Interrupt */
mbed_official 340:28d1f895c6fe 644 __HAL_SMARTCARD_ENABLE_IT(hsmartcard, SMARTCARD_IT_PE);
mbed_official 340:28d1f895c6fe 645
mbed_official 340:28d1f895c6fe 646 /* Enable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */
mbed_official 340:28d1f895c6fe 647 __HAL_SMARTCARD_ENABLE_IT(hsmartcard, SMARTCARD_IT_ERR);
mbed_official 340:28d1f895c6fe 648
mbed_official 340:28d1f895c6fe 649 /* Process Unlocked */
mbed_official 340:28d1f895c6fe 650 __HAL_UNLOCK(hsmartcard);
mbed_official 340:28d1f895c6fe 651
mbed_official 340:28d1f895c6fe 652 /* Enable the SMARTCARD Data Register not empty Interrupt */
mbed_official 340:28d1f895c6fe 653 __HAL_SMARTCARD_ENABLE_IT(hsmartcard, SMARTCARD_IT_RXNE);
mbed_official 340:28d1f895c6fe 654
mbed_official 340:28d1f895c6fe 655 return HAL_OK;
mbed_official 340:28d1f895c6fe 656 }
mbed_official 340:28d1f895c6fe 657 else
mbed_official 340:28d1f895c6fe 658 {
mbed_official 340:28d1f895c6fe 659 return HAL_BUSY;
mbed_official 340:28d1f895c6fe 660 }
mbed_official 340:28d1f895c6fe 661 }
mbed_official 340:28d1f895c6fe 662
mbed_official 340:28d1f895c6fe 663 /**
mbed_official 340:28d1f895c6fe 664 * @brief Send an amount of data in DMA mode
mbed_official 340:28d1f895c6fe 665 * @param hsmartcard: SMARTCARD handle
mbed_official 340:28d1f895c6fe 666 * @param pData: pointer to data buffer
mbed_official 340:28d1f895c6fe 667 * @param Size: amount of data to be sent
mbed_official 340:28d1f895c6fe 668 * @retval HAL status
mbed_official 340:28d1f895c6fe 669 */
mbed_official 340:28d1f895c6fe 670 HAL_StatusTypeDef HAL_SMARTCARD_Transmit_DMA(SMARTCARD_HandleTypeDef *hsmartcard, uint8_t *pData, uint16_t Size)
mbed_official 340:28d1f895c6fe 671 {
mbed_official 340:28d1f895c6fe 672 uint32_t *tmp;
mbed_official 340:28d1f895c6fe 673
mbed_official 340:28d1f895c6fe 674 if ((hsmartcard->State == HAL_SMARTCARD_STATE_READY) || (hsmartcard->State == HAL_SMARTCARD_STATE_BUSY_RX))
mbed_official 340:28d1f895c6fe 675 {
mbed_official 340:28d1f895c6fe 676 if((pData == HAL_NULL) || (Size == 0))
mbed_official 340:28d1f895c6fe 677 {
mbed_official 340:28d1f895c6fe 678 return HAL_ERROR;
mbed_official 340:28d1f895c6fe 679 }
mbed_official 340:28d1f895c6fe 680
mbed_official 340:28d1f895c6fe 681 /* Process Locked */
mbed_official 340:28d1f895c6fe 682 __HAL_LOCK(hsmartcard);
mbed_official 340:28d1f895c6fe 683
mbed_official 340:28d1f895c6fe 684 hsmartcard->pTxBuffPtr = pData;
mbed_official 340:28d1f895c6fe 685 hsmartcard->TxXferSize = Size;
mbed_official 340:28d1f895c6fe 686 hsmartcard->TxXferCount = Size;
mbed_official 340:28d1f895c6fe 687
mbed_official 340:28d1f895c6fe 688 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
mbed_official 340:28d1f895c6fe 689 /* Check if a receive process is ongoing or not */
mbed_official 340:28d1f895c6fe 690 if(hsmartcard->State == HAL_SMARTCARD_STATE_BUSY_RX)
mbed_official 340:28d1f895c6fe 691 {
mbed_official 340:28d1f895c6fe 692 hsmartcard->State = HAL_SMARTCARD_STATE_BUSY_TX_RX;
mbed_official 340:28d1f895c6fe 693 }
mbed_official 340:28d1f895c6fe 694 else
mbed_official 340:28d1f895c6fe 695 {
mbed_official 340:28d1f895c6fe 696 hsmartcard->State = HAL_SMARTCARD_STATE_BUSY_TX;
mbed_official 340:28d1f895c6fe 697 }
mbed_official 340:28d1f895c6fe 698
mbed_official 340:28d1f895c6fe 699 /* Set the SMARTCARD DMA transfer complete callback */
mbed_official 340:28d1f895c6fe 700 hsmartcard->hdmatx->XferCpltCallback = SMARTCARD_DMATransmitCplt;
mbed_official 340:28d1f895c6fe 701
mbed_official 340:28d1f895c6fe 702 /* Set the SMARTCARD error callback */
mbed_official 340:28d1f895c6fe 703 hsmartcard->hdmatx->XferErrorCallback = SMARTCARD_DMAError;
mbed_official 340:28d1f895c6fe 704
mbed_official 340:28d1f895c6fe 705 /* Enable the SMARTCARD transmit DMA channel */
mbed_official 340:28d1f895c6fe 706 tmp = (uint32_t*)&pData;
mbed_official 340:28d1f895c6fe 707 HAL_DMA_Start_IT(hsmartcard->hdmatx, *(uint32_t*)tmp, (uint32_t)&hsmartcard->Instance->TDR, Size);
mbed_official 340:28d1f895c6fe 708
mbed_official 340:28d1f895c6fe 709 /* Enable the DMA transfer for transmit request by setting the DMAT bit
mbed_official 340:28d1f895c6fe 710 in the SMARTCARD associated USART CR3 register */
mbed_official 340:28d1f895c6fe 711 hsmartcard->Instance->CR3 |= USART_CR3_DMAT;
mbed_official 340:28d1f895c6fe 712
mbed_official 340:28d1f895c6fe 713 /* Process Unlocked */
mbed_official 340:28d1f895c6fe 714 __HAL_UNLOCK(hsmartcard);
mbed_official 340:28d1f895c6fe 715
mbed_official 340:28d1f895c6fe 716 return HAL_OK;
mbed_official 340:28d1f895c6fe 717 }
mbed_official 340:28d1f895c6fe 718 else
mbed_official 340:28d1f895c6fe 719 {
mbed_official 340:28d1f895c6fe 720 return HAL_BUSY;
mbed_official 340:28d1f895c6fe 721 }
mbed_official 340:28d1f895c6fe 722 }
mbed_official 340:28d1f895c6fe 723
mbed_official 340:28d1f895c6fe 724 /**
mbed_official 340:28d1f895c6fe 725 * @brief Receive an amount of data in DMA mode
mbed_official 340:28d1f895c6fe 726 * @param hsmartcard: SMARTCARD handle
mbed_official 340:28d1f895c6fe 727 * @param pData: pointer to data buffer
mbed_official 340:28d1f895c6fe 728 * @param Size: amount of data to be received
mbed_official 340:28d1f895c6fe 729 * @note The SMARTCARD-associated USART parity is enabled (PCE = 1),
mbed_official 340:28d1f895c6fe 730 * the received data contain the parity bit (MSB position)
mbed_official 340:28d1f895c6fe 731 * @retval HAL status
mbed_official 340:28d1f895c6fe 732 */
mbed_official 340:28d1f895c6fe 733 HAL_StatusTypeDef HAL_SMARTCARD_Receive_DMA(SMARTCARD_HandleTypeDef *hsmartcard, uint8_t *pData, uint16_t Size)
mbed_official 340:28d1f895c6fe 734 {
mbed_official 340:28d1f895c6fe 735 uint32_t *tmp;
mbed_official 340:28d1f895c6fe 736
mbed_official 340:28d1f895c6fe 737 if ((hsmartcard->State == HAL_SMARTCARD_STATE_READY) || (hsmartcard->State == HAL_SMARTCARD_STATE_BUSY_TX))
mbed_official 340:28d1f895c6fe 738 {
mbed_official 340:28d1f895c6fe 739 if((pData == HAL_NULL) || (Size == 0))
mbed_official 340:28d1f895c6fe 740 {
mbed_official 340:28d1f895c6fe 741 return HAL_ERROR;
mbed_official 340:28d1f895c6fe 742 }
mbed_official 340:28d1f895c6fe 743
mbed_official 340:28d1f895c6fe 744 /* Process Locked */
mbed_official 340:28d1f895c6fe 745 __HAL_LOCK(hsmartcard);
mbed_official 340:28d1f895c6fe 746
mbed_official 340:28d1f895c6fe 747 hsmartcard->pRxBuffPtr = pData;
mbed_official 340:28d1f895c6fe 748 hsmartcard->RxXferSize = Size;
mbed_official 340:28d1f895c6fe 749
mbed_official 340:28d1f895c6fe 750 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
mbed_official 340:28d1f895c6fe 751 /* Check if a transmit rocess is ongoing or not */
mbed_official 340:28d1f895c6fe 752 if(hsmartcard->State == HAL_SMARTCARD_STATE_BUSY_TX)
mbed_official 340:28d1f895c6fe 753 {
mbed_official 340:28d1f895c6fe 754 hsmartcard->State = HAL_SMARTCARD_STATE_BUSY_TX_RX;
mbed_official 340:28d1f895c6fe 755 }
mbed_official 340:28d1f895c6fe 756 else
mbed_official 340:28d1f895c6fe 757 {
mbed_official 340:28d1f895c6fe 758 hsmartcard->State = HAL_SMARTCARD_STATE_BUSY_RX;
mbed_official 340:28d1f895c6fe 759 }
mbed_official 340:28d1f895c6fe 760
mbed_official 340:28d1f895c6fe 761 /* Set the SMARTCARD DMA transfer complete callback */
mbed_official 340:28d1f895c6fe 762 hsmartcard->hdmarx->XferCpltCallback = SMARTCARD_DMAReceiveCplt;
mbed_official 340:28d1f895c6fe 763
mbed_official 340:28d1f895c6fe 764 /* Set the SMARTCARD DMA error callback */
mbed_official 340:28d1f895c6fe 765 hsmartcard->hdmarx->XferErrorCallback = SMARTCARD_DMAError;
mbed_official 340:28d1f895c6fe 766
mbed_official 340:28d1f895c6fe 767 /* Enable the DMA channel */
mbed_official 340:28d1f895c6fe 768 tmp = (uint32_t*)&pData;
mbed_official 340:28d1f895c6fe 769 HAL_DMA_Start_IT(hsmartcard->hdmarx, (uint32_t)&hsmartcard->Instance->RDR, *(uint32_t*)tmp, Size);
mbed_official 340:28d1f895c6fe 770
mbed_official 340:28d1f895c6fe 771 /* Enable the DMA transfer for the receiver request by setting the DMAR bit
mbed_official 340:28d1f895c6fe 772 in the SMARTCARD associated USART CR3 register */
mbed_official 340:28d1f895c6fe 773 hsmartcard->Instance->CR3 |= USART_CR3_DMAR;
mbed_official 340:28d1f895c6fe 774
mbed_official 340:28d1f895c6fe 775 /* Process Unlocked */
mbed_official 340:28d1f895c6fe 776 __HAL_UNLOCK(hsmartcard);
mbed_official 340:28d1f895c6fe 777
mbed_official 340:28d1f895c6fe 778 return HAL_OK;
mbed_official 340:28d1f895c6fe 779 }
mbed_official 340:28d1f895c6fe 780 else
mbed_official 340:28d1f895c6fe 781 {
mbed_official 340:28d1f895c6fe 782 return HAL_BUSY;
mbed_official 340:28d1f895c6fe 783 }
mbed_official 340:28d1f895c6fe 784 }
mbed_official 340:28d1f895c6fe 785
mbed_official 340:28d1f895c6fe 786 /**
mbed_official 340:28d1f895c6fe 787 * @brief SMARTCARD interrupt requests handling.
mbed_official 340:28d1f895c6fe 788 * @param hsmartcard: SMARTCARD handle
mbed_official 340:28d1f895c6fe 789 * @retval None
mbed_official 340:28d1f895c6fe 790 */
mbed_official 340:28d1f895c6fe 791 void HAL_SMARTCARD_IRQHandler(SMARTCARD_HandleTypeDef *hsmartcard)
mbed_official 340:28d1f895c6fe 792 {
mbed_official 340:28d1f895c6fe 793 /* SMARTCARD parity error interrupt occurred -------------------------------------*/
mbed_official 340:28d1f895c6fe 794 if((__HAL_SMARTCARD_GET_IT(hsmartcard, SMARTCARD_IT_PE) != RESET) && (__HAL_SMARTCARD_GET_IT_SOURCE(hsmartcard, SMARTCARD_IT_PE) != RESET))
mbed_official 340:28d1f895c6fe 795 {
mbed_official 340:28d1f895c6fe 796 __HAL_SMARTCARD_CLEAR_IT(hsmartcard, SMARTCARD_CLEAR_PEF);
mbed_official 340:28d1f895c6fe 797 hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_PE;
mbed_official 340:28d1f895c6fe 798 /* Set the SMARTCARD state ready to be able to start again the process */
mbed_official 340:28d1f895c6fe 799 hsmartcard->State = HAL_SMARTCARD_STATE_READY;
mbed_official 340:28d1f895c6fe 800 }
mbed_official 340:28d1f895c6fe 801
mbed_official 340:28d1f895c6fe 802 /* SMARTCARD frame error interrupt occured --------------------------------------*/
mbed_official 340:28d1f895c6fe 803 if((__HAL_SMARTCARD_GET_IT(hsmartcard, SMARTCARD_IT_FE) != RESET) && (__HAL_SMARTCARD_GET_IT_SOURCE(hsmartcard, SMARTCARD_IT_ERR) != RESET))
mbed_official 340:28d1f895c6fe 804 {
mbed_official 340:28d1f895c6fe 805 __HAL_SMARTCARD_CLEAR_IT(hsmartcard, SMARTCARD_CLEAR_FEF);
mbed_official 340:28d1f895c6fe 806 hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_FE;
mbed_official 340:28d1f895c6fe 807 /* Set the SMARTCARD state ready to be able to start again the process */
mbed_official 340:28d1f895c6fe 808 hsmartcard->State = HAL_SMARTCARD_STATE_READY;
mbed_official 340:28d1f895c6fe 809 }
mbed_official 340:28d1f895c6fe 810
mbed_official 340:28d1f895c6fe 811 /* SMARTCARD noise error interrupt occured --------------------------------------*/
mbed_official 340:28d1f895c6fe 812 if((__HAL_SMARTCARD_GET_IT(hsmartcard, SMARTCARD_IT_NE) != RESET) && (__HAL_SMARTCARD_GET_IT_SOURCE(hsmartcard, SMARTCARD_IT_ERR) != RESET))
mbed_official 340:28d1f895c6fe 813 {
mbed_official 340:28d1f895c6fe 814 __HAL_SMARTCARD_CLEAR_IT(hsmartcard, SMARTCARD_CLEAR_NEF);
mbed_official 340:28d1f895c6fe 815 hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_NE;
mbed_official 340:28d1f895c6fe 816 /* Set the SMARTCARD state ready to be able to start again the process */
mbed_official 340:28d1f895c6fe 817 hsmartcard->State = HAL_SMARTCARD_STATE_READY;
mbed_official 340:28d1f895c6fe 818 }
mbed_official 340:28d1f895c6fe 819
mbed_official 340:28d1f895c6fe 820 /* SMARTCARD Over-Run interrupt occured -----------------------------------------*/
mbed_official 340:28d1f895c6fe 821 if((__HAL_SMARTCARD_GET_IT(hsmartcard, SMARTCARD_IT_ORE) != RESET) && (__HAL_SMARTCARD_GET_IT_SOURCE(hsmartcard, SMARTCARD_IT_ERR) != RESET))
mbed_official 340:28d1f895c6fe 822 {
mbed_official 340:28d1f895c6fe 823 __HAL_SMARTCARD_CLEAR_IT(hsmartcard, SMARTCARD_CLEAR_OREF);
mbed_official 340:28d1f895c6fe 824 hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_ORE;
mbed_official 340:28d1f895c6fe 825 /* Set the SMARTCARD state ready to be able to start again the process */
mbed_official 340:28d1f895c6fe 826 hsmartcard->State = HAL_SMARTCARD_STATE_READY;
mbed_official 340:28d1f895c6fe 827 }
mbed_official 340:28d1f895c6fe 828
mbed_official 340:28d1f895c6fe 829 /* SMARTCARD receiver timeout interrupt occured -----------------------------------------*/
mbed_official 340:28d1f895c6fe 830 if((__HAL_SMARTCARD_GET_IT(hsmartcard, SMARTCARD_IT_RTO) != RESET) && (__HAL_SMARTCARD_GET_IT_SOURCE(hsmartcard, SMARTCARD_IT_RTO) != RESET))
mbed_official 340:28d1f895c6fe 831 {
mbed_official 340:28d1f895c6fe 832 __HAL_SMARTCARD_CLEAR_IT(hsmartcard, SMARTCARD_CLEAR_RTOF);
mbed_official 340:28d1f895c6fe 833 hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_RTO;
mbed_official 340:28d1f895c6fe 834 /* Set the SMARTCARD state ready to be able to start again the process */
mbed_official 340:28d1f895c6fe 835 hsmartcard->State = HAL_SMARTCARD_STATE_READY;
mbed_official 340:28d1f895c6fe 836 }
mbed_official 340:28d1f895c6fe 837
mbed_official 340:28d1f895c6fe 838 /* Call SMARTCARD Error Call back function if need be --------------------------*/
mbed_official 340:28d1f895c6fe 839 if(hsmartcard->ErrorCode != HAL_SMARTCARD_ERROR_NONE)
mbed_official 340:28d1f895c6fe 840 {
mbed_official 340:28d1f895c6fe 841 HAL_SMARTCARD_ErrorCallback(hsmartcard);
mbed_official 340:28d1f895c6fe 842 }
mbed_official 340:28d1f895c6fe 843
mbed_official 340:28d1f895c6fe 844 /* SMARTCARD in mode Receiver ---------------------------------------------------*/
mbed_official 340:28d1f895c6fe 845 if((__HAL_SMARTCARD_GET_IT(hsmartcard, SMARTCARD_IT_RXNE) != RESET) && (__HAL_SMARTCARD_GET_IT_SOURCE(hsmartcard, SMARTCARD_IT_RXNE) != RESET))
mbed_official 340:28d1f895c6fe 846 {
mbed_official 340:28d1f895c6fe 847 SMARTCARD_Receive_IT(hsmartcard);
mbed_official 340:28d1f895c6fe 848 /* Clear RXNE interrupt flag */
mbed_official 340:28d1f895c6fe 849 __HAL_SMARTCARD_SEND_REQ(hsmartcard, SMARTCARD_RXDATA_FLUSH_REQUEST);
mbed_official 340:28d1f895c6fe 850 }
mbed_official 340:28d1f895c6fe 851
mbed_official 340:28d1f895c6fe 852 /* SMARTCARD in mode Receiver, end of block interruption ------------------------*/
mbed_official 340:28d1f895c6fe 853 if((__HAL_SMARTCARD_GET_IT(hsmartcard, SMARTCARD_IT_EOB) != RESET) && (__HAL_SMARTCARD_GET_IT_SOURCE(hsmartcard, SMARTCARD_IT_EOB) != RESET))
mbed_official 340:28d1f895c6fe 854 {
mbed_official 340:28d1f895c6fe 855 hsmartcard->State = HAL_SMARTCARD_STATE_READY;
mbed_official 340:28d1f895c6fe 856 __HAL_UNLOCK(hsmartcard);
mbed_official 340:28d1f895c6fe 857 HAL_SMARTCARD_RxCpltCallback(hsmartcard);
mbed_official 340:28d1f895c6fe 858 /* Clear EOBF interrupt after HAL_SMARTCARD_RxCpltCallback() call for the End of Block information
mbed_official 340:28d1f895c6fe 859 * to be available during HAL_SMARTCARD_RxCpltCallback() processing */
mbed_official 340:28d1f895c6fe 860 __HAL_SMARTCARD_CLEAR_IT(hsmartcard, SMARTCARD_CLEAR_EOBF);
mbed_official 340:28d1f895c6fe 861 }
mbed_official 340:28d1f895c6fe 862
mbed_official 340:28d1f895c6fe 863 /* SMARTCARD in mode Transmitter ------------------------------------------------*/
mbed_official 340:28d1f895c6fe 864 if((__HAL_SMARTCARD_GET_IT(hsmartcard, SMARTCARD_IT_TXE) != RESET) &&(__HAL_SMARTCARD_GET_IT_SOURCE(hsmartcard, SMARTCARD_IT_TXE) != RESET))
mbed_official 340:28d1f895c6fe 865 {
mbed_official 340:28d1f895c6fe 866 SMARTCARD_Transmit_IT(hsmartcard);
mbed_official 340:28d1f895c6fe 867 }
mbed_official 340:28d1f895c6fe 868
mbed_official 340:28d1f895c6fe 869 /* SMARTCARD in mode Transmitter (transmission end) ------------------------*/
mbed_official 340:28d1f895c6fe 870 if((__HAL_SMARTCARD_GET_IT(hsmartcard, SMARTCARD_IT_TC) != RESET) &&(__HAL_SMARTCARD_GET_IT_SOURCE(hsmartcard, SMARTCARD_IT_TC) != RESET))
mbed_official 340:28d1f895c6fe 871 {
mbed_official 340:28d1f895c6fe 872 SMARTCARD_EndTransmit_IT(hsmartcard);
mbed_official 340:28d1f895c6fe 873 }
mbed_official 340:28d1f895c6fe 874 }
mbed_official 340:28d1f895c6fe 875
mbed_official 340:28d1f895c6fe 876 /**
mbed_official 340:28d1f895c6fe 877 * @brief Tx Transfer completed callbacks
mbed_official 340:28d1f895c6fe 878 * @param hsmartcard: SMARTCARD handle
mbed_official 340:28d1f895c6fe 879 * @retval None
mbed_official 340:28d1f895c6fe 880 */
mbed_official 340:28d1f895c6fe 881 __weak void HAL_SMARTCARD_TxCpltCallback(SMARTCARD_HandleTypeDef *hsmartcard)
mbed_official 340:28d1f895c6fe 882 {
mbed_official 340:28d1f895c6fe 883 /* NOTE : This function should not be modified, when the callback is needed,
mbed_official 340:28d1f895c6fe 884 the HAL_SMARTCARD_TxCpltCallback can be implemented in the user file
mbed_official 340:28d1f895c6fe 885 */
mbed_official 340:28d1f895c6fe 886 }
mbed_official 340:28d1f895c6fe 887
mbed_official 340:28d1f895c6fe 888 /**
mbed_official 340:28d1f895c6fe 889 * @brief Rx Transfer completed callbacks
mbed_official 340:28d1f895c6fe 890 * @param hsmartcard: SMARTCARD handle
mbed_official 340:28d1f895c6fe 891 * @retval None
mbed_official 340:28d1f895c6fe 892 */
mbed_official 340:28d1f895c6fe 893 __weak void HAL_SMARTCARD_RxCpltCallback(SMARTCARD_HandleTypeDef *hsmartcard)
mbed_official 340:28d1f895c6fe 894 {
mbed_official 340:28d1f895c6fe 895 /* NOTE : This function should not be modified, when the callback is needed,
mbed_official 340:28d1f895c6fe 896 the HAL_SMARTCARD_TxCpltCallback can be implemented in the user file
mbed_official 340:28d1f895c6fe 897 */
mbed_official 340:28d1f895c6fe 898 }
mbed_official 340:28d1f895c6fe 899
mbed_official 340:28d1f895c6fe 900 /**
mbed_official 340:28d1f895c6fe 901 * @brief SMARTCARD error callbacks
mbed_official 340:28d1f895c6fe 902 * @param hsmartcard: SMARTCARD handle
mbed_official 340:28d1f895c6fe 903 * @retval None
mbed_official 340:28d1f895c6fe 904 */
mbed_official 340:28d1f895c6fe 905 __weak void HAL_SMARTCARD_ErrorCallback(SMARTCARD_HandleTypeDef *hsmartcard)
mbed_official 340:28d1f895c6fe 906 {
mbed_official 340:28d1f895c6fe 907 /* NOTE : This function should not be modified, when the callback is needed,
mbed_official 340:28d1f895c6fe 908 the HAL_SMARTCARD_ErrorCallback can be implemented in the user file
mbed_official 340:28d1f895c6fe 909 */
mbed_official 340:28d1f895c6fe 910 }
mbed_official 340:28d1f895c6fe 911
mbed_official 340:28d1f895c6fe 912 /**
mbed_official 340:28d1f895c6fe 913 * @}
mbed_official 340:28d1f895c6fe 914 */
mbed_official 340:28d1f895c6fe 915
mbed_official 340:28d1f895c6fe 916 /** @defgroup SMARTCARD_Exported_Functions_Group3 Peripheral State and Errors functions
mbed_official 340:28d1f895c6fe 917 * @brief SMARTCARD State and Errors functions
mbed_official 340:28d1f895c6fe 918 *
mbed_official 340:28d1f895c6fe 919 @verbatim
mbed_official 340:28d1f895c6fe 920 ==============================================================================
mbed_official 340:28d1f895c6fe 921 ##### Peripheral State and Errors functions #####
mbed_official 340:28d1f895c6fe 922 ==============================================================================
mbed_official 340:28d1f895c6fe 923 [..]
mbed_official 340:28d1f895c6fe 924 This subsection provides a set of functions allowing to return the State of SmartCard
mbed_official 340:28d1f895c6fe 925 communication process and also return Peripheral Errors occurred during communication process
mbed_official 340:28d1f895c6fe 926 (+) HAL_SMARTCARD_GetState() API can be helpful to check in run-time the state of the SMARTCARD peripheral
mbed_official 340:28d1f895c6fe 927 (+) HAL_SMARTCARD_GetError() check in run-time errors that could be occurred during
mbed_official 340:28d1f895c6fe 928 communication.
mbed_official 340:28d1f895c6fe 929
mbed_official 340:28d1f895c6fe 930 (+) SMARTCARD_SetConfig() API configures the SMARTCARD peripheral
mbed_official 340:28d1f895c6fe 931 (+) SMARTCARD_AdvFeatureConfig() API optionally configures the SMARTCARD advanced features
mbed_official 340:28d1f895c6fe 932 (+) SMARTCARD_CheckIdleState() API ensures that TEACK and/or REACK are set after initialization
mbed_official 340:28d1f895c6fe 933 @endverbatim
mbed_official 340:28d1f895c6fe 934 * @{
mbed_official 340:28d1f895c6fe 935 */
mbed_official 340:28d1f895c6fe 936
mbed_official 340:28d1f895c6fe 937 /**
mbed_official 340:28d1f895c6fe 938 * @brief return the SMARTCARD state
mbed_official 340:28d1f895c6fe 939 * @param hsmartcard: SMARTCARD handle
mbed_official 340:28d1f895c6fe 940 * @retval HAL state
mbed_official 340:28d1f895c6fe 941 */
mbed_official 340:28d1f895c6fe 942 HAL_SMARTCARD_StateTypeDef HAL_SMARTCARD_GetState(SMARTCARD_HandleTypeDef *hsmartcard)
mbed_official 340:28d1f895c6fe 943 {
mbed_official 340:28d1f895c6fe 944 return hsmartcard->State;
mbed_official 340:28d1f895c6fe 945 }
mbed_official 340:28d1f895c6fe 946
mbed_official 340:28d1f895c6fe 947 /**
mbed_official 340:28d1f895c6fe 948 * @brief Return the SMARTCARD error code
mbed_official 340:28d1f895c6fe 949 * @param hsmartcard : pointer to a SMARTCARD_HandleTypeDef structure that contains
mbed_official 340:28d1f895c6fe 950 * the configuration information for the specified SMARTCARD.
mbed_official 340:28d1f895c6fe 951 * @retval SMARTCARD Error Code
mbed_official 340:28d1f895c6fe 952 */
mbed_official 340:28d1f895c6fe 953 uint32_t HAL_SMARTCARD_GetError(SMARTCARD_HandleTypeDef *hsmartcard)
mbed_official 340:28d1f895c6fe 954 {
mbed_official 340:28d1f895c6fe 955 return hsmartcard->ErrorCode;
mbed_official 340:28d1f895c6fe 956 }
mbed_official 340:28d1f895c6fe 957
mbed_official 340:28d1f895c6fe 958 /**
mbed_official 340:28d1f895c6fe 959 * @}
mbed_official 340:28d1f895c6fe 960 */
mbed_official 340:28d1f895c6fe 961
mbed_official 340:28d1f895c6fe 962 /**
mbed_official 340:28d1f895c6fe 963 * @}
mbed_official 340:28d1f895c6fe 964 */
mbed_official 340:28d1f895c6fe 965
mbed_official 340:28d1f895c6fe 966 /** @defgroup SMARTCARD_Private_Functions SMARTCARD Private Functions
mbed_official 340:28d1f895c6fe 967 * @{
mbed_official 340:28d1f895c6fe 968 */
mbed_official 340:28d1f895c6fe 969
mbed_official 340:28d1f895c6fe 970 /**
mbed_official 340:28d1f895c6fe 971 * @brief This function handles SMARTCARD Communication Timeout.
mbed_official 340:28d1f895c6fe 972 * @param hsmartcard: SMARTCARD handle
mbed_official 340:28d1f895c6fe 973 * @param Flag: specifies the SMARTCARD flag to check.
mbed_official 340:28d1f895c6fe 974 * @param Status: The new Flag status (SET or RESET).
mbed_official 340:28d1f895c6fe 975 * @param Timeout: Timeout duration
mbed_official 340:28d1f895c6fe 976 * @retval HAL status
mbed_official 340:28d1f895c6fe 977 */
mbed_official 340:28d1f895c6fe 978 static HAL_StatusTypeDef SMARTCARD_WaitOnFlagUntilTimeout(SMARTCARD_HandleTypeDef *hsmartcard, uint32_t Flag, FlagStatus Status, uint32_t Timeout)
mbed_official 340:28d1f895c6fe 979 {
mbed_official 340:28d1f895c6fe 980 uint32_t tickstart = HAL_GetTick();
mbed_official 340:28d1f895c6fe 981
mbed_official 340:28d1f895c6fe 982 /* Wait until flag is set */
mbed_official 340:28d1f895c6fe 983 if(Status == RESET)
mbed_official 340:28d1f895c6fe 984 {
mbed_official 340:28d1f895c6fe 985 while(__HAL_SMARTCARD_GET_FLAG(hsmartcard, Flag) == RESET)
mbed_official 340:28d1f895c6fe 986 {
mbed_official 340:28d1f895c6fe 987 /* Check for the Timeout */
mbed_official 340:28d1f895c6fe 988 if(Timeout != HAL_MAX_DELAY)
mbed_official 340:28d1f895c6fe 989 {
mbed_official 340:28d1f895c6fe 990 if((Timeout == 0) || ((HAL_GetTick() - tickstart) > Timeout))
mbed_official 340:28d1f895c6fe 991 {
mbed_official 340:28d1f895c6fe 992 /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
mbed_official 340:28d1f895c6fe 993 __HAL_SMARTCARD_DISABLE_IT(hsmartcard, SMARTCARD_IT_TXE);
mbed_official 340:28d1f895c6fe 994 __HAL_SMARTCARD_DISABLE_IT(hsmartcard, SMARTCARD_IT_RXNE);
mbed_official 340:28d1f895c6fe 995 __HAL_SMARTCARD_DISABLE_IT(hsmartcard, SMARTCARD_IT_PE);
mbed_official 340:28d1f895c6fe 996 __HAL_SMARTCARD_DISABLE_IT(hsmartcard, SMARTCARD_IT_ERR);
mbed_official 340:28d1f895c6fe 997
mbed_official 340:28d1f895c6fe 998 hsmartcard->State= HAL_SMARTCARD_STATE_TIMEOUT;
mbed_official 340:28d1f895c6fe 999
mbed_official 340:28d1f895c6fe 1000 /* Process Unlocked */
mbed_official 340:28d1f895c6fe 1001 __HAL_UNLOCK(hsmartcard);
mbed_official 340:28d1f895c6fe 1002
mbed_official 340:28d1f895c6fe 1003 return HAL_TIMEOUT;
mbed_official 340:28d1f895c6fe 1004 }
mbed_official 340:28d1f895c6fe 1005 }
mbed_official 340:28d1f895c6fe 1006 }
mbed_official 340:28d1f895c6fe 1007 }
mbed_official 340:28d1f895c6fe 1008 else
mbed_official 340:28d1f895c6fe 1009 {
mbed_official 340:28d1f895c6fe 1010 while(__HAL_SMARTCARD_GET_FLAG(hsmartcard, Flag) != RESET)
mbed_official 340:28d1f895c6fe 1011 {
mbed_official 340:28d1f895c6fe 1012 /* Check for the Timeout */
mbed_official 340:28d1f895c6fe 1013 if(Timeout != HAL_MAX_DELAY)
mbed_official 340:28d1f895c6fe 1014 {
mbed_official 340:28d1f895c6fe 1015 if((Timeout == 0) || ((HAL_GetTick() - tickstart) > Timeout))
mbed_official 340:28d1f895c6fe 1016 {
mbed_official 340:28d1f895c6fe 1017 /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
mbed_official 340:28d1f895c6fe 1018 __HAL_SMARTCARD_DISABLE_IT(hsmartcard, SMARTCARD_IT_TXE);
mbed_official 340:28d1f895c6fe 1019 __HAL_SMARTCARD_DISABLE_IT(hsmartcard, SMARTCARD_IT_RXNE);
mbed_official 340:28d1f895c6fe 1020 __HAL_SMARTCARD_DISABLE_IT(hsmartcard, SMARTCARD_IT_PE);
mbed_official 340:28d1f895c6fe 1021 __HAL_SMARTCARD_DISABLE_IT(hsmartcard, SMARTCARD_IT_ERR);
mbed_official 340:28d1f895c6fe 1022
mbed_official 340:28d1f895c6fe 1023 hsmartcard->State= HAL_SMARTCARD_STATE_TIMEOUT;
mbed_official 340:28d1f895c6fe 1024
mbed_official 340:28d1f895c6fe 1025 /* Process Unlocked */
mbed_official 340:28d1f895c6fe 1026 __HAL_UNLOCK(hsmartcard);
mbed_official 340:28d1f895c6fe 1027
mbed_official 340:28d1f895c6fe 1028 return HAL_TIMEOUT;
mbed_official 340:28d1f895c6fe 1029 }
mbed_official 340:28d1f895c6fe 1030 }
mbed_official 340:28d1f895c6fe 1031 }
mbed_official 340:28d1f895c6fe 1032 }
mbed_official 340:28d1f895c6fe 1033 return HAL_OK;
mbed_official 340:28d1f895c6fe 1034 }
mbed_official 340:28d1f895c6fe 1035
mbed_official 340:28d1f895c6fe 1036 /**
mbed_official 340:28d1f895c6fe 1037 * @brief DMA SMARTCARD transmit process complete callback.
mbed_official 340:28d1f895c6fe 1038 * @param hdma: Pointer to a DMA_HandleTypeDef structure that contains
mbed_official 340:28d1f895c6fe 1039 * the configuration information for the specified DMA module.
mbed_official 340:28d1f895c6fe 1040 * @retval None
mbed_official 340:28d1f895c6fe 1041 */
mbed_official 340:28d1f895c6fe 1042 static void SMARTCARD_DMATransmitCplt(DMA_HandleTypeDef *hdma)
mbed_official 340:28d1f895c6fe 1043 {
mbed_official 340:28d1f895c6fe 1044 SMARTCARD_HandleTypeDef* hsmartcard = ( SMARTCARD_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 340:28d1f895c6fe 1045 hsmartcard->TxXferCount = 0;
mbed_official 340:28d1f895c6fe 1046
mbed_official 340:28d1f895c6fe 1047 /* Disable the DMA transfer for transmit request by resetting the DMAT bit
mbed_official 340:28d1f895c6fe 1048 in the SMARTCARD associated USART CR3 register */
mbed_official 340:28d1f895c6fe 1049 hsmartcard->Instance->CR3 &= (uint16_t)~((uint16_t)USART_CR3_DMAT);
mbed_official 340:28d1f895c6fe 1050
mbed_official 340:28d1f895c6fe 1051 /* Enable the SMARTCARD Transmit Complete Interrupt */
mbed_official 340:28d1f895c6fe 1052 __HAL_SMARTCARD_ENABLE_IT(hsmartcard, SMARTCARD_IT_TC);
mbed_official 340:28d1f895c6fe 1053 }
mbed_official 340:28d1f895c6fe 1054
mbed_official 340:28d1f895c6fe 1055 /**
mbed_official 340:28d1f895c6fe 1056 * @brief DMA SMARTCARD receive process complete callback.
mbed_official 340:28d1f895c6fe 1057 * @param hdma: Pointer to a DMA_HandleTypeDef structure that contains
mbed_official 340:28d1f895c6fe 1058 * the configuration information for the specified DMA module.
mbed_official 340:28d1f895c6fe 1059 * @retval None
mbed_official 340:28d1f895c6fe 1060 */
mbed_official 340:28d1f895c6fe 1061 static void SMARTCARD_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
mbed_official 340:28d1f895c6fe 1062 {
mbed_official 340:28d1f895c6fe 1063 SMARTCARD_HandleTypeDef* hsmartcard = ( SMARTCARD_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 340:28d1f895c6fe 1064 hsmartcard->RxXferCount = 0;
mbed_official 340:28d1f895c6fe 1065
mbed_official 340:28d1f895c6fe 1066 /* Disable the DMA transfer for the receiver request by resetting the DMAR bit
mbed_official 340:28d1f895c6fe 1067 in the SMARTCARD associated USART CR3 register */
mbed_official 340:28d1f895c6fe 1068 hsmartcard->Instance->CR3 &= (uint16_t)~((uint16_t)USART_CR3_DMAR);
mbed_official 340:28d1f895c6fe 1069
mbed_official 340:28d1f895c6fe 1070 /* Check if a transmit Process is ongoing or not */
mbed_official 340:28d1f895c6fe 1071 if(hsmartcard->State == HAL_SMARTCARD_STATE_BUSY_TX_RX)
mbed_official 340:28d1f895c6fe 1072 {
mbed_official 340:28d1f895c6fe 1073 hsmartcard->State = HAL_SMARTCARD_STATE_BUSY_TX;
mbed_official 340:28d1f895c6fe 1074 }
mbed_official 340:28d1f895c6fe 1075 else
mbed_official 340:28d1f895c6fe 1076 {
mbed_official 340:28d1f895c6fe 1077 hsmartcard->State = HAL_SMARTCARD_STATE_READY;
mbed_official 340:28d1f895c6fe 1078 }
mbed_official 340:28d1f895c6fe 1079
mbed_official 340:28d1f895c6fe 1080 HAL_SMARTCARD_RxCpltCallback(hsmartcard);
mbed_official 340:28d1f895c6fe 1081 }
mbed_official 340:28d1f895c6fe 1082
mbed_official 340:28d1f895c6fe 1083 /**
mbed_official 340:28d1f895c6fe 1084 * @brief DMA SMARTCARD communication error callback.
mbed_official 340:28d1f895c6fe 1085 * @param hdma: Pointer to a DMA_HandleTypeDef structure that contains
mbed_official 340:28d1f895c6fe 1086 * the configuration information for the specified DMA module.
mbed_official 340:28d1f895c6fe 1087 * @retval None
mbed_official 340:28d1f895c6fe 1088 */
mbed_official 340:28d1f895c6fe 1089 static void SMARTCARD_DMAError(DMA_HandleTypeDef *hdma)
mbed_official 340:28d1f895c6fe 1090 {
mbed_official 340:28d1f895c6fe 1091 SMARTCARD_HandleTypeDef* hsmartcard = ( SMARTCARD_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 340:28d1f895c6fe 1092 hsmartcard->RxXferCount = 0;
mbed_official 340:28d1f895c6fe 1093 hsmartcard->TxXferCount = 0;
mbed_official 340:28d1f895c6fe 1094 hsmartcard->State= HAL_SMARTCARD_STATE_READY;
mbed_official 340:28d1f895c6fe 1095 hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_DMA;
mbed_official 340:28d1f895c6fe 1096 HAL_SMARTCARD_ErrorCallback(hsmartcard);
mbed_official 340:28d1f895c6fe 1097 }
mbed_official 340:28d1f895c6fe 1098
mbed_official 340:28d1f895c6fe 1099 /**
mbed_official 340:28d1f895c6fe 1100 * @brief Send an amount of data in non blocking mode
mbed_official 340:28d1f895c6fe 1101 * @param hsmartcard: SMARTCARD handle.
mbed_official 340:28d1f895c6fe 1102 * Function called under interruption only, once
mbed_official 340:28d1f895c6fe 1103 * interruptions have been enabled by HAL_SMARTCARD_Transmit_IT()
mbed_official 340:28d1f895c6fe 1104 * @retval HAL status
mbed_official 340:28d1f895c6fe 1105 */
mbed_official 340:28d1f895c6fe 1106 static HAL_StatusTypeDef SMARTCARD_Transmit_IT(SMARTCARD_HandleTypeDef *hsmartcard)
mbed_official 340:28d1f895c6fe 1107 {
mbed_official 340:28d1f895c6fe 1108 if ((hsmartcard->State == HAL_SMARTCARD_STATE_BUSY_TX) || (hsmartcard->State == HAL_SMARTCARD_STATE_BUSY_TX_RX))
mbed_official 340:28d1f895c6fe 1109 {
mbed_official 340:28d1f895c6fe 1110
mbed_official 340:28d1f895c6fe 1111 if(hsmartcard->TxXferCount == 0)
mbed_official 340:28d1f895c6fe 1112 {
mbed_official 340:28d1f895c6fe 1113 /* Disable the SMARTCARD Transmit Data Register Empty Interrupt */
mbed_official 340:28d1f895c6fe 1114 __HAL_SMARTCARD_DISABLE_IT(hsmartcard, SMARTCARD_IT_TXE);
mbed_official 340:28d1f895c6fe 1115
mbed_official 340:28d1f895c6fe 1116 /* Enable the SMARTCARD Transmit Complete Interrupt */
mbed_official 340:28d1f895c6fe 1117 __HAL_SMARTCARD_ENABLE_IT(hsmartcard, SMARTCARD_IT_TC);
mbed_official 340:28d1f895c6fe 1118
mbed_official 340:28d1f895c6fe 1119 return HAL_OK;
mbed_official 340:28d1f895c6fe 1120 }
mbed_official 340:28d1f895c6fe 1121 else
mbed_official 340:28d1f895c6fe 1122 {
mbed_official 340:28d1f895c6fe 1123 hsmartcard->Instance->TDR = (*hsmartcard->pTxBuffPtr++ & (uint8_t)0xFF);
mbed_official 340:28d1f895c6fe 1124 hsmartcard->TxXferCount--;
mbed_official 340:28d1f895c6fe 1125
mbed_official 340:28d1f895c6fe 1126 return HAL_OK;
mbed_official 340:28d1f895c6fe 1127 }
mbed_official 340:28d1f895c6fe 1128 }
mbed_official 340:28d1f895c6fe 1129 else
mbed_official 340:28d1f895c6fe 1130 {
mbed_official 340:28d1f895c6fe 1131 return HAL_BUSY;
mbed_official 340:28d1f895c6fe 1132 }
mbed_official 340:28d1f895c6fe 1133 }
mbed_official 340:28d1f895c6fe 1134
mbed_official 340:28d1f895c6fe 1135
mbed_official 340:28d1f895c6fe 1136 /**
mbed_official 340:28d1f895c6fe 1137 * @brief Wraps up transmission in non blocking mode.
mbed_official 340:28d1f895c6fe 1138 * @param hsmartcard: pointer to a SMARTCARD_HandleTypeDef structure that contains
mbed_official 340:28d1f895c6fe 1139 * the configuration information for the specified SMARTCARD module.
mbed_official 340:28d1f895c6fe 1140 * @retval HAL status
mbed_official 340:28d1f895c6fe 1141 */
mbed_official 340:28d1f895c6fe 1142 static HAL_StatusTypeDef SMARTCARD_EndTransmit_IT(SMARTCARD_HandleTypeDef *hsmartcard)
mbed_official 340:28d1f895c6fe 1143 {
mbed_official 340:28d1f895c6fe 1144 /* Disable the SMARTCARD Transmit Complete Interrupt */
mbed_official 340:28d1f895c6fe 1145 __HAL_SMARTCARD_DISABLE_IT(hsmartcard, SMARTCARD_IT_TC);
mbed_official 340:28d1f895c6fe 1146
mbed_official 340:28d1f895c6fe 1147 /* Check if a receive process is ongoing or not */
mbed_official 340:28d1f895c6fe 1148 if(hsmartcard->State == HAL_SMARTCARD_STATE_BUSY_TX_RX)
mbed_official 340:28d1f895c6fe 1149 {
mbed_official 340:28d1f895c6fe 1150 hsmartcard->State = HAL_SMARTCARD_STATE_BUSY_RX;
mbed_official 340:28d1f895c6fe 1151 }
mbed_official 340:28d1f895c6fe 1152 else
mbed_official 340:28d1f895c6fe 1153 {
mbed_official 340:28d1f895c6fe 1154 /* Disable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */
mbed_official 340:28d1f895c6fe 1155 __HAL_SMARTCARD_DISABLE_IT(hsmartcard, SMARTCARD_IT_ERR);
mbed_official 340:28d1f895c6fe 1156
mbed_official 340:28d1f895c6fe 1157 hsmartcard->State = HAL_SMARTCARD_STATE_READY;
mbed_official 340:28d1f895c6fe 1158 }
mbed_official 340:28d1f895c6fe 1159
mbed_official 340:28d1f895c6fe 1160 HAL_SMARTCARD_TxCpltCallback(hsmartcard);
mbed_official 340:28d1f895c6fe 1161
mbed_official 340:28d1f895c6fe 1162 return HAL_OK;
mbed_official 340:28d1f895c6fe 1163 }
mbed_official 340:28d1f895c6fe 1164
mbed_official 340:28d1f895c6fe 1165
mbed_official 340:28d1f895c6fe 1166 /**
mbed_official 340:28d1f895c6fe 1167 * @brief Receive an amount of data in non blocking mode
mbed_official 340:28d1f895c6fe 1168 * @param hsmartcard: SMARTCARD handle.
mbed_official 340:28d1f895c6fe 1169 * Function called under interruption only, once
mbed_official 340:28d1f895c6fe 1170 * interruptions have been enabled by HAL_SMARTCARD_Receive_IT()
mbed_official 340:28d1f895c6fe 1171 * @retval HAL status
mbed_official 340:28d1f895c6fe 1172 */
mbed_official 340:28d1f895c6fe 1173 static HAL_StatusTypeDef SMARTCARD_Receive_IT(SMARTCARD_HandleTypeDef *hsmartcard)
mbed_official 340:28d1f895c6fe 1174 {
mbed_official 340:28d1f895c6fe 1175 if ((hsmartcard->State == HAL_SMARTCARD_STATE_BUSY_RX) || (hsmartcard->State == HAL_SMARTCARD_STATE_BUSY_TX_RX))
mbed_official 340:28d1f895c6fe 1176 {
mbed_official 340:28d1f895c6fe 1177
mbed_official 340:28d1f895c6fe 1178 *hsmartcard->pRxBuffPtr++ = (uint8_t)(hsmartcard->Instance->RDR & (uint8_t)0xFF);
mbed_official 340:28d1f895c6fe 1179
mbed_official 340:28d1f895c6fe 1180 if(--hsmartcard->RxXferCount == 0)
mbed_official 340:28d1f895c6fe 1181 {
mbed_official 340:28d1f895c6fe 1182 __HAL_SMARTCARD_DISABLE_IT(hsmartcard, SMARTCARD_IT_RXNE);
mbed_official 340:28d1f895c6fe 1183
mbed_official 340:28d1f895c6fe 1184 /* Check if a transmit Process is ongoing or not */
mbed_official 340:28d1f895c6fe 1185 if(hsmartcard->State == HAL_SMARTCARD_STATE_BUSY_TX_RX)
mbed_official 340:28d1f895c6fe 1186 {
mbed_official 340:28d1f895c6fe 1187 hsmartcard->State = HAL_SMARTCARD_STATE_BUSY_TX;
mbed_official 340:28d1f895c6fe 1188 }
mbed_official 340:28d1f895c6fe 1189 else
mbed_official 340:28d1f895c6fe 1190 {
mbed_official 340:28d1f895c6fe 1191 /* Disable the SMARTCARD Parity Error Interrupt */
mbed_official 340:28d1f895c6fe 1192 __HAL_SMARTCARD_DISABLE_IT(hsmartcard, SMARTCARD_IT_PE);
mbed_official 340:28d1f895c6fe 1193
mbed_official 340:28d1f895c6fe 1194 /* Disable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */
mbed_official 340:28d1f895c6fe 1195 __HAL_SMARTCARD_DISABLE_IT(hsmartcard, SMARTCARD_IT_ERR);
mbed_official 340:28d1f895c6fe 1196
mbed_official 340:28d1f895c6fe 1197 hsmartcard->State = HAL_SMARTCARD_STATE_READY;
mbed_official 340:28d1f895c6fe 1198 }
mbed_official 340:28d1f895c6fe 1199
mbed_official 340:28d1f895c6fe 1200 HAL_SMARTCARD_RxCpltCallback(hsmartcard);
mbed_official 340:28d1f895c6fe 1201
mbed_official 340:28d1f895c6fe 1202 return HAL_OK;
mbed_official 340:28d1f895c6fe 1203 }
mbed_official 340:28d1f895c6fe 1204
mbed_official 340:28d1f895c6fe 1205 return HAL_OK;
mbed_official 340:28d1f895c6fe 1206 }
mbed_official 340:28d1f895c6fe 1207 else
mbed_official 340:28d1f895c6fe 1208 {
mbed_official 340:28d1f895c6fe 1209 return HAL_BUSY;
mbed_official 340:28d1f895c6fe 1210 }
mbed_official 340:28d1f895c6fe 1211 }
mbed_official 340:28d1f895c6fe 1212
mbed_official 340:28d1f895c6fe 1213 /**
mbed_official 340:28d1f895c6fe 1214 * @brief Configure the SMARTCARD associated USART peripheral
mbed_official 340:28d1f895c6fe 1215 * @param hsmartcard: SMARTCARD handle
mbed_official 340:28d1f895c6fe 1216 * @retval None
mbed_official 340:28d1f895c6fe 1217 */
mbed_official 340:28d1f895c6fe 1218 static HAL_StatusTypeDef SMARTCARD_SetConfig(SMARTCARD_HandleTypeDef *hsmartcard)
mbed_official 340:28d1f895c6fe 1219 {
mbed_official 340:28d1f895c6fe 1220 uint32_t tmpreg = 0x00000000;
mbed_official 340:28d1f895c6fe 1221 SMARTCARD_ClockSourceTypeDef clocksource = SMARTCARD_CLOCKSOURCE_UNDEFINED;
mbed_official 340:28d1f895c6fe 1222 HAL_StatusTypeDef ret = HAL_OK;
mbed_official 340:28d1f895c6fe 1223
mbed_official 340:28d1f895c6fe 1224 /* Check the parameters */
mbed_official 340:28d1f895c6fe 1225 assert_param(IS_SMARTCARD_INSTANCE(hsmartcard->Instance));
mbed_official 340:28d1f895c6fe 1226 assert_param(IS_SMARTCARD_BAUDRATE(hsmartcard->Init.BaudRate));
mbed_official 340:28d1f895c6fe 1227 assert_param(IS_SMARTCARD_WORD_LENGTH(hsmartcard->Init.WordLength));
mbed_official 340:28d1f895c6fe 1228 assert_param(IS_SMARTCARD_STOPBITS(hsmartcard->Init.StopBits));
mbed_official 340:28d1f895c6fe 1229 assert_param(IS_SMARTCARD_PARITY(hsmartcard->Init.Parity));
mbed_official 340:28d1f895c6fe 1230 assert_param(IS_SMARTCARD_MODE(hsmartcard->Init.Mode));
mbed_official 340:28d1f895c6fe 1231 assert_param(IS_SMARTCARD_POLARITY(hsmartcard->Init.CLKPolarity));
mbed_official 340:28d1f895c6fe 1232 assert_param(IS_SMARTCARD_PHASE(hsmartcard->Init.CLKPhase));
mbed_official 340:28d1f895c6fe 1233 assert_param(IS_SMARTCARD_LASTBIT(hsmartcard->Init.CLKLastBit));
mbed_official 340:28d1f895c6fe 1234 assert_param(IS_SMARTCARD_ONEBIT_SAMPLING(hsmartcard->Init.OneBitSampling));
mbed_official 340:28d1f895c6fe 1235 assert_param(IS_SMARTCARD_NACK(hsmartcard->Init.NACKEnable));
mbed_official 340:28d1f895c6fe 1236 assert_param(IS_SMARTCARD_TIMEOUT(hsmartcard->Init.TimeOutEnable));
mbed_official 340:28d1f895c6fe 1237 assert_param(IS_SMARTCARD_AUTORETRY_COUNT(hsmartcard->Init.AutoRetryCount));
mbed_official 340:28d1f895c6fe 1238
mbed_official 340:28d1f895c6fe 1239 /*-------------------------- USART CR1 Configuration -----------------------*/
mbed_official 340:28d1f895c6fe 1240 /* In SmartCard mode, M and PCE are forced to 1 (8 bits + parity).
mbed_official 340:28d1f895c6fe 1241 * Oversampling is forced to 16 (OVER8 = 0).
mbed_official 340:28d1f895c6fe 1242 * Configure the Parity and Mode:
mbed_official 340:28d1f895c6fe 1243 * set PS bit according to hsmartcard->Init.Parity value
mbed_official 340:28d1f895c6fe 1244 * set TE and RE bits according to hsmartcard->Init.Mode value */
mbed_official 340:28d1f895c6fe 1245 tmpreg = (uint32_t) hsmartcard->Init.Parity | hsmartcard->Init.Mode;
mbed_official 340:28d1f895c6fe 1246 /* in case of TX-only mode, if NACK is enabled, the USART must be able to monitor
mbed_official 340:28d1f895c6fe 1247 the bidirectional line to detect a NACK signal in case of parity error.
mbed_official 340:28d1f895c6fe 1248 Therefore, the receiver block must be enabled as well (RE bit must be set). */
mbed_official 340:28d1f895c6fe 1249 if ((hsmartcard->Init.Mode == SMARTCARD_MODE_TX)
mbed_official 340:28d1f895c6fe 1250 && (hsmartcard->Init.NACKEnable == SMARTCARD_NACK_ENABLED))
mbed_official 340:28d1f895c6fe 1251 {
mbed_official 340:28d1f895c6fe 1252 tmpreg |= USART_CR1_RE;
mbed_official 340:28d1f895c6fe 1253 }
mbed_official 340:28d1f895c6fe 1254 tmpreg |= (uint32_t) hsmartcard->Init.WordLength;
mbed_official 340:28d1f895c6fe 1255 MODIFY_REG(hsmartcard->Instance->CR1, USART_CR1_FIELDS, tmpreg);
mbed_official 340:28d1f895c6fe 1256
mbed_official 340:28d1f895c6fe 1257 /*-------------------------- USART CR2 Configuration -----------------------*/
mbed_official 340:28d1f895c6fe 1258 /* Stop bits are forced to 1.5 (STOP = 11) */
mbed_official 340:28d1f895c6fe 1259 tmpreg = hsmartcard->Init.StopBits;
mbed_official 340:28d1f895c6fe 1260 /* Synchronous mode is activated by default */
mbed_official 340:28d1f895c6fe 1261 tmpreg |= (uint32_t) USART_CR2_CLKEN | hsmartcard->Init.CLKPolarity;
mbed_official 340:28d1f895c6fe 1262 tmpreg |= (uint32_t) hsmartcard->Init.CLKPhase | hsmartcard->Init.CLKLastBit;
mbed_official 340:28d1f895c6fe 1263 tmpreg |= (uint32_t) hsmartcard->Init.TimeOutEnable;
mbed_official 340:28d1f895c6fe 1264 MODIFY_REG(hsmartcard->Instance->CR2, USART_CR2_FIELDS, tmpreg);
mbed_official 340:28d1f895c6fe 1265
mbed_official 340:28d1f895c6fe 1266 /*-------------------------- USART CR3 Configuration -----------------------*/
mbed_official 340:28d1f895c6fe 1267 /* Configure
mbed_official 340:28d1f895c6fe 1268 * - one-bit sampling method versus three samples' majority rule
mbed_official 340:28d1f895c6fe 1269 * according to hsmartcard->Init.OneBitSampling
mbed_official 340:28d1f895c6fe 1270 * - NACK transmission in case of parity error according
mbed_official 340:28d1f895c6fe 1271 * to hsmartcard->Init.NACKEnable
mbed_official 340:28d1f895c6fe 1272 * - autoretry counter according to hsmartcard->Init.AutoRetryCount */
mbed_official 340:28d1f895c6fe 1273 tmpreg = (uint32_t) hsmartcard->Init.OneBitSampling | hsmartcard->Init.NACKEnable;
mbed_official 340:28d1f895c6fe 1274 tmpreg |= ((uint32_t)hsmartcard->Init.AutoRetryCount << SMARTCARD_CR3_SCARCNT_LSB_POS);
mbed_official 340:28d1f895c6fe 1275 MODIFY_REG(hsmartcard->Instance-> CR3,USART_CR3_FIELDS, tmpreg);
mbed_official 340:28d1f895c6fe 1276
mbed_official 340:28d1f895c6fe 1277 /*-------------------------- USART GTPR Configuration ----------------------*/
mbed_official 340:28d1f895c6fe 1278 tmpreg = (hsmartcard->Init.Prescaler | ((uint32_t)hsmartcard->Init.GuardTime << SMARTCARD_GTPR_GT_LSB_POS));
mbed_official 340:28d1f895c6fe 1279 MODIFY_REG(hsmartcard->Instance->GTPR, (USART_GTPR_GT|USART_GTPR_PSC), tmpreg);
mbed_official 340:28d1f895c6fe 1280
mbed_official 340:28d1f895c6fe 1281 /*-------------------------- USART RTOR Configuration ----------------------*/
mbed_official 340:28d1f895c6fe 1282 tmpreg = ((uint32_t)hsmartcard->Init.BlockLength << SMARTCARD_RTOR_BLEN_LSB_POS);
mbed_official 340:28d1f895c6fe 1283 if (hsmartcard->Init.TimeOutEnable == SMARTCARD_TIMEOUT_ENABLED)
mbed_official 340:28d1f895c6fe 1284 {
mbed_official 340:28d1f895c6fe 1285 assert_param(IS_SMARTCARD_TIMEOUT_VALUE(hsmartcard->Init.TimeOutValue));
mbed_official 340:28d1f895c6fe 1286 tmpreg |= (uint32_t) hsmartcard->Init.TimeOutValue;
mbed_official 340:28d1f895c6fe 1287 }
mbed_official 340:28d1f895c6fe 1288 MODIFY_REG(hsmartcard->Instance->RTOR, (USART_RTOR_RTO|USART_RTOR_BLEN), tmpreg);
mbed_official 340:28d1f895c6fe 1289
mbed_official 340:28d1f895c6fe 1290 /*-------------------------- USART BRR Configuration -----------------------*/
mbed_official 340:28d1f895c6fe 1291 __HAL_SMARTCARD_GETCLOCKSOURCE(hsmartcard, clocksource);
mbed_official 340:28d1f895c6fe 1292 switch (clocksource)
mbed_official 340:28d1f895c6fe 1293 {
mbed_official 340:28d1f895c6fe 1294 case SMARTCARD_CLOCKSOURCE_PCLK1:
mbed_official 340:28d1f895c6fe 1295 hsmartcard->Instance->BRR = (uint16_t)(HAL_RCC_GetPCLK1Freq() / hsmartcard->Init.BaudRate);
mbed_official 340:28d1f895c6fe 1296 break;
mbed_official 340:28d1f895c6fe 1297 case SMARTCARD_CLOCKSOURCE_HSI:
mbed_official 340:28d1f895c6fe 1298 hsmartcard->Instance->BRR = (uint16_t)(HSI_VALUE / hsmartcard->Init.BaudRate);
mbed_official 340:28d1f895c6fe 1299 break;
mbed_official 340:28d1f895c6fe 1300 case SMARTCARD_CLOCKSOURCE_SYSCLK:
mbed_official 340:28d1f895c6fe 1301 hsmartcard->Instance->BRR = (uint16_t)(HAL_RCC_GetSysClockFreq() / hsmartcard->Init.BaudRate);
mbed_official 340:28d1f895c6fe 1302 break;
mbed_official 340:28d1f895c6fe 1303 case SMARTCARD_CLOCKSOURCE_LSE:
mbed_official 340:28d1f895c6fe 1304 hsmartcard->Instance->BRR = (uint16_t)(LSE_VALUE / hsmartcard->Init.BaudRate);
mbed_official 340:28d1f895c6fe 1305 break;
mbed_official 340:28d1f895c6fe 1306 case SMARTCARD_CLOCKSOURCE_UNDEFINED:
mbed_official 340:28d1f895c6fe 1307 default:
mbed_official 340:28d1f895c6fe 1308 ret = HAL_ERROR;
mbed_official 340:28d1f895c6fe 1309 break;
mbed_official 340:28d1f895c6fe 1310 }
mbed_official 340:28d1f895c6fe 1311
mbed_official 340:28d1f895c6fe 1312 return ret;
mbed_official 340:28d1f895c6fe 1313 }
mbed_official 340:28d1f895c6fe 1314
mbed_official 340:28d1f895c6fe 1315 /**
mbed_official 340:28d1f895c6fe 1316 * @brief Check the SMARTCARD Idle State
mbed_official 340:28d1f895c6fe 1317 * @param hsmartcard: SMARTCARD handle
mbed_official 340:28d1f895c6fe 1318 * @retval HAL status
mbed_official 340:28d1f895c6fe 1319 */
mbed_official 340:28d1f895c6fe 1320 static HAL_StatusTypeDef SMARTCARD_CheckIdleState(SMARTCARD_HandleTypeDef *hsmartcard)
mbed_official 340:28d1f895c6fe 1321 {
mbed_official 340:28d1f895c6fe 1322
mbed_official 340:28d1f895c6fe 1323 /* Initialize the SMARTCARD ErrorCode */
mbed_official 340:28d1f895c6fe 1324 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
mbed_official 340:28d1f895c6fe 1325
mbed_official 340:28d1f895c6fe 1326 /* Check if the Transmitter is enabled */
mbed_official 340:28d1f895c6fe 1327 if((hsmartcard->Instance->CR1 & USART_CR1_TE) == USART_CR1_TE)
mbed_official 340:28d1f895c6fe 1328 {
mbed_official 340:28d1f895c6fe 1329 /* Wait until TEACK flag is set */
mbed_official 340:28d1f895c6fe 1330 if(SMARTCARD_WaitOnFlagUntilTimeout(hsmartcard, USART_ISR_TEACK, RESET, TEACK_REACK_TIMEOUT) != HAL_OK)
mbed_official 340:28d1f895c6fe 1331 {
mbed_official 340:28d1f895c6fe 1332 return HAL_TIMEOUT;
mbed_official 340:28d1f895c6fe 1333 }
mbed_official 340:28d1f895c6fe 1334 }
mbed_official 340:28d1f895c6fe 1335 /* Check if the Receiver is enabled */
mbed_official 340:28d1f895c6fe 1336 if((hsmartcard->Instance->CR1 & USART_CR1_RE) == USART_CR1_RE)
mbed_official 340:28d1f895c6fe 1337 {
mbed_official 340:28d1f895c6fe 1338 /* Wait until REACK flag is set */
mbed_official 340:28d1f895c6fe 1339 if(SMARTCARD_WaitOnFlagUntilTimeout(hsmartcard, USART_ISR_REACK, RESET, TEACK_REACK_TIMEOUT) != HAL_OK)
mbed_official 340:28d1f895c6fe 1340 {
mbed_official 340:28d1f895c6fe 1341 return HAL_TIMEOUT;
mbed_official 340:28d1f895c6fe 1342 }
mbed_official 340:28d1f895c6fe 1343 }
mbed_official 340:28d1f895c6fe 1344
mbed_official 340:28d1f895c6fe 1345 /* Initialize the SMARTCARD state*/
mbed_official 340:28d1f895c6fe 1346 hsmartcard->State= HAL_SMARTCARD_STATE_READY;
mbed_official 340:28d1f895c6fe 1347
mbed_official 340:28d1f895c6fe 1348 /* Process Unlocked */
mbed_official 340:28d1f895c6fe 1349 __HAL_UNLOCK(hsmartcard);
mbed_official 340:28d1f895c6fe 1350
mbed_official 340:28d1f895c6fe 1351 return HAL_OK;
mbed_official 340:28d1f895c6fe 1352 }
mbed_official 340:28d1f895c6fe 1353
mbed_official 340:28d1f895c6fe 1354 /**
mbed_official 340:28d1f895c6fe 1355 * @brief Configure the SMARTCARD associated USART peripheral advanced feautures
mbed_official 340:28d1f895c6fe 1356 * @param hsmartcard: SMARTCARD handle
mbed_official 340:28d1f895c6fe 1357 * @retval None
mbed_official 340:28d1f895c6fe 1358 */
mbed_official 340:28d1f895c6fe 1359 static void SMARTCARD_AdvFeatureConfig(SMARTCARD_HandleTypeDef *hsmartcard)
mbed_official 340:28d1f895c6fe 1360 {
mbed_official 340:28d1f895c6fe 1361 /* Check whether the set of advanced features to configure is properly set */
mbed_official 340:28d1f895c6fe 1362 assert_param(IS_SMARTCARD_ADVFEATURE_INIT(hsmartcard->AdvancedInit.AdvFeatureInit));
mbed_official 340:28d1f895c6fe 1363
mbed_official 340:28d1f895c6fe 1364 /* if required, configure TX pin active level inversion */
mbed_official 340:28d1f895c6fe 1365 if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_TXINVERT_INIT))
mbed_official 340:28d1f895c6fe 1366 {
mbed_official 340:28d1f895c6fe 1367 assert_param(IS_SMARTCARD_ADVFEATURE_TXINV(hsmartcard->AdvancedInit.TxPinLevelInvert));
mbed_official 340:28d1f895c6fe 1368 MODIFY_REG(hsmartcard->Instance->CR2, USART_CR2_TXINV, hsmartcard->AdvancedInit.TxPinLevelInvert);
mbed_official 340:28d1f895c6fe 1369 }
mbed_official 340:28d1f895c6fe 1370
mbed_official 340:28d1f895c6fe 1371 /* if required, configure RX pin active level inversion */
mbed_official 340:28d1f895c6fe 1372 if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_RXINVERT_INIT))
mbed_official 340:28d1f895c6fe 1373 {
mbed_official 340:28d1f895c6fe 1374 assert_param(IS_SMARTCARD_ADVFEATURE_RXINV(hsmartcard->AdvancedInit.RxPinLevelInvert));
mbed_official 340:28d1f895c6fe 1375 MODIFY_REG(hsmartcard->Instance->CR2, USART_CR2_RXINV, hsmartcard->AdvancedInit.RxPinLevelInvert);
mbed_official 340:28d1f895c6fe 1376 }
mbed_official 340:28d1f895c6fe 1377
mbed_official 340:28d1f895c6fe 1378 /* if required, configure data inversion */
mbed_official 340:28d1f895c6fe 1379 if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_DATAINVERT_INIT))
mbed_official 340:28d1f895c6fe 1380 {
mbed_official 340:28d1f895c6fe 1381 assert_param(IS_SMARTCARD_ADVFEATURE_DATAINV(hsmartcard->AdvancedInit.DataInvert));
mbed_official 340:28d1f895c6fe 1382 MODIFY_REG(hsmartcard->Instance->CR2, USART_CR2_DATAINV, hsmartcard->AdvancedInit.DataInvert);
mbed_official 340:28d1f895c6fe 1383 }
mbed_official 340:28d1f895c6fe 1384
mbed_official 340:28d1f895c6fe 1385 /* if required, configure RX/TX pins swap */
mbed_official 340:28d1f895c6fe 1386 if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_SWAP_INIT))
mbed_official 340:28d1f895c6fe 1387 {
mbed_official 340:28d1f895c6fe 1388 assert_param(IS_SMARTCARD_ADVFEATURE_SWAP(hsmartcard->AdvancedInit.Swap));
mbed_official 340:28d1f895c6fe 1389 MODIFY_REG(hsmartcard->Instance->CR2, USART_CR2_SWAP, hsmartcard->AdvancedInit.Swap);
mbed_official 340:28d1f895c6fe 1390 }
mbed_official 340:28d1f895c6fe 1391
mbed_official 340:28d1f895c6fe 1392 /* if required, configure RX overrun detection disabling */
mbed_official 340:28d1f895c6fe 1393 if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_RXOVERRUNDISABLE_INIT))
mbed_official 340:28d1f895c6fe 1394 {
mbed_official 340:28d1f895c6fe 1395 assert_param(IS_SMARTCARD_OVERRUN(hsmartcard->AdvancedInit.OverrunDisable));
mbed_official 340:28d1f895c6fe 1396 MODIFY_REG(hsmartcard->Instance->CR3, USART_CR3_OVRDIS, hsmartcard->AdvancedInit.OverrunDisable);
mbed_official 340:28d1f895c6fe 1397 }
mbed_official 340:28d1f895c6fe 1398
mbed_official 340:28d1f895c6fe 1399 /* if required, configure DMA disabling on reception error */
mbed_official 340:28d1f895c6fe 1400 if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_DMADISABLEONERROR_INIT))
mbed_official 340:28d1f895c6fe 1401 {
mbed_official 340:28d1f895c6fe 1402 assert_param(IS_SMARTCARD_ADVFEATURE_DMAONRXERROR(hsmartcard->AdvancedInit.DMADisableonRxError));
mbed_official 340:28d1f895c6fe 1403 MODIFY_REG(hsmartcard->Instance->CR3, USART_CR3_DDRE, hsmartcard->AdvancedInit.DMADisableonRxError);
mbed_official 340:28d1f895c6fe 1404 }
mbed_official 340:28d1f895c6fe 1405
mbed_official 340:28d1f895c6fe 1406 /* if required, configure MSB first on communication line */
mbed_official 340:28d1f895c6fe 1407 if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_MSBFIRST_INIT))
mbed_official 340:28d1f895c6fe 1408 {
mbed_official 340:28d1f895c6fe 1409 assert_param(IS_SMARTCARD_ADVFEATURE_MSBFIRST(hsmartcard->AdvancedInit.MSBFirst));
mbed_official 340:28d1f895c6fe 1410 MODIFY_REG(hsmartcard->Instance->CR2, USART_CR2_MSBFIRST, hsmartcard->AdvancedInit.MSBFirst);
mbed_official 340:28d1f895c6fe 1411 }
mbed_official 340:28d1f895c6fe 1412 }
mbed_official 340:28d1f895c6fe 1413
mbed_official 340:28d1f895c6fe 1414 /**
mbed_official 340:28d1f895c6fe 1415 * @}
mbed_official 340:28d1f895c6fe 1416 */
mbed_official 340:28d1f895c6fe 1417
mbed_official 340:28d1f895c6fe 1418 #endif /* !defined(STM32F030x6) && !defined(STM32F030x8) */
mbed_official 340:28d1f895c6fe 1419
mbed_official 340:28d1f895c6fe 1420 #endif /* HAL_SMARTCARD_MODULE_ENABLED */
mbed_official 340:28d1f895c6fe 1421 /**
mbed_official 340:28d1f895c6fe 1422 * @}
mbed_official 340:28d1f895c6fe 1423 */
mbed_official 340:28d1f895c6fe 1424
mbed_official 340:28d1f895c6fe 1425 /**
mbed_official 340:28d1f895c6fe 1426 * @}
mbed_official 340:28d1f895c6fe 1427 */
mbed_official 340:28d1f895c6fe 1428
mbed_official 340:28d1f895c6fe 1429 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/