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:
Wed Aug 06 08:15:07 2014 +0100
Revision:
274:6937b19af361
Parent:
226:b062af740e40
Child:
369:2e96f1b71984
Synchronized with git revision 5b145e4f6c509376173c3ea2aa35a6da879a2124

Full URL: https://github.com/mbedmicro/mbed/commit/5b145e4f6c509376173c3ea2aa35a6da879a2124/

[TARGET_LPC11UXX] PeripheralNames.h and PinMap definitions separation for LPC11UXX platforms

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 87:085cde657901 1 /**
mbed_official 87:085cde657901 2 ******************************************************************************
mbed_official 87:085cde657901 3 * @file stm32f4xx_hal_i2c.c
mbed_official 87:085cde657901 4 * @author MCD Application Team
mbed_official 226:b062af740e40 5 * @version V1.1.0RC2
mbed_official 226:b062af740e40 6 * @date 14-May-2014
mbed_official 87:085cde657901 7 * @brief I2C HAL module driver.
mbed_official 87:085cde657901 8 * This file provides firmware functions to manage the following
mbed_official 87:085cde657901 9 * functionalities of the Inter Integrated Circuit (I2C) peripheral:
mbed_official 87:085cde657901 10 * + Initialization and de-initialization functions
mbed_official 87:085cde657901 11 * + IO operation functions
mbed_official 87:085cde657901 12 * + Peripheral Control functions
mbed_official 87:085cde657901 13 * + Peripheral State functions
mbed_official 87:085cde657901 14 *
mbed_official 87:085cde657901 15 @verbatim
mbed_official 87:085cde657901 16 ==============================================================================
mbed_official 87:085cde657901 17 ##### How to use this driver #####
mbed_official 87:085cde657901 18 ==============================================================================
mbed_official 87:085cde657901 19 [..]
mbed_official 87:085cde657901 20 The I2C HAL driver can be used as follows:
mbed_official 87:085cde657901 21
mbed_official 87:085cde657901 22 (#) Declare a I2C_HandleTypeDef handle structure, for example:
mbed_official 87:085cde657901 23 I2C_HandleTypeDef hi2c;
mbed_official 87:085cde657901 24
mbed_official 87:085cde657901 25 (#)Initialize the I2C low level resources by implement the HAL_I2C_MspInit() API:
mbed_official 87:085cde657901 26 (##) Enable the I2Cx interface clock
mbed_official 87:085cde657901 27 (##) I2C pins configuration
mbed_official 87:085cde657901 28 (+++) Enable the clock for the I2C GPIOs
mbed_official 87:085cde657901 29 (+++) Configure I2C pins as alternate function open-drain
mbed_official 87:085cde657901 30 (##) NVIC configuration if you need to use interrupt process
mbed_official 87:085cde657901 31 (+++) Configure the I2Cx interrupt priority
mbed_official 87:085cde657901 32 (+++) Enable the NVIC I2C IRQ Channel
mbed_official 87:085cde657901 33 (##) DMA Configuration if you need to use DMA process
mbed_official 87:085cde657901 34 (+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive stream
mbed_official 87:085cde657901 35 (+++) Enable the DMAx interface clock using
mbed_official 87:085cde657901 36 (+++) Configure the DMA handle parameters
mbed_official 87:085cde657901 37 (+++) Configure the DMA Tx or Rx Stream
mbed_official 87:085cde657901 38 (+++) Associate the initilalized DMA handle to the hi2c DMA Tx or Rx handle
mbed_official 226:b062af740e40 39 (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on
mbed_official 226:b062af740e40 40 the DMA Tx or Rx Stream
mbed_official 87:085cde657901 41
mbed_official 87:085cde657901 42 (#) Configure the Communication Speed, Duty cycle, Addressing mode, Own Address1,
mbed_official 87:085cde657901 43 Dual Addressing mode, Own Address2, General call and Nostretch mode in the hi2c Init structure.
mbed_official 87:085cde657901 44
mbed_official 226:b062af740e40 45 (#) Initialize the I2C registers by calling the HAL_I2C_Init(), configures also the low level Hardware
mbed_official 226:b062af740e40 46 (GPIO, CLOCK, NVIC...etc) by calling the customed HAL_I2C_MspInit(&hi2c) API.
mbed_official 87:085cde657901 47
mbed_official 87:085cde657901 48 (#) To check if target device is ready for communication, use the function HAL_I2C_IsDeviceReady()
mbed_official 87:085cde657901 49
mbed_official 226:b062af740e40 50 (#) For I2C IO and IO MEM operations, three operation modes are available within this driver :
mbed_official 87:085cde657901 51
mbed_official 87:085cde657901 52 *** Polling mode IO operation ***
mbed_official 87:085cde657901 53 =================================
mbed_official 87:085cde657901 54 [..]
mbed_official 87:085cde657901 55 (+) Transmit in master mode an amount of data in blocking mode using HAL_I2C_Master_Transmit()
mbed_official 87:085cde657901 56 (+) Receive in master mode an amount of data in blocking mode using HAL_I2C_Master_Receive()
mbed_official 87:085cde657901 57 (+) Transmit in slave mode an amount of data in blocking mode using HAL_I2C_Slave_Transmit()
mbed_official 87:085cde657901 58 (+) Receive in slave mode an amount of data in blocking mode using HAL_I2C_Slave_Receive()
mbed_official 87:085cde657901 59
mbed_official 87:085cde657901 60 *** Polling mode IO MEM operation ***
mbed_official 87:085cde657901 61 =====================================
mbed_official 87:085cde657901 62 [..]
mbed_official 87:085cde657901 63 (+) Write an amount of data in blocking mode to a specific memory address using HAL_I2C_Mem_Write()
mbed_official 87:085cde657901 64 (+) Read an amount of data in blocking mode from a specific memory address using HAL_I2C_Mem_Read()
mbed_official 87:085cde657901 65
mbed_official 87:085cde657901 66
mbed_official 87:085cde657901 67 *** Interrupt mode IO operation ***
mbed_official 87:085cde657901 68 ===================================
mbed_official 87:085cde657901 69 [..]
mbed_official 87:085cde657901 70 (+) Transmit in master mode an amount of data in non blocking mode using HAL_I2C_Master_Transmit_IT()
mbed_official 87:085cde657901 71 (+) At transmission end of transfer HAL_I2C_MasterTxCpltCallback is executed and user can
mbed_official 87:085cde657901 72 add his own code by customization of function pointer HAL_I2C_MasterTxCpltCallback
mbed_official 87:085cde657901 73 (+) Receive in master mode an amount of data in non blocking mode using HAL_I2C_Master_Receive_IT()
mbed_official 87:085cde657901 74 (+) At reception end of transfer HAL_I2C_MasterRxCpltCallback is executed and user can
mbed_official 87:085cde657901 75 add his own code by customization of function pointer HAL_I2C_MasterRxCpltCallback
mbed_official 87:085cde657901 76 (+) Transmit in slave mode an amount of data in non blocking mode using HAL_I2C_Slave_Transmit_IT()
mbed_official 87:085cde657901 77 (+) At transmission end of transfer HAL_I2C_SlaveTxCpltCallback is executed and user can
mbed_official 87:085cde657901 78 add his own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback
mbed_official 87:085cde657901 79 (+) Receive in slave mode an amount of data in non blocking mode using HAL_I2C_Slave_Receive_IT()
mbed_official 87:085cde657901 80 (+) At reception end of transfer HAL_I2C_SlaveRxCpltCallback is executed and user can
mbed_official 87:085cde657901 81 add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback
mbed_official 87:085cde657901 82 (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can
mbed_official 87:085cde657901 83 add his own code by customization of function pointer HAL_I2C_ErrorCallback
mbed_official 87:085cde657901 84
mbed_official 87:085cde657901 85 *** Interrupt mode IO MEM operation ***
mbed_official 87:085cde657901 86 =======================================
mbed_official 87:085cde657901 87 [..]
mbed_official 87:085cde657901 88 (+) Write an amount of data in no-blocking mode with Interrupt to a specific memory address using
mbed_official 87:085cde657901 89 HAL_I2C_Mem_Write_IT()
mbed_official 87:085cde657901 90 (+) At MEM end of write transfer HAL_I2C_MemTxCpltCallback is executed and user can
mbed_official 87:085cde657901 91 add his own code by customization of function pointer HAL_I2C_MemTxCpltCallback
mbed_official 87:085cde657901 92 (+) Read an amount of data in no-blocking mode with Interrupt from a specific memory address using
mbed_official 87:085cde657901 93 HAL_I2C_Mem_Read_IT()
mbed_official 87:085cde657901 94 (+) At MEM end of read transfer HAL_I2C_MemRxCpltCallback is executed and user can
mbed_official 87:085cde657901 95 add his own code by customization of function pointer HAL_I2C_MemRxCpltCallback
mbed_official 87:085cde657901 96 (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can
mbed_official 87:085cde657901 97 add his own code by customization of function pointer HAL_I2C_ErrorCallback
mbed_official 87:085cde657901 98
mbed_official 87:085cde657901 99 *** DMA mode IO operation ***
mbed_official 87:085cde657901 100 ==============================
mbed_official 87:085cde657901 101 [..]
mbed_official 87:085cde657901 102 (+) Transmit in master mode an amount of data in non blocking mode (DMA) using
mbed_official 87:085cde657901 103 HAL_I2C_Master_Transmit_DMA()
mbed_official 87:085cde657901 104 (+) At transmission end of transfer HAL_I2C_MasterTxCpltCallback is executed and user can
mbed_official 87:085cde657901 105 add his own code by customization of function pointer HAL_I2C_MasterTxCpltCallback
mbed_official 87:085cde657901 106 (+) Receive in master mode an amount of data in non blocking mode (DMA) using
mbed_official 87:085cde657901 107 HAL_I2C_Master_Receive_DMA()
mbed_official 87:085cde657901 108 (+) At reception end of transfer HAL_I2C_MasterRxCpltCallback is executed and user can
mbed_official 87:085cde657901 109 add his own code by customization of function pointer HAL_I2C_MasterRxCpltCallback
mbed_official 87:085cde657901 110 (+) Transmit in slave mode an amount of data in non blocking mode (DMA) using
mbed_official 87:085cde657901 111 HAL_I2C_Slave_Transmit_DMA()
mbed_official 87:085cde657901 112 (+) At transmission end of transfer HAL_I2C_SlaveTxCpltCallback is executed and user can
mbed_official 87:085cde657901 113 add his own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback
mbed_official 87:085cde657901 114 (+) Receive in slave mode an amount of data in non blocking mode (DMA) using
mbed_official 87:085cde657901 115 HAL_I2C_Slave_Receive_DMA()
mbed_official 87:085cde657901 116 (+) At reception end of transfer HAL_I2C_SlaveRxCpltCallback is executed and user can
mbed_official 87:085cde657901 117 add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback
mbed_official 87:085cde657901 118 (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can
mbed_official 87:085cde657901 119 add his own code by customization of function pointer HAL_I2C_ErrorCallback
mbed_official 87:085cde657901 120
mbed_official 87:085cde657901 121 *** DMA mode IO MEM operation ***
mbed_official 87:085cde657901 122 =================================
mbed_official 87:085cde657901 123 [..]
mbed_official 87:085cde657901 124 (+) Write an amount of data in no-blocking mode with DMA to a specific memory address using
mbed_official 87:085cde657901 125 HAL_I2C_Mem_Write_DMA()
mbed_official 87:085cde657901 126 (+) At MEM end of write transfer HAL_I2C_MemTxCpltCallback is executed and user can
mbed_official 87:085cde657901 127 add his own code by customization of function pointer HAL_I2C_MemTxCpltCallback
mbed_official 87:085cde657901 128 (+) Read an amount of data in no-blocking mode with DMA from a specific memory address using
mbed_official 87:085cde657901 129 HAL_I2C_Mem_Read_DMA()
mbed_official 87:085cde657901 130 (+) At MEM end of read transfer HAL_I2C_MemRxCpltCallback is executed and user can
mbed_official 87:085cde657901 131 add his own code by customization of function pointer HAL_I2C_MemRxCpltCallback
mbed_official 87:085cde657901 132 (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can
mbed_official 87:085cde657901 133 add his own code by customization of function pointer HAL_I2C_ErrorCallback
mbed_official 87:085cde657901 134
mbed_official 87:085cde657901 135
mbed_official 87:085cde657901 136 *** I2C HAL driver macros list ***
mbed_official 87:085cde657901 137 ==================================
mbed_official 87:085cde657901 138 [..]
mbed_official 87:085cde657901 139 Below the list of most used macros in I2C HAL driver.
mbed_official 87:085cde657901 140
mbed_official 87:085cde657901 141 (+) __HAL_I2C_ENABLE: Enable the I2C peripheral
mbed_official 87:085cde657901 142 (+) __HAL_I2C_DISABLE: Disable the I2C peripheral
mbed_official 87:085cde657901 143 (+) __HAL_I2C_GET_FLAG : Checks whether the specified I2C flag is set or not
mbed_official 226:b062af740e40 144 (+) __HAL_I2C_CLEAR_FLAG : Clear the specified I2C pending flag
mbed_official 226:b062af740e40 145 (+) __HAL_I2C_ENABLE_IT: Enable the specified I2C interrupt
mbed_official 226:b062af740e40 146 (+) __HAL_I2C_DISABLE_IT: Disable the specified I2C interrupt
mbed_official 87:085cde657901 147
mbed_official 87:085cde657901 148 [..]
mbed_official 87:085cde657901 149 (@) You can refer to the I2C HAL driver header file for more useful macros
mbed_official 87:085cde657901 150
mbed_official 87:085cde657901 151
mbed_official 87:085cde657901 152 @endverbatim
mbed_official 87:085cde657901 153 ******************************************************************************
mbed_official 87:085cde657901 154 * @attention
mbed_official 87:085cde657901 155 *
mbed_official 87:085cde657901 156 * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
mbed_official 87:085cde657901 157 *
mbed_official 87:085cde657901 158 * Redistribution and use in source and binary forms, with or without modification,
mbed_official 87:085cde657901 159 * are permitted provided that the following conditions are met:
mbed_official 87:085cde657901 160 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 87:085cde657901 161 * this list of conditions and the following disclaimer.
mbed_official 87:085cde657901 162 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 87:085cde657901 163 * this list of conditions and the following disclaimer in the documentation
mbed_official 87:085cde657901 164 * and/or other materials provided with the distribution.
mbed_official 87:085cde657901 165 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 87:085cde657901 166 * may be used to endorse or promote products derived from this software
mbed_official 87:085cde657901 167 * without specific prior written permission.
mbed_official 87:085cde657901 168 *
mbed_official 87:085cde657901 169 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 87:085cde657901 170 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 87:085cde657901 171 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 87:085cde657901 172 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 87:085cde657901 173 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 87:085cde657901 174 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 87:085cde657901 175 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 87:085cde657901 176 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 87:085cde657901 177 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 87:085cde657901 178 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 87:085cde657901 179 *
mbed_official 87:085cde657901 180 ******************************************************************************
mbed_official 87:085cde657901 181 */
mbed_official 87:085cde657901 182
mbed_official 87:085cde657901 183 /* Includes ------------------------------------------------------------------*/
mbed_official 87:085cde657901 184 #include "stm32f4xx_hal.h"
mbed_official 87:085cde657901 185
mbed_official 87:085cde657901 186 /** @addtogroup STM32F4xx_HAL_Driver
mbed_official 87:085cde657901 187 * @{
mbed_official 87:085cde657901 188 */
mbed_official 87:085cde657901 189
mbed_official 87:085cde657901 190 /** @defgroup I2C
mbed_official 87:085cde657901 191 * @brief I2C HAL module driver
mbed_official 87:085cde657901 192 * @{
mbed_official 87:085cde657901 193 */
mbed_official 87:085cde657901 194
mbed_official 87:085cde657901 195 #ifdef HAL_I2C_MODULE_ENABLED
mbed_official 87:085cde657901 196
mbed_official 87:085cde657901 197 /* Private typedef -----------------------------------------------------------*/
mbed_official 87:085cde657901 198 /* Private define ------------------------------------------------------------*/
mbed_official 87:085cde657901 199 #define I2C_TIMEOUT_FLAG ((uint32_t)35) /* 35 ms */
mbed_official 87:085cde657901 200 #define I2C_TIMEOUT_ADDR_SLAVE ((uint32_t)10000) /* 10 s */
mbed_official 87:085cde657901 201
mbed_official 87:085cde657901 202 /* Private macro -------------------------------------------------------------*/
mbed_official 87:085cde657901 203 /* Private variables ---------------------------------------------------------*/
mbed_official 87:085cde657901 204 /* Private function prototypes -----------------------------------------------*/
mbed_official 87:085cde657901 205 static void I2C_DMAMasterTransmitCplt(DMA_HandleTypeDef *hdma);
mbed_official 87:085cde657901 206 static void I2C_DMAMasterReceiveCplt(DMA_HandleTypeDef *hdma);
mbed_official 87:085cde657901 207 static void I2C_DMASlaveTransmitCplt(DMA_HandleTypeDef *hdma);
mbed_official 87:085cde657901 208 static void I2C_DMASlaveReceiveCplt(DMA_HandleTypeDef *hdma);
mbed_official 87:085cde657901 209 static void I2C_DMAMemTransmitCplt(DMA_HandleTypeDef *hdma);
mbed_official 87:085cde657901 210 static void I2C_DMAMemReceiveCplt(DMA_HandleTypeDef *hdma);
mbed_official 87:085cde657901 211 static void I2C_DMAError(DMA_HandleTypeDef *hdma);
mbed_official 87:085cde657901 212
mbed_official 87:085cde657901 213 static HAL_StatusTypeDef I2C_MasterRequestWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout);
mbed_official 87:085cde657901 214 static HAL_StatusTypeDef I2C_MasterRequestRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout);
mbed_official 87:085cde657901 215 static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout);
mbed_official 87:085cde657901 216 static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout);
mbed_official 87:085cde657901 217 static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout);
mbed_official 87:085cde657901 218 static HAL_StatusTypeDef I2C_WaitOnMasterAddressFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, uint32_t Timeout);
mbed_official 87:085cde657901 219
mbed_official 87:085cde657901 220 static HAL_StatusTypeDef I2C_MasterTransmit_TXE(I2C_HandleTypeDef *hi2c);
mbed_official 87:085cde657901 221 static HAL_StatusTypeDef I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c);
mbed_official 87:085cde657901 222 static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c);
mbed_official 87:085cde657901 223 static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c);
mbed_official 87:085cde657901 224
mbed_official 87:085cde657901 225 static HAL_StatusTypeDef I2C_SlaveTransmit_TXE(I2C_HandleTypeDef *hi2c);
mbed_official 87:085cde657901 226 static HAL_StatusTypeDef I2C_SlaveTransmit_BTF(I2C_HandleTypeDef *hi2c);
mbed_official 87:085cde657901 227 static HAL_StatusTypeDef I2C_SlaveReceive_RXNE(I2C_HandleTypeDef *hi2c);
mbed_official 87:085cde657901 228 static HAL_StatusTypeDef I2C_SlaveReceive_BTF(I2C_HandleTypeDef *hi2c);
mbed_official 87:085cde657901 229 static HAL_StatusTypeDef I2C_Slave_ADDR(I2C_HandleTypeDef *hi2c);
mbed_official 87:085cde657901 230 static HAL_StatusTypeDef I2C_Slave_STOPF(I2C_HandleTypeDef *hi2c);
mbed_official 87:085cde657901 231 static HAL_StatusTypeDef I2C_Slave_AF(I2C_HandleTypeDef *hi2c);
mbed_official 87:085cde657901 232
mbed_official 87:085cde657901 233 /* Private functions ---------------------------------------------------------*/
mbed_official 87:085cde657901 234
mbed_official 87:085cde657901 235 /** @defgroup I2C_Private_Functions
mbed_official 87:085cde657901 236 * @{
mbed_official 87:085cde657901 237 */
mbed_official 87:085cde657901 238
mbed_official 87:085cde657901 239 /** @defgroup I2C_Group1 Initialization and de-initialization functions
mbed_official 87:085cde657901 240 * @brief Initialization and Configuration functions
mbed_official 87:085cde657901 241 *
mbed_official 87:085cde657901 242 @verbatim
mbed_official 87:085cde657901 243 ===============================================================================
mbed_official 87:085cde657901 244 ##### Initialization and de-initialization functions #####
mbed_official 87:085cde657901 245 ===============================================================================
mbed_official 87:085cde657901 246 [..] This subsection provides a set of functions allowing to initialize and
mbed_official 87:085cde657901 247 de-initialiaze the I2Cx peripheral:
mbed_official 87:085cde657901 248
mbed_official 87:085cde657901 249 (+) User must Implement HAL_I2C_MspInit() function in which he configures
mbed_official 87:085cde657901 250 all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC).
mbed_official 87:085cde657901 251
mbed_official 87:085cde657901 252 (+) Call the function HAL_I2C_Init() to configure the selected device with
mbed_official 87:085cde657901 253 the selected configuration:
mbed_official 87:085cde657901 254 (++) Communication Speed
mbed_official 87:085cde657901 255 (++) Duty cycle
mbed_official 87:085cde657901 256 (++) Addressing mode
mbed_official 87:085cde657901 257 (++) Own Address 1
mbed_official 87:085cde657901 258 (++) Dual Addressing mode
mbed_official 87:085cde657901 259 (++) Own Address 2
mbed_official 87:085cde657901 260 (++) General call mode
mbed_official 87:085cde657901 261 (++) Nostretch mode
mbed_official 87:085cde657901 262
mbed_official 87:085cde657901 263 (+) Call the function HAL_I2C_DeInit() to restore the default configuration
mbed_official 87:085cde657901 264 of the selected I2Cx periperal.
mbed_official 87:085cde657901 265
mbed_official 87:085cde657901 266 @endverbatim
mbed_official 87:085cde657901 267 * @{
mbed_official 87:085cde657901 268 */
mbed_official 87:085cde657901 269
mbed_official 87:085cde657901 270 /**
mbed_official 87:085cde657901 271 * @brief Initializes the I2C according to the specified parameters
mbed_official 87:085cde657901 272 * in the I2C_InitTypeDef and create the associated handle.
mbed_official 226:b062af740e40 273 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 274 * the configuration information for I2C module
mbed_official 87:085cde657901 275 * @retval HAL status
mbed_official 87:085cde657901 276 */
mbed_official 87:085cde657901 277 HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 278 {
mbed_official 87:085cde657901 279 uint32_t freqrange = 0;
mbed_official 87:085cde657901 280 uint32_t pclk1 = 0;
mbed_official 87:085cde657901 281
mbed_official 87:085cde657901 282 /* Check the I2C handle allocation */
mbed_official 87:085cde657901 283 if(hi2c == NULL)
mbed_official 87:085cde657901 284 {
mbed_official 87:085cde657901 285 return HAL_ERROR;
mbed_official 87:085cde657901 286 }
mbed_official 87:085cde657901 287
mbed_official 87:085cde657901 288 /* Check the parameters */
mbed_official 87:085cde657901 289 assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance));
mbed_official 87:085cde657901 290 assert_param(IS_I2C_CLOCK_SPEED(hi2c->Init.ClockSpeed));
mbed_official 87:085cde657901 291 assert_param(IS_I2C_DUTY_CYCLE(hi2c->Init.DutyCycle));
mbed_official 87:085cde657901 292 assert_param(IS_I2C_OWN_ADDRESS1(hi2c->Init.OwnAddress1));
mbed_official 87:085cde657901 293 assert_param(IS_I2C_ADDRESSING_MODE(hi2c->Init.AddressingMode));
mbed_official 87:085cde657901 294 assert_param(IS_I2C_DUAL_ADDRESS(hi2c->Init.DualAddressMode));
mbed_official 87:085cde657901 295 assert_param(IS_I2C_OWN_ADDRESS2(hi2c->Init.OwnAddress2));
mbed_official 87:085cde657901 296 assert_param(IS_I2C_GENERAL_CALL(hi2c->Init.GeneralCallMode));
mbed_official 87:085cde657901 297 assert_param(IS_I2C_NO_STRETCH(hi2c->Init.NoStretchMode));
mbed_official 87:085cde657901 298
mbed_official 87:085cde657901 299 if(hi2c->State == HAL_I2C_STATE_RESET)
mbed_official 87:085cde657901 300 {
mbed_official 87:085cde657901 301 /* Init the low level hardware : GPIO, CLOCK, NVIC */
mbed_official 87:085cde657901 302 HAL_I2C_MspInit(hi2c);
mbed_official 87:085cde657901 303 }
mbed_official 87:085cde657901 304
mbed_official 87:085cde657901 305 hi2c->State = HAL_I2C_STATE_BUSY;
mbed_official 87:085cde657901 306
mbed_official 87:085cde657901 307 /* Disble the selected I2C peripheral */
mbed_official 87:085cde657901 308 __HAL_I2C_DISABLE(hi2c);
mbed_official 87:085cde657901 309
mbed_official 87:085cde657901 310 /* Get PCLK1 frequency */
mbed_official 87:085cde657901 311 pclk1 = HAL_RCC_GetPCLK1Freq();
mbed_official 87:085cde657901 312
mbed_official 87:085cde657901 313 /* Calculate frequency range */
mbed_official 87:085cde657901 314 freqrange = __HAL_I2C_FREQRANGE(pclk1);
mbed_official 87:085cde657901 315
mbed_official 87:085cde657901 316 /*---------------------------- I2Cx CR2 Configuration ----------------------*/
mbed_official 87:085cde657901 317 /* Configure I2Cx: Frequency range */
mbed_official 87:085cde657901 318 hi2c->Instance->CR2 = freqrange;
mbed_official 87:085cde657901 319
mbed_official 87:085cde657901 320 /*---------------------------- I2Cx TRISE Configuration --------------------*/
mbed_official 87:085cde657901 321 /* Configure I2Cx: Rise Time */
mbed_official 87:085cde657901 322 hi2c->Instance->TRISE = __HAL_I2C_RISE_TIME(freqrange, hi2c->Init.ClockSpeed);
mbed_official 87:085cde657901 323
mbed_official 87:085cde657901 324 /*---------------------------- I2Cx CCR Configuration ----------------------*/
mbed_official 87:085cde657901 325 /* Configure I2Cx: Speed */
mbed_official 87:085cde657901 326 hi2c->Instance->CCR = __HAL_I2C_SPEED(pclk1, hi2c->Init.ClockSpeed, hi2c->Init.DutyCycle);
mbed_official 87:085cde657901 327
mbed_official 87:085cde657901 328 /*---------------------------- I2Cx CR1 Configuration ----------------------*/
mbed_official 87:085cde657901 329 /* Configure I2Cx: Generalcall and NoStretch mode */
mbed_official 87:085cde657901 330 hi2c->Instance->CR1 = (hi2c->Init.GeneralCallMode | hi2c->Init.NoStretchMode);
mbed_official 87:085cde657901 331
mbed_official 87:085cde657901 332 /*---------------------------- I2Cx OAR1 Configuration ---------------------*/
mbed_official 87:085cde657901 333 /* Configure I2Cx: Own Address1 and addressing mode */
mbed_official 87:085cde657901 334 hi2c->Instance->OAR1 = (hi2c->Init.AddressingMode | hi2c->Init.OwnAddress1);
mbed_official 87:085cde657901 335
mbed_official 87:085cde657901 336 /*---------------------------- I2Cx OAR2 Configuration ---------------------*/
mbed_official 87:085cde657901 337 /* Configure I2Cx: Dual mode and Own Address2 */
mbed_official 87:085cde657901 338 hi2c->Instance->OAR2 = (hi2c->Init.DualAddressMode | hi2c->Init.OwnAddress2);
mbed_official 87:085cde657901 339
mbed_official 87:085cde657901 340 /* Enable the selected I2C peripheral */
mbed_official 87:085cde657901 341 __HAL_I2C_ENABLE(hi2c);
mbed_official 87:085cde657901 342
mbed_official 87:085cde657901 343 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
mbed_official 87:085cde657901 344 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 345
mbed_official 87:085cde657901 346 return HAL_OK;
mbed_official 87:085cde657901 347 }
mbed_official 87:085cde657901 348
mbed_official 87:085cde657901 349 /**
mbed_official 87:085cde657901 350 * @brief DeInitializes the I2C peripheral.
mbed_official 226:b062af740e40 351 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 352 * the configuration information for I2C module
mbed_official 87:085cde657901 353 * @retval HAL status
mbed_official 87:085cde657901 354 */
mbed_official 87:085cde657901 355 HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 356 {
mbed_official 87:085cde657901 357 /* Check the I2C handle allocation */
mbed_official 87:085cde657901 358 if(hi2c == NULL)
mbed_official 87:085cde657901 359 {
mbed_official 87:085cde657901 360 return HAL_ERROR;
mbed_official 87:085cde657901 361 }
mbed_official 87:085cde657901 362
mbed_official 87:085cde657901 363 /* Check the parameters */
mbed_official 87:085cde657901 364 assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance));
mbed_official 87:085cde657901 365
mbed_official 87:085cde657901 366 hi2c->State = HAL_I2C_STATE_BUSY;
mbed_official 87:085cde657901 367
mbed_official 87:085cde657901 368 /* Disable the I2C Peripheral Clock */
mbed_official 87:085cde657901 369 __HAL_I2C_DISABLE(hi2c);
mbed_official 87:085cde657901 370
mbed_official 87:085cde657901 371 /* DeInit the low level hardware: GPIO, CLOCK, NVIC */
mbed_official 87:085cde657901 372 HAL_I2C_MspDeInit(hi2c);
mbed_official 87:085cde657901 373
mbed_official 87:085cde657901 374 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
mbed_official 106:ced8cbb51063 375
mbed_official 87:085cde657901 376 hi2c->State = HAL_I2C_STATE_RESET;
mbed_official 87:085cde657901 377
mbed_official 106:ced8cbb51063 378 /* Release Lock */
mbed_official 106:ced8cbb51063 379 __HAL_UNLOCK(hi2c);
mbed_official 106:ced8cbb51063 380
mbed_official 87:085cde657901 381 return HAL_OK;
mbed_official 87:085cde657901 382 }
mbed_official 87:085cde657901 383
mbed_official 87:085cde657901 384 /**
mbed_official 87:085cde657901 385 * @brief I2C MSP Init.
mbed_official 226:b062af740e40 386 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 387 * the configuration information for I2C module
mbed_official 87:085cde657901 388 * @retval None
mbed_official 87:085cde657901 389 */
mbed_official 87:085cde657901 390 __weak void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 391 {
mbed_official 87:085cde657901 392 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 393 the HAL_I2C_MspInit could be implemented in the user file
mbed_official 87:085cde657901 394 */
mbed_official 87:085cde657901 395 }
mbed_official 87:085cde657901 396
mbed_official 87:085cde657901 397 /**
mbed_official 87:085cde657901 398 * @brief I2C MSP DeInit
mbed_official 226:b062af740e40 399 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 400 * the configuration information for I2C module
mbed_official 87:085cde657901 401 * @retval None
mbed_official 87:085cde657901 402 */
mbed_official 87:085cde657901 403 __weak void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 404 {
mbed_official 87:085cde657901 405 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 406 the HAL_I2C_MspDeInit could be implemented in the user file
mbed_official 87:085cde657901 407 */
mbed_official 87:085cde657901 408 }
mbed_official 87:085cde657901 409
mbed_official 87:085cde657901 410 /**
mbed_official 87:085cde657901 411 * @}
mbed_official 87:085cde657901 412 */
mbed_official 87:085cde657901 413
mbed_official 87:085cde657901 414 /** @defgroup I2C_Group2 IO operation functions
mbed_official 87:085cde657901 415 * @brief Data transfers functions
mbed_official 87:085cde657901 416 *
mbed_official 87:085cde657901 417 @verbatim
mbed_official 87:085cde657901 418 ===============================================================================
mbed_official 87:085cde657901 419 ##### IO operation functions #####
mbed_official 87:085cde657901 420 ===============================================================================
mbed_official 87:085cde657901 421 [..]
mbed_official 87:085cde657901 422 This subsection provides a set of functions allowing to manage the I2C data
mbed_official 87:085cde657901 423 transfers.
mbed_official 87:085cde657901 424
mbed_official 226:b062af740e40 425 (#) There are two modes of transfer:
mbed_official 87:085cde657901 426 (++) Blocking mode : The communication is performed in the polling mode.
mbed_official 87:085cde657901 427 The status of all data processing is returned by the same function
mbed_official 87:085cde657901 428 after finishing transfer.
mbed_official 87:085cde657901 429 (++) No-Blocking mode : The communication is performed using Interrupts
mbed_official 87:085cde657901 430 or DMA. These functions return the status of the transfer startup.
mbed_official 87:085cde657901 431 The end of the data processing will be indicated through the
mbed_official 87:085cde657901 432 dedicated I2C IRQ when using Interrupt mode or the DMA IRQ when
mbed_official 87:085cde657901 433 using DMA mode.
mbed_official 87:085cde657901 434
mbed_official 87:085cde657901 435 (#) Blocking mode functions are :
mbed_official 87:085cde657901 436 (++) HAL_I2C_Master_Transmit()
mbed_official 87:085cde657901 437 (++) HAL_I2C_Master_Receive()
mbed_official 87:085cde657901 438 (++) HAL_I2C_Slave_Transmit()
mbed_official 87:085cde657901 439 (++) HAL_I2C_Slave_Receive()
mbed_official 87:085cde657901 440 (++) HAL_I2C_Mem_Write()
mbed_official 87:085cde657901 441 (++) HAL_I2C_Mem_Read()
mbed_official 87:085cde657901 442 (++) HAL_I2C_IsDeviceReady()
mbed_official 87:085cde657901 443
mbed_official 87:085cde657901 444 (#) No-Blocking mode functions with Interrupt are :
mbed_official 87:085cde657901 445 (++) HAL_I2C_Master_Transmit_IT()
mbed_official 87:085cde657901 446 (++) HAL_I2C_Master_Receive_IT()
mbed_official 87:085cde657901 447 (++) HAL_I2C_Slave_Transmit_IT()
mbed_official 87:085cde657901 448 (++) HAL_I2C_Slave_Receive_IT()
mbed_official 87:085cde657901 449 (++) HAL_I2C_Mem_Write_IT()
mbed_official 87:085cde657901 450 (++) HAL_I2C_Mem_Read_IT()
mbed_official 87:085cde657901 451
mbed_official 87:085cde657901 452 (#) No-Blocking mode functions with DMA are :
mbed_official 87:085cde657901 453 (++) HAL_I2C_Master_Transmit_DMA()
mbed_official 87:085cde657901 454 (++) HAL_I2C_Master_Receive_DMA()
mbed_official 87:085cde657901 455 (++) HAL_I2C_Slave_Transmit_DMA()
mbed_official 87:085cde657901 456 (++) HAL_I2C_Slave_Receive_DMA()
mbed_official 87:085cde657901 457 (++) HAL_I2C_Mem_Write_DMA()
mbed_official 87:085cde657901 458 (++) HAL_I2C_Mem_Read_DMA()
mbed_official 87:085cde657901 459
mbed_official 226:b062af740e40 460 (#) A set of Transfer Complete Callbacks are provided in non Blocking mode:
mbed_official 87:085cde657901 461 (++) HAL_I2C_MemTxCpltCallback()
mbed_official 87:085cde657901 462 (++) HAL_I2C_MemRxCpltCallback()
mbed_official 87:085cde657901 463 (++) HAL_I2C_MasterTxCpltCallback()
mbed_official 87:085cde657901 464 (++) HAL_I2C_MasterRxCpltCallback()
mbed_official 87:085cde657901 465 (++) HAL_I2C_SlaveTxCpltCallback()
mbed_official 87:085cde657901 466 (++) HAL_I2C_SlaveRxCpltCallback()
mbed_official 87:085cde657901 467 (++) HAL_I2C_ErrorCallback()
mbed_official 87:085cde657901 468
mbed_official 87:085cde657901 469 @endverbatim
mbed_official 87:085cde657901 470 * @{
mbed_official 87:085cde657901 471 */
mbed_official 87:085cde657901 472
mbed_official 87:085cde657901 473 /**
mbed_official 87:085cde657901 474 * @brief Transmits in master mode an amount of data in blocking mode.
mbed_official 226:b062af740e40 475 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 476 * the configuration information for I2C module
mbed_official 87:085cde657901 477 * @param DevAddress: Target device address
mbed_official 87:085cde657901 478 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 479 * @param Size: Amount of data to be sent
mbed_official 87:085cde657901 480 * @param Timeout: Timeout duration
mbed_official 87:085cde657901 481 * @retval HAL status
mbed_official 87:085cde657901 482 */
mbed_official 87:085cde657901 483 HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
mbed_official 87:085cde657901 484 {
mbed_official 87:085cde657901 485 if(hi2c->State == HAL_I2C_STATE_READY)
mbed_official 87:085cde657901 486 {
mbed_official 87:085cde657901 487 if((pData == NULL) || (Size == 0))
mbed_official 87:085cde657901 488 {
mbed_official 87:085cde657901 489 return HAL_ERROR;
mbed_official 87:085cde657901 490 }
mbed_official 87:085cde657901 491
mbed_official 87:085cde657901 492 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
mbed_official 87:085cde657901 493 {
mbed_official 87:085cde657901 494 return HAL_BUSY;
mbed_official 87:085cde657901 495 }
mbed_official 87:085cde657901 496
mbed_official 87:085cde657901 497 /* Process Locked */
mbed_official 87:085cde657901 498 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 499
mbed_official 87:085cde657901 500 hi2c->State = HAL_I2C_STATE_BUSY_TX;
mbed_official 87:085cde657901 501 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
mbed_official 87:085cde657901 502
mbed_official 87:085cde657901 503 /* Send Slave Address */
mbed_official 87:085cde657901 504 if(I2C_MasterRequestWrite(hi2c, DevAddress, Timeout) != HAL_OK)
mbed_official 87:085cde657901 505 {
mbed_official 87:085cde657901 506 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 507 {
mbed_official 87:085cde657901 508 /* Process Unlocked */
mbed_official 87:085cde657901 509 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 510 return HAL_ERROR;
mbed_official 87:085cde657901 511 }
mbed_official 87:085cde657901 512 else
mbed_official 87:085cde657901 513 {
mbed_official 87:085cde657901 514 /* Process Unlocked */
mbed_official 87:085cde657901 515 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 516 return HAL_TIMEOUT;
mbed_official 87:085cde657901 517 }
mbed_official 87:085cde657901 518 }
mbed_official 87:085cde657901 519
mbed_official 87:085cde657901 520 /* Clear ADDR flag */
mbed_official 87:085cde657901 521 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 522
mbed_official 87:085cde657901 523 while(Size > 0)
mbed_official 87:085cde657901 524 {
mbed_official 87:085cde657901 525 /* Wait until TXE flag is set */
mbed_official 87:085cde657901 526 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 527 {
mbed_official 87:085cde657901 528 return HAL_TIMEOUT;
mbed_official 87:085cde657901 529 }
mbed_official 87:085cde657901 530
mbed_official 87:085cde657901 531 /* Write data to DR */
mbed_official 87:085cde657901 532 hi2c->Instance->DR = (*pData++);
mbed_official 87:085cde657901 533 Size--;
mbed_official 87:085cde657901 534
mbed_official 87:085cde657901 535 if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (Size != 0))
mbed_official 87:085cde657901 536 {
mbed_official 87:085cde657901 537 /* Write data to DR */
mbed_official 87:085cde657901 538 hi2c->Instance->DR = (*pData++);
mbed_official 87:085cde657901 539 Size--;
mbed_official 87:085cde657901 540 }
mbed_official 87:085cde657901 541 }
mbed_official 87:085cde657901 542
mbed_official 87:085cde657901 543 /* Wait until TXE flag is set */
mbed_official 87:085cde657901 544 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 545 {
mbed_official 87:085cde657901 546 return HAL_TIMEOUT;
mbed_official 87:085cde657901 547 }
mbed_official 87:085cde657901 548
mbed_official 87:085cde657901 549 /* Generate Stop */
mbed_official 87:085cde657901 550 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 551
mbed_official 87:085cde657901 552 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 553 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 554 {
mbed_official 87:085cde657901 555 return HAL_TIMEOUT;
mbed_official 87:085cde657901 556 }
mbed_official 87:085cde657901 557
mbed_official 87:085cde657901 558 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 559
mbed_official 87:085cde657901 560 /* Process Unlocked */
mbed_official 87:085cde657901 561 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 562
mbed_official 87:085cde657901 563 return HAL_OK;
mbed_official 87:085cde657901 564 }
mbed_official 87:085cde657901 565 else
mbed_official 87:085cde657901 566 {
mbed_official 87:085cde657901 567 return HAL_BUSY;
mbed_official 87:085cde657901 568 }
mbed_official 87:085cde657901 569 }
mbed_official 87:085cde657901 570
mbed_official 87:085cde657901 571 /**
mbed_official 87:085cde657901 572 * @brief Receives in master mode an amount of data in blocking mode.
mbed_official 226:b062af740e40 573 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 574 * the configuration information for I2C module
mbed_official 87:085cde657901 575 * @param DevAddress: Target device address
mbed_official 87:085cde657901 576 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 577 * @param Size: Amount of data to be sent
mbed_official 87:085cde657901 578 * @param Timeout: Timeout duration
mbed_official 87:085cde657901 579 * @retval HAL status
mbed_official 87:085cde657901 580 */
mbed_official 87:085cde657901 581 HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
mbed_official 87:085cde657901 582 {
mbed_official 87:085cde657901 583 if(hi2c->State == HAL_I2C_STATE_READY)
mbed_official 87:085cde657901 584 {
mbed_official 87:085cde657901 585 if((pData == NULL) || (Size == 0))
mbed_official 87:085cde657901 586 {
mbed_official 87:085cde657901 587 return HAL_ERROR;
mbed_official 87:085cde657901 588 }
mbed_official 87:085cde657901 589
mbed_official 87:085cde657901 590 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
mbed_official 87:085cde657901 591 {
mbed_official 87:085cde657901 592 return HAL_BUSY;
mbed_official 87:085cde657901 593 }
mbed_official 87:085cde657901 594
mbed_official 87:085cde657901 595 /* Process Locked */
mbed_official 87:085cde657901 596 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 597
mbed_official 87:085cde657901 598 hi2c->State = HAL_I2C_STATE_BUSY_RX;
mbed_official 87:085cde657901 599 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
mbed_official 87:085cde657901 600
mbed_official 87:085cde657901 601 /* Send Slave Address */
mbed_official 87:085cde657901 602 if(I2C_MasterRequestRead(hi2c, DevAddress, Timeout) != HAL_OK)
mbed_official 87:085cde657901 603 {
mbed_official 87:085cde657901 604 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 605 {
mbed_official 87:085cde657901 606 /* Process Unlocked */
mbed_official 87:085cde657901 607 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 608 return HAL_ERROR;
mbed_official 87:085cde657901 609 }
mbed_official 87:085cde657901 610 else
mbed_official 87:085cde657901 611 {
mbed_official 87:085cde657901 612 /* Process Unlocked */
mbed_official 87:085cde657901 613 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 614 return HAL_TIMEOUT;
mbed_official 87:085cde657901 615 }
mbed_official 87:085cde657901 616 }
mbed_official 87:085cde657901 617
mbed_official 87:085cde657901 618 if(Size == 1)
mbed_official 87:085cde657901 619 {
mbed_official 87:085cde657901 620 /* Disable Acknowledge */
mbed_official 87:085cde657901 621 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 622
mbed_official 87:085cde657901 623 /* Clear ADDR flag */
mbed_official 87:085cde657901 624 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 625
mbed_official 87:085cde657901 626 /* Generate Stop */
mbed_official 87:085cde657901 627 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 628 }
mbed_official 87:085cde657901 629 else if(Size == 2)
mbed_official 87:085cde657901 630 {
mbed_official 87:085cde657901 631 /* Disable Acknowledge */
mbed_official 87:085cde657901 632 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 633
mbed_official 87:085cde657901 634 /* Enable Pos */
mbed_official 87:085cde657901 635 hi2c->Instance->CR1 |= I2C_CR1_POS;
mbed_official 87:085cde657901 636
mbed_official 87:085cde657901 637 /* Clear ADDR flag */
mbed_official 87:085cde657901 638 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 639 }
mbed_official 87:085cde657901 640 else
mbed_official 87:085cde657901 641 {
mbed_official 87:085cde657901 642 /* Enable Acknowledge */
mbed_official 87:085cde657901 643 hi2c->Instance->CR1 |= I2C_CR1_ACK;
mbed_official 87:085cde657901 644
mbed_official 87:085cde657901 645 /* Clear ADDR flag */
mbed_official 87:085cde657901 646 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 647 }
mbed_official 87:085cde657901 648
mbed_official 87:085cde657901 649 while(Size > 0)
mbed_official 87:085cde657901 650 {
mbed_official 87:085cde657901 651 if(Size <= 3)
mbed_official 87:085cde657901 652 {
mbed_official 87:085cde657901 653 /* One byte */
mbed_official 87:085cde657901 654 if(Size == 1)
mbed_official 87:085cde657901 655 {
mbed_official 87:085cde657901 656 /* Wait until RXNE flag is set */
mbed_official 87:085cde657901 657 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 658 {
mbed_official 87:085cde657901 659 return HAL_TIMEOUT;
mbed_official 87:085cde657901 660 }
mbed_official 87:085cde657901 661
mbed_official 87:085cde657901 662 /* Read data from DR */
mbed_official 87:085cde657901 663 (*pData++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 664 Size--;
mbed_official 87:085cde657901 665 }
mbed_official 87:085cde657901 666 /* Two bytes */
mbed_official 87:085cde657901 667 else if(Size == 2)
mbed_official 87:085cde657901 668 {
mbed_official 87:085cde657901 669 /* Wait until BTF flag is set */
mbed_official 87:085cde657901 670 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 671 {
mbed_official 87:085cde657901 672 return HAL_TIMEOUT;
mbed_official 87:085cde657901 673 }
mbed_official 87:085cde657901 674
mbed_official 87:085cde657901 675 /* Generate Stop */
mbed_official 87:085cde657901 676 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 677
mbed_official 87:085cde657901 678 /* Read data from DR */
mbed_official 87:085cde657901 679 (*pData++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 680 Size--;
mbed_official 87:085cde657901 681
mbed_official 87:085cde657901 682 /* Read data from DR */
mbed_official 87:085cde657901 683 (*pData++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 684 Size--;
mbed_official 87:085cde657901 685 }
mbed_official 87:085cde657901 686 /* 3 Last bytes */
mbed_official 87:085cde657901 687 else
mbed_official 87:085cde657901 688 {
mbed_official 87:085cde657901 689 /* Wait until BTF flag is set */
mbed_official 87:085cde657901 690 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 691 {
mbed_official 87:085cde657901 692 return HAL_TIMEOUT;
mbed_official 87:085cde657901 693 }
mbed_official 87:085cde657901 694
mbed_official 87:085cde657901 695 /* Disable Acknowledge */
mbed_official 87:085cde657901 696 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 697
mbed_official 87:085cde657901 698 /* Read data from DR */
mbed_official 87:085cde657901 699 (*pData++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 700 Size--;
mbed_official 87:085cde657901 701
mbed_official 87:085cde657901 702 /* Wait until BTF flag is set */
mbed_official 87:085cde657901 703 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 704 {
mbed_official 87:085cde657901 705 return HAL_TIMEOUT;
mbed_official 87:085cde657901 706 }
mbed_official 87:085cde657901 707
mbed_official 87:085cde657901 708 /* Generate Stop */
mbed_official 87:085cde657901 709 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 710
mbed_official 87:085cde657901 711 /* Read data from DR */
mbed_official 87:085cde657901 712 (*pData++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 713 Size--;
mbed_official 87:085cde657901 714
mbed_official 87:085cde657901 715 /* Read data from DR */
mbed_official 87:085cde657901 716 (*pData++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 717 Size--;
mbed_official 87:085cde657901 718 }
mbed_official 87:085cde657901 719 }
mbed_official 87:085cde657901 720 else
mbed_official 87:085cde657901 721 {
mbed_official 87:085cde657901 722 /* Wait until RXNE flag is set */
mbed_official 87:085cde657901 723 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 724 {
mbed_official 87:085cde657901 725 return HAL_TIMEOUT;
mbed_official 87:085cde657901 726 }
mbed_official 87:085cde657901 727
mbed_official 87:085cde657901 728 /* Read data from DR */
mbed_official 87:085cde657901 729 (*pData++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 730 Size--;
mbed_official 87:085cde657901 731
mbed_official 87:085cde657901 732 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET)
mbed_official 87:085cde657901 733 {
mbed_official 87:085cde657901 734 /* Read data from DR */
mbed_official 87:085cde657901 735 (*pData++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 736 Size--;
mbed_official 87:085cde657901 737 }
mbed_official 87:085cde657901 738 }
mbed_official 87:085cde657901 739 }
mbed_official 87:085cde657901 740
mbed_official 87:085cde657901 741 /* Disable Pos */
mbed_official 87:085cde657901 742 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
mbed_official 87:085cde657901 743
mbed_official 87:085cde657901 744 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 745 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 746 {
mbed_official 87:085cde657901 747 return HAL_TIMEOUT;
mbed_official 87:085cde657901 748 }
mbed_official 87:085cde657901 749
mbed_official 87:085cde657901 750 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 751
mbed_official 87:085cde657901 752 /* Process Unlocked */
mbed_official 87:085cde657901 753 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 754
mbed_official 87:085cde657901 755 return HAL_OK;
mbed_official 87:085cde657901 756 }
mbed_official 87:085cde657901 757 else
mbed_official 87:085cde657901 758 {
mbed_official 87:085cde657901 759 return HAL_BUSY;
mbed_official 87:085cde657901 760 }
mbed_official 87:085cde657901 761 }
mbed_official 87:085cde657901 762
mbed_official 87:085cde657901 763 /**
mbed_official 87:085cde657901 764 * @brief Transmits in slave mode an amount of data in blocking mode.
mbed_official 226:b062af740e40 765 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 766 * the configuration information for I2C module
mbed_official 87:085cde657901 767 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 768 * @param Size: Amount of data to be sent
mbed_official 87:085cde657901 769 * @param Timeout: Timeout duration
mbed_official 87:085cde657901 770 * @retval HAL status
mbed_official 87:085cde657901 771 */
mbed_official 87:085cde657901 772 HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout)
mbed_official 87:085cde657901 773 {
mbed_official 87:085cde657901 774 if(hi2c->State == HAL_I2C_STATE_READY)
mbed_official 87:085cde657901 775 {
mbed_official 87:085cde657901 776 if((pData == NULL) || (Size == 0))
mbed_official 87:085cde657901 777 {
mbed_official 87:085cde657901 778 return HAL_ERROR;
mbed_official 87:085cde657901 779 }
mbed_official 87:085cde657901 780
mbed_official 87:085cde657901 781 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
mbed_official 87:085cde657901 782 {
mbed_official 87:085cde657901 783 return HAL_BUSY;
mbed_official 87:085cde657901 784 }
mbed_official 87:085cde657901 785
mbed_official 87:085cde657901 786 /* Process Locked */
mbed_official 87:085cde657901 787 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 788
mbed_official 87:085cde657901 789 hi2c->State = HAL_I2C_STATE_BUSY_TX;
mbed_official 87:085cde657901 790 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
mbed_official 87:085cde657901 791
mbed_official 87:085cde657901 792 /* Enable Address Acknowledge */
mbed_official 87:085cde657901 793 hi2c->Instance->CR1 |= I2C_CR1_ACK;
mbed_official 87:085cde657901 794
mbed_official 87:085cde657901 795 /* Wait until ADDR flag is set */
mbed_official 87:085cde657901 796 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 797 {
mbed_official 87:085cde657901 798 return HAL_TIMEOUT;
mbed_official 87:085cde657901 799 }
mbed_official 87:085cde657901 800
mbed_official 87:085cde657901 801 /* Clear ADDR flag */
mbed_official 87:085cde657901 802 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 803
mbed_official 87:085cde657901 804 /* If 10bit addressing mode is selected */
mbed_official 87:085cde657901 805 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT)
mbed_official 87:085cde657901 806 {
mbed_official 87:085cde657901 807 /* Wait until ADDR flag is set */
mbed_official 87:085cde657901 808 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 809 {
mbed_official 87:085cde657901 810 return HAL_TIMEOUT;
mbed_official 87:085cde657901 811 }
mbed_official 87:085cde657901 812
mbed_official 87:085cde657901 813 /* Clear ADDR flag */
mbed_official 87:085cde657901 814 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 815 }
mbed_official 87:085cde657901 816
mbed_official 87:085cde657901 817 while(Size > 0)
mbed_official 87:085cde657901 818 {
mbed_official 87:085cde657901 819 /* Wait until TXE flag is set */
mbed_official 87:085cde657901 820 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 821 {
mbed_official 87:085cde657901 822 return HAL_TIMEOUT;
mbed_official 87:085cde657901 823 }
mbed_official 87:085cde657901 824
mbed_official 87:085cde657901 825 /* Write data to DR */
mbed_official 87:085cde657901 826 hi2c->Instance->DR = (*pData++);
mbed_official 87:085cde657901 827 Size--;
mbed_official 87:085cde657901 828
mbed_official 87:085cde657901 829 if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (Size != 0))
mbed_official 87:085cde657901 830 {
mbed_official 87:085cde657901 831 /* Write data to DR */
mbed_official 87:085cde657901 832 hi2c->Instance->DR = (*pData++);
mbed_official 87:085cde657901 833 Size--;
mbed_official 87:085cde657901 834 }
mbed_official 87:085cde657901 835 }
mbed_official 87:085cde657901 836
mbed_official 87:085cde657901 837 /* Wait until AF flag is set */
mbed_official 87:085cde657901 838 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_AF, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 839 {
mbed_official 87:085cde657901 840 return HAL_TIMEOUT;
mbed_official 87:085cde657901 841 }
mbed_official 87:085cde657901 842
mbed_official 87:085cde657901 843 /* Clear AF flag */
mbed_official 87:085cde657901 844 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
mbed_official 87:085cde657901 845
mbed_official 87:085cde657901 846 /* Disable Address Acknowledge */
mbed_official 87:085cde657901 847 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 848
mbed_official 87:085cde657901 849 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 850 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 851 {
mbed_official 87:085cde657901 852 return HAL_TIMEOUT;
mbed_official 87:085cde657901 853 }
mbed_official 87:085cde657901 854
mbed_official 87:085cde657901 855 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 856
mbed_official 87:085cde657901 857 /* Process Unlocked */
mbed_official 87:085cde657901 858 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 859
mbed_official 87:085cde657901 860 return HAL_OK;
mbed_official 87:085cde657901 861 }
mbed_official 87:085cde657901 862 else
mbed_official 87:085cde657901 863 {
mbed_official 87:085cde657901 864 return HAL_BUSY;
mbed_official 87:085cde657901 865 }
mbed_official 87:085cde657901 866 }
mbed_official 87:085cde657901 867
mbed_official 87:085cde657901 868 /**
mbed_official 87:085cde657901 869 * @brief Receive in slave mode an amount of data in blocking mode
mbed_official 226:b062af740e40 870 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 871 * the configuration information for I2C module
mbed_official 87:085cde657901 872 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 873 * @param Size: Amount of data to be sent
mbed_official 87:085cde657901 874 * @param Timeout: Timeout duration
mbed_official 87:085cde657901 875 * @retval HAL status
mbed_official 87:085cde657901 876 */
mbed_official 87:085cde657901 877 HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout)
mbed_official 87:085cde657901 878 {
mbed_official 87:085cde657901 879 if(hi2c->State == HAL_I2C_STATE_READY)
mbed_official 87:085cde657901 880 {
mbed_official 87:085cde657901 881 if((pData == NULL) || (Size == 0))
mbed_official 87:085cde657901 882 {
mbed_official 87:085cde657901 883 return HAL_ERROR;
mbed_official 87:085cde657901 884 }
mbed_official 87:085cde657901 885
mbed_official 87:085cde657901 886 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
mbed_official 87:085cde657901 887 {
mbed_official 87:085cde657901 888 return HAL_BUSY;
mbed_official 87:085cde657901 889 }
mbed_official 87:085cde657901 890
mbed_official 87:085cde657901 891 /* Process Locked */
mbed_official 87:085cde657901 892 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 893
mbed_official 87:085cde657901 894 hi2c->State = HAL_I2C_STATE_BUSY_RX;
mbed_official 87:085cde657901 895 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
mbed_official 87:085cde657901 896
mbed_official 87:085cde657901 897 /* Enable Address Acknowledge */
mbed_official 87:085cde657901 898 hi2c->Instance->CR1 |= I2C_CR1_ACK;
mbed_official 87:085cde657901 899
mbed_official 87:085cde657901 900 /* Wait until ADDR flag is set */
mbed_official 87:085cde657901 901 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 902 {
mbed_official 87:085cde657901 903 return HAL_TIMEOUT;
mbed_official 87:085cde657901 904 }
mbed_official 87:085cde657901 905
mbed_official 87:085cde657901 906 /* Clear ADDR flag */
mbed_official 87:085cde657901 907 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 908
mbed_official 87:085cde657901 909 while(Size > 0)
mbed_official 87:085cde657901 910 {
mbed_official 87:085cde657901 911 /* Wait until RXNE flag is set */
mbed_official 87:085cde657901 912 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 913 {
mbed_official 87:085cde657901 914 return HAL_TIMEOUT;
mbed_official 87:085cde657901 915 }
mbed_official 87:085cde657901 916
mbed_official 87:085cde657901 917 /* Read data from DR */
mbed_official 87:085cde657901 918 (*pData++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 919 Size--;
mbed_official 87:085cde657901 920
mbed_official 87:085cde657901 921 if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (Size != 0))
mbed_official 87:085cde657901 922 {
mbed_official 87:085cde657901 923 /* Read data from DR */
mbed_official 87:085cde657901 924 (*pData++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 925 Size--;
mbed_official 87:085cde657901 926 }
mbed_official 87:085cde657901 927 }
mbed_official 87:085cde657901 928
mbed_official 87:085cde657901 929 /* Wait until STOP flag is set */
mbed_official 87:085cde657901 930 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_STOPF, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 931 {
mbed_official 87:085cde657901 932 return HAL_TIMEOUT;
mbed_official 87:085cde657901 933 }
mbed_official 87:085cde657901 934
mbed_official 87:085cde657901 935 /* Clear STOP flag */
mbed_official 87:085cde657901 936 __HAL_I2C_CLEAR_STOPFLAG(hi2c);
mbed_official 87:085cde657901 937
mbed_official 87:085cde657901 938 /* Disable Address Acknowledge */
mbed_official 87:085cde657901 939 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 940
mbed_official 87:085cde657901 941 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 942 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 943 {
mbed_official 87:085cde657901 944 return HAL_TIMEOUT;
mbed_official 87:085cde657901 945 }
mbed_official 87:085cde657901 946
mbed_official 87:085cde657901 947 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 948
mbed_official 87:085cde657901 949 /* Process Unlocked */
mbed_official 87:085cde657901 950 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 951
mbed_official 87:085cde657901 952 return HAL_OK;
mbed_official 87:085cde657901 953 }
mbed_official 87:085cde657901 954 else
mbed_official 87:085cde657901 955 {
mbed_official 87:085cde657901 956 return HAL_BUSY;
mbed_official 87:085cde657901 957 }
mbed_official 87:085cde657901 958 }
mbed_official 87:085cde657901 959
mbed_official 87:085cde657901 960 /**
mbed_official 87:085cde657901 961 * @brief Transmit in master mode an amount of data in no-blocking mode with Interrupt
mbed_official 226:b062af740e40 962 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 963 * the configuration information for I2C module
mbed_official 87:085cde657901 964 * @param DevAddress: Target device address
mbed_official 87:085cde657901 965 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 966 * @param Size: Amount of data to be sent
mbed_official 87:085cde657901 967 * @retval HAL status
mbed_official 87:085cde657901 968 */
mbed_official 87:085cde657901 969 HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
mbed_official 87:085cde657901 970 {
mbed_official 87:085cde657901 971 if(hi2c->State == HAL_I2C_STATE_READY)
mbed_official 87:085cde657901 972 {
mbed_official 87:085cde657901 973 if((pData == NULL) || (Size == 0))
mbed_official 87:085cde657901 974 {
mbed_official 87:085cde657901 975 return HAL_ERROR;
mbed_official 87:085cde657901 976 }
mbed_official 87:085cde657901 977
mbed_official 87:085cde657901 978 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
mbed_official 87:085cde657901 979 {
mbed_official 87:085cde657901 980 return HAL_BUSY;
mbed_official 87:085cde657901 981 }
mbed_official 87:085cde657901 982
mbed_official 87:085cde657901 983 /* Process Locked */
mbed_official 87:085cde657901 984 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 985
mbed_official 87:085cde657901 986 hi2c->State = HAL_I2C_STATE_BUSY_TX;
mbed_official 87:085cde657901 987 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
mbed_official 87:085cde657901 988
mbed_official 87:085cde657901 989 hi2c->pBuffPtr = pData;
mbed_official 87:085cde657901 990 hi2c->XferSize = Size;
mbed_official 87:085cde657901 991 hi2c->XferCount = Size;
mbed_official 87:085cde657901 992
mbed_official 87:085cde657901 993 /* Send Slave Address */
mbed_official 87:085cde657901 994 if(I2C_MasterRequestWrite(hi2c, DevAddress, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 995 {
mbed_official 87:085cde657901 996 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 997 {
mbed_official 87:085cde657901 998 /* Process Unlocked */
mbed_official 87:085cde657901 999 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 1000 return HAL_ERROR;
mbed_official 87:085cde657901 1001 }
mbed_official 87:085cde657901 1002 else
mbed_official 87:085cde657901 1003 {
mbed_official 87:085cde657901 1004 /* Process Unlocked */
mbed_official 87:085cde657901 1005 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 1006 return HAL_TIMEOUT;
mbed_official 87:085cde657901 1007 }
mbed_official 87:085cde657901 1008 }
mbed_official 87:085cde657901 1009
mbed_official 87:085cde657901 1010 /* Clear ADDR flag */
mbed_official 87:085cde657901 1011 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 1012
mbed_official 87:085cde657901 1013 /* Process Unlocked */
mbed_official 87:085cde657901 1014 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 1015
mbed_official 87:085cde657901 1016 /* Note : The I2C interrupts must be enabled after unlocking current process
mbed_official 87:085cde657901 1017 to avoid the risk of I2C interrupt handle execution before current
mbed_official 87:085cde657901 1018 process unlock */
mbed_official 87:085cde657901 1019
mbed_official 87:085cde657901 1020 /* Enable EVT, BUF and ERR interrupt */
mbed_official 87:085cde657901 1021 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
mbed_official 87:085cde657901 1022
mbed_official 87:085cde657901 1023 return HAL_OK;
mbed_official 87:085cde657901 1024 }
mbed_official 87:085cde657901 1025 else
mbed_official 87:085cde657901 1026 {
mbed_official 87:085cde657901 1027 return HAL_BUSY;
mbed_official 87:085cde657901 1028 }
mbed_official 87:085cde657901 1029 }
mbed_official 87:085cde657901 1030
mbed_official 87:085cde657901 1031 /**
mbed_official 87:085cde657901 1032 * @brief Receive in master mode an amount of data in no-blocking mode with Interrupt
mbed_official 226:b062af740e40 1033 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1034 * the configuration information for I2C module
mbed_official 87:085cde657901 1035 * @param DevAddress: Target device address
mbed_official 87:085cde657901 1036 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 1037 * @param Size: Amount of data to be sent
mbed_official 87:085cde657901 1038 * @retval HAL status
mbed_official 87:085cde657901 1039 */
mbed_official 87:085cde657901 1040 HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
mbed_official 87:085cde657901 1041 {
mbed_official 87:085cde657901 1042 if(hi2c->State == HAL_I2C_STATE_READY)
mbed_official 87:085cde657901 1043 {
mbed_official 87:085cde657901 1044 if((pData == NULL) || (Size == 0))
mbed_official 87:085cde657901 1045 {
mbed_official 87:085cde657901 1046 return HAL_ERROR;
mbed_official 87:085cde657901 1047 }
mbed_official 87:085cde657901 1048
mbed_official 87:085cde657901 1049 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
mbed_official 87:085cde657901 1050 {
mbed_official 87:085cde657901 1051 return HAL_BUSY;
mbed_official 87:085cde657901 1052 }
mbed_official 87:085cde657901 1053
mbed_official 87:085cde657901 1054 /* Process Locked */
mbed_official 87:085cde657901 1055 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 1056
mbed_official 87:085cde657901 1057 hi2c->State = HAL_I2C_STATE_BUSY_RX;
mbed_official 87:085cde657901 1058 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
mbed_official 87:085cde657901 1059
mbed_official 87:085cde657901 1060 hi2c->pBuffPtr = pData;
mbed_official 87:085cde657901 1061 hi2c->XferSize = Size;
mbed_official 87:085cde657901 1062 hi2c->XferCount = Size;
mbed_official 87:085cde657901 1063
mbed_official 87:085cde657901 1064 /* Send Slave Address */
mbed_official 87:085cde657901 1065 if(I2C_MasterRequestRead(hi2c, DevAddress, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 1066 {
mbed_official 87:085cde657901 1067 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 1068 {
mbed_official 87:085cde657901 1069 /* Process Unlocked */
mbed_official 87:085cde657901 1070 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 1071 return HAL_ERROR;
mbed_official 87:085cde657901 1072 }
mbed_official 87:085cde657901 1073 else
mbed_official 87:085cde657901 1074 {
mbed_official 87:085cde657901 1075 /* Process Unlocked */
mbed_official 87:085cde657901 1076 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 1077 return HAL_TIMEOUT;
mbed_official 87:085cde657901 1078 }
mbed_official 87:085cde657901 1079 }
mbed_official 87:085cde657901 1080
mbed_official 87:085cde657901 1081 if(hi2c->XferCount == 1)
mbed_official 87:085cde657901 1082 {
mbed_official 87:085cde657901 1083 /* Disable Acknowledge */
mbed_official 87:085cde657901 1084 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 1085
mbed_official 87:085cde657901 1086 /* Clear ADDR flag */
mbed_official 87:085cde657901 1087 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 1088
mbed_official 87:085cde657901 1089 /* Generate Stop */
mbed_official 87:085cde657901 1090 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 1091 }
mbed_official 87:085cde657901 1092 else if(hi2c->XferCount == 2)
mbed_official 87:085cde657901 1093 {
mbed_official 87:085cde657901 1094 /* Disable Acknowledge */
mbed_official 87:085cde657901 1095 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 1096
mbed_official 87:085cde657901 1097 /* Enable Pos */
mbed_official 87:085cde657901 1098 hi2c->Instance->CR1 |= I2C_CR1_POS;
mbed_official 87:085cde657901 1099
mbed_official 87:085cde657901 1100 /* Clear ADDR flag */
mbed_official 87:085cde657901 1101 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 1102 }
mbed_official 87:085cde657901 1103 else
mbed_official 87:085cde657901 1104 {
mbed_official 87:085cde657901 1105 /* Enable Acknowledge */
mbed_official 87:085cde657901 1106 hi2c->Instance->CR1 |= I2C_CR1_ACK;
mbed_official 87:085cde657901 1107
mbed_official 87:085cde657901 1108 /* Clear ADDR flag */
mbed_official 87:085cde657901 1109 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 1110 }
mbed_official 87:085cde657901 1111
mbed_official 87:085cde657901 1112 /* Process Unlocked */
mbed_official 87:085cde657901 1113 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 1114
mbed_official 87:085cde657901 1115 /* Note : The I2C interrupts must be enabled after unlocking current process
mbed_official 87:085cde657901 1116 to avoid the risk of I2C interrupt handle execution before current
mbed_official 87:085cde657901 1117 process unlock */
mbed_official 87:085cde657901 1118
mbed_official 87:085cde657901 1119 /* Enable EVT, BUF and ERR interrupt */
mbed_official 87:085cde657901 1120 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
mbed_official 87:085cde657901 1121
mbed_official 87:085cde657901 1122 return HAL_OK;
mbed_official 87:085cde657901 1123 }
mbed_official 87:085cde657901 1124 else
mbed_official 87:085cde657901 1125 {
mbed_official 87:085cde657901 1126 return HAL_BUSY;
mbed_official 87:085cde657901 1127 }
mbed_official 87:085cde657901 1128 }
mbed_official 87:085cde657901 1129
mbed_official 87:085cde657901 1130 /**
mbed_official 87:085cde657901 1131 * @brief Transmit in slave mode an amount of data in no-blocking mode with Interrupt
mbed_official 226:b062af740e40 1132 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1133 * the configuration information for I2C module
mbed_official 87:085cde657901 1134 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 1135 * @param Size: Amount of data to be sent
mbed_official 87:085cde657901 1136 * @retval HAL status
mbed_official 87:085cde657901 1137 */
mbed_official 87:085cde657901 1138 HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
mbed_official 87:085cde657901 1139 {
mbed_official 87:085cde657901 1140 if(hi2c->State == HAL_I2C_STATE_READY)
mbed_official 87:085cde657901 1141 {
mbed_official 87:085cde657901 1142 if((pData == NULL) || (Size == 0))
mbed_official 87:085cde657901 1143 {
mbed_official 87:085cde657901 1144 return HAL_ERROR;
mbed_official 87:085cde657901 1145 }
mbed_official 87:085cde657901 1146
mbed_official 87:085cde657901 1147 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
mbed_official 87:085cde657901 1148 {
mbed_official 87:085cde657901 1149 return HAL_BUSY;
mbed_official 87:085cde657901 1150 }
mbed_official 87:085cde657901 1151
mbed_official 87:085cde657901 1152 /* Process Locked */
mbed_official 87:085cde657901 1153 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 1154
mbed_official 87:085cde657901 1155 hi2c->State = HAL_I2C_STATE_BUSY_TX;
mbed_official 87:085cde657901 1156 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
mbed_official 87:085cde657901 1157
mbed_official 87:085cde657901 1158 hi2c->pBuffPtr = pData;
mbed_official 87:085cde657901 1159 hi2c->XferSize = Size;
mbed_official 87:085cde657901 1160 hi2c->XferCount = Size;
mbed_official 87:085cde657901 1161
mbed_official 87:085cde657901 1162 /* Enable Address Acknowledge */
mbed_official 87:085cde657901 1163 hi2c->Instance->CR1 |= I2C_CR1_ACK;
mbed_official 87:085cde657901 1164
mbed_official 87:085cde657901 1165 /* Process Unlocked */
mbed_official 87:085cde657901 1166 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 1167
mbed_official 87:085cde657901 1168 /* Note : The I2C interrupts must be enabled after unlocking current process
mbed_official 87:085cde657901 1169 to avoid the risk of I2C interrupt handle execution before current
mbed_official 87:085cde657901 1170 process unlock */
mbed_official 87:085cde657901 1171
mbed_official 87:085cde657901 1172 /* Enable EVT, BUF and ERR interrupt */
mbed_official 87:085cde657901 1173 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
mbed_official 87:085cde657901 1174
mbed_official 87:085cde657901 1175 return HAL_OK;
mbed_official 87:085cde657901 1176 }
mbed_official 87:085cde657901 1177 else
mbed_official 87:085cde657901 1178 {
mbed_official 87:085cde657901 1179 return HAL_BUSY;
mbed_official 87:085cde657901 1180 }
mbed_official 87:085cde657901 1181 }
mbed_official 87:085cde657901 1182
mbed_official 87:085cde657901 1183 /**
mbed_official 87:085cde657901 1184 * @brief Receive in slave mode an amount of data in no-blocking mode with Interrupt
mbed_official 226:b062af740e40 1185 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1186 * the configuration information for I2C module
mbed_official 87:085cde657901 1187 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 1188 * @param Size: Amount of data to be sent
mbed_official 87:085cde657901 1189 * @retval HAL status
mbed_official 87:085cde657901 1190 */
mbed_official 87:085cde657901 1191 HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
mbed_official 87:085cde657901 1192 {
mbed_official 87:085cde657901 1193 if(hi2c->State == HAL_I2C_STATE_READY)
mbed_official 87:085cde657901 1194 {
mbed_official 87:085cde657901 1195 if((pData == NULL) || (Size == 0))
mbed_official 87:085cde657901 1196 {
mbed_official 87:085cde657901 1197 return HAL_ERROR;
mbed_official 87:085cde657901 1198 }
mbed_official 87:085cde657901 1199
mbed_official 87:085cde657901 1200 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
mbed_official 87:085cde657901 1201 {
mbed_official 87:085cde657901 1202 return HAL_BUSY;
mbed_official 87:085cde657901 1203 }
mbed_official 87:085cde657901 1204
mbed_official 87:085cde657901 1205 /* Process Locked */
mbed_official 87:085cde657901 1206 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 1207
mbed_official 87:085cde657901 1208 hi2c->State = HAL_I2C_STATE_BUSY_RX;
mbed_official 87:085cde657901 1209 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
mbed_official 87:085cde657901 1210
mbed_official 87:085cde657901 1211 hi2c->pBuffPtr = pData;
mbed_official 87:085cde657901 1212 hi2c->XferSize = Size;
mbed_official 87:085cde657901 1213 hi2c->XferCount = Size;
mbed_official 87:085cde657901 1214
mbed_official 87:085cde657901 1215 /* Enable Address Acknowledge */
mbed_official 87:085cde657901 1216 hi2c->Instance->CR1 |= I2C_CR1_ACK;
mbed_official 87:085cde657901 1217
mbed_official 87:085cde657901 1218 /* Process Unlocked */
mbed_official 87:085cde657901 1219 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 1220
mbed_official 87:085cde657901 1221 /* Note : The I2C interrupts must be enabled after unlocking current process
mbed_official 87:085cde657901 1222 to avoid the risk of I2C interrupt handle execution before current
mbed_official 87:085cde657901 1223 process unlock */
mbed_official 87:085cde657901 1224
mbed_official 87:085cde657901 1225 /* Enable EVT, BUF and ERR interrupt */
mbed_official 87:085cde657901 1226 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
mbed_official 87:085cde657901 1227
mbed_official 87:085cde657901 1228 return HAL_OK;
mbed_official 87:085cde657901 1229 }
mbed_official 87:085cde657901 1230 else
mbed_official 87:085cde657901 1231 {
mbed_official 87:085cde657901 1232 return HAL_BUSY;
mbed_official 87:085cde657901 1233 }
mbed_official 87:085cde657901 1234 }
mbed_official 87:085cde657901 1235
mbed_official 87:085cde657901 1236 /**
mbed_official 87:085cde657901 1237 * @brief Transmit in master mode an amount of data in no-blocking mode with DMA
mbed_official 226:b062af740e40 1238 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1239 * the configuration information for I2C module
mbed_official 87:085cde657901 1240 * @param DevAddress: Target device address
mbed_official 87:085cde657901 1241 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 1242 * @param Size: Amount of data to be sent
mbed_official 87:085cde657901 1243 * @retval HAL status
mbed_official 87:085cde657901 1244 */
mbed_official 87:085cde657901 1245 HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
mbed_official 87:085cde657901 1246 {
mbed_official 87:085cde657901 1247 if(hi2c->State == HAL_I2C_STATE_READY)
mbed_official 87:085cde657901 1248 {
mbed_official 87:085cde657901 1249 if((pData == NULL) || (Size == 0))
mbed_official 87:085cde657901 1250 {
mbed_official 87:085cde657901 1251 return HAL_ERROR;
mbed_official 87:085cde657901 1252 }
mbed_official 87:085cde657901 1253
mbed_official 87:085cde657901 1254 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
mbed_official 87:085cde657901 1255 {
mbed_official 87:085cde657901 1256 return HAL_BUSY;
mbed_official 87:085cde657901 1257 }
mbed_official 87:085cde657901 1258
mbed_official 87:085cde657901 1259 /* Process Locked */
mbed_official 87:085cde657901 1260 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 1261
mbed_official 87:085cde657901 1262 hi2c->State = HAL_I2C_STATE_BUSY_TX;
mbed_official 87:085cde657901 1263 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
mbed_official 87:085cde657901 1264
mbed_official 87:085cde657901 1265 hi2c->pBuffPtr = pData;
mbed_official 87:085cde657901 1266 hi2c->XferSize = Size;
mbed_official 87:085cde657901 1267 hi2c->XferCount = Size;
mbed_official 87:085cde657901 1268
mbed_official 87:085cde657901 1269 /* Set the I2C DMA transfert complete callback */
mbed_official 87:085cde657901 1270 hi2c->hdmatx->XferCpltCallback = I2C_DMAMasterTransmitCplt;
mbed_official 87:085cde657901 1271
mbed_official 87:085cde657901 1272 /* Set the DMA error callback */
mbed_official 87:085cde657901 1273 hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
mbed_official 87:085cde657901 1274
mbed_official 87:085cde657901 1275 /* Enable the DMA Stream */
mbed_official 87:085cde657901 1276 HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->DR, Size);
mbed_official 87:085cde657901 1277
mbed_official 87:085cde657901 1278 /* Send Slave Address */
mbed_official 87:085cde657901 1279 if(I2C_MasterRequestWrite(hi2c, DevAddress, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 1280 {
mbed_official 87:085cde657901 1281 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 1282 {
mbed_official 87:085cde657901 1283 /* Process Unlocked */
mbed_official 87:085cde657901 1284 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 1285 return HAL_ERROR;
mbed_official 87:085cde657901 1286 }
mbed_official 87:085cde657901 1287 else
mbed_official 87:085cde657901 1288 {
mbed_official 87:085cde657901 1289 /* Process Unlocked */
mbed_official 87:085cde657901 1290 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 1291 return HAL_TIMEOUT;
mbed_official 87:085cde657901 1292 }
mbed_official 87:085cde657901 1293 }
mbed_official 87:085cde657901 1294
mbed_official 87:085cde657901 1295 /* Enable DMA Request */
mbed_official 87:085cde657901 1296 hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
mbed_official 87:085cde657901 1297
mbed_official 87:085cde657901 1298 /* Clear ADDR flag */
mbed_official 87:085cde657901 1299 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 1300
mbed_official 87:085cde657901 1301 /* Process Unlocked */
mbed_official 87:085cde657901 1302 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 1303
mbed_official 87:085cde657901 1304 return HAL_OK;
mbed_official 87:085cde657901 1305 }
mbed_official 87:085cde657901 1306 else
mbed_official 87:085cde657901 1307 {
mbed_official 87:085cde657901 1308 return HAL_BUSY;
mbed_official 87:085cde657901 1309 }
mbed_official 87:085cde657901 1310 }
mbed_official 87:085cde657901 1311
mbed_official 87:085cde657901 1312 /**
mbed_official 87:085cde657901 1313 * @brief Receive in master mode an amount of data in no-blocking mode with DMA
mbed_official 226:b062af740e40 1314 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1315 * the configuration information for I2C module
mbed_official 87:085cde657901 1316 * @param DevAddress: Target device address
mbed_official 87:085cde657901 1317 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 1318 * @param Size: Amount of data to be sent
mbed_official 87:085cde657901 1319 * @retval HAL status
mbed_official 87:085cde657901 1320 */
mbed_official 87:085cde657901 1321 HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
mbed_official 87:085cde657901 1322 {
mbed_official 87:085cde657901 1323 if(hi2c->State == HAL_I2C_STATE_READY)
mbed_official 87:085cde657901 1324 {
mbed_official 87:085cde657901 1325 if((pData == NULL) || (Size == 0))
mbed_official 87:085cde657901 1326 {
mbed_official 87:085cde657901 1327 return HAL_ERROR;
mbed_official 87:085cde657901 1328 }
mbed_official 87:085cde657901 1329
mbed_official 87:085cde657901 1330 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
mbed_official 87:085cde657901 1331 {
mbed_official 87:085cde657901 1332 return HAL_BUSY;
mbed_official 87:085cde657901 1333 }
mbed_official 87:085cde657901 1334
mbed_official 87:085cde657901 1335 /* Process Locked */
mbed_official 87:085cde657901 1336 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 1337
mbed_official 87:085cde657901 1338 hi2c->State = HAL_I2C_STATE_BUSY_RX;
mbed_official 87:085cde657901 1339 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
mbed_official 87:085cde657901 1340
mbed_official 87:085cde657901 1341 hi2c->pBuffPtr = pData;
mbed_official 87:085cde657901 1342 hi2c->XferSize = Size;
mbed_official 87:085cde657901 1343 hi2c->XferCount = Size;
mbed_official 87:085cde657901 1344
mbed_official 87:085cde657901 1345 /* Set the I2C DMA transfert complete callback */
mbed_official 87:085cde657901 1346 hi2c->hdmarx->XferCpltCallback = I2C_DMAMasterReceiveCplt;
mbed_official 87:085cde657901 1347
mbed_official 87:085cde657901 1348 /* Set the DMA error callback */
mbed_official 87:085cde657901 1349 hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
mbed_official 87:085cde657901 1350
mbed_official 87:085cde657901 1351 /* Enable the DMA Stream */
mbed_official 87:085cde657901 1352 HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)pData, Size);
mbed_official 87:085cde657901 1353
mbed_official 87:085cde657901 1354 /* Send Slave Address */
mbed_official 87:085cde657901 1355 if(I2C_MasterRequestRead(hi2c, DevAddress, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 1356 {
mbed_official 87:085cde657901 1357 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 1358 {
mbed_official 87:085cde657901 1359 /* Process Unlocked */
mbed_official 87:085cde657901 1360 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 1361 return HAL_ERROR;
mbed_official 87:085cde657901 1362 }
mbed_official 87:085cde657901 1363 else
mbed_official 87:085cde657901 1364 {
mbed_official 87:085cde657901 1365 /* Process Unlocked */
mbed_official 87:085cde657901 1366 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 1367 return HAL_TIMEOUT;
mbed_official 87:085cde657901 1368 }
mbed_official 87:085cde657901 1369 }
mbed_official 87:085cde657901 1370
mbed_official 87:085cde657901 1371 if(Size == 1)
mbed_official 87:085cde657901 1372 {
mbed_official 87:085cde657901 1373 /* Disable Acknowledge */
mbed_official 87:085cde657901 1374 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 1375 }
mbed_official 87:085cde657901 1376 else
mbed_official 87:085cde657901 1377 {
mbed_official 87:085cde657901 1378 /* Enable Last DMA bit */
mbed_official 87:085cde657901 1379 hi2c->Instance->CR2 |= I2C_CR2_LAST;
mbed_official 87:085cde657901 1380 }
mbed_official 87:085cde657901 1381
mbed_official 87:085cde657901 1382 /* Enable DMA Request */
mbed_official 87:085cde657901 1383 hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
mbed_official 87:085cde657901 1384
mbed_official 87:085cde657901 1385 /* Clear ADDR flag */
mbed_official 87:085cde657901 1386 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 1387
mbed_official 87:085cde657901 1388 /* Process Unlocked */
mbed_official 87:085cde657901 1389 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 1390
mbed_official 87:085cde657901 1391 return HAL_OK;
mbed_official 87:085cde657901 1392 }
mbed_official 87:085cde657901 1393 else
mbed_official 87:085cde657901 1394 {
mbed_official 87:085cde657901 1395 return HAL_BUSY;
mbed_official 87:085cde657901 1396 }
mbed_official 87:085cde657901 1397 }
mbed_official 87:085cde657901 1398
mbed_official 87:085cde657901 1399 /**
mbed_official 87:085cde657901 1400 * @brief Transmit in slave mode an amount of data in no-blocking mode with DMA
mbed_official 226:b062af740e40 1401 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1402 * the configuration information for I2C module
mbed_official 87:085cde657901 1403 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 1404 * @param Size: Amount of data to be sent
mbed_official 87:085cde657901 1405 * @retval HAL status
mbed_official 87:085cde657901 1406 */
mbed_official 87:085cde657901 1407 HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
mbed_official 87:085cde657901 1408 {
mbed_official 87:085cde657901 1409 if(hi2c->State == HAL_I2C_STATE_READY)
mbed_official 87:085cde657901 1410 {
mbed_official 87:085cde657901 1411 if((pData == NULL) || (Size == 0))
mbed_official 87:085cde657901 1412 {
mbed_official 87:085cde657901 1413 return HAL_ERROR;
mbed_official 87:085cde657901 1414 }
mbed_official 87:085cde657901 1415
mbed_official 87:085cde657901 1416 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
mbed_official 87:085cde657901 1417 {
mbed_official 87:085cde657901 1418 return HAL_BUSY;
mbed_official 87:085cde657901 1419 }
mbed_official 87:085cde657901 1420
mbed_official 87:085cde657901 1421 /* Process Locked */
mbed_official 87:085cde657901 1422 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 1423
mbed_official 87:085cde657901 1424 hi2c->State = HAL_I2C_STATE_BUSY_TX;
mbed_official 87:085cde657901 1425 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
mbed_official 87:085cde657901 1426
mbed_official 87:085cde657901 1427 hi2c->pBuffPtr = pData;
mbed_official 87:085cde657901 1428 hi2c->XferSize = Size;
mbed_official 87:085cde657901 1429 hi2c->XferCount = Size;
mbed_official 87:085cde657901 1430
mbed_official 87:085cde657901 1431 /* Set the I2C DMA transfert complete callback */
mbed_official 87:085cde657901 1432 hi2c->hdmatx->XferCpltCallback = I2C_DMASlaveTransmitCplt;
mbed_official 87:085cde657901 1433
mbed_official 87:085cde657901 1434 /* Set the DMA error callback */
mbed_official 87:085cde657901 1435 hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
mbed_official 87:085cde657901 1436
mbed_official 87:085cde657901 1437 /* Enable the DMA Stream */
mbed_official 87:085cde657901 1438 HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->DR, Size);
mbed_official 87:085cde657901 1439
mbed_official 87:085cde657901 1440 /* Enable DMA Request */
mbed_official 87:085cde657901 1441 hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
mbed_official 87:085cde657901 1442
mbed_official 87:085cde657901 1443 /* Enable Address Acknowledge */
mbed_official 87:085cde657901 1444 hi2c->Instance->CR1 |= I2C_CR1_ACK;
mbed_official 87:085cde657901 1445
mbed_official 87:085cde657901 1446 /* Wait until ADDR flag is set */
mbed_official 87:085cde657901 1447 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, I2C_TIMEOUT_ADDR_SLAVE) != HAL_OK)
mbed_official 87:085cde657901 1448 {
mbed_official 87:085cde657901 1449 return HAL_TIMEOUT;
mbed_official 87:085cde657901 1450 }
mbed_official 87:085cde657901 1451
mbed_official 87:085cde657901 1452 /* If 7bit addressing mode is selected */
mbed_official 87:085cde657901 1453 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
mbed_official 87:085cde657901 1454 {
mbed_official 87:085cde657901 1455 /* Clear ADDR flag */
mbed_official 87:085cde657901 1456 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 1457 }
mbed_official 87:085cde657901 1458 else
mbed_official 87:085cde657901 1459 {
mbed_official 87:085cde657901 1460 /* Clear ADDR flag */
mbed_official 87:085cde657901 1461 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 1462
mbed_official 87:085cde657901 1463 /* Wait until ADDR flag is set */
mbed_official 87:085cde657901 1464 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, I2C_TIMEOUT_ADDR_SLAVE) != HAL_OK)
mbed_official 87:085cde657901 1465 {
mbed_official 87:085cde657901 1466 return HAL_TIMEOUT;
mbed_official 87:085cde657901 1467 }
mbed_official 87:085cde657901 1468
mbed_official 87:085cde657901 1469 /* Clear ADDR flag */
mbed_official 87:085cde657901 1470 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 1471 }
mbed_official 87:085cde657901 1472
mbed_official 87:085cde657901 1473 /* Process Unlocked */
mbed_official 87:085cde657901 1474 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 1475
mbed_official 87:085cde657901 1476 return HAL_OK;
mbed_official 87:085cde657901 1477 }
mbed_official 87:085cde657901 1478 else
mbed_official 87:085cde657901 1479 {
mbed_official 87:085cde657901 1480 return HAL_BUSY;
mbed_official 87:085cde657901 1481 }
mbed_official 87:085cde657901 1482 }
mbed_official 87:085cde657901 1483
mbed_official 87:085cde657901 1484 /**
mbed_official 87:085cde657901 1485 * @brief Receive in slave mode an amount of data in no-blocking mode with DMA
mbed_official 226:b062af740e40 1486 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1487 * the configuration information for I2C module
mbed_official 87:085cde657901 1488 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 1489 * @param Size: Amount of data to be sent
mbed_official 87:085cde657901 1490 * @retval HAL status
mbed_official 87:085cde657901 1491 */
mbed_official 87:085cde657901 1492 HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
mbed_official 87:085cde657901 1493 {
mbed_official 87:085cde657901 1494 if(hi2c->State == HAL_I2C_STATE_READY)
mbed_official 87:085cde657901 1495 {
mbed_official 87:085cde657901 1496 if((pData == NULL) || (Size == 0))
mbed_official 87:085cde657901 1497 {
mbed_official 87:085cde657901 1498 return HAL_ERROR;
mbed_official 87:085cde657901 1499 }
mbed_official 87:085cde657901 1500
mbed_official 87:085cde657901 1501 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
mbed_official 87:085cde657901 1502 {
mbed_official 87:085cde657901 1503 return HAL_BUSY;
mbed_official 87:085cde657901 1504 }
mbed_official 87:085cde657901 1505
mbed_official 87:085cde657901 1506 /* Process Locked */
mbed_official 87:085cde657901 1507 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 1508
mbed_official 87:085cde657901 1509 hi2c->State = HAL_I2C_STATE_BUSY_RX;
mbed_official 87:085cde657901 1510 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
mbed_official 87:085cde657901 1511
mbed_official 87:085cde657901 1512 hi2c->pBuffPtr = pData;
mbed_official 87:085cde657901 1513 hi2c->XferSize = Size;
mbed_official 87:085cde657901 1514 hi2c->XferCount = Size;
mbed_official 87:085cde657901 1515
mbed_official 87:085cde657901 1516 /* Set the I2C DMA transfert complete callback */
mbed_official 87:085cde657901 1517 hi2c->hdmarx->XferCpltCallback = I2C_DMASlaveReceiveCplt;
mbed_official 87:085cde657901 1518
mbed_official 87:085cde657901 1519 /* Set the DMA error callback */
mbed_official 87:085cde657901 1520 hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
mbed_official 87:085cde657901 1521
mbed_official 87:085cde657901 1522 /* Enable the DMA Stream */
mbed_official 87:085cde657901 1523 HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)pData, Size);
mbed_official 87:085cde657901 1524
mbed_official 87:085cde657901 1525 /* Enable DMA Request */
mbed_official 87:085cde657901 1526 hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
mbed_official 87:085cde657901 1527
mbed_official 87:085cde657901 1528 /* Enable Address Acknowledge */
mbed_official 87:085cde657901 1529 hi2c->Instance->CR1 |= I2C_CR1_ACK;
mbed_official 87:085cde657901 1530
mbed_official 87:085cde657901 1531 /* Wait until ADDR flag is set */
mbed_official 87:085cde657901 1532 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, I2C_TIMEOUT_ADDR_SLAVE) != HAL_OK)
mbed_official 87:085cde657901 1533 {
mbed_official 87:085cde657901 1534 return HAL_TIMEOUT;
mbed_official 87:085cde657901 1535 }
mbed_official 87:085cde657901 1536
mbed_official 87:085cde657901 1537 /* Clear ADDR flag */
mbed_official 87:085cde657901 1538 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 1539
mbed_official 87:085cde657901 1540 /* Process Unlocked */
mbed_official 87:085cde657901 1541 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 1542
mbed_official 87:085cde657901 1543 return HAL_OK;
mbed_official 87:085cde657901 1544 }
mbed_official 87:085cde657901 1545 else
mbed_official 87:085cde657901 1546 {
mbed_official 87:085cde657901 1547 return HAL_BUSY;
mbed_official 87:085cde657901 1548 }
mbed_official 87:085cde657901 1549 }
mbed_official 87:085cde657901 1550 /**
mbed_official 87:085cde657901 1551 * @brief Write an amount of data in blocking mode to a specific memory address
mbed_official 226:b062af740e40 1552 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1553 * the configuration information for I2C module
mbed_official 87:085cde657901 1554 * @param DevAddress: Target device address
mbed_official 87:085cde657901 1555 * @param MemAddress: Internal memory address
mbed_official 87:085cde657901 1556 * @param MemAddSize: Size of internal memory address
mbed_official 87:085cde657901 1557 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 1558 * @param Size: Amount of data to be sent
mbed_official 87:085cde657901 1559 * @param Timeout: Timeout duration
mbed_official 87:085cde657901 1560 * @retval HAL status
mbed_official 87:085cde657901 1561 */
mbed_official 87:085cde657901 1562 HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
mbed_official 87:085cde657901 1563 {
mbed_official 87:085cde657901 1564 /* Check the parameters */
mbed_official 87:085cde657901 1565 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
mbed_official 87:085cde657901 1566
mbed_official 87:085cde657901 1567 if(hi2c->State == HAL_I2C_STATE_READY)
mbed_official 87:085cde657901 1568 {
mbed_official 87:085cde657901 1569 if((pData == NULL) || (Size == 0))
mbed_official 87:085cde657901 1570 {
mbed_official 87:085cde657901 1571 return HAL_ERROR;
mbed_official 87:085cde657901 1572 }
mbed_official 87:085cde657901 1573
mbed_official 87:085cde657901 1574 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
mbed_official 87:085cde657901 1575 {
mbed_official 87:085cde657901 1576 return HAL_BUSY;
mbed_official 87:085cde657901 1577 }
mbed_official 87:085cde657901 1578
mbed_official 87:085cde657901 1579 /* Process Locked */
mbed_official 87:085cde657901 1580 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 1581
mbed_official 87:085cde657901 1582 hi2c->State = HAL_I2C_STATE_MEM_BUSY_TX;
mbed_official 87:085cde657901 1583 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
mbed_official 87:085cde657901 1584
mbed_official 87:085cde657901 1585 /* Send Slave Address and Memory Address */
mbed_official 87:085cde657901 1586 if(I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, Timeout) != HAL_OK)
mbed_official 87:085cde657901 1587 {
mbed_official 87:085cde657901 1588 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 1589 {
mbed_official 87:085cde657901 1590 /* Process Unlocked */
mbed_official 87:085cde657901 1591 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 1592 return HAL_ERROR;
mbed_official 87:085cde657901 1593 }
mbed_official 87:085cde657901 1594 else
mbed_official 87:085cde657901 1595 {
mbed_official 87:085cde657901 1596 /* Process Unlocked */
mbed_official 87:085cde657901 1597 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 1598 return HAL_TIMEOUT;
mbed_official 87:085cde657901 1599 }
mbed_official 87:085cde657901 1600 }
mbed_official 87:085cde657901 1601
mbed_official 87:085cde657901 1602 while(Size > 0)
mbed_official 87:085cde657901 1603 {
mbed_official 87:085cde657901 1604 /* Wait until TXE flag is set */
mbed_official 87:085cde657901 1605 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 1606 {
mbed_official 87:085cde657901 1607 return HAL_TIMEOUT;
mbed_official 87:085cde657901 1608 }
mbed_official 87:085cde657901 1609
mbed_official 87:085cde657901 1610 /* Write data to DR */
mbed_official 87:085cde657901 1611 hi2c->Instance->DR = (*pData++);
mbed_official 87:085cde657901 1612 Size--;
mbed_official 87:085cde657901 1613
mbed_official 87:085cde657901 1614 if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (Size != 0))
mbed_official 87:085cde657901 1615 {
mbed_official 87:085cde657901 1616 /* Write data to DR */
mbed_official 87:085cde657901 1617 hi2c->Instance->DR = (*pData++);
mbed_official 87:085cde657901 1618 Size--;
mbed_official 87:085cde657901 1619 }
mbed_official 87:085cde657901 1620 }
mbed_official 87:085cde657901 1621
mbed_official 87:085cde657901 1622 /* Wait until TXE flag is set */
mbed_official 87:085cde657901 1623 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 1624 {
mbed_official 87:085cde657901 1625 return HAL_TIMEOUT;
mbed_official 87:085cde657901 1626 }
mbed_official 87:085cde657901 1627
mbed_official 87:085cde657901 1628 /* Generate Stop */
mbed_official 87:085cde657901 1629 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 1630
mbed_official 87:085cde657901 1631 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 1632 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 1633 {
mbed_official 87:085cde657901 1634 return HAL_TIMEOUT;
mbed_official 87:085cde657901 1635 }
mbed_official 87:085cde657901 1636
mbed_official 87:085cde657901 1637 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 1638
mbed_official 87:085cde657901 1639 /* Process Unlocked */
mbed_official 87:085cde657901 1640 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 1641
mbed_official 87:085cde657901 1642 return HAL_OK;
mbed_official 87:085cde657901 1643 }
mbed_official 87:085cde657901 1644 else
mbed_official 87:085cde657901 1645 {
mbed_official 87:085cde657901 1646 return HAL_BUSY;
mbed_official 87:085cde657901 1647 }
mbed_official 87:085cde657901 1648 }
mbed_official 87:085cde657901 1649
mbed_official 87:085cde657901 1650 /**
mbed_official 87:085cde657901 1651 * @brief Read an amount of data in blocking mode from a specific memory address
mbed_official 226:b062af740e40 1652 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1653 * the configuration information for I2C module
mbed_official 87:085cde657901 1654 * @param DevAddress: Target device address
mbed_official 87:085cde657901 1655 * @param MemAddress: Internal memory address
mbed_official 87:085cde657901 1656 * @param MemAddSize: Size of internal memory address
mbed_official 87:085cde657901 1657 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 1658 * @param Size: Amount of data to be sent
mbed_official 87:085cde657901 1659 * @param Timeout: Timeout duration
mbed_official 87:085cde657901 1660 * @retval HAL status
mbed_official 87:085cde657901 1661 */
mbed_official 87:085cde657901 1662 HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
mbed_official 87:085cde657901 1663 {
mbed_official 87:085cde657901 1664 /* Check the parameters */
mbed_official 87:085cde657901 1665 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
mbed_official 87:085cde657901 1666
mbed_official 87:085cde657901 1667 if(hi2c->State == HAL_I2C_STATE_READY)
mbed_official 87:085cde657901 1668 {
mbed_official 87:085cde657901 1669 if((pData == NULL) || (Size == 0))
mbed_official 87:085cde657901 1670 {
mbed_official 87:085cde657901 1671 return HAL_ERROR;
mbed_official 87:085cde657901 1672 }
mbed_official 87:085cde657901 1673
mbed_official 87:085cde657901 1674 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
mbed_official 87:085cde657901 1675 {
mbed_official 87:085cde657901 1676 return HAL_BUSY;
mbed_official 87:085cde657901 1677 }
mbed_official 87:085cde657901 1678
mbed_official 87:085cde657901 1679 /* Process Locked */
mbed_official 87:085cde657901 1680 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 1681
mbed_official 87:085cde657901 1682 hi2c->State = HAL_I2C_STATE_MEM_BUSY_RX;
mbed_official 87:085cde657901 1683 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
mbed_official 87:085cde657901 1684
mbed_official 87:085cde657901 1685 /* Send Slave Address and Memory Address */
mbed_official 87:085cde657901 1686 if(I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, Timeout) != HAL_OK)
mbed_official 87:085cde657901 1687 {
mbed_official 87:085cde657901 1688 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 1689 {
mbed_official 87:085cde657901 1690 /* Process Unlocked */
mbed_official 87:085cde657901 1691 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 1692 return HAL_ERROR;
mbed_official 87:085cde657901 1693 }
mbed_official 87:085cde657901 1694 else
mbed_official 87:085cde657901 1695 {
mbed_official 87:085cde657901 1696 /* Process Unlocked */
mbed_official 87:085cde657901 1697 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 1698 return HAL_TIMEOUT;
mbed_official 87:085cde657901 1699 }
mbed_official 87:085cde657901 1700 }
mbed_official 87:085cde657901 1701
mbed_official 87:085cde657901 1702 if(Size == 1)
mbed_official 87:085cde657901 1703 {
mbed_official 87:085cde657901 1704 /* Disable Acknowledge */
mbed_official 87:085cde657901 1705 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 1706
mbed_official 87:085cde657901 1707 /* Clear ADDR flag */
mbed_official 87:085cde657901 1708 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 1709
mbed_official 87:085cde657901 1710 /* Generate Stop */
mbed_official 87:085cde657901 1711 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 1712 }
mbed_official 87:085cde657901 1713 else if(Size == 2)
mbed_official 87:085cde657901 1714 {
mbed_official 87:085cde657901 1715 /* Disable Acknowledge */
mbed_official 87:085cde657901 1716 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 1717
mbed_official 87:085cde657901 1718 /* Enable Pos */
mbed_official 87:085cde657901 1719 hi2c->Instance->CR1 |= I2C_CR1_POS;
mbed_official 87:085cde657901 1720
mbed_official 87:085cde657901 1721 /* Clear ADDR flag */
mbed_official 87:085cde657901 1722 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 1723 }
mbed_official 87:085cde657901 1724 else
mbed_official 87:085cde657901 1725 {
mbed_official 87:085cde657901 1726 /* Clear ADDR flag */
mbed_official 87:085cde657901 1727 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 1728 }
mbed_official 87:085cde657901 1729
mbed_official 87:085cde657901 1730 while(Size > 0)
mbed_official 87:085cde657901 1731 {
mbed_official 87:085cde657901 1732 if(Size <= 3)
mbed_official 87:085cde657901 1733 {
mbed_official 87:085cde657901 1734 /* One byte */
mbed_official 87:085cde657901 1735 if(Size== 1)
mbed_official 87:085cde657901 1736 {
mbed_official 87:085cde657901 1737 /* Wait until RXNE flag is set */
mbed_official 87:085cde657901 1738 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 1739 {
mbed_official 87:085cde657901 1740 return HAL_TIMEOUT;
mbed_official 87:085cde657901 1741 }
mbed_official 87:085cde657901 1742
mbed_official 87:085cde657901 1743 /* Read data from DR */
mbed_official 87:085cde657901 1744 (*pData++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 1745 Size--;
mbed_official 87:085cde657901 1746 }
mbed_official 87:085cde657901 1747 /* Two bytes */
mbed_official 87:085cde657901 1748 else if(Size == 2)
mbed_official 87:085cde657901 1749 {
mbed_official 87:085cde657901 1750 /* Wait until BTF flag is set */
mbed_official 87:085cde657901 1751 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 1752 {
mbed_official 87:085cde657901 1753 return HAL_TIMEOUT;
mbed_official 87:085cde657901 1754 }
mbed_official 87:085cde657901 1755
mbed_official 87:085cde657901 1756 /* Generate Stop */
mbed_official 87:085cde657901 1757 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 1758
mbed_official 87:085cde657901 1759 /* Read data from DR */
mbed_official 87:085cde657901 1760 (*pData++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 1761 Size--;
mbed_official 87:085cde657901 1762
mbed_official 87:085cde657901 1763 /* Read data from DR */
mbed_official 87:085cde657901 1764 (*pData++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 1765 Size--;
mbed_official 87:085cde657901 1766 }
mbed_official 87:085cde657901 1767 /* 3 Last bytes */
mbed_official 87:085cde657901 1768 else
mbed_official 87:085cde657901 1769 {
mbed_official 87:085cde657901 1770 /* Wait until BTF flag is set */
mbed_official 87:085cde657901 1771 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 1772 {
mbed_official 87:085cde657901 1773 return HAL_TIMEOUT;
mbed_official 87:085cde657901 1774 }
mbed_official 87:085cde657901 1775
mbed_official 87:085cde657901 1776 /* Disable Acknowledge */
mbed_official 87:085cde657901 1777 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 1778
mbed_official 87:085cde657901 1779 /* Read data from DR */
mbed_official 87:085cde657901 1780 (*pData++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 1781 Size--;
mbed_official 87:085cde657901 1782
mbed_official 87:085cde657901 1783 /* Wait until BTF flag is set */
mbed_official 87:085cde657901 1784 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 1785 {
mbed_official 87:085cde657901 1786 return HAL_TIMEOUT;
mbed_official 87:085cde657901 1787 }
mbed_official 87:085cde657901 1788
mbed_official 87:085cde657901 1789 /* Generate Stop */
mbed_official 87:085cde657901 1790 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 1791
mbed_official 87:085cde657901 1792 /* Read data from DR */
mbed_official 87:085cde657901 1793 (*pData++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 1794 Size--;
mbed_official 87:085cde657901 1795
mbed_official 87:085cde657901 1796 /* Read data from DR */
mbed_official 87:085cde657901 1797 (*pData++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 1798 Size--;
mbed_official 87:085cde657901 1799 }
mbed_official 87:085cde657901 1800 }
mbed_official 87:085cde657901 1801 else
mbed_official 87:085cde657901 1802 {
mbed_official 87:085cde657901 1803 /* Wait until RXNE flag is set */
mbed_official 87:085cde657901 1804 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 1805 {
mbed_official 87:085cde657901 1806 return HAL_TIMEOUT;
mbed_official 87:085cde657901 1807 }
mbed_official 87:085cde657901 1808
mbed_official 87:085cde657901 1809 /* Read data from DR */
mbed_official 87:085cde657901 1810 (*pData++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 1811 Size--;
mbed_official 87:085cde657901 1812
mbed_official 87:085cde657901 1813 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET)
mbed_official 87:085cde657901 1814 {
mbed_official 87:085cde657901 1815 /* Read data from DR */
mbed_official 87:085cde657901 1816 (*pData++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 1817 Size--;
mbed_official 87:085cde657901 1818 }
mbed_official 87:085cde657901 1819 }
mbed_official 87:085cde657901 1820 }
mbed_official 87:085cde657901 1821
mbed_official 87:085cde657901 1822 /* Disable Pos */
mbed_official 87:085cde657901 1823 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
mbed_official 87:085cde657901 1824
mbed_official 87:085cde657901 1825 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 1826 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 1827 {
mbed_official 87:085cde657901 1828 return HAL_TIMEOUT;
mbed_official 87:085cde657901 1829 }
mbed_official 87:085cde657901 1830
mbed_official 87:085cde657901 1831 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 1832
mbed_official 87:085cde657901 1833 /* Process Unlocked */
mbed_official 87:085cde657901 1834 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 1835
mbed_official 87:085cde657901 1836 return HAL_OK;
mbed_official 87:085cde657901 1837 }
mbed_official 87:085cde657901 1838 else
mbed_official 87:085cde657901 1839 {
mbed_official 87:085cde657901 1840 return HAL_BUSY;
mbed_official 87:085cde657901 1841 }
mbed_official 87:085cde657901 1842 }
mbed_official 87:085cde657901 1843 /**
mbed_official 87:085cde657901 1844 * @brief Write an amount of data in no-blocking mode with Interrupt to a specific memory address
mbed_official 226:b062af740e40 1845 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1846 * the configuration information for I2C module
mbed_official 87:085cde657901 1847 * @param DevAddress: Target device address
mbed_official 87:085cde657901 1848 * @param MemAddress: Internal memory address
mbed_official 87:085cde657901 1849 * @param MemAddSize: Size of internal memory address
mbed_official 87:085cde657901 1850 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 1851 * @param Size: Amount of data to be sent
mbed_official 87:085cde657901 1852 * @retval HAL status
mbed_official 87:085cde657901 1853 */
mbed_official 87:085cde657901 1854 HAL_StatusTypeDef HAL_I2C_Mem_Write_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
mbed_official 87:085cde657901 1855 {
mbed_official 87:085cde657901 1856 /* Check the parameters */
mbed_official 87:085cde657901 1857 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
mbed_official 87:085cde657901 1858
mbed_official 87:085cde657901 1859 if(hi2c->State == HAL_I2C_STATE_READY)
mbed_official 87:085cde657901 1860 {
mbed_official 87:085cde657901 1861 if((pData == NULL) || (Size == 0))
mbed_official 87:085cde657901 1862 {
mbed_official 87:085cde657901 1863 return HAL_ERROR;
mbed_official 87:085cde657901 1864 }
mbed_official 87:085cde657901 1865
mbed_official 87:085cde657901 1866 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
mbed_official 87:085cde657901 1867 {
mbed_official 87:085cde657901 1868 return HAL_BUSY;
mbed_official 87:085cde657901 1869 }
mbed_official 87:085cde657901 1870
mbed_official 87:085cde657901 1871 /* Process Locked */
mbed_official 87:085cde657901 1872 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 1873
mbed_official 87:085cde657901 1874 hi2c->State = HAL_I2C_STATE_MEM_BUSY_TX;
mbed_official 87:085cde657901 1875 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
mbed_official 87:085cde657901 1876
mbed_official 87:085cde657901 1877 hi2c->pBuffPtr = pData;
mbed_official 87:085cde657901 1878 hi2c->XferSize = Size;
mbed_official 87:085cde657901 1879 hi2c->XferCount = Size;
mbed_official 87:085cde657901 1880
mbed_official 87:085cde657901 1881 /* Send Slave Address and Memory Address */
mbed_official 87:085cde657901 1882 if(I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 1883 {
mbed_official 87:085cde657901 1884 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 1885 {
mbed_official 87:085cde657901 1886 /* Process Unlocked */
mbed_official 87:085cde657901 1887 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 1888 return HAL_ERROR;
mbed_official 87:085cde657901 1889 }
mbed_official 87:085cde657901 1890 else
mbed_official 87:085cde657901 1891 {
mbed_official 87:085cde657901 1892 /* Process Unlocked */
mbed_official 87:085cde657901 1893 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 1894 return HAL_TIMEOUT;
mbed_official 87:085cde657901 1895 }
mbed_official 87:085cde657901 1896 }
mbed_official 87:085cde657901 1897
mbed_official 87:085cde657901 1898 /* Process Unlocked */
mbed_official 87:085cde657901 1899 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 1900
mbed_official 87:085cde657901 1901 /* Note : The I2C interrupts must be enabled after unlocking current process
mbed_official 87:085cde657901 1902 to avoid the risk of I2C interrupt handle execution before current
mbed_official 87:085cde657901 1903 process unlock */
mbed_official 87:085cde657901 1904
mbed_official 87:085cde657901 1905 /* Enable EVT, BUF and ERR interrupt */
mbed_official 87:085cde657901 1906 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
mbed_official 87:085cde657901 1907
mbed_official 87:085cde657901 1908 return HAL_OK;
mbed_official 87:085cde657901 1909 }
mbed_official 87:085cde657901 1910 else
mbed_official 87:085cde657901 1911 {
mbed_official 87:085cde657901 1912 return HAL_BUSY;
mbed_official 87:085cde657901 1913 }
mbed_official 87:085cde657901 1914 }
mbed_official 87:085cde657901 1915
mbed_official 87:085cde657901 1916 /**
mbed_official 87:085cde657901 1917 * @brief Read an amount of data in no-blocking mode with Interrupt from a specific memory address
mbed_official 226:b062af740e40 1918 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1919 * the configuration information for I2C module
mbed_official 87:085cde657901 1920 * @param DevAddress: Target device address
mbed_official 87:085cde657901 1921 * @param MemAddress: Internal memory address
mbed_official 87:085cde657901 1922 * @param MemAddSize: Size of internal memory address
mbed_official 87:085cde657901 1923 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 1924 * @param Size: Amount of data to be sent
mbed_official 87:085cde657901 1925 * @retval HAL status
mbed_official 87:085cde657901 1926 */
mbed_official 87:085cde657901 1927 HAL_StatusTypeDef HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
mbed_official 87:085cde657901 1928 {
mbed_official 87:085cde657901 1929 /* Check the parameters */
mbed_official 87:085cde657901 1930 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
mbed_official 87:085cde657901 1931
mbed_official 87:085cde657901 1932 if(hi2c->State == HAL_I2C_STATE_READY)
mbed_official 87:085cde657901 1933 {
mbed_official 87:085cde657901 1934 if((pData == NULL) || (Size == 0))
mbed_official 87:085cde657901 1935 {
mbed_official 87:085cde657901 1936 return HAL_ERROR;
mbed_official 87:085cde657901 1937 }
mbed_official 87:085cde657901 1938
mbed_official 87:085cde657901 1939 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
mbed_official 87:085cde657901 1940 {
mbed_official 87:085cde657901 1941 return HAL_BUSY;
mbed_official 87:085cde657901 1942 }
mbed_official 87:085cde657901 1943
mbed_official 87:085cde657901 1944 /* Process Locked */
mbed_official 87:085cde657901 1945 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 1946
mbed_official 87:085cde657901 1947 hi2c->State = HAL_I2C_STATE_MEM_BUSY_RX;
mbed_official 87:085cde657901 1948 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
mbed_official 87:085cde657901 1949
mbed_official 87:085cde657901 1950 hi2c->pBuffPtr = pData;
mbed_official 87:085cde657901 1951 hi2c->XferSize = Size;
mbed_official 87:085cde657901 1952 hi2c->XferCount = Size;
mbed_official 87:085cde657901 1953
mbed_official 87:085cde657901 1954 /* Send Slave Address and Memory Address */
mbed_official 87:085cde657901 1955 if(I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 1956 {
mbed_official 87:085cde657901 1957 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 1958 {
mbed_official 87:085cde657901 1959 /* Process Unlocked */
mbed_official 87:085cde657901 1960 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 1961 return HAL_ERROR;
mbed_official 87:085cde657901 1962 }
mbed_official 87:085cde657901 1963 else
mbed_official 87:085cde657901 1964 {
mbed_official 87:085cde657901 1965 /* Process Unlocked */
mbed_official 87:085cde657901 1966 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 1967 return HAL_TIMEOUT;
mbed_official 87:085cde657901 1968 }
mbed_official 87:085cde657901 1969 }
mbed_official 87:085cde657901 1970
mbed_official 87:085cde657901 1971 if(hi2c->XferCount == 1)
mbed_official 87:085cde657901 1972 {
mbed_official 87:085cde657901 1973 /* Disable Acknowledge */
mbed_official 87:085cde657901 1974 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 1975
mbed_official 87:085cde657901 1976 /* Clear ADDR flag */
mbed_official 87:085cde657901 1977 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 1978
mbed_official 87:085cde657901 1979 /* Generate Stop */
mbed_official 87:085cde657901 1980 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 1981 }
mbed_official 87:085cde657901 1982 else if(hi2c->XferCount == 2)
mbed_official 87:085cde657901 1983 {
mbed_official 87:085cde657901 1984 /* Disable Acknowledge */
mbed_official 87:085cde657901 1985 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 1986
mbed_official 87:085cde657901 1987 /* Enable Pos */
mbed_official 87:085cde657901 1988 hi2c->Instance->CR1 |= I2C_CR1_POS;
mbed_official 87:085cde657901 1989
mbed_official 87:085cde657901 1990 /* Clear ADDR flag */
mbed_official 87:085cde657901 1991 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 1992 }
mbed_official 87:085cde657901 1993 else
mbed_official 87:085cde657901 1994 {
mbed_official 87:085cde657901 1995 /* Enable Acknowledge */
mbed_official 87:085cde657901 1996 hi2c->Instance->CR1 |= I2C_CR1_ACK;
mbed_official 87:085cde657901 1997
mbed_official 87:085cde657901 1998 /* Clear ADDR flag */
mbed_official 87:085cde657901 1999 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 2000 }
mbed_official 87:085cde657901 2001
mbed_official 87:085cde657901 2002 /* Process Unlocked */
mbed_official 87:085cde657901 2003 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2004
mbed_official 87:085cde657901 2005 /* Note : The I2C interrupts must be enabled after unlocking current process
mbed_official 87:085cde657901 2006 to avoid the risk of I2C interrupt handle execution before current
mbed_official 87:085cde657901 2007 process unlock */
mbed_official 87:085cde657901 2008
mbed_official 87:085cde657901 2009 /* Enable EVT, BUF and ERR interrupt */
mbed_official 87:085cde657901 2010 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
mbed_official 87:085cde657901 2011
mbed_official 87:085cde657901 2012 return HAL_OK;
mbed_official 87:085cde657901 2013 }
mbed_official 87:085cde657901 2014 else
mbed_official 87:085cde657901 2015 {
mbed_official 87:085cde657901 2016 return HAL_BUSY;
mbed_official 87:085cde657901 2017 }
mbed_official 87:085cde657901 2018 }
mbed_official 87:085cde657901 2019 /**
mbed_official 87:085cde657901 2020 * @brief Write an amount of data in no-blocking mode with DMA to a specific memory address
mbed_official 226:b062af740e40 2021 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2022 * the configuration information for I2C module
mbed_official 87:085cde657901 2023 * @param DevAddress: Target device address
mbed_official 87:085cde657901 2024 * @param MemAddress: Internal memory address
mbed_official 87:085cde657901 2025 * @param MemAddSize: Size of internal memory address
mbed_official 87:085cde657901 2026 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 2027 * @param Size: Amount of data to be sent
mbed_official 87:085cde657901 2028 * @retval HAL status
mbed_official 87:085cde657901 2029 */
mbed_official 87:085cde657901 2030 HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
mbed_official 87:085cde657901 2031 {
mbed_official 87:085cde657901 2032 /* Check the parameters */
mbed_official 87:085cde657901 2033 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
mbed_official 87:085cde657901 2034
mbed_official 87:085cde657901 2035 if(hi2c->State == HAL_I2C_STATE_READY)
mbed_official 87:085cde657901 2036 {
mbed_official 87:085cde657901 2037 if((pData == NULL) || (Size == 0))
mbed_official 87:085cde657901 2038 {
mbed_official 87:085cde657901 2039 return HAL_ERROR;
mbed_official 87:085cde657901 2040 }
mbed_official 87:085cde657901 2041
mbed_official 87:085cde657901 2042 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
mbed_official 87:085cde657901 2043 {
mbed_official 87:085cde657901 2044 return HAL_BUSY;
mbed_official 87:085cde657901 2045 }
mbed_official 87:085cde657901 2046
mbed_official 87:085cde657901 2047 /* Process Locked */
mbed_official 87:085cde657901 2048 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 2049
mbed_official 87:085cde657901 2050 hi2c->State = HAL_I2C_STATE_MEM_BUSY_TX;
mbed_official 87:085cde657901 2051 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
mbed_official 87:085cde657901 2052
mbed_official 87:085cde657901 2053 hi2c->pBuffPtr = pData;
mbed_official 87:085cde657901 2054 hi2c->XferSize = Size;
mbed_official 87:085cde657901 2055 hi2c->XferCount = Size;
mbed_official 87:085cde657901 2056
mbed_official 87:085cde657901 2057 /* Set the I2C DMA transfert complete callback */
mbed_official 87:085cde657901 2058 hi2c->hdmatx->XferCpltCallback = I2C_DMAMemTransmitCplt;
mbed_official 87:085cde657901 2059
mbed_official 87:085cde657901 2060 /* Set the DMA error callback */
mbed_official 87:085cde657901 2061 hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
mbed_official 87:085cde657901 2062
mbed_official 87:085cde657901 2063 /* Enable the DMA Stream */
mbed_official 87:085cde657901 2064 HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->DR, Size);
mbed_official 87:085cde657901 2065
mbed_official 87:085cde657901 2066 /* Send Slave Address and Memory Address */
mbed_official 87:085cde657901 2067 if(I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 2068 {
mbed_official 87:085cde657901 2069 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 2070 {
mbed_official 87:085cde657901 2071 /* Process Unlocked */
mbed_official 87:085cde657901 2072 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2073 return HAL_ERROR;
mbed_official 87:085cde657901 2074 }
mbed_official 87:085cde657901 2075 else
mbed_official 87:085cde657901 2076 {
mbed_official 87:085cde657901 2077 /* Process Unlocked */
mbed_official 87:085cde657901 2078 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2079 return HAL_TIMEOUT;
mbed_official 87:085cde657901 2080 }
mbed_official 87:085cde657901 2081 }
mbed_official 87:085cde657901 2082
mbed_official 87:085cde657901 2083 /* Enable DMA Request */
mbed_official 87:085cde657901 2084 hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
mbed_official 87:085cde657901 2085
mbed_official 87:085cde657901 2086 /* Process Unlocked */
mbed_official 87:085cde657901 2087 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2088
mbed_official 87:085cde657901 2089 return HAL_OK;
mbed_official 87:085cde657901 2090 }
mbed_official 87:085cde657901 2091 else
mbed_official 87:085cde657901 2092 {
mbed_official 87:085cde657901 2093 return HAL_BUSY;
mbed_official 87:085cde657901 2094 }
mbed_official 87:085cde657901 2095 }
mbed_official 87:085cde657901 2096
mbed_official 87:085cde657901 2097 /**
mbed_official 87:085cde657901 2098 * @brief Reads an amount of data in no-blocking mode with DMA from a specific memory address.
mbed_official 226:b062af740e40 2099 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2100 * the configuration information for I2C module
mbed_official 87:085cde657901 2101 * @param DevAddress: Target device address
mbed_official 87:085cde657901 2102 * @param MemAddress: Internal memory address
mbed_official 87:085cde657901 2103 * @param MemAddSize: Size of internal memory address
mbed_official 87:085cde657901 2104 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 2105 * @param Size: Amount of data to be read
mbed_official 87:085cde657901 2106 * @retval HAL status
mbed_official 87:085cde657901 2107 */
mbed_official 87:085cde657901 2108 HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
mbed_official 87:085cde657901 2109 {
mbed_official 87:085cde657901 2110 /* Check the parameters */
mbed_official 87:085cde657901 2111 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
mbed_official 87:085cde657901 2112
mbed_official 87:085cde657901 2113 if(hi2c->State == HAL_I2C_STATE_READY)
mbed_official 87:085cde657901 2114 {
mbed_official 87:085cde657901 2115 if((pData == NULL) || (Size == 0))
mbed_official 87:085cde657901 2116 {
mbed_official 87:085cde657901 2117 return HAL_ERROR;
mbed_official 87:085cde657901 2118 }
mbed_official 87:085cde657901 2119
mbed_official 87:085cde657901 2120 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
mbed_official 87:085cde657901 2121 {
mbed_official 87:085cde657901 2122 return HAL_BUSY;
mbed_official 87:085cde657901 2123 }
mbed_official 87:085cde657901 2124
mbed_official 87:085cde657901 2125 /* Process Locked */
mbed_official 87:085cde657901 2126 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 2127
mbed_official 87:085cde657901 2128 hi2c->State = HAL_I2C_STATE_MEM_BUSY_RX;
mbed_official 87:085cde657901 2129 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
mbed_official 87:085cde657901 2130
mbed_official 87:085cde657901 2131 hi2c->pBuffPtr = pData;
mbed_official 87:085cde657901 2132 hi2c->XferSize = Size;
mbed_official 87:085cde657901 2133 hi2c->XferCount = Size;
mbed_official 87:085cde657901 2134
mbed_official 87:085cde657901 2135 /* Set the I2C DMA transfert complete callback */
mbed_official 87:085cde657901 2136 hi2c->hdmarx->XferCpltCallback = I2C_DMAMemReceiveCplt;
mbed_official 87:085cde657901 2137
mbed_official 87:085cde657901 2138 /* Set the DMA error callback */
mbed_official 87:085cde657901 2139 hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
mbed_official 87:085cde657901 2140
mbed_official 87:085cde657901 2141 /* Enable the DMA Stream */
mbed_official 87:085cde657901 2142 HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)pData, Size);
mbed_official 87:085cde657901 2143
mbed_official 87:085cde657901 2144 /* Send Slave Address and Memory Address */
mbed_official 87:085cde657901 2145 if(I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 2146 {
mbed_official 87:085cde657901 2147 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 2148 {
mbed_official 87:085cde657901 2149 /* Process Unlocked */
mbed_official 87:085cde657901 2150 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2151 return HAL_ERROR;
mbed_official 87:085cde657901 2152 }
mbed_official 87:085cde657901 2153 else
mbed_official 87:085cde657901 2154 {
mbed_official 87:085cde657901 2155 /* Process Unlocked */
mbed_official 87:085cde657901 2156 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2157 return HAL_TIMEOUT;
mbed_official 87:085cde657901 2158 }
mbed_official 87:085cde657901 2159 }
mbed_official 87:085cde657901 2160
mbed_official 87:085cde657901 2161 if(Size == 1)
mbed_official 87:085cde657901 2162 {
mbed_official 87:085cde657901 2163 /* Disable Acknowledge */
mbed_official 87:085cde657901 2164 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 2165 }
mbed_official 87:085cde657901 2166 else
mbed_official 87:085cde657901 2167 {
mbed_official 87:085cde657901 2168 /* Enable Last DMA bit */
mbed_official 87:085cde657901 2169 hi2c->Instance->CR2 |= I2C_CR2_LAST;
mbed_official 87:085cde657901 2170 }
mbed_official 87:085cde657901 2171
mbed_official 87:085cde657901 2172 /* Enable DMA Request */
mbed_official 87:085cde657901 2173 hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
mbed_official 87:085cde657901 2174
mbed_official 87:085cde657901 2175 /* Clear ADDR flag */
mbed_official 87:085cde657901 2176 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 2177
mbed_official 87:085cde657901 2178 /* Process Unlocked */
mbed_official 87:085cde657901 2179 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2180
mbed_official 87:085cde657901 2181 return HAL_OK;
mbed_official 87:085cde657901 2182 }
mbed_official 87:085cde657901 2183 else
mbed_official 87:085cde657901 2184 {
mbed_official 87:085cde657901 2185 return HAL_BUSY;
mbed_official 87:085cde657901 2186 }
mbed_official 87:085cde657901 2187 }
mbed_official 87:085cde657901 2188
mbed_official 87:085cde657901 2189 /**
mbed_official 87:085cde657901 2190 * @brief Checks if target device is ready for communication.
mbed_official 87:085cde657901 2191 * @note This function is used with Memory devices
mbed_official 226:b062af740e40 2192 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2193 * the configuration information for I2C module
mbed_official 87:085cde657901 2194 * @param DevAddress: Target device address
mbed_official 87:085cde657901 2195 * @param Trials: Number of trials
mbed_official 87:085cde657901 2196 * @param Timeout: Timeout duration
mbed_official 87:085cde657901 2197 * @retval HAL status
mbed_official 87:085cde657901 2198 */
mbed_official 87:085cde657901 2199 HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout)
mbed_official 87:085cde657901 2200 {
mbed_official 87:085cde657901 2201 uint32_t timeout = 0, tmp1 = 0, tmp2 = 0, tmp3 = 0, I2C_Trials = 1;
mbed_official 87:085cde657901 2202
mbed_official 87:085cde657901 2203 if(hi2c->State == HAL_I2C_STATE_READY)
mbed_official 87:085cde657901 2204 {
mbed_official 87:085cde657901 2205 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
mbed_official 87:085cde657901 2206 {
mbed_official 87:085cde657901 2207 return HAL_BUSY;
mbed_official 87:085cde657901 2208 }
mbed_official 87:085cde657901 2209
mbed_official 87:085cde657901 2210 /* Process Locked */
mbed_official 87:085cde657901 2211 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 2212
mbed_official 87:085cde657901 2213 hi2c->State = HAL_I2C_STATE_BUSY;
mbed_official 87:085cde657901 2214 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
mbed_official 87:085cde657901 2215
mbed_official 87:085cde657901 2216 do
mbed_official 87:085cde657901 2217 {
mbed_official 87:085cde657901 2218 /* Generate Start */
mbed_official 87:085cde657901 2219 hi2c->Instance->CR1 |= I2C_CR1_START;
mbed_official 87:085cde657901 2220
mbed_official 87:085cde657901 2221 /* Wait until SB flag is set */
mbed_official 87:085cde657901 2222 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 2223 {
mbed_official 87:085cde657901 2224 return HAL_TIMEOUT;
mbed_official 87:085cde657901 2225 }
mbed_official 87:085cde657901 2226
mbed_official 87:085cde657901 2227 /* Send slave address */
mbed_official 87:085cde657901 2228 hi2c->Instance->DR = __HAL_I2C_7BIT_ADD_WRITE(DevAddress);
mbed_official 87:085cde657901 2229
mbed_official 87:085cde657901 2230 /* Wait until ADDR or AF flag are set */
mbed_official 87:085cde657901 2231 timeout = HAL_GetTick() + Timeout;
mbed_official 87:085cde657901 2232
mbed_official 87:085cde657901 2233 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR);
mbed_official 87:085cde657901 2234 tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF);
mbed_official 87:085cde657901 2235 tmp3 = hi2c->State;
mbed_official 87:085cde657901 2236 while((tmp1 == RESET) && (tmp2 == RESET) && (tmp3 != HAL_I2C_STATE_TIMEOUT))
mbed_official 87:085cde657901 2237 {
mbed_official 87:085cde657901 2238 if(HAL_GetTick() >= timeout)
mbed_official 87:085cde657901 2239 {
mbed_official 87:085cde657901 2240 hi2c->State = HAL_I2C_STATE_TIMEOUT;
mbed_official 87:085cde657901 2241 }
mbed_official 87:085cde657901 2242 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR);
mbed_official 87:085cde657901 2243 tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF);
mbed_official 87:085cde657901 2244 tmp3 = hi2c->State;
mbed_official 87:085cde657901 2245 }
mbed_official 87:085cde657901 2246
mbed_official 87:085cde657901 2247 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 2248
mbed_official 87:085cde657901 2249 /* Check if the ADDR flag has been set */
mbed_official 87:085cde657901 2250 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR) == SET)
mbed_official 87:085cde657901 2251 {
mbed_official 87:085cde657901 2252 /* Generate Stop */
mbed_official 87:085cde657901 2253 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 2254
mbed_official 87:085cde657901 2255 /* Clear ADDR Flag */
mbed_official 87:085cde657901 2256 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 2257
mbed_official 87:085cde657901 2258 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 2259 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 2260 {
mbed_official 87:085cde657901 2261 return HAL_TIMEOUT;
mbed_official 87:085cde657901 2262 }
mbed_official 87:085cde657901 2263
mbed_official 87:085cde657901 2264 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 2265
mbed_official 87:085cde657901 2266 /* Process Unlocked */
mbed_official 87:085cde657901 2267 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2268
mbed_official 87:085cde657901 2269 return HAL_OK;
mbed_official 87:085cde657901 2270 }
mbed_official 87:085cde657901 2271 else
mbed_official 87:085cde657901 2272 {
mbed_official 87:085cde657901 2273 /* Generate Stop */
mbed_official 87:085cde657901 2274 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 2275
mbed_official 87:085cde657901 2276 /* Clear AF Flag */
mbed_official 87:085cde657901 2277 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
mbed_official 87:085cde657901 2278
mbed_official 87:085cde657901 2279 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 2280 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 2281 {
mbed_official 87:085cde657901 2282 return HAL_TIMEOUT;
mbed_official 87:085cde657901 2283 }
mbed_official 87:085cde657901 2284 }
mbed_official 87:085cde657901 2285 }while(I2C_Trials++ < Trials);
mbed_official 87:085cde657901 2286
mbed_official 87:085cde657901 2287 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 2288
mbed_official 87:085cde657901 2289 /* Process Unlocked */
mbed_official 87:085cde657901 2290 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2291
mbed_official 87:085cde657901 2292 return HAL_ERROR;
mbed_official 87:085cde657901 2293 }
mbed_official 87:085cde657901 2294 else
mbed_official 87:085cde657901 2295 {
mbed_official 87:085cde657901 2296 return HAL_BUSY;
mbed_official 87:085cde657901 2297 }
mbed_official 87:085cde657901 2298 }
mbed_official 87:085cde657901 2299
mbed_official 87:085cde657901 2300 /**
mbed_official 87:085cde657901 2301 * @brief This function handles I2C event interrupt request.
mbed_official 226:b062af740e40 2302 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2303 * the configuration information for I2C module
mbed_official 87:085cde657901 2304 * @retval HAL status
mbed_official 87:085cde657901 2305 */
mbed_official 87:085cde657901 2306 void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2307 {
mbed_official 87:085cde657901 2308 uint32_t tmp1 = 0, tmp2 = 0, tmp3 = 0, tmp4 = 0;
mbed_official 87:085cde657901 2309 /* Master mode selected */
mbed_official 87:085cde657901 2310 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_MSL) == SET)
mbed_official 87:085cde657901 2311 {
mbed_official 87:085cde657901 2312 /* I2C in mode Transmitter -----------------------------------------------*/
mbed_official 87:085cde657901 2313 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TRA) == SET)
mbed_official 87:085cde657901 2314 {
mbed_official 87:085cde657901 2315 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE);
mbed_official 87:085cde657901 2316 tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_BUF);
mbed_official 87:085cde657901 2317 tmp3 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF);
mbed_official 87:085cde657901 2318 tmp4 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_EVT);
mbed_official 87:085cde657901 2319 /* TXE set and BTF reset -----------------------------------------------*/
mbed_official 87:085cde657901 2320 if((tmp1 == SET) && (tmp2 == SET) && (tmp3 == RESET))
mbed_official 87:085cde657901 2321 {
mbed_official 87:085cde657901 2322 I2C_MasterTransmit_TXE(hi2c);
mbed_official 87:085cde657901 2323 }
mbed_official 87:085cde657901 2324 /* BTF set -------------------------------------------------------------*/
mbed_official 87:085cde657901 2325 else if((tmp3 == SET) && (tmp4 == SET))
mbed_official 87:085cde657901 2326 {
mbed_official 87:085cde657901 2327 I2C_MasterTransmit_BTF(hi2c);
mbed_official 87:085cde657901 2328 }
mbed_official 87:085cde657901 2329 }
mbed_official 87:085cde657901 2330 /* I2C in mode Receiver --------------------------------------------------*/
mbed_official 87:085cde657901 2331 else
mbed_official 87:085cde657901 2332 {
mbed_official 87:085cde657901 2333 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE);
mbed_official 87:085cde657901 2334 tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_BUF);
mbed_official 87:085cde657901 2335 tmp3 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF);
mbed_official 87:085cde657901 2336 tmp4 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_EVT);
mbed_official 87:085cde657901 2337 /* RXNE set and BTF reset -----------------------------------------------*/
mbed_official 87:085cde657901 2338 if((tmp1 == SET) && (tmp2 == SET) && (tmp3 == RESET))
mbed_official 87:085cde657901 2339 {
mbed_official 87:085cde657901 2340 I2C_MasterReceive_RXNE(hi2c);
mbed_official 87:085cde657901 2341 }
mbed_official 87:085cde657901 2342 /* BTF set -------------------------------------------------------------*/
mbed_official 87:085cde657901 2343 else if((tmp3 == SET) && (tmp4 == SET))
mbed_official 87:085cde657901 2344 {
mbed_official 87:085cde657901 2345 I2C_MasterReceive_BTF(hi2c);
mbed_official 87:085cde657901 2346 }
mbed_official 87:085cde657901 2347 }
mbed_official 87:085cde657901 2348 }
mbed_official 87:085cde657901 2349 /* Slave mode selected */
mbed_official 87:085cde657901 2350 else
mbed_official 87:085cde657901 2351 {
mbed_official 87:085cde657901 2352 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR);
mbed_official 87:085cde657901 2353 tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, (I2C_IT_EVT));
mbed_official 87:085cde657901 2354 tmp3 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF);
mbed_official 87:085cde657901 2355 tmp4 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TRA);
mbed_official 87:085cde657901 2356 /* ADDR set --------------------------------------------------------------*/
mbed_official 87:085cde657901 2357 if((tmp1 == SET) && (tmp2 == SET))
mbed_official 87:085cde657901 2358 {
mbed_official 87:085cde657901 2359 I2C_Slave_ADDR(hi2c);
mbed_official 87:085cde657901 2360 }
mbed_official 87:085cde657901 2361 /* STOPF set --------------------------------------------------------------*/
mbed_official 87:085cde657901 2362 else if((tmp3 == SET) && (tmp2 == SET))
mbed_official 87:085cde657901 2363 {
mbed_official 87:085cde657901 2364 I2C_Slave_STOPF(hi2c);
mbed_official 87:085cde657901 2365 }
mbed_official 87:085cde657901 2366 /* I2C in mode Transmitter -----------------------------------------------*/
mbed_official 87:085cde657901 2367 else if(tmp4 == SET)
mbed_official 87:085cde657901 2368 {
mbed_official 87:085cde657901 2369 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE);
mbed_official 87:085cde657901 2370 tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_BUF);
mbed_official 87:085cde657901 2371 tmp3 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF);
mbed_official 87:085cde657901 2372 tmp4 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_EVT);
mbed_official 87:085cde657901 2373 /* TXE set and BTF reset -----------------------------------------------*/
mbed_official 87:085cde657901 2374 if((tmp1 == SET) && (tmp2 == SET) && (tmp3 == RESET))
mbed_official 87:085cde657901 2375 {
mbed_official 87:085cde657901 2376 I2C_SlaveTransmit_TXE(hi2c);
mbed_official 87:085cde657901 2377 }
mbed_official 87:085cde657901 2378 /* BTF set -------------------------------------------------------------*/
mbed_official 87:085cde657901 2379 else if((tmp3 == SET) && (tmp4 == SET))
mbed_official 87:085cde657901 2380 {
mbed_official 87:085cde657901 2381 I2C_SlaveTransmit_BTF(hi2c);
mbed_official 87:085cde657901 2382 }
mbed_official 87:085cde657901 2383 }
mbed_official 87:085cde657901 2384 /* I2C in mode Receiver --------------------------------------------------*/
mbed_official 87:085cde657901 2385 else
mbed_official 87:085cde657901 2386 {
mbed_official 87:085cde657901 2387 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE);
mbed_official 87:085cde657901 2388 tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_BUF);
mbed_official 87:085cde657901 2389 tmp3 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF);
mbed_official 87:085cde657901 2390 tmp4 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_EVT);
mbed_official 87:085cde657901 2391 /* RXNE set and BTF reset ----------------------------------------------*/
mbed_official 87:085cde657901 2392 if((tmp1 == SET) && (tmp2 == SET) && (tmp3 == RESET))
mbed_official 87:085cde657901 2393 {
mbed_official 87:085cde657901 2394 I2C_SlaveReceive_RXNE(hi2c);
mbed_official 87:085cde657901 2395 }
mbed_official 87:085cde657901 2396 /* BTF set -------------------------------------------------------------*/
mbed_official 87:085cde657901 2397 else if((tmp3 == SET) && (tmp4 == SET))
mbed_official 87:085cde657901 2398 {
mbed_official 87:085cde657901 2399 I2C_SlaveReceive_BTF(hi2c);
mbed_official 87:085cde657901 2400 }
mbed_official 87:085cde657901 2401 }
mbed_official 87:085cde657901 2402 }
mbed_official 87:085cde657901 2403 }
mbed_official 87:085cde657901 2404
mbed_official 87:085cde657901 2405 /**
mbed_official 87:085cde657901 2406 * @brief This function handles I2C error interrupt request.
mbed_official 226:b062af740e40 2407 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2408 * the configuration information for I2C module
mbed_official 87:085cde657901 2409 * @retval HAL status
mbed_official 87:085cde657901 2410 */
mbed_official 87:085cde657901 2411 void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2412 {
mbed_official 87:085cde657901 2413 uint32_t tmp1 = 0, tmp2 = 0, tmp3 = 0;
mbed_official 87:085cde657901 2414
mbed_official 87:085cde657901 2415 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BERR);
mbed_official 87:085cde657901 2416 tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_ERR);
mbed_official 87:085cde657901 2417 /* I2C Bus error interrupt occurred ----------------------------------------*/
mbed_official 87:085cde657901 2418 if((tmp1 == SET) && (tmp2 == SET))
mbed_official 87:085cde657901 2419 {
mbed_official 87:085cde657901 2420 hi2c->ErrorCode |= HAL_I2C_ERROR_BERR;
mbed_official 87:085cde657901 2421
mbed_official 87:085cde657901 2422 /* Clear BERR flag */
mbed_official 87:085cde657901 2423 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_BERR);
mbed_official 87:085cde657901 2424 }
mbed_official 87:085cde657901 2425
mbed_official 87:085cde657901 2426 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ARLO);
mbed_official 87:085cde657901 2427 tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_ERR);
mbed_official 87:085cde657901 2428 /* I2C Arbitration Loss error interrupt occurred ---------------------------*/
mbed_official 87:085cde657901 2429 if((tmp1 == SET) && (tmp2 == SET))
mbed_official 87:085cde657901 2430 {
mbed_official 87:085cde657901 2431 hi2c->ErrorCode |= HAL_I2C_ERROR_ARLO;
mbed_official 87:085cde657901 2432
mbed_official 87:085cde657901 2433 /* Clear ARLO flag */
mbed_official 87:085cde657901 2434 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ARLO);
mbed_official 87:085cde657901 2435 }
mbed_official 87:085cde657901 2436
mbed_official 87:085cde657901 2437 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF);
mbed_official 87:085cde657901 2438 tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_ERR);
mbed_official 87:085cde657901 2439 /* I2C Acknowledge failure error interrupt occurred ------------------------*/
mbed_official 87:085cde657901 2440 if((tmp1 == SET) && (tmp2 == SET))
mbed_official 87:085cde657901 2441 {
mbed_official 87:085cde657901 2442 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_MSL);
mbed_official 87:085cde657901 2443 tmp2 = hi2c->XferCount;
mbed_official 87:085cde657901 2444 tmp3 = hi2c->State;
mbed_official 87:085cde657901 2445 if((tmp1 == RESET) && (tmp2 == 0) && (tmp3 == HAL_I2C_STATE_BUSY_TX))
mbed_official 87:085cde657901 2446 {
mbed_official 87:085cde657901 2447 I2C_Slave_AF(hi2c);
mbed_official 87:085cde657901 2448 }
mbed_official 87:085cde657901 2449 else
mbed_official 87:085cde657901 2450 {
mbed_official 87:085cde657901 2451 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
mbed_official 87:085cde657901 2452 /* Clear AF flag */
mbed_official 87:085cde657901 2453 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
mbed_official 87:085cde657901 2454 }
mbed_official 87:085cde657901 2455 }
mbed_official 87:085cde657901 2456
mbed_official 87:085cde657901 2457 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_OVR);
mbed_official 87:085cde657901 2458 tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_ERR);
mbed_official 87:085cde657901 2459 /* I2C Over-Run/Under-Run interrupt occurred -------------------------------*/
mbed_official 87:085cde657901 2460 if((tmp1 == SET) && (tmp2 == SET))
mbed_official 87:085cde657901 2461 {
mbed_official 87:085cde657901 2462 hi2c->ErrorCode |= HAL_I2C_ERROR_OVR;
mbed_official 87:085cde657901 2463 /* Clear OVR flag */
mbed_official 87:085cde657901 2464 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_OVR);
mbed_official 87:085cde657901 2465 }
mbed_official 87:085cde657901 2466
mbed_official 87:085cde657901 2467 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
mbed_official 87:085cde657901 2468 {
mbed_official 87:085cde657901 2469 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 2470
mbed_official 87:085cde657901 2471 HAL_I2C_ErrorCallback(hi2c);
mbed_official 87:085cde657901 2472 }
mbed_official 87:085cde657901 2473 }
mbed_official 87:085cde657901 2474
mbed_official 87:085cde657901 2475 /**
mbed_official 87:085cde657901 2476 * @brief Master Tx Transfer completed callbacks.
mbed_official 226:b062af740e40 2477 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2478 * the configuration information for I2C module
mbed_official 87:085cde657901 2479 * @retval None
mbed_official 87:085cde657901 2480 */
mbed_official 87:085cde657901 2481 __weak void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2482 {
mbed_official 87:085cde657901 2483 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 2484 the HAL_I2C_TxCpltCallback could be implemented in the user file
mbed_official 87:085cde657901 2485 */
mbed_official 87:085cde657901 2486 }
mbed_official 87:085cde657901 2487
mbed_official 87:085cde657901 2488 /**
mbed_official 87:085cde657901 2489 * @brief Master Rx Transfer completed callbacks.
mbed_official 226:b062af740e40 2490 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2491 * the configuration information for I2C module
mbed_official 87:085cde657901 2492 * @retval None
mbed_official 87:085cde657901 2493 */
mbed_official 87:085cde657901 2494 __weak void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2495 {
mbed_official 87:085cde657901 2496 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 2497 the HAL_I2C_TxCpltCallback could be implemented in the user file
mbed_official 87:085cde657901 2498 */
mbed_official 87:085cde657901 2499 }
mbed_official 87:085cde657901 2500
mbed_official 87:085cde657901 2501 /** @brief Slave Tx Transfer completed callbacks.
mbed_official 226:b062af740e40 2502 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2503 * the configuration information for I2C module
mbed_official 87:085cde657901 2504 * @retval None
mbed_official 87:085cde657901 2505 */
mbed_official 87:085cde657901 2506 __weak void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2507 {
mbed_official 87:085cde657901 2508 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 2509 the HAL_I2C_TxCpltCallback could be implemented in the user file
mbed_official 87:085cde657901 2510 */
mbed_official 87:085cde657901 2511 }
mbed_official 87:085cde657901 2512
mbed_official 87:085cde657901 2513 /**
mbed_official 87:085cde657901 2514 * @brief Slave Rx Transfer completed callbacks.
mbed_official 226:b062af740e40 2515 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2516 * the configuration information for I2C module
mbed_official 87:085cde657901 2517 * @retval None
mbed_official 87:085cde657901 2518 */
mbed_official 87:085cde657901 2519 __weak void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2520 {
mbed_official 87:085cde657901 2521 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 2522 the HAL_I2C_TxCpltCallback could be implemented in the user file
mbed_official 87:085cde657901 2523 */
mbed_official 87:085cde657901 2524 }
mbed_official 87:085cde657901 2525
mbed_official 87:085cde657901 2526 /**
mbed_official 87:085cde657901 2527 * @brief Memory Tx Transfer completed callbacks.
mbed_official 226:b062af740e40 2528 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2529 * the configuration information for I2C module
mbed_official 87:085cde657901 2530 * @retval None
mbed_official 87:085cde657901 2531 */
mbed_official 87:085cde657901 2532 __weak void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2533 {
mbed_official 87:085cde657901 2534 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 2535 the HAL_I2C_TxCpltCallback could be implemented in the user file
mbed_official 87:085cde657901 2536 */
mbed_official 87:085cde657901 2537 }
mbed_official 87:085cde657901 2538
mbed_official 87:085cde657901 2539 /**
mbed_official 87:085cde657901 2540 * @brief Memory Rx Transfer completed callbacks.
mbed_official 226:b062af740e40 2541 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2542 * the configuration information for I2C module
mbed_official 87:085cde657901 2543 * @retval None
mbed_official 87:085cde657901 2544 */
mbed_official 87:085cde657901 2545 __weak void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2546 {
mbed_official 87:085cde657901 2547 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 2548 the HAL_I2C_TxCpltCallback could be implemented in the user file
mbed_official 87:085cde657901 2549 */
mbed_official 87:085cde657901 2550 }
mbed_official 87:085cde657901 2551
mbed_official 87:085cde657901 2552 /**
mbed_official 87:085cde657901 2553 * @brief I2C error callbacks.
mbed_official 226:b062af740e40 2554 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2555 * the configuration information for I2C module
mbed_official 87:085cde657901 2556 * @retval None
mbed_official 87:085cde657901 2557 */
mbed_official 87:085cde657901 2558 __weak void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2559 {
mbed_official 87:085cde657901 2560 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 2561 the HAL_I2C_ErrorCallback could be implemented in the user file
mbed_official 87:085cde657901 2562 */
mbed_official 87:085cde657901 2563 }
mbed_official 87:085cde657901 2564
mbed_official 87:085cde657901 2565 /**
mbed_official 87:085cde657901 2566 * @}
mbed_official 87:085cde657901 2567 */
mbed_official 87:085cde657901 2568
mbed_official 87:085cde657901 2569 /** @defgroup I2C_Group3 Peripheral State and Errors functions
mbed_official 87:085cde657901 2570 * @brief Peripheral State and Errors functions
mbed_official 87:085cde657901 2571 *
mbed_official 87:085cde657901 2572 @verbatim
mbed_official 87:085cde657901 2573 ===============================================================================
mbed_official 87:085cde657901 2574 ##### Peripheral State and Errors functions #####
mbed_official 87:085cde657901 2575 ===============================================================================
mbed_official 87:085cde657901 2576 [..]
mbed_official 226:b062af740e40 2577 This subsection permits to get in run-time the status of the peripheral
mbed_official 87:085cde657901 2578 and the data flow.
mbed_official 87:085cde657901 2579
mbed_official 87:085cde657901 2580 @endverbatim
mbed_official 87:085cde657901 2581 * @{
mbed_official 87:085cde657901 2582 */
mbed_official 87:085cde657901 2583
mbed_official 87:085cde657901 2584 /**
mbed_official 87:085cde657901 2585 * @brief Returns the I2C state.
mbed_official 226:b062af740e40 2586 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2587 * the configuration information for I2C module
mbed_official 87:085cde657901 2588 * @retval HAL state
mbed_official 87:085cde657901 2589 */
mbed_official 87:085cde657901 2590 HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2591 {
mbed_official 87:085cde657901 2592 return hi2c->State;
mbed_official 87:085cde657901 2593 }
mbed_official 87:085cde657901 2594
mbed_official 87:085cde657901 2595 /**
mbed_official 87:085cde657901 2596 * @brief Return the I2C error code
mbed_official 87:085cde657901 2597 * @param hi2c : pointer to a I2C_HandleTypeDef structure that contains
mbed_official 87:085cde657901 2598 * the configuration information for the specified I2C.
mbed_official 87:085cde657901 2599 * @retval I2C Error Code
mbed_official 87:085cde657901 2600 */
mbed_official 87:085cde657901 2601 uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2602 {
mbed_official 87:085cde657901 2603 return hi2c->ErrorCode;
mbed_official 87:085cde657901 2604 }
mbed_official 87:085cde657901 2605
mbed_official 87:085cde657901 2606 /**
mbed_official 87:085cde657901 2607 * @}
mbed_official 87:085cde657901 2608 */
mbed_official 87:085cde657901 2609
mbed_official 87:085cde657901 2610 /**
mbed_official 87:085cde657901 2611 * @brief Handle TXE flag for Master
mbed_official 226:b062af740e40 2612 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2613 * the configuration information for I2C module
mbed_official 87:085cde657901 2614 * @retval HAL status
mbed_official 87:085cde657901 2615 */
mbed_official 87:085cde657901 2616 static HAL_StatusTypeDef I2C_MasterTransmit_TXE(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2617 {
mbed_official 87:085cde657901 2618 /* Process Locked */
mbed_official 87:085cde657901 2619 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 2620
mbed_official 87:085cde657901 2621 /* Write data to DR */
mbed_official 87:085cde657901 2622 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
mbed_official 87:085cde657901 2623 hi2c->XferCount--;
mbed_official 87:085cde657901 2624
mbed_official 87:085cde657901 2625 if(hi2c->XferCount == 0)
mbed_official 87:085cde657901 2626 {
mbed_official 87:085cde657901 2627 /* Disable BUF interrupt */
mbed_official 87:085cde657901 2628 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
mbed_official 87:085cde657901 2629 }
mbed_official 87:085cde657901 2630
mbed_official 87:085cde657901 2631 /* Process Unlocked */
mbed_official 87:085cde657901 2632 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2633
mbed_official 87:085cde657901 2634 return HAL_OK;
mbed_official 87:085cde657901 2635 }
mbed_official 87:085cde657901 2636
mbed_official 87:085cde657901 2637 /**
mbed_official 87:085cde657901 2638 * @brief Handle BTF flag for Master transmitter
mbed_official 226:b062af740e40 2639 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2640 * the configuration information for I2C module
mbed_official 87:085cde657901 2641 * @retval HAL status
mbed_official 87:085cde657901 2642 */
mbed_official 87:085cde657901 2643 static HAL_StatusTypeDef I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2644 {
mbed_official 87:085cde657901 2645 /* Process Locked */
mbed_official 87:085cde657901 2646 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 2647
mbed_official 87:085cde657901 2648 if(hi2c->XferCount != 0)
mbed_official 87:085cde657901 2649 {
mbed_official 87:085cde657901 2650 /* Write data to DR */
mbed_official 87:085cde657901 2651 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
mbed_official 87:085cde657901 2652 hi2c->XferCount--;
mbed_official 87:085cde657901 2653
mbed_official 87:085cde657901 2654 /* Process Unlocked */
mbed_official 87:085cde657901 2655 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2656 }
mbed_official 87:085cde657901 2657 else
mbed_official 87:085cde657901 2658 {
mbed_official 87:085cde657901 2659 /* Disable EVT, BUF and ERR interrupt */
mbed_official 87:085cde657901 2660 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
mbed_official 87:085cde657901 2661
mbed_official 87:085cde657901 2662 /* Generate Stop */
mbed_official 87:085cde657901 2663 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 2664
mbed_official 87:085cde657901 2665 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 2666 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 2667 {
mbed_official 87:085cde657901 2668 return HAL_TIMEOUT;
mbed_official 87:085cde657901 2669 }
mbed_official 87:085cde657901 2670
mbed_official 87:085cde657901 2671 if(hi2c->State == HAL_I2C_STATE_MEM_BUSY_TX)
mbed_official 87:085cde657901 2672 {
mbed_official 87:085cde657901 2673 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 2674
mbed_official 87:085cde657901 2675 /* Process Unlocked */
mbed_official 87:085cde657901 2676 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2677
mbed_official 87:085cde657901 2678 HAL_I2C_MemTxCpltCallback(hi2c);
mbed_official 87:085cde657901 2679 }
mbed_official 87:085cde657901 2680 else
mbed_official 87:085cde657901 2681 {
mbed_official 87:085cde657901 2682 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 2683
mbed_official 87:085cde657901 2684 /* Process Unlocked */
mbed_official 87:085cde657901 2685 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2686
mbed_official 87:085cde657901 2687 HAL_I2C_MasterTxCpltCallback(hi2c);
mbed_official 87:085cde657901 2688 }
mbed_official 87:085cde657901 2689 }
mbed_official 87:085cde657901 2690 return HAL_OK;
mbed_official 87:085cde657901 2691 }
mbed_official 87:085cde657901 2692
mbed_official 87:085cde657901 2693 /**
mbed_official 87:085cde657901 2694 * @brief Handle RXNE flag for Master
mbed_official 226:b062af740e40 2695 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2696 * the configuration information for I2C module
mbed_official 87:085cde657901 2697 * @retval HAL status
mbed_official 87:085cde657901 2698 */
mbed_official 87:085cde657901 2699 static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2700 {
mbed_official 87:085cde657901 2701 uint32_t tmp = 0;
mbed_official 87:085cde657901 2702
mbed_official 87:085cde657901 2703 /* Process Locked */
mbed_official 87:085cde657901 2704 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 2705
mbed_official 87:085cde657901 2706 tmp = hi2c->XferCount;
mbed_official 87:085cde657901 2707 if(tmp > 3)
mbed_official 87:085cde657901 2708 {
mbed_official 87:085cde657901 2709 /* Read data from DR */
mbed_official 87:085cde657901 2710 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 2711 hi2c->XferCount--;
mbed_official 87:085cde657901 2712
mbed_official 87:085cde657901 2713 /* Process Unlocked */
mbed_official 87:085cde657901 2714 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2715 }
mbed_official 87:085cde657901 2716 else if((tmp == 2) || (tmp == 3))
mbed_official 87:085cde657901 2717 {
mbed_official 87:085cde657901 2718 /* Disable BUF interrupt */
mbed_official 87:085cde657901 2719 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
mbed_official 87:085cde657901 2720
mbed_official 87:085cde657901 2721 /* Process Unlocked */
mbed_official 87:085cde657901 2722 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2723 }
mbed_official 87:085cde657901 2724 else
mbed_official 87:085cde657901 2725 {
mbed_official 87:085cde657901 2726 /* Disable EVT, BUF and ERR interrupt */
mbed_official 87:085cde657901 2727 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
mbed_official 87:085cde657901 2728
mbed_official 87:085cde657901 2729 /* Read data from DR */
mbed_official 87:085cde657901 2730 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 2731 hi2c->XferCount--;
mbed_official 87:085cde657901 2732
mbed_official 87:085cde657901 2733 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 2734 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 2735 {
mbed_official 87:085cde657901 2736 return HAL_TIMEOUT;
mbed_official 87:085cde657901 2737 }
mbed_official 87:085cde657901 2738
mbed_official 87:085cde657901 2739 if(hi2c->State == HAL_I2C_STATE_MEM_BUSY_RX)
mbed_official 87:085cde657901 2740 {
mbed_official 87:085cde657901 2741 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 2742
mbed_official 87:085cde657901 2743 /* Process Unlocked */
mbed_official 87:085cde657901 2744 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2745
mbed_official 87:085cde657901 2746 HAL_I2C_MemRxCpltCallback(hi2c);
mbed_official 87:085cde657901 2747 }
mbed_official 87:085cde657901 2748 else
mbed_official 87:085cde657901 2749 {
mbed_official 87:085cde657901 2750 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 2751
mbed_official 87:085cde657901 2752 /* Process Unlocked */
mbed_official 87:085cde657901 2753 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2754
mbed_official 87:085cde657901 2755 HAL_I2C_MasterRxCpltCallback(hi2c);
mbed_official 87:085cde657901 2756 }
mbed_official 87:085cde657901 2757 }
mbed_official 87:085cde657901 2758 return HAL_OK;
mbed_official 87:085cde657901 2759 }
mbed_official 87:085cde657901 2760
mbed_official 87:085cde657901 2761 /**
mbed_official 87:085cde657901 2762 * @brief Handle BTF flag for Master receiver
mbed_official 226:b062af740e40 2763 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2764 * the configuration information for I2C module
mbed_official 87:085cde657901 2765 * @retval HAL status
mbed_official 87:085cde657901 2766 */
mbed_official 87:085cde657901 2767 static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2768 {
mbed_official 87:085cde657901 2769 /* Process Locked */
mbed_official 87:085cde657901 2770 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 2771
mbed_official 87:085cde657901 2772 if(hi2c->XferCount == 3)
mbed_official 87:085cde657901 2773 {
mbed_official 87:085cde657901 2774 /* Disable Acknowledge */
mbed_official 87:085cde657901 2775 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 2776
mbed_official 87:085cde657901 2777 /* Read data from DR */
mbed_official 87:085cde657901 2778 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 2779 hi2c->XferCount--;
mbed_official 87:085cde657901 2780
mbed_official 87:085cde657901 2781 /* Process Unlocked */
mbed_official 87:085cde657901 2782 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2783 }
mbed_official 87:085cde657901 2784 else if(hi2c->XferCount == 2)
mbed_official 87:085cde657901 2785 {
mbed_official 87:085cde657901 2786 /* Generate Stop */
mbed_official 87:085cde657901 2787 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 2788
mbed_official 87:085cde657901 2789 /* Read data from DR */
mbed_official 87:085cde657901 2790 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 2791 hi2c->XferCount--;
mbed_official 87:085cde657901 2792
mbed_official 87:085cde657901 2793 /* Read data from DR */
mbed_official 87:085cde657901 2794 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 2795 hi2c->XferCount--;
mbed_official 87:085cde657901 2796
mbed_official 87:085cde657901 2797 /* Disable EVT and ERR interrupt */
mbed_official 87:085cde657901 2798 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
mbed_official 87:085cde657901 2799
mbed_official 87:085cde657901 2800 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 2801 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 2802 {
mbed_official 87:085cde657901 2803 return HAL_TIMEOUT;
mbed_official 87:085cde657901 2804 }
mbed_official 87:085cde657901 2805
mbed_official 87:085cde657901 2806 if(hi2c->State == HAL_I2C_STATE_MEM_BUSY_RX)
mbed_official 87:085cde657901 2807 {
mbed_official 87:085cde657901 2808 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 2809
mbed_official 87:085cde657901 2810 /* Process Unlocked */
mbed_official 87:085cde657901 2811 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2812
mbed_official 87:085cde657901 2813 HAL_I2C_MemRxCpltCallback(hi2c);
mbed_official 87:085cde657901 2814 }
mbed_official 87:085cde657901 2815 else
mbed_official 87:085cde657901 2816 {
mbed_official 87:085cde657901 2817 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 2818
mbed_official 87:085cde657901 2819 /* Process Unlocked */
mbed_official 87:085cde657901 2820 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2821
mbed_official 87:085cde657901 2822 HAL_I2C_MasterRxCpltCallback(hi2c);
mbed_official 87:085cde657901 2823 }
mbed_official 87:085cde657901 2824 }
mbed_official 87:085cde657901 2825 else
mbed_official 87:085cde657901 2826 {
mbed_official 87:085cde657901 2827 /* Read data from DR */
mbed_official 87:085cde657901 2828 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 2829 hi2c->XferCount--;
mbed_official 87:085cde657901 2830
mbed_official 87:085cde657901 2831 /* Process Unlocked */
mbed_official 87:085cde657901 2832 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2833 }
mbed_official 87:085cde657901 2834 return HAL_OK;
mbed_official 87:085cde657901 2835 }
mbed_official 87:085cde657901 2836
mbed_official 87:085cde657901 2837 /**
mbed_official 87:085cde657901 2838 * @brief Handle TXE flag for Slave
mbed_official 226:b062af740e40 2839 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2840 * the configuration information for I2C module
mbed_official 87:085cde657901 2841 * @retval HAL status
mbed_official 87:085cde657901 2842 */
mbed_official 87:085cde657901 2843 static HAL_StatusTypeDef I2C_SlaveTransmit_TXE(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2844 {
mbed_official 87:085cde657901 2845 /* Process Locked */
mbed_official 87:085cde657901 2846 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 2847
mbed_official 87:085cde657901 2848 if(hi2c->XferCount != 0)
mbed_official 87:085cde657901 2849 {
mbed_official 87:085cde657901 2850 /* Write data to DR */
mbed_official 87:085cde657901 2851 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
mbed_official 87:085cde657901 2852 hi2c->XferCount--;
mbed_official 87:085cde657901 2853 }
mbed_official 87:085cde657901 2854
mbed_official 87:085cde657901 2855 /* Process Unlocked */
mbed_official 87:085cde657901 2856 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2857 return HAL_OK;
mbed_official 87:085cde657901 2858 }
mbed_official 87:085cde657901 2859
mbed_official 87:085cde657901 2860 /**
mbed_official 87:085cde657901 2861 * @brief Handle BTF flag for Slave transmitter
mbed_official 226:b062af740e40 2862 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2863 * the configuration information for I2C module
mbed_official 87:085cde657901 2864 * @retval HAL status
mbed_official 87:085cde657901 2865 */
mbed_official 87:085cde657901 2866 static HAL_StatusTypeDef I2C_SlaveTransmit_BTF(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2867 {
mbed_official 87:085cde657901 2868 /* Process Locked */
mbed_official 87:085cde657901 2869 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 2870
mbed_official 87:085cde657901 2871 if(hi2c->XferCount != 0)
mbed_official 87:085cde657901 2872 {
mbed_official 87:085cde657901 2873 /* Write data to DR */
mbed_official 87:085cde657901 2874 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
mbed_official 87:085cde657901 2875 hi2c->XferCount--;
mbed_official 87:085cde657901 2876 }
mbed_official 87:085cde657901 2877
mbed_official 87:085cde657901 2878 /* Process Unlocked */
mbed_official 87:085cde657901 2879 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2880 return HAL_OK;
mbed_official 87:085cde657901 2881 }
mbed_official 87:085cde657901 2882
mbed_official 87:085cde657901 2883 /**
mbed_official 87:085cde657901 2884 * @brief Handle RXNE flag for Slave
mbed_official 226:b062af740e40 2885 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2886 * the configuration information for I2C module
mbed_official 87:085cde657901 2887 * @retval HAL status
mbed_official 87:085cde657901 2888 */
mbed_official 87:085cde657901 2889 static HAL_StatusTypeDef I2C_SlaveReceive_RXNE(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2890 {
mbed_official 87:085cde657901 2891 /* Process Locked */
mbed_official 87:085cde657901 2892 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 2893
mbed_official 87:085cde657901 2894 if(hi2c->XferCount != 0)
mbed_official 87:085cde657901 2895 {
mbed_official 87:085cde657901 2896 /* Read data from DR */
mbed_official 87:085cde657901 2897 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 2898 hi2c->XferCount--;
mbed_official 87:085cde657901 2899 }
mbed_official 87:085cde657901 2900
mbed_official 87:085cde657901 2901 /* Process Unlocked */
mbed_official 87:085cde657901 2902 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2903 return HAL_OK;
mbed_official 87:085cde657901 2904 }
mbed_official 87:085cde657901 2905
mbed_official 87:085cde657901 2906 /**
mbed_official 87:085cde657901 2907 * @brief Handle BTF flag for Slave receiver
mbed_official 226:b062af740e40 2908 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2909 * the configuration information for I2C module
mbed_official 87:085cde657901 2910 * @retval HAL status
mbed_official 87:085cde657901 2911 */
mbed_official 87:085cde657901 2912 static HAL_StatusTypeDef I2C_SlaveReceive_BTF(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2913 {
mbed_official 87:085cde657901 2914 /* Process Locked */
mbed_official 87:085cde657901 2915 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 2916
mbed_official 87:085cde657901 2917 if(hi2c->XferCount != 0)
mbed_official 87:085cde657901 2918 {
mbed_official 87:085cde657901 2919 /* Read data from DR */
mbed_official 87:085cde657901 2920 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 2921 hi2c->XferCount--;
mbed_official 87:085cde657901 2922 }
mbed_official 87:085cde657901 2923
mbed_official 87:085cde657901 2924 /* Process Unlocked */
mbed_official 87:085cde657901 2925 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2926 return HAL_OK;
mbed_official 87:085cde657901 2927 }
mbed_official 87:085cde657901 2928
mbed_official 87:085cde657901 2929 /**
mbed_official 87:085cde657901 2930 * @brief Handle ADD flag for Slave
mbed_official 226:b062af740e40 2931 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2932 * the configuration information for I2C module
mbed_official 87:085cde657901 2933 * @retval HAL status
mbed_official 87:085cde657901 2934 */
mbed_official 87:085cde657901 2935 static HAL_StatusTypeDef I2C_Slave_ADDR(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2936 {
mbed_official 87:085cde657901 2937 /* Process Locked */
mbed_official 87:085cde657901 2938 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 2939
mbed_official 87:085cde657901 2940 /* Clear ADDR flag */
mbed_official 87:085cde657901 2941 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 2942
mbed_official 87:085cde657901 2943 /* Process Unlocked */
mbed_official 87:085cde657901 2944 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2945 return HAL_OK;
mbed_official 87:085cde657901 2946 }
mbed_official 87:085cde657901 2947
mbed_official 87:085cde657901 2948 /**
mbed_official 87:085cde657901 2949 * @brief Handle STOPF flag for Slave
mbed_official 226:b062af740e40 2950 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2951 * the configuration information for I2C module
mbed_official 87:085cde657901 2952 * @retval HAL status
mbed_official 87:085cde657901 2953 */
mbed_official 87:085cde657901 2954 static HAL_StatusTypeDef I2C_Slave_STOPF(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2955 {
mbed_official 87:085cde657901 2956 /* Process Locked */
mbed_official 87:085cde657901 2957 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 2958
mbed_official 87:085cde657901 2959 /* Disable EVT, BUF and ERR interrupt */
mbed_official 87:085cde657901 2960 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
mbed_official 87:085cde657901 2961
mbed_official 87:085cde657901 2962 /* Clear STOPF flag */
mbed_official 87:085cde657901 2963 __HAL_I2C_CLEAR_STOPFLAG(hi2c);
mbed_official 87:085cde657901 2964
mbed_official 87:085cde657901 2965 /* Disable Acknowledge */
mbed_official 87:085cde657901 2966 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 2967
mbed_official 87:085cde657901 2968 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 2969 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 2970 {
mbed_official 87:085cde657901 2971 return HAL_TIMEOUT;
mbed_official 87:085cde657901 2972 }
mbed_official 87:085cde657901 2973
mbed_official 87:085cde657901 2974 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 2975
mbed_official 87:085cde657901 2976 /* Process Unlocked */
mbed_official 87:085cde657901 2977 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2978
mbed_official 87:085cde657901 2979 HAL_I2C_SlaveRxCpltCallback(hi2c);
mbed_official 87:085cde657901 2980
mbed_official 87:085cde657901 2981 return HAL_OK;
mbed_official 87:085cde657901 2982 }
mbed_official 87:085cde657901 2983
mbed_official 87:085cde657901 2984 /**
mbed_official 226:b062af740e40 2985 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2986 * the configuration information for I2C module
mbed_official 87:085cde657901 2987 * @retval HAL status
mbed_official 87:085cde657901 2988 */
mbed_official 87:085cde657901 2989 static HAL_StatusTypeDef I2C_Slave_AF(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2990 {
mbed_official 87:085cde657901 2991 /* Process Locked */
mbed_official 87:085cde657901 2992 __HAL_LOCK(hi2c);
mbed_official 87:085cde657901 2993
mbed_official 87:085cde657901 2994 /* Disable EVT, BUF and ERR interrupt */
mbed_official 87:085cde657901 2995 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
mbed_official 87:085cde657901 2996
mbed_official 87:085cde657901 2997 /* Clear AF flag */
mbed_official 87:085cde657901 2998 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
mbed_official 87:085cde657901 2999
mbed_official 87:085cde657901 3000 /* Disable Acknowledge */
mbed_official 87:085cde657901 3001 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 3002
mbed_official 87:085cde657901 3003 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 3004 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 3005 {
mbed_official 87:085cde657901 3006 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3007 }
mbed_official 87:085cde657901 3008
mbed_official 87:085cde657901 3009 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 3010
mbed_official 87:085cde657901 3011 /* Process Unlocked */
mbed_official 87:085cde657901 3012 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 3013
mbed_official 87:085cde657901 3014 HAL_I2C_SlaveTxCpltCallback(hi2c);
mbed_official 87:085cde657901 3015
mbed_official 87:085cde657901 3016 return HAL_OK;
mbed_official 87:085cde657901 3017 }
mbed_official 87:085cde657901 3018
mbed_official 87:085cde657901 3019 /**
mbed_official 226:b062af740e40 3020 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 3021 * the configuration information for I2C module
mbed_official 87:085cde657901 3022 * @param DevAddress: Target device address
mbed_official 87:085cde657901 3023 * @retval HAL status
mbed_official 87:085cde657901 3024 */
mbed_official 87:085cde657901 3025 static HAL_StatusTypeDef I2C_MasterRequestWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout)
mbed_official 87:085cde657901 3026 {
mbed_official 87:085cde657901 3027 /* Generate Start */
mbed_official 87:085cde657901 3028 hi2c->Instance->CR1 |= I2C_CR1_START;
mbed_official 87:085cde657901 3029
mbed_official 87:085cde657901 3030 /* Wait until SB flag is set */
mbed_official 87:085cde657901 3031 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3032 {
mbed_official 87:085cde657901 3033 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3034 }
mbed_official 87:085cde657901 3035
mbed_official 87:085cde657901 3036 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
mbed_official 87:085cde657901 3037 {
mbed_official 87:085cde657901 3038 /* Send slave address */
mbed_official 87:085cde657901 3039 hi2c->Instance->DR = __HAL_I2C_7BIT_ADD_WRITE(DevAddress);
mbed_official 87:085cde657901 3040 }
mbed_official 87:085cde657901 3041 else
mbed_official 87:085cde657901 3042 {
mbed_official 87:085cde657901 3043 /* Send header of slave address */
mbed_official 87:085cde657901 3044 hi2c->Instance->DR = __HAL_I2C_10BIT_HEADER_WRITE(DevAddress);
mbed_official 87:085cde657901 3045
mbed_official 87:085cde657901 3046 /* Wait until ADD10 flag is set */
mbed_official 87:085cde657901 3047 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADD10, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3048 {
mbed_official 87:085cde657901 3049 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 3050 {
mbed_official 87:085cde657901 3051 return HAL_ERROR;
mbed_official 87:085cde657901 3052 }
mbed_official 87:085cde657901 3053 else
mbed_official 87:085cde657901 3054 {
mbed_official 87:085cde657901 3055 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3056 }
mbed_official 87:085cde657901 3057 }
mbed_official 87:085cde657901 3058
mbed_official 87:085cde657901 3059 /* Send slave address */
mbed_official 87:085cde657901 3060 hi2c->Instance->DR = __HAL_I2C_10BIT_ADDRESS(DevAddress);
mbed_official 87:085cde657901 3061 }
mbed_official 87:085cde657901 3062
mbed_official 87:085cde657901 3063 /* Wait until ADDR flag is set */
mbed_official 87:085cde657901 3064 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3065 {
mbed_official 87:085cde657901 3066 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 3067 {
mbed_official 87:085cde657901 3068 return HAL_ERROR;
mbed_official 87:085cde657901 3069 }
mbed_official 87:085cde657901 3070 else
mbed_official 87:085cde657901 3071 {
mbed_official 87:085cde657901 3072 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3073 }
mbed_official 87:085cde657901 3074 }
mbed_official 87:085cde657901 3075
mbed_official 87:085cde657901 3076 return HAL_OK;
mbed_official 87:085cde657901 3077 }
mbed_official 87:085cde657901 3078
mbed_official 87:085cde657901 3079 /**
mbed_official 87:085cde657901 3080 * @brief Master sends target device address for read request.
mbed_official 226:b062af740e40 3081 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 3082 * the configuration information for I2C module
mbed_official 87:085cde657901 3083 * @param DevAddress: Target device address
mbed_official 87:085cde657901 3084 * @retval HAL status
mbed_official 87:085cde657901 3085 */
mbed_official 87:085cde657901 3086 static HAL_StatusTypeDef I2C_MasterRequestRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout)
mbed_official 87:085cde657901 3087 {
mbed_official 87:085cde657901 3088 /* Enable Acknowledge */
mbed_official 87:085cde657901 3089 hi2c->Instance->CR1 |= I2C_CR1_ACK;
mbed_official 87:085cde657901 3090
mbed_official 87:085cde657901 3091 /* Generate Start */
mbed_official 87:085cde657901 3092 hi2c->Instance->CR1 |= I2C_CR1_START;
mbed_official 87:085cde657901 3093
mbed_official 87:085cde657901 3094 /* Wait until SB flag is set */
mbed_official 87:085cde657901 3095 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3096 {
mbed_official 87:085cde657901 3097 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3098 }
mbed_official 87:085cde657901 3099
mbed_official 87:085cde657901 3100 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
mbed_official 87:085cde657901 3101 {
mbed_official 87:085cde657901 3102 /* Send slave address */
mbed_official 87:085cde657901 3103 hi2c->Instance->DR = __HAL_I2C_7BIT_ADD_READ(DevAddress);
mbed_official 87:085cde657901 3104 }
mbed_official 87:085cde657901 3105 else
mbed_official 87:085cde657901 3106 {
mbed_official 87:085cde657901 3107 /* Send header of slave address */
mbed_official 87:085cde657901 3108 hi2c->Instance->DR = __HAL_I2C_10BIT_HEADER_WRITE(DevAddress);
mbed_official 87:085cde657901 3109
mbed_official 87:085cde657901 3110 /* Wait until ADD10 flag is set */
mbed_official 87:085cde657901 3111 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADD10, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3112 {
mbed_official 87:085cde657901 3113 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 3114 {
mbed_official 87:085cde657901 3115 return HAL_ERROR;
mbed_official 87:085cde657901 3116 }
mbed_official 87:085cde657901 3117 else
mbed_official 87:085cde657901 3118 {
mbed_official 87:085cde657901 3119 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3120 }
mbed_official 87:085cde657901 3121 }
mbed_official 87:085cde657901 3122
mbed_official 87:085cde657901 3123 /* Send slave address */
mbed_official 87:085cde657901 3124 hi2c->Instance->DR = __HAL_I2C_10BIT_ADDRESS(DevAddress);
mbed_official 87:085cde657901 3125
mbed_official 87:085cde657901 3126 /* Wait until ADDR flag is set */
mbed_official 87:085cde657901 3127 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3128 {
mbed_official 87:085cde657901 3129 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 3130 {
mbed_official 87:085cde657901 3131 return HAL_ERROR;
mbed_official 87:085cde657901 3132 }
mbed_official 87:085cde657901 3133 else
mbed_official 87:085cde657901 3134 {
mbed_official 87:085cde657901 3135 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3136 }
mbed_official 87:085cde657901 3137 }
mbed_official 87:085cde657901 3138
mbed_official 87:085cde657901 3139 /* Clear ADDR flag */
mbed_official 87:085cde657901 3140 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 3141
mbed_official 87:085cde657901 3142 /* Generate Restart */
mbed_official 87:085cde657901 3143 hi2c->Instance->CR1 |= I2C_CR1_START;
mbed_official 87:085cde657901 3144
mbed_official 87:085cde657901 3145 /* Wait until SB flag is set */
mbed_official 87:085cde657901 3146 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3147 {
mbed_official 87:085cde657901 3148 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3149 }
mbed_official 87:085cde657901 3150
mbed_official 87:085cde657901 3151 /* Send header of slave address */
mbed_official 87:085cde657901 3152 hi2c->Instance->DR = __HAL_I2C_10BIT_HEADER_READ(DevAddress);
mbed_official 87:085cde657901 3153 }
mbed_official 87:085cde657901 3154
mbed_official 87:085cde657901 3155 /* Wait until ADDR flag is set */
mbed_official 87:085cde657901 3156 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3157 {
mbed_official 87:085cde657901 3158 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 3159 {
mbed_official 87:085cde657901 3160 return HAL_ERROR;
mbed_official 87:085cde657901 3161 }
mbed_official 87:085cde657901 3162 else
mbed_official 87:085cde657901 3163 {
mbed_official 87:085cde657901 3164 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3165 }
mbed_official 87:085cde657901 3166 }
mbed_official 87:085cde657901 3167
mbed_official 87:085cde657901 3168 return HAL_OK;
mbed_official 87:085cde657901 3169 }
mbed_official 87:085cde657901 3170
mbed_official 87:085cde657901 3171 /**
mbed_official 87:085cde657901 3172 * @brief Master sends target device address followed by internal memory address for write request.
mbed_official 226:b062af740e40 3173 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 3174 * the configuration information for I2C module
mbed_official 87:085cde657901 3175 * @param DevAddress: Target device address
mbed_official 87:085cde657901 3176 * @param MemAddress: Internal memory address
mbed_official 87:085cde657901 3177 * @param MemAddSize: Size of internal memory address
mbed_official 87:085cde657901 3178 * @retval HAL status
mbed_official 87:085cde657901 3179 */
mbed_official 87:085cde657901 3180 static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout)
mbed_official 87:085cde657901 3181 {
mbed_official 87:085cde657901 3182 /* Generate Start */
mbed_official 87:085cde657901 3183 hi2c->Instance->CR1 |= I2C_CR1_START;
mbed_official 87:085cde657901 3184
mbed_official 87:085cde657901 3185 /* Wait until SB flag is set */
mbed_official 87:085cde657901 3186 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3187 {
mbed_official 87:085cde657901 3188 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3189 }
mbed_official 87:085cde657901 3190
mbed_official 87:085cde657901 3191 /* Send slave address */
mbed_official 87:085cde657901 3192 hi2c->Instance->DR = __HAL_I2C_7BIT_ADD_WRITE(DevAddress);
mbed_official 87:085cde657901 3193
mbed_official 87:085cde657901 3194 /* Wait until ADDR flag is set */
mbed_official 87:085cde657901 3195 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3196 {
mbed_official 87:085cde657901 3197 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 3198 {
mbed_official 87:085cde657901 3199 return HAL_ERROR;
mbed_official 87:085cde657901 3200 }
mbed_official 87:085cde657901 3201 else
mbed_official 87:085cde657901 3202 {
mbed_official 87:085cde657901 3203 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3204 }
mbed_official 87:085cde657901 3205 }
mbed_official 87:085cde657901 3206
mbed_official 87:085cde657901 3207 /* Clear ADDR flag */
mbed_official 87:085cde657901 3208 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 3209
mbed_official 87:085cde657901 3210 /* Wait until TXE flag is set */
mbed_official 87:085cde657901 3211 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3212 {
mbed_official 87:085cde657901 3213 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3214 }
mbed_official 87:085cde657901 3215
mbed_official 87:085cde657901 3216 /* If Memory address size is 8Bit */
mbed_official 87:085cde657901 3217 if(MemAddSize == I2C_MEMADD_SIZE_8BIT)
mbed_official 87:085cde657901 3218 {
mbed_official 87:085cde657901 3219 /* Send Memory Address */
mbed_official 87:085cde657901 3220 hi2c->Instance->DR = __HAL_I2C_MEM_ADD_LSB(MemAddress);
mbed_official 87:085cde657901 3221 }
mbed_official 87:085cde657901 3222 /* If Memory address size is 16Bit */
mbed_official 87:085cde657901 3223 else
mbed_official 87:085cde657901 3224 {
mbed_official 87:085cde657901 3225 /* Send MSB of Memory Address */
mbed_official 87:085cde657901 3226 hi2c->Instance->DR = __HAL_I2C_MEM_ADD_MSB(MemAddress);
mbed_official 87:085cde657901 3227
mbed_official 87:085cde657901 3228 /* Wait until TXE flag is set */
mbed_official 87:085cde657901 3229 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3230 {
mbed_official 87:085cde657901 3231 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3232 }
mbed_official 87:085cde657901 3233
mbed_official 87:085cde657901 3234 /* Send LSB of Memory Address */
mbed_official 87:085cde657901 3235 hi2c->Instance->DR = __HAL_I2C_MEM_ADD_LSB(MemAddress);
mbed_official 87:085cde657901 3236 }
mbed_official 87:085cde657901 3237
mbed_official 87:085cde657901 3238 return HAL_OK;
mbed_official 87:085cde657901 3239 }
mbed_official 87:085cde657901 3240
mbed_official 87:085cde657901 3241 /**
mbed_official 87:085cde657901 3242 * @brief Master sends target device address followed by internal memory address for read request.
mbed_official 226:b062af740e40 3243 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 3244 * the configuration information for I2C module
mbed_official 87:085cde657901 3245 * @param DevAddress: Target device address
mbed_official 87:085cde657901 3246 * @param MemAddress: Internal memory address
mbed_official 87:085cde657901 3247 * @param MemAddSize: Size of internal memory address
mbed_official 87:085cde657901 3248 * @retval HAL status
mbed_official 87:085cde657901 3249 */
mbed_official 87:085cde657901 3250 static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout)
mbed_official 87:085cde657901 3251 {
mbed_official 87:085cde657901 3252 /* Enable Acknowledge */
mbed_official 87:085cde657901 3253 hi2c->Instance->CR1 |= I2C_CR1_ACK;
mbed_official 87:085cde657901 3254
mbed_official 87:085cde657901 3255 /* Generate Start */
mbed_official 87:085cde657901 3256 hi2c->Instance->CR1 |= I2C_CR1_START;
mbed_official 87:085cde657901 3257
mbed_official 87:085cde657901 3258 /* Wait until SB flag is set */
mbed_official 87:085cde657901 3259 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3260 {
mbed_official 87:085cde657901 3261 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3262 }
mbed_official 87:085cde657901 3263
mbed_official 87:085cde657901 3264 /* Send slave address */
mbed_official 87:085cde657901 3265 hi2c->Instance->DR = __HAL_I2C_7BIT_ADD_WRITE(DevAddress);
mbed_official 87:085cde657901 3266
mbed_official 87:085cde657901 3267 /* Wait until ADDR flag is set */
mbed_official 87:085cde657901 3268 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3269 {
mbed_official 87:085cde657901 3270 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 3271 {
mbed_official 87:085cde657901 3272 return HAL_ERROR;
mbed_official 87:085cde657901 3273 }
mbed_official 87:085cde657901 3274 else
mbed_official 87:085cde657901 3275 {
mbed_official 87:085cde657901 3276 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3277 }
mbed_official 87:085cde657901 3278 }
mbed_official 87:085cde657901 3279
mbed_official 87:085cde657901 3280 /* Clear ADDR flag */
mbed_official 87:085cde657901 3281 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 3282
mbed_official 87:085cde657901 3283 /* Wait until TXE flag is set */
mbed_official 87:085cde657901 3284 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3285 {
mbed_official 87:085cde657901 3286 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3287 }
mbed_official 87:085cde657901 3288
mbed_official 87:085cde657901 3289 /* If Memory address size is 8Bit */
mbed_official 87:085cde657901 3290 if(MemAddSize == I2C_MEMADD_SIZE_8BIT)
mbed_official 87:085cde657901 3291 {
mbed_official 87:085cde657901 3292 /* Send Memory Address */
mbed_official 87:085cde657901 3293 hi2c->Instance->DR = __HAL_I2C_MEM_ADD_LSB(MemAddress);
mbed_official 87:085cde657901 3294 }
mbed_official 87:085cde657901 3295 /* If Memory address size is 16Bit */
mbed_official 87:085cde657901 3296 else
mbed_official 87:085cde657901 3297 {
mbed_official 87:085cde657901 3298 /* Send MSB of Memory Address */
mbed_official 87:085cde657901 3299 hi2c->Instance->DR = __HAL_I2C_MEM_ADD_MSB(MemAddress);
mbed_official 87:085cde657901 3300
mbed_official 87:085cde657901 3301 /* Wait until TXE flag is set */
mbed_official 87:085cde657901 3302 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3303 {
mbed_official 87:085cde657901 3304 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3305 }
mbed_official 87:085cde657901 3306
mbed_official 87:085cde657901 3307 /* Send LSB of Memory Address */
mbed_official 87:085cde657901 3308 hi2c->Instance->DR = __HAL_I2C_MEM_ADD_LSB(MemAddress);
mbed_official 87:085cde657901 3309 }
mbed_official 87:085cde657901 3310
mbed_official 87:085cde657901 3311 /* Wait until TXE flag is set */
mbed_official 87:085cde657901 3312 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3313 {
mbed_official 87:085cde657901 3314 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3315 }
mbed_official 87:085cde657901 3316
mbed_official 87:085cde657901 3317 /* Generate Restart */
mbed_official 87:085cde657901 3318 hi2c->Instance->CR1 |= I2C_CR1_START;
mbed_official 87:085cde657901 3319
mbed_official 87:085cde657901 3320 /* Wait until SB flag is set */
mbed_official 87:085cde657901 3321 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3322 {
mbed_official 87:085cde657901 3323 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3324 }
mbed_official 87:085cde657901 3325
mbed_official 87:085cde657901 3326 /* Send slave address */
mbed_official 87:085cde657901 3327 hi2c->Instance->DR = __HAL_I2C_7BIT_ADD_READ(DevAddress);
mbed_official 87:085cde657901 3328
mbed_official 87:085cde657901 3329 /* Wait until ADDR flag is set */
mbed_official 87:085cde657901 3330 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3331 {
mbed_official 87:085cde657901 3332 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 3333 {
mbed_official 87:085cde657901 3334 return HAL_ERROR;
mbed_official 87:085cde657901 3335 }
mbed_official 87:085cde657901 3336 else
mbed_official 87:085cde657901 3337 {
mbed_official 87:085cde657901 3338 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3339 }
mbed_official 87:085cde657901 3340 }
mbed_official 87:085cde657901 3341
mbed_official 87:085cde657901 3342 return HAL_OK;
mbed_official 87:085cde657901 3343 }
mbed_official 87:085cde657901 3344
mbed_official 87:085cde657901 3345 /**
mbed_official 87:085cde657901 3346 * @brief DMA I2C master transmit process complete callback.
mbed_official 87:085cde657901 3347 * @param hdma: DMA handle
mbed_official 87:085cde657901 3348 * @retval None
mbed_official 87:085cde657901 3349 */
mbed_official 87:085cde657901 3350 static void I2C_DMAMasterTransmitCplt(DMA_HandleTypeDef *hdma)
mbed_official 87:085cde657901 3351 {
mbed_official 87:085cde657901 3352 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 87:085cde657901 3353
mbed_official 87:085cde657901 3354 /* Wait until BTF flag is reset */
mbed_official 87:085cde657901 3355 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 3356 {
mbed_official 87:085cde657901 3357 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
mbed_official 87:085cde657901 3358 }
mbed_official 87:085cde657901 3359
mbed_official 87:085cde657901 3360 /* Generate Stop */
mbed_official 87:085cde657901 3361 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 3362
mbed_official 87:085cde657901 3363 /* Disable DMA Request */
mbed_official 87:085cde657901 3364 hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN;
mbed_official 87:085cde657901 3365
mbed_official 87:085cde657901 3366 hi2c->XferCount = 0;
mbed_official 87:085cde657901 3367
mbed_official 87:085cde657901 3368 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 3369 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 3370 {
mbed_official 87:085cde657901 3371 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
mbed_official 87:085cde657901 3372 }
mbed_official 87:085cde657901 3373
mbed_official 87:085cde657901 3374 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 3375
mbed_official 87:085cde657901 3376 /* Check if Errors has been detected during transfer */
mbed_official 87:085cde657901 3377 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
mbed_official 87:085cde657901 3378 {
mbed_official 87:085cde657901 3379 HAL_I2C_ErrorCallback(hi2c);
mbed_official 87:085cde657901 3380 }
mbed_official 87:085cde657901 3381 else
mbed_official 87:085cde657901 3382 {
mbed_official 87:085cde657901 3383 HAL_I2C_MasterTxCpltCallback(hi2c);
mbed_official 87:085cde657901 3384 }
mbed_official 87:085cde657901 3385 }
mbed_official 87:085cde657901 3386
mbed_official 87:085cde657901 3387 /**
mbed_official 87:085cde657901 3388 * @brief DMA I2C slave transmit process complete callback.
mbed_official 87:085cde657901 3389 * @param hdma: DMA handle
mbed_official 87:085cde657901 3390 * @retval None
mbed_official 87:085cde657901 3391 */
mbed_official 87:085cde657901 3392 static void I2C_DMASlaveTransmitCplt(DMA_HandleTypeDef *hdma)
mbed_official 87:085cde657901 3393 {
mbed_official 87:085cde657901 3394 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 87:085cde657901 3395
mbed_official 87:085cde657901 3396 /* Wait until AF flag is reset */
mbed_official 87:085cde657901 3397 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_AF, RESET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 3398 {
mbed_official 87:085cde657901 3399 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
mbed_official 87:085cde657901 3400 }
mbed_official 87:085cde657901 3401
mbed_official 87:085cde657901 3402 /* Clear AF flag */
mbed_official 87:085cde657901 3403 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
mbed_official 87:085cde657901 3404
mbed_official 87:085cde657901 3405 /* Disable Address Acknowledge */
mbed_official 87:085cde657901 3406 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 3407
mbed_official 87:085cde657901 3408 /* Disable DMA Request */
mbed_official 87:085cde657901 3409 hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN;
mbed_official 87:085cde657901 3410
mbed_official 87:085cde657901 3411 hi2c->XferCount = 0;
mbed_official 87:085cde657901 3412
mbed_official 87:085cde657901 3413 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 3414 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 3415 {
mbed_official 87:085cde657901 3416 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
mbed_official 87:085cde657901 3417 }
mbed_official 87:085cde657901 3418
mbed_official 87:085cde657901 3419 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 3420
mbed_official 87:085cde657901 3421 /* Check if Errors has been detected during transfer */
mbed_official 87:085cde657901 3422 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
mbed_official 87:085cde657901 3423 {
mbed_official 87:085cde657901 3424 HAL_I2C_ErrorCallback(hi2c);
mbed_official 87:085cde657901 3425 }
mbed_official 87:085cde657901 3426 else
mbed_official 87:085cde657901 3427 {
mbed_official 87:085cde657901 3428 HAL_I2C_SlaveTxCpltCallback(hi2c);
mbed_official 87:085cde657901 3429 }
mbed_official 87:085cde657901 3430 }
mbed_official 87:085cde657901 3431
mbed_official 87:085cde657901 3432 /**
mbed_official 87:085cde657901 3433 * @brief DMA I2C master receive process complete callback
mbed_official 87:085cde657901 3434 * @param hdma: DMA handle
mbed_official 87:085cde657901 3435 * @retval None
mbed_official 87:085cde657901 3436 */
mbed_official 87:085cde657901 3437 static void I2C_DMAMasterReceiveCplt(DMA_HandleTypeDef *hdma)
mbed_official 87:085cde657901 3438 {
mbed_official 87:085cde657901 3439 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 87:085cde657901 3440
mbed_official 87:085cde657901 3441 /* Generate Stop */
mbed_official 87:085cde657901 3442 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 3443
mbed_official 87:085cde657901 3444 /* Disable Last DMA */
mbed_official 87:085cde657901 3445 hi2c->Instance->CR2 &= ~I2C_CR2_LAST;
mbed_official 87:085cde657901 3446
mbed_official 87:085cde657901 3447 /* Disable Acknowledge */
mbed_official 87:085cde657901 3448 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 3449
mbed_official 87:085cde657901 3450 /* Disable DMA Request */
mbed_official 87:085cde657901 3451 hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN;
mbed_official 87:085cde657901 3452
mbed_official 87:085cde657901 3453 hi2c->XferCount = 0;
mbed_official 87:085cde657901 3454
mbed_official 87:085cde657901 3455 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 3456 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 3457 {
mbed_official 87:085cde657901 3458 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
mbed_official 87:085cde657901 3459 }
mbed_official 87:085cde657901 3460
mbed_official 87:085cde657901 3461 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 3462
mbed_official 87:085cde657901 3463 /* Check if Errors has been detected during transfer */
mbed_official 87:085cde657901 3464 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
mbed_official 87:085cde657901 3465 {
mbed_official 87:085cde657901 3466 HAL_I2C_ErrorCallback(hi2c);
mbed_official 87:085cde657901 3467 }
mbed_official 87:085cde657901 3468 else
mbed_official 87:085cde657901 3469 {
mbed_official 87:085cde657901 3470 HAL_I2C_MasterRxCpltCallback(hi2c);
mbed_official 87:085cde657901 3471 }
mbed_official 87:085cde657901 3472 }
mbed_official 87:085cde657901 3473
mbed_official 87:085cde657901 3474 /**
mbed_official 87:085cde657901 3475 * @brief DMA I2C slave receive process complete callback.
mbed_official 87:085cde657901 3476 * @param hdma: DMA handle
mbed_official 87:085cde657901 3477 * @retval None
mbed_official 87:085cde657901 3478 */
mbed_official 87:085cde657901 3479 static void I2C_DMASlaveReceiveCplt(DMA_HandleTypeDef *hdma)
mbed_official 87:085cde657901 3480 {
mbed_official 87:085cde657901 3481 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 87:085cde657901 3482
mbed_official 87:085cde657901 3483 /* Wait until STOPF flag is reset */
mbed_official 87:085cde657901 3484 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_STOPF, RESET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 3485 {
mbed_official 87:085cde657901 3486 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
mbed_official 87:085cde657901 3487 }
mbed_official 87:085cde657901 3488
mbed_official 87:085cde657901 3489 /* Clear STOPF flag */
mbed_official 87:085cde657901 3490 __HAL_I2C_CLEAR_STOPFLAG(hi2c);
mbed_official 87:085cde657901 3491
mbed_official 87:085cde657901 3492 /* Disable Address Acknowledge */
mbed_official 87:085cde657901 3493 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 3494
mbed_official 87:085cde657901 3495 /* Disable DMA Request */
mbed_official 87:085cde657901 3496 hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN;
mbed_official 87:085cde657901 3497
mbed_official 87:085cde657901 3498 hi2c->XferCount = 0;
mbed_official 87:085cde657901 3499
mbed_official 87:085cde657901 3500 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 3501 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 3502 {
mbed_official 87:085cde657901 3503 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
mbed_official 87:085cde657901 3504 }
mbed_official 87:085cde657901 3505
mbed_official 87:085cde657901 3506 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 3507
mbed_official 87:085cde657901 3508 /* Check if Errors has been detected during transfer */
mbed_official 87:085cde657901 3509 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
mbed_official 87:085cde657901 3510 {
mbed_official 87:085cde657901 3511 HAL_I2C_ErrorCallback(hi2c);
mbed_official 87:085cde657901 3512 }
mbed_official 87:085cde657901 3513 else
mbed_official 87:085cde657901 3514 {
mbed_official 87:085cde657901 3515 HAL_I2C_SlaveRxCpltCallback(hi2c);
mbed_official 87:085cde657901 3516 }
mbed_official 87:085cde657901 3517 }
mbed_official 87:085cde657901 3518
mbed_official 87:085cde657901 3519 /**
mbed_official 87:085cde657901 3520 * @brief DMA I2C Memory Write process complete callback
mbed_official 87:085cde657901 3521 * @param hdma: DMA handle
mbed_official 87:085cde657901 3522 * @retval None
mbed_official 87:085cde657901 3523 */
mbed_official 87:085cde657901 3524 static void I2C_DMAMemTransmitCplt(DMA_HandleTypeDef *hdma)
mbed_official 87:085cde657901 3525 {
mbed_official 87:085cde657901 3526 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 87:085cde657901 3527
mbed_official 87:085cde657901 3528 /* Wait until BTF flag is reset */
mbed_official 87:085cde657901 3529 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 3530 {
mbed_official 87:085cde657901 3531 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
mbed_official 87:085cde657901 3532 }
mbed_official 87:085cde657901 3533
mbed_official 87:085cde657901 3534 /* Generate Stop */
mbed_official 87:085cde657901 3535 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 3536
mbed_official 87:085cde657901 3537 /* Disable DMA Request */
mbed_official 87:085cde657901 3538 hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN;
mbed_official 87:085cde657901 3539
mbed_official 87:085cde657901 3540 hi2c->XferCount = 0;
mbed_official 87:085cde657901 3541
mbed_official 87:085cde657901 3542 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 3543 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 3544 {
mbed_official 87:085cde657901 3545 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
mbed_official 87:085cde657901 3546 }
mbed_official 87:085cde657901 3547
mbed_official 87:085cde657901 3548 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 3549
mbed_official 87:085cde657901 3550 /* Check if Errors has been detected during transfer */
mbed_official 87:085cde657901 3551 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
mbed_official 87:085cde657901 3552 {
mbed_official 87:085cde657901 3553 HAL_I2C_ErrorCallback(hi2c);
mbed_official 87:085cde657901 3554 }
mbed_official 87:085cde657901 3555 else
mbed_official 87:085cde657901 3556 {
mbed_official 87:085cde657901 3557 HAL_I2C_MemTxCpltCallback(hi2c);
mbed_official 87:085cde657901 3558 }
mbed_official 87:085cde657901 3559 }
mbed_official 87:085cde657901 3560
mbed_official 87:085cde657901 3561 /**
mbed_official 87:085cde657901 3562 * @brief DMA I2C Memory Read process complete callback
mbed_official 87:085cde657901 3563 * @param hdma: DMA handle
mbed_official 87:085cde657901 3564 * @retval None
mbed_official 87:085cde657901 3565 */
mbed_official 87:085cde657901 3566 static void I2C_DMAMemReceiveCplt(DMA_HandleTypeDef *hdma)
mbed_official 87:085cde657901 3567 {
mbed_official 87:085cde657901 3568 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 87:085cde657901 3569
mbed_official 87:085cde657901 3570 /* Generate Stop */
mbed_official 87:085cde657901 3571 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 3572
mbed_official 87:085cde657901 3573 /* Disable Last DMA */
mbed_official 87:085cde657901 3574 hi2c->Instance->CR2 &= ~I2C_CR2_LAST;
mbed_official 87:085cde657901 3575
mbed_official 87:085cde657901 3576 /* Disable Acknowledge */
mbed_official 87:085cde657901 3577 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 3578
mbed_official 87:085cde657901 3579 /* Disable DMA Request */
mbed_official 87:085cde657901 3580 hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN;
mbed_official 87:085cde657901 3581
mbed_official 87:085cde657901 3582 hi2c->XferCount = 0;
mbed_official 87:085cde657901 3583
mbed_official 87:085cde657901 3584 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 3585 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 3586 {
mbed_official 87:085cde657901 3587 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
mbed_official 87:085cde657901 3588 }
mbed_official 87:085cde657901 3589
mbed_official 87:085cde657901 3590 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 3591
mbed_official 87:085cde657901 3592 /* Check if Errors has been detected during transfer */
mbed_official 87:085cde657901 3593 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
mbed_official 87:085cde657901 3594 {
mbed_official 87:085cde657901 3595 HAL_I2C_ErrorCallback(hi2c);
mbed_official 87:085cde657901 3596 }
mbed_official 87:085cde657901 3597 else
mbed_official 87:085cde657901 3598 {
mbed_official 87:085cde657901 3599 HAL_I2C_MemRxCpltCallback(hi2c);
mbed_official 87:085cde657901 3600 }
mbed_official 87:085cde657901 3601 }
mbed_official 87:085cde657901 3602
mbed_official 87:085cde657901 3603 /**
mbed_official 87:085cde657901 3604 * @brief DMA I2C communication error callback.
mbed_official 87:085cde657901 3605 * @param hdma: DMA handle
mbed_official 87:085cde657901 3606 * @retval None
mbed_official 87:085cde657901 3607 */
mbed_official 87:085cde657901 3608 static void I2C_DMAError(DMA_HandleTypeDef *hdma)
mbed_official 87:085cde657901 3609 {
mbed_official 87:085cde657901 3610 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 87:085cde657901 3611
mbed_official 87:085cde657901 3612 /* Disable Acknowledge */
mbed_official 87:085cde657901 3613 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 3614
mbed_official 87:085cde657901 3615 hi2c->XferCount = 0;
mbed_official 87:085cde657901 3616
mbed_official 87:085cde657901 3617 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 3618
mbed_official 87:085cde657901 3619 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
mbed_official 87:085cde657901 3620
mbed_official 87:085cde657901 3621 HAL_I2C_ErrorCallback(hi2c);
mbed_official 87:085cde657901 3622 }
mbed_official 87:085cde657901 3623
mbed_official 87:085cde657901 3624 /**
mbed_official 87:085cde657901 3625 * @brief This function handles I2C Communication Timeout.
mbed_official 226:b062af740e40 3626 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 3627 * the configuration information for I2C module
mbed_official 87:085cde657901 3628 * @param Flag: specifies the I2C flag to check.
mbed_official 87:085cde657901 3629 * @param Status: The new Flag status (SET or RESET).
mbed_official 87:085cde657901 3630 * @param Timeout: Timeout duration
mbed_official 87:085cde657901 3631 * @retval HAL status
mbed_official 87:085cde657901 3632 */
mbed_official 87:085cde657901 3633 static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout)
mbed_official 87:085cde657901 3634 {
mbed_official 87:085cde657901 3635 uint32_t timeout = 0;
mbed_official 87:085cde657901 3636
mbed_official 87:085cde657901 3637 timeout = HAL_GetTick() + Timeout;
mbed_official 87:085cde657901 3638
mbed_official 87:085cde657901 3639 /* Wait until flag is set */
mbed_official 87:085cde657901 3640 if(Status == RESET)
mbed_official 87:085cde657901 3641 {
mbed_official 87:085cde657901 3642 while(__HAL_I2C_GET_FLAG(hi2c, Flag) == RESET)
mbed_official 87:085cde657901 3643 {
mbed_official 87:085cde657901 3644 /* Check for the Timeout */
mbed_official 87:085cde657901 3645 if(Timeout != HAL_MAX_DELAY)
mbed_official 87:085cde657901 3646 {
mbed_official 87:085cde657901 3647 if(HAL_GetTick() >= timeout)
mbed_official 87:085cde657901 3648 {
mbed_official 87:085cde657901 3649 hi2c->State= HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 3650
mbed_official 87:085cde657901 3651 /* Process Unlocked */
mbed_official 87:085cde657901 3652 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 3653
mbed_official 87:085cde657901 3654 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3655 }
mbed_official 87:085cde657901 3656 }
mbed_official 87:085cde657901 3657 }
mbed_official 87:085cde657901 3658 }
mbed_official 87:085cde657901 3659 else
mbed_official 87:085cde657901 3660 {
mbed_official 87:085cde657901 3661 while(__HAL_I2C_GET_FLAG(hi2c, Flag) != RESET)
mbed_official 87:085cde657901 3662 {
mbed_official 87:085cde657901 3663 /* Check for the Timeout */
mbed_official 87:085cde657901 3664 if(Timeout != HAL_MAX_DELAY)
mbed_official 87:085cde657901 3665 {
mbed_official 87:085cde657901 3666 if(HAL_GetTick() >= timeout)
mbed_official 87:085cde657901 3667 {
mbed_official 87:085cde657901 3668 hi2c->State= HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 3669
mbed_official 87:085cde657901 3670 /* Process Unlocked */
mbed_official 87:085cde657901 3671 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 3672
mbed_official 87:085cde657901 3673 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3674 }
mbed_official 87:085cde657901 3675 }
mbed_official 87:085cde657901 3676 }
mbed_official 87:085cde657901 3677 }
mbed_official 87:085cde657901 3678 return HAL_OK;
mbed_official 87:085cde657901 3679 }
mbed_official 87:085cde657901 3680
mbed_official 87:085cde657901 3681 /**
mbed_official 87:085cde657901 3682 * @brief This function handles I2C Communication Timeout for Master addressing phase.
mbed_official 226:b062af740e40 3683 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 3684 * the configuration information for I2C module
mbed_official 87:085cde657901 3685 * @param Flag: specifies the I2C flag to check.
mbed_official 87:085cde657901 3686 * @param Timeout: Timeout duration
mbed_official 87:085cde657901 3687 * @retval HAL status
mbed_official 87:085cde657901 3688 */
mbed_official 87:085cde657901 3689 static HAL_StatusTypeDef I2C_WaitOnMasterAddressFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, uint32_t Timeout)
mbed_official 87:085cde657901 3690 {
mbed_official 87:085cde657901 3691 uint32_t timeout = 0;
mbed_official 87:085cde657901 3692
mbed_official 87:085cde657901 3693 timeout = HAL_GetTick() + Timeout;
mbed_official 87:085cde657901 3694
mbed_official 87:085cde657901 3695 while(__HAL_I2C_GET_FLAG(hi2c, Flag) == RESET)
mbed_official 87:085cde657901 3696 {
mbed_official 87:085cde657901 3697 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET)
mbed_official 87:085cde657901 3698 {
mbed_official 87:085cde657901 3699 /* Generate Stop */
mbed_official 87:085cde657901 3700 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 3701
mbed_official 87:085cde657901 3702 /* Clear AF Flag */
mbed_official 87:085cde657901 3703 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
mbed_official 87:085cde657901 3704
mbed_official 87:085cde657901 3705 hi2c->ErrorCode = HAL_I2C_ERROR_AF;
mbed_official 87:085cde657901 3706 hi2c->State= HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 3707
mbed_official 87:085cde657901 3708 /* Process Unlocked */
mbed_official 87:085cde657901 3709 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 3710
mbed_official 87:085cde657901 3711 return HAL_ERROR;
mbed_official 87:085cde657901 3712 }
mbed_official 87:085cde657901 3713
mbed_official 87:085cde657901 3714 /* Check for the Timeout */
mbed_official 87:085cde657901 3715 if(Timeout != HAL_MAX_DELAY)
mbed_official 87:085cde657901 3716 {
mbed_official 87:085cde657901 3717 if(HAL_GetTick() >= timeout)
mbed_official 87:085cde657901 3718 {
mbed_official 87:085cde657901 3719 hi2c->State= HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 3720
mbed_official 87:085cde657901 3721 /* Process Unlocked */
mbed_official 87:085cde657901 3722 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 3723
mbed_official 87:085cde657901 3724 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3725 }
mbed_official 87:085cde657901 3726 }
mbed_official 87:085cde657901 3727 }
mbed_official 87:085cde657901 3728 return HAL_OK;
mbed_official 87:085cde657901 3729 }
mbed_official 87:085cde657901 3730
mbed_official 87:085cde657901 3731 /**
mbed_official 87:085cde657901 3732 * @}
mbed_official 87:085cde657901 3733 */
mbed_official 87:085cde657901 3734
mbed_official 87:085cde657901 3735 #endif /* HAL_I2C_MODULE_ENABLED */
mbed_official 87:085cde657901 3736
mbed_official 87:085cde657901 3737 /**
mbed_official 87:085cde657901 3738 * @}
mbed_official 87:085cde657901 3739 */
mbed_official 87:085cde657901 3740
mbed_official 87:085cde657901 3741 /**
mbed_official 87:085cde657901 3742 * @}
mbed_official 87:085cde657901 3743 */
mbed_official 87:085cde657901 3744
mbed_official 87:085cde657901 3745 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/