TUKS MCU Introductory course / TUKS-COURSE-2-LED
Committer:
elmot
Date:
Fri Feb 24 21:13:56 2017 +0000
Revision:
1:d0dfbce63a89
Ready-to-copy

Who changed what in which revision?

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