mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

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

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

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

Import librarymbed

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

Committer:
mbed_official
Date:
Mon Oct 27 09:45:07 2014 +0000
Revision:
369:2e96f1b71984
Parent:
226:b062af740e40
Synchronized with git revision 2d1f64de28cfb25c0e602532e3ce5ad1d9accbed

Full URL: https://github.com/mbedmicro/mbed/commit/2d1f64de28cfb25c0e602532e3ce5ad1d9accbed/

CMSIS: NUCLEO_F401RE - Update STM32Cube driver

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 369:2e96f1b71984 5 * @version V1.1.0
mbed_official 369:2e96f1b71984 6 * @date 19-June-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 369:2e96f1b71984 283 if(hi2c == HAL_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 369:2e96f1b71984 358 if(hi2c == HAL_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 369:2e96f1b71984 487 if((pData == HAL_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 369:2e96f1b71984 585 if((pData == HAL_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 369:2e96f1b71984 776 if((pData == HAL_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 369:2e96f1b71984 881 if((pData == HAL_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 369:2e96f1b71984 973 if((pData == HAL_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 369:2e96f1b71984 1044 if((pData == HAL_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 369:2e96f1b71984 1142 if((pData == HAL_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 369:2e96f1b71984 1195 if((pData == HAL_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 369:2e96f1b71984 1249 if((pData == HAL_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 369:2e96f1b71984 1325 if((pData == HAL_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 369:2e96f1b71984 1411 if((pData == HAL_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 369:2e96f1b71984 1496 if((pData == HAL_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 369:2e96f1b71984 1569 if((pData == HAL_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 369:2e96f1b71984 1669 if((pData == HAL_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 369:2e96f1b71984 1861 if((pData == HAL_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 369:2e96f1b71984 1934 if((pData == HAL_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 369:2e96f1b71984 2037 if((pData == HAL_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 369:2e96f1b71984 2115 if((pData == HAL_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 369:2e96f1b71984 2201 uint32_t tickstart = 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 369:2e96f1b71984 2231 /* Get tick */
mbed_official 369:2e96f1b71984 2232 tickstart = HAL_GetTick();
mbed_official 87:085cde657901 2233
mbed_official 87:085cde657901 2234 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR);
mbed_official 87:085cde657901 2235 tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF);
mbed_official 87:085cde657901 2236 tmp3 = hi2c->State;
mbed_official 87:085cde657901 2237 while((tmp1 == RESET) && (tmp2 == RESET) && (tmp3 != HAL_I2C_STATE_TIMEOUT))
mbed_official 87:085cde657901 2238 {
mbed_official 369:2e96f1b71984 2239 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
mbed_official 87:085cde657901 2240 {
mbed_official 87:085cde657901 2241 hi2c->State = HAL_I2C_STATE_TIMEOUT;
mbed_official 87:085cde657901 2242 }
mbed_official 87:085cde657901 2243 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR);
mbed_official 87:085cde657901 2244 tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF);
mbed_official 87:085cde657901 2245 tmp3 = hi2c->State;
mbed_official 87:085cde657901 2246 }
mbed_official 87:085cde657901 2247
mbed_official 87:085cde657901 2248 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 2249
mbed_official 87:085cde657901 2250 /* Check if the ADDR flag has been set */
mbed_official 87:085cde657901 2251 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR) == SET)
mbed_official 87:085cde657901 2252 {
mbed_official 87:085cde657901 2253 /* Generate Stop */
mbed_official 87:085cde657901 2254 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 2255
mbed_official 87:085cde657901 2256 /* Clear ADDR Flag */
mbed_official 87:085cde657901 2257 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 2258
mbed_official 87:085cde657901 2259 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 2260 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 2261 {
mbed_official 87:085cde657901 2262 return HAL_TIMEOUT;
mbed_official 87:085cde657901 2263 }
mbed_official 87:085cde657901 2264
mbed_official 87:085cde657901 2265 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 2266
mbed_official 87:085cde657901 2267 /* Process Unlocked */
mbed_official 87:085cde657901 2268 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2269
mbed_official 87:085cde657901 2270 return HAL_OK;
mbed_official 87:085cde657901 2271 }
mbed_official 87:085cde657901 2272 else
mbed_official 87:085cde657901 2273 {
mbed_official 87:085cde657901 2274 /* Generate Stop */
mbed_official 87:085cde657901 2275 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 2276
mbed_official 87:085cde657901 2277 /* Clear AF Flag */
mbed_official 87:085cde657901 2278 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
mbed_official 87:085cde657901 2279
mbed_official 87:085cde657901 2280 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 2281 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 2282 {
mbed_official 87:085cde657901 2283 return HAL_TIMEOUT;
mbed_official 87:085cde657901 2284 }
mbed_official 87:085cde657901 2285 }
mbed_official 87:085cde657901 2286 }while(I2C_Trials++ < Trials);
mbed_official 87:085cde657901 2287
mbed_official 87:085cde657901 2288 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 2289
mbed_official 87:085cde657901 2290 /* Process Unlocked */
mbed_official 87:085cde657901 2291 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 2292
mbed_official 87:085cde657901 2293 return HAL_ERROR;
mbed_official 87:085cde657901 2294 }
mbed_official 87:085cde657901 2295 else
mbed_official 87:085cde657901 2296 {
mbed_official 87:085cde657901 2297 return HAL_BUSY;
mbed_official 87:085cde657901 2298 }
mbed_official 87:085cde657901 2299 }
mbed_official 87:085cde657901 2300
mbed_official 87:085cde657901 2301 /**
mbed_official 87:085cde657901 2302 * @brief This function handles I2C event interrupt request.
mbed_official 226:b062af740e40 2303 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2304 * the configuration information for I2C module
mbed_official 87:085cde657901 2305 * @retval HAL status
mbed_official 87:085cde657901 2306 */
mbed_official 87:085cde657901 2307 void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2308 {
mbed_official 87:085cde657901 2309 uint32_t tmp1 = 0, tmp2 = 0, tmp3 = 0, tmp4 = 0;
mbed_official 87:085cde657901 2310 /* Master mode selected */
mbed_official 87:085cde657901 2311 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_MSL) == SET)
mbed_official 87:085cde657901 2312 {
mbed_official 87:085cde657901 2313 /* I2C in mode Transmitter -----------------------------------------------*/
mbed_official 87:085cde657901 2314 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TRA) == SET)
mbed_official 87:085cde657901 2315 {
mbed_official 87:085cde657901 2316 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE);
mbed_official 87:085cde657901 2317 tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_BUF);
mbed_official 87:085cde657901 2318 tmp3 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF);
mbed_official 87:085cde657901 2319 tmp4 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_EVT);
mbed_official 87:085cde657901 2320 /* TXE set and BTF reset -----------------------------------------------*/
mbed_official 87:085cde657901 2321 if((tmp1 == SET) && (tmp2 == SET) && (tmp3 == RESET))
mbed_official 87:085cde657901 2322 {
mbed_official 87:085cde657901 2323 I2C_MasterTransmit_TXE(hi2c);
mbed_official 87:085cde657901 2324 }
mbed_official 87:085cde657901 2325 /* BTF set -------------------------------------------------------------*/
mbed_official 87:085cde657901 2326 else if((tmp3 == SET) && (tmp4 == SET))
mbed_official 87:085cde657901 2327 {
mbed_official 87:085cde657901 2328 I2C_MasterTransmit_BTF(hi2c);
mbed_official 87:085cde657901 2329 }
mbed_official 87:085cde657901 2330 }
mbed_official 87:085cde657901 2331 /* I2C in mode Receiver --------------------------------------------------*/
mbed_official 87:085cde657901 2332 else
mbed_official 87:085cde657901 2333 {
mbed_official 87:085cde657901 2334 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE);
mbed_official 87:085cde657901 2335 tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_BUF);
mbed_official 87:085cde657901 2336 tmp3 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF);
mbed_official 87:085cde657901 2337 tmp4 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_EVT);
mbed_official 87:085cde657901 2338 /* RXNE set and BTF reset -----------------------------------------------*/
mbed_official 87:085cde657901 2339 if((tmp1 == SET) && (tmp2 == SET) && (tmp3 == RESET))
mbed_official 87:085cde657901 2340 {
mbed_official 87:085cde657901 2341 I2C_MasterReceive_RXNE(hi2c);
mbed_official 87:085cde657901 2342 }
mbed_official 87:085cde657901 2343 /* BTF set -------------------------------------------------------------*/
mbed_official 87:085cde657901 2344 else if((tmp3 == SET) && (tmp4 == SET))
mbed_official 87:085cde657901 2345 {
mbed_official 87:085cde657901 2346 I2C_MasterReceive_BTF(hi2c);
mbed_official 87:085cde657901 2347 }
mbed_official 87:085cde657901 2348 }
mbed_official 87:085cde657901 2349 }
mbed_official 87:085cde657901 2350 /* Slave mode selected */
mbed_official 87:085cde657901 2351 else
mbed_official 87:085cde657901 2352 {
mbed_official 87:085cde657901 2353 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR);
mbed_official 87:085cde657901 2354 tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, (I2C_IT_EVT));
mbed_official 87:085cde657901 2355 tmp3 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF);
mbed_official 87:085cde657901 2356 tmp4 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TRA);
mbed_official 87:085cde657901 2357 /* ADDR set --------------------------------------------------------------*/
mbed_official 87:085cde657901 2358 if((tmp1 == SET) && (tmp2 == SET))
mbed_official 87:085cde657901 2359 {
mbed_official 87:085cde657901 2360 I2C_Slave_ADDR(hi2c);
mbed_official 87:085cde657901 2361 }
mbed_official 87:085cde657901 2362 /* STOPF set --------------------------------------------------------------*/
mbed_official 87:085cde657901 2363 else if((tmp3 == SET) && (tmp2 == SET))
mbed_official 87:085cde657901 2364 {
mbed_official 87:085cde657901 2365 I2C_Slave_STOPF(hi2c);
mbed_official 87:085cde657901 2366 }
mbed_official 87:085cde657901 2367 /* I2C in mode Transmitter -----------------------------------------------*/
mbed_official 87:085cde657901 2368 else if(tmp4 == SET)
mbed_official 87:085cde657901 2369 {
mbed_official 87:085cde657901 2370 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE);
mbed_official 87:085cde657901 2371 tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_BUF);
mbed_official 87:085cde657901 2372 tmp3 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF);
mbed_official 87:085cde657901 2373 tmp4 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_EVT);
mbed_official 87:085cde657901 2374 /* TXE set and BTF reset -----------------------------------------------*/
mbed_official 87:085cde657901 2375 if((tmp1 == SET) && (tmp2 == SET) && (tmp3 == RESET))
mbed_official 87:085cde657901 2376 {
mbed_official 87:085cde657901 2377 I2C_SlaveTransmit_TXE(hi2c);
mbed_official 87:085cde657901 2378 }
mbed_official 87:085cde657901 2379 /* BTF set -------------------------------------------------------------*/
mbed_official 87:085cde657901 2380 else if((tmp3 == SET) && (tmp4 == SET))
mbed_official 87:085cde657901 2381 {
mbed_official 87:085cde657901 2382 I2C_SlaveTransmit_BTF(hi2c);
mbed_official 87:085cde657901 2383 }
mbed_official 87:085cde657901 2384 }
mbed_official 87:085cde657901 2385 /* I2C in mode Receiver --------------------------------------------------*/
mbed_official 87:085cde657901 2386 else
mbed_official 87:085cde657901 2387 {
mbed_official 87:085cde657901 2388 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE);
mbed_official 87:085cde657901 2389 tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_BUF);
mbed_official 87:085cde657901 2390 tmp3 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF);
mbed_official 87:085cde657901 2391 tmp4 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_EVT);
mbed_official 87:085cde657901 2392 /* RXNE set and BTF reset ----------------------------------------------*/
mbed_official 87:085cde657901 2393 if((tmp1 == SET) && (tmp2 == SET) && (tmp3 == RESET))
mbed_official 87:085cde657901 2394 {
mbed_official 87:085cde657901 2395 I2C_SlaveReceive_RXNE(hi2c);
mbed_official 87:085cde657901 2396 }
mbed_official 87:085cde657901 2397 /* BTF set -------------------------------------------------------------*/
mbed_official 87:085cde657901 2398 else if((tmp3 == SET) && (tmp4 == SET))
mbed_official 87:085cde657901 2399 {
mbed_official 87:085cde657901 2400 I2C_SlaveReceive_BTF(hi2c);
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 /**
mbed_official 87:085cde657901 2407 * @brief This function handles I2C error interrupt request.
mbed_official 226:b062af740e40 2408 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2409 * the configuration information for I2C module
mbed_official 87:085cde657901 2410 * @retval HAL status
mbed_official 87:085cde657901 2411 */
mbed_official 87:085cde657901 2412 void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2413 {
mbed_official 87:085cde657901 2414 uint32_t tmp1 = 0, tmp2 = 0, tmp3 = 0;
mbed_official 87:085cde657901 2415
mbed_official 87:085cde657901 2416 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BERR);
mbed_official 87:085cde657901 2417 tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_ERR);
mbed_official 87:085cde657901 2418 /* I2C Bus error interrupt occurred ----------------------------------------*/
mbed_official 87:085cde657901 2419 if((tmp1 == SET) && (tmp2 == SET))
mbed_official 87:085cde657901 2420 {
mbed_official 87:085cde657901 2421 hi2c->ErrorCode |= HAL_I2C_ERROR_BERR;
mbed_official 87:085cde657901 2422
mbed_official 87:085cde657901 2423 /* Clear BERR flag */
mbed_official 87:085cde657901 2424 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_BERR);
mbed_official 87:085cde657901 2425 }
mbed_official 87:085cde657901 2426
mbed_official 87:085cde657901 2427 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ARLO);
mbed_official 87:085cde657901 2428 tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_ERR);
mbed_official 87:085cde657901 2429 /* I2C Arbitration Loss error interrupt occurred ---------------------------*/
mbed_official 87:085cde657901 2430 if((tmp1 == SET) && (tmp2 == SET))
mbed_official 87:085cde657901 2431 {
mbed_official 87:085cde657901 2432 hi2c->ErrorCode |= HAL_I2C_ERROR_ARLO;
mbed_official 87:085cde657901 2433
mbed_official 87:085cde657901 2434 /* Clear ARLO flag */
mbed_official 87:085cde657901 2435 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ARLO);
mbed_official 87:085cde657901 2436 }
mbed_official 87:085cde657901 2437
mbed_official 87:085cde657901 2438 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF);
mbed_official 87:085cde657901 2439 tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_ERR);
mbed_official 87:085cde657901 2440 /* I2C Acknowledge failure error interrupt occurred ------------------------*/
mbed_official 87:085cde657901 2441 if((tmp1 == SET) && (tmp2 == SET))
mbed_official 87:085cde657901 2442 {
mbed_official 87:085cde657901 2443 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_MSL);
mbed_official 87:085cde657901 2444 tmp2 = hi2c->XferCount;
mbed_official 87:085cde657901 2445 tmp3 = hi2c->State;
mbed_official 87:085cde657901 2446 if((tmp1 == RESET) && (tmp2 == 0) && (tmp3 == HAL_I2C_STATE_BUSY_TX))
mbed_official 87:085cde657901 2447 {
mbed_official 87:085cde657901 2448 I2C_Slave_AF(hi2c);
mbed_official 87:085cde657901 2449 }
mbed_official 87:085cde657901 2450 else
mbed_official 87:085cde657901 2451 {
mbed_official 87:085cde657901 2452 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
mbed_official 87:085cde657901 2453 /* Clear AF flag */
mbed_official 87:085cde657901 2454 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
mbed_official 87:085cde657901 2455 }
mbed_official 87:085cde657901 2456 }
mbed_official 87:085cde657901 2457
mbed_official 87:085cde657901 2458 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_OVR);
mbed_official 87:085cde657901 2459 tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_ERR);
mbed_official 87:085cde657901 2460 /* I2C Over-Run/Under-Run interrupt occurred -------------------------------*/
mbed_official 87:085cde657901 2461 if((tmp1 == SET) && (tmp2 == SET))
mbed_official 87:085cde657901 2462 {
mbed_official 87:085cde657901 2463 hi2c->ErrorCode |= HAL_I2C_ERROR_OVR;
mbed_official 87:085cde657901 2464 /* Clear OVR flag */
mbed_official 87:085cde657901 2465 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_OVR);
mbed_official 87:085cde657901 2466 }
mbed_official 87:085cde657901 2467
mbed_official 87:085cde657901 2468 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
mbed_official 87:085cde657901 2469 {
mbed_official 87:085cde657901 2470 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 2471
mbed_official 87:085cde657901 2472 HAL_I2C_ErrorCallback(hi2c);
mbed_official 87:085cde657901 2473 }
mbed_official 87:085cde657901 2474 }
mbed_official 87:085cde657901 2475
mbed_official 87:085cde657901 2476 /**
mbed_official 87:085cde657901 2477 * @brief Master Tx Transfer completed callbacks.
mbed_official 226:b062af740e40 2478 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2479 * the configuration information for I2C module
mbed_official 87:085cde657901 2480 * @retval None
mbed_official 87:085cde657901 2481 */
mbed_official 87:085cde657901 2482 __weak void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2483 {
mbed_official 87:085cde657901 2484 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 2485 the HAL_I2C_TxCpltCallback could be implemented in the user file
mbed_official 87:085cde657901 2486 */
mbed_official 87:085cde657901 2487 }
mbed_official 87:085cde657901 2488
mbed_official 87:085cde657901 2489 /**
mbed_official 87:085cde657901 2490 * @brief Master Rx Transfer completed callbacks.
mbed_official 226:b062af740e40 2491 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2492 * the configuration information for I2C module
mbed_official 87:085cde657901 2493 * @retval None
mbed_official 87:085cde657901 2494 */
mbed_official 87:085cde657901 2495 __weak void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2496 {
mbed_official 87:085cde657901 2497 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 2498 the HAL_I2C_TxCpltCallback could be implemented in the user file
mbed_official 87:085cde657901 2499 */
mbed_official 87:085cde657901 2500 }
mbed_official 87:085cde657901 2501
mbed_official 87:085cde657901 2502 /** @brief Slave Tx Transfer completed callbacks.
mbed_official 226:b062af740e40 2503 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2504 * the configuration information for I2C module
mbed_official 87:085cde657901 2505 * @retval None
mbed_official 87:085cde657901 2506 */
mbed_official 87:085cde657901 2507 __weak void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2508 {
mbed_official 87:085cde657901 2509 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 2510 the HAL_I2C_TxCpltCallback could be implemented in the user file
mbed_official 87:085cde657901 2511 */
mbed_official 87:085cde657901 2512 }
mbed_official 87:085cde657901 2513
mbed_official 87:085cde657901 2514 /**
mbed_official 87:085cde657901 2515 * @brief Slave Rx Transfer completed callbacks.
mbed_official 226:b062af740e40 2516 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2517 * the configuration information for I2C module
mbed_official 87:085cde657901 2518 * @retval None
mbed_official 87:085cde657901 2519 */
mbed_official 87:085cde657901 2520 __weak void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2521 {
mbed_official 87:085cde657901 2522 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 2523 the HAL_I2C_TxCpltCallback could be implemented in the user file
mbed_official 87:085cde657901 2524 */
mbed_official 87:085cde657901 2525 }
mbed_official 87:085cde657901 2526
mbed_official 87:085cde657901 2527 /**
mbed_official 87:085cde657901 2528 * @brief Memory Tx Transfer completed callbacks.
mbed_official 226:b062af740e40 2529 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2530 * the configuration information for I2C module
mbed_official 87:085cde657901 2531 * @retval None
mbed_official 87:085cde657901 2532 */
mbed_official 87:085cde657901 2533 __weak void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2534 {
mbed_official 87:085cde657901 2535 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 2536 the HAL_I2C_TxCpltCallback could be implemented in the user file
mbed_official 87:085cde657901 2537 */
mbed_official 87:085cde657901 2538 }
mbed_official 87:085cde657901 2539
mbed_official 87:085cde657901 2540 /**
mbed_official 87:085cde657901 2541 * @brief Memory Rx Transfer completed callbacks.
mbed_official 226:b062af740e40 2542 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2543 * the configuration information for I2C module
mbed_official 87:085cde657901 2544 * @retval None
mbed_official 87:085cde657901 2545 */
mbed_official 87:085cde657901 2546 __weak void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2547 {
mbed_official 87:085cde657901 2548 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 2549 the HAL_I2C_TxCpltCallback could be implemented in the user file
mbed_official 87:085cde657901 2550 */
mbed_official 87:085cde657901 2551 }
mbed_official 87:085cde657901 2552
mbed_official 87:085cde657901 2553 /**
mbed_official 87:085cde657901 2554 * @brief I2C error callbacks.
mbed_official 226:b062af740e40 2555 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2556 * the configuration information for I2C module
mbed_official 87:085cde657901 2557 * @retval None
mbed_official 87:085cde657901 2558 */
mbed_official 87:085cde657901 2559 __weak void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2560 {
mbed_official 87:085cde657901 2561 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 2562 the HAL_I2C_ErrorCallback could be implemented in the user file
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
mbed_official 87:085cde657901 2570 /** @defgroup I2C_Group3 Peripheral State and Errors functions
mbed_official 87:085cde657901 2571 * @brief Peripheral State and Errors functions
mbed_official 87:085cde657901 2572 *
mbed_official 87:085cde657901 2573 @verbatim
mbed_official 87:085cde657901 2574 ===============================================================================
mbed_official 87:085cde657901 2575 ##### Peripheral State and Errors functions #####
mbed_official 87:085cde657901 2576 ===============================================================================
mbed_official 87:085cde657901 2577 [..]
mbed_official 226:b062af740e40 2578 This subsection permits to get in run-time the status of the peripheral
mbed_official 87:085cde657901 2579 and the data flow.
mbed_official 87:085cde657901 2580
mbed_official 87:085cde657901 2581 @endverbatim
mbed_official 87:085cde657901 2582 * @{
mbed_official 87:085cde657901 2583 */
mbed_official 87:085cde657901 2584
mbed_official 87:085cde657901 2585 /**
mbed_official 87:085cde657901 2586 * @brief Returns the I2C state.
mbed_official 226:b062af740e40 2587 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2588 * the configuration information for I2C module
mbed_official 87:085cde657901 2589 * @retval HAL state
mbed_official 87:085cde657901 2590 */
mbed_official 87:085cde657901 2591 HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2592 {
mbed_official 87:085cde657901 2593 return hi2c->State;
mbed_official 87:085cde657901 2594 }
mbed_official 87:085cde657901 2595
mbed_official 87:085cde657901 2596 /**
mbed_official 87:085cde657901 2597 * @brief Return the I2C error code
mbed_official 87:085cde657901 2598 * @param hi2c : pointer to a I2C_HandleTypeDef structure that contains
mbed_official 87:085cde657901 2599 * the configuration information for the specified I2C.
mbed_official 87:085cde657901 2600 * @retval I2C Error Code
mbed_official 87:085cde657901 2601 */
mbed_official 87:085cde657901 2602 uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2603 {
mbed_official 87:085cde657901 2604 return hi2c->ErrorCode;
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 /**
mbed_official 87:085cde657901 2612 * @brief Handle TXE flag for Master
mbed_official 226:b062af740e40 2613 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2614 * the configuration information for I2C module
mbed_official 87:085cde657901 2615 * @retval HAL status
mbed_official 87:085cde657901 2616 */
mbed_official 87:085cde657901 2617 static HAL_StatusTypeDef I2C_MasterTransmit_TXE(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2618 {
mbed_official 87:085cde657901 2619 /* Write data to DR */
mbed_official 87:085cde657901 2620 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
mbed_official 87:085cde657901 2621 hi2c->XferCount--;
mbed_official 87:085cde657901 2622
mbed_official 87:085cde657901 2623 if(hi2c->XferCount == 0)
mbed_official 87:085cde657901 2624 {
mbed_official 87:085cde657901 2625 /* Disable BUF interrupt */
mbed_official 87:085cde657901 2626 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
mbed_official 87:085cde657901 2627 }
mbed_official 87:085cde657901 2628
mbed_official 87:085cde657901 2629 return HAL_OK;
mbed_official 87:085cde657901 2630 }
mbed_official 87:085cde657901 2631
mbed_official 87:085cde657901 2632 /**
mbed_official 87:085cde657901 2633 * @brief Handle BTF flag for Master transmitter
mbed_official 226:b062af740e40 2634 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2635 * the configuration information for I2C module
mbed_official 87:085cde657901 2636 * @retval HAL status
mbed_official 87:085cde657901 2637 */
mbed_official 87:085cde657901 2638 static HAL_StatusTypeDef I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2639 {
mbed_official 87:085cde657901 2640 if(hi2c->XferCount != 0)
mbed_official 87:085cde657901 2641 {
mbed_official 87:085cde657901 2642 /* Write data to DR */
mbed_official 87:085cde657901 2643 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
mbed_official 87:085cde657901 2644 hi2c->XferCount--;
mbed_official 87:085cde657901 2645 }
mbed_official 87:085cde657901 2646 else
mbed_official 87:085cde657901 2647 {
mbed_official 87:085cde657901 2648 /* Disable EVT, BUF and ERR interrupt */
mbed_official 87:085cde657901 2649 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
mbed_official 87:085cde657901 2650
mbed_official 87:085cde657901 2651 /* Generate Stop */
mbed_official 87:085cde657901 2652 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 2653
mbed_official 87:085cde657901 2654 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 2655 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 2656 {
mbed_official 87:085cde657901 2657 return HAL_TIMEOUT;
mbed_official 87:085cde657901 2658 }
mbed_official 87:085cde657901 2659
mbed_official 87:085cde657901 2660 if(hi2c->State == HAL_I2C_STATE_MEM_BUSY_TX)
mbed_official 87:085cde657901 2661 {
mbed_official 87:085cde657901 2662 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 2663
mbed_official 87:085cde657901 2664 HAL_I2C_MemTxCpltCallback(hi2c);
mbed_official 87:085cde657901 2665 }
mbed_official 87:085cde657901 2666 else
mbed_official 87:085cde657901 2667 {
mbed_official 87:085cde657901 2668 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 2669
mbed_official 87:085cde657901 2670 HAL_I2C_MasterTxCpltCallback(hi2c);
mbed_official 87:085cde657901 2671 }
mbed_official 87:085cde657901 2672 }
mbed_official 87:085cde657901 2673 return HAL_OK;
mbed_official 87:085cde657901 2674 }
mbed_official 87:085cde657901 2675
mbed_official 87:085cde657901 2676 /**
mbed_official 87:085cde657901 2677 * @brief Handle RXNE flag for Master
mbed_official 226:b062af740e40 2678 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2679 * the configuration information for I2C module
mbed_official 87:085cde657901 2680 * @retval HAL status
mbed_official 87:085cde657901 2681 */
mbed_official 87:085cde657901 2682 static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2683 {
mbed_official 87:085cde657901 2684 uint32_t tmp = 0;
mbed_official 87:085cde657901 2685
mbed_official 87:085cde657901 2686 tmp = hi2c->XferCount;
mbed_official 87:085cde657901 2687 if(tmp > 3)
mbed_official 87:085cde657901 2688 {
mbed_official 87:085cde657901 2689 /* Read data from DR */
mbed_official 87:085cde657901 2690 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 2691 hi2c->XferCount--;
mbed_official 87:085cde657901 2692 }
mbed_official 87:085cde657901 2693 else if((tmp == 2) || (tmp == 3))
mbed_official 87:085cde657901 2694 {
mbed_official 87:085cde657901 2695 /* Disable BUF interrupt */
mbed_official 87:085cde657901 2696 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
mbed_official 87:085cde657901 2697 }
mbed_official 87:085cde657901 2698 else
mbed_official 87:085cde657901 2699 {
mbed_official 87:085cde657901 2700 /* Disable EVT, BUF and ERR interrupt */
mbed_official 87:085cde657901 2701 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
mbed_official 87:085cde657901 2702
mbed_official 87:085cde657901 2703 /* Read data from DR */
mbed_official 87:085cde657901 2704 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 2705 hi2c->XferCount--;
mbed_official 87:085cde657901 2706
mbed_official 87:085cde657901 2707 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 2708 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 2709 {
mbed_official 87:085cde657901 2710 return HAL_TIMEOUT;
mbed_official 87:085cde657901 2711 }
mbed_official 87:085cde657901 2712
mbed_official 87:085cde657901 2713 if(hi2c->State == HAL_I2C_STATE_MEM_BUSY_RX)
mbed_official 87:085cde657901 2714 {
mbed_official 87:085cde657901 2715 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 2716
mbed_official 87:085cde657901 2717 HAL_I2C_MemRxCpltCallback(hi2c);
mbed_official 87:085cde657901 2718 }
mbed_official 87:085cde657901 2719 else
mbed_official 87:085cde657901 2720 {
mbed_official 87:085cde657901 2721 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 2722
mbed_official 87:085cde657901 2723 HAL_I2C_MasterRxCpltCallback(hi2c);
mbed_official 87:085cde657901 2724 }
mbed_official 87:085cde657901 2725 }
mbed_official 87:085cde657901 2726 return HAL_OK;
mbed_official 87:085cde657901 2727 }
mbed_official 87:085cde657901 2728
mbed_official 87:085cde657901 2729 /**
mbed_official 87:085cde657901 2730 * @brief Handle BTF flag for Master receiver
mbed_official 226:b062af740e40 2731 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2732 * the configuration information for I2C module
mbed_official 87:085cde657901 2733 * @retval HAL status
mbed_official 87:085cde657901 2734 */
mbed_official 87:085cde657901 2735 static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2736 {
mbed_official 87:085cde657901 2737 if(hi2c->XferCount == 3)
mbed_official 87:085cde657901 2738 {
mbed_official 87:085cde657901 2739 /* Disable Acknowledge */
mbed_official 87:085cde657901 2740 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 2741
mbed_official 87:085cde657901 2742 /* Read data from DR */
mbed_official 87:085cde657901 2743 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 2744 hi2c->XferCount--;
mbed_official 87:085cde657901 2745 }
mbed_official 87:085cde657901 2746 else if(hi2c->XferCount == 2)
mbed_official 87:085cde657901 2747 {
mbed_official 87:085cde657901 2748 /* Generate Stop */
mbed_official 87:085cde657901 2749 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 2750
mbed_official 87:085cde657901 2751 /* Read data from DR */
mbed_official 87:085cde657901 2752 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 2753 hi2c->XferCount--;
mbed_official 87:085cde657901 2754
mbed_official 87:085cde657901 2755 /* Read data from DR */
mbed_official 87:085cde657901 2756 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 2757 hi2c->XferCount--;
mbed_official 87:085cde657901 2758
mbed_official 87:085cde657901 2759 /* Disable EVT and ERR interrupt */
mbed_official 87:085cde657901 2760 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
mbed_official 87:085cde657901 2761
mbed_official 87:085cde657901 2762 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 2763 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 2764 {
mbed_official 87:085cde657901 2765 return HAL_TIMEOUT;
mbed_official 87:085cde657901 2766 }
mbed_official 87:085cde657901 2767
mbed_official 87:085cde657901 2768 if(hi2c->State == HAL_I2C_STATE_MEM_BUSY_RX)
mbed_official 87:085cde657901 2769 {
mbed_official 87:085cde657901 2770 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 2771
mbed_official 87:085cde657901 2772 HAL_I2C_MemRxCpltCallback(hi2c);
mbed_official 87:085cde657901 2773 }
mbed_official 87:085cde657901 2774 else
mbed_official 87:085cde657901 2775 {
mbed_official 87:085cde657901 2776 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 2777
mbed_official 87:085cde657901 2778 HAL_I2C_MasterRxCpltCallback(hi2c);
mbed_official 87:085cde657901 2779 }
mbed_official 87:085cde657901 2780 }
mbed_official 87:085cde657901 2781 else
mbed_official 87:085cde657901 2782 {
mbed_official 87:085cde657901 2783 /* Read data from DR */
mbed_official 87:085cde657901 2784 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 2785 hi2c->XferCount--;
mbed_official 87:085cde657901 2786 }
mbed_official 87:085cde657901 2787 return HAL_OK;
mbed_official 87:085cde657901 2788 }
mbed_official 87:085cde657901 2789
mbed_official 87:085cde657901 2790 /**
mbed_official 87:085cde657901 2791 * @brief Handle TXE flag for Slave
mbed_official 226:b062af740e40 2792 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2793 * the configuration information for I2C module
mbed_official 87:085cde657901 2794 * @retval HAL status
mbed_official 87:085cde657901 2795 */
mbed_official 87:085cde657901 2796 static HAL_StatusTypeDef I2C_SlaveTransmit_TXE(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2797 {
mbed_official 369:2e96f1b71984 2798 if(hi2c->XferCount != 0)
mbed_official 87:085cde657901 2799 {
mbed_official 87:085cde657901 2800 /* Write data to DR */
mbed_official 87:085cde657901 2801 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
mbed_official 87:085cde657901 2802 hi2c->XferCount--;
mbed_official 87:085cde657901 2803 }
mbed_official 87:085cde657901 2804 return HAL_OK;
mbed_official 87:085cde657901 2805 }
mbed_official 87:085cde657901 2806
mbed_official 87:085cde657901 2807 /**
mbed_official 87:085cde657901 2808 * @brief Handle BTF flag for Slave transmitter
mbed_official 226:b062af740e40 2809 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2810 * the configuration information for I2C module
mbed_official 87:085cde657901 2811 * @retval HAL status
mbed_official 87:085cde657901 2812 */
mbed_official 87:085cde657901 2813 static HAL_StatusTypeDef I2C_SlaveTransmit_BTF(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2814 {
mbed_official 369:2e96f1b71984 2815 if(hi2c->XferCount != 0)
mbed_official 87:085cde657901 2816 {
mbed_official 87:085cde657901 2817 /* Write data to DR */
mbed_official 87:085cde657901 2818 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
mbed_official 87:085cde657901 2819 hi2c->XferCount--;
mbed_official 87:085cde657901 2820 }
mbed_official 87:085cde657901 2821 return HAL_OK;
mbed_official 87:085cde657901 2822 }
mbed_official 87:085cde657901 2823
mbed_official 87:085cde657901 2824 /**
mbed_official 87:085cde657901 2825 * @brief Handle RXNE flag for Slave
mbed_official 226:b062af740e40 2826 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2827 * the configuration information for I2C module
mbed_official 87:085cde657901 2828 * @retval HAL status
mbed_official 87:085cde657901 2829 */
mbed_official 87:085cde657901 2830 static HAL_StatusTypeDef I2C_SlaveReceive_RXNE(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2831 {
mbed_official 369:2e96f1b71984 2832 if(hi2c->XferCount != 0)
mbed_official 87:085cde657901 2833 {
mbed_official 87:085cde657901 2834 /* Read data from DR */
mbed_official 87:085cde657901 2835 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 2836 hi2c->XferCount--;
mbed_official 87:085cde657901 2837 }
mbed_official 87:085cde657901 2838 return HAL_OK;
mbed_official 87:085cde657901 2839 }
mbed_official 87:085cde657901 2840
mbed_official 87:085cde657901 2841 /**
mbed_official 87:085cde657901 2842 * @brief Handle BTF flag for Slave receiver
mbed_official 226:b062af740e40 2843 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2844 * the configuration information for I2C module
mbed_official 87:085cde657901 2845 * @retval HAL status
mbed_official 87:085cde657901 2846 */
mbed_official 87:085cde657901 2847 static HAL_StatusTypeDef I2C_SlaveReceive_BTF(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2848 {
mbed_official 369:2e96f1b71984 2849 if(hi2c->XferCount != 0)
mbed_official 87:085cde657901 2850 {
mbed_official 87:085cde657901 2851 /* Read data from DR */
mbed_official 87:085cde657901 2852 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
mbed_official 87:085cde657901 2853 hi2c->XferCount--;
mbed_official 87:085cde657901 2854 }
mbed_official 87:085cde657901 2855 return HAL_OK;
mbed_official 87:085cde657901 2856 }
mbed_official 87:085cde657901 2857
mbed_official 87:085cde657901 2858 /**
mbed_official 87:085cde657901 2859 * @brief Handle ADD flag for Slave
mbed_official 226:b062af740e40 2860 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2861 * the configuration information for I2C module
mbed_official 87:085cde657901 2862 * @retval HAL status
mbed_official 87:085cde657901 2863 */
mbed_official 87:085cde657901 2864 static HAL_StatusTypeDef I2C_Slave_ADDR(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2865 {
mbed_official 87:085cde657901 2866 /* Clear ADDR flag */
mbed_official 87:085cde657901 2867 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 2868
mbed_official 87:085cde657901 2869 return HAL_OK;
mbed_official 87:085cde657901 2870 }
mbed_official 87:085cde657901 2871
mbed_official 87:085cde657901 2872 /**
mbed_official 87:085cde657901 2873 * @brief Handle STOPF flag for Slave
mbed_official 226:b062af740e40 2874 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2875 * the configuration information for I2C module
mbed_official 87:085cde657901 2876 * @retval HAL status
mbed_official 87:085cde657901 2877 */
mbed_official 87:085cde657901 2878 static HAL_StatusTypeDef I2C_Slave_STOPF(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2879 {
mbed_official 87:085cde657901 2880 /* Disable EVT, BUF and ERR interrupt */
mbed_official 87:085cde657901 2881 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
mbed_official 87:085cde657901 2882
mbed_official 87:085cde657901 2883 /* Clear STOPF flag */
mbed_official 87:085cde657901 2884 __HAL_I2C_CLEAR_STOPFLAG(hi2c);
mbed_official 87:085cde657901 2885
mbed_official 87:085cde657901 2886 /* Disable Acknowledge */
mbed_official 87:085cde657901 2887 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 2888
mbed_official 87:085cde657901 2889 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 2890 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 2891 {
mbed_official 87:085cde657901 2892 return HAL_TIMEOUT;
mbed_official 87:085cde657901 2893 }
mbed_official 87:085cde657901 2894
mbed_official 87:085cde657901 2895 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 2896
mbed_official 87:085cde657901 2897 HAL_I2C_SlaveRxCpltCallback(hi2c);
mbed_official 87:085cde657901 2898
mbed_official 87:085cde657901 2899 return HAL_OK;
mbed_official 87:085cde657901 2900 }
mbed_official 87:085cde657901 2901
mbed_official 87:085cde657901 2902 /**
mbed_official 226:b062af740e40 2903 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2904 * the configuration information for I2C module
mbed_official 87:085cde657901 2905 * @retval HAL status
mbed_official 87:085cde657901 2906 */
mbed_official 87:085cde657901 2907 static HAL_StatusTypeDef I2C_Slave_AF(I2C_HandleTypeDef *hi2c)
mbed_official 87:085cde657901 2908 {
mbed_official 87:085cde657901 2909 /* Disable EVT, BUF and ERR interrupt */
mbed_official 87:085cde657901 2910 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
mbed_official 87:085cde657901 2911
mbed_official 87:085cde657901 2912 /* Clear AF flag */
mbed_official 87:085cde657901 2913 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
mbed_official 87:085cde657901 2914
mbed_official 87:085cde657901 2915 /* Disable Acknowledge */
mbed_official 87:085cde657901 2916 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 2917
mbed_official 87:085cde657901 2918 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 2919 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 2920 {
mbed_official 87:085cde657901 2921 return HAL_TIMEOUT;
mbed_official 87:085cde657901 2922 }
mbed_official 87:085cde657901 2923
mbed_official 87:085cde657901 2924 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 2925
mbed_official 87:085cde657901 2926 HAL_I2C_SlaveTxCpltCallback(hi2c);
mbed_official 87:085cde657901 2927
mbed_official 87:085cde657901 2928 return HAL_OK;
mbed_official 87:085cde657901 2929 }
mbed_official 87:085cde657901 2930
mbed_official 87:085cde657901 2931 /**
mbed_official 226:b062af740e40 2932 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2933 * the configuration information for I2C module
mbed_official 87:085cde657901 2934 * @param DevAddress: Target device address
mbed_official 87:085cde657901 2935 * @retval HAL status
mbed_official 87:085cde657901 2936 */
mbed_official 87:085cde657901 2937 static HAL_StatusTypeDef I2C_MasterRequestWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout)
mbed_official 87:085cde657901 2938 {
mbed_official 87:085cde657901 2939 /* Generate Start */
mbed_official 87:085cde657901 2940 hi2c->Instance->CR1 |= I2C_CR1_START;
mbed_official 87:085cde657901 2941
mbed_official 87:085cde657901 2942 /* Wait until SB flag is set */
mbed_official 87:085cde657901 2943 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 2944 {
mbed_official 87:085cde657901 2945 return HAL_TIMEOUT;
mbed_official 87:085cde657901 2946 }
mbed_official 87:085cde657901 2947
mbed_official 87:085cde657901 2948 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
mbed_official 87:085cde657901 2949 {
mbed_official 87:085cde657901 2950 /* Send slave address */
mbed_official 87:085cde657901 2951 hi2c->Instance->DR = __HAL_I2C_7BIT_ADD_WRITE(DevAddress);
mbed_official 87:085cde657901 2952 }
mbed_official 87:085cde657901 2953 else
mbed_official 87:085cde657901 2954 {
mbed_official 87:085cde657901 2955 /* Send header of slave address */
mbed_official 87:085cde657901 2956 hi2c->Instance->DR = __HAL_I2C_10BIT_HEADER_WRITE(DevAddress);
mbed_official 87:085cde657901 2957
mbed_official 87:085cde657901 2958 /* Wait until ADD10 flag is set */
mbed_official 87:085cde657901 2959 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADD10, Timeout) != HAL_OK)
mbed_official 87:085cde657901 2960 {
mbed_official 87:085cde657901 2961 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 2962 {
mbed_official 87:085cde657901 2963 return HAL_ERROR;
mbed_official 87:085cde657901 2964 }
mbed_official 87:085cde657901 2965 else
mbed_official 87:085cde657901 2966 {
mbed_official 87:085cde657901 2967 return HAL_TIMEOUT;
mbed_official 87:085cde657901 2968 }
mbed_official 87:085cde657901 2969 }
mbed_official 87:085cde657901 2970
mbed_official 87:085cde657901 2971 /* Send slave address */
mbed_official 87:085cde657901 2972 hi2c->Instance->DR = __HAL_I2C_10BIT_ADDRESS(DevAddress);
mbed_official 87:085cde657901 2973 }
mbed_official 87:085cde657901 2974
mbed_official 87:085cde657901 2975 /* Wait until ADDR flag is set */
mbed_official 87:085cde657901 2976 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout) != HAL_OK)
mbed_official 87:085cde657901 2977 {
mbed_official 87:085cde657901 2978 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 2979 {
mbed_official 87:085cde657901 2980 return HAL_ERROR;
mbed_official 87:085cde657901 2981 }
mbed_official 87:085cde657901 2982 else
mbed_official 87:085cde657901 2983 {
mbed_official 87:085cde657901 2984 return HAL_TIMEOUT;
mbed_official 87:085cde657901 2985 }
mbed_official 87:085cde657901 2986 }
mbed_official 87:085cde657901 2987
mbed_official 87:085cde657901 2988 return HAL_OK;
mbed_official 87:085cde657901 2989 }
mbed_official 87:085cde657901 2990
mbed_official 87:085cde657901 2991 /**
mbed_official 87:085cde657901 2992 * @brief Master sends target device address for read request.
mbed_official 226:b062af740e40 2993 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 2994 * the configuration information for I2C module
mbed_official 87:085cde657901 2995 * @param DevAddress: Target device address
mbed_official 87:085cde657901 2996 * @retval HAL status
mbed_official 87:085cde657901 2997 */
mbed_official 87:085cde657901 2998 static HAL_StatusTypeDef I2C_MasterRequestRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout)
mbed_official 87:085cde657901 2999 {
mbed_official 87:085cde657901 3000 /* Enable Acknowledge */
mbed_official 87:085cde657901 3001 hi2c->Instance->CR1 |= I2C_CR1_ACK;
mbed_official 87:085cde657901 3002
mbed_official 87:085cde657901 3003 /* Generate Start */
mbed_official 87:085cde657901 3004 hi2c->Instance->CR1 |= I2C_CR1_START;
mbed_official 87:085cde657901 3005
mbed_official 87:085cde657901 3006 /* Wait until SB flag is set */
mbed_official 87:085cde657901 3007 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3008 {
mbed_official 87:085cde657901 3009 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3010 }
mbed_official 87:085cde657901 3011
mbed_official 87:085cde657901 3012 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
mbed_official 87:085cde657901 3013 {
mbed_official 87:085cde657901 3014 /* Send slave address */
mbed_official 87:085cde657901 3015 hi2c->Instance->DR = __HAL_I2C_7BIT_ADD_READ(DevAddress);
mbed_official 87:085cde657901 3016 }
mbed_official 87:085cde657901 3017 else
mbed_official 87:085cde657901 3018 {
mbed_official 87:085cde657901 3019 /* Send header of slave address */
mbed_official 87:085cde657901 3020 hi2c->Instance->DR = __HAL_I2C_10BIT_HEADER_WRITE(DevAddress);
mbed_official 87:085cde657901 3021
mbed_official 87:085cde657901 3022 /* Wait until ADD10 flag is set */
mbed_official 87:085cde657901 3023 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADD10, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3024 {
mbed_official 87:085cde657901 3025 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 3026 {
mbed_official 87:085cde657901 3027 return HAL_ERROR;
mbed_official 87:085cde657901 3028 }
mbed_official 87:085cde657901 3029 else
mbed_official 87:085cde657901 3030 {
mbed_official 87:085cde657901 3031 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3032 }
mbed_official 87:085cde657901 3033 }
mbed_official 87:085cde657901 3034
mbed_official 87:085cde657901 3035 /* Send slave address */
mbed_official 87:085cde657901 3036 hi2c->Instance->DR = __HAL_I2C_10BIT_ADDRESS(DevAddress);
mbed_official 87:085cde657901 3037
mbed_official 87:085cde657901 3038 /* Wait until ADDR flag is set */
mbed_official 87:085cde657901 3039 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3040 {
mbed_official 87:085cde657901 3041 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 3042 {
mbed_official 87:085cde657901 3043 return HAL_ERROR;
mbed_official 87:085cde657901 3044 }
mbed_official 87:085cde657901 3045 else
mbed_official 87:085cde657901 3046 {
mbed_official 87:085cde657901 3047 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3048 }
mbed_official 87:085cde657901 3049 }
mbed_official 87:085cde657901 3050
mbed_official 87:085cde657901 3051 /* Clear ADDR flag */
mbed_official 87:085cde657901 3052 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 3053
mbed_official 87:085cde657901 3054 /* Generate Restart */
mbed_official 87:085cde657901 3055 hi2c->Instance->CR1 |= I2C_CR1_START;
mbed_official 87:085cde657901 3056
mbed_official 87:085cde657901 3057 /* Wait until SB flag is set */
mbed_official 87:085cde657901 3058 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3059 {
mbed_official 87:085cde657901 3060 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3061 }
mbed_official 87:085cde657901 3062
mbed_official 87:085cde657901 3063 /* Send header of slave address */
mbed_official 87:085cde657901 3064 hi2c->Instance->DR = __HAL_I2C_10BIT_HEADER_READ(DevAddress);
mbed_official 87:085cde657901 3065 }
mbed_official 87:085cde657901 3066
mbed_official 87:085cde657901 3067 /* Wait until ADDR flag is set */
mbed_official 87:085cde657901 3068 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3069 {
mbed_official 87:085cde657901 3070 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 3071 {
mbed_official 87:085cde657901 3072 return HAL_ERROR;
mbed_official 87:085cde657901 3073 }
mbed_official 87:085cde657901 3074 else
mbed_official 87:085cde657901 3075 {
mbed_official 87:085cde657901 3076 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3077 }
mbed_official 87:085cde657901 3078 }
mbed_official 87:085cde657901 3079
mbed_official 87:085cde657901 3080 return HAL_OK;
mbed_official 87:085cde657901 3081 }
mbed_official 87:085cde657901 3082
mbed_official 87:085cde657901 3083 /**
mbed_official 87:085cde657901 3084 * @brief Master sends target device address followed by internal memory address for write request.
mbed_official 226:b062af740e40 3085 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 3086 * the configuration information for I2C module
mbed_official 87:085cde657901 3087 * @param DevAddress: Target device address
mbed_official 87:085cde657901 3088 * @param MemAddress: Internal memory address
mbed_official 87:085cde657901 3089 * @param MemAddSize: Size of internal memory address
mbed_official 87:085cde657901 3090 * @retval HAL status
mbed_official 87:085cde657901 3091 */
mbed_official 87:085cde657901 3092 static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout)
mbed_official 87:085cde657901 3093 {
mbed_official 87:085cde657901 3094 /* Generate Start */
mbed_official 87:085cde657901 3095 hi2c->Instance->CR1 |= I2C_CR1_START;
mbed_official 87:085cde657901 3096
mbed_official 87:085cde657901 3097 /* Wait until SB flag is set */
mbed_official 87:085cde657901 3098 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3099 {
mbed_official 87:085cde657901 3100 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3101 }
mbed_official 87:085cde657901 3102
mbed_official 87:085cde657901 3103 /* Send slave address */
mbed_official 87:085cde657901 3104 hi2c->Instance->DR = __HAL_I2C_7BIT_ADD_WRITE(DevAddress);
mbed_official 87:085cde657901 3105
mbed_official 87:085cde657901 3106 /* Wait until ADDR flag is set */
mbed_official 87:085cde657901 3107 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3108 {
mbed_official 87:085cde657901 3109 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 3110 {
mbed_official 87:085cde657901 3111 return HAL_ERROR;
mbed_official 87:085cde657901 3112 }
mbed_official 87:085cde657901 3113 else
mbed_official 87:085cde657901 3114 {
mbed_official 87:085cde657901 3115 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3116 }
mbed_official 87:085cde657901 3117 }
mbed_official 87:085cde657901 3118
mbed_official 87:085cde657901 3119 /* Clear ADDR flag */
mbed_official 87:085cde657901 3120 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 3121
mbed_official 87:085cde657901 3122 /* Wait until TXE flag is set */
mbed_official 87:085cde657901 3123 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3124 {
mbed_official 87:085cde657901 3125 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3126 }
mbed_official 87:085cde657901 3127
mbed_official 87:085cde657901 3128 /* If Memory address size is 8Bit */
mbed_official 87:085cde657901 3129 if(MemAddSize == I2C_MEMADD_SIZE_8BIT)
mbed_official 87:085cde657901 3130 {
mbed_official 87:085cde657901 3131 /* Send Memory Address */
mbed_official 87:085cde657901 3132 hi2c->Instance->DR = __HAL_I2C_MEM_ADD_LSB(MemAddress);
mbed_official 87:085cde657901 3133 }
mbed_official 87:085cde657901 3134 /* If Memory address size is 16Bit */
mbed_official 87:085cde657901 3135 else
mbed_official 87:085cde657901 3136 {
mbed_official 87:085cde657901 3137 /* Send MSB of Memory Address */
mbed_official 87:085cde657901 3138 hi2c->Instance->DR = __HAL_I2C_MEM_ADD_MSB(MemAddress);
mbed_official 87:085cde657901 3139
mbed_official 87:085cde657901 3140 /* Wait until TXE flag is set */
mbed_official 87:085cde657901 3141 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3142 {
mbed_official 87:085cde657901 3143 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3144 }
mbed_official 87:085cde657901 3145
mbed_official 87:085cde657901 3146 /* Send LSB of Memory Address */
mbed_official 87:085cde657901 3147 hi2c->Instance->DR = __HAL_I2C_MEM_ADD_LSB(MemAddress);
mbed_official 87:085cde657901 3148 }
mbed_official 87:085cde657901 3149
mbed_official 87:085cde657901 3150 return HAL_OK;
mbed_official 87:085cde657901 3151 }
mbed_official 87:085cde657901 3152
mbed_official 87:085cde657901 3153 /**
mbed_official 87:085cde657901 3154 * @brief Master sends target device address followed by internal memory address for read request.
mbed_official 226:b062af740e40 3155 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 3156 * the configuration information for I2C module
mbed_official 87:085cde657901 3157 * @param DevAddress: Target device address
mbed_official 87:085cde657901 3158 * @param MemAddress: Internal memory address
mbed_official 87:085cde657901 3159 * @param MemAddSize: Size of internal memory address
mbed_official 87:085cde657901 3160 * @retval HAL status
mbed_official 87:085cde657901 3161 */
mbed_official 87:085cde657901 3162 static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout)
mbed_official 87:085cde657901 3163 {
mbed_official 87:085cde657901 3164 /* Enable Acknowledge */
mbed_official 87:085cde657901 3165 hi2c->Instance->CR1 |= I2C_CR1_ACK;
mbed_official 87:085cde657901 3166
mbed_official 87:085cde657901 3167 /* Generate Start */
mbed_official 87:085cde657901 3168 hi2c->Instance->CR1 |= I2C_CR1_START;
mbed_official 87:085cde657901 3169
mbed_official 87:085cde657901 3170 /* Wait until SB flag is set */
mbed_official 87:085cde657901 3171 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3172 {
mbed_official 87:085cde657901 3173 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3174 }
mbed_official 87:085cde657901 3175
mbed_official 87:085cde657901 3176 /* Send slave address */
mbed_official 87:085cde657901 3177 hi2c->Instance->DR = __HAL_I2C_7BIT_ADD_WRITE(DevAddress);
mbed_official 87:085cde657901 3178
mbed_official 87:085cde657901 3179 /* Wait until ADDR flag is set */
mbed_official 87:085cde657901 3180 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3181 {
mbed_official 87:085cde657901 3182 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 3183 {
mbed_official 87:085cde657901 3184 return HAL_ERROR;
mbed_official 87:085cde657901 3185 }
mbed_official 87:085cde657901 3186 else
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
mbed_official 87:085cde657901 3192 /* Clear ADDR flag */
mbed_official 87:085cde657901 3193 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
mbed_official 87:085cde657901 3194
mbed_official 87:085cde657901 3195 /* Wait until TXE flag is set */
mbed_official 87:085cde657901 3196 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3197 {
mbed_official 87:085cde657901 3198 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3199 }
mbed_official 87:085cde657901 3200
mbed_official 87:085cde657901 3201 /* If Memory address size is 8Bit */
mbed_official 87:085cde657901 3202 if(MemAddSize == I2C_MEMADD_SIZE_8BIT)
mbed_official 87:085cde657901 3203 {
mbed_official 87:085cde657901 3204 /* Send Memory Address */
mbed_official 87:085cde657901 3205 hi2c->Instance->DR = __HAL_I2C_MEM_ADD_LSB(MemAddress);
mbed_official 87:085cde657901 3206 }
mbed_official 87:085cde657901 3207 /* If Memory address size is 16Bit */
mbed_official 87:085cde657901 3208 else
mbed_official 87:085cde657901 3209 {
mbed_official 87:085cde657901 3210 /* Send MSB of Memory Address */
mbed_official 87:085cde657901 3211 hi2c->Instance->DR = __HAL_I2C_MEM_ADD_MSB(MemAddress);
mbed_official 87:085cde657901 3212
mbed_official 87:085cde657901 3213 /* Wait until TXE flag is set */
mbed_official 87:085cde657901 3214 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3215 {
mbed_official 87:085cde657901 3216 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3217 }
mbed_official 87:085cde657901 3218
mbed_official 87:085cde657901 3219 /* Send LSB of 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
mbed_official 87:085cde657901 3223 /* Wait until TXE flag is set */
mbed_official 87:085cde657901 3224 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3225 {
mbed_official 87:085cde657901 3226 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3227 }
mbed_official 87:085cde657901 3228
mbed_official 87:085cde657901 3229 /* Generate Restart */
mbed_official 87:085cde657901 3230 hi2c->Instance->CR1 |= I2C_CR1_START;
mbed_official 87:085cde657901 3231
mbed_official 87:085cde657901 3232 /* Wait until SB flag is set */
mbed_official 87:085cde657901 3233 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3234 {
mbed_official 87:085cde657901 3235 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3236 }
mbed_official 87:085cde657901 3237
mbed_official 87:085cde657901 3238 /* Send slave address */
mbed_official 87:085cde657901 3239 hi2c->Instance->DR = __HAL_I2C_7BIT_ADD_READ(DevAddress);
mbed_official 87:085cde657901 3240
mbed_official 87:085cde657901 3241 /* Wait until ADDR flag is set */
mbed_official 87:085cde657901 3242 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout) != HAL_OK)
mbed_official 87:085cde657901 3243 {
mbed_official 87:085cde657901 3244 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
mbed_official 87:085cde657901 3245 {
mbed_official 87:085cde657901 3246 return HAL_ERROR;
mbed_official 87:085cde657901 3247 }
mbed_official 87:085cde657901 3248 else
mbed_official 87:085cde657901 3249 {
mbed_official 87:085cde657901 3250 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3251 }
mbed_official 87:085cde657901 3252 }
mbed_official 87:085cde657901 3253
mbed_official 87:085cde657901 3254 return HAL_OK;
mbed_official 87:085cde657901 3255 }
mbed_official 87:085cde657901 3256
mbed_official 87:085cde657901 3257 /**
mbed_official 87:085cde657901 3258 * @brief DMA I2C master transmit process complete callback.
mbed_official 87:085cde657901 3259 * @param hdma: DMA handle
mbed_official 87:085cde657901 3260 * @retval None
mbed_official 87:085cde657901 3261 */
mbed_official 87:085cde657901 3262 static void I2C_DMAMasterTransmitCplt(DMA_HandleTypeDef *hdma)
mbed_official 87:085cde657901 3263 {
mbed_official 87:085cde657901 3264 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 87:085cde657901 3265
mbed_official 87:085cde657901 3266 /* Wait until BTF flag is reset */
mbed_official 87:085cde657901 3267 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 3268 {
mbed_official 87:085cde657901 3269 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
mbed_official 87:085cde657901 3270 }
mbed_official 87:085cde657901 3271
mbed_official 87:085cde657901 3272 /* Generate Stop */
mbed_official 87:085cde657901 3273 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 3274
mbed_official 87:085cde657901 3275 /* Disable DMA Request */
mbed_official 87:085cde657901 3276 hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN;
mbed_official 87:085cde657901 3277
mbed_official 87:085cde657901 3278 hi2c->XferCount = 0;
mbed_official 87:085cde657901 3279
mbed_official 87:085cde657901 3280 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 3281 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 3282 {
mbed_official 87:085cde657901 3283 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
mbed_official 87:085cde657901 3284 }
mbed_official 87:085cde657901 3285
mbed_official 87:085cde657901 3286 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 3287
mbed_official 87:085cde657901 3288 /* Check if Errors has been detected during transfer */
mbed_official 87:085cde657901 3289 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
mbed_official 87:085cde657901 3290 {
mbed_official 87:085cde657901 3291 HAL_I2C_ErrorCallback(hi2c);
mbed_official 87:085cde657901 3292 }
mbed_official 87:085cde657901 3293 else
mbed_official 87:085cde657901 3294 {
mbed_official 87:085cde657901 3295 HAL_I2C_MasterTxCpltCallback(hi2c);
mbed_official 87:085cde657901 3296 }
mbed_official 87:085cde657901 3297 }
mbed_official 87:085cde657901 3298
mbed_official 87:085cde657901 3299 /**
mbed_official 87:085cde657901 3300 * @brief DMA I2C slave transmit process complete callback.
mbed_official 87:085cde657901 3301 * @param hdma: DMA handle
mbed_official 87:085cde657901 3302 * @retval None
mbed_official 87:085cde657901 3303 */
mbed_official 87:085cde657901 3304 static void I2C_DMASlaveTransmitCplt(DMA_HandleTypeDef *hdma)
mbed_official 87:085cde657901 3305 {
mbed_official 87:085cde657901 3306 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 87:085cde657901 3307
mbed_official 87:085cde657901 3308 /* Wait until AF flag is reset */
mbed_official 87:085cde657901 3309 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_AF, RESET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 3310 {
mbed_official 87:085cde657901 3311 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
mbed_official 87:085cde657901 3312 }
mbed_official 87:085cde657901 3313
mbed_official 87:085cde657901 3314 /* Clear AF flag */
mbed_official 87:085cde657901 3315 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
mbed_official 87:085cde657901 3316
mbed_official 87:085cde657901 3317 /* Disable Address Acknowledge */
mbed_official 87:085cde657901 3318 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 3319
mbed_official 87:085cde657901 3320 /* Disable DMA Request */
mbed_official 87:085cde657901 3321 hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN;
mbed_official 87:085cde657901 3322
mbed_official 87:085cde657901 3323 hi2c->XferCount = 0;
mbed_official 87:085cde657901 3324
mbed_official 87:085cde657901 3325 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 3326 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 3327 {
mbed_official 87:085cde657901 3328 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
mbed_official 87:085cde657901 3329 }
mbed_official 87:085cde657901 3330
mbed_official 87:085cde657901 3331 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 3332
mbed_official 87:085cde657901 3333 /* Check if Errors has been detected during transfer */
mbed_official 87:085cde657901 3334 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
mbed_official 87:085cde657901 3335 {
mbed_official 87:085cde657901 3336 HAL_I2C_ErrorCallback(hi2c);
mbed_official 87:085cde657901 3337 }
mbed_official 87:085cde657901 3338 else
mbed_official 87:085cde657901 3339 {
mbed_official 87:085cde657901 3340 HAL_I2C_SlaveTxCpltCallback(hi2c);
mbed_official 87:085cde657901 3341 }
mbed_official 87:085cde657901 3342 }
mbed_official 87:085cde657901 3343
mbed_official 87:085cde657901 3344 /**
mbed_official 87:085cde657901 3345 * @brief DMA I2C master receive process complete callback
mbed_official 87:085cde657901 3346 * @param hdma: DMA handle
mbed_official 87:085cde657901 3347 * @retval None
mbed_official 87:085cde657901 3348 */
mbed_official 87:085cde657901 3349 static void I2C_DMAMasterReceiveCplt(DMA_HandleTypeDef *hdma)
mbed_official 87:085cde657901 3350 {
mbed_official 87:085cde657901 3351 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 87:085cde657901 3352
mbed_official 87:085cde657901 3353 /* Generate Stop */
mbed_official 87:085cde657901 3354 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 3355
mbed_official 87:085cde657901 3356 /* Disable Last DMA */
mbed_official 87:085cde657901 3357 hi2c->Instance->CR2 &= ~I2C_CR2_LAST;
mbed_official 87:085cde657901 3358
mbed_official 87:085cde657901 3359 /* Disable Acknowledge */
mbed_official 87:085cde657901 3360 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 3361
mbed_official 87:085cde657901 3362 /* Disable DMA Request */
mbed_official 87:085cde657901 3363 hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN;
mbed_official 87:085cde657901 3364
mbed_official 87:085cde657901 3365 hi2c->XferCount = 0;
mbed_official 87:085cde657901 3366
mbed_official 87:085cde657901 3367 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 3368 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 3369 {
mbed_official 87:085cde657901 3370 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
mbed_official 87:085cde657901 3371 }
mbed_official 87:085cde657901 3372
mbed_official 87:085cde657901 3373 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 3374
mbed_official 87:085cde657901 3375 /* Check if Errors has been detected during transfer */
mbed_official 87:085cde657901 3376 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
mbed_official 87:085cde657901 3377 {
mbed_official 87:085cde657901 3378 HAL_I2C_ErrorCallback(hi2c);
mbed_official 87:085cde657901 3379 }
mbed_official 87:085cde657901 3380 else
mbed_official 87:085cde657901 3381 {
mbed_official 87:085cde657901 3382 HAL_I2C_MasterRxCpltCallback(hi2c);
mbed_official 87:085cde657901 3383 }
mbed_official 87:085cde657901 3384 }
mbed_official 87:085cde657901 3385
mbed_official 87:085cde657901 3386 /**
mbed_official 87:085cde657901 3387 * @brief DMA I2C slave receive process complete callback.
mbed_official 87:085cde657901 3388 * @param hdma: DMA handle
mbed_official 87:085cde657901 3389 * @retval None
mbed_official 87:085cde657901 3390 */
mbed_official 87:085cde657901 3391 static void I2C_DMASlaveReceiveCplt(DMA_HandleTypeDef *hdma)
mbed_official 87:085cde657901 3392 {
mbed_official 87:085cde657901 3393 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 87:085cde657901 3394
mbed_official 87:085cde657901 3395 /* Wait until STOPF flag is reset */
mbed_official 87:085cde657901 3396 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_STOPF, RESET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 3397 {
mbed_official 87:085cde657901 3398 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
mbed_official 87:085cde657901 3399 }
mbed_official 87:085cde657901 3400
mbed_official 87:085cde657901 3401 /* Clear STOPF flag */
mbed_official 87:085cde657901 3402 __HAL_I2C_CLEAR_STOPFLAG(hi2c);
mbed_official 87:085cde657901 3403
mbed_official 87:085cde657901 3404 /* Disable Address Acknowledge */
mbed_official 87:085cde657901 3405 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 3406
mbed_official 87:085cde657901 3407 /* Disable DMA Request */
mbed_official 87:085cde657901 3408 hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN;
mbed_official 87:085cde657901 3409
mbed_official 87:085cde657901 3410 hi2c->XferCount = 0;
mbed_official 87:085cde657901 3411
mbed_official 87:085cde657901 3412 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 3413 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 3414 {
mbed_official 87:085cde657901 3415 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
mbed_official 87:085cde657901 3416 }
mbed_official 87:085cde657901 3417
mbed_official 87:085cde657901 3418 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 3419
mbed_official 87:085cde657901 3420 /* Check if Errors has been detected during transfer */
mbed_official 87:085cde657901 3421 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
mbed_official 87:085cde657901 3422 {
mbed_official 87:085cde657901 3423 HAL_I2C_ErrorCallback(hi2c);
mbed_official 87:085cde657901 3424 }
mbed_official 87:085cde657901 3425 else
mbed_official 87:085cde657901 3426 {
mbed_official 87:085cde657901 3427 HAL_I2C_SlaveRxCpltCallback(hi2c);
mbed_official 87:085cde657901 3428 }
mbed_official 87:085cde657901 3429 }
mbed_official 87:085cde657901 3430
mbed_official 87:085cde657901 3431 /**
mbed_official 87:085cde657901 3432 * @brief DMA I2C Memory Write process complete callback
mbed_official 87:085cde657901 3433 * @param hdma: DMA handle
mbed_official 87:085cde657901 3434 * @retval None
mbed_official 87:085cde657901 3435 */
mbed_official 87:085cde657901 3436 static void I2C_DMAMemTransmitCplt(DMA_HandleTypeDef *hdma)
mbed_official 87:085cde657901 3437 {
mbed_official 87:085cde657901 3438 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 87:085cde657901 3439
mbed_official 87:085cde657901 3440 /* Wait until BTF flag is reset */
mbed_official 87:085cde657901 3441 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 3442 {
mbed_official 87:085cde657901 3443 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
mbed_official 87:085cde657901 3444 }
mbed_official 87:085cde657901 3445
mbed_official 87:085cde657901 3446 /* Generate Stop */
mbed_official 87:085cde657901 3447 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 3448
mbed_official 87:085cde657901 3449 /* Disable DMA Request */
mbed_official 87:085cde657901 3450 hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN;
mbed_official 87:085cde657901 3451
mbed_official 87:085cde657901 3452 hi2c->XferCount = 0;
mbed_official 87:085cde657901 3453
mbed_official 87:085cde657901 3454 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 3455 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 3456 {
mbed_official 87:085cde657901 3457 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
mbed_official 87:085cde657901 3458 }
mbed_official 87:085cde657901 3459
mbed_official 87:085cde657901 3460 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 3461
mbed_official 87:085cde657901 3462 /* Check if Errors has been detected during transfer */
mbed_official 87:085cde657901 3463 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
mbed_official 87:085cde657901 3464 {
mbed_official 87:085cde657901 3465 HAL_I2C_ErrorCallback(hi2c);
mbed_official 87:085cde657901 3466 }
mbed_official 87:085cde657901 3467 else
mbed_official 87:085cde657901 3468 {
mbed_official 87:085cde657901 3469 HAL_I2C_MemTxCpltCallback(hi2c);
mbed_official 87:085cde657901 3470 }
mbed_official 87:085cde657901 3471 }
mbed_official 87:085cde657901 3472
mbed_official 87:085cde657901 3473 /**
mbed_official 87:085cde657901 3474 * @brief DMA I2C Memory Read process complete callback
mbed_official 87:085cde657901 3475 * @param hdma: DMA handle
mbed_official 87:085cde657901 3476 * @retval None
mbed_official 87:085cde657901 3477 */
mbed_official 87:085cde657901 3478 static void I2C_DMAMemReceiveCplt(DMA_HandleTypeDef *hdma)
mbed_official 87:085cde657901 3479 {
mbed_official 87:085cde657901 3480 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 87:085cde657901 3481
mbed_official 87:085cde657901 3482 /* Generate Stop */
mbed_official 87:085cde657901 3483 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 3484
mbed_official 87:085cde657901 3485 /* Disable Last DMA */
mbed_official 87:085cde657901 3486 hi2c->Instance->CR2 &= ~I2C_CR2_LAST;
mbed_official 87:085cde657901 3487
mbed_official 87:085cde657901 3488 /* Disable Acknowledge */
mbed_official 87:085cde657901 3489 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 3490
mbed_official 87:085cde657901 3491 /* Disable DMA Request */
mbed_official 87:085cde657901 3492 hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN;
mbed_official 87:085cde657901 3493
mbed_official 87:085cde657901 3494 hi2c->XferCount = 0;
mbed_official 87:085cde657901 3495
mbed_official 87:085cde657901 3496 /* Wait until BUSY flag is reset */
mbed_official 87:085cde657901 3497 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
mbed_official 87:085cde657901 3498 {
mbed_official 87:085cde657901 3499 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
mbed_official 87:085cde657901 3500 }
mbed_official 87:085cde657901 3501
mbed_official 87:085cde657901 3502 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 3503
mbed_official 87:085cde657901 3504 /* Check if Errors has been detected during transfer */
mbed_official 87:085cde657901 3505 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
mbed_official 87:085cde657901 3506 {
mbed_official 87:085cde657901 3507 HAL_I2C_ErrorCallback(hi2c);
mbed_official 87:085cde657901 3508 }
mbed_official 87:085cde657901 3509 else
mbed_official 87:085cde657901 3510 {
mbed_official 87:085cde657901 3511 HAL_I2C_MemRxCpltCallback(hi2c);
mbed_official 87:085cde657901 3512 }
mbed_official 87:085cde657901 3513 }
mbed_official 87:085cde657901 3514
mbed_official 87:085cde657901 3515 /**
mbed_official 87:085cde657901 3516 * @brief DMA I2C communication error callback.
mbed_official 87:085cde657901 3517 * @param hdma: DMA handle
mbed_official 87:085cde657901 3518 * @retval None
mbed_official 87:085cde657901 3519 */
mbed_official 87:085cde657901 3520 static void I2C_DMAError(DMA_HandleTypeDef *hdma)
mbed_official 87:085cde657901 3521 {
mbed_official 87:085cde657901 3522 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 87:085cde657901 3523
mbed_official 87:085cde657901 3524 /* Disable Acknowledge */
mbed_official 87:085cde657901 3525 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
mbed_official 87:085cde657901 3526
mbed_official 87:085cde657901 3527 hi2c->XferCount = 0;
mbed_official 87:085cde657901 3528
mbed_official 87:085cde657901 3529 hi2c->State = HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 3530
mbed_official 87:085cde657901 3531 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
mbed_official 87:085cde657901 3532
mbed_official 87:085cde657901 3533 HAL_I2C_ErrorCallback(hi2c);
mbed_official 87:085cde657901 3534 }
mbed_official 87:085cde657901 3535
mbed_official 87:085cde657901 3536 /**
mbed_official 87:085cde657901 3537 * @brief This function handles I2C Communication Timeout.
mbed_official 226:b062af740e40 3538 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 3539 * the configuration information for I2C module
mbed_official 87:085cde657901 3540 * @param Flag: specifies the I2C flag to check.
mbed_official 87:085cde657901 3541 * @param Status: The new Flag status (SET or RESET).
mbed_official 87:085cde657901 3542 * @param Timeout: Timeout duration
mbed_official 87:085cde657901 3543 * @retval HAL status
mbed_official 87:085cde657901 3544 */
mbed_official 87:085cde657901 3545 static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout)
mbed_official 87:085cde657901 3546 {
mbed_official 369:2e96f1b71984 3547 uint32_t tickstart = 0;
mbed_official 369:2e96f1b71984 3548
mbed_official 369:2e96f1b71984 3549 /* Get tick */
mbed_official 369:2e96f1b71984 3550 tickstart = HAL_GetTick();
mbed_official 87:085cde657901 3551
mbed_official 87:085cde657901 3552 /* Wait until flag is set */
mbed_official 87:085cde657901 3553 if(Status == RESET)
mbed_official 87:085cde657901 3554 {
mbed_official 87:085cde657901 3555 while(__HAL_I2C_GET_FLAG(hi2c, Flag) == RESET)
mbed_official 87:085cde657901 3556 {
mbed_official 87:085cde657901 3557 /* Check for the Timeout */
mbed_official 87:085cde657901 3558 if(Timeout != HAL_MAX_DELAY)
mbed_official 87:085cde657901 3559 {
mbed_official 369:2e96f1b71984 3560 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
mbed_official 87:085cde657901 3561 {
mbed_official 87:085cde657901 3562 hi2c->State= HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 3563
mbed_official 87:085cde657901 3564 /* Process Unlocked */
mbed_official 87:085cde657901 3565 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 3566
mbed_official 87:085cde657901 3567 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3568 }
mbed_official 87:085cde657901 3569 }
mbed_official 87:085cde657901 3570 }
mbed_official 87:085cde657901 3571 }
mbed_official 87:085cde657901 3572 else
mbed_official 87:085cde657901 3573 {
mbed_official 87:085cde657901 3574 while(__HAL_I2C_GET_FLAG(hi2c, Flag) != RESET)
mbed_official 87:085cde657901 3575 {
mbed_official 87:085cde657901 3576 /* Check for the Timeout */
mbed_official 87:085cde657901 3577 if(Timeout != HAL_MAX_DELAY)
mbed_official 87:085cde657901 3578 {
mbed_official 369:2e96f1b71984 3579 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
mbed_official 87:085cde657901 3580 {
mbed_official 87:085cde657901 3581 hi2c->State= HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 3582
mbed_official 87:085cde657901 3583 /* Process Unlocked */
mbed_official 87:085cde657901 3584 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 3585
mbed_official 87:085cde657901 3586 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3587 }
mbed_official 87:085cde657901 3588 }
mbed_official 87:085cde657901 3589 }
mbed_official 87:085cde657901 3590 }
mbed_official 87:085cde657901 3591 return HAL_OK;
mbed_official 87:085cde657901 3592 }
mbed_official 87:085cde657901 3593
mbed_official 87:085cde657901 3594 /**
mbed_official 87:085cde657901 3595 * @brief This function handles I2C Communication Timeout for Master addressing phase.
mbed_official 226:b062af740e40 3596 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 3597 * the configuration information for I2C module
mbed_official 87:085cde657901 3598 * @param Flag: specifies the I2C flag to check.
mbed_official 87:085cde657901 3599 * @param Timeout: Timeout duration
mbed_official 87:085cde657901 3600 * @retval HAL status
mbed_official 87:085cde657901 3601 */
mbed_official 87:085cde657901 3602 static HAL_StatusTypeDef I2C_WaitOnMasterAddressFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, uint32_t Timeout)
mbed_official 87:085cde657901 3603 {
mbed_official 369:2e96f1b71984 3604 uint32_t tickstart = 0;
mbed_official 369:2e96f1b71984 3605
mbed_official 369:2e96f1b71984 3606 /* Get tick */
mbed_official 369:2e96f1b71984 3607 tickstart = HAL_GetTick();
mbed_official 87:085cde657901 3608
mbed_official 87:085cde657901 3609 while(__HAL_I2C_GET_FLAG(hi2c, Flag) == RESET)
mbed_official 87:085cde657901 3610 {
mbed_official 87:085cde657901 3611 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET)
mbed_official 87:085cde657901 3612 {
mbed_official 87:085cde657901 3613 /* Generate Stop */
mbed_official 87:085cde657901 3614 hi2c->Instance->CR1 |= I2C_CR1_STOP;
mbed_official 87:085cde657901 3615
mbed_official 87:085cde657901 3616 /* Clear AF Flag */
mbed_official 87:085cde657901 3617 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
mbed_official 87:085cde657901 3618
mbed_official 87:085cde657901 3619 hi2c->ErrorCode = HAL_I2C_ERROR_AF;
mbed_official 87:085cde657901 3620 hi2c->State= HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 3621
mbed_official 87:085cde657901 3622 /* Process Unlocked */
mbed_official 87:085cde657901 3623 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 3624
mbed_official 87:085cde657901 3625 return HAL_ERROR;
mbed_official 87:085cde657901 3626 }
mbed_official 87:085cde657901 3627
mbed_official 87:085cde657901 3628 /* Check for the Timeout */
mbed_official 87:085cde657901 3629 if(Timeout != HAL_MAX_DELAY)
mbed_official 87:085cde657901 3630 {
mbed_official 369:2e96f1b71984 3631 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
mbed_official 87:085cde657901 3632 {
mbed_official 87:085cde657901 3633 hi2c->State= HAL_I2C_STATE_READY;
mbed_official 87:085cde657901 3634
mbed_official 87:085cde657901 3635 /* Process Unlocked */
mbed_official 87:085cde657901 3636 __HAL_UNLOCK(hi2c);
mbed_official 87:085cde657901 3637
mbed_official 87:085cde657901 3638 return HAL_TIMEOUT;
mbed_official 87:085cde657901 3639 }
mbed_official 87:085cde657901 3640 }
mbed_official 87:085cde657901 3641 }
mbed_official 87:085cde657901 3642 return HAL_OK;
mbed_official 87:085cde657901 3643 }
mbed_official 87:085cde657901 3644
mbed_official 87:085cde657901 3645 /**
mbed_official 87:085cde657901 3646 * @}
mbed_official 87:085cde657901 3647 */
mbed_official 87:085cde657901 3648
mbed_official 87:085cde657901 3649 #endif /* HAL_I2C_MODULE_ENABLED */
mbed_official 87:085cde657901 3650
mbed_official 87:085cde657901 3651 /**
mbed_official 87:085cde657901 3652 * @}
mbed_official 87:085cde657901 3653 */
mbed_official 87:085cde657901 3654
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 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/