mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

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

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

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

Import librarymbed

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

Committer:
mbed_official
Date:
Sat Feb 08 19:45:06 2014 +0000
Revision:
87:085cde657901
Child:
106:ced8cbb51063
Synchronized with git revision 9272cdeb45ec7e6077641536509413da8fd2ebc2

Full URL: https://github.com/mbedmicro/mbed/commit/9272cdeb45ec7e6077641536509413da8fd2ebc2/

Add NUCLEO_F401RE, improvements

Who changed what in which revision?

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