mbed library sources

Fork of mbed-src by mbed official

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****/