mbed library sources

Dependents:   frdm_kl05z_gpio_test

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Mon Mar 24 17:45:07 2014 +0000
Revision:
133:d4dda5c437f0
Child:
242:7074e42da0b2
Synchronized with git revision 47b961246bed973fe4cb8932781ffc8025b78a61

Full URL: https://github.com/mbedmicro/mbed/commit/47b961246bed973fe4cb8932781ffc8025b78a61/

[STM32F4-Discovery (STM32F407VG)] initial port

Who changed what in which revision?

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