mbed library sources

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Mon Nov 03 10:15:07 2014 +0000
Revision:
380:510f0c3515e3
Parent:
targets/cmsis/TARGET_STM/TARGET_NUCLEO_F411RE/stm32f4xx_hal_smartcard.c@352:95e80f5e68f6
Child:
532:fe11edbda85c
Synchronized with git revision 417f470ba9f4882d7079611cbc576afd9c49b0ef

Full URL: https://github.com/mbedmicro/mbed/commit/417f470ba9f4882d7079611cbc576afd9c49b0ef/

Targets: Factorisation of NUCLEO_F401RE and F411RE cmsis folders

Who changed what in which revision?

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