mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

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

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

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

Import librarymbed

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

Committer:
mbed_official
Date:
Wed Jul 01 09:45:11 2015 +0100
Revision:
579:53297373a894
Parent:
394:83f921546702
Synchronized with git revision d5b4d2ab9c47edb4dc5776e7177b0c2263459081

Full URL: https://github.com/mbedmicro/mbed/commit/d5b4d2ab9c47edb4dc5776e7177b0c2263459081/

Initial version of drivers for SAMR21

Who changed what in which revision?

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