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:
Mon Sep 28 20:15:09 2015 +0100
Revision:
634:ac7d6880524d
Parent:
632:7687fb9c4f91
Synchronized with git revision 9b7d23d47153c298a6d24de9a415202705889d11

Full URL: https://github.com/mbedmicro/mbed/commit/9b7d23d47153c298a6d24de9a415202705889d11/

Revert "[NUCLEO_F303K8] add support of the STM32F303K8"

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 330:c80ac197fa6a 1 /**
mbed_official 330:c80ac197fa6a 2 ******************************************************************************
mbed_official 330:c80ac197fa6a 3 * @file stm32f3xx_hal_cec.c
mbed_official 330:c80ac197fa6a 4 * @author MCD Application Team
mbed_official 634:ac7d6880524d 5 * @version V1.1.0
mbed_official 634:ac7d6880524d 6 * @date 12-Sept-2014
mbed_official 330:c80ac197fa6a 7 * @brief CEC HAL module driver.
mbed_official 330:c80ac197fa6a 8 *
mbed_official 330:c80ac197fa6a 9 * This file provides firmware functions to manage the following
mbed_official 330:c80ac197fa6a 10 * functionalities of the High Definition Multimedia Interface
mbed_official 330:c80ac197fa6a 11 * Consumer Electronics Control Peripheral (CEC).
mbed_official 330:c80ac197fa6a 12 * + Initialization and de-initialization functions
mbed_official 330:c80ac197fa6a 13 * + IO operation functions
mbed_official 330:c80ac197fa6a 14 * + Peripheral Control functions
mbed_official 330:c80ac197fa6a 15 *
mbed_official 330:c80ac197fa6a 16 *
mbed_official 330:c80ac197fa6a 17 @verbatim
mbed_official 330:c80ac197fa6a 18 ===============================================================================
mbed_official 330:c80ac197fa6a 19 ##### How to use this driver #####
mbed_official 330:c80ac197fa6a 20 ===============================================================================
mbed_official 330:c80ac197fa6a 21 [..]
mbed_official 330:c80ac197fa6a 22 The CEC HAL driver can be used as follows:
mbed_official 330:c80ac197fa6a 23
mbed_official 330:c80ac197fa6a 24 (#) Declare a CEC_HandleTypeDef handle structure.
mbed_official 330:c80ac197fa6a 25 (#) Initialize the CEC low level resources by implementing the HAL_CEC_MspInit ()API:
mbed_official 330:c80ac197fa6a 26 (##) Enable the CEC interface clock.
mbed_official 330:c80ac197fa6a 27 (##) CEC pins configuration:
mbed_official 330:c80ac197fa6a 28 (+) Enable the clock for the CEC GPIOs.
mbed_official 330:c80ac197fa6a 29 (+) Configure these CEC pins as alternate function pull-up.
mbed_official 330:c80ac197fa6a 30 (##) NVIC configuration if you need to use interrupt process (HAL_CEC_Transmit_IT()
mbed_official 330:c80ac197fa6a 31 and HAL_CEC_Receive_IT() APIs):
mbed_official 330:c80ac197fa6a 32 (+) Configure the CEC interrupt priority.
mbed_official 330:c80ac197fa6a 33 (+) Enable the NVIC CEC IRQ handle.
mbed_official 330:c80ac197fa6a 34 (@) The specific CEC interrupts (Transmission complete interrupt,
mbed_official 330:c80ac197fa6a 35 RXNE interrupt and Error Interrupts) will be managed using the macros
mbed_official 330:c80ac197fa6a 36 __HAL_CEC_ENABLE_IT() and __HAL_CEC_DISABLE_IT() inside the transmit
mbed_official 330:c80ac197fa6a 37 and receive process.
mbed_official 330:c80ac197fa6a 38
mbed_official 330:c80ac197fa6a 39 (#) Program the Signal Free Time (SFT) and SFT option, Tolerance, reception stop in
mbed_official 330:c80ac197fa6a 40 in case of Bit Rising Error, Error-Bit generation conditions, device logical
mbed_official 330:c80ac197fa6a 41 address and Listen mode in the hcec Init structure.
mbed_official 330:c80ac197fa6a 42
mbed_official 330:c80ac197fa6a 43 (#) Initialize the CEC registers by calling the HAL_CEC_Init() API.
mbed_official 330:c80ac197fa6a 44
mbed_official 330:c80ac197fa6a 45 (@) This API (HAL_CEC_Init()) configures also the low level Hardware GPIO, CLOCK, CORTEX...etc)
mbed_official 330:c80ac197fa6a 46 by calling the customed HAL_CEC_MspInit() API.
mbed_official 330:c80ac197fa6a 47
mbed_official 330:c80ac197fa6a 48 @endverbatim
mbed_official 330:c80ac197fa6a 49 ******************************************************************************
mbed_official 330:c80ac197fa6a 50 * @attention
mbed_official 330:c80ac197fa6a 51 *
mbed_official 634:ac7d6880524d 52 * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
mbed_official 330:c80ac197fa6a 53 *
mbed_official 330:c80ac197fa6a 54 * Redistribution and use in source and binary forms, with or without modification,
mbed_official 330:c80ac197fa6a 55 * are permitted provided that the following conditions are met:
mbed_official 330:c80ac197fa6a 56 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 330:c80ac197fa6a 57 * this list of conditions and the following disclaimer.
mbed_official 330:c80ac197fa6a 58 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 330:c80ac197fa6a 59 * this list of conditions and the following disclaimer in the documentation
mbed_official 330:c80ac197fa6a 60 * and/or other materials provided with the distribution.
mbed_official 330:c80ac197fa6a 61 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 330:c80ac197fa6a 62 * may be used to endorse or promote products derived from this software
mbed_official 330:c80ac197fa6a 63 * without specific prior written permission.
mbed_official 330:c80ac197fa6a 64 *
mbed_official 330:c80ac197fa6a 65 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 330:c80ac197fa6a 66 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 330:c80ac197fa6a 67 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 330:c80ac197fa6a 68 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 330:c80ac197fa6a 69 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 330:c80ac197fa6a 70 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 330:c80ac197fa6a 71 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 330:c80ac197fa6a 72 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 330:c80ac197fa6a 73 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 330:c80ac197fa6a 74 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 330:c80ac197fa6a 75 *
mbed_official 330:c80ac197fa6a 76 ******************************************************************************
mbed_official 330:c80ac197fa6a 77 */
mbed_official 330:c80ac197fa6a 78
mbed_official 330:c80ac197fa6a 79 /* Includes ------------------------------------------------------------------*/
mbed_official 330:c80ac197fa6a 80 #include "stm32f3xx_hal.h"
mbed_official 330:c80ac197fa6a 81
mbed_official 330:c80ac197fa6a 82 /** @addtogroup STM32F3xx_HAL_Driver
mbed_official 330:c80ac197fa6a 83 * @{
mbed_official 330:c80ac197fa6a 84 */
mbed_official 330:c80ac197fa6a 85
mbed_official 330:c80ac197fa6a 86 #ifdef HAL_CEC_MODULE_ENABLED
mbed_official 330:c80ac197fa6a 87
mbed_official 330:c80ac197fa6a 88 #if defined(STM32F373xC) || defined(STM32F378xx)
mbed_official 330:c80ac197fa6a 89 /** @defgroup CEC CEC HAL module driver
mbed_official 330:c80ac197fa6a 90 * @brief HAL CEC module driver
mbed_official 330:c80ac197fa6a 91 * @{
mbed_official 330:c80ac197fa6a 92 */
mbed_official 330:c80ac197fa6a 93
mbed_official 330:c80ac197fa6a 94 /* Private typedef -----------------------------------------------------------*/
mbed_official 330:c80ac197fa6a 95 /* Private define ------------------------------------------------------------*/
mbed_official 330:c80ac197fa6a 96 /** @defgroup CEC_Private CEC Private Constants
mbed_official 330:c80ac197fa6a 97 * @{
mbed_official 330:c80ac197fa6a 98 */
mbed_official 330:c80ac197fa6a 99 #define CEC_CFGR_FIELDS (CEC_CFGR_SFT | CEC_CFGR_RXTOL | CEC_CFGR_BRESTP \
mbed_official 330:c80ac197fa6a 100 | CEC_CFGR_BREGEN | CEC_CFGR_LBPEGEN | CEC_CFGR_SFTOPT \
mbed_official 330:c80ac197fa6a 101 | CEC_CFGR_BRDNOGEN | CEC_CFGR_OAR | CEC_CFGR_LSTN)
mbed_official 330:c80ac197fa6a 102 /**
mbed_official 330:c80ac197fa6a 103 * @}
mbed_official 330:c80ac197fa6a 104 */
mbed_official 330:c80ac197fa6a 105 /* Private macro -------------------------------------------------------------*/
mbed_official 330:c80ac197fa6a 106 /* Private variables ---------------------------------------------------------*/
mbed_official 330:c80ac197fa6a 107 /* Private function prototypes -----------------------------------------------*/
mbed_official 330:c80ac197fa6a 108 static HAL_StatusTypeDef CEC_Transmit_IT(CEC_HandleTypeDef *hcec);
mbed_official 330:c80ac197fa6a 109 static HAL_StatusTypeDef CEC_Receive_IT(CEC_HandleTypeDef *hcec);
mbed_official 330:c80ac197fa6a 110 /* Exported functions ---------------------------------------------------------*/
mbed_official 330:c80ac197fa6a 111
mbed_official 330:c80ac197fa6a 112 /** @defgroup CEC_Exported_Functions CEC Exported Functions
mbed_official 330:c80ac197fa6a 113 * @{
mbed_official 330:c80ac197fa6a 114 */
mbed_official 330:c80ac197fa6a 115
mbed_official 330:c80ac197fa6a 116 /** @defgroup CEC_Exported_Functions_Group1 Initialization and de-initialization functions
mbed_official 330:c80ac197fa6a 117 * @brief Initialization and Configuration functions
mbed_official 330:c80ac197fa6a 118 *
mbed_official 330:c80ac197fa6a 119 @verbatim
mbed_official 330:c80ac197fa6a 120 ===============================================================================
mbed_official 330:c80ac197fa6a 121 ##### Initialization and Configuration functions #####
mbed_official 330:c80ac197fa6a 122 ===============================================================================
mbed_official 330:c80ac197fa6a 123 [..]
mbed_official 330:c80ac197fa6a 124 This subsection provides a set of functions allowing to initialize the CEC
mbed_official 330:c80ac197fa6a 125 (+) The following parameters need to be configured:
mbed_official 330:c80ac197fa6a 126 (++) SignalFreeTime
mbed_official 330:c80ac197fa6a 127 (++) Tolerance
mbed_official 330:c80ac197fa6a 128 (++) BRERxStop (RX stopped or not upon Bit Rising Error)
mbed_official 330:c80ac197fa6a 129 (++) BREErrorBitGen (Error-Bit generation in case of Bit Rising Error)
mbed_official 330:c80ac197fa6a 130 (++) LBPEErrorBitGen (Error-Bit generation in case of Long Bit Period Error)
mbed_official 330:c80ac197fa6a 131 (++) BroadcastMsgNoErrorBitGen (Error-bit generation in case of broadcast message error)
mbed_official 330:c80ac197fa6a 132 (++) SignalFreeTimeOption (SFT Timer start definition)
mbed_official 330:c80ac197fa6a 133 (++) OwnAddress (CEC device address)
mbed_official 330:c80ac197fa6a 134 (++) ListenMode
mbed_official 330:c80ac197fa6a 135
mbed_official 330:c80ac197fa6a 136 @endverbatim
mbed_official 330:c80ac197fa6a 137 * @{
mbed_official 330:c80ac197fa6a 138 */
mbed_official 330:c80ac197fa6a 139
mbed_official 330:c80ac197fa6a 140 /**
mbed_official 330:c80ac197fa6a 141 * @brief Initializes the CEC mode according to the specified
mbed_official 330:c80ac197fa6a 142 * parameters in the CEC_InitTypeDef and creates the associated handle .
mbed_official 330:c80ac197fa6a 143 * @param hcec: CEC handle
mbed_official 330:c80ac197fa6a 144 * @retval HAL status
mbed_official 330:c80ac197fa6a 145 */
mbed_official 330:c80ac197fa6a 146 HAL_StatusTypeDef HAL_CEC_Init(CEC_HandleTypeDef *hcec)
mbed_official 330:c80ac197fa6a 147 {
mbed_official 330:c80ac197fa6a 148 uint32_t tmpreg = 0x0;
mbed_official 330:c80ac197fa6a 149
mbed_official 330:c80ac197fa6a 150 /* Check the CEC handle allocation */
mbed_official 634:ac7d6880524d 151 if(hcec == HAL_NULL)
mbed_official 330:c80ac197fa6a 152 {
mbed_official 330:c80ac197fa6a 153 return HAL_ERROR;
mbed_official 330:c80ac197fa6a 154 }
mbed_official 330:c80ac197fa6a 155
mbed_official 330:c80ac197fa6a 156 /* Check the parameters */
mbed_official 330:c80ac197fa6a 157 assert_param(IS_CEC_ALL_INSTANCE(hcec->Instance));
mbed_official 330:c80ac197fa6a 158 assert_param(IS_CEC_SIGNALFREETIME(hcec->Init.SignalFreeTime));
mbed_official 330:c80ac197fa6a 159 assert_param(IS_CEC_TOLERANCE(hcec->Init.Tolerance));
mbed_official 330:c80ac197fa6a 160 assert_param(IS_CEC_BRERXSTOP(hcec->Init.BRERxStop));
mbed_official 330:c80ac197fa6a 161 assert_param(IS_CEC_BREERRORBITGEN(hcec->Init.BREErrorBitGen));
mbed_official 330:c80ac197fa6a 162 assert_param(IS_CEC_LBPEERRORBITGEN(hcec->Init.LBPEErrorBitGen));
mbed_official 330:c80ac197fa6a 163 assert_param(IS_CEC_BROADCASTERROR_NO_ERRORBIT_GENERATION(hcec->Init.BroadcastMsgNoErrorBitGen));
mbed_official 330:c80ac197fa6a 164 assert_param(IS_CEC_SFTOP(hcec->Init.SignalFreeTimeOption));
mbed_official 330:c80ac197fa6a 165 assert_param(IS_CEC_OAR_ADDRESS(hcec->Init.OwnAddress));
mbed_official 330:c80ac197fa6a 166 assert_param(IS_CEC_LISTENING_MODE(hcec->Init.ListenMode));
mbed_official 330:c80ac197fa6a 167 assert_param(IS_CEC_ADDRESS(hcec->Init.InitiatorAddress));
mbed_official 330:c80ac197fa6a 168
mbed_official 330:c80ac197fa6a 169
mbed_official 330:c80ac197fa6a 170 if(hcec->State == HAL_CEC_STATE_RESET)
mbed_official 330:c80ac197fa6a 171 {
mbed_official 330:c80ac197fa6a 172 /* Init the low level hardware : GPIO, CLOCK */
mbed_official 330:c80ac197fa6a 173 HAL_CEC_MspInit(hcec);
mbed_official 330:c80ac197fa6a 174 }
mbed_official 330:c80ac197fa6a 175
mbed_official 330:c80ac197fa6a 176 hcec->State = HAL_CEC_STATE_BUSY;
mbed_official 330:c80ac197fa6a 177
mbed_official 330:c80ac197fa6a 178 /* Disable the Peripheral */
mbed_official 330:c80ac197fa6a 179 __HAL_CEC_DISABLE(hcec);
mbed_official 330:c80ac197fa6a 180
mbed_official 330:c80ac197fa6a 181 tmpreg = hcec->Init.SignalFreeTime;
mbed_official 330:c80ac197fa6a 182 tmpreg |= hcec->Init.Tolerance;
mbed_official 330:c80ac197fa6a 183 tmpreg |= hcec->Init.BRERxStop;
mbed_official 330:c80ac197fa6a 184 tmpreg |= hcec->Init.BREErrorBitGen;
mbed_official 330:c80ac197fa6a 185 tmpreg |= hcec->Init.LBPEErrorBitGen;
mbed_official 330:c80ac197fa6a 186 tmpreg |= hcec->Init.BroadcastMsgNoErrorBitGen;
mbed_official 330:c80ac197fa6a 187 tmpreg |= hcec->Init.SignalFreeTimeOption;
mbed_official 330:c80ac197fa6a 188 tmpreg |= (hcec->Init.OwnAddress << CEC_CFGR_OAR_LSB_POS);
mbed_official 330:c80ac197fa6a 189 tmpreg |= hcec->Init.ListenMode;
mbed_official 330:c80ac197fa6a 190
mbed_official 330:c80ac197fa6a 191 /* Write to CEC Control Register */
mbed_official 330:c80ac197fa6a 192 MODIFY_REG(hcec->Instance->CFGR, CEC_CFGR_FIELDS, tmpreg);
mbed_official 330:c80ac197fa6a 193
mbed_official 330:c80ac197fa6a 194 /* Enable the Peripheral */
mbed_official 330:c80ac197fa6a 195 __HAL_CEC_ENABLE(hcec);
mbed_official 330:c80ac197fa6a 196
mbed_official 330:c80ac197fa6a 197 hcec->State = HAL_CEC_STATE_READY;
mbed_official 330:c80ac197fa6a 198
mbed_official 330:c80ac197fa6a 199 return HAL_OK;
mbed_official 330:c80ac197fa6a 200 }
mbed_official 330:c80ac197fa6a 201
mbed_official 330:c80ac197fa6a 202
mbed_official 330:c80ac197fa6a 203
mbed_official 330:c80ac197fa6a 204 /**
mbed_official 330:c80ac197fa6a 205 * @brief DeInitializes the CEC peripheral
mbed_official 330:c80ac197fa6a 206 * @param hcec: CEC handle
mbed_official 330:c80ac197fa6a 207 * @retval HAL status
mbed_official 330:c80ac197fa6a 208 */
mbed_official 330:c80ac197fa6a 209 HAL_StatusTypeDef HAL_CEC_DeInit(CEC_HandleTypeDef *hcec)
mbed_official 330:c80ac197fa6a 210 {
mbed_official 330:c80ac197fa6a 211 /* Check the CEC handle allocation */
mbed_official 634:ac7d6880524d 212 if(hcec == HAL_NULL)
mbed_official 330:c80ac197fa6a 213 {
mbed_official 330:c80ac197fa6a 214 return HAL_ERROR;
mbed_official 330:c80ac197fa6a 215 }
mbed_official 330:c80ac197fa6a 216
mbed_official 330:c80ac197fa6a 217 /* Check the parameters */
mbed_official 330:c80ac197fa6a 218 assert_param(IS_CEC_ALL_INSTANCE(hcec->Instance));
mbed_official 330:c80ac197fa6a 219
mbed_official 330:c80ac197fa6a 220 hcec->State = HAL_CEC_STATE_BUSY;
mbed_official 330:c80ac197fa6a 221
mbed_official 330:c80ac197fa6a 222 /* DeInit the low level hardware */
mbed_official 330:c80ac197fa6a 223 HAL_CEC_MspDeInit(hcec);
mbed_official 330:c80ac197fa6a 224 /* Disable the Peripheral */
mbed_official 330:c80ac197fa6a 225 __HAL_CEC_DISABLE(hcec);
mbed_official 330:c80ac197fa6a 226
mbed_official 330:c80ac197fa6a 227 hcec->ErrorCode = HAL_CEC_ERROR_NONE;
mbed_official 330:c80ac197fa6a 228 hcec->State = HAL_CEC_STATE_RESET;
mbed_official 330:c80ac197fa6a 229
mbed_official 330:c80ac197fa6a 230 /* Process Unlock */
mbed_official 330:c80ac197fa6a 231 __HAL_UNLOCK(hcec);
mbed_official 330:c80ac197fa6a 232
mbed_official 330:c80ac197fa6a 233 return HAL_OK;
mbed_official 330:c80ac197fa6a 234 }
mbed_official 330:c80ac197fa6a 235
mbed_official 330:c80ac197fa6a 236 /**
mbed_official 330:c80ac197fa6a 237 * @brief CEC MSP Init
mbed_official 330:c80ac197fa6a 238 * @param hcec: CEC handle
mbed_official 330:c80ac197fa6a 239 * @retval None
mbed_official 330:c80ac197fa6a 240 */
mbed_official 330:c80ac197fa6a 241 __weak void HAL_CEC_MspInit(CEC_HandleTypeDef *hcec)
mbed_official 330:c80ac197fa6a 242 {
mbed_official 330:c80ac197fa6a 243 /* NOTE : This function should not be modified, when the callback is needed,
mbed_official 330:c80ac197fa6a 244 the HAL_CEC_MspInit can be implemented in the user file
mbed_official 330:c80ac197fa6a 245 */
mbed_official 330:c80ac197fa6a 246 }
mbed_official 330:c80ac197fa6a 247
mbed_official 330:c80ac197fa6a 248 /**
mbed_official 330:c80ac197fa6a 249 * @brief CEC MSP DeInit
mbed_official 330:c80ac197fa6a 250 * @param hcec: CEC handle
mbed_official 330:c80ac197fa6a 251 * @retval None
mbed_official 330:c80ac197fa6a 252 */
mbed_official 330:c80ac197fa6a 253 __weak void HAL_CEC_MspDeInit(CEC_HandleTypeDef *hcec)
mbed_official 330:c80ac197fa6a 254 {
mbed_official 330:c80ac197fa6a 255 /* NOTE : This function should not be modified, when the callback is needed,
mbed_official 330:c80ac197fa6a 256 the HAL_CEC_MspDeInit can be implemented in the user file
mbed_official 330:c80ac197fa6a 257 */
mbed_official 330:c80ac197fa6a 258 }
mbed_official 330:c80ac197fa6a 259
mbed_official 330:c80ac197fa6a 260 /**
mbed_official 330:c80ac197fa6a 261 * @}
mbed_official 330:c80ac197fa6a 262 */
mbed_official 330:c80ac197fa6a 263
mbed_official 330:c80ac197fa6a 264 /** @defgroup CEC_Exported_Functions_Group2 Input and Output operation functions
mbed_official 330:c80ac197fa6a 265 * @brief CEC Transmit/Receive functions
mbed_official 330:c80ac197fa6a 266 *
mbed_official 330:c80ac197fa6a 267 @verbatim
mbed_official 330:c80ac197fa6a 268 ===============================================================================
mbed_official 330:c80ac197fa6a 269 ##### I/O operation functions #####
mbed_official 330:c80ac197fa6a 270 ===============================================================================
mbed_official 330:c80ac197fa6a 271 This subsection provides a set of functions allowing to manage the CEC data transfers.
mbed_official 330:c80ac197fa6a 272
mbed_official 330:c80ac197fa6a 273 (#) The CEC handle must contain the initiator (TX side) and the destination (RX side)
mbed_official 330:c80ac197fa6a 274 logical addresses (4-bit long addresses, 0xF for broadcast messages destination)
mbed_official 330:c80ac197fa6a 275
mbed_official 330:c80ac197fa6a 276 (#) There are two mode of transfer:
mbed_official 330:c80ac197fa6a 277 (+) Blocking mode: The communication is performed in polling mode.
mbed_official 330:c80ac197fa6a 278 The HAL status of all data processing is returned by the same function
mbed_official 330:c80ac197fa6a 279 after finishing transfer.
mbed_official 330:c80ac197fa6a 280 (+) No-Blocking mode: The communication is performed using Interrupts.
mbed_official 330:c80ac197fa6a 281 These API's return the HAL status.
mbed_official 330:c80ac197fa6a 282 The end of the data processing will be indicated through the
mbed_official 330:c80ac197fa6a 283 dedicated CEC IRQ when using Interrupt mode.
mbed_official 330:c80ac197fa6a 284 The HAL_CEC_TxCpltCallback(), HAL_CEC_RxCpltCallback() user callbacks
mbed_official 330:c80ac197fa6a 285 will be executed respectivelly at the end of the transmit or Receive process
mbed_official 330:c80ac197fa6a 286 The HAL_CEC_ErrorCallback()user callback will be executed when a communication
mbed_official 330:c80ac197fa6a 287 error is detected
mbed_official 330:c80ac197fa6a 288
mbed_official 330:c80ac197fa6a 289 (#) Blocking mode API's are :
mbed_official 330:c80ac197fa6a 290 (+) HAL_CEC_Transmit()
mbed_official 330:c80ac197fa6a 291 (+) HAL_CEC_Receive()
mbed_official 330:c80ac197fa6a 292
mbed_official 330:c80ac197fa6a 293 (#) Non-Blocking mode API's with Interrupt are :
mbed_official 330:c80ac197fa6a 294 (+) HAL_CEC_Transmit_IT()
mbed_official 330:c80ac197fa6a 295 (+) HAL_CEC_Receive_IT()
mbed_official 330:c80ac197fa6a 296 (+) HAL_CEC_IRQHandler()
mbed_official 330:c80ac197fa6a 297
mbed_official 330:c80ac197fa6a 298 (#) A set of Transfer Complete Callbacks are provided in No_Blocking mode:
mbed_official 330:c80ac197fa6a 299 (+) HAL_CEC_TxCpltCallback()
mbed_official 330:c80ac197fa6a 300 (+) HAL_CEC_RxCpltCallback()
mbed_official 330:c80ac197fa6a 301 (+) HAL_CEC_ErrorCallback()
mbed_official 330:c80ac197fa6a 302
mbed_official 330:c80ac197fa6a 303 @endverbatim
mbed_official 330:c80ac197fa6a 304 * @{
mbed_official 330:c80ac197fa6a 305 */
mbed_official 330:c80ac197fa6a 306
mbed_official 330:c80ac197fa6a 307 /**
mbed_official 330:c80ac197fa6a 308 * @brief Send data in blocking mode
mbed_official 330:c80ac197fa6a 309 * @param hcec: CEC handle
mbed_official 330:c80ac197fa6a 310 * @param DestinationAddress: destination logical address
mbed_official 330:c80ac197fa6a 311 * @param pData: pointer to input byte data buffer
mbed_official 330:c80ac197fa6a 312 * @param Size: amount of data to be sent in bytes (without counting the header).
mbed_official 330:c80ac197fa6a 313 * 0 means only the header is sent (ping operation).
mbed_official 330:c80ac197fa6a 314 * Maximum TX size is 15 bytes (1 opcode and up to 14 operands).
mbed_official 330:c80ac197fa6a 315 * @param Timeout: Timeout duration.
mbed_official 330:c80ac197fa6a 316 * @retval HAL status
mbed_official 330:c80ac197fa6a 317 */
mbed_official 330:c80ac197fa6a 318 HAL_StatusTypeDef HAL_CEC_Transmit(CEC_HandleTypeDef *hcec, uint8_t DestinationAddress, uint8_t *pData, uint32_t Size, uint32_t Timeout)
mbed_official 330:c80ac197fa6a 319 {
mbed_official 330:c80ac197fa6a 320 uint8_t temp = 0;
mbed_official 330:c80ac197fa6a 321 uint32_t tempisr = 0;
mbed_official 330:c80ac197fa6a 322 uint32_t tickstart = 0;
mbed_official 330:c80ac197fa6a 323
mbed_official 330:c80ac197fa6a 324 if((hcec->State == HAL_CEC_STATE_READY) && (__HAL_CEC_GET_TRANSMISSION_START_FLAG(hcec) == RESET))
mbed_official 330:c80ac197fa6a 325 {
mbed_official 330:c80ac197fa6a 326 hcec->ErrorCode = HAL_CEC_ERROR_NONE;
mbed_official 634:ac7d6880524d 327 if((pData == HAL_NULL) && (Size > 0))
mbed_official 330:c80ac197fa6a 328 {
mbed_official 330:c80ac197fa6a 329 hcec->State = HAL_CEC_STATE_ERROR;
mbed_official 330:c80ac197fa6a 330 return HAL_ERROR;
mbed_official 330:c80ac197fa6a 331 }
mbed_official 330:c80ac197fa6a 332
mbed_official 330:c80ac197fa6a 333 assert_param(IS_CEC_ADDRESS(DestinationAddress));
mbed_official 330:c80ac197fa6a 334 assert_param(IS_CEC_MSGSIZE(Size));
mbed_official 330:c80ac197fa6a 335
mbed_official 330:c80ac197fa6a 336 /* Process Locked */
mbed_official 330:c80ac197fa6a 337 __HAL_LOCK(hcec);
mbed_official 330:c80ac197fa6a 338
mbed_official 330:c80ac197fa6a 339 hcec->State = HAL_CEC_STATE_BUSY_TX;
mbed_official 330:c80ac197fa6a 340
mbed_official 330:c80ac197fa6a 341 hcec->TxXferCount = Size;
mbed_official 330:c80ac197fa6a 342
mbed_official 330:c80ac197fa6a 343 /* case no data to be sent, sender is only pinging the system */
mbed_official 330:c80ac197fa6a 344 if (Size == 0)
mbed_official 330:c80ac197fa6a 345 {
mbed_official 330:c80ac197fa6a 346 /* Set TX End of Message (TXEOM) bit, must be set before writing data to TXDR */
mbed_official 330:c80ac197fa6a 347 __HAL_CEC_LAST_BYTE_TX_SET(hcec);
mbed_official 330:c80ac197fa6a 348 }
mbed_official 330:c80ac197fa6a 349
mbed_official 330:c80ac197fa6a 350 /* send header block */
mbed_official 330:c80ac197fa6a 351 temp = (uint8_t)((uint32_t)(hcec->Init.InitiatorAddress) << CEC_INITIATOR_LSB_POS) | DestinationAddress;
mbed_official 330:c80ac197fa6a 352 hcec->Instance->TXDR = temp;
mbed_official 330:c80ac197fa6a 353 /* Set TX Start of Message (TXSOM) bit */
mbed_official 330:c80ac197fa6a 354 __HAL_CEC_FIRST_BYTE_TX_SET(hcec);
mbed_official 330:c80ac197fa6a 355
mbed_official 330:c80ac197fa6a 356 while (hcec->TxXferCount > 0)
mbed_official 330:c80ac197fa6a 357 {
mbed_official 330:c80ac197fa6a 358 hcec->TxXferCount--;
mbed_official 330:c80ac197fa6a 359
mbed_official 330:c80ac197fa6a 360 tickstart = HAL_GetTick();
mbed_official 330:c80ac197fa6a 361 while(HAL_IS_BIT_CLR(hcec->Instance->ISR, CEC_ISR_TXBR))
mbed_official 330:c80ac197fa6a 362 {
mbed_official 330:c80ac197fa6a 363 if(Timeout != HAL_MAX_DELAY)
mbed_official 330:c80ac197fa6a 364 {
mbed_official 330:c80ac197fa6a 365 if((Timeout == 0) || ((HAL_GetTick()-tickstart) > Timeout))
mbed_official 330:c80ac197fa6a 366 {
mbed_official 330:c80ac197fa6a 367 hcec->State = HAL_CEC_STATE_TIMEOUT;
mbed_official 330:c80ac197fa6a 368 /* Process Unlocked */
mbed_official 330:c80ac197fa6a 369 __HAL_UNLOCK(hcec);
mbed_official 330:c80ac197fa6a 370 return HAL_TIMEOUT;
mbed_official 330:c80ac197fa6a 371 }
mbed_official 330:c80ac197fa6a 372 }
mbed_official 330:c80ac197fa6a 373
mbed_official 330:c80ac197fa6a 374 /* check whether error occured while waiting for TXBR to be set:
mbed_official 330:c80ac197fa6a 375 * has Tx underrun occurred ?
mbed_official 330:c80ac197fa6a 376 * has Tx error occurred ?
mbed_official 330:c80ac197fa6a 377 * has Tx Missing Acknowledge error occurred ?
mbed_official 330:c80ac197fa6a 378 * has Arbitration Loss error occurred ? */
mbed_official 330:c80ac197fa6a 379 tempisr = hcec->Instance->ISR;
mbed_official 330:c80ac197fa6a 380 if ((tempisr & (CEC_ISR_TXUDR|CEC_ISR_TXERR|CEC_ISR_TXACKE|CEC_ISR_ARBLST)) != 0)
mbed_official 330:c80ac197fa6a 381 {
mbed_official 330:c80ac197fa6a 382 /* copy ISR for error handling purposes */
mbed_official 330:c80ac197fa6a 383 hcec->ErrorCode = tempisr;
mbed_official 330:c80ac197fa6a 384 /* clear all error flags by default */
mbed_official 330:c80ac197fa6a 385 __HAL_CEC_CLEAR_FLAG(hcec, (CEC_ISR_TXUDR|CEC_ISR_TXERR|CEC_ISR_TXACKE|CEC_ISR_ARBLST));
mbed_official 330:c80ac197fa6a 386 hcec->State = HAL_CEC_STATE_ERROR;
mbed_official 330:c80ac197fa6a 387 __HAL_UNLOCK(hcec);
mbed_official 330:c80ac197fa6a 388 return HAL_ERROR;
mbed_official 330:c80ac197fa6a 389 }
mbed_official 330:c80ac197fa6a 390 }
mbed_official 330:c80ac197fa6a 391 /* TXBR to clear BEFORE writing TXDR register */
mbed_official 330:c80ac197fa6a 392 __HAL_CEC_CLEAR_FLAG(hcec,CEC_ISR_TXBR);
mbed_official 330:c80ac197fa6a 393 if (hcec->TxXferCount == 0)
mbed_official 330:c80ac197fa6a 394 {
mbed_official 330:c80ac197fa6a 395 /* if last byte transmission, set TX End of Message (TXEOM) bit */
mbed_official 330:c80ac197fa6a 396 __HAL_CEC_LAST_BYTE_TX_SET(hcec);
mbed_official 330:c80ac197fa6a 397 }
mbed_official 330:c80ac197fa6a 398 hcec->Instance->TXDR = *pData++;
mbed_official 330:c80ac197fa6a 399
mbed_official 330:c80ac197fa6a 400 /* error check after TX byte write up */
mbed_official 330:c80ac197fa6a 401 tempisr = hcec->Instance->ISR;
mbed_official 330:c80ac197fa6a 402 if ((tempisr & (CEC_ISR_TXUDR|CEC_ISR_TXERR|CEC_ISR_TXACKE|CEC_ISR_ARBLST)) != 0)
mbed_official 330:c80ac197fa6a 403 {
mbed_official 330:c80ac197fa6a 404 /* copy ISR for error handling purposes */
mbed_official 330:c80ac197fa6a 405 hcec->ErrorCode = tempisr;
mbed_official 330:c80ac197fa6a 406 /* clear all error flags by default */
mbed_official 330:c80ac197fa6a 407 __HAL_CEC_CLEAR_FLAG(hcec, (CEC_ISR_TXUDR|CEC_ISR_TXERR|CEC_ISR_TXACKE|CEC_ISR_ARBLST));
mbed_official 330:c80ac197fa6a 408 hcec->State = HAL_CEC_STATE_ERROR;
mbed_official 330:c80ac197fa6a 409 __HAL_UNLOCK(hcec);
mbed_official 330:c80ac197fa6a 410 return HAL_ERROR;
mbed_official 330:c80ac197fa6a 411 }
mbed_official 330:c80ac197fa6a 412 } /* end while (while (hcec->TxXferCount > 0)) */
mbed_official 330:c80ac197fa6a 413
mbed_official 330:c80ac197fa6a 414
mbed_official 330:c80ac197fa6a 415 /* if no error up to this point, check that transmission is
mbed_official 330:c80ac197fa6a 416 * complete, that is wait until TXEOM is reset */
mbed_official 330:c80ac197fa6a 417 tickstart = HAL_GetTick();
mbed_official 330:c80ac197fa6a 418
mbed_official 330:c80ac197fa6a 419 while (HAL_IS_BIT_SET(hcec->Instance->CR, CEC_CR_TXEOM))
mbed_official 330:c80ac197fa6a 420 {
mbed_official 330:c80ac197fa6a 421 if(Timeout != HAL_MAX_DELAY)
mbed_official 330:c80ac197fa6a 422 {
mbed_official 330:c80ac197fa6a 423 if((Timeout == 0) || ((HAL_GetTick()-tickstart) > Timeout))
mbed_official 330:c80ac197fa6a 424 {
mbed_official 330:c80ac197fa6a 425 hcec->State = HAL_CEC_STATE_ERROR;
mbed_official 330:c80ac197fa6a 426 __HAL_UNLOCK(hcec);
mbed_official 330:c80ac197fa6a 427 return HAL_TIMEOUT;
mbed_official 330:c80ac197fa6a 428 }
mbed_official 330:c80ac197fa6a 429 }
mbed_official 330:c80ac197fa6a 430 }
mbed_official 330:c80ac197fa6a 431
mbed_official 330:c80ac197fa6a 432 /* Final error check once all bytes have been transmitted */
mbed_official 330:c80ac197fa6a 433 tempisr = hcec->Instance->ISR;
mbed_official 330:c80ac197fa6a 434 if ((tempisr & (CEC_ISR_TXUDR|CEC_ISR_TXERR|CEC_ISR_TXACKE)) != 0)
mbed_official 330:c80ac197fa6a 435 {
mbed_official 330:c80ac197fa6a 436 /* copy ISR for error handling purposes */
mbed_official 330:c80ac197fa6a 437 hcec->ErrorCode = tempisr;
mbed_official 330:c80ac197fa6a 438 /* clear all error flags by default */
mbed_official 330:c80ac197fa6a 439 __HAL_CEC_CLEAR_FLAG(hcec, (CEC_ISR_TXUDR|CEC_ISR_TXERR|CEC_ISR_TXACKE));
mbed_official 330:c80ac197fa6a 440 hcec->State = HAL_CEC_STATE_ERROR;
mbed_official 330:c80ac197fa6a 441 __HAL_UNLOCK(hcec);
mbed_official 330:c80ac197fa6a 442 return HAL_ERROR;
mbed_official 330:c80ac197fa6a 443 }
mbed_official 330:c80ac197fa6a 444
mbed_official 330:c80ac197fa6a 445 hcec->State = HAL_CEC_STATE_READY;
mbed_official 330:c80ac197fa6a 446 __HAL_UNLOCK(hcec);
mbed_official 330:c80ac197fa6a 447
mbed_official 330:c80ac197fa6a 448 return HAL_OK;
mbed_official 330:c80ac197fa6a 449 }
mbed_official 330:c80ac197fa6a 450 else
mbed_official 330:c80ac197fa6a 451 {
mbed_official 330:c80ac197fa6a 452 return HAL_BUSY;
mbed_official 330:c80ac197fa6a 453 }
mbed_official 330:c80ac197fa6a 454 }
mbed_official 330:c80ac197fa6a 455
mbed_official 330:c80ac197fa6a 456 /**
mbed_official 330:c80ac197fa6a 457 * @brief Receive data in blocking mode. Must be invoked when RXBR has been set.
mbed_official 330:c80ac197fa6a 458 * @param hcec: CEC handle
mbed_official 330:c80ac197fa6a 459 * @param pData: pointer to received data buffer.
mbed_official 330:c80ac197fa6a 460 * @param Timeout: Timeout duration.
mbed_official 330:c80ac197fa6a 461 * Note that the received data size is not known beforehand, the latter is known
mbed_official 330:c80ac197fa6a 462 * when the reception is complete and is stored in hcec->RxXferSize.
mbed_official 330:c80ac197fa6a 463 * hcec->RxXferSize is the sum of opcodes + operands (0 to 14 operands max).
mbed_official 330:c80ac197fa6a 464 * If only a header is received, hcec->RxXferSize = 0
mbed_official 330:c80ac197fa6a 465 * @retval HAL status
mbed_official 330:c80ac197fa6a 466 */
mbed_official 330:c80ac197fa6a 467 HAL_StatusTypeDef HAL_CEC_Receive(CEC_HandleTypeDef *hcec, uint8_t *pData, uint32_t Timeout)
mbed_official 330:c80ac197fa6a 468 {
mbed_official 330:c80ac197fa6a 469 uint32_t temp;
mbed_official 330:c80ac197fa6a 470 uint32_t tickstart = 0;
mbed_official 330:c80ac197fa6a 471
mbed_official 330:c80ac197fa6a 472 if (hcec->State == HAL_CEC_STATE_READY)
mbed_official 330:c80ac197fa6a 473 {
mbed_official 330:c80ac197fa6a 474 hcec->ErrorCode = HAL_CEC_ERROR_NONE;
mbed_official 634:ac7d6880524d 475 if (pData == HAL_NULL)
mbed_official 330:c80ac197fa6a 476 {
mbed_official 330:c80ac197fa6a 477 hcec->State = HAL_CEC_STATE_ERROR;
mbed_official 330:c80ac197fa6a 478 return HAL_ERROR;
mbed_official 330:c80ac197fa6a 479 }
mbed_official 330:c80ac197fa6a 480
mbed_official 330:c80ac197fa6a 481 hcec->RxXferSize = 0;
mbed_official 330:c80ac197fa6a 482 /* Process Locked */
mbed_official 330:c80ac197fa6a 483 __HAL_LOCK(hcec);
mbed_official 330:c80ac197fa6a 484
mbed_official 330:c80ac197fa6a 485
mbed_official 330:c80ac197fa6a 486 /* Rx loop until CEC_ISR_RXEND is set */
mbed_official 330:c80ac197fa6a 487 while (HAL_IS_BIT_CLR(hcec->Instance->ISR, CEC_ISR_RXEND))
mbed_official 330:c80ac197fa6a 488 {
mbed_official 330:c80ac197fa6a 489 tickstart = HAL_GetTick();
mbed_official 330:c80ac197fa6a 490 /* Wait for next byte to be received */
mbed_official 330:c80ac197fa6a 491 while (HAL_IS_BIT_CLR(hcec->Instance->ISR, CEC_ISR_RXBR))
mbed_official 330:c80ac197fa6a 492 {
mbed_official 330:c80ac197fa6a 493 if(Timeout != HAL_MAX_DELAY)
mbed_official 330:c80ac197fa6a 494 {
mbed_official 330:c80ac197fa6a 495 if((Timeout == 0) || ((HAL_GetTick()-tickstart) > Timeout))
mbed_official 330:c80ac197fa6a 496 {
mbed_official 330:c80ac197fa6a 497 hcec->State = HAL_CEC_STATE_TIMEOUT;
mbed_official 330:c80ac197fa6a 498 __HAL_UNLOCK(hcec);
mbed_official 330:c80ac197fa6a 499 return HAL_TIMEOUT;
mbed_official 330:c80ac197fa6a 500 }
mbed_official 330:c80ac197fa6a 501 }
mbed_official 330:c80ac197fa6a 502 /* any error so far ?
mbed_official 330:c80ac197fa6a 503 * has Rx Missing Acknowledge occurred ?
mbed_official 330:c80ac197fa6a 504 * has Rx Long Bit Period error occurred ?
mbed_official 330:c80ac197fa6a 505 * has Rx Short Bit Period error occurred ?
mbed_official 330:c80ac197fa6a 506 * has Rx Bit Rising error occurred ?
mbed_official 330:c80ac197fa6a 507 * has Rx Overrun error occurred ? */
mbed_official 330:c80ac197fa6a 508 temp = (uint32_t) (hcec->Instance->ISR);
mbed_official 330:c80ac197fa6a 509 if ((temp & (CEC_ISR_RXACKE|CEC_ISR_LBPE|CEC_ISR_SBPE|CEC_ISR_BRE|CEC_ISR_RXOVR)) != 0)
mbed_official 330:c80ac197fa6a 510 {
mbed_official 330:c80ac197fa6a 511 /* copy ISR for error handling purposes */
mbed_official 330:c80ac197fa6a 512 hcec->ErrorCode = temp;
mbed_official 330:c80ac197fa6a 513 /* clear all error flags by default */
mbed_official 330:c80ac197fa6a 514 __HAL_CEC_CLEAR_FLAG(hcec, (CEC_ISR_RXACKE|CEC_ISR_LBPE|CEC_ISR_SBPE|CEC_ISR_BRE|CEC_ISR_RXOVR));
mbed_official 330:c80ac197fa6a 515 hcec->State = HAL_CEC_STATE_ERROR;
mbed_official 330:c80ac197fa6a 516 __HAL_UNLOCK(hcec);
mbed_official 330:c80ac197fa6a 517 return HAL_ERROR;
mbed_official 330:c80ac197fa6a 518 }
mbed_official 330:c80ac197fa6a 519 } /* while (HAL_IS_BIT_CLR(hcec->Instance->ISR, CEC_ISR_RXBR)) */
mbed_official 330:c80ac197fa6a 520
mbed_official 330:c80ac197fa6a 521
mbed_official 330:c80ac197fa6a 522 /* read received data */
mbed_official 330:c80ac197fa6a 523 *pData++ = hcec->Instance->RXDR;
mbed_official 330:c80ac197fa6a 524 temp = (uint32_t) (hcec->Instance->ISR);
mbed_official 330:c80ac197fa6a 525 /* end of message ? */
mbed_official 330:c80ac197fa6a 526 if ((temp & CEC_ISR_RXEND) != 0)
mbed_official 330:c80ac197fa6a 527 {
mbed_official 330:c80ac197fa6a 528 assert_param(IS_CEC_MSGSIZE(hcec->RxXferSize));
mbed_official 330:c80ac197fa6a 529 __HAL_CEC_CLEAR_FLAG(hcec,CEC_ISR_RXEND);
mbed_official 330:c80ac197fa6a 530 hcec->State = HAL_CEC_STATE_READY;
mbed_official 330:c80ac197fa6a 531 __HAL_UNLOCK(hcec);
mbed_official 330:c80ac197fa6a 532 return HAL_OK;
mbed_official 330:c80ac197fa6a 533 }
mbed_official 330:c80ac197fa6a 534
mbed_official 330:c80ac197fa6a 535 /* clear Rx-Byte Received flag */
mbed_official 330:c80ac197fa6a 536 __HAL_CEC_CLEAR_FLAG(hcec,CEC_ISR_RXBR);
mbed_official 330:c80ac197fa6a 537 /* increment payload byte counter */
mbed_official 330:c80ac197fa6a 538 hcec->RxXferSize++;
mbed_official 330:c80ac197fa6a 539 } /* while (HAL_IS_BIT_CLR(hcec->Instance->ISR, CEC_ISR_RXEND)) */
mbed_official 330:c80ac197fa6a 540
mbed_official 330:c80ac197fa6a 541 /* if the instructions below are executed, it means RXEND was set when RXBR was
mbed_official 330:c80ac197fa6a 542 * set for the first time:
mbed_official 330:c80ac197fa6a 543 * the code within the "while (HAL_IS_BIT_CLR(hcec->Instance->ISR, CEC_ISR_RXEND))"
mbed_official 330:c80ac197fa6a 544 * loop has not been executed and this means a single byte has been sent */
mbed_official 330:c80ac197fa6a 545 *pData++ = hcec->Instance->RXDR;
mbed_official 330:c80ac197fa6a 546 /* only one header is received: RxXferSize is set to 0 (no operand, no opcode) */
mbed_official 330:c80ac197fa6a 547 hcec->RxXferSize = 0;
mbed_official 330:c80ac197fa6a 548 __HAL_CEC_CLEAR_FLAG(hcec,CEC_ISR_RXEND);
mbed_official 330:c80ac197fa6a 549
mbed_official 330:c80ac197fa6a 550 hcec->State = HAL_CEC_STATE_READY;
mbed_official 330:c80ac197fa6a 551 __HAL_UNLOCK(hcec);
mbed_official 330:c80ac197fa6a 552 return HAL_OK;
mbed_official 330:c80ac197fa6a 553 }
mbed_official 330:c80ac197fa6a 554 else
mbed_official 330:c80ac197fa6a 555 {
mbed_official 330:c80ac197fa6a 556 return HAL_BUSY;
mbed_official 330:c80ac197fa6a 557 }
mbed_official 330:c80ac197fa6a 558 }
mbed_official 330:c80ac197fa6a 559
mbed_official 330:c80ac197fa6a 560
mbed_official 330:c80ac197fa6a 561 /**
mbed_official 330:c80ac197fa6a 562 * @brief Send data in interrupt mode
mbed_official 330:c80ac197fa6a 563 * @param hcec: CEC handle
mbed_official 330:c80ac197fa6a 564 * @param DestinationAddress: destination logical address
mbed_official 330:c80ac197fa6a 565 * @param pData: pointer to input byte data buffer
mbed_official 330:c80ac197fa6a 566 * @param Size: amount of data to be sent in bytes (without counting the header).
mbed_official 330:c80ac197fa6a 567 * 0 means only the header is sent (ping operation).
mbed_official 330:c80ac197fa6a 568 * Maximum TX size is 15 bytes (1 opcode and up to 14 operands).
mbed_official 330:c80ac197fa6a 569 * @retval HAL status
mbed_official 330:c80ac197fa6a 570 */
mbed_official 330:c80ac197fa6a 571 HAL_StatusTypeDef HAL_CEC_Transmit_IT(CEC_HandleTypeDef *hcec, uint8_t DestinationAddress, uint8_t *pData, uint32_t Size)
mbed_official 330:c80ac197fa6a 572 {
mbed_official 330:c80ac197fa6a 573 uint8_t temp = 0;
mbed_official 330:c80ac197fa6a 574 /* if the IP isn't already busy and if there is no previous transmission
mbed_official 330:c80ac197fa6a 575 already pending due to arbitration lost */
mbed_official 330:c80ac197fa6a 576 if (((hcec->State == HAL_CEC_STATE_READY) || (hcec->State == HAL_CEC_STATE_STANDBY_RX))
mbed_official 330:c80ac197fa6a 577 && (__HAL_CEC_GET_TRANSMISSION_START_FLAG(hcec) == RESET))
mbed_official 330:c80ac197fa6a 578 {
mbed_official 634:ac7d6880524d 579 if((pData == HAL_NULL) && (Size > 0))
mbed_official 330:c80ac197fa6a 580 {
mbed_official 330:c80ac197fa6a 581 hcec->State = HAL_CEC_STATE_ERROR;
mbed_official 330:c80ac197fa6a 582 return HAL_ERROR;
mbed_official 330:c80ac197fa6a 583 }
mbed_official 330:c80ac197fa6a 584
mbed_official 330:c80ac197fa6a 585 assert_param(IS_CEC_ADDRESS(DestinationAddress));
mbed_official 330:c80ac197fa6a 586 assert_param(IS_CEC_MSGSIZE(Size));
mbed_official 330:c80ac197fa6a 587
mbed_official 330:c80ac197fa6a 588 /* Process Locked */
mbed_official 330:c80ac197fa6a 589 __HAL_LOCK(hcec);
mbed_official 330:c80ac197fa6a 590 hcec->pTxBuffPtr = pData;
mbed_official 330:c80ac197fa6a 591 hcec->State = HAL_CEC_STATE_BUSY_TX;
mbed_official 330:c80ac197fa6a 592 hcec->ErrorCode = HAL_CEC_ERROR_NONE;
mbed_official 330:c80ac197fa6a 593
mbed_official 330:c80ac197fa6a 594 /* Disable Peripheral to write CEC_IER register */
mbed_official 330:c80ac197fa6a 595 __HAL_CEC_DISABLE(hcec);
mbed_official 330:c80ac197fa6a 596
mbed_official 330:c80ac197fa6a 597 /* Enable the following two CEC Transmission interrupts as
mbed_official 330:c80ac197fa6a 598 * well as the following CEC Transmission Errors interrupts:
mbed_official 330:c80ac197fa6a 599 * Tx Byte Request IT
mbed_official 330:c80ac197fa6a 600 * End of Transmission IT
mbed_official 330:c80ac197fa6a 601 * Tx Missing Acknowledge IT
mbed_official 330:c80ac197fa6a 602 * Tx-Error IT
mbed_official 330:c80ac197fa6a 603 * Tx-Buffer Underrun IT
mbed_official 330:c80ac197fa6a 604 * Tx arbitration lost */
mbed_official 330:c80ac197fa6a 605 __HAL_CEC_ENABLE_IT(hcec, CEC_IER_TXBRIE|CEC_IER_TXENDIE|CEC_IER_TX_ALL_ERR);
mbed_official 330:c80ac197fa6a 606
mbed_official 330:c80ac197fa6a 607 /* Enable the Peripheral */
mbed_official 330:c80ac197fa6a 608 __HAL_CEC_ENABLE(hcec);
mbed_official 330:c80ac197fa6a 609
mbed_official 330:c80ac197fa6a 610 /* initialize the number of bytes to send,
mbed_official 330:c80ac197fa6a 611 * 0 means only one header is sent (ping operation) */
mbed_official 330:c80ac197fa6a 612 hcec->TxXferCount = Size;
mbed_official 330:c80ac197fa6a 613
mbed_official 330:c80ac197fa6a 614 /* Process Unlocked */
mbed_official 330:c80ac197fa6a 615 __HAL_UNLOCK(hcec);
mbed_official 330:c80ac197fa6a 616
mbed_official 330:c80ac197fa6a 617 /* in case of no payload (Size = 0), sender is only pinging the system;
mbed_official 330:c80ac197fa6a 618 * Set TX End of Message (TXEOM) bit, must be set before writing data to TXDR */
mbed_official 330:c80ac197fa6a 619 if (Size == 0)
mbed_official 330:c80ac197fa6a 620 {
mbed_official 330:c80ac197fa6a 621 __HAL_CEC_LAST_BYTE_TX_SET(hcec);
mbed_official 330:c80ac197fa6a 622 }
mbed_official 330:c80ac197fa6a 623
mbed_official 330:c80ac197fa6a 624 /* send header block */
mbed_official 330:c80ac197fa6a 625 temp = (uint8_t)((uint32_t)(hcec->Init.InitiatorAddress) << CEC_INITIATOR_LSB_POS) | DestinationAddress;
mbed_official 330:c80ac197fa6a 626 hcec->Instance->TXDR = temp;
mbed_official 330:c80ac197fa6a 627 /* Set TX Start of Message (TXSOM) bit */
mbed_official 330:c80ac197fa6a 628 __HAL_CEC_FIRST_BYTE_TX_SET(hcec);
mbed_official 330:c80ac197fa6a 629
mbed_official 330:c80ac197fa6a 630 return HAL_OK;
mbed_official 330:c80ac197fa6a 631 }
mbed_official 330:c80ac197fa6a 632 /* if the IP is already busy or if there is a previous transmission
mbed_official 330:c80ac197fa6a 633 already pending due to arbitration loss */
mbed_official 330:c80ac197fa6a 634 else if ((hcec->State == HAL_CEC_STATE_BUSY_TX)
mbed_official 330:c80ac197fa6a 635 || (__HAL_CEC_GET_TRANSMISSION_START_FLAG(hcec) != RESET))
mbed_official 330:c80ac197fa6a 636 {
mbed_official 330:c80ac197fa6a 637 __HAL_LOCK(hcec);
mbed_official 330:c80ac197fa6a 638 /* set state to BUSY TX, in case it wasn't set already (case
mbed_official 330:c80ac197fa6a 639 * of transmission new attempt after arbitration loss) */
mbed_official 330:c80ac197fa6a 640 if (hcec->State != HAL_CEC_STATE_BUSY_TX)
mbed_official 330:c80ac197fa6a 641 {
mbed_official 330:c80ac197fa6a 642 hcec->State = HAL_CEC_STATE_BUSY_TX;
mbed_official 330:c80ac197fa6a 643 }
mbed_official 330:c80ac197fa6a 644
mbed_official 330:c80ac197fa6a 645 /* if all data have been sent */
mbed_official 330:c80ac197fa6a 646 if(hcec->TxXferCount == 0)
mbed_official 330:c80ac197fa6a 647 {
mbed_official 330:c80ac197fa6a 648 /* Disable Peripheral to write CEC_IER register */
mbed_official 330:c80ac197fa6a 649 __HAL_CEC_DISABLE(hcec);
mbed_official 330:c80ac197fa6a 650
mbed_official 330:c80ac197fa6a 651 /* Disable the CEC Transmission Interrupts */
mbed_official 330:c80ac197fa6a 652 __HAL_CEC_DISABLE_IT(hcec, CEC_IER_TXBRIE|CEC_IER_TXENDIE);
mbed_official 330:c80ac197fa6a 653 /* Disable the CEC Transmission Error Interrupts */
mbed_official 330:c80ac197fa6a 654 __HAL_CEC_DISABLE_IT(hcec, CEC_IER_TX_ALL_ERR);
mbed_official 330:c80ac197fa6a 655
mbed_official 330:c80ac197fa6a 656 /* Enable the Peripheral */
mbed_official 330:c80ac197fa6a 657 __HAL_CEC_ENABLE(hcec);
mbed_official 330:c80ac197fa6a 658
mbed_official 330:c80ac197fa6a 659 __HAL_CEC_CLEAR_FLAG(hcec,CEC_ISR_TXBR|CEC_ISR_TXEND);
mbed_official 330:c80ac197fa6a 660
mbed_official 330:c80ac197fa6a 661 hcec->State = HAL_CEC_STATE_READY;
mbed_official 330:c80ac197fa6a 662 /* Call the Process Unlocked before calling the Tx call back API to give the possibility to
mbed_official 330:c80ac197fa6a 663 start again the Transmission under the Tx call back API */
mbed_official 330:c80ac197fa6a 664 __HAL_UNLOCK(hcec);
mbed_official 330:c80ac197fa6a 665
mbed_official 330:c80ac197fa6a 666 HAL_CEC_TxCpltCallback(hcec);
mbed_official 330:c80ac197fa6a 667
mbed_official 330:c80ac197fa6a 668 return HAL_OK;
mbed_official 330:c80ac197fa6a 669 }
mbed_official 330:c80ac197fa6a 670 else
mbed_official 330:c80ac197fa6a 671 {
mbed_official 330:c80ac197fa6a 672 if (hcec->TxXferCount == 1)
mbed_official 330:c80ac197fa6a 673 {
mbed_official 330:c80ac197fa6a 674 /* if this is the last byte transmission, set TX End of Message (TXEOM) bit */
mbed_official 330:c80ac197fa6a 675 __HAL_CEC_LAST_BYTE_TX_SET(hcec);
mbed_official 330:c80ac197fa6a 676 }
mbed_official 330:c80ac197fa6a 677 /* clear Tx-Byte request flag */
mbed_official 330:c80ac197fa6a 678 __HAL_CEC_CLEAR_FLAG(hcec,CEC_ISR_TXBR);
mbed_official 330:c80ac197fa6a 679 hcec->Instance->TXDR = *hcec->pTxBuffPtr++;
mbed_official 330:c80ac197fa6a 680 hcec->TxXferCount--;
mbed_official 330:c80ac197fa6a 681
mbed_official 330:c80ac197fa6a 682 /* Process Unlocked */
mbed_official 330:c80ac197fa6a 683 __HAL_UNLOCK(hcec);
mbed_official 330:c80ac197fa6a 684
mbed_official 330:c80ac197fa6a 685 return HAL_OK;
mbed_official 330:c80ac197fa6a 686 }
mbed_official 330:c80ac197fa6a 687 }
mbed_official 330:c80ac197fa6a 688 else
mbed_official 330:c80ac197fa6a 689 {
mbed_official 330:c80ac197fa6a 690 return HAL_BUSY;
mbed_official 330:c80ac197fa6a 691 }
mbed_official 330:c80ac197fa6a 692 }
mbed_official 330:c80ac197fa6a 693
mbed_official 330:c80ac197fa6a 694
mbed_official 330:c80ac197fa6a 695 /**
mbed_official 330:c80ac197fa6a 696 * @brief Receive data in interrupt mode.
mbed_official 330:c80ac197fa6a 697 * @param hcec: CEC handle
mbed_official 330:c80ac197fa6a 698 * @param pData: pointer to received data buffer.
mbed_official 330:c80ac197fa6a 699 * Note that the received data size is not known beforehand, the latter is known
mbed_official 330:c80ac197fa6a 700 * when the reception is complete and is stored in hcec->RxXferSize.
mbed_official 330:c80ac197fa6a 701 * hcec->RxXferSize is the sum of opcodes + operands (0 to 14 operands max).
mbed_official 330:c80ac197fa6a 702 * If only a header is received, hcec->RxXferSize = 0
mbed_official 330:c80ac197fa6a 703 * @retval HAL status
mbed_official 330:c80ac197fa6a 704 */
mbed_official 330:c80ac197fa6a 705 HAL_StatusTypeDef HAL_CEC_Receive_IT(CEC_HandleTypeDef *hcec, uint8_t *pData)
mbed_official 330:c80ac197fa6a 706 {
mbed_official 330:c80ac197fa6a 707 if(hcec->State == HAL_CEC_STATE_READY)
mbed_official 330:c80ac197fa6a 708 {
mbed_official 634:ac7d6880524d 709 if(pData == HAL_NULL)
mbed_official 330:c80ac197fa6a 710 {
mbed_official 330:c80ac197fa6a 711 hcec->State = HAL_CEC_STATE_ERROR;
mbed_official 330:c80ac197fa6a 712 return HAL_ERROR;
mbed_official 330:c80ac197fa6a 713 }
mbed_official 330:c80ac197fa6a 714
mbed_official 330:c80ac197fa6a 715 /* Process Locked */
mbed_official 330:c80ac197fa6a 716 __HAL_LOCK(hcec);
mbed_official 330:c80ac197fa6a 717 hcec->RxXferSize = 0;
mbed_official 330:c80ac197fa6a 718 hcec->pRxBuffPtr = pData;
mbed_official 330:c80ac197fa6a 719 hcec->ErrorCode = HAL_CEC_ERROR_NONE;
mbed_official 330:c80ac197fa6a 720 /* the IP is moving to a ready to receive state */
mbed_official 330:c80ac197fa6a 721 hcec->State = HAL_CEC_STATE_STANDBY_RX;
mbed_official 330:c80ac197fa6a 722
mbed_official 330:c80ac197fa6a 723 /* Disable Peripheral to write CEC_IER register */
mbed_official 330:c80ac197fa6a 724 __HAL_CEC_DISABLE(hcec);
mbed_official 330:c80ac197fa6a 725
mbed_official 330:c80ac197fa6a 726 /* Enable the following CEC Reception Error Interrupts:
mbed_official 330:c80ac197fa6a 727 * Rx overrun
mbed_official 330:c80ac197fa6a 728 * Rx bit rising error
mbed_official 330:c80ac197fa6a 729 * Rx short bit period error
mbed_official 330:c80ac197fa6a 730 * Rx long bit period error
mbed_official 330:c80ac197fa6a 731 * Rx missing acknowledge */
mbed_official 330:c80ac197fa6a 732 __HAL_CEC_ENABLE_IT(hcec, CEC_IER_RX_ALL_ERR);
mbed_official 330:c80ac197fa6a 733
mbed_official 330:c80ac197fa6a 734 /* Process Unlocked */
mbed_official 330:c80ac197fa6a 735 __HAL_UNLOCK(hcec);
mbed_official 330:c80ac197fa6a 736
mbed_official 330:c80ac197fa6a 737 /* Enable the following two CEC Reception interrupts:
mbed_official 330:c80ac197fa6a 738 * Rx Byte Received IT
mbed_official 330:c80ac197fa6a 739 * End of Reception IT */
mbed_official 330:c80ac197fa6a 740 __HAL_CEC_ENABLE_IT(hcec, CEC_IER_RXBRIE|CEC_IER_RXENDIE);
mbed_official 330:c80ac197fa6a 741
mbed_official 330:c80ac197fa6a 742 __HAL_CEC_ENABLE(hcec);
mbed_official 330:c80ac197fa6a 743
mbed_official 330:c80ac197fa6a 744 return HAL_OK;
mbed_official 330:c80ac197fa6a 745 }
mbed_official 330:c80ac197fa6a 746 else
mbed_official 330:c80ac197fa6a 747 {
mbed_official 330:c80ac197fa6a 748 return HAL_BUSY;
mbed_official 330:c80ac197fa6a 749 }
mbed_official 330:c80ac197fa6a 750 }
mbed_official 330:c80ac197fa6a 751
mbed_official 330:c80ac197fa6a 752
mbed_official 330:c80ac197fa6a 753
mbed_official 330:c80ac197fa6a 754 /**
mbed_official 330:c80ac197fa6a 755 * @brief This function handles CEC interrupt requests.
mbed_official 330:c80ac197fa6a 756 * @param hcec: CEC handle
mbed_official 330:c80ac197fa6a 757 * @retval None
mbed_official 330:c80ac197fa6a 758 */
mbed_official 330:c80ac197fa6a 759 void HAL_CEC_IRQHandler(CEC_HandleTypeDef *hcec)
mbed_official 330:c80ac197fa6a 760 {
mbed_official 330:c80ac197fa6a 761 /* save interrupts register for further error or interrupts handling purposes */
mbed_official 330:c80ac197fa6a 762 hcec->ErrorCode = hcec->Instance->ISR;
mbed_official 330:c80ac197fa6a 763 /* CEC TX missing acknowledge error interrupt occurred -------------------------------------*/
mbed_official 330:c80ac197fa6a 764 if((__HAL_CEC_GET_IT(hcec, CEC_ISR_TXACKE) != RESET) && (__HAL_CEC_GET_IT_SOURCE(hcec, CEC_IER_TXACKEIE) != RESET))
mbed_official 330:c80ac197fa6a 765 {
mbed_official 330:c80ac197fa6a 766 __HAL_CEC_CLEAR_FLAG(hcec, CEC_ISR_TXACKE);
mbed_official 330:c80ac197fa6a 767 hcec->State = HAL_CEC_STATE_ERROR;
mbed_official 330:c80ac197fa6a 768 }
mbed_official 330:c80ac197fa6a 769
mbed_official 330:c80ac197fa6a 770 /* CEC transmit error interrupt occured --------------------------------------*/
mbed_official 330:c80ac197fa6a 771 if((__HAL_CEC_GET_IT(hcec, CEC_ISR_TXERR) != RESET) && (__HAL_CEC_GET_IT_SOURCE(hcec, CEC_IER_TXERRIE) != RESET))
mbed_official 330:c80ac197fa6a 772 {
mbed_official 330:c80ac197fa6a 773 __HAL_CEC_CLEAR_FLAG(hcec, CEC_ISR_TXERR);
mbed_official 330:c80ac197fa6a 774 hcec->State = HAL_CEC_STATE_ERROR;
mbed_official 330:c80ac197fa6a 775 }
mbed_official 330:c80ac197fa6a 776
mbed_official 330:c80ac197fa6a 777 /* CEC TX underrun error interrupt occured --------------------------------------*/
mbed_official 330:c80ac197fa6a 778 if((__HAL_CEC_GET_IT(hcec, CEC_ISR_TXUDR) != RESET) && (__HAL_CEC_GET_IT_SOURCE(hcec, CEC_IER_TXUDRIE) != RESET))
mbed_official 330:c80ac197fa6a 779 {
mbed_official 330:c80ac197fa6a 780 __HAL_CEC_CLEAR_FLAG(hcec, CEC_ISR_TXUDR);
mbed_official 330:c80ac197fa6a 781 hcec->State = HAL_CEC_STATE_ERROR;
mbed_official 330:c80ac197fa6a 782 }
mbed_official 330:c80ac197fa6a 783
mbed_official 330:c80ac197fa6a 784 /* CEC TX arbitration error interrupt occured --------------------------------------*/
mbed_official 330:c80ac197fa6a 785 if((__HAL_CEC_GET_IT(hcec, CEC_ISR_ARBLST) != RESET) && (__HAL_CEC_GET_IT_SOURCE(hcec, CEC_IER_ARBLSTIE) != RESET))
mbed_official 330:c80ac197fa6a 786 {
mbed_official 330:c80ac197fa6a 787 __HAL_CEC_CLEAR_FLAG(hcec, CEC_ISR_ARBLST);
mbed_official 330:c80ac197fa6a 788 hcec->State = HAL_CEC_STATE_ERROR;
mbed_official 330:c80ac197fa6a 789 }
mbed_official 330:c80ac197fa6a 790
mbed_official 330:c80ac197fa6a 791 /* CEC RX overrun error interrupt occured --------------------------------------*/
mbed_official 330:c80ac197fa6a 792 if((__HAL_CEC_GET_IT(hcec, CEC_ISR_RXOVR) != RESET) && (__HAL_CEC_GET_IT_SOURCE(hcec, CEC_IER_RXOVRIE) != RESET))
mbed_official 330:c80ac197fa6a 793 {
mbed_official 330:c80ac197fa6a 794 __HAL_CEC_CLEAR_FLAG(hcec, CEC_ISR_RXOVR);
mbed_official 330:c80ac197fa6a 795 hcec->State = HAL_CEC_STATE_ERROR;
mbed_official 330:c80ac197fa6a 796 }
mbed_official 330:c80ac197fa6a 797
mbed_official 330:c80ac197fa6a 798 /* CEC RX bit rising error interrupt occured --------------------------------------*/
mbed_official 330:c80ac197fa6a 799 if((__HAL_CEC_GET_IT(hcec, CEC_ISR_BRE) != RESET) && (__HAL_CEC_GET_IT_SOURCE(hcec, CEC_IER_BREIE) != RESET))
mbed_official 330:c80ac197fa6a 800 {
mbed_official 330:c80ac197fa6a 801 __HAL_CEC_CLEAR_FLAG(hcec, CEC_ISR_BRE);
mbed_official 330:c80ac197fa6a 802 hcec->State = HAL_CEC_STATE_ERROR;
mbed_official 330:c80ac197fa6a 803 }
mbed_official 330:c80ac197fa6a 804
mbed_official 330:c80ac197fa6a 805 /* CEC RX short bit period error interrupt occured --------------------------------------*/
mbed_official 330:c80ac197fa6a 806 if((__HAL_CEC_GET_IT(hcec, CEC_ISR_SBPE) != RESET) && (__HAL_CEC_GET_IT_SOURCE(hcec, CEC_IER_SBPEIE) != RESET))
mbed_official 330:c80ac197fa6a 807 {
mbed_official 330:c80ac197fa6a 808 __HAL_CEC_CLEAR_FLAG(hcec, CEC_ISR_SBPE);
mbed_official 330:c80ac197fa6a 809 hcec->State = HAL_CEC_STATE_ERROR;
mbed_official 330:c80ac197fa6a 810 }
mbed_official 330:c80ac197fa6a 811
mbed_official 330:c80ac197fa6a 812 /* CEC RX long bit period error interrupt occured --------------------------------------*/
mbed_official 330:c80ac197fa6a 813 if((__HAL_CEC_GET_IT(hcec, CEC_ISR_LBPE) != RESET) && (__HAL_CEC_GET_IT_SOURCE(hcec, CEC_IER_LBPEIE) != RESET))
mbed_official 330:c80ac197fa6a 814 {
mbed_official 330:c80ac197fa6a 815 __HAL_CEC_CLEAR_FLAG(hcec, CEC_ISR_LBPE);
mbed_official 330:c80ac197fa6a 816 hcec->State = HAL_CEC_STATE_ERROR;
mbed_official 330:c80ac197fa6a 817 }
mbed_official 330:c80ac197fa6a 818
mbed_official 330:c80ac197fa6a 819 /* CEC RX missing acknowledge error interrupt occured --------------------------------------*/
mbed_official 330:c80ac197fa6a 820 if((__HAL_CEC_GET_IT(hcec, CEC_ISR_RXACKE) != RESET) && (__HAL_CEC_GET_IT_SOURCE(hcec, CEC_IER_RXACKEIE) != RESET))
mbed_official 330:c80ac197fa6a 821 {
mbed_official 330:c80ac197fa6a 822 __HAL_CEC_CLEAR_FLAG(hcec, CEC_ISR_RXACKE);
mbed_official 330:c80ac197fa6a 823 hcec->State = HAL_CEC_STATE_ERROR;
mbed_official 330:c80ac197fa6a 824 }
mbed_official 330:c80ac197fa6a 825
mbed_official 330:c80ac197fa6a 826 if ((hcec->ErrorCode & CEC_ISR_ALL_ERROR) != 0)
mbed_official 330:c80ac197fa6a 827 {
mbed_official 330:c80ac197fa6a 828 HAL_CEC_ErrorCallback(hcec);
mbed_official 330:c80ac197fa6a 829 }
mbed_official 330:c80ac197fa6a 830
mbed_official 330:c80ac197fa6a 831 /* CEC RX byte received interrupt ---------------------------------------------------*/
mbed_official 330:c80ac197fa6a 832 if((__HAL_CEC_GET_IT(hcec, CEC_ISR_RXBR) != RESET) && (__HAL_CEC_GET_IT_SOURCE(hcec, CEC_IER_RXBRIE) != RESET))
mbed_official 330:c80ac197fa6a 833 {
mbed_official 330:c80ac197fa6a 834 /* RXBR IT is cleared during HAL_CEC_Transmit_IT processing */
mbed_official 330:c80ac197fa6a 835 CEC_Receive_IT(hcec);
mbed_official 330:c80ac197fa6a 836 }
mbed_official 330:c80ac197fa6a 837
mbed_official 330:c80ac197fa6a 838 /* CEC RX end received interrupt ---------------------------------------------------*/
mbed_official 330:c80ac197fa6a 839 if((__HAL_CEC_GET_IT(hcec, CEC_ISR_RXEND) != RESET) && (__HAL_CEC_GET_IT_SOURCE(hcec, CEC_IER_RXENDIE) != RESET))
mbed_official 330:c80ac197fa6a 840 {
mbed_official 330:c80ac197fa6a 841 /* RXBR IT is cleared during HAL_CEC_Transmit_IT processing */
mbed_official 330:c80ac197fa6a 842 CEC_Receive_IT(hcec);
mbed_official 330:c80ac197fa6a 843 }
mbed_official 330:c80ac197fa6a 844
mbed_official 330:c80ac197fa6a 845
mbed_official 330:c80ac197fa6a 846 /* CEC TX byte request interrupt ------------------------------------------------*/
mbed_official 330:c80ac197fa6a 847 if((__HAL_CEC_GET_IT(hcec, CEC_ISR_TXBR) != RESET) &&(__HAL_CEC_GET_IT_SOURCE(hcec, CEC_IER_TXBRIE) != RESET))
mbed_official 330:c80ac197fa6a 848 {
mbed_official 330:c80ac197fa6a 849 /* TXBR IT is cleared during HAL_CEC_Transmit_IT processing */
mbed_official 330:c80ac197fa6a 850 CEC_Transmit_IT(hcec);
mbed_official 330:c80ac197fa6a 851 }
mbed_official 330:c80ac197fa6a 852
mbed_official 330:c80ac197fa6a 853 /* CEC TX end interrupt ------------------------------------------------*/
mbed_official 330:c80ac197fa6a 854 if((__HAL_CEC_GET_IT(hcec, CEC_ISR_TXEND) != RESET) &&(__HAL_CEC_GET_IT_SOURCE(hcec, CEC_IER_TXENDIE) != RESET))
mbed_official 330:c80ac197fa6a 855 {
mbed_official 330:c80ac197fa6a 856 /* TXEND IT is cleared during HAL_CEC_Transmit_IT processing */
mbed_official 330:c80ac197fa6a 857 CEC_Transmit_IT(hcec);
mbed_official 330:c80ac197fa6a 858 }
mbed_official 330:c80ac197fa6a 859
mbed_official 330:c80ac197fa6a 860 }
mbed_official 330:c80ac197fa6a 861
mbed_official 330:c80ac197fa6a 862
mbed_official 330:c80ac197fa6a 863 /**
mbed_official 330:c80ac197fa6a 864 * @brief Tx Transfer completed callback
mbed_official 330:c80ac197fa6a 865 * @param hcec: CEC handle
mbed_official 330:c80ac197fa6a 866 * @retval None
mbed_official 330:c80ac197fa6a 867 */
mbed_official 330:c80ac197fa6a 868 __weak void HAL_CEC_TxCpltCallback(CEC_HandleTypeDef *hcec)
mbed_official 330:c80ac197fa6a 869 {
mbed_official 330:c80ac197fa6a 870 /* NOTE : This function should not be modified, when the callback is needed,
mbed_official 330:c80ac197fa6a 871 the HAL_CEC_TxCpltCallback can be implemented in the user file
mbed_official 330:c80ac197fa6a 872 */
mbed_official 330:c80ac197fa6a 873 }
mbed_official 330:c80ac197fa6a 874
mbed_official 330:c80ac197fa6a 875 /**
mbed_official 330:c80ac197fa6a 876 * @brief Rx Transfer completed callback
mbed_official 330:c80ac197fa6a 877 * @param hcec: CEC handle
mbed_official 330:c80ac197fa6a 878 * @retval None
mbed_official 330:c80ac197fa6a 879 */
mbed_official 330:c80ac197fa6a 880 __weak void HAL_CEC_RxCpltCallback(CEC_HandleTypeDef *hcec)
mbed_official 330:c80ac197fa6a 881 {
mbed_official 330:c80ac197fa6a 882 /* NOTE : This function should not be modified, when the callback is needed,
mbed_official 330:c80ac197fa6a 883 the HAL_CEC_TxCpltCallback can be implemented in the user file
mbed_official 330:c80ac197fa6a 884 */
mbed_official 330:c80ac197fa6a 885 }
mbed_official 330:c80ac197fa6a 886
mbed_official 330:c80ac197fa6a 887 /**
mbed_official 330:c80ac197fa6a 888 * @brief CEC error callbacks
mbed_official 330:c80ac197fa6a 889 * @param hcec: CEC handle
mbed_official 330:c80ac197fa6a 890 * @retval None
mbed_official 330:c80ac197fa6a 891 */
mbed_official 330:c80ac197fa6a 892 __weak void HAL_CEC_ErrorCallback(CEC_HandleTypeDef *hcec)
mbed_official 330:c80ac197fa6a 893 {
mbed_official 330:c80ac197fa6a 894 /* NOTE : This function should not be modified, when the callback is needed,
mbed_official 330:c80ac197fa6a 895 the HAL_CEC_ErrorCallback can be implemented in the user file
mbed_official 330:c80ac197fa6a 896 */
mbed_official 330:c80ac197fa6a 897 }
mbed_official 330:c80ac197fa6a 898
mbed_official 330:c80ac197fa6a 899 /**
mbed_official 330:c80ac197fa6a 900 * @}
mbed_official 330:c80ac197fa6a 901 */
mbed_official 330:c80ac197fa6a 902
mbed_official 330:c80ac197fa6a 903 /** @defgroup CEC_Exported_Functions_Group3 Peripheral Control functions
mbed_official 330:c80ac197fa6a 904 * @brief CEC control functions
mbed_official 330:c80ac197fa6a 905 *
mbed_official 330:c80ac197fa6a 906 @verbatim
mbed_official 330:c80ac197fa6a 907 ===============================================================================
mbed_official 330:c80ac197fa6a 908 ##### Peripheral Control functions #####
mbed_official 330:c80ac197fa6a 909 ===============================================================================
mbed_official 330:c80ac197fa6a 910 [..]
mbed_official 330:c80ac197fa6a 911 This subsection provides a set of functions allowing to control the CEC.
mbed_official 330:c80ac197fa6a 912 (+) HAL_CEC_GetState() API can be helpful to check in run-time the state of the CEC peripheral.
mbed_official 330:c80ac197fa6a 913 @endverbatim
mbed_official 330:c80ac197fa6a 914 * @{
mbed_official 330:c80ac197fa6a 915 */
mbed_official 330:c80ac197fa6a 916
mbed_official 330:c80ac197fa6a 917
mbed_official 330:c80ac197fa6a 918
mbed_official 330:c80ac197fa6a 919
mbed_official 330:c80ac197fa6a 920
mbed_official 330:c80ac197fa6a 921 /**
mbed_official 330:c80ac197fa6a 922 * @brief return the CEC state
mbed_official 330:c80ac197fa6a 923 * @param hcec: CEC handle
mbed_official 330:c80ac197fa6a 924 * @retval HAL state
mbed_official 330:c80ac197fa6a 925 */
mbed_official 330:c80ac197fa6a 926 HAL_CEC_StateTypeDef HAL_CEC_GetState(CEC_HandleTypeDef *hcec)
mbed_official 330:c80ac197fa6a 927 {
mbed_official 330:c80ac197fa6a 928 return hcec->State;
mbed_official 330:c80ac197fa6a 929 }
mbed_official 330:c80ac197fa6a 930
mbed_official 330:c80ac197fa6a 931 /**
mbed_official 330:c80ac197fa6a 932 * @brief Return the CEC error code
mbed_official 330:c80ac197fa6a 933 * @param hcec : pointer to a CEC_HandleTypeDef structure that contains
mbed_official 330:c80ac197fa6a 934 * the configuration information for the specified CEC.
mbed_official 330:c80ac197fa6a 935 * @retval CEC Error Code
mbed_official 330:c80ac197fa6a 936 */
mbed_official 330:c80ac197fa6a 937 uint32_t HAL_CEC_GetError(CEC_HandleTypeDef *hcec)
mbed_official 330:c80ac197fa6a 938 {
mbed_official 330:c80ac197fa6a 939 return hcec->ErrorCode;
mbed_official 330:c80ac197fa6a 940 }
mbed_official 330:c80ac197fa6a 941
mbed_official 330:c80ac197fa6a 942 /**
mbed_official 330:c80ac197fa6a 943 * @}
mbed_official 330:c80ac197fa6a 944 */
mbed_official 330:c80ac197fa6a 945
mbed_official 330:c80ac197fa6a 946 /**
mbed_official 330:c80ac197fa6a 947 * @}
mbed_official 330:c80ac197fa6a 948 */
mbed_official 330:c80ac197fa6a 949
mbed_official 330:c80ac197fa6a 950 /** @defgroup CEC_Private_Functions CEC Private Functions
mbed_official 330:c80ac197fa6a 951 * @{
mbed_official 330:c80ac197fa6a 952 */
mbed_official 330:c80ac197fa6a 953
mbed_official 330:c80ac197fa6a 954 /**
mbed_official 330:c80ac197fa6a 955 * @brief Send data in interrupt mode
mbed_official 330:c80ac197fa6a 956 * @param hcec: CEC handle.
mbed_official 330:c80ac197fa6a 957 * Function called under interruption only, once
mbed_official 330:c80ac197fa6a 958 * interruptions have been enabled by HAL_CEC_Transmit_IT()
mbed_official 330:c80ac197fa6a 959 * @retval HAL status
mbed_official 330:c80ac197fa6a 960 */
mbed_official 330:c80ac197fa6a 961 static HAL_StatusTypeDef CEC_Transmit_IT(CEC_HandleTypeDef *hcec)
mbed_official 330:c80ac197fa6a 962 {
mbed_official 330:c80ac197fa6a 963 /* if the IP is already busy or if there is a previous transmission
mbed_official 330:c80ac197fa6a 964 already pending due to arbitration loss */
mbed_official 330:c80ac197fa6a 965 if ((hcec->State == HAL_CEC_STATE_BUSY_TX)
mbed_official 330:c80ac197fa6a 966 || (__HAL_CEC_GET_TRANSMISSION_START_FLAG(hcec) != RESET))
mbed_official 330:c80ac197fa6a 967 {
mbed_official 330:c80ac197fa6a 968
mbed_official 330:c80ac197fa6a 969 /* set state to BUSY TX, in case it wasn't set already (case
mbed_official 330:c80ac197fa6a 970 * of transmission new attempt after arbitration loss) */
mbed_official 330:c80ac197fa6a 971 if (hcec->State != HAL_CEC_STATE_BUSY_TX)
mbed_official 330:c80ac197fa6a 972 {
mbed_official 330:c80ac197fa6a 973 hcec->State = HAL_CEC_STATE_BUSY_TX;
mbed_official 330:c80ac197fa6a 974 }
mbed_official 330:c80ac197fa6a 975
mbed_official 330:c80ac197fa6a 976 /* if all data have been sent */
mbed_official 330:c80ac197fa6a 977 if(hcec->TxXferCount == 0)
mbed_official 330:c80ac197fa6a 978 {
mbed_official 330:c80ac197fa6a 979 /* Disable Peripheral to write CEC_IER register */
mbed_official 330:c80ac197fa6a 980 __HAL_CEC_DISABLE(hcec);
mbed_official 330:c80ac197fa6a 981
mbed_official 330:c80ac197fa6a 982 /* Disable the CEC Transmission Interrupts */
mbed_official 330:c80ac197fa6a 983 __HAL_CEC_DISABLE_IT(hcec, CEC_IER_TXBRIE|CEC_IER_TXENDIE);
mbed_official 330:c80ac197fa6a 984 /* Disable the CEC Transmission Error Interrupts */
mbed_official 330:c80ac197fa6a 985 __HAL_CEC_DISABLE_IT(hcec, CEC_IER_TX_ALL_ERR);
mbed_official 330:c80ac197fa6a 986
mbed_official 330:c80ac197fa6a 987 /* Enable the Peripheral */
mbed_official 330:c80ac197fa6a 988 __HAL_CEC_ENABLE(hcec);
mbed_official 330:c80ac197fa6a 989
mbed_official 330:c80ac197fa6a 990 __HAL_CEC_CLEAR_FLAG(hcec,CEC_ISR_TXBR|CEC_ISR_TXEND);
mbed_official 330:c80ac197fa6a 991
mbed_official 330:c80ac197fa6a 992 hcec->State = HAL_CEC_STATE_READY;
mbed_official 330:c80ac197fa6a 993
mbed_official 330:c80ac197fa6a 994 HAL_CEC_TxCpltCallback(hcec);
mbed_official 330:c80ac197fa6a 995
mbed_official 330:c80ac197fa6a 996 return HAL_OK;
mbed_official 330:c80ac197fa6a 997 }
mbed_official 330:c80ac197fa6a 998 else
mbed_official 330:c80ac197fa6a 999 {
mbed_official 330:c80ac197fa6a 1000 if (hcec->TxXferCount == 1)
mbed_official 330:c80ac197fa6a 1001 {
mbed_official 330:c80ac197fa6a 1002 /* if this is the last byte transmission, set TX End of Message (TXEOM) bit */
mbed_official 330:c80ac197fa6a 1003 __HAL_CEC_LAST_BYTE_TX_SET(hcec);
mbed_official 330:c80ac197fa6a 1004 }
mbed_official 330:c80ac197fa6a 1005 /* clear Tx-Byte request flag */
mbed_official 330:c80ac197fa6a 1006 __HAL_CEC_CLEAR_FLAG(hcec,CEC_ISR_TXBR);
mbed_official 330:c80ac197fa6a 1007 hcec->Instance->TXDR = *hcec->pTxBuffPtr++;
mbed_official 330:c80ac197fa6a 1008 hcec->TxXferCount--;
mbed_official 330:c80ac197fa6a 1009
mbed_official 330:c80ac197fa6a 1010 return HAL_OK;
mbed_official 330:c80ac197fa6a 1011 }
mbed_official 330:c80ac197fa6a 1012 }
mbed_official 330:c80ac197fa6a 1013 else
mbed_official 330:c80ac197fa6a 1014 {
mbed_official 330:c80ac197fa6a 1015 return HAL_BUSY;
mbed_official 330:c80ac197fa6a 1016 }
mbed_official 330:c80ac197fa6a 1017 }
mbed_official 330:c80ac197fa6a 1018
mbed_official 330:c80ac197fa6a 1019
mbed_official 330:c80ac197fa6a 1020 /**
mbed_official 330:c80ac197fa6a 1021 * @brief Receive data in interrupt mode.
mbed_official 330:c80ac197fa6a 1022 * @param hcec: CEC handle.
mbed_official 330:c80ac197fa6a 1023 * Function called under interruption only, once
mbed_official 330:c80ac197fa6a 1024 * interruptions have been enabled by HAL_CEC_Receive_IT()
mbed_official 330:c80ac197fa6a 1025 * @retval HAL status
mbed_official 330:c80ac197fa6a 1026 */
mbed_official 330:c80ac197fa6a 1027 static HAL_StatusTypeDef CEC_Receive_IT(CEC_HandleTypeDef *hcec)
mbed_official 330:c80ac197fa6a 1028 {
mbed_official 330:c80ac197fa6a 1029 uint32_t tempisr;
mbed_official 330:c80ac197fa6a 1030
mbed_official 330:c80ac197fa6a 1031 /* Three different conditions are tested to carry out the RX IT processing:
mbed_official 330:c80ac197fa6a 1032 * - the IP is in reception stand-by (the IP state is HAL_CEC_STATE_STANDBY_RX) and
mbed_official 330:c80ac197fa6a 1033 * the reception of the first byte is starting
mbed_official 330:c80ac197fa6a 1034 * - a message reception is already on-going (the IP state is HAL_CEC_STATE_BUSY_RX)
mbed_official 330:c80ac197fa6a 1035 * and a new byte is being received
mbed_official 330:c80ac197fa6a 1036 * - a transmission has just been started (the IP state is HAL_CEC_STATE_BUSY_TX)
mbed_official 330:c80ac197fa6a 1037 * but has been interrupted by a new message reception or discarded due to
mbed_official 330:c80ac197fa6a 1038 * arbitration loss: the reception of the first or higher priority message
mbed_official 330:c80ac197fa6a 1039 * (the arbitration winner) is starting */
mbed_official 330:c80ac197fa6a 1040 if ((hcec->State == HAL_CEC_STATE_STANDBY_RX)
mbed_official 330:c80ac197fa6a 1041 || (hcec->State == HAL_CEC_STATE_BUSY_RX)
mbed_official 330:c80ac197fa6a 1042 || (hcec->State == HAL_CEC_STATE_BUSY_TX))
mbed_official 330:c80ac197fa6a 1043 {
mbed_official 330:c80ac197fa6a 1044 /* reception is starting */
mbed_official 330:c80ac197fa6a 1045 hcec->State = HAL_CEC_STATE_BUSY_RX;
mbed_official 330:c80ac197fa6a 1046 tempisr = (uint32_t) (hcec->Instance->ISR);
mbed_official 330:c80ac197fa6a 1047 if ((tempisr & CEC_ISR_RXBR) != 0)
mbed_official 330:c80ac197fa6a 1048 {
mbed_official 330:c80ac197fa6a 1049 /* read received byte */
mbed_official 330:c80ac197fa6a 1050 *hcec->pRxBuffPtr++ = hcec->Instance->RXDR;
mbed_official 330:c80ac197fa6a 1051 /* if last byte has been received */
mbed_official 330:c80ac197fa6a 1052 if ((tempisr & CEC_ISR_RXEND) != 0)
mbed_official 330:c80ac197fa6a 1053 {
mbed_official 330:c80ac197fa6a 1054 /* clear IT */
mbed_official 330:c80ac197fa6a 1055 __HAL_CEC_CLEAR_FLAG(hcec,CEC_ISR_RXBR|CEC_ISR_RXEND);
mbed_official 330:c80ac197fa6a 1056 /* RX interrupts are not disabled at this point.
mbed_official 330:c80ac197fa6a 1057 * Indeed, to disable the IT, the IP must be disabled first
mbed_official 330:c80ac197fa6a 1058 * which resets the TXSOM flag. In case of arbitration loss,
mbed_official 330:c80ac197fa6a 1059 * this leads to a transmission abort.
mbed_official 330:c80ac197fa6a 1060 * Therefore, RX interruptions disabling if so required,
mbed_official 330:c80ac197fa6a 1061 * is done in HAL_CEC_RxCpltCallback */
mbed_official 330:c80ac197fa6a 1062
mbed_official 330:c80ac197fa6a 1063 /* IP state is moved to READY.
mbed_official 330:c80ac197fa6a 1064 * If the IP must remain in standby mode to listen
mbed_official 330:c80ac197fa6a 1065 * any new message, it is up to HAL_CEC_RxCpltCallback
mbed_official 330:c80ac197fa6a 1066 * to move it again to HAL_CEC_STATE_STANDBY_RX */
mbed_official 330:c80ac197fa6a 1067 hcec->State = HAL_CEC_STATE_READY;
mbed_official 330:c80ac197fa6a 1068
mbed_official 330:c80ac197fa6a 1069 HAL_CEC_RxCpltCallback(hcec);
mbed_official 330:c80ac197fa6a 1070
mbed_official 330:c80ac197fa6a 1071 return HAL_OK;
mbed_official 330:c80ac197fa6a 1072 }
mbed_official 330:c80ac197fa6a 1073 __HAL_CEC_CLEAR_FLAG(hcec, CEC_ISR_RXBR);
mbed_official 330:c80ac197fa6a 1074
mbed_official 330:c80ac197fa6a 1075 hcec->RxXferSize++;
mbed_official 330:c80ac197fa6a 1076
mbed_official 330:c80ac197fa6a 1077 return HAL_OK;
mbed_official 330:c80ac197fa6a 1078 }
mbed_official 330:c80ac197fa6a 1079 else
mbed_official 330:c80ac197fa6a 1080 {
mbed_official 330:c80ac197fa6a 1081 return HAL_BUSY;
mbed_official 330:c80ac197fa6a 1082 }
mbed_official 330:c80ac197fa6a 1083 }
mbed_official 330:c80ac197fa6a 1084 else
mbed_official 330:c80ac197fa6a 1085 {
mbed_official 330:c80ac197fa6a 1086 return HAL_BUSY;
mbed_official 330:c80ac197fa6a 1087 }
mbed_official 330:c80ac197fa6a 1088 }
mbed_official 330:c80ac197fa6a 1089
mbed_official 330:c80ac197fa6a 1090 /**
mbed_official 330:c80ac197fa6a 1091 * @}
mbed_official 330:c80ac197fa6a 1092 */
mbed_official 330:c80ac197fa6a 1093
mbed_official 330:c80ac197fa6a 1094 /**
mbed_official 330:c80ac197fa6a 1095 * @}
mbed_official 330:c80ac197fa6a 1096 */
mbed_official 330:c80ac197fa6a 1097
mbed_official 330:c80ac197fa6a 1098 #endif /* defined(STM32F373xC) || defined(STM32F378xx) */
mbed_official 330:c80ac197fa6a 1099
mbed_official 330:c80ac197fa6a 1100 #endif /* HAL_CEC_MODULE_ENABLED */
mbed_official 330:c80ac197fa6a 1101 /**
mbed_official 330:c80ac197fa6a 1102 * @}
mbed_official 330:c80ac197fa6a 1103 */
mbed_official 330:c80ac197fa6a 1104
mbed_official 330:c80ac197fa6a 1105 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/