SPKT

Dependencies:   F746_GUI SD_PlayerSkeleton F746_SAI_IO

Committer:
phungductung
Date:
Tue Jun 04 21:37:21 2019 +0000
Revision:
0:8ede47d38d10
SPKT

Who changed what in which revision?

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