mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

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

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

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

Import librarymbed

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

Committer:
mbed_official
Date:
Fri Aug 14 13:15:17 2015 +0100
Revision:
610:813dcc80987e
Synchronized with git revision 6d84db41c6833e0b9b024741eb0616a5f62d5599

Full URL: https://github.com/mbedmicro/mbed/commit/6d84db41c6833e0b9b024741eb0616a5f62d5599/

DISCO_F746NG - Improvements

Who changed what in which revision?

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