SPKT

Dependents:   WAV

Committer:
phungductung
Date:
Tue Jun 04 21:51:46 2019 +0000
Revision:
0:e87aa4c49e95
libray

Who changed what in which revision?

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