mbed library sources

Dependents:   frdm_kl05z_gpio_test

Fork of mbed-src by mbed official

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

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

Add NUCLEO_F401RE, improvements

Who changed what in which revision?

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