mbed library with additional peripherals for ST F401 board

Fork of mbed-src by mbed official

This mbed LIB has additional peripherals for ST F401 board

  • UART2 : PA_3 rx, PA_2 tx
  • UART3 : PC_7 rx, PC_6 tx
  • I2C2 : PB_3 SDA, PB_10 SCL
  • I2C3 : PB_4 SDA, PA_8 SCL
Committer:
mbed_official
Date:
Wed Feb 26 09:45:12 2014 +0000
Revision:
106:ced8cbb51063
Parent:
87:085cde657901
Synchronized with git revision 4222735eff5868389433f0e9271976b39c8115cd

Full URL: https://github.com/mbedmicro/mbed/commit/4222735eff5868389433f0e9271976b39c8115cd/

[NUCLEO_xxx] Update STM32CubeF4 driver V1.0.0 + update license

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