mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

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

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

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

Import librarymbed

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

Committer:
mbed_official
Date:
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****/