mbed library sources

Fork of mbed-src by mbed official

Committer:
SteveKim
Date:
Tue Jul 14 10:20:51 2015 +0000
Revision:
590:0835b0fc9a03
Parent:
394:83f921546702
.

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****/