Modified version of the mbed library for use with the Nucleo boards.

Dependents:   EEPROMWrite Full-Project

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Thu Aug 20 10:45:13 2015 +0100
Revision:
613:bc40b8d2aec4
Parent:
532:fe11edbda85c
Synchronized with git revision 92ca8c7b60a283b6bb60eb65b183dac1599f0ade

Full URL: https://github.com/mbedmicro/mbed/commit/92ca8c7b60a283b6bb60eb65b183dac1599f0ade/

Nordic: update application start address in GCC linker script

Who changed what in which revision?

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