001

Committer:
ganlikun
Date:
Sun Jun 12 14:02:44 2022 +0000
Revision:
0:13413ea9a877
00

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ganlikun 0:13413ea9a877 1 /**
ganlikun 0:13413ea9a877 2 ******************************************************************************
ganlikun 0:13413ea9a877 3 * @file stm32f4xx_hal_i2c.c
ganlikun 0:13413ea9a877 4 * @author MCD Application Team
ganlikun 0:13413ea9a877 5 * @version V1.7.1
ganlikun 0:13413ea9a877 6 * @date 14-April-2017
ganlikun 0:13413ea9a877 7 * @brief I2C HAL module driver.
ganlikun 0:13413ea9a877 8 * This file provides firmware functions to manage the following
ganlikun 0:13413ea9a877 9 * functionalities of the Inter Integrated Circuit (I2C) peripheral:
ganlikun 0:13413ea9a877 10 * + Initialization and de-initialization functions
ganlikun 0:13413ea9a877 11 * + IO operation functions
ganlikun 0:13413ea9a877 12 * + Peripheral State, Mode and Error functions
ganlikun 0:13413ea9a877 13 *
ganlikun 0:13413ea9a877 14 @verbatim
ganlikun 0:13413ea9a877 15 ==============================================================================
ganlikun 0:13413ea9a877 16 ##### How to use this driver #####
ganlikun 0:13413ea9a877 17 ==============================================================================
ganlikun 0:13413ea9a877 18 [..]
ganlikun 0:13413ea9a877 19 The I2C HAL driver can be used as follows:
ganlikun 0:13413ea9a877 20
ganlikun 0:13413ea9a877 21 (#) Declare a I2C_HandleTypeDef handle structure, for example:
ganlikun 0:13413ea9a877 22 I2C_HandleTypeDef hi2c;
ganlikun 0:13413ea9a877 23
ganlikun 0:13413ea9a877 24 (#)Initialize the I2C low level resources by implementing the HAL_I2C_MspInit() API:
ganlikun 0:13413ea9a877 25 (##) Enable the I2Cx interface clock
ganlikun 0:13413ea9a877 26 (##) I2C pins configuration
ganlikun 0:13413ea9a877 27 (+++) Enable the clock for the I2C GPIOs
ganlikun 0:13413ea9a877 28 (+++) Configure I2C pins as alternate function open-drain
ganlikun 0:13413ea9a877 29 (##) NVIC configuration if you need to use interrupt process
ganlikun 0:13413ea9a877 30 (+++) Configure the I2Cx interrupt priority
ganlikun 0:13413ea9a877 31 (+++) Enable the NVIC I2C IRQ Channel
ganlikun 0:13413ea9a877 32 (##) DMA Configuration if you need to use DMA process
ganlikun 0:13413ea9a877 33 (+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive stream
ganlikun 0:13413ea9a877 34 (+++) Enable the DMAx interface clock using
ganlikun 0:13413ea9a877 35 (+++) Configure the DMA handle parameters
ganlikun 0:13413ea9a877 36 (+++) Configure the DMA Tx or Rx Stream
ganlikun 0:13413ea9a877 37 (+++) Associate the initialized DMA handle to the hi2c DMA Tx or Rx handle
ganlikun 0:13413ea9a877 38 (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on
ganlikun 0:13413ea9a877 39 the DMA Tx or Rx Stream
ganlikun 0:13413ea9a877 40
ganlikun 0:13413ea9a877 41 (#) Configure the Communication Speed, Duty cycle, Addressing mode, Own Address1,
ganlikun 0:13413ea9a877 42 Dual Addressing mode, Own Address2, General call and Nostretch mode in the hi2c Init structure.
ganlikun 0:13413ea9a877 43
ganlikun 0:13413ea9a877 44 (#) Initialize the I2C registers by calling the HAL_I2C_Init(), configures also the low level Hardware
ganlikun 0:13413ea9a877 45 (GPIO, CLOCK, NVIC...etc) by calling the customized HAL_I2C_MspInit(&hi2c) API.
ganlikun 0:13413ea9a877 46
ganlikun 0:13413ea9a877 47 (#) To check if target device is ready for communication, use the function HAL_I2C_IsDeviceReady()
ganlikun 0:13413ea9a877 48
ganlikun 0:13413ea9a877 49 (#) For I2C IO and IO MEM operations, three operation modes are available within this driver :
ganlikun 0:13413ea9a877 50
ganlikun 0:13413ea9a877 51 *** Polling mode IO operation ***
ganlikun 0:13413ea9a877 52 =================================
ganlikun 0:13413ea9a877 53 [..]
ganlikun 0:13413ea9a877 54 (+) Transmit in master mode an amount of data in blocking mode using HAL_I2C_Master_Transmit()
ganlikun 0:13413ea9a877 55 (+) Receive in master mode an amount of data in blocking mode using HAL_I2C_Master_Receive()
ganlikun 0:13413ea9a877 56 (+) Transmit in slave mode an amount of data in blocking mode using HAL_I2C_Slave_Transmit()
ganlikun 0:13413ea9a877 57 (+) Receive in slave mode an amount of data in blocking mode using HAL_I2C_Slave_Receive()
ganlikun 0:13413ea9a877 58
ganlikun 0:13413ea9a877 59 *** Polling mode IO MEM operation ***
ganlikun 0:13413ea9a877 60 =====================================
ganlikun 0:13413ea9a877 61 [..]
ganlikun 0:13413ea9a877 62 (+) Write an amount of data in blocking mode to a specific memory address using HAL_I2C_Mem_Write()
ganlikun 0:13413ea9a877 63 (+) Read an amount of data in blocking mode from a specific memory address using HAL_I2C_Mem_Read()
ganlikun 0:13413ea9a877 64
ganlikun 0:13413ea9a877 65
ganlikun 0:13413ea9a877 66 *** Interrupt mode IO operation ***
ganlikun 0:13413ea9a877 67 ===================================
ganlikun 0:13413ea9a877 68 [..]
ganlikun 0:13413ea9a877 69 (+) Transmit in master mode an amount of data in non blocking mode using HAL_I2C_Master_Transmit_IT()
ganlikun 0:13413ea9a877 70 (+) At transmission end of transfer HAL_I2C_MasterTxCpltCallback is executed and user can
ganlikun 0:13413ea9a877 71 add his own code by customization of function pointer HAL_I2C_MasterTxCpltCallback
ganlikun 0:13413ea9a877 72 (+) Receive in master mode an amount of data in non blocking mode using HAL_I2C_Master_Receive_IT()
ganlikun 0:13413ea9a877 73 (+) At reception end of transfer HAL_I2C_MasterRxCpltCallback is executed and user can
ganlikun 0:13413ea9a877 74 add his own code by customization of function pointer HAL_I2C_MasterRxCpltCallback
ganlikun 0:13413ea9a877 75 (+) Transmit in slave mode an amount of data in non blocking mode using HAL_I2C_Slave_Transmit_IT()
ganlikun 0:13413ea9a877 76 (+) At transmission end of transfer HAL_I2C_SlaveTxCpltCallback is executed and user can
ganlikun 0:13413ea9a877 77 add his own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback
ganlikun 0:13413ea9a877 78 (+) Receive in slave mode an amount of data in non blocking mode using HAL_I2C_Slave_Receive_IT()
ganlikun 0:13413ea9a877 79 (+) At reception end of transfer HAL_I2C_SlaveRxCpltCallback is executed and user can
ganlikun 0:13413ea9a877 80 add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback
ganlikun 0:13413ea9a877 81 (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can
ganlikun 0:13413ea9a877 82 add his own code by customization of function pointer HAL_I2C_ErrorCallback
ganlikun 0:13413ea9a877 83 (+) Abort a master I2C process communication with Interrupt using HAL_I2C_Master_Abort_IT()
ganlikun 0:13413ea9a877 84 (+) End of abort process, HAL_I2C_AbortCpltCallback() is executed and user can
ganlikun 0:13413ea9a877 85 add his own code by customization of function pointer HAL_I2C_AbortCpltCallback()
ganlikun 0:13413ea9a877 86
ganlikun 0:13413ea9a877 87 *** Interrupt mode IO sequential operation ***
ganlikun 0:13413ea9a877 88 ==============================================
ganlikun 0:13413ea9a877 89 [..]
ganlikun 0:13413ea9a877 90 (@) These interfaces allow to manage a sequential transfer with a repeated start condition
ganlikun 0:13413ea9a877 91 when a direction change during transfer
ganlikun 0:13413ea9a877 92 [..]
ganlikun 0:13413ea9a877 93 (+) A specific option field manage the different steps of a sequential transfer
ganlikun 0:13413ea9a877 94 (+) Option field values are defined through @ref I2C_XFEROPTIONS and are listed below:
ganlikun 0:13413ea9a877 95 (++) I2C_FIRST_AND_LAST_FRAME: No sequential usage, functionnal is same as associated interfaces in no sequential mode
ganlikun 0:13413ea9a877 96 (++) I2C_FIRST_FRAME: Sequential usage, this option allow to manage a sequence with start condition, address
ganlikun 0:13413ea9a877 97 and data to transfer without a final stop condition
ganlikun 0:13413ea9a877 98 (++) I2C_NEXT_FRAME: Sequential usage, this option allow to manage a sequence with a restart condition, address
ganlikun 0:13413ea9a877 99 and with new data to transfer if the direction change or manage only the new data to transfer
ganlikun 0:13413ea9a877 100 if no direction change and without a final stop condition in both cases
ganlikun 0:13413ea9a877 101 (++) I2C_LAST_FRAME: Sequential usage, this option allow to manage a sequance with a restart condition, address
ganlikun 0:13413ea9a877 102 and with new data to transfer if the direction change or manage only the new data to transfer
ganlikun 0:13413ea9a877 103 if no direction change and with a final stop condition in both cases
ganlikun 0:13413ea9a877 104
ganlikun 0:13413ea9a877 105 (+) Differents sequential I2C interfaces are listed below:
ganlikun 0:13413ea9a877 106 (++) Sequential transmit in master I2C mode an amount of data in non-blocking mode using HAL_I2C_Master_Sequential_Transmit_IT()
ganlikun 0:13413ea9a877 107 (+++) At transmission end of current frame transfer, HAL_I2C_MasterTxCpltCallback() is executed and user can
ganlikun 0:13413ea9a877 108 add his own code by customization of function pointer HAL_I2C_MasterTxCpltCallback()
ganlikun 0:13413ea9a877 109 (++) Sequential receive in master I2C mode an amount of data in non-blocking mode using HAL_I2C_Master_Sequential_Receive_IT()
ganlikun 0:13413ea9a877 110 (+++) At reception end of current frame transfer, HAL_I2C_MasterRxCpltCallback() is executed and user can
ganlikun 0:13413ea9a877 111 add his own code by customization of function pointer HAL_I2C_MasterRxCpltCallback()
ganlikun 0:13413ea9a877 112 (++) Abort a master I2C process communication with Interrupt using HAL_I2C_Master_Abort_IT()
ganlikun 0:13413ea9a877 113 (+++) End of abort process, HAL_I2C_AbortCpltCallback() is executed and user can
ganlikun 0:13413ea9a877 114 add his own code by customization of function pointer HAL_I2C_AbortCpltCallback()
ganlikun 0:13413ea9a877 115 (++) Enable/disable the Address listen mode in slave I2C mode using HAL_I2C_EnableListen_IT() HAL_I2C_DisableListen_IT()
ganlikun 0:13413ea9a877 116 (+++) When address slave I2C match, HAL_I2C_AddrCallback() is executed and user can
ganlikun 0:13413ea9a877 117 add his own code to check the Address Match Code and the transmission direction request by master (Write/Read).
ganlikun 0:13413ea9a877 118 (+++) At Listen mode end HAL_I2C_ListenCpltCallback() is executed and user can
ganlikun 0:13413ea9a877 119 add his own code by customization of function pointer HAL_I2C_ListenCpltCallback()
ganlikun 0:13413ea9a877 120 (++) Sequential transmit in slave I2C mode an amount of data in non-blocking mode using HAL_I2C_Slave_Sequential_Transmit_IT()
ganlikun 0:13413ea9a877 121 (+++) At transmission end of current frame transfer, HAL_I2C_SlaveTxCpltCallback() is executed and user can
ganlikun 0:13413ea9a877 122 add his own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback()
ganlikun 0:13413ea9a877 123 (++) Sequential receive in slave I2C mode an amount of data in non-blocking mode using HAL_I2C_Slave_Sequential_Receive_IT()
ganlikun 0:13413ea9a877 124 (+++) At reception end of current frame transfer, HAL_I2C_SlaveRxCpltCallback() is executed and user can
ganlikun 0:13413ea9a877 125 add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback()
ganlikun 0:13413ea9a877 126 (++) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can
ganlikun 0:13413ea9a877 127 add his own code by customization of function pointer HAL_I2C_ErrorCallback()
ganlikun 0:13413ea9a877 128 (++) Abort a master I2C process communication with Interrupt using HAL_I2C_Master_Abort_IT()
ganlikun 0:13413ea9a877 129 (++) End of abort process, HAL_I2C_AbortCpltCallback() is executed and user can
ganlikun 0:13413ea9a877 130 add his own code by customization of function pointer HAL_I2C_AbortCpltCallback()
ganlikun 0:13413ea9a877 131
ganlikun 0:13413ea9a877 132 *** Interrupt mode IO MEM operation ***
ganlikun 0:13413ea9a877 133 =======================================
ganlikun 0:13413ea9a877 134 [..]
ganlikun 0:13413ea9a877 135 (+) Write an amount of data in no-blocking mode with Interrupt to a specific memory address using
ganlikun 0:13413ea9a877 136 HAL_I2C_Mem_Write_IT()
ganlikun 0:13413ea9a877 137 (+) At MEM end of write transfer HAL_I2C_MemTxCpltCallback is executed and user can
ganlikun 0:13413ea9a877 138 add his own code by customization of function pointer HAL_I2C_MemTxCpltCallback
ganlikun 0:13413ea9a877 139 (+) Read an amount of data in no-blocking mode with Interrupt from a specific memory address using
ganlikun 0:13413ea9a877 140 HAL_I2C_Mem_Read_IT()
ganlikun 0:13413ea9a877 141 (+) At MEM end of read transfer HAL_I2C_MemRxCpltCallback is executed and user can
ganlikun 0:13413ea9a877 142 add his own code by customization of function pointer HAL_I2C_MemRxCpltCallback
ganlikun 0:13413ea9a877 143 (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can
ganlikun 0:13413ea9a877 144 add his own code by customization of function pointer HAL_I2C_ErrorCallback
ganlikun 0:13413ea9a877 145
ganlikun 0:13413ea9a877 146 *** DMA mode IO operation ***
ganlikun 0:13413ea9a877 147 ==============================
ganlikun 0:13413ea9a877 148 [..]
ganlikun 0:13413ea9a877 149 (+) Transmit in master mode an amount of data in non blocking mode (DMA) using
ganlikun 0:13413ea9a877 150 HAL_I2C_Master_Transmit_DMA()
ganlikun 0:13413ea9a877 151 (+) At transmission end of transfer HAL_I2C_MasterTxCpltCallback is executed and user can
ganlikun 0:13413ea9a877 152 add his own code by customization of function pointer HAL_I2C_MasterTxCpltCallback
ganlikun 0:13413ea9a877 153 (+) Receive in master mode an amount of data in non blocking mode (DMA) using
ganlikun 0:13413ea9a877 154 HAL_I2C_Master_Receive_DMA()
ganlikun 0:13413ea9a877 155 (+) At reception end of transfer HAL_I2C_MasterRxCpltCallback is executed and user can
ganlikun 0:13413ea9a877 156 add his own code by customization of function pointer HAL_I2C_MasterRxCpltCallback
ganlikun 0:13413ea9a877 157 (+) Transmit in slave mode an amount of data in non blocking mode (DMA) using
ganlikun 0:13413ea9a877 158 HAL_I2C_Slave_Transmit_DMA()
ganlikun 0:13413ea9a877 159 (+) At transmission end of transfer HAL_I2C_SlaveTxCpltCallback is executed and user can
ganlikun 0:13413ea9a877 160 add his own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback
ganlikun 0:13413ea9a877 161 (+) Receive in slave mode an amount of data in non blocking mode (DMA) using
ganlikun 0:13413ea9a877 162 HAL_I2C_Slave_Receive_DMA()
ganlikun 0:13413ea9a877 163 (+) At reception end of transfer HAL_I2C_SlaveRxCpltCallback is executed and user can
ganlikun 0:13413ea9a877 164 add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback
ganlikun 0:13413ea9a877 165 (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can
ganlikun 0:13413ea9a877 166 add his own code by customization of function pointer HAL_I2C_ErrorCallback
ganlikun 0:13413ea9a877 167 (+) Abort a master I2C process communication with Interrupt using HAL_I2C_Master_Abort_IT()
ganlikun 0:13413ea9a877 168 (+) End of abort process, HAL_I2C_AbortCpltCallback() is executed and user can
ganlikun 0:13413ea9a877 169 add his own code by customization of function pointer HAL_I2C_AbortCpltCallback()
ganlikun 0:13413ea9a877 170
ganlikun 0:13413ea9a877 171 *** DMA mode IO MEM operation ***
ganlikun 0:13413ea9a877 172 =================================
ganlikun 0:13413ea9a877 173 [..]
ganlikun 0:13413ea9a877 174 (+) Write an amount of data in no-blocking mode with DMA to a specific memory address using
ganlikun 0:13413ea9a877 175 HAL_I2C_Mem_Write_DMA()
ganlikun 0:13413ea9a877 176 (+) At MEM end of write transfer HAL_I2C_MemTxCpltCallback is executed and user can
ganlikun 0:13413ea9a877 177 add his own code by customization of function pointer HAL_I2C_MemTxCpltCallback
ganlikun 0:13413ea9a877 178 (+) Read an amount of data in no-blocking mode with DMA from a specific memory address using
ganlikun 0:13413ea9a877 179 HAL_I2C_Mem_Read_DMA()
ganlikun 0:13413ea9a877 180 (+) At MEM end of read transfer HAL_I2C_MemRxCpltCallback is executed and user can
ganlikun 0:13413ea9a877 181 add his own code by customization of function pointer HAL_I2C_MemRxCpltCallback
ganlikun 0:13413ea9a877 182 (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can
ganlikun 0:13413ea9a877 183 add his own code by customization of function pointer HAL_I2C_ErrorCallback
ganlikun 0:13413ea9a877 184
ganlikun 0:13413ea9a877 185
ganlikun 0:13413ea9a877 186 *** I2C HAL driver macros list ***
ganlikun 0:13413ea9a877 187 ==================================
ganlikun 0:13413ea9a877 188 [..]
ganlikun 0:13413ea9a877 189 Below the list of most used macros in I2C HAL driver.
ganlikun 0:13413ea9a877 190
ganlikun 0:13413ea9a877 191 (+) __HAL_I2C_ENABLE: Enable the I2C peripheral
ganlikun 0:13413ea9a877 192 (+) __HAL_I2C_DISABLE: Disable the I2C peripheral
ganlikun 0:13413ea9a877 193 (+) __HAL_I2C_GET_FLAG : Checks whether the specified I2C flag is set or not
ganlikun 0:13413ea9a877 194 (+) __HAL_I2C_CLEAR_FLAG : Clear the specified I2C pending flag
ganlikun 0:13413ea9a877 195 (+) __HAL_I2C_ENABLE_IT: Enable the specified I2C interrupt
ganlikun 0:13413ea9a877 196 (+) __HAL_I2C_DISABLE_IT: Disable the specified I2C interrupt
ganlikun 0:13413ea9a877 197
ganlikun 0:13413ea9a877 198 [..]
ganlikun 0:13413ea9a877 199 (@) You can refer to the I2C HAL driver header file for more useful macros
ganlikun 0:13413ea9a877 200
ganlikun 0:13413ea9a877 201
ganlikun 0:13413ea9a877 202 @endverbatim
ganlikun 0:13413ea9a877 203 ******************************************************************************
ganlikun 0:13413ea9a877 204 * @attention
ganlikun 0:13413ea9a877 205 *
ganlikun 0:13413ea9a877 206 * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
ganlikun 0:13413ea9a877 207 *
ganlikun 0:13413ea9a877 208 * Redistribution and use in source and binary forms, with or without modification,
ganlikun 0:13413ea9a877 209 * are permitted provided that the following conditions are met:
ganlikun 0:13413ea9a877 210 * 1. Redistributions of source code must retain the above copyright notice,
ganlikun 0:13413ea9a877 211 * this list of conditions and the following disclaimer.
ganlikun 0:13413ea9a877 212 * 2. Redistributions in binary form must reproduce the above copyright notice,
ganlikun 0:13413ea9a877 213 * this list of conditions and the following disclaimer in the documentation
ganlikun 0:13413ea9a877 214 * and/or other materials provided with the distribution.
ganlikun 0:13413ea9a877 215 * 3. Neither the name of STMicroelectronics nor the names of its contributors
ganlikun 0:13413ea9a877 216 * may be used to endorse or promote products derived from this software
ganlikun 0:13413ea9a877 217 * without specific prior written permission.
ganlikun 0:13413ea9a877 218 *
ganlikun 0:13413ea9a877 219 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
ganlikun 0:13413ea9a877 220 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
ganlikun 0:13413ea9a877 221 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
ganlikun 0:13413ea9a877 222 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
ganlikun 0:13413ea9a877 223 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
ganlikun 0:13413ea9a877 224 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
ganlikun 0:13413ea9a877 225 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
ganlikun 0:13413ea9a877 226 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
ganlikun 0:13413ea9a877 227 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
ganlikun 0:13413ea9a877 228 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
ganlikun 0:13413ea9a877 229 *
ganlikun 0:13413ea9a877 230 ******************************************************************************
ganlikun 0:13413ea9a877 231 */
ganlikun 0:13413ea9a877 232
ganlikun 0:13413ea9a877 233 /* Includes ------------------------------------------------------------------*/
ganlikun 0:13413ea9a877 234 #include "stm32f4xx_hal.h"
ganlikun 0:13413ea9a877 235
ganlikun 0:13413ea9a877 236 /** @addtogroup STM32F4xx_HAL_Driver
ganlikun 0:13413ea9a877 237 * @{
ganlikun 0:13413ea9a877 238 */
ganlikun 0:13413ea9a877 239
ganlikun 0:13413ea9a877 240 /** @defgroup I2C I2C
ganlikun 0:13413ea9a877 241 * @brief I2C HAL module driver
ganlikun 0:13413ea9a877 242 * @{
ganlikun 0:13413ea9a877 243 */
ganlikun 0:13413ea9a877 244
ganlikun 0:13413ea9a877 245 #ifdef HAL_I2C_MODULE_ENABLED
ganlikun 0:13413ea9a877 246
ganlikun 0:13413ea9a877 247 /* Private typedef -----------------------------------------------------------*/
ganlikun 0:13413ea9a877 248 /* Private define ------------------------------------------------------------*/
ganlikun 0:13413ea9a877 249 /** @addtogroup I2C_Private_Define
ganlikun 0:13413ea9a877 250 * @{
ganlikun 0:13413ea9a877 251 */
ganlikun 0:13413ea9a877 252 #define I2C_TIMEOUT_FLAG 35U /*!< Timeout 35 ms */
ganlikun 0:13413ea9a877 253 #define I2C_TIMEOUT_BUSY_FLAG 25U /*!< Timeout 25 ms */
ganlikun 0:13413ea9a877 254 #define I2C_NO_OPTION_FRAME 0xFFFF0000U /*!< XferOptions default value */
ganlikun 0:13413ea9a877 255
ganlikun 0:13413ea9a877 256 /* Private define for @ref PreviousState usage */
ganlikun 0:13413ea9a877 257 #define I2C_STATE_MSK ((uint32_t)((HAL_I2C_STATE_BUSY_TX | HAL_I2C_STATE_BUSY_RX) & (~(uint32_t)HAL_I2C_STATE_READY))) /*!< Mask State define, keep only RX and TX bits */
ganlikun 0:13413ea9a877 258 #define I2C_STATE_NONE ((uint32_t)(HAL_I2C_MODE_NONE)) /*!< Default Value */
ganlikun 0:13413ea9a877 259 #define I2C_STATE_MASTER_BUSY_TX ((uint32_t)((HAL_I2C_STATE_BUSY_TX & I2C_STATE_MSK) | HAL_I2C_MODE_MASTER)) /*!< Master Busy TX, combinaison of State LSB and Mode enum */
ganlikun 0:13413ea9a877 260 #define I2C_STATE_MASTER_BUSY_RX ((uint32_t)((HAL_I2C_STATE_BUSY_RX & I2C_STATE_MSK) | HAL_I2C_MODE_MASTER)) /*!< Master Busy RX, combinaison of State LSB and Mode enum */
ganlikun 0:13413ea9a877 261 #define I2C_STATE_SLAVE_BUSY_TX ((uint32_t)((HAL_I2C_STATE_BUSY_TX & I2C_STATE_MSK) | HAL_I2C_MODE_SLAVE)) /*!< Slave Busy TX, combinaison of State LSB and Mode enum */
ganlikun 0:13413ea9a877 262 #define I2C_STATE_SLAVE_BUSY_RX ((uint32_t)((HAL_I2C_STATE_BUSY_RX & I2C_STATE_MSK) | HAL_I2C_MODE_SLAVE)) /*!< Slave Busy RX, combinaison of State LSB and Mode enum */
ganlikun 0:13413ea9a877 263
ganlikun 0:13413ea9a877 264 /**
ganlikun 0:13413ea9a877 265 * @}
ganlikun 0:13413ea9a877 266 */
ganlikun 0:13413ea9a877 267
ganlikun 0:13413ea9a877 268 /* Private macro -------------------------------------------------------------*/
ganlikun 0:13413ea9a877 269 /* Private variables ---------------------------------------------------------*/
ganlikun 0:13413ea9a877 270 /* Private function prototypes -----------------------------------------------*/
ganlikun 0:13413ea9a877 271 /** @addtogroup I2C_Private_Functions
ganlikun 0:13413ea9a877 272 * @{
ganlikun 0:13413ea9a877 273 */
ganlikun 0:13413ea9a877 274 /* Private functions to handle DMA transfer */
ganlikun 0:13413ea9a877 275 static void I2C_DMAXferCplt(DMA_HandleTypeDef *hdma);
ganlikun 0:13413ea9a877 276 static void I2C_DMAError(DMA_HandleTypeDef *hdma);
ganlikun 0:13413ea9a877 277 static void I2C_DMAAbort(DMA_HandleTypeDef *hdma);
ganlikun 0:13413ea9a877 278
ganlikun 0:13413ea9a877 279 static void I2C_ITError(I2C_HandleTypeDef *hi2c);
ganlikun 0:13413ea9a877 280
ganlikun 0:13413ea9a877 281 static HAL_StatusTypeDef I2C_MasterRequestWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart);
ganlikun 0:13413ea9a877 282 static HAL_StatusTypeDef I2C_MasterRequestRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart);
ganlikun 0:13413ea9a877 283 static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart);
ganlikun 0:13413ea9a877 284 static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart);
ganlikun 0:13413ea9a877 285 static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart);
ganlikun 0:13413ea9a877 286 static HAL_StatusTypeDef I2C_WaitOnMasterAddressFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, uint32_t Timeout, uint32_t Tickstart);
ganlikun 0:13413ea9a877 287 static HAL_StatusTypeDef I2C_WaitOnTXEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart);
ganlikun 0:13413ea9a877 288 static HAL_StatusTypeDef I2C_WaitOnBTFFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart);
ganlikun 0:13413ea9a877 289 static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart);
ganlikun 0:13413ea9a877 290 static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart);
ganlikun 0:13413ea9a877 291 static HAL_StatusTypeDef I2C_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c);
ganlikun 0:13413ea9a877 292
ganlikun 0:13413ea9a877 293 /* Private functions for I2C transfer IRQ handler */
ganlikun 0:13413ea9a877 294 static HAL_StatusTypeDef I2C_MasterTransmit_TXE(I2C_HandleTypeDef *hi2c);
ganlikun 0:13413ea9a877 295 static HAL_StatusTypeDef I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c);
ganlikun 0:13413ea9a877 296 static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c);
ganlikun 0:13413ea9a877 297 static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c);
ganlikun 0:13413ea9a877 298 static HAL_StatusTypeDef I2C_Master_SB(I2C_HandleTypeDef *hi2c);
ganlikun 0:13413ea9a877 299 static HAL_StatusTypeDef I2C_Master_ADD10(I2C_HandleTypeDef *hi2c);
ganlikun 0:13413ea9a877 300 static HAL_StatusTypeDef I2C_Master_ADDR(I2C_HandleTypeDef *hi2c);
ganlikun 0:13413ea9a877 301
ganlikun 0:13413ea9a877 302 static HAL_StatusTypeDef I2C_SlaveTransmit_TXE(I2C_HandleTypeDef *hi2c);
ganlikun 0:13413ea9a877 303 static HAL_StatusTypeDef I2C_SlaveTransmit_BTF(I2C_HandleTypeDef *hi2c);
ganlikun 0:13413ea9a877 304 static HAL_StatusTypeDef I2C_SlaveReceive_RXNE(I2C_HandleTypeDef *hi2c);
ganlikun 0:13413ea9a877 305 static HAL_StatusTypeDef I2C_SlaveReceive_BTF(I2C_HandleTypeDef *hi2c);
ganlikun 0:13413ea9a877 306 static HAL_StatusTypeDef I2C_Slave_ADDR(I2C_HandleTypeDef *hi2c);
ganlikun 0:13413ea9a877 307 static HAL_StatusTypeDef I2C_Slave_STOPF(I2C_HandleTypeDef *hi2c);
ganlikun 0:13413ea9a877 308 static HAL_StatusTypeDef I2C_Slave_AF(I2C_HandleTypeDef *hi2c);
ganlikun 0:13413ea9a877 309 /**
ganlikun 0:13413ea9a877 310 * @}
ganlikun 0:13413ea9a877 311 */
ganlikun 0:13413ea9a877 312
ganlikun 0:13413ea9a877 313 /* Exported functions --------------------------------------------------------*/
ganlikun 0:13413ea9a877 314 /** @defgroup I2C_Exported_Functions I2C Exported Functions
ganlikun 0:13413ea9a877 315 * @{
ganlikun 0:13413ea9a877 316 */
ganlikun 0:13413ea9a877 317
ganlikun 0:13413ea9a877 318 /** @defgroup I2C_Exported_Functions_Group1 Initialization and de-initialization functions
ganlikun 0:13413ea9a877 319 * @brief Initialization and Configuration functions
ganlikun 0:13413ea9a877 320 *
ganlikun 0:13413ea9a877 321 @verbatim
ganlikun 0:13413ea9a877 322 ===============================================================================
ganlikun 0:13413ea9a877 323 ##### Initialization and de-initialization functions #####
ganlikun 0:13413ea9a877 324 ===============================================================================
ganlikun 0:13413ea9a877 325 [..] This subsection provides a set of functions allowing to initialize and
ganlikun 0:13413ea9a877 326 de-initialize the I2Cx peripheral:
ganlikun 0:13413ea9a877 327
ganlikun 0:13413ea9a877 328 (+) User must Implement HAL_I2C_MspInit() function in which he configures
ganlikun 0:13413ea9a877 329 all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC).
ganlikun 0:13413ea9a877 330
ganlikun 0:13413ea9a877 331 (+) Call the function HAL_I2C_Init() to configure the selected device with
ganlikun 0:13413ea9a877 332 the selected configuration:
ganlikun 0:13413ea9a877 333 (++) Communication Speed
ganlikun 0:13413ea9a877 334 (++) Duty cycle
ganlikun 0:13413ea9a877 335 (++) Addressing mode
ganlikun 0:13413ea9a877 336 (++) Own Address 1
ganlikun 0:13413ea9a877 337 (++) Dual Addressing mode
ganlikun 0:13413ea9a877 338 (++) Own Address 2
ganlikun 0:13413ea9a877 339 (++) General call mode
ganlikun 0:13413ea9a877 340 (++) Nostretch mode
ganlikun 0:13413ea9a877 341
ganlikun 0:13413ea9a877 342 (+) Call the function HAL_I2C_DeInit() to restore the default configuration
ganlikun 0:13413ea9a877 343 of the selected I2Cx peripheral.
ganlikun 0:13413ea9a877 344
ganlikun 0:13413ea9a877 345 @endverbatim
ganlikun 0:13413ea9a877 346 * @{
ganlikun 0:13413ea9a877 347 */
ganlikun 0:13413ea9a877 348
ganlikun 0:13413ea9a877 349 /**
ganlikun 0:13413ea9a877 350 * @brief Initializes the I2C according to the specified parameters
ganlikun 0:13413ea9a877 351 * in the I2C_InitTypeDef and create the associated handle.
ganlikun 0:13413ea9a877 352 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 353 * the configuration information for I2C module
ganlikun 0:13413ea9a877 354 * @retval HAL status
ganlikun 0:13413ea9a877 355 */
ganlikun 0:13413ea9a877 356 HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 357 {
ganlikun 0:13413ea9a877 358 uint32_t freqrange = 0U;
ganlikun 0:13413ea9a877 359 uint32_t pclk1 = 0U;
ganlikun 0:13413ea9a877 360
ganlikun 0:13413ea9a877 361 /* Check the I2C handle allocation */
ganlikun 0:13413ea9a877 362 if(hi2c == NULL)
ganlikun 0:13413ea9a877 363 {
ganlikun 0:13413ea9a877 364 return HAL_ERROR;
ganlikun 0:13413ea9a877 365 }
ganlikun 0:13413ea9a877 366
ganlikun 0:13413ea9a877 367 /* Check the parameters */
ganlikun 0:13413ea9a877 368 assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance));
ganlikun 0:13413ea9a877 369 assert_param(IS_I2C_CLOCK_SPEED(hi2c->Init.ClockSpeed));
ganlikun 0:13413ea9a877 370 assert_param(IS_I2C_DUTY_CYCLE(hi2c->Init.DutyCycle));
ganlikun 0:13413ea9a877 371 assert_param(IS_I2C_OWN_ADDRESS1(hi2c->Init.OwnAddress1));
ganlikun 0:13413ea9a877 372 assert_param(IS_I2C_ADDRESSING_MODE(hi2c->Init.AddressingMode));
ganlikun 0:13413ea9a877 373 assert_param(IS_I2C_DUAL_ADDRESS(hi2c->Init.DualAddressMode));
ganlikun 0:13413ea9a877 374 assert_param(IS_I2C_OWN_ADDRESS2(hi2c->Init.OwnAddress2));
ganlikun 0:13413ea9a877 375 assert_param(IS_I2C_GENERAL_CALL(hi2c->Init.GeneralCallMode));
ganlikun 0:13413ea9a877 376 assert_param(IS_I2C_NO_STRETCH(hi2c->Init.NoStretchMode));
ganlikun 0:13413ea9a877 377
ganlikun 0:13413ea9a877 378 if(hi2c->State == HAL_I2C_STATE_RESET)
ganlikun 0:13413ea9a877 379 {
ganlikun 0:13413ea9a877 380 /* Allocate lock resource and initialize it */
ganlikun 0:13413ea9a877 381 hi2c->Lock = HAL_UNLOCKED;
ganlikun 0:13413ea9a877 382 /* Init the low level hardware : GPIO, CLOCK, NVIC */
ganlikun 0:13413ea9a877 383 HAL_I2C_MspInit(hi2c);
ganlikun 0:13413ea9a877 384 }
ganlikun 0:13413ea9a877 385
ganlikun 0:13413ea9a877 386 hi2c->State = HAL_I2C_STATE_BUSY;
ganlikun 0:13413ea9a877 387
ganlikun 0:13413ea9a877 388 /* Disable the selected I2C peripheral */
ganlikun 0:13413ea9a877 389 __HAL_I2C_DISABLE(hi2c);
ganlikun 0:13413ea9a877 390
ganlikun 0:13413ea9a877 391 /* Get PCLK1 frequency */
ganlikun 0:13413ea9a877 392 pclk1 = HAL_RCC_GetPCLK1Freq();
ganlikun 0:13413ea9a877 393
ganlikun 0:13413ea9a877 394 /* Calculate frequency range */
ganlikun 0:13413ea9a877 395 freqrange = I2C_FREQRANGE(pclk1);
ganlikun 0:13413ea9a877 396
ganlikun 0:13413ea9a877 397 /*---------------------------- I2Cx CR2 Configuration ----------------------*/
ganlikun 0:13413ea9a877 398 /* Configure I2Cx: Frequency range */
ganlikun 0:13413ea9a877 399 hi2c->Instance->CR2 = freqrange;
ganlikun 0:13413ea9a877 400
ganlikun 0:13413ea9a877 401 /*---------------------------- I2Cx TRISE Configuration --------------------*/
ganlikun 0:13413ea9a877 402 /* Configure I2Cx: Rise Time */
ganlikun 0:13413ea9a877 403 hi2c->Instance->TRISE = I2C_RISE_TIME(freqrange, hi2c->Init.ClockSpeed);
ganlikun 0:13413ea9a877 404
ganlikun 0:13413ea9a877 405 /*---------------------------- I2Cx CCR Configuration ----------------------*/
ganlikun 0:13413ea9a877 406 /* Configure I2Cx: Speed */
ganlikun 0:13413ea9a877 407 hi2c->Instance->CCR = I2C_SPEED(pclk1, hi2c->Init.ClockSpeed, hi2c->Init.DutyCycle);
ganlikun 0:13413ea9a877 408
ganlikun 0:13413ea9a877 409 /*---------------------------- I2Cx CR1 Configuration ----------------------*/
ganlikun 0:13413ea9a877 410 /* Configure I2Cx: Generalcall and NoStretch mode */
ganlikun 0:13413ea9a877 411 hi2c->Instance->CR1 = (hi2c->Init.GeneralCallMode | hi2c->Init.NoStretchMode);
ganlikun 0:13413ea9a877 412
ganlikun 0:13413ea9a877 413 /*---------------------------- I2Cx OAR1 Configuration ---------------------*/
ganlikun 0:13413ea9a877 414 /* Configure I2Cx: Own Address1 and addressing mode */
ganlikun 0:13413ea9a877 415 hi2c->Instance->OAR1 = (hi2c->Init.AddressingMode | hi2c->Init.OwnAddress1);
ganlikun 0:13413ea9a877 416
ganlikun 0:13413ea9a877 417 /*---------------------------- I2Cx OAR2 Configuration ---------------------*/
ganlikun 0:13413ea9a877 418 /* Configure I2Cx: Dual mode and Own Address2 */
ganlikun 0:13413ea9a877 419 hi2c->Instance->OAR2 = (hi2c->Init.DualAddressMode | hi2c->Init.OwnAddress2);
ganlikun 0:13413ea9a877 420
ganlikun 0:13413ea9a877 421 /* Enable the selected I2C peripheral */
ganlikun 0:13413ea9a877 422 __HAL_I2C_ENABLE(hi2c);
ganlikun 0:13413ea9a877 423
ganlikun 0:13413ea9a877 424 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 425 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 426 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 427 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 428
ganlikun 0:13413ea9a877 429 return HAL_OK;
ganlikun 0:13413ea9a877 430 }
ganlikun 0:13413ea9a877 431
ganlikun 0:13413ea9a877 432 /**
ganlikun 0:13413ea9a877 433 * @brief DeInitializes the I2C peripheral.
ganlikun 0:13413ea9a877 434 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 435 * the configuration information for I2C module
ganlikun 0:13413ea9a877 436 * @retval HAL status
ganlikun 0:13413ea9a877 437 */
ganlikun 0:13413ea9a877 438 HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 439 {
ganlikun 0:13413ea9a877 440 /* Check the I2C handle allocation */
ganlikun 0:13413ea9a877 441 if(hi2c == NULL)
ganlikun 0:13413ea9a877 442 {
ganlikun 0:13413ea9a877 443 return HAL_ERROR;
ganlikun 0:13413ea9a877 444 }
ganlikun 0:13413ea9a877 445
ganlikun 0:13413ea9a877 446 /* Check the parameters */
ganlikun 0:13413ea9a877 447 assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance));
ganlikun 0:13413ea9a877 448
ganlikun 0:13413ea9a877 449 hi2c->State = HAL_I2C_STATE_BUSY;
ganlikun 0:13413ea9a877 450
ganlikun 0:13413ea9a877 451 /* Disable the I2C Peripheral Clock */
ganlikun 0:13413ea9a877 452 __HAL_I2C_DISABLE(hi2c);
ganlikun 0:13413ea9a877 453
ganlikun 0:13413ea9a877 454 /* DeInit the low level hardware: GPIO, CLOCK, NVIC */
ganlikun 0:13413ea9a877 455 HAL_I2C_MspDeInit(hi2c);
ganlikun 0:13413ea9a877 456
ganlikun 0:13413ea9a877 457 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 458 hi2c->State = HAL_I2C_STATE_RESET;
ganlikun 0:13413ea9a877 459 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 460 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 461
ganlikun 0:13413ea9a877 462 /* Release Lock */
ganlikun 0:13413ea9a877 463 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 464
ganlikun 0:13413ea9a877 465 return HAL_OK;
ganlikun 0:13413ea9a877 466 }
ganlikun 0:13413ea9a877 467
ganlikun 0:13413ea9a877 468 /**
ganlikun 0:13413ea9a877 469 * @brief I2C MSP Init.
ganlikun 0:13413ea9a877 470 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 471 * the configuration information for I2C module
ganlikun 0:13413ea9a877 472 * @retval None
ganlikun 0:13413ea9a877 473 */
ganlikun 0:13413ea9a877 474 __weak void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 475 {
ganlikun 0:13413ea9a877 476 /* Prevent unused argument(s) compilation warning */
ganlikun 0:13413ea9a877 477 UNUSED(hi2c);
ganlikun 0:13413ea9a877 478 /* NOTE : This function Should not be modified, when the callback is needed,
ganlikun 0:13413ea9a877 479 the HAL_I2C_MspInit could be implemented in the user file
ganlikun 0:13413ea9a877 480 */
ganlikun 0:13413ea9a877 481 }
ganlikun 0:13413ea9a877 482
ganlikun 0:13413ea9a877 483 /**
ganlikun 0:13413ea9a877 484 * @brief I2C MSP DeInit
ganlikun 0:13413ea9a877 485 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 486 * the configuration information for I2C module
ganlikun 0:13413ea9a877 487 * @retval None
ganlikun 0:13413ea9a877 488 */
ganlikun 0:13413ea9a877 489 __weak void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 490 {
ganlikun 0:13413ea9a877 491 /* Prevent unused argument(s) compilation warning */
ganlikun 0:13413ea9a877 492 UNUSED(hi2c);
ganlikun 0:13413ea9a877 493 /* NOTE : This function Should not be modified, when the callback is needed,
ganlikun 0:13413ea9a877 494 the HAL_I2C_MspDeInit could be implemented in the user file
ganlikun 0:13413ea9a877 495 */
ganlikun 0:13413ea9a877 496 }
ganlikun 0:13413ea9a877 497
ganlikun 0:13413ea9a877 498 /**
ganlikun 0:13413ea9a877 499 * @}
ganlikun 0:13413ea9a877 500 */
ganlikun 0:13413ea9a877 501
ganlikun 0:13413ea9a877 502 /** @defgroup I2C_Exported_Functions_Group2 IO operation functions
ganlikun 0:13413ea9a877 503 * @brief Data transfers functions
ganlikun 0:13413ea9a877 504 *
ganlikun 0:13413ea9a877 505 @verbatim
ganlikun 0:13413ea9a877 506 ===============================================================================
ganlikun 0:13413ea9a877 507 ##### IO operation functions #####
ganlikun 0:13413ea9a877 508 ===============================================================================
ganlikun 0:13413ea9a877 509 [..]
ganlikun 0:13413ea9a877 510 This subsection provides a set of functions allowing to manage the I2C data
ganlikun 0:13413ea9a877 511 transfers.
ganlikun 0:13413ea9a877 512
ganlikun 0:13413ea9a877 513 (#) There are two modes of transfer:
ganlikun 0:13413ea9a877 514 (++) Blocking mode : The communication is performed in the polling mode.
ganlikun 0:13413ea9a877 515 The status of all data processing is returned by the same function
ganlikun 0:13413ea9a877 516 after finishing transfer.
ganlikun 0:13413ea9a877 517 (++) No-Blocking mode : The communication is performed using Interrupts
ganlikun 0:13413ea9a877 518 or DMA. These functions return the status of the transfer startup.
ganlikun 0:13413ea9a877 519 The end of the data processing will be indicated through the
ganlikun 0:13413ea9a877 520 dedicated I2C IRQ when using Interrupt mode or the DMA IRQ when
ganlikun 0:13413ea9a877 521 using DMA mode.
ganlikun 0:13413ea9a877 522
ganlikun 0:13413ea9a877 523 (#) Blocking mode functions are :
ganlikun 0:13413ea9a877 524 (++) HAL_I2C_Master_Transmit()
ganlikun 0:13413ea9a877 525 (++) HAL_I2C_Master_Receive()
ganlikun 0:13413ea9a877 526 (++) HAL_I2C_Slave_Transmit()
ganlikun 0:13413ea9a877 527 (++) HAL_I2C_Slave_Receive()
ganlikun 0:13413ea9a877 528 (++) HAL_I2C_Mem_Write()
ganlikun 0:13413ea9a877 529 (++) HAL_I2C_Mem_Read()
ganlikun 0:13413ea9a877 530 (++) HAL_I2C_IsDeviceReady()
ganlikun 0:13413ea9a877 531
ganlikun 0:13413ea9a877 532 (#) No-Blocking mode functions with Interrupt are :
ganlikun 0:13413ea9a877 533 (++) HAL_I2C_Master_Transmit_IT()
ganlikun 0:13413ea9a877 534 (++) HAL_I2C_Master_Receive_IT()
ganlikun 0:13413ea9a877 535 (++) HAL_I2C_Slave_Transmit_IT()
ganlikun 0:13413ea9a877 536 (++) HAL_I2C_Slave_Receive_IT()
ganlikun 0:13413ea9a877 537 (++) HAL_I2C_Master_Sequential_Transmit_IT()
ganlikun 0:13413ea9a877 538 (++) HAL_I2C_Master_Sequential_Receive_IT()
ganlikun 0:13413ea9a877 539 (++) HAL_I2C_Slave_Sequential_Transmit_IT()
ganlikun 0:13413ea9a877 540 (++) HAL_I2C_Slave_Sequential_Receive_IT()
ganlikun 0:13413ea9a877 541 (++) HAL_I2C_Mem_Write_IT()
ganlikun 0:13413ea9a877 542 (++) HAL_I2C_Mem_Read_IT()
ganlikun 0:13413ea9a877 543
ganlikun 0:13413ea9a877 544 (#) No-Blocking mode functions with DMA are :
ganlikun 0:13413ea9a877 545 (++) HAL_I2C_Master_Transmit_DMA()
ganlikun 0:13413ea9a877 546 (++) HAL_I2C_Master_Receive_DMA()
ganlikun 0:13413ea9a877 547 (++) HAL_I2C_Slave_Transmit_DMA()
ganlikun 0:13413ea9a877 548 (++) HAL_I2C_Slave_Receive_DMA()
ganlikun 0:13413ea9a877 549 (++) HAL_I2C_Mem_Write_DMA()
ganlikun 0:13413ea9a877 550 (++) HAL_I2C_Mem_Read_DMA()
ganlikun 0:13413ea9a877 551
ganlikun 0:13413ea9a877 552 (#) A set of Transfer Complete Callbacks are provided in non Blocking mode:
ganlikun 0:13413ea9a877 553 (++) HAL_I2C_MemTxCpltCallback()
ganlikun 0:13413ea9a877 554 (++) HAL_I2C_MemRxCpltCallback()
ganlikun 0:13413ea9a877 555 (++) HAL_I2C_MasterTxCpltCallback()
ganlikun 0:13413ea9a877 556 (++) HAL_I2C_MasterRxCpltCallback()
ganlikun 0:13413ea9a877 557 (++) HAL_I2C_SlaveTxCpltCallback()
ganlikun 0:13413ea9a877 558 (++) HAL_I2C_SlaveRxCpltCallback()
ganlikun 0:13413ea9a877 559 (++) HAL_I2C_ErrorCallback()
ganlikun 0:13413ea9a877 560 (++) HAL_I2C_AbortCpltCallback()
ganlikun 0:13413ea9a877 561
ganlikun 0:13413ea9a877 562 @endverbatim
ganlikun 0:13413ea9a877 563 * @{
ganlikun 0:13413ea9a877 564 */
ganlikun 0:13413ea9a877 565
ganlikun 0:13413ea9a877 566 /**
ganlikun 0:13413ea9a877 567 * @brief Transmits in master mode an amount of data in blocking mode.
ganlikun 0:13413ea9a877 568 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 569 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 570 * @param DevAddress Target device address: The device 7 bits address value
ganlikun 0:13413ea9a877 571 * in datasheet must be shift at right before call interface
ganlikun 0:13413ea9a877 572 * @param pData Pointer to data buffer
ganlikun 0:13413ea9a877 573 * @param Size Amount of data to be sent
ganlikun 0:13413ea9a877 574 * @param Timeout Timeout duration
ganlikun 0:13413ea9a877 575 * @retval HAL status
ganlikun 0:13413ea9a877 576 */
ganlikun 0:13413ea9a877 577 HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
ganlikun 0:13413ea9a877 578 {
ganlikun 0:13413ea9a877 579 uint32_t tickstart = 0x00U;
ganlikun 0:13413ea9a877 580
ganlikun 0:13413ea9a877 581 /* Init tickstart for timeout management*/
ganlikun 0:13413ea9a877 582 tickstart = HAL_GetTick();
ganlikun 0:13413ea9a877 583
ganlikun 0:13413ea9a877 584 if(hi2c->State == HAL_I2C_STATE_READY)
ganlikun 0:13413ea9a877 585 {
ganlikun 0:13413ea9a877 586 /* Wait until BUSY flag is reset */
ganlikun 0:13413ea9a877 587 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 588 {
ganlikun 0:13413ea9a877 589 return HAL_BUSY;
ganlikun 0:13413ea9a877 590 }
ganlikun 0:13413ea9a877 591
ganlikun 0:13413ea9a877 592 /* Process Locked */
ganlikun 0:13413ea9a877 593 __HAL_LOCK(hi2c);
ganlikun 0:13413ea9a877 594
ganlikun 0:13413ea9a877 595 /* Check if the I2C is already enabled */
ganlikun 0:13413ea9a877 596 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
ganlikun 0:13413ea9a877 597 {
ganlikun 0:13413ea9a877 598 /* Enable I2C peripheral */
ganlikun 0:13413ea9a877 599 __HAL_I2C_ENABLE(hi2c);
ganlikun 0:13413ea9a877 600 }
ganlikun 0:13413ea9a877 601
ganlikun 0:13413ea9a877 602 /* Disable Pos */
ganlikun 0:13413ea9a877 603 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
ganlikun 0:13413ea9a877 604
ganlikun 0:13413ea9a877 605 hi2c->State = HAL_I2C_STATE_BUSY_TX;
ganlikun 0:13413ea9a877 606 hi2c->Mode = HAL_I2C_MODE_MASTER;
ganlikun 0:13413ea9a877 607 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 608
ganlikun 0:13413ea9a877 609 /* Prepare transfer parameters */
ganlikun 0:13413ea9a877 610 hi2c->pBuffPtr = pData;
ganlikun 0:13413ea9a877 611 hi2c->XferCount = Size;
ganlikun 0:13413ea9a877 612 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
ganlikun 0:13413ea9a877 613 hi2c->XferSize = hi2c->XferCount;
ganlikun 0:13413ea9a877 614
ganlikun 0:13413ea9a877 615 /* Send Slave Address */
ganlikun 0:13413ea9a877 616 if(I2C_MasterRequestWrite(hi2c, DevAddress, Timeout, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 617 {
ganlikun 0:13413ea9a877 618 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
ganlikun 0:13413ea9a877 619 {
ganlikun 0:13413ea9a877 620 /* Process Unlocked */
ganlikun 0:13413ea9a877 621 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 622 return HAL_ERROR;
ganlikun 0:13413ea9a877 623 }
ganlikun 0:13413ea9a877 624 else
ganlikun 0:13413ea9a877 625 {
ganlikun 0:13413ea9a877 626 /* Process Unlocked */
ganlikun 0:13413ea9a877 627 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 628 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 629 }
ganlikun 0:13413ea9a877 630 }
ganlikun 0:13413ea9a877 631
ganlikun 0:13413ea9a877 632 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 633 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 634
ganlikun 0:13413ea9a877 635 while(hi2c->XferSize > 0U)
ganlikun 0:13413ea9a877 636 {
ganlikun 0:13413ea9a877 637 /* Wait until TXE flag is set */
ganlikun 0:13413ea9a877 638 if(I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 639 {
ganlikun 0:13413ea9a877 640 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
ganlikun 0:13413ea9a877 641 {
ganlikun 0:13413ea9a877 642 /* Generate Stop */
ganlikun 0:13413ea9a877 643 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 644 return HAL_ERROR;
ganlikun 0:13413ea9a877 645 }
ganlikun 0:13413ea9a877 646 else
ganlikun 0:13413ea9a877 647 {
ganlikun 0:13413ea9a877 648 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 649 }
ganlikun 0:13413ea9a877 650 }
ganlikun 0:13413ea9a877 651
ganlikun 0:13413ea9a877 652 /* Write data to DR */
ganlikun 0:13413ea9a877 653 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
ganlikun 0:13413ea9a877 654 hi2c->XferCount--;
ganlikun 0:13413ea9a877 655 hi2c->XferSize--;
ganlikun 0:13413ea9a877 656
ganlikun 0:13413ea9a877 657 if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U))
ganlikun 0:13413ea9a877 658 {
ganlikun 0:13413ea9a877 659 /* Write data to DR */
ganlikun 0:13413ea9a877 660 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
ganlikun 0:13413ea9a877 661 hi2c->XferCount--;
ganlikun 0:13413ea9a877 662 hi2c->XferSize--;
ganlikun 0:13413ea9a877 663 }
ganlikun 0:13413ea9a877 664
ganlikun 0:13413ea9a877 665 /* Wait until BTF flag is set */
ganlikun 0:13413ea9a877 666 if(I2C_WaitOnBTFFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 667 {
ganlikun 0:13413ea9a877 668 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
ganlikun 0:13413ea9a877 669 {
ganlikun 0:13413ea9a877 670 /* Generate Stop */
ganlikun 0:13413ea9a877 671 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 672 return HAL_ERROR;
ganlikun 0:13413ea9a877 673 }
ganlikun 0:13413ea9a877 674 else
ganlikun 0:13413ea9a877 675 {
ganlikun 0:13413ea9a877 676 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 677 }
ganlikun 0:13413ea9a877 678 }
ganlikun 0:13413ea9a877 679 }
ganlikun 0:13413ea9a877 680
ganlikun 0:13413ea9a877 681 /* Generate Stop */
ganlikun 0:13413ea9a877 682 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 683
ganlikun 0:13413ea9a877 684 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 685 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 686
ganlikun 0:13413ea9a877 687 /* Process Unlocked */
ganlikun 0:13413ea9a877 688 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 689
ganlikun 0:13413ea9a877 690 return HAL_OK;
ganlikun 0:13413ea9a877 691 }
ganlikun 0:13413ea9a877 692 else
ganlikun 0:13413ea9a877 693 {
ganlikun 0:13413ea9a877 694 return HAL_BUSY;
ganlikun 0:13413ea9a877 695 }
ganlikun 0:13413ea9a877 696 }
ganlikun 0:13413ea9a877 697
ganlikun 0:13413ea9a877 698 /**
ganlikun 0:13413ea9a877 699 * @brief Receives in master mode an amount of data in blocking mode.
ganlikun 0:13413ea9a877 700 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 701 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 702 * @param DevAddress Target device address: The device 7 bits address value
ganlikun 0:13413ea9a877 703 * in datasheet must be shift at right before call interface
ganlikun 0:13413ea9a877 704 * @param pData Pointer to data buffer
ganlikun 0:13413ea9a877 705 * @param Size Amount of data to be sent
ganlikun 0:13413ea9a877 706 * @param Timeout Timeout duration
ganlikun 0:13413ea9a877 707 * @retval HAL status
ganlikun 0:13413ea9a877 708 */
ganlikun 0:13413ea9a877 709 HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
ganlikun 0:13413ea9a877 710 {
ganlikun 0:13413ea9a877 711 uint32_t tickstart = 0x00U;
ganlikun 0:13413ea9a877 712
ganlikun 0:13413ea9a877 713 /* Init tickstart for timeout management*/
ganlikun 0:13413ea9a877 714 tickstart = HAL_GetTick();
ganlikun 0:13413ea9a877 715
ganlikun 0:13413ea9a877 716 if(hi2c->State == HAL_I2C_STATE_READY)
ganlikun 0:13413ea9a877 717 {
ganlikun 0:13413ea9a877 718 /* Wait until BUSY flag is reset */
ganlikun 0:13413ea9a877 719 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 720 {
ganlikun 0:13413ea9a877 721 return HAL_BUSY;
ganlikun 0:13413ea9a877 722 }
ganlikun 0:13413ea9a877 723
ganlikun 0:13413ea9a877 724 /* Process Locked */
ganlikun 0:13413ea9a877 725 __HAL_LOCK(hi2c);
ganlikun 0:13413ea9a877 726
ganlikun 0:13413ea9a877 727 /* Check if the I2C is already enabled */
ganlikun 0:13413ea9a877 728 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
ganlikun 0:13413ea9a877 729 {
ganlikun 0:13413ea9a877 730 /* Enable I2C peripheral */
ganlikun 0:13413ea9a877 731 __HAL_I2C_ENABLE(hi2c);
ganlikun 0:13413ea9a877 732 }
ganlikun 0:13413ea9a877 733
ganlikun 0:13413ea9a877 734 /* Disable Pos */
ganlikun 0:13413ea9a877 735 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
ganlikun 0:13413ea9a877 736
ganlikun 0:13413ea9a877 737 hi2c->State = HAL_I2C_STATE_BUSY_RX;
ganlikun 0:13413ea9a877 738 hi2c->Mode = HAL_I2C_MODE_MASTER;
ganlikun 0:13413ea9a877 739 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 740
ganlikun 0:13413ea9a877 741 /* Prepare transfer parameters */
ganlikun 0:13413ea9a877 742 hi2c->pBuffPtr = pData;
ganlikun 0:13413ea9a877 743 hi2c->XferCount = Size;
ganlikun 0:13413ea9a877 744 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
ganlikun 0:13413ea9a877 745 hi2c->XferSize = hi2c->XferCount;
ganlikun 0:13413ea9a877 746
ganlikun 0:13413ea9a877 747 /* Send Slave Address */
ganlikun 0:13413ea9a877 748 if(I2C_MasterRequestRead(hi2c, DevAddress, Timeout, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 749 {
ganlikun 0:13413ea9a877 750 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
ganlikun 0:13413ea9a877 751 {
ganlikun 0:13413ea9a877 752 /* Process Unlocked */
ganlikun 0:13413ea9a877 753 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 754 return HAL_ERROR;
ganlikun 0:13413ea9a877 755 }
ganlikun 0:13413ea9a877 756 else
ganlikun 0:13413ea9a877 757 {
ganlikun 0:13413ea9a877 758 /* Process Unlocked */
ganlikun 0:13413ea9a877 759 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 760 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 761 }
ganlikun 0:13413ea9a877 762 }
ganlikun 0:13413ea9a877 763
ganlikun 0:13413ea9a877 764 if(hi2c->XferSize == 0U)
ganlikun 0:13413ea9a877 765 {
ganlikun 0:13413ea9a877 766 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 767 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 768
ganlikun 0:13413ea9a877 769 /* Generate Stop */
ganlikun 0:13413ea9a877 770 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 771 }
ganlikun 0:13413ea9a877 772 else if(hi2c->XferSize == 1U)
ganlikun 0:13413ea9a877 773 {
ganlikun 0:13413ea9a877 774 /* Disable Acknowledge */
ganlikun 0:13413ea9a877 775 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 776
ganlikun 0:13413ea9a877 777 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 778 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 779
ganlikun 0:13413ea9a877 780 /* Generate Stop */
ganlikun 0:13413ea9a877 781 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 782 }
ganlikun 0:13413ea9a877 783 else if(hi2c->XferSize == 2U)
ganlikun 0:13413ea9a877 784 {
ganlikun 0:13413ea9a877 785 /* Disable Acknowledge */
ganlikun 0:13413ea9a877 786 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 787
ganlikun 0:13413ea9a877 788 /* Enable Pos */
ganlikun 0:13413ea9a877 789 hi2c->Instance->CR1 |= I2C_CR1_POS;
ganlikun 0:13413ea9a877 790
ganlikun 0:13413ea9a877 791 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 792 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 793 }
ganlikun 0:13413ea9a877 794 else
ganlikun 0:13413ea9a877 795 {
ganlikun 0:13413ea9a877 796 /* Enable Acknowledge */
ganlikun 0:13413ea9a877 797 hi2c->Instance->CR1 |= I2C_CR1_ACK;
ganlikun 0:13413ea9a877 798
ganlikun 0:13413ea9a877 799 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 800 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 801 }
ganlikun 0:13413ea9a877 802
ganlikun 0:13413ea9a877 803 while(hi2c->XferSize > 0U)
ganlikun 0:13413ea9a877 804 {
ganlikun 0:13413ea9a877 805 if(hi2c->XferSize <= 3U)
ganlikun 0:13413ea9a877 806 {
ganlikun 0:13413ea9a877 807 /* One byte */
ganlikun 0:13413ea9a877 808 if(hi2c->XferSize == 1U)
ganlikun 0:13413ea9a877 809 {
ganlikun 0:13413ea9a877 810 /* Wait until RXNE flag is set */
ganlikun 0:13413ea9a877 811 if(I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 812 {
ganlikun 0:13413ea9a877 813 if(hi2c->ErrorCode == HAL_I2C_ERROR_TIMEOUT)
ganlikun 0:13413ea9a877 814 {
ganlikun 0:13413ea9a877 815 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 816 }
ganlikun 0:13413ea9a877 817 else
ganlikun 0:13413ea9a877 818 {
ganlikun 0:13413ea9a877 819 return HAL_ERROR;
ganlikun 0:13413ea9a877 820 }
ganlikun 0:13413ea9a877 821 }
ganlikun 0:13413ea9a877 822
ganlikun 0:13413ea9a877 823 /* Read data from DR */
ganlikun 0:13413ea9a877 824 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 825 hi2c->XferSize--;
ganlikun 0:13413ea9a877 826 hi2c->XferCount--;
ganlikun 0:13413ea9a877 827 }
ganlikun 0:13413ea9a877 828 /* Two bytes */
ganlikun 0:13413ea9a877 829 else if(hi2c->XferSize == 2U)
ganlikun 0:13413ea9a877 830 {
ganlikun 0:13413ea9a877 831 /* Wait until BTF flag is set */
ganlikun 0:13413ea9a877 832 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 833 {
ganlikun 0:13413ea9a877 834 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 835 }
ganlikun 0:13413ea9a877 836
ganlikun 0:13413ea9a877 837 /* Generate Stop */
ganlikun 0:13413ea9a877 838 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 839
ganlikun 0:13413ea9a877 840 /* Read data from DR */
ganlikun 0:13413ea9a877 841 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 842 hi2c->XferSize--;
ganlikun 0:13413ea9a877 843 hi2c->XferCount--;
ganlikun 0:13413ea9a877 844
ganlikun 0:13413ea9a877 845 /* Read data from DR */
ganlikun 0:13413ea9a877 846 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 847 hi2c->XferSize--;
ganlikun 0:13413ea9a877 848 hi2c->XferCount--;
ganlikun 0:13413ea9a877 849 }
ganlikun 0:13413ea9a877 850 /* 3 Last bytes */
ganlikun 0:13413ea9a877 851 else
ganlikun 0:13413ea9a877 852 {
ganlikun 0:13413ea9a877 853 /* Wait until BTF flag is set */
ganlikun 0:13413ea9a877 854 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 855 {
ganlikun 0:13413ea9a877 856 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 857 }
ganlikun 0:13413ea9a877 858
ganlikun 0:13413ea9a877 859 /* Disable Acknowledge */
ganlikun 0:13413ea9a877 860 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 861
ganlikun 0:13413ea9a877 862 /* Read data from DR */
ganlikun 0:13413ea9a877 863 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 864 hi2c->XferSize--;
ganlikun 0:13413ea9a877 865 hi2c->XferCount--;
ganlikun 0:13413ea9a877 866
ganlikun 0:13413ea9a877 867 /* Wait until BTF flag is set */
ganlikun 0:13413ea9a877 868 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 869 {
ganlikun 0:13413ea9a877 870 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 871 }
ganlikun 0:13413ea9a877 872
ganlikun 0:13413ea9a877 873 /* Generate Stop */
ganlikun 0:13413ea9a877 874 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 875
ganlikun 0:13413ea9a877 876 /* Read data from DR */
ganlikun 0:13413ea9a877 877 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 878 hi2c->XferSize--;
ganlikun 0:13413ea9a877 879 hi2c->XferCount--;
ganlikun 0:13413ea9a877 880
ganlikun 0:13413ea9a877 881 /* Read data from DR */
ganlikun 0:13413ea9a877 882 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 883 hi2c->XferSize--;
ganlikun 0:13413ea9a877 884 hi2c->XferCount--;
ganlikun 0:13413ea9a877 885 }
ganlikun 0:13413ea9a877 886 }
ganlikun 0:13413ea9a877 887 else
ganlikun 0:13413ea9a877 888 {
ganlikun 0:13413ea9a877 889 /* Wait until RXNE flag is set */
ganlikun 0:13413ea9a877 890 if(I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 891 {
ganlikun 0:13413ea9a877 892 if(hi2c->ErrorCode == HAL_I2C_ERROR_TIMEOUT)
ganlikun 0:13413ea9a877 893 {
ganlikun 0:13413ea9a877 894 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 895 }
ganlikun 0:13413ea9a877 896 else
ganlikun 0:13413ea9a877 897 {
ganlikun 0:13413ea9a877 898 return HAL_ERROR;
ganlikun 0:13413ea9a877 899 }
ganlikun 0:13413ea9a877 900 }
ganlikun 0:13413ea9a877 901
ganlikun 0:13413ea9a877 902 /* Read data from DR */
ganlikun 0:13413ea9a877 903 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 904 hi2c->XferSize--;
ganlikun 0:13413ea9a877 905 hi2c->XferCount--;
ganlikun 0:13413ea9a877 906
ganlikun 0:13413ea9a877 907 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET)
ganlikun 0:13413ea9a877 908 {
ganlikun 0:13413ea9a877 909 /* Read data from DR */
ganlikun 0:13413ea9a877 910 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 911 hi2c->XferSize--;
ganlikun 0:13413ea9a877 912 hi2c->XferCount--;
ganlikun 0:13413ea9a877 913 }
ganlikun 0:13413ea9a877 914 }
ganlikun 0:13413ea9a877 915 }
ganlikun 0:13413ea9a877 916
ganlikun 0:13413ea9a877 917 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 918 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 919
ganlikun 0:13413ea9a877 920 /* Process Unlocked */
ganlikun 0:13413ea9a877 921 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 922
ganlikun 0:13413ea9a877 923 return HAL_OK;
ganlikun 0:13413ea9a877 924 }
ganlikun 0:13413ea9a877 925 else
ganlikun 0:13413ea9a877 926 {
ganlikun 0:13413ea9a877 927 return HAL_BUSY;
ganlikun 0:13413ea9a877 928 }
ganlikun 0:13413ea9a877 929 }
ganlikun 0:13413ea9a877 930
ganlikun 0:13413ea9a877 931 /**
ganlikun 0:13413ea9a877 932 * @brief Transmits in slave mode an amount of data in blocking mode.
ganlikun 0:13413ea9a877 933 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 934 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 935 * @param pData Pointer to data buffer
ganlikun 0:13413ea9a877 936 * @param Size Amount of data to be sent
ganlikun 0:13413ea9a877 937 * @param Timeout Timeout duration
ganlikun 0:13413ea9a877 938 * @retval HAL status
ganlikun 0:13413ea9a877 939 */
ganlikun 0:13413ea9a877 940 HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout)
ganlikun 0:13413ea9a877 941 {
ganlikun 0:13413ea9a877 942 uint32_t tickstart = 0x00U;
ganlikun 0:13413ea9a877 943
ganlikun 0:13413ea9a877 944 /* Init tickstart for timeout management*/
ganlikun 0:13413ea9a877 945 tickstart = HAL_GetTick();
ganlikun 0:13413ea9a877 946
ganlikun 0:13413ea9a877 947 if(hi2c->State == HAL_I2C_STATE_READY)
ganlikun 0:13413ea9a877 948 {
ganlikun 0:13413ea9a877 949 if((pData == NULL) || (Size == 0U))
ganlikun 0:13413ea9a877 950 {
ganlikun 0:13413ea9a877 951 return HAL_ERROR;
ganlikun 0:13413ea9a877 952 }
ganlikun 0:13413ea9a877 953
ganlikun 0:13413ea9a877 954 /* Process Locked */
ganlikun 0:13413ea9a877 955 __HAL_LOCK(hi2c);
ganlikun 0:13413ea9a877 956
ganlikun 0:13413ea9a877 957 /* Check if the I2C is already enabled */
ganlikun 0:13413ea9a877 958 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
ganlikun 0:13413ea9a877 959 {
ganlikun 0:13413ea9a877 960 /* Enable I2C peripheral */
ganlikun 0:13413ea9a877 961 __HAL_I2C_ENABLE(hi2c);
ganlikun 0:13413ea9a877 962 }
ganlikun 0:13413ea9a877 963
ganlikun 0:13413ea9a877 964 /* Disable Pos */
ganlikun 0:13413ea9a877 965 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
ganlikun 0:13413ea9a877 966
ganlikun 0:13413ea9a877 967 hi2c->State = HAL_I2C_STATE_BUSY_TX;
ganlikun 0:13413ea9a877 968 hi2c->Mode = HAL_I2C_MODE_SLAVE;
ganlikun 0:13413ea9a877 969 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 970
ganlikun 0:13413ea9a877 971 /* Prepare transfer parameters */
ganlikun 0:13413ea9a877 972 hi2c->pBuffPtr = pData;
ganlikun 0:13413ea9a877 973 hi2c->XferCount = Size;
ganlikun 0:13413ea9a877 974 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
ganlikun 0:13413ea9a877 975 hi2c->XferSize = hi2c->XferCount;
ganlikun 0:13413ea9a877 976
ganlikun 0:13413ea9a877 977 /* Enable Address Acknowledge */
ganlikun 0:13413ea9a877 978 hi2c->Instance->CR1 |= I2C_CR1_ACK;
ganlikun 0:13413ea9a877 979
ganlikun 0:13413ea9a877 980 /* Wait until ADDR flag is set */
ganlikun 0:13413ea9a877 981 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 982 {
ganlikun 0:13413ea9a877 983 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 984 }
ganlikun 0:13413ea9a877 985
ganlikun 0:13413ea9a877 986 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 987 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 988
ganlikun 0:13413ea9a877 989 /* If 10bit addressing mode is selected */
ganlikun 0:13413ea9a877 990 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT)
ganlikun 0:13413ea9a877 991 {
ganlikun 0:13413ea9a877 992 /* Wait until ADDR flag is set */
ganlikun 0:13413ea9a877 993 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 994 {
ganlikun 0:13413ea9a877 995 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 996 }
ganlikun 0:13413ea9a877 997
ganlikun 0:13413ea9a877 998 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 999 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 1000 }
ganlikun 0:13413ea9a877 1001
ganlikun 0:13413ea9a877 1002 while(hi2c->XferSize > 0U)
ganlikun 0:13413ea9a877 1003 {
ganlikun 0:13413ea9a877 1004 /* Wait until TXE flag is set */
ganlikun 0:13413ea9a877 1005 if(I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 1006 {
ganlikun 0:13413ea9a877 1007 /* Disable Address Acknowledge */
ganlikun 0:13413ea9a877 1008 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 1009
ganlikun 0:13413ea9a877 1010 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
ganlikun 0:13413ea9a877 1011 {
ganlikun 0:13413ea9a877 1012 return HAL_ERROR;
ganlikun 0:13413ea9a877 1013 }
ganlikun 0:13413ea9a877 1014 else
ganlikun 0:13413ea9a877 1015 {
ganlikun 0:13413ea9a877 1016 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 1017 }
ganlikun 0:13413ea9a877 1018 }
ganlikun 0:13413ea9a877 1019
ganlikun 0:13413ea9a877 1020 /* Write data to DR */
ganlikun 0:13413ea9a877 1021 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
ganlikun 0:13413ea9a877 1022 hi2c->XferCount--;
ganlikun 0:13413ea9a877 1023 hi2c->XferSize--;
ganlikun 0:13413ea9a877 1024
ganlikun 0:13413ea9a877 1025 if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U))
ganlikun 0:13413ea9a877 1026 {
ganlikun 0:13413ea9a877 1027 /* Write data to DR */
ganlikun 0:13413ea9a877 1028 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
ganlikun 0:13413ea9a877 1029 hi2c->XferCount--;
ganlikun 0:13413ea9a877 1030 hi2c->XferSize--;
ganlikun 0:13413ea9a877 1031 }
ganlikun 0:13413ea9a877 1032 }
ganlikun 0:13413ea9a877 1033
ganlikun 0:13413ea9a877 1034 /* Wait until AF flag is set */
ganlikun 0:13413ea9a877 1035 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_AF, RESET, Timeout, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 1036 {
ganlikun 0:13413ea9a877 1037 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 1038 }
ganlikun 0:13413ea9a877 1039
ganlikun 0:13413ea9a877 1040 /* Clear AF flag */
ganlikun 0:13413ea9a877 1041 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
ganlikun 0:13413ea9a877 1042
ganlikun 0:13413ea9a877 1043 /* Disable Address Acknowledge */
ganlikun 0:13413ea9a877 1044 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 1045
ganlikun 0:13413ea9a877 1046 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 1047 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 1048
ganlikun 0:13413ea9a877 1049 /* Process Unlocked */
ganlikun 0:13413ea9a877 1050 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 1051
ganlikun 0:13413ea9a877 1052 return HAL_OK;
ganlikun 0:13413ea9a877 1053 }
ganlikun 0:13413ea9a877 1054 else
ganlikun 0:13413ea9a877 1055 {
ganlikun 0:13413ea9a877 1056 return HAL_BUSY;
ganlikun 0:13413ea9a877 1057 }
ganlikun 0:13413ea9a877 1058 }
ganlikun 0:13413ea9a877 1059
ganlikun 0:13413ea9a877 1060 /**
ganlikun 0:13413ea9a877 1061 * @brief Receive in slave mode an amount of data in blocking mode
ganlikun 0:13413ea9a877 1062 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 1063 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 1064 * @param pData Pointer to data buffer
ganlikun 0:13413ea9a877 1065 * @param Size Amount of data to be sent
ganlikun 0:13413ea9a877 1066 * @param Timeout Timeout duration
ganlikun 0:13413ea9a877 1067 * @retval HAL status
ganlikun 0:13413ea9a877 1068 */
ganlikun 0:13413ea9a877 1069 HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout)
ganlikun 0:13413ea9a877 1070 {
ganlikun 0:13413ea9a877 1071 uint32_t tickstart = 0x00U;
ganlikun 0:13413ea9a877 1072
ganlikun 0:13413ea9a877 1073 /* Init tickstart for timeout management*/
ganlikun 0:13413ea9a877 1074 tickstart = HAL_GetTick();
ganlikun 0:13413ea9a877 1075
ganlikun 0:13413ea9a877 1076 if(hi2c->State == HAL_I2C_STATE_READY)
ganlikun 0:13413ea9a877 1077 {
ganlikun 0:13413ea9a877 1078 if((pData == NULL) || (Size == 0))
ganlikun 0:13413ea9a877 1079 {
ganlikun 0:13413ea9a877 1080 return HAL_ERROR;
ganlikun 0:13413ea9a877 1081 }
ganlikun 0:13413ea9a877 1082
ganlikun 0:13413ea9a877 1083 /* Process Locked */
ganlikun 0:13413ea9a877 1084 __HAL_LOCK(hi2c);
ganlikun 0:13413ea9a877 1085
ganlikun 0:13413ea9a877 1086 /* Check if the I2C is already enabled */
ganlikun 0:13413ea9a877 1087 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
ganlikun 0:13413ea9a877 1088 {
ganlikun 0:13413ea9a877 1089 /* Enable I2C peripheral */
ganlikun 0:13413ea9a877 1090 __HAL_I2C_ENABLE(hi2c);
ganlikun 0:13413ea9a877 1091 }
ganlikun 0:13413ea9a877 1092
ganlikun 0:13413ea9a877 1093 /* Disable Pos */
ganlikun 0:13413ea9a877 1094 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
ganlikun 0:13413ea9a877 1095
ganlikun 0:13413ea9a877 1096 hi2c->State = HAL_I2C_STATE_BUSY_RX;
ganlikun 0:13413ea9a877 1097 hi2c->Mode = HAL_I2C_MODE_SLAVE;
ganlikun 0:13413ea9a877 1098 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 1099
ganlikun 0:13413ea9a877 1100 /* Prepare transfer parameters */
ganlikun 0:13413ea9a877 1101 hi2c->pBuffPtr = pData;
ganlikun 0:13413ea9a877 1102 hi2c->XferCount = Size;
ganlikun 0:13413ea9a877 1103 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
ganlikun 0:13413ea9a877 1104 hi2c->XferSize = hi2c->XferCount;
ganlikun 0:13413ea9a877 1105
ganlikun 0:13413ea9a877 1106 /* Enable Address Acknowledge */
ganlikun 0:13413ea9a877 1107 hi2c->Instance->CR1 |= I2C_CR1_ACK;
ganlikun 0:13413ea9a877 1108
ganlikun 0:13413ea9a877 1109 /* Wait until ADDR flag is set */
ganlikun 0:13413ea9a877 1110 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 1111 {
ganlikun 0:13413ea9a877 1112 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 1113 }
ganlikun 0:13413ea9a877 1114
ganlikun 0:13413ea9a877 1115 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 1116 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 1117
ganlikun 0:13413ea9a877 1118 while(hi2c->XferSize > 0U)
ganlikun 0:13413ea9a877 1119 {
ganlikun 0:13413ea9a877 1120 /* Wait until RXNE flag is set */
ganlikun 0:13413ea9a877 1121 if(I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 1122 {
ganlikun 0:13413ea9a877 1123 /* Disable Address Acknowledge */
ganlikun 0:13413ea9a877 1124 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 1125
ganlikun 0:13413ea9a877 1126 if(hi2c->ErrorCode == HAL_I2C_ERROR_TIMEOUT)
ganlikun 0:13413ea9a877 1127 {
ganlikun 0:13413ea9a877 1128 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 1129 }
ganlikun 0:13413ea9a877 1130 else
ganlikun 0:13413ea9a877 1131 {
ganlikun 0:13413ea9a877 1132 return HAL_ERROR;
ganlikun 0:13413ea9a877 1133 }
ganlikun 0:13413ea9a877 1134 }
ganlikun 0:13413ea9a877 1135
ganlikun 0:13413ea9a877 1136 /* Read data from DR */
ganlikun 0:13413ea9a877 1137 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 1138 hi2c->XferSize--;
ganlikun 0:13413ea9a877 1139 hi2c->XferCount--;
ganlikun 0:13413ea9a877 1140
ganlikun 0:13413ea9a877 1141 if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (Size != 0U))
ganlikun 0:13413ea9a877 1142 {
ganlikun 0:13413ea9a877 1143 /* Read data from DR */
ganlikun 0:13413ea9a877 1144 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 1145 hi2c->XferSize--;
ganlikun 0:13413ea9a877 1146 hi2c->XferCount--;
ganlikun 0:13413ea9a877 1147 }
ganlikun 0:13413ea9a877 1148 }
ganlikun 0:13413ea9a877 1149
ganlikun 0:13413ea9a877 1150 /* Wait until STOP flag is set */
ganlikun 0:13413ea9a877 1151 if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 1152 {
ganlikun 0:13413ea9a877 1153 /* Disable Address Acknowledge */
ganlikun 0:13413ea9a877 1154 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 1155
ganlikun 0:13413ea9a877 1156 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
ganlikun 0:13413ea9a877 1157 {
ganlikun 0:13413ea9a877 1158 return HAL_ERROR;
ganlikun 0:13413ea9a877 1159 }
ganlikun 0:13413ea9a877 1160 else
ganlikun 0:13413ea9a877 1161 {
ganlikun 0:13413ea9a877 1162 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 1163 }
ganlikun 0:13413ea9a877 1164 }
ganlikun 0:13413ea9a877 1165
ganlikun 0:13413ea9a877 1166 /* Clear STOP flag */
ganlikun 0:13413ea9a877 1167 __HAL_I2C_CLEAR_STOPFLAG(hi2c);
ganlikun 0:13413ea9a877 1168
ganlikun 0:13413ea9a877 1169 /* Disable Address Acknowledge */
ganlikun 0:13413ea9a877 1170 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 1171
ganlikun 0:13413ea9a877 1172 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 1173 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 1174
ganlikun 0:13413ea9a877 1175 /* Process Unlocked */
ganlikun 0:13413ea9a877 1176 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 1177
ganlikun 0:13413ea9a877 1178 return HAL_OK;
ganlikun 0:13413ea9a877 1179 }
ganlikun 0:13413ea9a877 1180 else
ganlikun 0:13413ea9a877 1181 {
ganlikun 0:13413ea9a877 1182 return HAL_BUSY;
ganlikun 0:13413ea9a877 1183 }
ganlikun 0:13413ea9a877 1184 }
ganlikun 0:13413ea9a877 1185
ganlikun 0:13413ea9a877 1186 /**
ganlikun 0:13413ea9a877 1187 * @brief Transmit in master mode an amount of data in non-blocking mode with Interrupt
ganlikun 0:13413ea9a877 1188 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 1189 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 1190 * @param DevAddress Target device address: The device 7 bits address value
ganlikun 0:13413ea9a877 1191 * in datasheet must be shift at right before call interface
ganlikun 0:13413ea9a877 1192 * @param pData Pointer to data buffer
ganlikun 0:13413ea9a877 1193 * @param Size Amount of data to be sent
ganlikun 0:13413ea9a877 1194 * @retval HAL status
ganlikun 0:13413ea9a877 1195 */
ganlikun 0:13413ea9a877 1196 HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
ganlikun 0:13413ea9a877 1197 {
ganlikun 0:13413ea9a877 1198 __IO uint32_t count = 0U;
ganlikun 0:13413ea9a877 1199
ganlikun 0:13413ea9a877 1200 if(hi2c->State == HAL_I2C_STATE_READY)
ganlikun 0:13413ea9a877 1201 {
ganlikun 0:13413ea9a877 1202 /* Wait until BUSY flag is reset */
ganlikun 0:13413ea9a877 1203 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock /25U /1000U);
ganlikun 0:13413ea9a877 1204 do
ganlikun 0:13413ea9a877 1205 {
ganlikun 0:13413ea9a877 1206 if(count-- == 0U)
ganlikun 0:13413ea9a877 1207 {
ganlikun 0:13413ea9a877 1208 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 1209 hi2c->State= HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 1210
ganlikun 0:13413ea9a877 1211 /* Process Unlocked */
ganlikun 0:13413ea9a877 1212 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 1213
ganlikun 0:13413ea9a877 1214 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 1215 }
ganlikun 0:13413ea9a877 1216 }
ganlikun 0:13413ea9a877 1217 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
ganlikun 0:13413ea9a877 1218
ganlikun 0:13413ea9a877 1219 /* Process Locked */
ganlikun 0:13413ea9a877 1220 __HAL_LOCK(hi2c);
ganlikun 0:13413ea9a877 1221
ganlikun 0:13413ea9a877 1222 /* Check if the I2C is already enabled */
ganlikun 0:13413ea9a877 1223 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
ganlikun 0:13413ea9a877 1224 {
ganlikun 0:13413ea9a877 1225 /* Enable I2C peripheral */
ganlikun 0:13413ea9a877 1226 __HAL_I2C_ENABLE(hi2c);
ganlikun 0:13413ea9a877 1227 }
ganlikun 0:13413ea9a877 1228
ganlikun 0:13413ea9a877 1229 /* Disable Pos */
ganlikun 0:13413ea9a877 1230 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
ganlikun 0:13413ea9a877 1231
ganlikun 0:13413ea9a877 1232 hi2c->State = HAL_I2C_STATE_BUSY_TX;
ganlikun 0:13413ea9a877 1233 hi2c->Mode = HAL_I2C_MODE_MASTER;
ganlikun 0:13413ea9a877 1234 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 1235
ganlikun 0:13413ea9a877 1236 /* Prepare transfer parameters */
ganlikun 0:13413ea9a877 1237 hi2c->pBuffPtr = pData;
ganlikun 0:13413ea9a877 1238 hi2c->XferCount = Size;
ganlikun 0:13413ea9a877 1239 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
ganlikun 0:13413ea9a877 1240 hi2c->XferSize = hi2c->XferCount;
ganlikun 0:13413ea9a877 1241 hi2c->Devaddress = DevAddress;
ganlikun 0:13413ea9a877 1242
ganlikun 0:13413ea9a877 1243 /* Generate Start */
ganlikun 0:13413ea9a877 1244 hi2c->Instance->CR1 |= I2C_CR1_START;
ganlikun 0:13413ea9a877 1245
ganlikun 0:13413ea9a877 1246 /* Process Unlocked */
ganlikun 0:13413ea9a877 1247 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 1248
ganlikun 0:13413ea9a877 1249 /* Note : The I2C interrupts must be enabled after unlocking current process
ganlikun 0:13413ea9a877 1250 to avoid the risk of I2C interrupt handle execution before current
ganlikun 0:13413ea9a877 1251 process unlock */
ganlikun 0:13413ea9a877 1252 /* Enable EVT, BUF and ERR interrupt */
ganlikun 0:13413ea9a877 1253 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
ganlikun 0:13413ea9a877 1254
ganlikun 0:13413ea9a877 1255 return HAL_OK;
ganlikun 0:13413ea9a877 1256 }
ganlikun 0:13413ea9a877 1257 else
ganlikun 0:13413ea9a877 1258 {
ganlikun 0:13413ea9a877 1259 return HAL_BUSY;
ganlikun 0:13413ea9a877 1260 }
ganlikun 0:13413ea9a877 1261 }
ganlikun 0:13413ea9a877 1262
ganlikun 0:13413ea9a877 1263 /**
ganlikun 0:13413ea9a877 1264 * @brief Receive in master mode an amount of data in non-blocking mode with Interrupt
ganlikun 0:13413ea9a877 1265 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 1266 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 1267 * @param DevAddress Target device address: The device 7 bits address value
ganlikun 0:13413ea9a877 1268 * in datasheet must be shift at right before call interface
ganlikun 0:13413ea9a877 1269 * @param pData Pointer to data buffer
ganlikun 0:13413ea9a877 1270 * @param Size Amount of data to be sent
ganlikun 0:13413ea9a877 1271 * @retval HAL status
ganlikun 0:13413ea9a877 1272 */
ganlikun 0:13413ea9a877 1273 HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
ganlikun 0:13413ea9a877 1274 {
ganlikun 0:13413ea9a877 1275 __IO uint32_t count = 0U;
ganlikun 0:13413ea9a877 1276
ganlikun 0:13413ea9a877 1277 if(hi2c->State == HAL_I2C_STATE_READY)
ganlikun 0:13413ea9a877 1278 {
ganlikun 0:13413ea9a877 1279 /* Wait until BUSY flag is reset */
ganlikun 0:13413ea9a877 1280 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock /25U /1000U);
ganlikun 0:13413ea9a877 1281 do
ganlikun 0:13413ea9a877 1282 {
ganlikun 0:13413ea9a877 1283 if(count-- == 0U)
ganlikun 0:13413ea9a877 1284 {
ganlikun 0:13413ea9a877 1285 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 1286 hi2c->State= HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 1287
ganlikun 0:13413ea9a877 1288 /* Process Unlocked */
ganlikun 0:13413ea9a877 1289 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 1290
ganlikun 0:13413ea9a877 1291 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 1292 }
ganlikun 0:13413ea9a877 1293 }
ganlikun 0:13413ea9a877 1294 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
ganlikun 0:13413ea9a877 1295
ganlikun 0:13413ea9a877 1296 /* Process Locked */
ganlikun 0:13413ea9a877 1297 __HAL_LOCK(hi2c);
ganlikun 0:13413ea9a877 1298
ganlikun 0:13413ea9a877 1299 /* Check if the I2C is already enabled */
ganlikun 0:13413ea9a877 1300 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
ganlikun 0:13413ea9a877 1301 {
ganlikun 0:13413ea9a877 1302 /* Enable I2C peripheral */
ganlikun 0:13413ea9a877 1303 __HAL_I2C_ENABLE(hi2c);
ganlikun 0:13413ea9a877 1304 }
ganlikun 0:13413ea9a877 1305
ganlikun 0:13413ea9a877 1306 /* Disable Pos */
ganlikun 0:13413ea9a877 1307 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
ganlikun 0:13413ea9a877 1308
ganlikun 0:13413ea9a877 1309 hi2c->State = HAL_I2C_STATE_BUSY_RX;
ganlikun 0:13413ea9a877 1310 hi2c->Mode = HAL_I2C_MODE_MASTER;
ganlikun 0:13413ea9a877 1311 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 1312
ganlikun 0:13413ea9a877 1313 /* Prepare transfer parameters */
ganlikun 0:13413ea9a877 1314 hi2c->pBuffPtr = pData;
ganlikun 0:13413ea9a877 1315 hi2c->XferCount = Size;
ganlikun 0:13413ea9a877 1316 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
ganlikun 0:13413ea9a877 1317 hi2c->XferSize = hi2c->XferCount;
ganlikun 0:13413ea9a877 1318 hi2c->Devaddress = DevAddress;
ganlikun 0:13413ea9a877 1319
ganlikun 0:13413ea9a877 1320 /* Enable Acknowledge */
ganlikun 0:13413ea9a877 1321 hi2c->Instance->CR1 |= I2C_CR1_ACK;
ganlikun 0:13413ea9a877 1322
ganlikun 0:13413ea9a877 1323 /* Generate Start */
ganlikun 0:13413ea9a877 1324 hi2c->Instance->CR1 |= I2C_CR1_START;
ganlikun 0:13413ea9a877 1325
ganlikun 0:13413ea9a877 1326 /* Process Unlocked */
ganlikun 0:13413ea9a877 1327 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 1328
ganlikun 0:13413ea9a877 1329 /* Note : The I2C interrupts must be enabled after unlocking current process
ganlikun 0:13413ea9a877 1330 to avoid the risk of I2C interrupt handle execution before current
ganlikun 0:13413ea9a877 1331 process unlock */
ganlikun 0:13413ea9a877 1332
ganlikun 0:13413ea9a877 1333 /* Enable EVT, BUF and ERR interrupt */
ganlikun 0:13413ea9a877 1334 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
ganlikun 0:13413ea9a877 1335
ganlikun 0:13413ea9a877 1336 return HAL_OK;
ganlikun 0:13413ea9a877 1337 }
ganlikun 0:13413ea9a877 1338 else
ganlikun 0:13413ea9a877 1339 {
ganlikun 0:13413ea9a877 1340 return HAL_BUSY;
ganlikun 0:13413ea9a877 1341 }
ganlikun 0:13413ea9a877 1342 }
ganlikun 0:13413ea9a877 1343
ganlikun 0:13413ea9a877 1344 /**
ganlikun 0:13413ea9a877 1345 * @brief Sequential transmit in master mode an amount of data in non-blocking mode with Interrupt
ganlikun 0:13413ea9a877 1346 * @note This interface allow to manage repeated start condition when a direction change during transfer
ganlikun 0:13413ea9a877 1347 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 1348 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 1349 * @param DevAddress Target device address: The device 7 bits address value
ganlikun 0:13413ea9a877 1350 * in datasheet must be shift at right before call interface
ganlikun 0:13413ea9a877 1351 * @param pData Pointer to data buffer
ganlikun 0:13413ea9a877 1352 * @param Size Amount of data to be sent
ganlikun 0:13413ea9a877 1353 * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition
ganlikun 0:13413ea9a877 1354 * @retval HAL status
ganlikun 0:13413ea9a877 1355 */
ganlikun 0:13413ea9a877 1356 HAL_StatusTypeDef HAL_I2C_Master_Sequential_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
ganlikun 0:13413ea9a877 1357 {
ganlikun 0:13413ea9a877 1358 __IO uint32_t Prev_State = 0x00U;
ganlikun 0:13413ea9a877 1359 __IO uint32_t count = 0x00U;
ganlikun 0:13413ea9a877 1360
ganlikun 0:13413ea9a877 1361 /* Check the parameters */
ganlikun 0:13413ea9a877 1362 assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
ganlikun 0:13413ea9a877 1363
ganlikun 0:13413ea9a877 1364 if(hi2c->State == HAL_I2C_STATE_READY)
ganlikun 0:13413ea9a877 1365 {
ganlikun 0:13413ea9a877 1366 /* Check Busy Flag only if FIRST call of Master interface */
ganlikun 0:13413ea9a877 1367 if((XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME))
ganlikun 0:13413ea9a877 1368 {
ganlikun 0:13413ea9a877 1369 /* Wait until BUSY flag is reset */
ganlikun 0:13413ea9a877 1370 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock /25U /1000U);
ganlikun 0:13413ea9a877 1371 do
ganlikun 0:13413ea9a877 1372 {
ganlikun 0:13413ea9a877 1373 if(count-- == 0U)
ganlikun 0:13413ea9a877 1374 {
ganlikun 0:13413ea9a877 1375 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 1376 hi2c->State= HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 1377
ganlikun 0:13413ea9a877 1378 /* Process Unlocked */
ganlikun 0:13413ea9a877 1379 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 1380
ganlikun 0:13413ea9a877 1381 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 1382 }
ganlikun 0:13413ea9a877 1383 }
ganlikun 0:13413ea9a877 1384 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
ganlikun 0:13413ea9a877 1385 }
ganlikun 0:13413ea9a877 1386
ganlikun 0:13413ea9a877 1387 /* Process Locked */
ganlikun 0:13413ea9a877 1388 __HAL_LOCK(hi2c);
ganlikun 0:13413ea9a877 1389
ganlikun 0:13413ea9a877 1390 /* Check if the I2C is already enabled */
ganlikun 0:13413ea9a877 1391 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
ganlikun 0:13413ea9a877 1392 {
ganlikun 0:13413ea9a877 1393 /* Enable I2C peripheral */
ganlikun 0:13413ea9a877 1394 __HAL_I2C_ENABLE(hi2c);
ganlikun 0:13413ea9a877 1395 }
ganlikun 0:13413ea9a877 1396
ganlikun 0:13413ea9a877 1397 /* Disable Pos */
ganlikun 0:13413ea9a877 1398 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
ganlikun 0:13413ea9a877 1399
ganlikun 0:13413ea9a877 1400 hi2c->State = HAL_I2C_STATE_BUSY_TX;
ganlikun 0:13413ea9a877 1401 hi2c->Mode = HAL_I2C_MODE_MASTER;
ganlikun 0:13413ea9a877 1402 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 1403
ganlikun 0:13413ea9a877 1404 /* Prepare transfer parameters */
ganlikun 0:13413ea9a877 1405 hi2c->pBuffPtr = pData;
ganlikun 0:13413ea9a877 1406 hi2c->XferCount = Size;
ganlikun 0:13413ea9a877 1407 hi2c->XferOptions = XferOptions;
ganlikun 0:13413ea9a877 1408 hi2c->XferSize = hi2c->XferCount;
ganlikun 0:13413ea9a877 1409 hi2c->Devaddress = DevAddress;
ganlikun 0:13413ea9a877 1410
ganlikun 0:13413ea9a877 1411 Prev_State = hi2c->PreviousState;
ganlikun 0:13413ea9a877 1412
ganlikun 0:13413ea9a877 1413 /* Generate Start */
ganlikun 0:13413ea9a877 1414 if((Prev_State == I2C_STATE_MASTER_BUSY_RX) || (Prev_State == I2C_STATE_NONE))
ganlikun 0:13413ea9a877 1415 {
ganlikun 0:13413ea9a877 1416 /* Generate Start condition if first transfer */
ganlikun 0:13413ea9a877 1417 if((XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME))
ganlikun 0:13413ea9a877 1418 {
ganlikun 0:13413ea9a877 1419 /* Generate Start */
ganlikun 0:13413ea9a877 1420 hi2c->Instance->CR1 |= I2C_CR1_START;
ganlikun 0:13413ea9a877 1421 }
ganlikun 0:13413ea9a877 1422 else if(Prev_State == I2C_STATE_MASTER_BUSY_RX) // MBED
ganlikun 0:13413ea9a877 1423 {
ganlikun 0:13413ea9a877 1424 /* Generate ReStart */
ganlikun 0:13413ea9a877 1425 hi2c->Instance->CR1 |= I2C_CR1_START;
ganlikun 0:13413ea9a877 1426 }
ganlikun 0:13413ea9a877 1427 }
ganlikun 0:13413ea9a877 1428
ganlikun 0:13413ea9a877 1429 /* Process Unlocked */
ganlikun 0:13413ea9a877 1430 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 1431
ganlikun 0:13413ea9a877 1432 /* Note : The I2C interrupts must be enabled after unlocking current process
ganlikun 0:13413ea9a877 1433 to avoid the risk of I2C interrupt handle execution before current
ganlikun 0:13413ea9a877 1434 process unlock */
ganlikun 0:13413ea9a877 1435
ganlikun 0:13413ea9a877 1436 /* Enable EVT, BUF and ERR interrupt */
ganlikun 0:13413ea9a877 1437 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
ganlikun 0:13413ea9a877 1438
ganlikun 0:13413ea9a877 1439 return HAL_OK;
ganlikun 0:13413ea9a877 1440 }
ganlikun 0:13413ea9a877 1441 else
ganlikun 0:13413ea9a877 1442 {
ganlikun 0:13413ea9a877 1443 return HAL_BUSY;
ganlikun 0:13413ea9a877 1444 }
ganlikun 0:13413ea9a877 1445 }
ganlikun 0:13413ea9a877 1446
ganlikun 0:13413ea9a877 1447 /**
ganlikun 0:13413ea9a877 1448 * @brief Sequential receive in master mode an amount of data in non-blocking mode with Interrupt
ganlikun 0:13413ea9a877 1449 * @note This interface allow to manage repeated start condition when a direction change during transfer
ganlikun 0:13413ea9a877 1450 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 1451 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 1452 * @param DevAddress Target device address: The device 7 bits address value
ganlikun 0:13413ea9a877 1453 * in datasheet must be shift at right before call interface
ganlikun 0:13413ea9a877 1454 * @param pData Pointer to data buffer
ganlikun 0:13413ea9a877 1455 * @param Size Amount of data to be sent
ganlikun 0:13413ea9a877 1456 * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition
ganlikun 0:13413ea9a877 1457 * @retval HAL status
ganlikun 0:13413ea9a877 1458 */
ganlikun 0:13413ea9a877 1459 HAL_StatusTypeDef HAL_I2C_Master_Sequential_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
ganlikun 0:13413ea9a877 1460 {
ganlikun 0:13413ea9a877 1461 __IO uint32_t count = 0U;
ganlikun 0:13413ea9a877 1462
ganlikun 0:13413ea9a877 1463 /* Check the parameters */
ganlikun 0:13413ea9a877 1464 assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
ganlikun 0:13413ea9a877 1465
ganlikun 0:13413ea9a877 1466 if(hi2c->State == HAL_I2C_STATE_READY)
ganlikun 0:13413ea9a877 1467 {
ganlikun 0:13413ea9a877 1468 /* Check Busy Flag only if FIRST call of Master interface */
ganlikun 0:13413ea9a877 1469 if((XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME))
ganlikun 0:13413ea9a877 1470 {
ganlikun 0:13413ea9a877 1471 /* Wait until BUSY flag is reset */
ganlikun 0:13413ea9a877 1472 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock /25U /1000U);
ganlikun 0:13413ea9a877 1473 do
ganlikun 0:13413ea9a877 1474 {
ganlikun 0:13413ea9a877 1475 if(count-- == 0U)
ganlikun 0:13413ea9a877 1476 {
ganlikun 0:13413ea9a877 1477 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 1478 hi2c->State= HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 1479
ganlikun 0:13413ea9a877 1480 /* Process Unlocked */
ganlikun 0:13413ea9a877 1481 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 1482
ganlikun 0:13413ea9a877 1483 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 1484 }
ganlikun 0:13413ea9a877 1485 }
ganlikun 0:13413ea9a877 1486 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
ganlikun 0:13413ea9a877 1487 }
ganlikun 0:13413ea9a877 1488
ganlikun 0:13413ea9a877 1489 /* Process Locked */
ganlikun 0:13413ea9a877 1490 __HAL_LOCK(hi2c);
ganlikun 0:13413ea9a877 1491
ganlikun 0:13413ea9a877 1492 /* Check if the I2C is already enabled */
ganlikun 0:13413ea9a877 1493 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
ganlikun 0:13413ea9a877 1494 {
ganlikun 0:13413ea9a877 1495 /* Enable I2C peripheral */
ganlikun 0:13413ea9a877 1496 __HAL_I2C_ENABLE(hi2c);
ganlikun 0:13413ea9a877 1497 }
ganlikun 0:13413ea9a877 1498
ganlikun 0:13413ea9a877 1499 /* Disable Pos */
ganlikun 0:13413ea9a877 1500 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
ganlikun 0:13413ea9a877 1501
ganlikun 0:13413ea9a877 1502 hi2c->State = HAL_I2C_STATE_BUSY_RX;
ganlikun 0:13413ea9a877 1503 hi2c->Mode = HAL_I2C_MODE_MASTER;
ganlikun 0:13413ea9a877 1504 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 1505
ganlikun 0:13413ea9a877 1506 /* Prepare transfer parameters */
ganlikun 0:13413ea9a877 1507 hi2c->pBuffPtr = pData;
ganlikun 0:13413ea9a877 1508 hi2c->XferCount = Size;
ganlikun 0:13413ea9a877 1509 hi2c->XferOptions = XferOptions;
ganlikun 0:13413ea9a877 1510 hi2c->XferSize = hi2c->XferCount;
ganlikun 0:13413ea9a877 1511 hi2c->Devaddress = DevAddress;
ganlikun 0:13413ea9a877 1512
ganlikun 0:13413ea9a877 1513 if((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX) || (hi2c->PreviousState == I2C_STATE_NONE))
ganlikun 0:13413ea9a877 1514 {
ganlikun 0:13413ea9a877 1515 /* Generate Start condition if first transfer */
ganlikun 0:13413ea9a877 1516 if((XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME) || (XferOptions == I2C_NO_OPTION_FRAME))
ganlikun 0:13413ea9a877 1517 {
ganlikun 0:13413ea9a877 1518 /* Enable Acknowledge */
ganlikun 0:13413ea9a877 1519 hi2c->Instance->CR1 |= I2C_CR1_ACK;
ganlikun 0:13413ea9a877 1520
ganlikun 0:13413ea9a877 1521 /* Generate Start */
ganlikun 0:13413ea9a877 1522 hi2c->Instance->CR1 |= I2C_CR1_START;
ganlikun 0:13413ea9a877 1523 }
ganlikun 0:13413ea9a877 1524 else if(hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX)
ganlikun 0:13413ea9a877 1525 {
ganlikun 0:13413ea9a877 1526 /* Enable Acknowledge */
ganlikun 0:13413ea9a877 1527 hi2c->Instance->CR1 |= I2C_CR1_ACK;
ganlikun 0:13413ea9a877 1528
ganlikun 0:13413ea9a877 1529 /* Generate ReStart */
ganlikun 0:13413ea9a877 1530 hi2c->Instance->CR1 |= I2C_CR1_START;
ganlikun 0:13413ea9a877 1531 }
ganlikun 0:13413ea9a877 1532 }
ganlikun 0:13413ea9a877 1533
ganlikun 0:13413ea9a877 1534 /* Process Unlocked */
ganlikun 0:13413ea9a877 1535 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 1536
ganlikun 0:13413ea9a877 1537 /* Note : The I2C interrupts must be enabled after unlocking current process
ganlikun 0:13413ea9a877 1538 to avoid the risk of I2C interrupt handle execution before current
ganlikun 0:13413ea9a877 1539 process unlock */
ganlikun 0:13413ea9a877 1540
ganlikun 0:13413ea9a877 1541 /* Enable EVT, BUF and ERR interrupt */
ganlikun 0:13413ea9a877 1542 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
ganlikun 0:13413ea9a877 1543
ganlikun 0:13413ea9a877 1544 return HAL_OK;
ganlikun 0:13413ea9a877 1545 }
ganlikun 0:13413ea9a877 1546 else
ganlikun 0:13413ea9a877 1547 {
ganlikun 0:13413ea9a877 1548 return HAL_BUSY;
ganlikun 0:13413ea9a877 1549 }
ganlikun 0:13413ea9a877 1550 }
ganlikun 0:13413ea9a877 1551
ganlikun 0:13413ea9a877 1552 /**
ganlikun 0:13413ea9a877 1553 * @brief Transmit in slave mode an amount of data in non-blocking mode with Interrupt
ganlikun 0:13413ea9a877 1554 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 1555 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 1556 * @param pData Pointer to data buffer
ganlikun 0:13413ea9a877 1557 * @param Size Amount of data to be sent
ganlikun 0:13413ea9a877 1558 * @retval HAL status
ganlikun 0:13413ea9a877 1559 */
ganlikun 0:13413ea9a877 1560 HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
ganlikun 0:13413ea9a877 1561 {
ganlikun 0:13413ea9a877 1562 __IO uint32_t count = 0U;
ganlikun 0:13413ea9a877 1563
ganlikun 0:13413ea9a877 1564 if(hi2c->State == HAL_I2C_STATE_READY)
ganlikun 0:13413ea9a877 1565 {
ganlikun 0:13413ea9a877 1566 if((pData == NULL) || (Size == 0U))
ganlikun 0:13413ea9a877 1567 {
ganlikun 0:13413ea9a877 1568 return HAL_ERROR;
ganlikun 0:13413ea9a877 1569 }
ganlikun 0:13413ea9a877 1570
ganlikun 0:13413ea9a877 1571 /* Wait until BUSY flag is reset */
ganlikun 0:13413ea9a877 1572 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock /25U /1000U);
ganlikun 0:13413ea9a877 1573 do
ganlikun 0:13413ea9a877 1574 {
ganlikun 0:13413ea9a877 1575 if(count-- == 0U)
ganlikun 0:13413ea9a877 1576 {
ganlikun 0:13413ea9a877 1577 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 1578 hi2c->State= HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 1579
ganlikun 0:13413ea9a877 1580 /* Process Unlocked */
ganlikun 0:13413ea9a877 1581 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 1582
ganlikun 0:13413ea9a877 1583 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 1584 }
ganlikun 0:13413ea9a877 1585 }
ganlikun 0:13413ea9a877 1586 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
ganlikun 0:13413ea9a877 1587
ganlikun 0:13413ea9a877 1588 /* Process Locked */
ganlikun 0:13413ea9a877 1589 __HAL_LOCK(hi2c);
ganlikun 0:13413ea9a877 1590
ganlikun 0:13413ea9a877 1591 /* Check if the I2C is already enabled */
ganlikun 0:13413ea9a877 1592 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
ganlikun 0:13413ea9a877 1593 {
ganlikun 0:13413ea9a877 1594 /* Enable I2C peripheral */
ganlikun 0:13413ea9a877 1595 __HAL_I2C_ENABLE(hi2c);
ganlikun 0:13413ea9a877 1596 }
ganlikun 0:13413ea9a877 1597
ganlikun 0:13413ea9a877 1598 /* Disable Pos */
ganlikun 0:13413ea9a877 1599 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
ganlikun 0:13413ea9a877 1600
ganlikun 0:13413ea9a877 1601 hi2c->State = HAL_I2C_STATE_BUSY_TX;
ganlikun 0:13413ea9a877 1602 hi2c->Mode = HAL_I2C_MODE_SLAVE;
ganlikun 0:13413ea9a877 1603 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 1604
ganlikun 0:13413ea9a877 1605 /* Prepare transfer parameters */
ganlikun 0:13413ea9a877 1606 hi2c->pBuffPtr = pData;
ganlikun 0:13413ea9a877 1607 hi2c->XferCount = Size;
ganlikun 0:13413ea9a877 1608 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
ganlikun 0:13413ea9a877 1609 hi2c->XferSize = hi2c->XferCount;
ganlikun 0:13413ea9a877 1610
ganlikun 0:13413ea9a877 1611 /* Enable Address Acknowledge */
ganlikun 0:13413ea9a877 1612 hi2c->Instance->CR1 |= I2C_CR1_ACK;
ganlikun 0:13413ea9a877 1613
ganlikun 0:13413ea9a877 1614 /* Process Unlocked */
ganlikun 0:13413ea9a877 1615 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 1616
ganlikun 0:13413ea9a877 1617 /* Note : The I2C interrupts must be enabled after unlocking current process
ganlikun 0:13413ea9a877 1618 to avoid the risk of I2C interrupt handle execution before current
ganlikun 0:13413ea9a877 1619 process unlock */
ganlikun 0:13413ea9a877 1620
ganlikun 0:13413ea9a877 1621 /* Enable EVT, BUF and ERR interrupt */
ganlikun 0:13413ea9a877 1622 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
ganlikun 0:13413ea9a877 1623
ganlikun 0:13413ea9a877 1624 return HAL_OK;
ganlikun 0:13413ea9a877 1625 }
ganlikun 0:13413ea9a877 1626 else
ganlikun 0:13413ea9a877 1627 {
ganlikun 0:13413ea9a877 1628 return HAL_BUSY;
ganlikun 0:13413ea9a877 1629 }
ganlikun 0:13413ea9a877 1630 }
ganlikun 0:13413ea9a877 1631
ganlikun 0:13413ea9a877 1632 /**
ganlikun 0:13413ea9a877 1633 * @brief Receive in slave mode an amount of data in non-blocking mode with Interrupt
ganlikun 0:13413ea9a877 1634 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 1635 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 1636 * @param pData Pointer to data buffer
ganlikun 0:13413ea9a877 1637 * @param Size Amount of data to be sent
ganlikun 0:13413ea9a877 1638 * @retval HAL status
ganlikun 0:13413ea9a877 1639 */
ganlikun 0:13413ea9a877 1640 HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
ganlikun 0:13413ea9a877 1641 {
ganlikun 0:13413ea9a877 1642 __IO uint32_t count = 0U;
ganlikun 0:13413ea9a877 1643
ganlikun 0:13413ea9a877 1644 if(hi2c->State == HAL_I2C_STATE_READY)
ganlikun 0:13413ea9a877 1645 {
ganlikun 0:13413ea9a877 1646 if((pData == NULL) || (Size == 0U))
ganlikun 0:13413ea9a877 1647 {
ganlikun 0:13413ea9a877 1648 return HAL_ERROR;
ganlikun 0:13413ea9a877 1649 }
ganlikun 0:13413ea9a877 1650
ganlikun 0:13413ea9a877 1651 /* Wait until BUSY flag is reset */
ganlikun 0:13413ea9a877 1652 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock /25U /1000U);
ganlikun 0:13413ea9a877 1653 do
ganlikun 0:13413ea9a877 1654 {
ganlikun 0:13413ea9a877 1655 if(count-- == 0U)
ganlikun 0:13413ea9a877 1656 {
ganlikun 0:13413ea9a877 1657 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 1658 hi2c->State= HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 1659
ganlikun 0:13413ea9a877 1660 /* Process Unlocked */
ganlikun 0:13413ea9a877 1661 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 1662
ganlikun 0:13413ea9a877 1663 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 1664 }
ganlikun 0:13413ea9a877 1665 }
ganlikun 0:13413ea9a877 1666 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
ganlikun 0:13413ea9a877 1667
ganlikun 0:13413ea9a877 1668 /* Process Locked */
ganlikun 0:13413ea9a877 1669 __HAL_LOCK(hi2c);
ganlikun 0:13413ea9a877 1670
ganlikun 0:13413ea9a877 1671 /* Check if the I2C is already enabled */
ganlikun 0:13413ea9a877 1672 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
ganlikun 0:13413ea9a877 1673 {
ganlikun 0:13413ea9a877 1674 /* Enable I2C peripheral */
ganlikun 0:13413ea9a877 1675 __HAL_I2C_ENABLE(hi2c);
ganlikun 0:13413ea9a877 1676 }
ganlikun 0:13413ea9a877 1677
ganlikun 0:13413ea9a877 1678 /* Disable Pos */
ganlikun 0:13413ea9a877 1679 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
ganlikun 0:13413ea9a877 1680
ganlikun 0:13413ea9a877 1681 hi2c->State = HAL_I2C_STATE_BUSY_RX;
ganlikun 0:13413ea9a877 1682 hi2c->Mode = HAL_I2C_MODE_SLAVE;
ganlikun 0:13413ea9a877 1683 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 1684
ganlikun 0:13413ea9a877 1685 /* Prepare transfer parameters */
ganlikun 0:13413ea9a877 1686 hi2c->pBuffPtr = pData;
ganlikun 0:13413ea9a877 1687 hi2c->XferSize = Size;
ganlikun 0:13413ea9a877 1688 hi2c->XferCount = Size;
ganlikun 0:13413ea9a877 1689 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
ganlikun 0:13413ea9a877 1690
ganlikun 0:13413ea9a877 1691 /* Enable Address Acknowledge */
ganlikun 0:13413ea9a877 1692 hi2c->Instance->CR1 |= I2C_CR1_ACK;
ganlikun 0:13413ea9a877 1693
ganlikun 0:13413ea9a877 1694 /* Process Unlocked */
ganlikun 0:13413ea9a877 1695 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 1696
ganlikun 0:13413ea9a877 1697 /* Note : The I2C interrupts must be enabled after unlocking current process
ganlikun 0:13413ea9a877 1698 to avoid the risk of I2C interrupt handle execution before current
ganlikun 0:13413ea9a877 1699 process unlock */
ganlikun 0:13413ea9a877 1700
ganlikun 0:13413ea9a877 1701 /* Enable EVT, BUF and ERR interrupt */
ganlikun 0:13413ea9a877 1702 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
ganlikun 0:13413ea9a877 1703
ganlikun 0:13413ea9a877 1704 return HAL_OK;
ganlikun 0:13413ea9a877 1705 }
ganlikun 0:13413ea9a877 1706 else
ganlikun 0:13413ea9a877 1707 {
ganlikun 0:13413ea9a877 1708 return HAL_BUSY;
ganlikun 0:13413ea9a877 1709 }
ganlikun 0:13413ea9a877 1710 }
ganlikun 0:13413ea9a877 1711
ganlikun 0:13413ea9a877 1712 /**
ganlikun 0:13413ea9a877 1713 * @brief Sequential transmit in slave mode an amount of data in no-blocking mode with Interrupt
ganlikun 0:13413ea9a877 1714 * @note This interface allow to manage repeated start condition when a direction change during transfer
ganlikun 0:13413ea9a877 1715 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 1716 * the configuration information for I2C module
ganlikun 0:13413ea9a877 1717 * @param pData Pointer to data buffer
ganlikun 0:13413ea9a877 1718 * @param Size Amount of data to be sent
ganlikun 0:13413ea9a877 1719 * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition
ganlikun 0:13413ea9a877 1720 * @retval HAL status
ganlikun 0:13413ea9a877 1721 */
ganlikun 0:13413ea9a877 1722 HAL_StatusTypeDef HAL_I2C_Slave_Sequential_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
ganlikun 0:13413ea9a877 1723 {
ganlikun 0:13413ea9a877 1724 /* Check the parameters */
ganlikun 0:13413ea9a877 1725 assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
ganlikun 0:13413ea9a877 1726
ganlikun 0:13413ea9a877 1727 if(hi2c->State == HAL_I2C_STATE_LISTEN)
ganlikun 0:13413ea9a877 1728 {
ganlikun 0:13413ea9a877 1729 if((pData == NULL) || (Size == 0U))
ganlikun 0:13413ea9a877 1730 {
ganlikun 0:13413ea9a877 1731 return HAL_ERROR;
ganlikun 0:13413ea9a877 1732 }
ganlikun 0:13413ea9a877 1733
ganlikun 0:13413ea9a877 1734 /* Process Locked */
ganlikun 0:13413ea9a877 1735 __HAL_LOCK(hi2c);
ganlikun 0:13413ea9a877 1736
ganlikun 0:13413ea9a877 1737 /* Check if the I2C is already enabled */
ganlikun 0:13413ea9a877 1738 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
ganlikun 0:13413ea9a877 1739 {
ganlikun 0:13413ea9a877 1740 /* Enable I2C peripheral */
ganlikun 0:13413ea9a877 1741 __HAL_I2C_ENABLE(hi2c);
ganlikun 0:13413ea9a877 1742 }
ganlikun 0:13413ea9a877 1743
ganlikun 0:13413ea9a877 1744 /* Disable Pos */
ganlikun 0:13413ea9a877 1745 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
ganlikun 0:13413ea9a877 1746
ganlikun 0:13413ea9a877 1747 hi2c->State = HAL_I2C_STATE_BUSY_TX_LISTEN;
ganlikun 0:13413ea9a877 1748 hi2c->Mode = HAL_I2C_MODE_SLAVE;
ganlikun 0:13413ea9a877 1749 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 1750
ganlikun 0:13413ea9a877 1751 /* Prepare transfer parameters */
ganlikun 0:13413ea9a877 1752 hi2c->pBuffPtr = pData;
ganlikun 0:13413ea9a877 1753 hi2c->XferCount = Size;
ganlikun 0:13413ea9a877 1754 hi2c->XferOptions = XferOptions;
ganlikun 0:13413ea9a877 1755 hi2c->XferSize = hi2c->XferCount;
ganlikun 0:13413ea9a877 1756
ganlikun 0:13413ea9a877 1757 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 1758 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 1759
ganlikun 0:13413ea9a877 1760 /* Process Unlocked */
ganlikun 0:13413ea9a877 1761 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 1762
ganlikun 0:13413ea9a877 1763 /* Note : The I2C interrupts must be enabled after unlocking current process
ganlikun 0:13413ea9a877 1764 to avoid the risk of I2C interrupt handle execution before current
ganlikun 0:13413ea9a877 1765 process unlock */
ganlikun 0:13413ea9a877 1766
ganlikun 0:13413ea9a877 1767 /* Enable EVT, BUF and ERR interrupt */
ganlikun 0:13413ea9a877 1768 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
ganlikun 0:13413ea9a877 1769
ganlikun 0:13413ea9a877 1770 return HAL_OK;
ganlikun 0:13413ea9a877 1771 }
ganlikun 0:13413ea9a877 1772 else
ganlikun 0:13413ea9a877 1773 {
ganlikun 0:13413ea9a877 1774 return HAL_BUSY;
ganlikun 0:13413ea9a877 1775 }
ganlikun 0:13413ea9a877 1776 }
ganlikun 0:13413ea9a877 1777
ganlikun 0:13413ea9a877 1778 /**
ganlikun 0:13413ea9a877 1779 * @brief Sequential receive in slave mode an amount of data in non-blocking mode with Interrupt
ganlikun 0:13413ea9a877 1780 * @note This interface allow to manage repeated start condition when a direction change during transfer
ganlikun 0:13413ea9a877 1781 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 1782 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 1783 * @param pData Pointer to data buffer
ganlikun 0:13413ea9a877 1784 * @param Size Amount of data to be sent
ganlikun 0:13413ea9a877 1785 * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition
ganlikun 0:13413ea9a877 1786 * @retval HAL status
ganlikun 0:13413ea9a877 1787 */
ganlikun 0:13413ea9a877 1788 HAL_StatusTypeDef HAL_I2C_Slave_Sequential_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
ganlikun 0:13413ea9a877 1789 {
ganlikun 0:13413ea9a877 1790 /* Check the parameters */
ganlikun 0:13413ea9a877 1791 assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
ganlikun 0:13413ea9a877 1792
ganlikun 0:13413ea9a877 1793 if(hi2c->State == HAL_I2C_STATE_LISTEN)
ganlikun 0:13413ea9a877 1794 {
ganlikun 0:13413ea9a877 1795 if((pData == NULL) || (Size == 0U))
ganlikun 0:13413ea9a877 1796 {
ganlikun 0:13413ea9a877 1797 return HAL_ERROR;
ganlikun 0:13413ea9a877 1798 }
ganlikun 0:13413ea9a877 1799
ganlikun 0:13413ea9a877 1800 /* Process Locked */
ganlikun 0:13413ea9a877 1801 __HAL_LOCK(hi2c);
ganlikun 0:13413ea9a877 1802
ganlikun 0:13413ea9a877 1803 /* Check if the I2C is already enabled */
ganlikun 0:13413ea9a877 1804 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
ganlikun 0:13413ea9a877 1805 {
ganlikun 0:13413ea9a877 1806 /* Enable I2C peripheral */
ganlikun 0:13413ea9a877 1807 __HAL_I2C_ENABLE(hi2c);
ganlikun 0:13413ea9a877 1808 }
ganlikun 0:13413ea9a877 1809
ganlikun 0:13413ea9a877 1810 /* Disable Pos */
ganlikun 0:13413ea9a877 1811 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
ganlikun 0:13413ea9a877 1812
ganlikun 0:13413ea9a877 1813 hi2c->State = HAL_I2C_STATE_BUSY_RX_LISTEN;
ganlikun 0:13413ea9a877 1814 hi2c->Mode = HAL_I2C_MODE_SLAVE;
ganlikun 0:13413ea9a877 1815 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 1816
ganlikun 0:13413ea9a877 1817 /* Prepare transfer parameters */
ganlikun 0:13413ea9a877 1818 hi2c->pBuffPtr = pData;
ganlikun 0:13413ea9a877 1819 hi2c->XferCount = Size;
ganlikun 0:13413ea9a877 1820 hi2c->XferOptions = XferOptions;
ganlikun 0:13413ea9a877 1821 hi2c->XferSize = hi2c->XferCount;
ganlikun 0:13413ea9a877 1822
ganlikun 0:13413ea9a877 1823 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 1824 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 1825
ganlikun 0:13413ea9a877 1826 /* Process Unlocked */
ganlikun 0:13413ea9a877 1827 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 1828
ganlikun 0:13413ea9a877 1829 /* Note : The I2C interrupts must be enabled after unlocking current process
ganlikun 0:13413ea9a877 1830 to avoid the risk of I2C interrupt handle execution before current
ganlikun 0:13413ea9a877 1831 process unlock */
ganlikun 0:13413ea9a877 1832
ganlikun 0:13413ea9a877 1833 /* Enable EVT, BUF and ERR interrupt */
ganlikun 0:13413ea9a877 1834 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
ganlikun 0:13413ea9a877 1835
ganlikun 0:13413ea9a877 1836 return HAL_OK;
ganlikun 0:13413ea9a877 1837 }
ganlikun 0:13413ea9a877 1838 else
ganlikun 0:13413ea9a877 1839 {
ganlikun 0:13413ea9a877 1840 return HAL_BUSY;
ganlikun 0:13413ea9a877 1841 }
ganlikun 0:13413ea9a877 1842 }
ganlikun 0:13413ea9a877 1843
ganlikun 0:13413ea9a877 1844 /**
ganlikun 0:13413ea9a877 1845 * @brief Enable the Address listen mode with Interrupt.
ganlikun 0:13413ea9a877 1846 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 1847 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 1848 * @retval HAL status
ganlikun 0:13413ea9a877 1849 */
ganlikun 0:13413ea9a877 1850 HAL_StatusTypeDef HAL_I2C_EnableListen_IT(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 1851 {
ganlikun 0:13413ea9a877 1852 if(hi2c->State == HAL_I2C_STATE_READY)
ganlikun 0:13413ea9a877 1853 {
ganlikun 0:13413ea9a877 1854 hi2c->State = HAL_I2C_STATE_LISTEN;
ganlikun 0:13413ea9a877 1855
ganlikun 0:13413ea9a877 1856 /* Check if the I2C is already enabled */
ganlikun 0:13413ea9a877 1857 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
ganlikun 0:13413ea9a877 1858 {
ganlikun 0:13413ea9a877 1859 /* Enable I2C peripheral */
ganlikun 0:13413ea9a877 1860 __HAL_I2C_ENABLE(hi2c);
ganlikun 0:13413ea9a877 1861 }
ganlikun 0:13413ea9a877 1862
ganlikun 0:13413ea9a877 1863 /* Enable Address Acknowledge */
ganlikun 0:13413ea9a877 1864 hi2c->Instance->CR1 |= I2C_CR1_ACK;
ganlikun 0:13413ea9a877 1865
ganlikun 0:13413ea9a877 1866 /* Enable EVT and ERR interrupt */
ganlikun 0:13413ea9a877 1867 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
ganlikun 0:13413ea9a877 1868
ganlikun 0:13413ea9a877 1869 return HAL_OK;
ganlikun 0:13413ea9a877 1870 }
ganlikun 0:13413ea9a877 1871 else
ganlikun 0:13413ea9a877 1872 {
ganlikun 0:13413ea9a877 1873 return HAL_BUSY;
ganlikun 0:13413ea9a877 1874 }
ganlikun 0:13413ea9a877 1875 }
ganlikun 0:13413ea9a877 1876
ganlikun 0:13413ea9a877 1877 /**
ganlikun 0:13413ea9a877 1878 * @brief Disable the Address listen mode with Interrupt.
ganlikun 0:13413ea9a877 1879 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 1880 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 1881 * @retval HAL status
ganlikun 0:13413ea9a877 1882 */
ganlikun 0:13413ea9a877 1883 HAL_StatusTypeDef HAL_I2C_DisableListen_IT(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 1884 {
ganlikun 0:13413ea9a877 1885 /* Declaration of tmp to prevent undefined behavior of volatile usage */
ganlikun 0:13413ea9a877 1886 uint32_t tmp;
ganlikun 0:13413ea9a877 1887
ganlikun 0:13413ea9a877 1888 /* Disable Address listen mode only if a transfer is not ongoing */
ganlikun 0:13413ea9a877 1889 if(hi2c->State == HAL_I2C_STATE_LISTEN)
ganlikun 0:13413ea9a877 1890 {
ganlikun 0:13413ea9a877 1891 tmp = (uint32_t)(hi2c->State) & I2C_STATE_MSK;
ganlikun 0:13413ea9a877 1892 hi2c->PreviousState = tmp | (uint32_t)(hi2c->Mode);
ganlikun 0:13413ea9a877 1893 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 1894 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 1895
ganlikun 0:13413ea9a877 1896 /* Disable Address Acknowledge */
ganlikun 0:13413ea9a877 1897 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 1898
ganlikun 0:13413ea9a877 1899 /* Disable EVT and ERR interrupt */
ganlikun 0:13413ea9a877 1900 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
ganlikun 0:13413ea9a877 1901
ganlikun 0:13413ea9a877 1902 return HAL_OK;
ganlikun 0:13413ea9a877 1903 }
ganlikun 0:13413ea9a877 1904 else
ganlikun 0:13413ea9a877 1905 {
ganlikun 0:13413ea9a877 1906 return HAL_BUSY;
ganlikun 0:13413ea9a877 1907 }
ganlikun 0:13413ea9a877 1908 }
ganlikun 0:13413ea9a877 1909
ganlikun 0:13413ea9a877 1910 /**
ganlikun 0:13413ea9a877 1911 * @brief Transmit in master mode an amount of data in non-blocking mode with DMA
ganlikun 0:13413ea9a877 1912 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 1913 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 1914 * @param DevAddress Target device address: The device 7 bits address value
ganlikun 0:13413ea9a877 1915 * in datasheet must be shift at right before call interface
ganlikun 0:13413ea9a877 1916 * @param pData Pointer to data buffer
ganlikun 0:13413ea9a877 1917 * @param Size Amount of data to be sent
ganlikun 0:13413ea9a877 1918 * @retval HAL status
ganlikun 0:13413ea9a877 1919 */
ganlikun 0:13413ea9a877 1920 HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
ganlikun 0:13413ea9a877 1921 {
ganlikun 0:13413ea9a877 1922 __IO uint32_t count = 0U;
ganlikun 0:13413ea9a877 1923
ganlikun 0:13413ea9a877 1924 if(hi2c->State == HAL_I2C_STATE_READY)
ganlikun 0:13413ea9a877 1925 {
ganlikun 0:13413ea9a877 1926 /* Wait until BUSY flag is reset */
ganlikun 0:13413ea9a877 1927 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock /25U /1000U);
ganlikun 0:13413ea9a877 1928 do
ganlikun 0:13413ea9a877 1929 {
ganlikun 0:13413ea9a877 1930 if(count-- == 0U)
ganlikun 0:13413ea9a877 1931 {
ganlikun 0:13413ea9a877 1932 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 1933 hi2c->State= HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 1934
ganlikun 0:13413ea9a877 1935 /* Process Unlocked */
ganlikun 0:13413ea9a877 1936 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 1937
ganlikun 0:13413ea9a877 1938 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 1939 }
ganlikun 0:13413ea9a877 1940 }
ganlikun 0:13413ea9a877 1941 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
ganlikun 0:13413ea9a877 1942
ganlikun 0:13413ea9a877 1943 /* Process Locked */
ganlikun 0:13413ea9a877 1944 __HAL_LOCK(hi2c);
ganlikun 0:13413ea9a877 1945
ganlikun 0:13413ea9a877 1946 /* Check if the I2C is already enabled */
ganlikun 0:13413ea9a877 1947 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
ganlikun 0:13413ea9a877 1948 {
ganlikun 0:13413ea9a877 1949 /* Enable I2C peripheral */
ganlikun 0:13413ea9a877 1950 __HAL_I2C_ENABLE(hi2c);
ganlikun 0:13413ea9a877 1951 }
ganlikun 0:13413ea9a877 1952
ganlikun 0:13413ea9a877 1953 /* Disable Pos */
ganlikun 0:13413ea9a877 1954 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
ganlikun 0:13413ea9a877 1955
ganlikun 0:13413ea9a877 1956 hi2c->State = HAL_I2C_STATE_BUSY_TX;
ganlikun 0:13413ea9a877 1957 hi2c->Mode = HAL_I2C_MODE_MASTER;
ganlikun 0:13413ea9a877 1958 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 1959
ganlikun 0:13413ea9a877 1960 /* Prepare transfer parameters */
ganlikun 0:13413ea9a877 1961 hi2c->pBuffPtr = pData;
ganlikun 0:13413ea9a877 1962 hi2c->XferCount = Size;
ganlikun 0:13413ea9a877 1963 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
ganlikun 0:13413ea9a877 1964 hi2c->XferSize = hi2c->XferCount;
ganlikun 0:13413ea9a877 1965 hi2c->Devaddress = DevAddress;
ganlikun 0:13413ea9a877 1966
ganlikun 0:13413ea9a877 1967 if(hi2c->XferSize > 0U)
ganlikun 0:13413ea9a877 1968 {
ganlikun 0:13413ea9a877 1969 /* Set the I2C DMA transfer complete callback */
ganlikun 0:13413ea9a877 1970 hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt;
ganlikun 0:13413ea9a877 1971
ganlikun 0:13413ea9a877 1972 /* Set the DMA error callback */
ganlikun 0:13413ea9a877 1973 hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
ganlikun 0:13413ea9a877 1974
ganlikun 0:13413ea9a877 1975 /* Set the unused DMA callbacks to NULL */
ganlikun 0:13413ea9a877 1976 hi2c->hdmatx->XferHalfCpltCallback = NULL;
ganlikun 0:13413ea9a877 1977 hi2c->hdmatx->XferM1CpltCallback = NULL;
ganlikun 0:13413ea9a877 1978 hi2c->hdmatx->XferM1HalfCpltCallback = NULL;
ganlikun 0:13413ea9a877 1979 hi2c->hdmatx->XferAbortCallback = NULL;
ganlikun 0:13413ea9a877 1980
ganlikun 0:13413ea9a877 1981 /* Enable the DMA Stream */
ganlikun 0:13413ea9a877 1982 HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize);
ganlikun 0:13413ea9a877 1983
ganlikun 0:13413ea9a877 1984 /* Enable Acknowledge */
ganlikun 0:13413ea9a877 1985 hi2c->Instance->CR1 |= I2C_CR1_ACK;
ganlikun 0:13413ea9a877 1986
ganlikun 0:13413ea9a877 1987 /* Generate Start */
ganlikun 0:13413ea9a877 1988 hi2c->Instance->CR1 |= I2C_CR1_START;
ganlikun 0:13413ea9a877 1989
ganlikun 0:13413ea9a877 1990 /* Process Unlocked */
ganlikun 0:13413ea9a877 1991 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 1992
ganlikun 0:13413ea9a877 1993 /* Note : The I2C interrupts must be enabled after unlocking current process
ganlikun 0:13413ea9a877 1994 to avoid the risk of I2C interrupt handle execution before current
ganlikun 0:13413ea9a877 1995 process unlock */
ganlikun 0:13413ea9a877 1996
ganlikun 0:13413ea9a877 1997 /* Enable EVT and ERR interrupt */
ganlikun 0:13413ea9a877 1998 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
ganlikun 0:13413ea9a877 1999
ganlikun 0:13413ea9a877 2000 /* Enable DMA Request */
ganlikun 0:13413ea9a877 2001 hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
ganlikun 0:13413ea9a877 2002 }
ganlikun 0:13413ea9a877 2003 else
ganlikun 0:13413ea9a877 2004 {
ganlikun 0:13413ea9a877 2005 /* Enable Acknowledge */
ganlikun 0:13413ea9a877 2006 hi2c->Instance->CR1 |= I2C_CR1_ACK;
ganlikun 0:13413ea9a877 2007
ganlikun 0:13413ea9a877 2008 /* Generate Start */
ganlikun 0:13413ea9a877 2009 hi2c->Instance->CR1 |= I2C_CR1_START;
ganlikun 0:13413ea9a877 2010
ganlikun 0:13413ea9a877 2011 /* Process Unlocked */
ganlikun 0:13413ea9a877 2012 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 2013
ganlikun 0:13413ea9a877 2014 /* Note : The I2C interrupts must be enabled after unlocking current process
ganlikun 0:13413ea9a877 2015 to avoid the risk of I2C interrupt handle execution before current
ganlikun 0:13413ea9a877 2016 process unlock */
ganlikun 0:13413ea9a877 2017
ganlikun 0:13413ea9a877 2018 /* Enable EVT, BUF and ERR interrupt */
ganlikun 0:13413ea9a877 2019 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
ganlikun 0:13413ea9a877 2020 }
ganlikun 0:13413ea9a877 2021
ganlikun 0:13413ea9a877 2022 return HAL_OK;
ganlikun 0:13413ea9a877 2023 }
ganlikun 0:13413ea9a877 2024 else
ganlikun 0:13413ea9a877 2025 {
ganlikun 0:13413ea9a877 2026 return HAL_BUSY;
ganlikun 0:13413ea9a877 2027 }
ganlikun 0:13413ea9a877 2028 }
ganlikun 0:13413ea9a877 2029
ganlikun 0:13413ea9a877 2030 /**
ganlikun 0:13413ea9a877 2031 * @brief Receive in master mode an amount of data in non-blocking mode with DMA
ganlikun 0:13413ea9a877 2032 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 2033 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 2034 * @param DevAddress Target device address: The device 7 bits address value
ganlikun 0:13413ea9a877 2035 * in datasheet must be shift at right before call interface
ganlikun 0:13413ea9a877 2036 * @param pData Pointer to data buffer
ganlikun 0:13413ea9a877 2037 * @param Size Amount of data to be sent
ganlikun 0:13413ea9a877 2038 * @retval HAL status
ganlikun 0:13413ea9a877 2039 */
ganlikun 0:13413ea9a877 2040 HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
ganlikun 0:13413ea9a877 2041 {
ganlikun 0:13413ea9a877 2042 __IO uint32_t count = 0U;
ganlikun 0:13413ea9a877 2043
ganlikun 0:13413ea9a877 2044 if(hi2c->State == HAL_I2C_STATE_READY)
ganlikun 0:13413ea9a877 2045 {
ganlikun 0:13413ea9a877 2046 /* Wait until BUSY flag is reset */
ganlikun 0:13413ea9a877 2047 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock /25U /1000U);
ganlikun 0:13413ea9a877 2048 do
ganlikun 0:13413ea9a877 2049 {
ganlikun 0:13413ea9a877 2050 if(count-- == 0U)
ganlikun 0:13413ea9a877 2051 {
ganlikun 0:13413ea9a877 2052 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 2053 hi2c->State= HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 2054
ganlikun 0:13413ea9a877 2055 /* Process Unlocked */
ganlikun 0:13413ea9a877 2056 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 2057
ganlikun 0:13413ea9a877 2058 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 2059 }
ganlikun 0:13413ea9a877 2060 }
ganlikun 0:13413ea9a877 2061 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
ganlikun 0:13413ea9a877 2062
ganlikun 0:13413ea9a877 2063 /* Process Locked */
ganlikun 0:13413ea9a877 2064 __HAL_LOCK(hi2c);
ganlikun 0:13413ea9a877 2065
ganlikun 0:13413ea9a877 2066 /* Check if the I2C is already enabled */
ganlikun 0:13413ea9a877 2067 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
ganlikun 0:13413ea9a877 2068 {
ganlikun 0:13413ea9a877 2069 /* Enable I2C peripheral */
ganlikun 0:13413ea9a877 2070 __HAL_I2C_ENABLE(hi2c);
ganlikun 0:13413ea9a877 2071 }
ganlikun 0:13413ea9a877 2072
ganlikun 0:13413ea9a877 2073 /* Disable Pos */
ganlikun 0:13413ea9a877 2074 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
ganlikun 0:13413ea9a877 2075
ganlikun 0:13413ea9a877 2076 hi2c->State = HAL_I2C_STATE_BUSY_RX;
ganlikun 0:13413ea9a877 2077 hi2c->Mode = HAL_I2C_MODE_MASTER;
ganlikun 0:13413ea9a877 2078 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 2079
ganlikun 0:13413ea9a877 2080 /* Prepare transfer parameters */
ganlikun 0:13413ea9a877 2081 hi2c->pBuffPtr = pData;
ganlikun 0:13413ea9a877 2082 hi2c->XferCount = Size;
ganlikun 0:13413ea9a877 2083 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
ganlikun 0:13413ea9a877 2084 hi2c->XferSize = hi2c->XferCount;
ganlikun 0:13413ea9a877 2085 hi2c->Devaddress = DevAddress;
ganlikun 0:13413ea9a877 2086
ganlikun 0:13413ea9a877 2087 if(hi2c->XferSize > 0U)
ganlikun 0:13413ea9a877 2088 {
ganlikun 0:13413ea9a877 2089 /* Set the I2C DMA transfer complete callback */
ganlikun 0:13413ea9a877 2090 hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt;
ganlikun 0:13413ea9a877 2091
ganlikun 0:13413ea9a877 2092 /* Set the DMA error callback */
ganlikun 0:13413ea9a877 2093 hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
ganlikun 0:13413ea9a877 2094
ganlikun 0:13413ea9a877 2095 /* Set the unused DMA callbacks to NULL */
ganlikun 0:13413ea9a877 2096 hi2c->hdmarx->XferHalfCpltCallback = NULL;
ganlikun 0:13413ea9a877 2097 hi2c->hdmarx->XferM1CpltCallback = NULL;
ganlikun 0:13413ea9a877 2098 hi2c->hdmarx->XferM1HalfCpltCallback = NULL;
ganlikun 0:13413ea9a877 2099 hi2c->hdmarx->XferAbortCallback = NULL;
ganlikun 0:13413ea9a877 2100
ganlikun 0:13413ea9a877 2101 /* Enable the DMA Stream */
ganlikun 0:13413ea9a877 2102 HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize);
ganlikun 0:13413ea9a877 2103
ganlikun 0:13413ea9a877 2104 /* Enable Acknowledge */
ganlikun 0:13413ea9a877 2105 hi2c->Instance->CR1 |= I2C_CR1_ACK;
ganlikun 0:13413ea9a877 2106
ganlikun 0:13413ea9a877 2107 /* Generate Start */
ganlikun 0:13413ea9a877 2108 hi2c->Instance->CR1 |= I2C_CR1_START;
ganlikun 0:13413ea9a877 2109
ganlikun 0:13413ea9a877 2110 /* Process Unlocked */
ganlikun 0:13413ea9a877 2111 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 2112
ganlikun 0:13413ea9a877 2113 /* Note : The I2C interrupts must be enabled after unlocking current process
ganlikun 0:13413ea9a877 2114 to avoid the risk of I2C interrupt handle execution before current
ganlikun 0:13413ea9a877 2115 process unlock */
ganlikun 0:13413ea9a877 2116
ganlikun 0:13413ea9a877 2117 /* Enable EVT and ERR interrupt */
ganlikun 0:13413ea9a877 2118 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
ganlikun 0:13413ea9a877 2119
ganlikun 0:13413ea9a877 2120 /* Enable DMA Request */
ganlikun 0:13413ea9a877 2121 hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
ganlikun 0:13413ea9a877 2122 }
ganlikun 0:13413ea9a877 2123 else
ganlikun 0:13413ea9a877 2124 {
ganlikun 0:13413ea9a877 2125 /* Enable Acknowledge */
ganlikun 0:13413ea9a877 2126 hi2c->Instance->CR1 |= I2C_CR1_ACK;
ganlikun 0:13413ea9a877 2127
ganlikun 0:13413ea9a877 2128 /* Generate Start */
ganlikun 0:13413ea9a877 2129 hi2c->Instance->CR1 |= I2C_CR1_START;
ganlikun 0:13413ea9a877 2130
ganlikun 0:13413ea9a877 2131 /* Process Unlocked */
ganlikun 0:13413ea9a877 2132 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 2133
ganlikun 0:13413ea9a877 2134 /* Note : The I2C interrupts must be enabled after unlocking current process
ganlikun 0:13413ea9a877 2135 to avoid the risk of I2C interrupt handle execution before current
ganlikun 0:13413ea9a877 2136 process unlock */
ganlikun 0:13413ea9a877 2137
ganlikun 0:13413ea9a877 2138 /* Enable EVT, BUF and ERR interrupt */
ganlikun 0:13413ea9a877 2139 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
ganlikun 0:13413ea9a877 2140 }
ganlikun 0:13413ea9a877 2141
ganlikun 0:13413ea9a877 2142 return HAL_OK;
ganlikun 0:13413ea9a877 2143 }
ganlikun 0:13413ea9a877 2144 else
ganlikun 0:13413ea9a877 2145 {
ganlikun 0:13413ea9a877 2146 return HAL_BUSY;
ganlikun 0:13413ea9a877 2147 }
ganlikun 0:13413ea9a877 2148 }
ganlikun 0:13413ea9a877 2149
ganlikun 0:13413ea9a877 2150 /**
ganlikun 0:13413ea9a877 2151 * @brief Abort a master I2C process communication with Interrupt.
ganlikun 0:13413ea9a877 2152 * @note This abort can be called only if state is ready
ganlikun 0:13413ea9a877 2153 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 2154 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 2155 * @param DevAddress Target device address: The device 7 bits address value
ganlikun 0:13413ea9a877 2156 * in datasheet must be shift at right before call interface
ganlikun 0:13413ea9a877 2157 * @retval HAL status
ganlikun 0:13413ea9a877 2158 */
ganlikun 0:13413ea9a877 2159 HAL_StatusTypeDef HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress)
ganlikun 0:13413ea9a877 2160 {
ganlikun 0:13413ea9a877 2161 /* Prevent unused argument(s) compilation warning */
ganlikun 0:13413ea9a877 2162 UNUSED(DevAddress);
ganlikun 0:13413ea9a877 2163
ganlikun 0:13413ea9a877 2164 /* Abort Master transfer during Receive or Transmit process */
ganlikun 0:13413ea9a877 2165 if(hi2c->Mode == HAL_I2C_MODE_MASTER)
ganlikun 0:13413ea9a877 2166 {
ganlikun 0:13413ea9a877 2167 /* Process Locked */
ganlikun 0:13413ea9a877 2168 __HAL_LOCK(hi2c);
ganlikun 0:13413ea9a877 2169
ganlikun 0:13413ea9a877 2170 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 2171 hi2c->State = HAL_I2C_STATE_ABORT;
ganlikun 0:13413ea9a877 2172
ganlikun 0:13413ea9a877 2173 /* Disable Acknowledge */
ganlikun 0:13413ea9a877 2174 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 2175
ganlikun 0:13413ea9a877 2176 /* Generate Stop */
ganlikun 0:13413ea9a877 2177 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 2178
ganlikun 0:13413ea9a877 2179 hi2c->XferCount = 0U;
ganlikun 0:13413ea9a877 2180
ganlikun 0:13413ea9a877 2181 /* Disable EVT, BUF and ERR interrupt */
ganlikun 0:13413ea9a877 2182 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
ganlikun 0:13413ea9a877 2183
ganlikun 0:13413ea9a877 2184 /* Process Unlocked */
ganlikun 0:13413ea9a877 2185 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 2186
ganlikun 0:13413ea9a877 2187 /* Call the corresponding callback to inform upper layer of End of Transfer */
ganlikun 0:13413ea9a877 2188 I2C_ITError(hi2c);
ganlikun 0:13413ea9a877 2189
ganlikun 0:13413ea9a877 2190 return HAL_OK;
ganlikun 0:13413ea9a877 2191 }
ganlikun 0:13413ea9a877 2192 else
ganlikun 0:13413ea9a877 2193 {
ganlikun 0:13413ea9a877 2194 /* Wrong usage of abort function */
ganlikun 0:13413ea9a877 2195 /* This function should be used only in case of abort monitored by master device */
ganlikun 0:13413ea9a877 2196 return HAL_ERROR;
ganlikun 0:13413ea9a877 2197 }
ganlikun 0:13413ea9a877 2198 }
ganlikun 0:13413ea9a877 2199
ganlikun 0:13413ea9a877 2200 /**
ganlikun 0:13413ea9a877 2201 * @brief Transmit in slave mode an amount of data in non-blocking mode with DMA
ganlikun 0:13413ea9a877 2202 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 2203 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 2204 * @param pData Pointer to data buffer
ganlikun 0:13413ea9a877 2205 * @param Size Amount of data to be sent
ganlikun 0:13413ea9a877 2206 * @retval HAL status
ganlikun 0:13413ea9a877 2207 */
ganlikun 0:13413ea9a877 2208 HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
ganlikun 0:13413ea9a877 2209 {
ganlikun 0:13413ea9a877 2210 __IO uint32_t count = 0U;
ganlikun 0:13413ea9a877 2211
ganlikun 0:13413ea9a877 2212 if(hi2c->State == HAL_I2C_STATE_READY)
ganlikun 0:13413ea9a877 2213 {
ganlikun 0:13413ea9a877 2214 if((pData == NULL) || (Size == 0U))
ganlikun 0:13413ea9a877 2215 {
ganlikun 0:13413ea9a877 2216 return HAL_ERROR;
ganlikun 0:13413ea9a877 2217 }
ganlikun 0:13413ea9a877 2218
ganlikun 0:13413ea9a877 2219 /* Wait until BUSY flag is reset */
ganlikun 0:13413ea9a877 2220 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock /25U /1000U);
ganlikun 0:13413ea9a877 2221 do
ganlikun 0:13413ea9a877 2222 {
ganlikun 0:13413ea9a877 2223 if(count-- == 0U)
ganlikun 0:13413ea9a877 2224 {
ganlikun 0:13413ea9a877 2225 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 2226 hi2c->State= HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 2227
ganlikun 0:13413ea9a877 2228 /* Process Unlocked */
ganlikun 0:13413ea9a877 2229 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 2230
ganlikun 0:13413ea9a877 2231 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 2232 }
ganlikun 0:13413ea9a877 2233 }
ganlikun 0:13413ea9a877 2234 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
ganlikun 0:13413ea9a877 2235
ganlikun 0:13413ea9a877 2236 /* Process Locked */
ganlikun 0:13413ea9a877 2237 __HAL_LOCK(hi2c);
ganlikun 0:13413ea9a877 2238
ganlikun 0:13413ea9a877 2239 /* Check if the I2C is already enabled */
ganlikun 0:13413ea9a877 2240 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
ganlikun 0:13413ea9a877 2241 {
ganlikun 0:13413ea9a877 2242 /* Enable I2C peripheral */
ganlikun 0:13413ea9a877 2243 __HAL_I2C_ENABLE(hi2c);
ganlikun 0:13413ea9a877 2244 }
ganlikun 0:13413ea9a877 2245
ganlikun 0:13413ea9a877 2246 /* Disable Pos */
ganlikun 0:13413ea9a877 2247 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
ganlikun 0:13413ea9a877 2248
ganlikun 0:13413ea9a877 2249 hi2c->State = HAL_I2C_STATE_BUSY_TX;
ganlikun 0:13413ea9a877 2250 hi2c->Mode = HAL_I2C_MODE_SLAVE;
ganlikun 0:13413ea9a877 2251 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 2252
ganlikun 0:13413ea9a877 2253 /* Prepare transfer parameters */
ganlikun 0:13413ea9a877 2254 hi2c->pBuffPtr = pData;
ganlikun 0:13413ea9a877 2255 hi2c->XferCount = Size;
ganlikun 0:13413ea9a877 2256 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
ganlikun 0:13413ea9a877 2257 hi2c->XferSize = hi2c->XferCount;
ganlikun 0:13413ea9a877 2258
ganlikun 0:13413ea9a877 2259 /* Set the I2C DMA transfer complete callback */
ganlikun 0:13413ea9a877 2260 hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt;
ganlikun 0:13413ea9a877 2261
ganlikun 0:13413ea9a877 2262 /* Set the DMA error callback */
ganlikun 0:13413ea9a877 2263 hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
ganlikun 0:13413ea9a877 2264
ganlikun 0:13413ea9a877 2265 /* Set the unused DMA callbacks to NULL */
ganlikun 0:13413ea9a877 2266 hi2c->hdmatx->XferHalfCpltCallback = NULL;
ganlikun 0:13413ea9a877 2267 hi2c->hdmatx->XferM1CpltCallback = NULL;
ganlikun 0:13413ea9a877 2268 hi2c->hdmatx->XferM1HalfCpltCallback = NULL;
ganlikun 0:13413ea9a877 2269 hi2c->hdmatx->XferAbortCallback = NULL;
ganlikun 0:13413ea9a877 2270
ganlikun 0:13413ea9a877 2271 /* Enable the DMA Stream */
ganlikun 0:13413ea9a877 2272 HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize);
ganlikun 0:13413ea9a877 2273
ganlikun 0:13413ea9a877 2274 /* Enable Address Acknowledge */
ganlikun 0:13413ea9a877 2275 hi2c->Instance->CR1 |= I2C_CR1_ACK;
ganlikun 0:13413ea9a877 2276
ganlikun 0:13413ea9a877 2277 /* Process Unlocked */
ganlikun 0:13413ea9a877 2278 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 2279
ganlikun 0:13413ea9a877 2280 /* Note : The I2C interrupts must be enabled after unlocking current process
ganlikun 0:13413ea9a877 2281 to avoid the risk of I2C interrupt handle execution before current
ganlikun 0:13413ea9a877 2282 process unlock */
ganlikun 0:13413ea9a877 2283 /* Enable EVT and ERR interrupt */
ganlikun 0:13413ea9a877 2284 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
ganlikun 0:13413ea9a877 2285
ganlikun 0:13413ea9a877 2286 /* Enable DMA Request */
ganlikun 0:13413ea9a877 2287 hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
ganlikun 0:13413ea9a877 2288
ganlikun 0:13413ea9a877 2289 return HAL_OK;
ganlikun 0:13413ea9a877 2290 }
ganlikun 0:13413ea9a877 2291 else
ganlikun 0:13413ea9a877 2292 {
ganlikun 0:13413ea9a877 2293 return HAL_BUSY;
ganlikun 0:13413ea9a877 2294 }
ganlikun 0:13413ea9a877 2295 }
ganlikun 0:13413ea9a877 2296
ganlikun 0:13413ea9a877 2297 /**
ganlikun 0:13413ea9a877 2298 * @brief Receive in slave mode an amount of data in non-blocking mode with DMA
ganlikun 0:13413ea9a877 2299 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 2300 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 2301 * @param pData Pointer to data buffer
ganlikun 0:13413ea9a877 2302 * @param Size Amount of data to be sent
ganlikun 0:13413ea9a877 2303 * @retval HAL status
ganlikun 0:13413ea9a877 2304 */
ganlikun 0:13413ea9a877 2305 HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
ganlikun 0:13413ea9a877 2306 {
ganlikun 0:13413ea9a877 2307 __IO uint32_t count = 0U;
ganlikun 0:13413ea9a877 2308
ganlikun 0:13413ea9a877 2309 if(hi2c->State == HAL_I2C_STATE_READY)
ganlikun 0:13413ea9a877 2310 {
ganlikun 0:13413ea9a877 2311 if((pData == NULL) || (Size == 0U))
ganlikun 0:13413ea9a877 2312 {
ganlikun 0:13413ea9a877 2313 return HAL_ERROR;
ganlikun 0:13413ea9a877 2314 }
ganlikun 0:13413ea9a877 2315
ganlikun 0:13413ea9a877 2316 /* Wait until BUSY flag is reset */
ganlikun 0:13413ea9a877 2317 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock /25U /1000U);
ganlikun 0:13413ea9a877 2318 do
ganlikun 0:13413ea9a877 2319 {
ganlikun 0:13413ea9a877 2320 if(count-- == 0U)
ganlikun 0:13413ea9a877 2321 {
ganlikun 0:13413ea9a877 2322 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 2323 hi2c->State= HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 2324
ganlikun 0:13413ea9a877 2325 /* Process Unlocked */
ganlikun 0:13413ea9a877 2326 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 2327
ganlikun 0:13413ea9a877 2328 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 2329 }
ganlikun 0:13413ea9a877 2330 }
ganlikun 0:13413ea9a877 2331 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
ganlikun 0:13413ea9a877 2332
ganlikun 0:13413ea9a877 2333 /* Process Locked */
ganlikun 0:13413ea9a877 2334 __HAL_LOCK(hi2c);
ganlikun 0:13413ea9a877 2335
ganlikun 0:13413ea9a877 2336 /* Check if the I2C is already enabled */
ganlikun 0:13413ea9a877 2337 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
ganlikun 0:13413ea9a877 2338 {
ganlikun 0:13413ea9a877 2339 /* Enable I2C peripheral */
ganlikun 0:13413ea9a877 2340 __HAL_I2C_ENABLE(hi2c);
ganlikun 0:13413ea9a877 2341 }
ganlikun 0:13413ea9a877 2342
ganlikun 0:13413ea9a877 2343 /* Disable Pos */
ganlikun 0:13413ea9a877 2344 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
ganlikun 0:13413ea9a877 2345
ganlikun 0:13413ea9a877 2346 hi2c->State = HAL_I2C_STATE_BUSY_RX;
ganlikun 0:13413ea9a877 2347 hi2c->Mode = HAL_I2C_MODE_SLAVE;
ganlikun 0:13413ea9a877 2348 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 2349
ganlikun 0:13413ea9a877 2350 /* Prepare transfer parameters */
ganlikun 0:13413ea9a877 2351 hi2c->pBuffPtr = pData;
ganlikun 0:13413ea9a877 2352 hi2c->XferCount = Size;
ganlikun 0:13413ea9a877 2353 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
ganlikun 0:13413ea9a877 2354 hi2c->XferSize = hi2c->XferCount;
ganlikun 0:13413ea9a877 2355
ganlikun 0:13413ea9a877 2356 /* Set the I2C DMA transfer complete callback */
ganlikun 0:13413ea9a877 2357 hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt;
ganlikun 0:13413ea9a877 2358
ganlikun 0:13413ea9a877 2359 /* Set the DMA error callback */
ganlikun 0:13413ea9a877 2360 hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
ganlikun 0:13413ea9a877 2361
ganlikun 0:13413ea9a877 2362 /* Set the unused DMA callbacks to NULL */
ganlikun 0:13413ea9a877 2363 hi2c->hdmarx->XferHalfCpltCallback = NULL;
ganlikun 0:13413ea9a877 2364 hi2c->hdmarx->XferM1CpltCallback = NULL;
ganlikun 0:13413ea9a877 2365 hi2c->hdmarx->XferM1HalfCpltCallback = NULL;
ganlikun 0:13413ea9a877 2366 hi2c->hdmarx->XferAbortCallback = NULL;
ganlikun 0:13413ea9a877 2367
ganlikun 0:13413ea9a877 2368 /* Enable the DMA Stream */
ganlikun 0:13413ea9a877 2369 HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize);
ganlikun 0:13413ea9a877 2370
ganlikun 0:13413ea9a877 2371 /* Enable Address Acknowledge */
ganlikun 0:13413ea9a877 2372 hi2c->Instance->CR1 |= I2C_CR1_ACK;
ganlikun 0:13413ea9a877 2373
ganlikun 0:13413ea9a877 2374 /* Process Unlocked */
ganlikun 0:13413ea9a877 2375 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 2376
ganlikun 0:13413ea9a877 2377 /* Note : The I2C interrupts must be enabled after unlocking current process
ganlikun 0:13413ea9a877 2378 to avoid the risk of I2C interrupt handle execution before current
ganlikun 0:13413ea9a877 2379 process unlock */
ganlikun 0:13413ea9a877 2380 /* Enable EVT and ERR interrupt */
ganlikun 0:13413ea9a877 2381 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
ganlikun 0:13413ea9a877 2382
ganlikun 0:13413ea9a877 2383 /* Enable DMA Request */
ganlikun 0:13413ea9a877 2384 hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
ganlikun 0:13413ea9a877 2385
ganlikun 0:13413ea9a877 2386 return HAL_OK;
ganlikun 0:13413ea9a877 2387 }
ganlikun 0:13413ea9a877 2388 else
ganlikun 0:13413ea9a877 2389 {
ganlikun 0:13413ea9a877 2390 return HAL_BUSY;
ganlikun 0:13413ea9a877 2391 }
ganlikun 0:13413ea9a877 2392 }
ganlikun 0:13413ea9a877 2393 /**
ganlikun 0:13413ea9a877 2394 * @brief Write an amount of data in blocking mode to a specific memory address
ganlikun 0:13413ea9a877 2395 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 2396 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 2397 * @param DevAddress Target device address
ganlikun 0:13413ea9a877 2398 * @param MemAddress Internal memory address
ganlikun 0:13413ea9a877 2399 * @param MemAddSize Size of internal memory address
ganlikun 0:13413ea9a877 2400 * @param pData Pointer to data buffer
ganlikun 0:13413ea9a877 2401 * @param Size Amount of data to be sent
ganlikun 0:13413ea9a877 2402 * @param Timeout Timeout duration
ganlikun 0:13413ea9a877 2403 * @retval HAL status
ganlikun 0:13413ea9a877 2404 */
ganlikun 0:13413ea9a877 2405 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)
ganlikun 0:13413ea9a877 2406 {
ganlikun 0:13413ea9a877 2407 uint32_t tickstart = 0x00U;
ganlikun 0:13413ea9a877 2408
ganlikun 0:13413ea9a877 2409 /* Init tickstart for timeout management*/
ganlikun 0:13413ea9a877 2410 tickstart = HAL_GetTick();
ganlikun 0:13413ea9a877 2411
ganlikun 0:13413ea9a877 2412 /* Check the parameters */
ganlikun 0:13413ea9a877 2413 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
ganlikun 0:13413ea9a877 2414
ganlikun 0:13413ea9a877 2415 if(hi2c->State == HAL_I2C_STATE_READY)
ganlikun 0:13413ea9a877 2416 {
ganlikun 0:13413ea9a877 2417 /* Wait until BUSY flag is reset */
ganlikun 0:13413ea9a877 2418 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 2419 {
ganlikun 0:13413ea9a877 2420 return HAL_BUSY;
ganlikun 0:13413ea9a877 2421 }
ganlikun 0:13413ea9a877 2422
ganlikun 0:13413ea9a877 2423 /* Process Locked */
ganlikun 0:13413ea9a877 2424 __HAL_LOCK(hi2c);
ganlikun 0:13413ea9a877 2425
ganlikun 0:13413ea9a877 2426 /* Check if the I2C is already enabled */
ganlikun 0:13413ea9a877 2427 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
ganlikun 0:13413ea9a877 2428 {
ganlikun 0:13413ea9a877 2429 /* Enable I2C peripheral */
ganlikun 0:13413ea9a877 2430 __HAL_I2C_ENABLE(hi2c);
ganlikun 0:13413ea9a877 2431 }
ganlikun 0:13413ea9a877 2432
ganlikun 0:13413ea9a877 2433 /* Disable Pos */
ganlikun 0:13413ea9a877 2434 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
ganlikun 0:13413ea9a877 2435
ganlikun 0:13413ea9a877 2436 hi2c->State = HAL_I2C_STATE_BUSY_TX;
ganlikun 0:13413ea9a877 2437 hi2c->Mode = HAL_I2C_MODE_MEM;
ganlikun 0:13413ea9a877 2438 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 2439
ganlikun 0:13413ea9a877 2440 /* Prepare transfer parameters */
ganlikun 0:13413ea9a877 2441 hi2c->pBuffPtr = pData;
ganlikun 0:13413ea9a877 2442 hi2c->XferCount = Size;
ganlikun 0:13413ea9a877 2443 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
ganlikun 0:13413ea9a877 2444 hi2c->XferSize = hi2c->XferCount;
ganlikun 0:13413ea9a877 2445
ganlikun 0:13413ea9a877 2446 /* Send Slave Address and Memory Address */
ganlikun 0:13413ea9a877 2447 if(I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 2448 {
ganlikun 0:13413ea9a877 2449 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
ganlikun 0:13413ea9a877 2450 {
ganlikun 0:13413ea9a877 2451 /* Process Unlocked */
ganlikun 0:13413ea9a877 2452 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 2453 return HAL_ERROR;
ganlikun 0:13413ea9a877 2454 }
ganlikun 0:13413ea9a877 2455 else
ganlikun 0:13413ea9a877 2456 {
ganlikun 0:13413ea9a877 2457 /* Process Unlocked */
ganlikun 0:13413ea9a877 2458 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 2459 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 2460 }
ganlikun 0:13413ea9a877 2461 }
ganlikun 0:13413ea9a877 2462
ganlikun 0:13413ea9a877 2463 while(hi2c->XferSize > 0U)
ganlikun 0:13413ea9a877 2464 {
ganlikun 0:13413ea9a877 2465 /* Wait until TXE flag is set */
ganlikun 0:13413ea9a877 2466 if(I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 2467 {
ganlikun 0:13413ea9a877 2468 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
ganlikun 0:13413ea9a877 2469 {
ganlikun 0:13413ea9a877 2470 /* Generate Stop */
ganlikun 0:13413ea9a877 2471 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 2472 return HAL_ERROR;
ganlikun 0:13413ea9a877 2473 }
ganlikun 0:13413ea9a877 2474 else
ganlikun 0:13413ea9a877 2475 {
ganlikun 0:13413ea9a877 2476 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 2477 }
ganlikun 0:13413ea9a877 2478 }
ganlikun 0:13413ea9a877 2479
ganlikun 0:13413ea9a877 2480 /* Write data to DR */
ganlikun 0:13413ea9a877 2481 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
ganlikun 0:13413ea9a877 2482 hi2c->XferSize--;
ganlikun 0:13413ea9a877 2483 hi2c->XferCount--;
ganlikun 0:13413ea9a877 2484
ganlikun 0:13413ea9a877 2485 if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U))
ganlikun 0:13413ea9a877 2486 {
ganlikun 0:13413ea9a877 2487 /* Write data to DR */
ganlikun 0:13413ea9a877 2488 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
ganlikun 0:13413ea9a877 2489 hi2c->XferSize--;
ganlikun 0:13413ea9a877 2490 hi2c->XferCount--;
ganlikun 0:13413ea9a877 2491 }
ganlikun 0:13413ea9a877 2492 }
ganlikun 0:13413ea9a877 2493
ganlikun 0:13413ea9a877 2494 /* Wait until BTF flag is set */
ganlikun 0:13413ea9a877 2495 if(I2C_WaitOnBTFFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 2496 {
ganlikun 0:13413ea9a877 2497 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
ganlikun 0:13413ea9a877 2498 {
ganlikun 0:13413ea9a877 2499 /* Generate Stop */
ganlikun 0:13413ea9a877 2500 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 2501 return HAL_ERROR;
ganlikun 0:13413ea9a877 2502 }
ganlikun 0:13413ea9a877 2503 else
ganlikun 0:13413ea9a877 2504 {
ganlikun 0:13413ea9a877 2505 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 2506 }
ganlikun 0:13413ea9a877 2507 }
ganlikun 0:13413ea9a877 2508
ganlikun 0:13413ea9a877 2509 /* Generate Stop */
ganlikun 0:13413ea9a877 2510 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 2511
ganlikun 0:13413ea9a877 2512 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 2513 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 2514
ganlikun 0:13413ea9a877 2515 /* Process Unlocked */
ganlikun 0:13413ea9a877 2516 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 2517
ganlikun 0:13413ea9a877 2518 return HAL_OK;
ganlikun 0:13413ea9a877 2519 }
ganlikun 0:13413ea9a877 2520 else
ganlikun 0:13413ea9a877 2521 {
ganlikun 0:13413ea9a877 2522 return HAL_BUSY;
ganlikun 0:13413ea9a877 2523 }
ganlikun 0:13413ea9a877 2524 }
ganlikun 0:13413ea9a877 2525
ganlikun 0:13413ea9a877 2526 /**
ganlikun 0:13413ea9a877 2527 * @brief Read an amount of data in blocking mode from a specific memory address
ganlikun 0:13413ea9a877 2528 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 2529 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 2530 * @param DevAddress Target device address
ganlikun 0:13413ea9a877 2531 * @param MemAddress Internal memory address
ganlikun 0:13413ea9a877 2532 * @param MemAddSize Size of internal memory address
ganlikun 0:13413ea9a877 2533 * @param pData Pointer to data buffer
ganlikun 0:13413ea9a877 2534 * @param Size Amount of data to be sent
ganlikun 0:13413ea9a877 2535 * @param Timeout Timeout duration
ganlikun 0:13413ea9a877 2536 * @retval HAL status
ganlikun 0:13413ea9a877 2537 */
ganlikun 0:13413ea9a877 2538 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)
ganlikun 0:13413ea9a877 2539 {
ganlikun 0:13413ea9a877 2540 uint32_t tickstart = 0x00U;
ganlikun 0:13413ea9a877 2541
ganlikun 0:13413ea9a877 2542 /* Init tickstart for timeout management*/
ganlikun 0:13413ea9a877 2543 tickstart = HAL_GetTick();
ganlikun 0:13413ea9a877 2544
ganlikun 0:13413ea9a877 2545 /* Check the parameters */
ganlikun 0:13413ea9a877 2546 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
ganlikun 0:13413ea9a877 2547
ganlikun 0:13413ea9a877 2548 if(hi2c->State == HAL_I2C_STATE_READY)
ganlikun 0:13413ea9a877 2549 {
ganlikun 0:13413ea9a877 2550 /* Wait until BUSY flag is reset */
ganlikun 0:13413ea9a877 2551 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 2552 {
ganlikun 0:13413ea9a877 2553 return HAL_BUSY;
ganlikun 0:13413ea9a877 2554 }
ganlikun 0:13413ea9a877 2555
ganlikun 0:13413ea9a877 2556 /* Process Locked */
ganlikun 0:13413ea9a877 2557 __HAL_LOCK(hi2c);
ganlikun 0:13413ea9a877 2558
ganlikun 0:13413ea9a877 2559 /* Check if the I2C is already enabled */
ganlikun 0:13413ea9a877 2560 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
ganlikun 0:13413ea9a877 2561 {
ganlikun 0:13413ea9a877 2562 /* Enable I2C peripheral */
ganlikun 0:13413ea9a877 2563 __HAL_I2C_ENABLE(hi2c);
ganlikun 0:13413ea9a877 2564 }
ganlikun 0:13413ea9a877 2565
ganlikun 0:13413ea9a877 2566 /* Disable Pos */
ganlikun 0:13413ea9a877 2567 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
ganlikun 0:13413ea9a877 2568
ganlikun 0:13413ea9a877 2569 hi2c->State = HAL_I2C_STATE_BUSY_RX;
ganlikun 0:13413ea9a877 2570 hi2c->Mode = HAL_I2C_MODE_MEM;
ganlikun 0:13413ea9a877 2571 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 2572
ganlikun 0:13413ea9a877 2573 /* Prepare transfer parameters */
ganlikun 0:13413ea9a877 2574 hi2c->pBuffPtr = pData;
ganlikun 0:13413ea9a877 2575 hi2c->XferCount = Size;
ganlikun 0:13413ea9a877 2576 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
ganlikun 0:13413ea9a877 2577 hi2c->XferSize = hi2c->XferCount;
ganlikun 0:13413ea9a877 2578
ganlikun 0:13413ea9a877 2579 /* Send Slave Address and Memory Address */
ganlikun 0:13413ea9a877 2580 if(I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 2581 {
ganlikun 0:13413ea9a877 2582 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
ganlikun 0:13413ea9a877 2583 {
ganlikun 0:13413ea9a877 2584 /* Process Unlocked */
ganlikun 0:13413ea9a877 2585 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 2586 return HAL_ERROR;
ganlikun 0:13413ea9a877 2587 }
ganlikun 0:13413ea9a877 2588 else
ganlikun 0:13413ea9a877 2589 {
ganlikun 0:13413ea9a877 2590 /* Process Unlocked */
ganlikun 0:13413ea9a877 2591 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 2592 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 2593 }
ganlikun 0:13413ea9a877 2594 }
ganlikun 0:13413ea9a877 2595
ganlikun 0:13413ea9a877 2596 if(hi2c->XferSize == 0U)
ganlikun 0:13413ea9a877 2597 {
ganlikun 0:13413ea9a877 2598 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 2599 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 2600
ganlikun 0:13413ea9a877 2601 /* Generate Stop */
ganlikun 0:13413ea9a877 2602 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 2603 }
ganlikun 0:13413ea9a877 2604 else if(hi2c->XferSize == 1U)
ganlikun 0:13413ea9a877 2605 {
ganlikun 0:13413ea9a877 2606 /* Disable Acknowledge */
ganlikun 0:13413ea9a877 2607 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 2608
ganlikun 0:13413ea9a877 2609 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 2610 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 2611
ganlikun 0:13413ea9a877 2612 /* Generate Stop */
ganlikun 0:13413ea9a877 2613 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 2614 }
ganlikun 0:13413ea9a877 2615 else if(hi2c->XferSize == 2U)
ganlikun 0:13413ea9a877 2616 {
ganlikun 0:13413ea9a877 2617 /* Disable Acknowledge */
ganlikun 0:13413ea9a877 2618 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 2619
ganlikun 0:13413ea9a877 2620 /* Enable Pos */
ganlikun 0:13413ea9a877 2621 hi2c->Instance->CR1 |= I2C_CR1_POS;
ganlikun 0:13413ea9a877 2622
ganlikun 0:13413ea9a877 2623 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 2624 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 2625 }
ganlikun 0:13413ea9a877 2626 else
ganlikun 0:13413ea9a877 2627 {
ganlikun 0:13413ea9a877 2628 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 2629 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 2630 }
ganlikun 0:13413ea9a877 2631
ganlikun 0:13413ea9a877 2632 while(hi2c->XferSize > 0U)
ganlikun 0:13413ea9a877 2633 {
ganlikun 0:13413ea9a877 2634 if(hi2c->XferSize <= 3U)
ganlikun 0:13413ea9a877 2635 {
ganlikun 0:13413ea9a877 2636 /* One byte */
ganlikun 0:13413ea9a877 2637 if(hi2c->XferSize== 1U)
ganlikun 0:13413ea9a877 2638 {
ganlikun 0:13413ea9a877 2639 /* Wait until RXNE flag is set */
ganlikun 0:13413ea9a877 2640 if(I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 2641 {
ganlikun 0:13413ea9a877 2642 if(hi2c->ErrorCode == HAL_I2C_ERROR_TIMEOUT)
ganlikun 0:13413ea9a877 2643 {
ganlikun 0:13413ea9a877 2644 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 2645 }
ganlikun 0:13413ea9a877 2646 else
ganlikun 0:13413ea9a877 2647 {
ganlikun 0:13413ea9a877 2648 return HAL_ERROR;
ganlikun 0:13413ea9a877 2649 }
ganlikun 0:13413ea9a877 2650 }
ganlikun 0:13413ea9a877 2651
ganlikun 0:13413ea9a877 2652 /* Read data from DR */
ganlikun 0:13413ea9a877 2653 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 2654 hi2c->XferSize--;
ganlikun 0:13413ea9a877 2655 hi2c->XferCount--;
ganlikun 0:13413ea9a877 2656 }
ganlikun 0:13413ea9a877 2657 /* Two bytes */
ganlikun 0:13413ea9a877 2658 else if(hi2c->XferSize == 2U)
ganlikun 0:13413ea9a877 2659 {
ganlikun 0:13413ea9a877 2660 /* Wait until BTF flag is set */
ganlikun 0:13413ea9a877 2661 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 2662 {
ganlikun 0:13413ea9a877 2663 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 2664 }
ganlikun 0:13413ea9a877 2665
ganlikun 0:13413ea9a877 2666 /* Generate Stop */
ganlikun 0:13413ea9a877 2667 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 2668
ganlikun 0:13413ea9a877 2669 /* Read data from DR */
ganlikun 0:13413ea9a877 2670 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 2671 hi2c->XferSize--;
ganlikun 0:13413ea9a877 2672 hi2c->XferCount--;
ganlikun 0:13413ea9a877 2673
ganlikun 0:13413ea9a877 2674 /* Read data from DR */
ganlikun 0:13413ea9a877 2675 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 2676 hi2c->XferSize--;
ganlikun 0:13413ea9a877 2677 hi2c->XferCount--;
ganlikun 0:13413ea9a877 2678 }
ganlikun 0:13413ea9a877 2679 /* 3 Last bytes */
ganlikun 0:13413ea9a877 2680 else
ganlikun 0:13413ea9a877 2681 {
ganlikun 0:13413ea9a877 2682 /* Wait until BTF flag is set */
ganlikun 0:13413ea9a877 2683 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 2684 {
ganlikun 0:13413ea9a877 2685 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 2686 }
ganlikun 0:13413ea9a877 2687
ganlikun 0:13413ea9a877 2688 /* Disable Acknowledge */
ganlikun 0:13413ea9a877 2689 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 2690
ganlikun 0:13413ea9a877 2691 /* Read data from DR */
ganlikun 0:13413ea9a877 2692 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 2693 hi2c->XferSize--;
ganlikun 0:13413ea9a877 2694 hi2c->XferCount--;
ganlikun 0:13413ea9a877 2695
ganlikun 0:13413ea9a877 2696 /* Wait until BTF flag is set */
ganlikun 0:13413ea9a877 2697 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 2698 {
ganlikun 0:13413ea9a877 2699 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 2700 }
ganlikun 0:13413ea9a877 2701
ganlikun 0:13413ea9a877 2702 /* Generate Stop */
ganlikun 0:13413ea9a877 2703 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 2704
ganlikun 0:13413ea9a877 2705 /* Read data from DR */
ganlikun 0:13413ea9a877 2706 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 2707 hi2c->XferSize--;
ganlikun 0:13413ea9a877 2708 hi2c->XferCount--;
ganlikun 0:13413ea9a877 2709
ganlikun 0:13413ea9a877 2710 /* Read data from DR */
ganlikun 0:13413ea9a877 2711 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 2712 hi2c->XferSize--;
ganlikun 0:13413ea9a877 2713 hi2c->XferCount--;
ganlikun 0:13413ea9a877 2714 }
ganlikun 0:13413ea9a877 2715 }
ganlikun 0:13413ea9a877 2716 else
ganlikun 0:13413ea9a877 2717 {
ganlikun 0:13413ea9a877 2718 /* Wait until RXNE flag is set */
ganlikun 0:13413ea9a877 2719 if(I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 2720 {
ganlikun 0:13413ea9a877 2721 if(hi2c->ErrorCode == HAL_I2C_ERROR_TIMEOUT)
ganlikun 0:13413ea9a877 2722 {
ganlikun 0:13413ea9a877 2723 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 2724 }
ganlikun 0:13413ea9a877 2725 else
ganlikun 0:13413ea9a877 2726 {
ganlikun 0:13413ea9a877 2727 return HAL_ERROR;
ganlikun 0:13413ea9a877 2728 }
ganlikun 0:13413ea9a877 2729 }
ganlikun 0:13413ea9a877 2730
ganlikun 0:13413ea9a877 2731 /* Read data from DR */
ganlikun 0:13413ea9a877 2732 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 2733 hi2c->XferSize--;
ganlikun 0:13413ea9a877 2734 hi2c->XferCount--;
ganlikun 0:13413ea9a877 2735
ganlikun 0:13413ea9a877 2736 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET)
ganlikun 0:13413ea9a877 2737 {
ganlikun 0:13413ea9a877 2738 /* Read data from DR */
ganlikun 0:13413ea9a877 2739 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 2740 hi2c->XferSize--;
ganlikun 0:13413ea9a877 2741 hi2c->XferCount--;
ganlikun 0:13413ea9a877 2742 }
ganlikun 0:13413ea9a877 2743 }
ganlikun 0:13413ea9a877 2744 }
ganlikun 0:13413ea9a877 2745
ganlikun 0:13413ea9a877 2746 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 2747 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 2748
ganlikun 0:13413ea9a877 2749 /* Process Unlocked */
ganlikun 0:13413ea9a877 2750 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 2751
ganlikun 0:13413ea9a877 2752 return HAL_OK;
ganlikun 0:13413ea9a877 2753 }
ganlikun 0:13413ea9a877 2754 else
ganlikun 0:13413ea9a877 2755 {
ganlikun 0:13413ea9a877 2756 return HAL_BUSY;
ganlikun 0:13413ea9a877 2757 }
ganlikun 0:13413ea9a877 2758 }
ganlikun 0:13413ea9a877 2759
ganlikun 0:13413ea9a877 2760 /**
ganlikun 0:13413ea9a877 2761 * @brief Write an amount of data in non-blocking mode with Interrupt to a specific memory address
ganlikun 0:13413ea9a877 2762 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 2763 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 2764 * @param DevAddress Target device address
ganlikun 0:13413ea9a877 2765 * @param MemAddress Internal memory address
ganlikun 0:13413ea9a877 2766 * @param MemAddSize Size of internal memory address
ganlikun 0:13413ea9a877 2767 * @param pData Pointer to data buffer
ganlikun 0:13413ea9a877 2768 * @param Size Amount of data to be sent
ganlikun 0:13413ea9a877 2769 * @retval HAL status
ganlikun 0:13413ea9a877 2770 */
ganlikun 0:13413ea9a877 2771 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)
ganlikun 0:13413ea9a877 2772 {
ganlikun 0:13413ea9a877 2773 __IO uint32_t count = 0U;
ganlikun 0:13413ea9a877 2774
ganlikun 0:13413ea9a877 2775 /* Check the parameters */
ganlikun 0:13413ea9a877 2776 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
ganlikun 0:13413ea9a877 2777
ganlikun 0:13413ea9a877 2778 if(hi2c->State == HAL_I2C_STATE_READY)
ganlikun 0:13413ea9a877 2779 {
ganlikun 0:13413ea9a877 2780 /* Wait until BUSY flag is reset */
ganlikun 0:13413ea9a877 2781 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock /25U /1000U);
ganlikun 0:13413ea9a877 2782 do
ganlikun 0:13413ea9a877 2783 {
ganlikun 0:13413ea9a877 2784 if(count-- == 0U)
ganlikun 0:13413ea9a877 2785 {
ganlikun 0:13413ea9a877 2786 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 2787 hi2c->State= HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 2788
ganlikun 0:13413ea9a877 2789 /* Process Unlocked */
ganlikun 0:13413ea9a877 2790 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 2791
ganlikun 0:13413ea9a877 2792 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 2793 }
ganlikun 0:13413ea9a877 2794 }
ganlikun 0:13413ea9a877 2795 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
ganlikun 0:13413ea9a877 2796
ganlikun 0:13413ea9a877 2797 /* Process Locked */
ganlikun 0:13413ea9a877 2798 __HAL_LOCK(hi2c);
ganlikun 0:13413ea9a877 2799
ganlikun 0:13413ea9a877 2800 /* Check if the I2C is already enabled */
ganlikun 0:13413ea9a877 2801 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
ganlikun 0:13413ea9a877 2802 {
ganlikun 0:13413ea9a877 2803 /* Enable I2C peripheral */
ganlikun 0:13413ea9a877 2804 __HAL_I2C_ENABLE(hi2c);
ganlikun 0:13413ea9a877 2805 }
ganlikun 0:13413ea9a877 2806
ganlikun 0:13413ea9a877 2807 /* Disable Pos */
ganlikun 0:13413ea9a877 2808 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
ganlikun 0:13413ea9a877 2809
ganlikun 0:13413ea9a877 2810 hi2c->State = HAL_I2C_STATE_BUSY_TX;
ganlikun 0:13413ea9a877 2811 hi2c->Mode = HAL_I2C_MODE_MEM;
ganlikun 0:13413ea9a877 2812 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 2813
ganlikun 0:13413ea9a877 2814 /* Prepare transfer parameters */
ganlikun 0:13413ea9a877 2815 hi2c->pBuffPtr = pData;
ganlikun 0:13413ea9a877 2816 hi2c->XferSize = Size;
ganlikun 0:13413ea9a877 2817 hi2c->XferCount = Size;
ganlikun 0:13413ea9a877 2818 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
ganlikun 0:13413ea9a877 2819 hi2c->Devaddress = DevAddress;
ganlikun 0:13413ea9a877 2820 hi2c->Memaddress = MemAddress;
ganlikun 0:13413ea9a877 2821 hi2c->MemaddSize = MemAddSize;
ganlikun 0:13413ea9a877 2822 hi2c->EventCount = 0U;
ganlikun 0:13413ea9a877 2823
ganlikun 0:13413ea9a877 2824 /* Generate Start */
ganlikun 0:13413ea9a877 2825 hi2c->Instance->CR1 |= I2C_CR1_START;
ganlikun 0:13413ea9a877 2826
ganlikun 0:13413ea9a877 2827 /* Process Unlocked */
ganlikun 0:13413ea9a877 2828 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 2829
ganlikun 0:13413ea9a877 2830 /* Note : The I2C interrupts must be enabled after unlocking current process
ganlikun 0:13413ea9a877 2831 to avoid the risk of I2C interrupt handle execution before current
ganlikun 0:13413ea9a877 2832 process unlock */
ganlikun 0:13413ea9a877 2833
ganlikun 0:13413ea9a877 2834 /* Enable EVT, BUF and ERR interrupt */
ganlikun 0:13413ea9a877 2835 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
ganlikun 0:13413ea9a877 2836
ganlikun 0:13413ea9a877 2837 return HAL_OK;
ganlikun 0:13413ea9a877 2838 }
ganlikun 0:13413ea9a877 2839 else
ganlikun 0:13413ea9a877 2840 {
ganlikun 0:13413ea9a877 2841 return HAL_BUSY;
ganlikun 0:13413ea9a877 2842 }
ganlikun 0:13413ea9a877 2843 }
ganlikun 0:13413ea9a877 2844
ganlikun 0:13413ea9a877 2845 /**
ganlikun 0:13413ea9a877 2846 * @brief Read an amount of data in non-blocking mode with Interrupt from a specific memory address
ganlikun 0:13413ea9a877 2847 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 2848 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 2849 * @param DevAddress Target device address
ganlikun 0:13413ea9a877 2850 * @param MemAddress Internal memory address
ganlikun 0:13413ea9a877 2851 * @param MemAddSize Size of internal memory address
ganlikun 0:13413ea9a877 2852 * @param pData Pointer to data buffer
ganlikun 0:13413ea9a877 2853 * @param Size Amount of data to be sent
ganlikun 0:13413ea9a877 2854 * @retval HAL status
ganlikun 0:13413ea9a877 2855 */
ganlikun 0:13413ea9a877 2856 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)
ganlikun 0:13413ea9a877 2857 {
ganlikun 0:13413ea9a877 2858 __IO uint32_t count = 0U;
ganlikun 0:13413ea9a877 2859
ganlikun 0:13413ea9a877 2860 /* Check the parameters */
ganlikun 0:13413ea9a877 2861 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
ganlikun 0:13413ea9a877 2862
ganlikun 0:13413ea9a877 2863 if(hi2c->State == HAL_I2C_STATE_READY)
ganlikun 0:13413ea9a877 2864 {
ganlikun 0:13413ea9a877 2865 /* Wait until BUSY flag is reset */
ganlikun 0:13413ea9a877 2866 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock /25U /1000U);
ganlikun 0:13413ea9a877 2867 do
ganlikun 0:13413ea9a877 2868 {
ganlikun 0:13413ea9a877 2869 if(count-- == 0U)
ganlikun 0:13413ea9a877 2870 {
ganlikun 0:13413ea9a877 2871 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 2872 hi2c->State= HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 2873
ganlikun 0:13413ea9a877 2874 /* Process Unlocked */
ganlikun 0:13413ea9a877 2875 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 2876
ganlikun 0:13413ea9a877 2877 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 2878 }
ganlikun 0:13413ea9a877 2879 }
ganlikun 0:13413ea9a877 2880 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
ganlikun 0:13413ea9a877 2881
ganlikun 0:13413ea9a877 2882 /* Process Locked */
ganlikun 0:13413ea9a877 2883 __HAL_LOCK(hi2c);
ganlikun 0:13413ea9a877 2884
ganlikun 0:13413ea9a877 2885 /* Check if the I2C is already enabled */
ganlikun 0:13413ea9a877 2886 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
ganlikun 0:13413ea9a877 2887 {
ganlikun 0:13413ea9a877 2888 /* Enable I2C peripheral */
ganlikun 0:13413ea9a877 2889 __HAL_I2C_ENABLE(hi2c);
ganlikun 0:13413ea9a877 2890 }
ganlikun 0:13413ea9a877 2891
ganlikun 0:13413ea9a877 2892 /* Disable Pos */
ganlikun 0:13413ea9a877 2893 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
ganlikun 0:13413ea9a877 2894
ganlikun 0:13413ea9a877 2895 hi2c->State = HAL_I2C_STATE_BUSY_RX;
ganlikun 0:13413ea9a877 2896 hi2c->Mode = HAL_I2C_MODE_MEM;
ganlikun 0:13413ea9a877 2897 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 2898
ganlikun 0:13413ea9a877 2899 /* Prepare transfer parameters */
ganlikun 0:13413ea9a877 2900 hi2c->pBuffPtr = pData;
ganlikun 0:13413ea9a877 2901 hi2c->XferSize = Size;
ganlikun 0:13413ea9a877 2902 hi2c->XferCount = Size;
ganlikun 0:13413ea9a877 2903 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
ganlikun 0:13413ea9a877 2904 hi2c->Devaddress = DevAddress;
ganlikun 0:13413ea9a877 2905 hi2c->Memaddress = MemAddress;
ganlikun 0:13413ea9a877 2906 hi2c->MemaddSize = MemAddSize;
ganlikun 0:13413ea9a877 2907 hi2c->EventCount = 0U;
ganlikun 0:13413ea9a877 2908
ganlikun 0:13413ea9a877 2909 /* Enable Acknowledge */
ganlikun 0:13413ea9a877 2910 hi2c->Instance->CR1 |= I2C_CR1_ACK;
ganlikun 0:13413ea9a877 2911
ganlikun 0:13413ea9a877 2912 /* Generate Start */
ganlikun 0:13413ea9a877 2913 hi2c->Instance->CR1 |= I2C_CR1_START;
ganlikun 0:13413ea9a877 2914
ganlikun 0:13413ea9a877 2915 /* Process Unlocked */
ganlikun 0:13413ea9a877 2916 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 2917
ganlikun 0:13413ea9a877 2918 if(hi2c->XferSize > 0U)
ganlikun 0:13413ea9a877 2919 {
ganlikun 0:13413ea9a877 2920 /* Note : The I2C interrupts must be enabled after unlocking current process
ganlikun 0:13413ea9a877 2921 to avoid the risk of I2C interrupt handle execution before current
ganlikun 0:13413ea9a877 2922 process unlock */
ganlikun 0:13413ea9a877 2923
ganlikun 0:13413ea9a877 2924 /* Enable EVT, BUF and ERR interrupt */
ganlikun 0:13413ea9a877 2925 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
ganlikun 0:13413ea9a877 2926 }
ganlikun 0:13413ea9a877 2927 return HAL_OK;
ganlikun 0:13413ea9a877 2928 }
ganlikun 0:13413ea9a877 2929 else
ganlikun 0:13413ea9a877 2930 {
ganlikun 0:13413ea9a877 2931 return HAL_BUSY;
ganlikun 0:13413ea9a877 2932 }
ganlikun 0:13413ea9a877 2933 }
ganlikun 0:13413ea9a877 2934
ganlikun 0:13413ea9a877 2935 /**
ganlikun 0:13413ea9a877 2936 * @brief Write an amount of data in non-blocking mode with DMA to a specific memory address
ganlikun 0:13413ea9a877 2937 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 2938 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 2939 * @param DevAddress Target device address
ganlikun 0:13413ea9a877 2940 * @param MemAddress Internal memory address
ganlikun 0:13413ea9a877 2941 * @param MemAddSize Size of internal memory address
ganlikun 0:13413ea9a877 2942 * @param pData Pointer to data buffer
ganlikun 0:13413ea9a877 2943 * @param Size Amount of data to be sent
ganlikun 0:13413ea9a877 2944 * @retval HAL status
ganlikun 0:13413ea9a877 2945 */
ganlikun 0:13413ea9a877 2946 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)
ganlikun 0:13413ea9a877 2947 {
ganlikun 0:13413ea9a877 2948 __IO uint32_t count = 0U;
ganlikun 0:13413ea9a877 2949
ganlikun 0:13413ea9a877 2950 uint32_t tickstart = 0x00U;
ganlikun 0:13413ea9a877 2951
ganlikun 0:13413ea9a877 2952 /* Init tickstart for timeout management*/
ganlikun 0:13413ea9a877 2953 tickstart = HAL_GetTick();
ganlikun 0:13413ea9a877 2954
ganlikun 0:13413ea9a877 2955 /* Check the parameters */
ganlikun 0:13413ea9a877 2956 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
ganlikun 0:13413ea9a877 2957
ganlikun 0:13413ea9a877 2958 if(hi2c->State == HAL_I2C_STATE_READY)
ganlikun 0:13413ea9a877 2959 {
ganlikun 0:13413ea9a877 2960 /* Wait until BUSY flag is reset */
ganlikun 0:13413ea9a877 2961 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock /25U /1000U);
ganlikun 0:13413ea9a877 2962 do
ganlikun 0:13413ea9a877 2963 {
ganlikun 0:13413ea9a877 2964 if(count-- == 0U)
ganlikun 0:13413ea9a877 2965 {
ganlikun 0:13413ea9a877 2966 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 2967 hi2c->State= HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 2968
ganlikun 0:13413ea9a877 2969 /* Process Unlocked */
ganlikun 0:13413ea9a877 2970 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 2971
ganlikun 0:13413ea9a877 2972 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 2973 }
ganlikun 0:13413ea9a877 2974 }
ganlikun 0:13413ea9a877 2975 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
ganlikun 0:13413ea9a877 2976
ganlikun 0:13413ea9a877 2977 /* Process Locked */
ganlikun 0:13413ea9a877 2978 __HAL_LOCK(hi2c);
ganlikun 0:13413ea9a877 2979
ganlikun 0:13413ea9a877 2980 /* Check if the I2C is already enabled */
ganlikun 0:13413ea9a877 2981 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
ganlikun 0:13413ea9a877 2982 {
ganlikun 0:13413ea9a877 2983 /* Enable I2C peripheral */
ganlikun 0:13413ea9a877 2984 __HAL_I2C_ENABLE(hi2c);
ganlikun 0:13413ea9a877 2985 }
ganlikun 0:13413ea9a877 2986
ganlikun 0:13413ea9a877 2987 /* Disable Pos */
ganlikun 0:13413ea9a877 2988 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
ganlikun 0:13413ea9a877 2989
ganlikun 0:13413ea9a877 2990 hi2c->State = HAL_I2C_STATE_BUSY_TX;
ganlikun 0:13413ea9a877 2991 hi2c->Mode = HAL_I2C_MODE_MEM;
ganlikun 0:13413ea9a877 2992 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 2993
ganlikun 0:13413ea9a877 2994 /* Prepare transfer parameters */
ganlikun 0:13413ea9a877 2995 hi2c->pBuffPtr = pData;
ganlikun 0:13413ea9a877 2996 hi2c->XferSize = Size;
ganlikun 0:13413ea9a877 2997 hi2c->XferCount = Size;
ganlikun 0:13413ea9a877 2998 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
ganlikun 0:13413ea9a877 2999
ganlikun 0:13413ea9a877 3000 if(hi2c->XferSize > 0U)
ganlikun 0:13413ea9a877 3001 {
ganlikun 0:13413ea9a877 3002 /* Set the I2C DMA transfer complete callback */
ganlikun 0:13413ea9a877 3003 hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt;
ganlikun 0:13413ea9a877 3004
ganlikun 0:13413ea9a877 3005 /* Set the DMA error callback */
ganlikun 0:13413ea9a877 3006 hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
ganlikun 0:13413ea9a877 3007
ganlikun 0:13413ea9a877 3008 /* Set the unused DMA callbacks to NULL */
ganlikun 0:13413ea9a877 3009 hi2c->hdmatx->XferHalfCpltCallback = NULL;
ganlikun 0:13413ea9a877 3010 hi2c->hdmatx->XferM1CpltCallback = NULL;
ganlikun 0:13413ea9a877 3011 hi2c->hdmatx->XferM1HalfCpltCallback = NULL;
ganlikun 0:13413ea9a877 3012 hi2c->hdmatx->XferAbortCallback = NULL;
ganlikun 0:13413ea9a877 3013
ganlikun 0:13413ea9a877 3014 /* Enable the DMA Stream */
ganlikun 0:13413ea9a877 3015 HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize);
ganlikun 0:13413ea9a877 3016
ganlikun 0:13413ea9a877 3017 /* Send Slave Address and Memory Address */
ganlikun 0:13413ea9a877 3018 if(I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 3019 {
ganlikun 0:13413ea9a877 3020 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
ganlikun 0:13413ea9a877 3021 {
ganlikun 0:13413ea9a877 3022 /* Process Unlocked */
ganlikun 0:13413ea9a877 3023 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 3024 return HAL_ERROR;
ganlikun 0:13413ea9a877 3025 }
ganlikun 0:13413ea9a877 3026 else
ganlikun 0:13413ea9a877 3027 {
ganlikun 0:13413ea9a877 3028 /* Process Unlocked */
ganlikun 0:13413ea9a877 3029 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 3030 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 3031 }
ganlikun 0:13413ea9a877 3032 }
ganlikun 0:13413ea9a877 3033
ganlikun 0:13413ea9a877 3034 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 3035 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 3036
ganlikun 0:13413ea9a877 3037 /* Process Unlocked */
ganlikun 0:13413ea9a877 3038 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 3039
ganlikun 0:13413ea9a877 3040 /* Note : The I2C interrupts must be enabled after unlocking current process
ganlikun 0:13413ea9a877 3041 to avoid the risk of I2C interrupt handle execution before current
ganlikun 0:13413ea9a877 3042 process unlock */
ganlikun 0:13413ea9a877 3043 /* Enable ERR interrupt */
ganlikun 0:13413ea9a877 3044 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_ERR);
ganlikun 0:13413ea9a877 3045
ganlikun 0:13413ea9a877 3046 /* Enable DMA Request */
ganlikun 0:13413ea9a877 3047 hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
ganlikun 0:13413ea9a877 3048 }
ganlikun 0:13413ea9a877 3049 return HAL_OK;
ganlikun 0:13413ea9a877 3050 }
ganlikun 0:13413ea9a877 3051 else
ganlikun 0:13413ea9a877 3052 {
ganlikun 0:13413ea9a877 3053 return HAL_BUSY;
ganlikun 0:13413ea9a877 3054 }
ganlikun 0:13413ea9a877 3055 }
ganlikun 0:13413ea9a877 3056
ganlikun 0:13413ea9a877 3057 /**
ganlikun 0:13413ea9a877 3058 * @brief Reads an amount of data in non-blocking mode with DMA from a specific memory address.
ganlikun 0:13413ea9a877 3059 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 3060 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 3061 * @param DevAddress Target device address
ganlikun 0:13413ea9a877 3062 * @param MemAddress Internal memory address
ganlikun 0:13413ea9a877 3063 * @param MemAddSize Size of internal memory address
ganlikun 0:13413ea9a877 3064 * @param pData Pointer to data buffer
ganlikun 0:13413ea9a877 3065 * @param Size Amount of data to be read
ganlikun 0:13413ea9a877 3066 * @retval HAL status
ganlikun 0:13413ea9a877 3067 */
ganlikun 0:13413ea9a877 3068 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)
ganlikun 0:13413ea9a877 3069 {
ganlikun 0:13413ea9a877 3070 uint32_t tickstart = 0x00U;
ganlikun 0:13413ea9a877 3071 __IO uint32_t count = 0U;
ganlikun 0:13413ea9a877 3072
ganlikun 0:13413ea9a877 3073 /* Init tickstart for timeout management*/
ganlikun 0:13413ea9a877 3074 tickstart = HAL_GetTick();
ganlikun 0:13413ea9a877 3075
ganlikun 0:13413ea9a877 3076 /* Check the parameters */
ganlikun 0:13413ea9a877 3077 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
ganlikun 0:13413ea9a877 3078
ganlikun 0:13413ea9a877 3079 if(hi2c->State == HAL_I2C_STATE_READY)
ganlikun 0:13413ea9a877 3080 {
ganlikun 0:13413ea9a877 3081 /* Wait until BUSY flag is reset */
ganlikun 0:13413ea9a877 3082 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock /25U /1000U);
ganlikun 0:13413ea9a877 3083 do
ganlikun 0:13413ea9a877 3084 {
ganlikun 0:13413ea9a877 3085 if(count-- == 0U)
ganlikun 0:13413ea9a877 3086 {
ganlikun 0:13413ea9a877 3087 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 3088 hi2c->State= HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 3089
ganlikun 0:13413ea9a877 3090 /* Process Unlocked */
ganlikun 0:13413ea9a877 3091 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 3092
ganlikun 0:13413ea9a877 3093 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 3094 }
ganlikun 0:13413ea9a877 3095 }
ganlikun 0:13413ea9a877 3096 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
ganlikun 0:13413ea9a877 3097
ganlikun 0:13413ea9a877 3098 /* Process Locked */
ganlikun 0:13413ea9a877 3099 __HAL_LOCK(hi2c);
ganlikun 0:13413ea9a877 3100
ganlikun 0:13413ea9a877 3101 /* Check if the I2C is already enabled */
ganlikun 0:13413ea9a877 3102 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
ganlikun 0:13413ea9a877 3103 {
ganlikun 0:13413ea9a877 3104 /* Enable I2C peripheral */
ganlikun 0:13413ea9a877 3105 __HAL_I2C_ENABLE(hi2c);
ganlikun 0:13413ea9a877 3106 }
ganlikun 0:13413ea9a877 3107
ganlikun 0:13413ea9a877 3108 /* Disable Pos */
ganlikun 0:13413ea9a877 3109 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
ganlikun 0:13413ea9a877 3110
ganlikun 0:13413ea9a877 3111 hi2c->State = HAL_I2C_STATE_BUSY_RX;
ganlikun 0:13413ea9a877 3112 hi2c->Mode = HAL_I2C_MODE_MEM;
ganlikun 0:13413ea9a877 3113 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 3114
ganlikun 0:13413ea9a877 3115 /* Prepare transfer parameters */
ganlikun 0:13413ea9a877 3116 hi2c->pBuffPtr = pData;
ganlikun 0:13413ea9a877 3117 hi2c->XferCount = Size;
ganlikun 0:13413ea9a877 3118 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
ganlikun 0:13413ea9a877 3119 hi2c->XferSize = hi2c->XferCount;
ganlikun 0:13413ea9a877 3120
ganlikun 0:13413ea9a877 3121 if(hi2c->XferSize > 0U)
ganlikun 0:13413ea9a877 3122 {
ganlikun 0:13413ea9a877 3123 /* Set the I2C DMA transfer complete callback */
ganlikun 0:13413ea9a877 3124 hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt;
ganlikun 0:13413ea9a877 3125
ganlikun 0:13413ea9a877 3126 /* Set the DMA error callback */
ganlikun 0:13413ea9a877 3127 hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
ganlikun 0:13413ea9a877 3128
ganlikun 0:13413ea9a877 3129 /* Set the unused DMA callbacks to NULL */
ganlikun 0:13413ea9a877 3130 hi2c->hdmarx->XferHalfCpltCallback = NULL;
ganlikun 0:13413ea9a877 3131 hi2c->hdmarx->XferM1CpltCallback = NULL;
ganlikun 0:13413ea9a877 3132 hi2c->hdmarx->XferM1HalfCpltCallback = NULL;
ganlikun 0:13413ea9a877 3133 hi2c->hdmarx->XferAbortCallback = NULL;
ganlikun 0:13413ea9a877 3134
ganlikun 0:13413ea9a877 3135 /* Enable the DMA Stream */
ganlikun 0:13413ea9a877 3136 HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize);
ganlikun 0:13413ea9a877 3137
ganlikun 0:13413ea9a877 3138 /* Send Slave Address and Memory Address */
ganlikun 0:13413ea9a877 3139 if(I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 3140 {
ganlikun 0:13413ea9a877 3141 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
ganlikun 0:13413ea9a877 3142 {
ganlikun 0:13413ea9a877 3143 /* Process Unlocked */
ganlikun 0:13413ea9a877 3144 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 3145 return HAL_ERROR;
ganlikun 0:13413ea9a877 3146 }
ganlikun 0:13413ea9a877 3147 else
ganlikun 0:13413ea9a877 3148 {
ganlikun 0:13413ea9a877 3149 /* Process Unlocked */
ganlikun 0:13413ea9a877 3150 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 3151 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 3152 }
ganlikun 0:13413ea9a877 3153 }
ganlikun 0:13413ea9a877 3154
ganlikun 0:13413ea9a877 3155 if(Size == 1U)
ganlikun 0:13413ea9a877 3156 {
ganlikun 0:13413ea9a877 3157 /* Disable Acknowledge */
ganlikun 0:13413ea9a877 3158 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 3159 }
ganlikun 0:13413ea9a877 3160 else
ganlikun 0:13413ea9a877 3161 {
ganlikun 0:13413ea9a877 3162 /* Enable Last DMA bit */
ganlikun 0:13413ea9a877 3163 hi2c->Instance->CR2 |= I2C_CR2_LAST;
ganlikun 0:13413ea9a877 3164 }
ganlikun 0:13413ea9a877 3165
ganlikun 0:13413ea9a877 3166 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 3167 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 3168
ganlikun 0:13413ea9a877 3169 /* Process Unlocked */
ganlikun 0:13413ea9a877 3170 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 3171
ganlikun 0:13413ea9a877 3172 /* Note : The I2C interrupts must be enabled after unlocking current process
ganlikun 0:13413ea9a877 3173 to avoid the risk of I2C interrupt handle execution before current
ganlikun 0:13413ea9a877 3174 process unlock */
ganlikun 0:13413ea9a877 3175 /* Enable ERR interrupt */
ganlikun 0:13413ea9a877 3176 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_ERR);
ganlikun 0:13413ea9a877 3177
ganlikun 0:13413ea9a877 3178 /* Enable DMA Request */
ganlikun 0:13413ea9a877 3179 hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
ganlikun 0:13413ea9a877 3180 }
ganlikun 0:13413ea9a877 3181 else
ganlikun 0:13413ea9a877 3182 {
ganlikun 0:13413ea9a877 3183 /* Send Slave Address and Memory Address */
ganlikun 0:13413ea9a877 3184 if(I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 3185 {
ganlikun 0:13413ea9a877 3186 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
ganlikun 0:13413ea9a877 3187 {
ganlikun 0:13413ea9a877 3188 /* Process Unlocked */
ganlikun 0:13413ea9a877 3189 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 3190 return HAL_ERROR;
ganlikun 0:13413ea9a877 3191 }
ganlikun 0:13413ea9a877 3192 else
ganlikun 0:13413ea9a877 3193 {
ganlikun 0:13413ea9a877 3194 /* Process Unlocked */
ganlikun 0:13413ea9a877 3195 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 3196 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 3197 }
ganlikun 0:13413ea9a877 3198 }
ganlikun 0:13413ea9a877 3199
ganlikun 0:13413ea9a877 3200 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 3201 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 3202
ganlikun 0:13413ea9a877 3203 /* Generate Stop */
ganlikun 0:13413ea9a877 3204 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 3205
ganlikun 0:13413ea9a877 3206 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 3207
ganlikun 0:13413ea9a877 3208 /* Process Unlocked */
ganlikun 0:13413ea9a877 3209 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 3210 }
ganlikun 0:13413ea9a877 3211
ganlikun 0:13413ea9a877 3212 return HAL_OK;
ganlikun 0:13413ea9a877 3213 }
ganlikun 0:13413ea9a877 3214 else
ganlikun 0:13413ea9a877 3215 {
ganlikun 0:13413ea9a877 3216 return HAL_BUSY;
ganlikun 0:13413ea9a877 3217 }
ganlikun 0:13413ea9a877 3218 }
ganlikun 0:13413ea9a877 3219
ganlikun 0:13413ea9a877 3220 /**
ganlikun 0:13413ea9a877 3221 * @brief Checks if target device is ready for communication.
ganlikun 0:13413ea9a877 3222 * @note This function is used with Memory devices
ganlikun 0:13413ea9a877 3223 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 3224 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 3225 * @param DevAddress Target device address
ganlikun 0:13413ea9a877 3226 * @param Trials Number of trials
ganlikun 0:13413ea9a877 3227 * @param Timeout Timeout duration
ganlikun 0:13413ea9a877 3228 * @retval HAL status
ganlikun 0:13413ea9a877 3229 */
ganlikun 0:13413ea9a877 3230 HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout)
ganlikun 0:13413ea9a877 3231 {
ganlikun 0:13413ea9a877 3232 uint32_t tickstart = 0U, tmp1 = 0U, tmp2 = 0U, tmp3 = 0U, I2C_Trials = 1U;
ganlikun 0:13413ea9a877 3233
ganlikun 0:13413ea9a877 3234 /* Get tick */
ganlikun 0:13413ea9a877 3235 tickstart = HAL_GetTick();
ganlikun 0:13413ea9a877 3236
ganlikun 0:13413ea9a877 3237 if(hi2c->State == HAL_I2C_STATE_READY)
ganlikun 0:13413ea9a877 3238 {
ganlikun 0:13413ea9a877 3239 /* Wait until BUSY flag is reset */
ganlikun 0:13413ea9a877 3240 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 3241 {
ganlikun 0:13413ea9a877 3242 return HAL_BUSY;
ganlikun 0:13413ea9a877 3243 }
ganlikun 0:13413ea9a877 3244
ganlikun 0:13413ea9a877 3245 /* Process Locked */
ganlikun 0:13413ea9a877 3246 __HAL_LOCK(hi2c);
ganlikun 0:13413ea9a877 3247
ganlikun 0:13413ea9a877 3248 /* Check if the I2C is already enabled */
ganlikun 0:13413ea9a877 3249 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
ganlikun 0:13413ea9a877 3250 {
ganlikun 0:13413ea9a877 3251 /* Enable I2C peripheral */
ganlikun 0:13413ea9a877 3252 __HAL_I2C_ENABLE(hi2c);
ganlikun 0:13413ea9a877 3253 }
ganlikun 0:13413ea9a877 3254
ganlikun 0:13413ea9a877 3255 /* Disable Pos */
ganlikun 0:13413ea9a877 3256 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
ganlikun 0:13413ea9a877 3257
ganlikun 0:13413ea9a877 3258 hi2c->State = HAL_I2C_STATE_BUSY;
ganlikun 0:13413ea9a877 3259 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 3260 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
ganlikun 0:13413ea9a877 3261
ganlikun 0:13413ea9a877 3262 do
ganlikun 0:13413ea9a877 3263 {
ganlikun 0:13413ea9a877 3264 /* Generate Start */
ganlikun 0:13413ea9a877 3265 hi2c->Instance->CR1 |= I2C_CR1_START;
ganlikun 0:13413ea9a877 3266
ganlikun 0:13413ea9a877 3267 /* Wait until SB flag is set */
ganlikun 0:13413ea9a877 3268 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 3269 {
ganlikun 0:13413ea9a877 3270 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 3271 }
ganlikun 0:13413ea9a877 3272
ganlikun 0:13413ea9a877 3273 /* Send slave address */
ganlikun 0:13413ea9a877 3274 hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);
ganlikun 0:13413ea9a877 3275
ganlikun 0:13413ea9a877 3276 /* Wait until ADDR or AF flag are set */
ganlikun 0:13413ea9a877 3277 /* Get tick */
ganlikun 0:13413ea9a877 3278 tickstart = HAL_GetTick();
ganlikun 0:13413ea9a877 3279
ganlikun 0:13413ea9a877 3280 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR);
ganlikun 0:13413ea9a877 3281 tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF);
ganlikun 0:13413ea9a877 3282 tmp3 = hi2c->State;
ganlikun 0:13413ea9a877 3283 while((tmp1 == RESET) && (tmp2 == RESET) && (tmp3 != HAL_I2C_STATE_TIMEOUT))
ganlikun 0:13413ea9a877 3284 {
ganlikun 0:13413ea9a877 3285 if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout))
ganlikun 0:13413ea9a877 3286 {
ganlikun 0:13413ea9a877 3287 hi2c->State = HAL_I2C_STATE_TIMEOUT;
ganlikun 0:13413ea9a877 3288 }
ganlikun 0:13413ea9a877 3289 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR);
ganlikun 0:13413ea9a877 3290 tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF);
ganlikun 0:13413ea9a877 3291 tmp3 = hi2c->State;
ganlikun 0:13413ea9a877 3292 }
ganlikun 0:13413ea9a877 3293
ganlikun 0:13413ea9a877 3294 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 3295
ganlikun 0:13413ea9a877 3296 /* Check if the ADDR flag has been set */
ganlikun 0:13413ea9a877 3297 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR) == SET)
ganlikun 0:13413ea9a877 3298 {
ganlikun 0:13413ea9a877 3299 /* Generate Stop */
ganlikun 0:13413ea9a877 3300 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 3301
ganlikun 0:13413ea9a877 3302 /* Clear ADDR Flag */
ganlikun 0:13413ea9a877 3303 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 3304
ganlikun 0:13413ea9a877 3305 /* Wait until BUSY flag is reset */
ganlikun 0:13413ea9a877 3306 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 3307 {
ganlikun 0:13413ea9a877 3308 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 3309 }
ganlikun 0:13413ea9a877 3310
ganlikun 0:13413ea9a877 3311 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 3312
ganlikun 0:13413ea9a877 3313 /* Process Unlocked */
ganlikun 0:13413ea9a877 3314 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 3315
ganlikun 0:13413ea9a877 3316 return HAL_OK;
ganlikun 0:13413ea9a877 3317 }
ganlikun 0:13413ea9a877 3318 else
ganlikun 0:13413ea9a877 3319 {
ganlikun 0:13413ea9a877 3320 /* Generate Stop */
ganlikun 0:13413ea9a877 3321 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 3322
ganlikun 0:13413ea9a877 3323 /* Clear AF Flag */
ganlikun 0:13413ea9a877 3324 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
ganlikun 0:13413ea9a877 3325
ganlikun 0:13413ea9a877 3326 /* Wait until BUSY flag is reset */
ganlikun 0:13413ea9a877 3327 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 3328 {
ganlikun 0:13413ea9a877 3329 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 3330 }
ganlikun 0:13413ea9a877 3331 }
ganlikun 0:13413ea9a877 3332 }while(I2C_Trials++ < Trials);
ganlikun 0:13413ea9a877 3333
ganlikun 0:13413ea9a877 3334 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 3335
ganlikun 0:13413ea9a877 3336 /* Process Unlocked */
ganlikun 0:13413ea9a877 3337 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 3338
ganlikun 0:13413ea9a877 3339 return HAL_ERROR;
ganlikun 0:13413ea9a877 3340 }
ganlikun 0:13413ea9a877 3341 else
ganlikun 0:13413ea9a877 3342 {
ganlikun 0:13413ea9a877 3343 return HAL_BUSY;
ganlikun 0:13413ea9a877 3344 }
ganlikun 0:13413ea9a877 3345 }
ganlikun 0:13413ea9a877 3346
ganlikun 0:13413ea9a877 3347 /**
ganlikun 0:13413ea9a877 3348 * @brief This function handles I2C event interrupt request.
ganlikun 0:13413ea9a877 3349 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 3350 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 3351 * @retval None
ganlikun 0:13413ea9a877 3352 */
ganlikun 0:13413ea9a877 3353 void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 3354 {
ganlikun 0:13413ea9a877 3355 uint32_t sr2itflags = READ_REG(hi2c->Instance->SR2);
ganlikun 0:13413ea9a877 3356 uint32_t sr1itflags = READ_REG(hi2c->Instance->SR1);
ganlikun 0:13413ea9a877 3357 uint32_t itsources = READ_REG(hi2c->Instance->CR2);
ganlikun 0:13413ea9a877 3358
ganlikun 0:13413ea9a877 3359 uint32_t CurrentMode = hi2c->Mode;
ganlikun 0:13413ea9a877 3360
ganlikun 0:13413ea9a877 3361 /* Master or Memory mode selected */
ganlikun 0:13413ea9a877 3362 if((CurrentMode == HAL_I2C_MODE_MASTER) || (CurrentMode == HAL_I2C_MODE_MEM))
ganlikun 0:13413ea9a877 3363 {
ganlikun 0:13413ea9a877 3364 /* SB Set ----------------------------------------------------------------*/
ganlikun 0:13413ea9a877 3365 if(((sr1itflags & I2C_FLAG_SB) != RESET) && ((itsources & I2C_IT_EVT) != RESET))
ganlikun 0:13413ea9a877 3366 {
ganlikun 0:13413ea9a877 3367 I2C_Master_SB(hi2c);
ganlikun 0:13413ea9a877 3368 }
ganlikun 0:13413ea9a877 3369 /* ADD10 Set -------------------------------------------------------------*/
ganlikun 0:13413ea9a877 3370 else if(((sr1itflags & I2C_FLAG_ADD10) != RESET) && ((itsources & I2C_IT_EVT) != RESET))
ganlikun 0:13413ea9a877 3371 {
ganlikun 0:13413ea9a877 3372 I2C_Master_ADD10(hi2c);
ganlikun 0:13413ea9a877 3373 }
ganlikun 0:13413ea9a877 3374 /* ADDR Set --------------------------------------------------------------*/
ganlikun 0:13413ea9a877 3375 else if(((sr1itflags & I2C_FLAG_ADDR) != RESET) && ((itsources & I2C_IT_EVT) != RESET))
ganlikun 0:13413ea9a877 3376 {
ganlikun 0:13413ea9a877 3377 I2C_Master_ADDR(hi2c);
ganlikun 0:13413ea9a877 3378 }
ganlikun 0:13413ea9a877 3379
ganlikun 0:13413ea9a877 3380 /* I2C in mode Transmitter -----------------------------------------------*/
ganlikun 0:13413ea9a877 3381 if((sr2itflags & I2C_FLAG_TRA) != RESET)
ganlikun 0:13413ea9a877 3382 {
ganlikun 0:13413ea9a877 3383 /* TXE set and BTF reset -----------------------------------------------*/
ganlikun 0:13413ea9a877 3384 if(((sr1itflags & I2C_FLAG_TXE) != RESET) && ((itsources & I2C_IT_BUF) != RESET) && ((sr1itflags & I2C_FLAG_BTF) == RESET))
ganlikun 0:13413ea9a877 3385 {
ganlikun 0:13413ea9a877 3386 I2C_MasterTransmit_TXE(hi2c);
ganlikun 0:13413ea9a877 3387 }
ganlikun 0:13413ea9a877 3388 /* BTF set -------------------------------------------------------------*/
ganlikun 0:13413ea9a877 3389 else if(((sr1itflags & I2C_FLAG_BTF) != RESET) && ((itsources & I2C_IT_EVT) != RESET))
ganlikun 0:13413ea9a877 3390 {
ganlikun 0:13413ea9a877 3391 I2C_MasterTransmit_BTF(hi2c);
ganlikun 0:13413ea9a877 3392 }
ganlikun 0:13413ea9a877 3393 }
ganlikun 0:13413ea9a877 3394 /* I2C in mode Receiver --------------------------------------------------*/
ganlikun 0:13413ea9a877 3395 else
ganlikun 0:13413ea9a877 3396 {
ganlikun 0:13413ea9a877 3397 /* RXNE set and BTF reset -----------------------------------------------*/
ganlikun 0:13413ea9a877 3398 if(((sr1itflags & I2C_FLAG_RXNE) != RESET) && ((itsources & I2C_IT_BUF) != RESET) && ((sr1itflags & I2C_FLAG_BTF) == RESET))
ganlikun 0:13413ea9a877 3399 {
ganlikun 0:13413ea9a877 3400 I2C_MasterReceive_RXNE(hi2c);
ganlikun 0:13413ea9a877 3401 }
ganlikun 0:13413ea9a877 3402 /* BTF set -------------------------------------------------------------*/
ganlikun 0:13413ea9a877 3403 else if(((sr1itflags & I2C_FLAG_BTF) != RESET) && ((itsources & I2C_IT_EVT) != RESET))
ganlikun 0:13413ea9a877 3404 {
ganlikun 0:13413ea9a877 3405 I2C_MasterReceive_BTF(hi2c);
ganlikun 0:13413ea9a877 3406 }
ganlikun 0:13413ea9a877 3407 }
ganlikun 0:13413ea9a877 3408 }
ganlikun 0:13413ea9a877 3409 /* Slave mode selected */
ganlikun 0:13413ea9a877 3410 else
ganlikun 0:13413ea9a877 3411 {
ganlikun 0:13413ea9a877 3412 /* ADDR set --------------------------------------------------------------*/
ganlikun 0:13413ea9a877 3413 if(((sr1itflags & I2C_FLAG_ADDR) != RESET) && ((itsources & I2C_IT_EVT) != RESET))
ganlikun 0:13413ea9a877 3414 {
ganlikun 0:13413ea9a877 3415 I2C_Slave_ADDR(hi2c);
ganlikun 0:13413ea9a877 3416 }
ganlikun 0:13413ea9a877 3417 /* STOPF set --------------------------------------------------------------*/
ganlikun 0:13413ea9a877 3418 else if(((sr1itflags & I2C_FLAG_STOPF) != RESET) && ((itsources & I2C_IT_EVT) != RESET))
ganlikun 0:13413ea9a877 3419 {
ganlikun 0:13413ea9a877 3420 I2C_Slave_STOPF(hi2c);
ganlikun 0:13413ea9a877 3421 }
ganlikun 0:13413ea9a877 3422 /* I2C in mode Transmitter -----------------------------------------------*/
ganlikun 0:13413ea9a877 3423 else if((sr2itflags & I2C_FLAG_TRA) != RESET)
ganlikun 0:13413ea9a877 3424 {
ganlikun 0:13413ea9a877 3425 /* TXE set and BTF reset -----------------------------------------------*/
ganlikun 0:13413ea9a877 3426 if(((sr1itflags & I2C_FLAG_TXE) != RESET) && ((itsources & I2C_IT_BUF) != RESET) && ((sr1itflags & I2C_FLAG_BTF) == RESET))
ganlikun 0:13413ea9a877 3427 {
ganlikun 0:13413ea9a877 3428 I2C_SlaveTransmit_TXE(hi2c);
ganlikun 0:13413ea9a877 3429 }
ganlikun 0:13413ea9a877 3430 /* BTF set -------------------------------------------------------------*/
ganlikun 0:13413ea9a877 3431 else if(((sr1itflags & I2C_FLAG_BTF) != RESET) && ((itsources & I2C_IT_EVT) != RESET))
ganlikun 0:13413ea9a877 3432 {
ganlikun 0:13413ea9a877 3433 I2C_SlaveTransmit_BTF(hi2c);
ganlikun 0:13413ea9a877 3434 }
ganlikun 0:13413ea9a877 3435 }
ganlikun 0:13413ea9a877 3436 /* I2C in mode Receiver --------------------------------------------------*/
ganlikun 0:13413ea9a877 3437 else
ganlikun 0:13413ea9a877 3438 {
ganlikun 0:13413ea9a877 3439 /* RXNE set and BTF reset ----------------------------------------------*/
ganlikun 0:13413ea9a877 3440 if(((sr1itflags & I2C_FLAG_RXNE) != RESET) && ((itsources & I2C_IT_BUF) != RESET) && ((sr1itflags & I2C_FLAG_BTF) == RESET))
ganlikun 0:13413ea9a877 3441 {
ganlikun 0:13413ea9a877 3442 I2C_SlaveReceive_RXNE(hi2c);
ganlikun 0:13413ea9a877 3443 }
ganlikun 0:13413ea9a877 3444 /* BTF set -------------------------------------------------------------*/
ganlikun 0:13413ea9a877 3445 else if(((sr1itflags & I2C_FLAG_BTF) != RESET) && ((itsources & I2C_IT_EVT) != RESET))
ganlikun 0:13413ea9a877 3446 {
ganlikun 0:13413ea9a877 3447 I2C_SlaveReceive_BTF(hi2c);
ganlikun 0:13413ea9a877 3448 }
ganlikun 0:13413ea9a877 3449 }
ganlikun 0:13413ea9a877 3450 }
ganlikun 0:13413ea9a877 3451 }
ganlikun 0:13413ea9a877 3452
ganlikun 0:13413ea9a877 3453 /**
ganlikun 0:13413ea9a877 3454 * @brief This function handles I2C error interrupt request.
ganlikun 0:13413ea9a877 3455 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 3456 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 3457 * @retval None
ganlikun 0:13413ea9a877 3458 */
ganlikun 0:13413ea9a877 3459 void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 3460 {
ganlikun 0:13413ea9a877 3461 uint32_t tmp1 = 0U, tmp2 = 0U, tmp3 = 0U, tmp4 = 0U;
ganlikun 0:13413ea9a877 3462 uint32_t sr1itflags = READ_REG(hi2c->Instance->SR1);
ganlikun 0:13413ea9a877 3463 uint32_t itsources = READ_REG(hi2c->Instance->CR2);
ganlikun 0:13413ea9a877 3464
ganlikun 0:13413ea9a877 3465 /* I2C Bus error interrupt occurred ----------------------------------------*/
ganlikun 0:13413ea9a877 3466 if(((sr1itflags & I2C_FLAG_BERR) != RESET) && ((itsources & I2C_IT_ERR) != RESET))
ganlikun 0:13413ea9a877 3467 {
ganlikun 0:13413ea9a877 3468 hi2c->ErrorCode |= HAL_I2C_ERROR_BERR;
ganlikun 0:13413ea9a877 3469
ganlikun 0:13413ea9a877 3470 /* Clear BERR flag */
ganlikun 0:13413ea9a877 3471 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_BERR);
ganlikun 0:13413ea9a877 3472 }
ganlikun 0:13413ea9a877 3473
ganlikun 0:13413ea9a877 3474 /* I2C Arbitration Loss error interrupt occurred ---------------------------*/
ganlikun 0:13413ea9a877 3475 if(((sr1itflags & I2C_FLAG_ARLO) != RESET) && ((itsources & I2C_IT_ERR) != RESET))
ganlikun 0:13413ea9a877 3476 {
ganlikun 0:13413ea9a877 3477 hi2c->ErrorCode |= HAL_I2C_ERROR_ARLO;
ganlikun 0:13413ea9a877 3478
ganlikun 0:13413ea9a877 3479 /* Clear ARLO flag */
ganlikun 0:13413ea9a877 3480 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ARLO);
ganlikun 0:13413ea9a877 3481 }
ganlikun 0:13413ea9a877 3482
ganlikun 0:13413ea9a877 3483 /* I2C Acknowledge failure error interrupt occurred ------------------------*/
ganlikun 0:13413ea9a877 3484 if(((sr1itflags & I2C_FLAG_AF) != RESET) && ((itsources & I2C_IT_ERR) != RESET))
ganlikun 0:13413ea9a877 3485 {
ganlikun 0:13413ea9a877 3486 tmp1 = hi2c->Mode;
ganlikun 0:13413ea9a877 3487 tmp2 = hi2c->XferCount;
ganlikun 0:13413ea9a877 3488 tmp3 = hi2c->State;
ganlikun 0:13413ea9a877 3489 tmp4 = hi2c->PreviousState;
ganlikun 0:13413ea9a877 3490 if((tmp1 == HAL_I2C_MODE_SLAVE) && (tmp2 == 0U) && \
ganlikun 0:13413ea9a877 3491 ((tmp3 == HAL_I2C_STATE_BUSY_TX) || (tmp3 == HAL_I2C_STATE_BUSY_TX_LISTEN) || \
ganlikun 0:13413ea9a877 3492 ((tmp3 == HAL_I2C_STATE_LISTEN) && (tmp4 == I2C_STATE_SLAVE_BUSY_TX))))
ganlikun 0:13413ea9a877 3493 {
ganlikun 0:13413ea9a877 3494 I2C_Slave_AF(hi2c);
ganlikun 0:13413ea9a877 3495 }
ganlikun 0:13413ea9a877 3496 else
ganlikun 0:13413ea9a877 3497 {
ganlikun 0:13413ea9a877 3498 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
ganlikun 0:13413ea9a877 3499
ganlikun 0:13413ea9a877 3500 /* Do not generate a STOP in case of Slave receive non acknowledge during transfer (mean not at the end of transfer) */
ganlikun 0:13413ea9a877 3501 if(hi2c->Mode == HAL_I2C_MODE_MASTER)
ganlikun 0:13413ea9a877 3502 {
ganlikun 0:13413ea9a877 3503 /* Generate Stop */
ganlikun 0:13413ea9a877 3504 SET_BIT(hi2c->Instance->CR1,I2C_CR1_STOP);
ganlikun 0:13413ea9a877 3505 }
ganlikun 0:13413ea9a877 3506
ganlikun 0:13413ea9a877 3507 /* Clear AF flag */
ganlikun 0:13413ea9a877 3508 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
ganlikun 0:13413ea9a877 3509 }
ganlikun 0:13413ea9a877 3510 }
ganlikun 0:13413ea9a877 3511
ganlikun 0:13413ea9a877 3512 /* I2C Over-Run/Under-Run interrupt occurred -------------------------------*/
ganlikun 0:13413ea9a877 3513 if(((sr1itflags & I2C_FLAG_OVR) != RESET) && ((itsources & I2C_IT_ERR) != RESET))
ganlikun 0:13413ea9a877 3514 {
ganlikun 0:13413ea9a877 3515 hi2c->ErrorCode |= HAL_I2C_ERROR_OVR;
ganlikun 0:13413ea9a877 3516 /* Clear OVR flag */
ganlikun 0:13413ea9a877 3517 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_OVR);
ganlikun 0:13413ea9a877 3518 }
ganlikun 0:13413ea9a877 3519
ganlikun 0:13413ea9a877 3520 /* Call the Error Callback in case of Error detected -----------------------*/
ganlikun 0:13413ea9a877 3521 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
ganlikun 0:13413ea9a877 3522 {
ganlikun 0:13413ea9a877 3523 I2C_ITError(hi2c);
ganlikun 0:13413ea9a877 3524 }
ganlikun 0:13413ea9a877 3525 }
ganlikun 0:13413ea9a877 3526
ganlikun 0:13413ea9a877 3527 /**
ganlikun 0:13413ea9a877 3528 * @brief Master Tx Transfer completed callback.
ganlikun 0:13413ea9a877 3529 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 3530 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 3531 * @retval None
ganlikun 0:13413ea9a877 3532 */
ganlikun 0:13413ea9a877 3533 __weak void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 3534 {
ganlikun 0:13413ea9a877 3535 /* Prevent unused argument(s) compilation warning */
ganlikun 0:13413ea9a877 3536 UNUSED(hi2c);
ganlikun 0:13413ea9a877 3537
ganlikun 0:13413ea9a877 3538 /* NOTE : This function should not be modified, when the callback is needed,
ganlikun 0:13413ea9a877 3539 the HAL_I2C_MasterTxCpltCallback can be implemented in the user file
ganlikun 0:13413ea9a877 3540 */
ganlikun 0:13413ea9a877 3541 }
ganlikun 0:13413ea9a877 3542
ganlikun 0:13413ea9a877 3543 /**
ganlikun 0:13413ea9a877 3544 * @brief Master Rx Transfer completed callback.
ganlikun 0:13413ea9a877 3545 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 3546 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 3547 * @retval None
ganlikun 0:13413ea9a877 3548 */
ganlikun 0:13413ea9a877 3549 __weak void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 3550 {
ganlikun 0:13413ea9a877 3551 /* Prevent unused argument(s) compilation warning */
ganlikun 0:13413ea9a877 3552 UNUSED(hi2c);
ganlikun 0:13413ea9a877 3553
ganlikun 0:13413ea9a877 3554 /* NOTE : This function should not be modified, when the callback is needed,
ganlikun 0:13413ea9a877 3555 the HAL_I2C_MasterRxCpltCallback can be implemented in the user file
ganlikun 0:13413ea9a877 3556 */
ganlikun 0:13413ea9a877 3557 }
ganlikun 0:13413ea9a877 3558
ganlikun 0:13413ea9a877 3559 /** @brief Slave Tx Transfer completed callback.
ganlikun 0:13413ea9a877 3560 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 3561 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 3562 * @retval None
ganlikun 0:13413ea9a877 3563 */
ganlikun 0:13413ea9a877 3564 __weak void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 3565 {
ganlikun 0:13413ea9a877 3566 /* Prevent unused argument(s) compilation warning */
ganlikun 0:13413ea9a877 3567 UNUSED(hi2c);
ganlikun 0:13413ea9a877 3568
ganlikun 0:13413ea9a877 3569 /* NOTE : This function should not be modified, when the callback is needed,
ganlikun 0:13413ea9a877 3570 the HAL_I2C_SlaveTxCpltCallback can be implemented in the user file
ganlikun 0:13413ea9a877 3571 */
ganlikun 0:13413ea9a877 3572 }
ganlikun 0:13413ea9a877 3573
ganlikun 0:13413ea9a877 3574 /**
ganlikun 0:13413ea9a877 3575 * @brief Slave Rx Transfer completed callback.
ganlikun 0:13413ea9a877 3576 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 3577 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 3578 * @retval None
ganlikun 0:13413ea9a877 3579 */
ganlikun 0:13413ea9a877 3580 __weak void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 3581 {
ganlikun 0:13413ea9a877 3582 /* Prevent unused argument(s) compilation warning */
ganlikun 0:13413ea9a877 3583 UNUSED(hi2c);
ganlikun 0:13413ea9a877 3584
ganlikun 0:13413ea9a877 3585 /* NOTE : This function should not be modified, when the callback is needed,
ganlikun 0:13413ea9a877 3586 the HAL_I2C_SlaveRxCpltCallback can be implemented in the user file
ganlikun 0:13413ea9a877 3587 */
ganlikun 0:13413ea9a877 3588 }
ganlikun 0:13413ea9a877 3589
ganlikun 0:13413ea9a877 3590 /**
ganlikun 0:13413ea9a877 3591 * @brief Slave Address Match callback.
ganlikun 0:13413ea9a877 3592 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 3593 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 3594 * @param TransferDirection Master request Transfer Direction (Write/Read), value of @ref I2C_XferOptions_definition
ganlikun 0:13413ea9a877 3595 * @param AddrMatchCode Address Match Code
ganlikun 0:13413ea9a877 3596 * @retval None
ganlikun 0:13413ea9a877 3597 */
ganlikun 0:13413ea9a877 3598 __weak void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode)
ganlikun 0:13413ea9a877 3599 {
ganlikun 0:13413ea9a877 3600 /* Prevent unused argument(s) compilation warning */
ganlikun 0:13413ea9a877 3601 UNUSED(hi2c);
ganlikun 0:13413ea9a877 3602 UNUSED(TransferDirection);
ganlikun 0:13413ea9a877 3603 UNUSED(AddrMatchCode);
ganlikun 0:13413ea9a877 3604
ganlikun 0:13413ea9a877 3605 /* NOTE : This function should not be modified, when the callback is needed,
ganlikun 0:13413ea9a877 3606 the HAL_I2C_AddrCallback can be implemented in the user file
ganlikun 0:13413ea9a877 3607 */
ganlikun 0:13413ea9a877 3608 }
ganlikun 0:13413ea9a877 3609
ganlikun 0:13413ea9a877 3610 /**
ganlikun 0:13413ea9a877 3611 * @brief Listen Complete callback.
ganlikun 0:13413ea9a877 3612 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 3613 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 3614 * @retval None
ganlikun 0:13413ea9a877 3615 */
ganlikun 0:13413ea9a877 3616 __weak void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 3617 {
ganlikun 0:13413ea9a877 3618 /* Prevent unused argument(s) compilation warning */
ganlikun 0:13413ea9a877 3619 UNUSED(hi2c);
ganlikun 0:13413ea9a877 3620
ganlikun 0:13413ea9a877 3621 /* NOTE : This function should not be modified, when the callback is needed,
ganlikun 0:13413ea9a877 3622 the HAL_I2C_ListenCpltCallback can be implemented in the user file
ganlikun 0:13413ea9a877 3623 */
ganlikun 0:13413ea9a877 3624 }
ganlikun 0:13413ea9a877 3625
ganlikun 0:13413ea9a877 3626 /**
ganlikun 0:13413ea9a877 3627 * @brief Memory Tx Transfer completed callback.
ganlikun 0:13413ea9a877 3628 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 3629 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 3630 * @retval None
ganlikun 0:13413ea9a877 3631 */
ganlikun 0:13413ea9a877 3632 __weak void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 3633 {
ganlikun 0:13413ea9a877 3634 /* Prevent unused argument(s) compilation warning */
ganlikun 0:13413ea9a877 3635 UNUSED(hi2c);
ganlikun 0:13413ea9a877 3636
ganlikun 0:13413ea9a877 3637 /* NOTE : This function should not be modified, when the callback is needed,
ganlikun 0:13413ea9a877 3638 the HAL_I2C_MemTxCpltCallback can be implemented in the user file
ganlikun 0:13413ea9a877 3639 */
ganlikun 0:13413ea9a877 3640 }
ganlikun 0:13413ea9a877 3641
ganlikun 0:13413ea9a877 3642 /**
ganlikun 0:13413ea9a877 3643 * @brief Memory Rx Transfer completed callback.
ganlikun 0:13413ea9a877 3644 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 3645 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 3646 * @retval None
ganlikun 0:13413ea9a877 3647 */
ganlikun 0:13413ea9a877 3648 __weak void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 3649 {
ganlikun 0:13413ea9a877 3650 /* Prevent unused argument(s) compilation warning */
ganlikun 0:13413ea9a877 3651 UNUSED(hi2c);
ganlikun 0:13413ea9a877 3652
ganlikun 0:13413ea9a877 3653 /* NOTE : This function should not be modified, when the callback is needed,
ganlikun 0:13413ea9a877 3654 the HAL_I2C_MemRxCpltCallback can be implemented in the user file
ganlikun 0:13413ea9a877 3655 */
ganlikun 0:13413ea9a877 3656 }
ganlikun 0:13413ea9a877 3657
ganlikun 0:13413ea9a877 3658 /**
ganlikun 0:13413ea9a877 3659 * @brief I2C error callback.
ganlikun 0:13413ea9a877 3660 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 3661 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 3662 * @retval None
ganlikun 0:13413ea9a877 3663 */
ganlikun 0:13413ea9a877 3664 __weak void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 3665 {
ganlikun 0:13413ea9a877 3666 /* Prevent unused argument(s) compilation warning */
ganlikun 0:13413ea9a877 3667 UNUSED(hi2c);
ganlikun 0:13413ea9a877 3668
ganlikun 0:13413ea9a877 3669 /* NOTE : This function should not be modified, when the callback is needed,
ganlikun 0:13413ea9a877 3670 the HAL_I2C_ErrorCallback can be implemented in the user file
ganlikun 0:13413ea9a877 3671 */
ganlikun 0:13413ea9a877 3672 }
ganlikun 0:13413ea9a877 3673
ganlikun 0:13413ea9a877 3674 /**
ganlikun 0:13413ea9a877 3675 * @brief I2C abort callback.
ganlikun 0:13413ea9a877 3676 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 3677 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 3678 * @retval None
ganlikun 0:13413ea9a877 3679 */
ganlikun 0:13413ea9a877 3680 __weak void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 3681 {
ganlikun 0:13413ea9a877 3682 /* Prevent unused argument(s) compilation warning */
ganlikun 0:13413ea9a877 3683 UNUSED(hi2c);
ganlikun 0:13413ea9a877 3684
ganlikun 0:13413ea9a877 3685 /* NOTE : This function should not be modified, when the callback is needed,
ganlikun 0:13413ea9a877 3686 the HAL_I2C_AbortCpltCallback could be implemented in the user file
ganlikun 0:13413ea9a877 3687 */
ganlikun 0:13413ea9a877 3688 }
ganlikun 0:13413ea9a877 3689
ganlikun 0:13413ea9a877 3690 /**
ganlikun 0:13413ea9a877 3691 * @}
ganlikun 0:13413ea9a877 3692 */
ganlikun 0:13413ea9a877 3693
ganlikun 0:13413ea9a877 3694 /** @defgroup I2C_Exported_Functions_Group3 Peripheral State, Mode and Error functions
ganlikun 0:13413ea9a877 3695 * @brief Peripheral State and Errors functions
ganlikun 0:13413ea9a877 3696 *
ganlikun 0:13413ea9a877 3697 @verbatim
ganlikun 0:13413ea9a877 3698 ===============================================================================
ganlikun 0:13413ea9a877 3699 ##### Peripheral State, Mode and Error functions #####
ganlikun 0:13413ea9a877 3700 ===============================================================================
ganlikun 0:13413ea9a877 3701 [..]
ganlikun 0:13413ea9a877 3702 This subsection permits to get in run-time the status of the peripheral
ganlikun 0:13413ea9a877 3703 and the data flow.
ganlikun 0:13413ea9a877 3704
ganlikun 0:13413ea9a877 3705 @endverbatim
ganlikun 0:13413ea9a877 3706 * @{
ganlikun 0:13413ea9a877 3707 */
ganlikun 0:13413ea9a877 3708
ganlikun 0:13413ea9a877 3709 /**
ganlikun 0:13413ea9a877 3710 * @brief Return the I2C handle state.
ganlikun 0:13413ea9a877 3711 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 3712 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 3713 * @retval HAL state
ganlikun 0:13413ea9a877 3714 */
ganlikun 0:13413ea9a877 3715 HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 3716 {
ganlikun 0:13413ea9a877 3717 /* Return I2C handle state */
ganlikun 0:13413ea9a877 3718 return hi2c->State;
ganlikun 0:13413ea9a877 3719 }
ganlikun 0:13413ea9a877 3720
ganlikun 0:13413ea9a877 3721 /**
ganlikun 0:13413ea9a877 3722 * @brief Return the I2C Master, Slave, Memory or no mode.
ganlikun 0:13413ea9a877 3723 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 3724 * the configuration information for I2C module
ganlikun 0:13413ea9a877 3725 * @retval HAL mode
ganlikun 0:13413ea9a877 3726 */
ganlikun 0:13413ea9a877 3727 HAL_I2C_ModeTypeDef HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 3728 {
ganlikun 0:13413ea9a877 3729 return hi2c->Mode;
ganlikun 0:13413ea9a877 3730 }
ganlikun 0:13413ea9a877 3731
ganlikun 0:13413ea9a877 3732 /**
ganlikun 0:13413ea9a877 3733 * @brief Return the I2C error code
ganlikun 0:13413ea9a877 3734 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 3735 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 3736 * @retval I2C Error Code
ganlikun 0:13413ea9a877 3737 */
ganlikun 0:13413ea9a877 3738 uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 3739 {
ganlikun 0:13413ea9a877 3740 return hi2c->ErrorCode;
ganlikun 0:13413ea9a877 3741 }
ganlikun 0:13413ea9a877 3742
ganlikun 0:13413ea9a877 3743 /**
ganlikun 0:13413ea9a877 3744 * @}
ganlikun 0:13413ea9a877 3745 */
ganlikun 0:13413ea9a877 3746
ganlikun 0:13413ea9a877 3747 /**
ganlikun 0:13413ea9a877 3748 * @brief Handle TXE flag for Master
ganlikun 0:13413ea9a877 3749 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 3750 * the configuration information for I2C module
ganlikun 0:13413ea9a877 3751 * @retval HAL status
ganlikun 0:13413ea9a877 3752 */
ganlikun 0:13413ea9a877 3753 static HAL_StatusTypeDef I2C_MasterTransmit_TXE(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 3754 {
ganlikun 0:13413ea9a877 3755 /* Declaration of temporary variables to prevent undefined behavior of volatile usage */
ganlikun 0:13413ea9a877 3756 uint32_t CurrentState = hi2c->State;
ganlikun 0:13413ea9a877 3757 uint32_t CurrentMode = hi2c->Mode;
ganlikun 0:13413ea9a877 3758 uint32_t CurrentXferOptions = hi2c->XferOptions;
ganlikun 0:13413ea9a877 3759
ganlikun 0:13413ea9a877 3760 if((hi2c->XferSize == 0U) && (CurrentState == HAL_I2C_STATE_BUSY_TX))
ganlikun 0:13413ea9a877 3761 {
ganlikun 0:13413ea9a877 3762 /* Call TxCpltCallback() directly if no stop mode is set */
ganlikun 0:13413ea9a877 3763 if((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) && (CurrentXferOptions != I2C_NO_OPTION_FRAME))
ganlikun 0:13413ea9a877 3764 {
ganlikun 0:13413ea9a877 3765 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
ganlikun 0:13413ea9a877 3766
ganlikun 0:13413ea9a877 3767 hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX;
ganlikun 0:13413ea9a877 3768 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 3769 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 3770
ganlikun 0:13413ea9a877 3771 HAL_I2C_MasterTxCpltCallback(hi2c);
ganlikun 0:13413ea9a877 3772 }
ganlikun 0:13413ea9a877 3773 else /* Generate Stop condition then Call TxCpltCallback() */
ganlikun 0:13413ea9a877 3774 {
ganlikun 0:13413ea9a877 3775 /* Disable EVT, BUF and ERR interrupt */
ganlikun 0:13413ea9a877 3776 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
ganlikun 0:13413ea9a877 3777
ganlikun 0:13413ea9a877 3778 /* Generate Stop */
ganlikun 0:13413ea9a877 3779 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 3780
ganlikun 0:13413ea9a877 3781 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 3782 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 3783
ganlikun 0:13413ea9a877 3784 if(hi2c->Mode == HAL_I2C_MODE_MEM)
ganlikun 0:13413ea9a877 3785 {
ganlikun 0:13413ea9a877 3786 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 3787 HAL_I2C_MemTxCpltCallback(hi2c);
ganlikun 0:13413ea9a877 3788 }
ganlikun 0:13413ea9a877 3789 else
ganlikun 0:13413ea9a877 3790 {
ganlikun 0:13413ea9a877 3791 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 3792 HAL_I2C_MasterTxCpltCallback(hi2c);
ganlikun 0:13413ea9a877 3793 }
ganlikun 0:13413ea9a877 3794 }
ganlikun 0:13413ea9a877 3795 }
ganlikun 0:13413ea9a877 3796 else if((CurrentState == HAL_I2C_STATE_BUSY_TX) || \
ganlikun 0:13413ea9a877 3797 ((CurrentMode == HAL_I2C_MODE_MEM) && (CurrentState == HAL_I2C_STATE_BUSY_RX)))
ganlikun 0:13413ea9a877 3798 {
ganlikun 0:13413ea9a877 3799 if(hi2c->XferCount == 0U)
ganlikun 0:13413ea9a877 3800 {
ganlikun 0:13413ea9a877 3801 /* Disable BUF interrupt */
ganlikun 0:13413ea9a877 3802 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
ganlikun 0:13413ea9a877 3803 }
ganlikun 0:13413ea9a877 3804 else
ganlikun 0:13413ea9a877 3805 {
ganlikun 0:13413ea9a877 3806 if(hi2c->Mode == HAL_I2C_MODE_MEM)
ganlikun 0:13413ea9a877 3807 {
ganlikun 0:13413ea9a877 3808 if(hi2c->EventCount == 0)
ganlikun 0:13413ea9a877 3809 {
ganlikun 0:13413ea9a877 3810 /* If Memory address size is 8Bit */
ganlikun 0:13413ea9a877 3811 if(hi2c->MemaddSize == I2C_MEMADD_SIZE_8BIT)
ganlikun 0:13413ea9a877 3812 {
ganlikun 0:13413ea9a877 3813 /* Send Memory Address */
ganlikun 0:13413ea9a877 3814 hi2c->Instance->DR = I2C_MEM_ADD_LSB(hi2c->Memaddress);
ganlikun 0:13413ea9a877 3815
ganlikun 0:13413ea9a877 3816 hi2c->EventCount += 2;
ganlikun 0:13413ea9a877 3817 }
ganlikun 0:13413ea9a877 3818 /* If Memory address size is 16Bit */
ganlikun 0:13413ea9a877 3819 else
ganlikun 0:13413ea9a877 3820 {
ganlikun 0:13413ea9a877 3821 /* Send MSB of Memory Address */
ganlikun 0:13413ea9a877 3822 hi2c->Instance->DR = I2C_MEM_ADD_MSB(hi2c->Memaddress);
ganlikun 0:13413ea9a877 3823
ganlikun 0:13413ea9a877 3824 hi2c->EventCount++;
ganlikun 0:13413ea9a877 3825 }
ganlikun 0:13413ea9a877 3826 }
ganlikun 0:13413ea9a877 3827 else if(hi2c->EventCount == 1)
ganlikun 0:13413ea9a877 3828 {
ganlikun 0:13413ea9a877 3829 /* Send LSB of Memory Address */
ganlikun 0:13413ea9a877 3830 hi2c->Instance->DR = I2C_MEM_ADD_LSB(hi2c->Memaddress);
ganlikun 0:13413ea9a877 3831
ganlikun 0:13413ea9a877 3832 hi2c->EventCount++;
ganlikun 0:13413ea9a877 3833 }
ganlikun 0:13413ea9a877 3834 else if(hi2c->EventCount == 2)
ganlikun 0:13413ea9a877 3835 {
ganlikun 0:13413ea9a877 3836 if(hi2c->State == HAL_I2C_STATE_BUSY_RX)
ganlikun 0:13413ea9a877 3837 {
ganlikun 0:13413ea9a877 3838 /* Generate Restart */
ganlikun 0:13413ea9a877 3839 hi2c->Instance->CR1 |= I2C_CR1_START;
ganlikun 0:13413ea9a877 3840 }
ganlikun 0:13413ea9a877 3841 else if(hi2c->State == HAL_I2C_STATE_BUSY_TX)
ganlikun 0:13413ea9a877 3842 {
ganlikun 0:13413ea9a877 3843 /* Write data to DR */
ganlikun 0:13413ea9a877 3844 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
ganlikun 0:13413ea9a877 3845 hi2c->XferCount--;
ganlikun 0:13413ea9a877 3846 }
ganlikun 0:13413ea9a877 3847 }
ganlikun 0:13413ea9a877 3848 }
ganlikun 0:13413ea9a877 3849 else
ganlikun 0:13413ea9a877 3850 {
ganlikun 0:13413ea9a877 3851 /* Write data to DR */
ganlikun 0:13413ea9a877 3852 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
ganlikun 0:13413ea9a877 3853 hi2c->XferCount--;
ganlikun 0:13413ea9a877 3854 }
ganlikun 0:13413ea9a877 3855 }
ganlikun 0:13413ea9a877 3856 }
ganlikun 0:13413ea9a877 3857 return HAL_OK;
ganlikun 0:13413ea9a877 3858 }
ganlikun 0:13413ea9a877 3859
ganlikun 0:13413ea9a877 3860 /**
ganlikun 0:13413ea9a877 3861 * @brief Handle BTF flag for Master transmitter
ganlikun 0:13413ea9a877 3862 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 3863 * the configuration information for I2C module
ganlikun 0:13413ea9a877 3864 * @retval HAL status
ganlikun 0:13413ea9a877 3865 */
ganlikun 0:13413ea9a877 3866 static HAL_StatusTypeDef I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 3867 {
ganlikun 0:13413ea9a877 3868 /* Declaration of temporary variables to prevent undefined behavior of volatile usage */
ganlikun 0:13413ea9a877 3869 uint32_t CurrentXferOptions = hi2c->XferOptions;
ganlikun 0:13413ea9a877 3870
ganlikun 0:13413ea9a877 3871 if(hi2c->State == HAL_I2C_STATE_BUSY_TX)
ganlikun 0:13413ea9a877 3872 {
ganlikun 0:13413ea9a877 3873 if(hi2c->XferCount != 0U)
ganlikun 0:13413ea9a877 3874 {
ganlikun 0:13413ea9a877 3875 /* Write data to DR */
ganlikun 0:13413ea9a877 3876 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
ganlikun 0:13413ea9a877 3877 hi2c->XferCount--;
ganlikun 0:13413ea9a877 3878 }
ganlikun 0:13413ea9a877 3879 else
ganlikun 0:13413ea9a877 3880 {
ganlikun 0:13413ea9a877 3881 /* Call TxCpltCallback() directly if no stop mode is set */
ganlikun 0:13413ea9a877 3882 if((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) && (CurrentXferOptions != I2C_NO_OPTION_FRAME))
ganlikun 0:13413ea9a877 3883 {
ganlikun 0:13413ea9a877 3884 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
ganlikun 0:13413ea9a877 3885
ganlikun 0:13413ea9a877 3886 hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX;
ganlikun 0:13413ea9a877 3887 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 3888 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 3889
ganlikun 0:13413ea9a877 3890 HAL_I2C_MasterTxCpltCallback(hi2c);
ganlikun 0:13413ea9a877 3891 }
ganlikun 0:13413ea9a877 3892 else /* Generate Stop condition then Call TxCpltCallback() */
ganlikun 0:13413ea9a877 3893 {
ganlikun 0:13413ea9a877 3894 /* Disable EVT, BUF and ERR interrupt */
ganlikun 0:13413ea9a877 3895 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
ganlikun 0:13413ea9a877 3896
ganlikun 0:13413ea9a877 3897 /* Generate Stop */
ganlikun 0:13413ea9a877 3898 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 3899
ganlikun 0:13413ea9a877 3900 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 3901 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 3902
ganlikun 0:13413ea9a877 3903 if(hi2c->Mode == HAL_I2C_MODE_MEM)
ganlikun 0:13413ea9a877 3904 {
ganlikun 0:13413ea9a877 3905 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 3906
ganlikun 0:13413ea9a877 3907 HAL_I2C_MemTxCpltCallback(hi2c);
ganlikun 0:13413ea9a877 3908 }
ganlikun 0:13413ea9a877 3909 else
ganlikun 0:13413ea9a877 3910 {
ganlikun 0:13413ea9a877 3911 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 3912
ganlikun 0:13413ea9a877 3913 HAL_I2C_MasterTxCpltCallback(hi2c);
ganlikun 0:13413ea9a877 3914 }
ganlikun 0:13413ea9a877 3915 }
ganlikun 0:13413ea9a877 3916 }
ganlikun 0:13413ea9a877 3917 }
ganlikun 0:13413ea9a877 3918 return HAL_OK;
ganlikun 0:13413ea9a877 3919 }
ganlikun 0:13413ea9a877 3920
ganlikun 0:13413ea9a877 3921 /**
ganlikun 0:13413ea9a877 3922 * @brief Handle RXNE flag for Master
ganlikun 0:13413ea9a877 3923 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 3924 * the configuration information for I2C module
ganlikun 0:13413ea9a877 3925 * @retval HAL status
ganlikun 0:13413ea9a877 3926 */
ganlikun 0:13413ea9a877 3927 static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 3928 {
ganlikun 0:13413ea9a877 3929
ganlikun 0:13413ea9a877 3930 if(hi2c->State == HAL_I2C_STATE_BUSY_RX)
ganlikun 0:13413ea9a877 3931 {
ganlikun 0:13413ea9a877 3932 uint32_t tmp = 0U;
ganlikun 0:13413ea9a877 3933
ganlikun 0:13413ea9a877 3934 tmp = hi2c->XferCount;
ganlikun 0:13413ea9a877 3935 if(tmp > 3U)
ganlikun 0:13413ea9a877 3936 {
ganlikun 0:13413ea9a877 3937 /* Read data from DR */
ganlikun 0:13413ea9a877 3938 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 3939 hi2c->XferCount--;
ganlikun 0:13413ea9a877 3940 }
ganlikun 0:13413ea9a877 3941 else if((tmp == 2U) || (tmp == 3U))
ganlikun 0:13413ea9a877 3942 {
ganlikun 0:13413ea9a877 3943 /* Disable Acknowledge */
ganlikun 0:13413ea9a877 3944 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 3945
ganlikun 0:13413ea9a877 3946 /* Enable Pos */
ganlikun 0:13413ea9a877 3947 hi2c->Instance->CR1 |= I2C_CR1_POS;
ganlikun 0:13413ea9a877 3948
ganlikun 0:13413ea9a877 3949 /* Disable BUF interrupt */
ganlikun 0:13413ea9a877 3950 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
ganlikun 0:13413ea9a877 3951 }
ganlikun 0:13413ea9a877 3952 else
ganlikun 0:13413ea9a877 3953 {
ganlikun 0:13413ea9a877 3954 /* Disable Acknowledge */
ganlikun 0:13413ea9a877 3955 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 3956
ganlikun 0:13413ea9a877 3957 if(hi2c->XferOptions == I2C_NEXT_FRAME)
ganlikun 0:13413ea9a877 3958 {
ganlikun 0:13413ea9a877 3959 /* Enable Pos */
ganlikun 0:13413ea9a877 3960 hi2c->Instance->CR1 |= I2C_CR1_POS;
ganlikun 0:13413ea9a877 3961 }
ganlikun 0:13413ea9a877 3962
ganlikun 0:13413ea9a877 3963 /* Disable EVT, BUF and ERR interrupt */
ganlikun 0:13413ea9a877 3964 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
ganlikun 0:13413ea9a877 3965
ganlikun 0:13413ea9a877 3966 /* Read data from DR */
ganlikun 0:13413ea9a877 3967 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 3968 hi2c->XferCount--;
ganlikun 0:13413ea9a877 3969
ganlikun 0:13413ea9a877 3970 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 3971 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 3972
ganlikun 0:13413ea9a877 3973 if(hi2c->Mode == HAL_I2C_MODE_MEM)
ganlikun 0:13413ea9a877 3974 {
ganlikun 0:13413ea9a877 3975 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 3976 HAL_I2C_MemRxCpltCallback(hi2c);
ganlikun 0:13413ea9a877 3977 }
ganlikun 0:13413ea9a877 3978 else
ganlikun 0:13413ea9a877 3979 {
ganlikun 0:13413ea9a877 3980 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 3981 HAL_I2C_MasterRxCpltCallback(hi2c);
ganlikun 0:13413ea9a877 3982 }
ganlikun 0:13413ea9a877 3983 }
ganlikun 0:13413ea9a877 3984 }
ganlikun 0:13413ea9a877 3985 return HAL_OK;
ganlikun 0:13413ea9a877 3986 }
ganlikun 0:13413ea9a877 3987
ganlikun 0:13413ea9a877 3988 /**
ganlikun 0:13413ea9a877 3989 * @brief Handle BTF flag for Master receiver
ganlikun 0:13413ea9a877 3990 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 3991 * the configuration information for I2C module
ganlikun 0:13413ea9a877 3992 * @retval HAL status
ganlikun 0:13413ea9a877 3993 */
ganlikun 0:13413ea9a877 3994 static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 3995 {
ganlikun 0:13413ea9a877 3996 /* Declaration of temporary variables to prevent undefined behavior of volatile usage */
ganlikun 0:13413ea9a877 3997 uint32_t CurrentXferOptions = hi2c->XferOptions;
ganlikun 0:13413ea9a877 3998
ganlikun 0:13413ea9a877 3999 if(hi2c->XferCount == 3U)
ganlikun 0:13413ea9a877 4000 {
ganlikun 0:13413ea9a877 4001 if((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME) || (CurrentXferOptions == I2C_NO_OPTION_FRAME))
ganlikun 0:13413ea9a877 4002 {
ganlikun 0:13413ea9a877 4003 /* Disable Acknowledge */
ganlikun 0:13413ea9a877 4004 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 4005 }
ganlikun 0:13413ea9a877 4006
ganlikun 0:13413ea9a877 4007 /* Read data from DR */
ganlikun 0:13413ea9a877 4008 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 4009 hi2c->XferCount--;
ganlikun 0:13413ea9a877 4010 }
ganlikun 0:13413ea9a877 4011 else if(hi2c->XferCount == 2U)
ganlikun 0:13413ea9a877 4012 {
ganlikun 0:13413ea9a877 4013 /* Prepare next transfer or stop current transfer */
ganlikun 0:13413ea9a877 4014 if((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) && (CurrentXferOptions != I2C_NO_OPTION_FRAME))
ganlikun 0:13413ea9a877 4015 {
ganlikun 0:13413ea9a877 4016 /* Disable Acknowledge */
ganlikun 0:13413ea9a877 4017 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 4018
ganlikun 0:13413ea9a877 4019 if((CurrentXferOptions == I2C_NEXT_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME))
ganlikun 0:13413ea9a877 4020 {
ganlikun 0:13413ea9a877 4021 /* Generate ReStart */
ganlikun 0:13413ea9a877 4022 hi2c->Instance->CR1 |= I2C_CR1_START;
ganlikun 0:13413ea9a877 4023 }
ganlikun 0:13413ea9a877 4024 }
ganlikun 0:13413ea9a877 4025 else
ganlikun 0:13413ea9a877 4026 {
ganlikun 0:13413ea9a877 4027 /* Generate Stop */
ganlikun 0:13413ea9a877 4028 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 4029 }
ganlikun 0:13413ea9a877 4030
ganlikun 0:13413ea9a877 4031 /* Read data from DR */
ganlikun 0:13413ea9a877 4032 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 4033 hi2c->XferCount--;
ganlikun 0:13413ea9a877 4034
ganlikun 0:13413ea9a877 4035 /* Read data from DR */
ganlikun 0:13413ea9a877 4036 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 4037 hi2c->XferCount--;
ganlikun 0:13413ea9a877 4038
ganlikun 0:13413ea9a877 4039 /* Disable EVT and ERR interrupt */
ganlikun 0:13413ea9a877 4040 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
ganlikun 0:13413ea9a877 4041
ganlikun 0:13413ea9a877 4042 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 4043 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 4044
ganlikun 0:13413ea9a877 4045 if(hi2c->Mode == HAL_I2C_MODE_MEM)
ganlikun 0:13413ea9a877 4046 {
ganlikun 0:13413ea9a877 4047 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 4048
ganlikun 0:13413ea9a877 4049 HAL_I2C_MemRxCpltCallback(hi2c);
ganlikun 0:13413ea9a877 4050 }
ganlikun 0:13413ea9a877 4051 else
ganlikun 0:13413ea9a877 4052 {
ganlikun 0:13413ea9a877 4053 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 4054
ganlikun 0:13413ea9a877 4055 HAL_I2C_MasterRxCpltCallback(hi2c);
ganlikun 0:13413ea9a877 4056 }
ganlikun 0:13413ea9a877 4057 }
ganlikun 0:13413ea9a877 4058 else
ganlikun 0:13413ea9a877 4059 {
ganlikun 0:13413ea9a877 4060 /* Read data from DR */
ganlikun 0:13413ea9a877 4061 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 4062 hi2c->XferCount--;
ganlikun 0:13413ea9a877 4063 }
ganlikun 0:13413ea9a877 4064 return HAL_OK;
ganlikun 0:13413ea9a877 4065 }
ganlikun 0:13413ea9a877 4066
ganlikun 0:13413ea9a877 4067 /**
ganlikun 0:13413ea9a877 4068 * @brief Handle SB flag for Master
ganlikun 0:13413ea9a877 4069 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 4070 * the configuration information for I2C module
ganlikun 0:13413ea9a877 4071 * @retval HAL status
ganlikun 0:13413ea9a877 4072 */
ganlikun 0:13413ea9a877 4073 static HAL_StatusTypeDef I2C_Master_SB(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 4074 {
ganlikun 0:13413ea9a877 4075 if(hi2c->Mode == HAL_I2C_MODE_MEM)
ganlikun 0:13413ea9a877 4076 {
ganlikun 0:13413ea9a877 4077 if(hi2c->EventCount == 0U)
ganlikun 0:13413ea9a877 4078 {
ganlikun 0:13413ea9a877 4079 /* Send slave address */
ganlikun 0:13413ea9a877 4080 hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(hi2c->Devaddress);
ganlikun 0:13413ea9a877 4081 }
ganlikun 0:13413ea9a877 4082 else
ganlikun 0:13413ea9a877 4083 {
ganlikun 0:13413ea9a877 4084 hi2c->Instance->DR = I2C_7BIT_ADD_READ(hi2c->Devaddress);
ganlikun 0:13413ea9a877 4085 }
ganlikun 0:13413ea9a877 4086 }
ganlikun 0:13413ea9a877 4087 else
ganlikun 0:13413ea9a877 4088 {
ganlikun 0:13413ea9a877 4089 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
ganlikun 0:13413ea9a877 4090 {
ganlikun 0:13413ea9a877 4091 /* Send slave 7 Bits address */
ganlikun 0:13413ea9a877 4092 if(hi2c->State == HAL_I2C_STATE_BUSY_TX)
ganlikun 0:13413ea9a877 4093 {
ganlikun 0:13413ea9a877 4094 hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(hi2c->Devaddress);
ganlikun 0:13413ea9a877 4095 }
ganlikun 0:13413ea9a877 4096 else
ganlikun 0:13413ea9a877 4097 {
ganlikun 0:13413ea9a877 4098 hi2c->Instance->DR = I2C_7BIT_ADD_READ(hi2c->Devaddress);
ganlikun 0:13413ea9a877 4099 }
ganlikun 0:13413ea9a877 4100 }
ganlikun 0:13413ea9a877 4101 else
ganlikun 0:13413ea9a877 4102 {
ganlikun 0:13413ea9a877 4103 if(hi2c->EventCount == 0U)
ganlikun 0:13413ea9a877 4104 {
ganlikun 0:13413ea9a877 4105 /* Send header of slave address */
ganlikun 0:13413ea9a877 4106 hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(hi2c->Devaddress);
ganlikun 0:13413ea9a877 4107 }
ganlikun 0:13413ea9a877 4108 else if(hi2c->EventCount == 1U)
ganlikun 0:13413ea9a877 4109 {
ganlikun 0:13413ea9a877 4110 /* Send header of slave address */
ganlikun 0:13413ea9a877 4111 hi2c->Instance->DR = I2C_10BIT_HEADER_READ(hi2c->Devaddress);
ganlikun 0:13413ea9a877 4112 }
ganlikun 0:13413ea9a877 4113 }
ganlikun 0:13413ea9a877 4114 }
ganlikun 0:13413ea9a877 4115
ganlikun 0:13413ea9a877 4116 return HAL_OK;
ganlikun 0:13413ea9a877 4117 }
ganlikun 0:13413ea9a877 4118
ganlikun 0:13413ea9a877 4119 /**
ganlikun 0:13413ea9a877 4120 * @brief Handle ADD10 flag for Master
ganlikun 0:13413ea9a877 4121 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 4122 * the configuration information for I2C module
ganlikun 0:13413ea9a877 4123 * @retval HAL status
ganlikun 0:13413ea9a877 4124 */
ganlikun 0:13413ea9a877 4125 static HAL_StatusTypeDef I2C_Master_ADD10(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 4126 {
ganlikun 0:13413ea9a877 4127 /* Send slave address */
ganlikun 0:13413ea9a877 4128 hi2c->Instance->DR = I2C_10BIT_ADDRESS(hi2c->Devaddress);
ganlikun 0:13413ea9a877 4129
ganlikun 0:13413ea9a877 4130 return HAL_OK;
ganlikun 0:13413ea9a877 4131 }
ganlikun 0:13413ea9a877 4132
ganlikun 0:13413ea9a877 4133 /**
ganlikun 0:13413ea9a877 4134 * @brief Handle ADDR flag for Master
ganlikun 0:13413ea9a877 4135 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 4136 * the configuration information for I2C module
ganlikun 0:13413ea9a877 4137 * @retval HAL status
ganlikun 0:13413ea9a877 4138 */
ganlikun 0:13413ea9a877 4139 static HAL_StatusTypeDef I2C_Master_ADDR(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 4140 {
ganlikun 0:13413ea9a877 4141 /* Declaration of temporary variable to prevent undefined behavior of volatile usage */
ganlikun 0:13413ea9a877 4142 uint32_t CurrentMode = hi2c->Mode;
ganlikun 0:13413ea9a877 4143 uint32_t CurrentXferOptions = hi2c->XferOptions;
ganlikun 0:13413ea9a877 4144 uint32_t Prev_State = hi2c->PreviousState;
ganlikun 0:13413ea9a877 4145
ganlikun 0:13413ea9a877 4146 if(hi2c->State == HAL_I2C_STATE_BUSY_RX)
ganlikun 0:13413ea9a877 4147 {
ganlikun 0:13413ea9a877 4148 if((hi2c->EventCount == 0U) && (CurrentMode == HAL_I2C_MODE_MEM))
ganlikun 0:13413ea9a877 4149 {
ganlikun 0:13413ea9a877 4150 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 4151 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 4152 }
ganlikun 0:13413ea9a877 4153 else if((hi2c->EventCount == 0U) && (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT))
ganlikun 0:13413ea9a877 4154 {
ganlikun 0:13413ea9a877 4155 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 4156 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 4157
ganlikun 0:13413ea9a877 4158 /* Generate Restart */
ganlikun 0:13413ea9a877 4159 hi2c->Instance->CR1 |= I2C_CR1_START;
ganlikun 0:13413ea9a877 4160
ganlikun 0:13413ea9a877 4161 hi2c->EventCount++;
ganlikun 0:13413ea9a877 4162 }
ganlikun 0:13413ea9a877 4163 else
ganlikun 0:13413ea9a877 4164 {
ganlikun 0:13413ea9a877 4165 if(hi2c->XferCount == 0U)
ganlikun 0:13413ea9a877 4166 {
ganlikun 0:13413ea9a877 4167 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 4168 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 4169
ganlikun 0:13413ea9a877 4170 /* Generate Stop */
ganlikun 0:13413ea9a877 4171 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 4172 }
ganlikun 0:13413ea9a877 4173 else if(hi2c->XferCount == 1U)
ganlikun 0:13413ea9a877 4174 {
ganlikun 0:13413ea9a877 4175 if(CurrentXferOptions == I2C_NO_OPTION_FRAME)
ganlikun 0:13413ea9a877 4176 {
ganlikun 0:13413ea9a877 4177 /* Disable Acknowledge */
ganlikun 0:13413ea9a877 4178 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 4179
ganlikun 0:13413ea9a877 4180 if((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN)
ganlikun 0:13413ea9a877 4181 {
ganlikun 0:13413ea9a877 4182 /* Disable Acknowledge */
ganlikun 0:13413ea9a877 4183 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 4184
ganlikun 0:13413ea9a877 4185 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 4186 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 4187 }
ganlikun 0:13413ea9a877 4188 else
ganlikun 0:13413ea9a877 4189 {
ganlikun 0:13413ea9a877 4190 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 4191 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 4192
ganlikun 0:13413ea9a877 4193 /* Generate Stop */
ganlikun 0:13413ea9a877 4194 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 4195 }
ganlikun 0:13413ea9a877 4196 }
ganlikun 0:13413ea9a877 4197 /* Prepare next transfer or stop current transfer */
ganlikun 0:13413ea9a877 4198 else if((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) \
ganlikun 0:13413ea9a877 4199 && (Prev_State != I2C_STATE_MASTER_BUSY_RX))
ganlikun 0:13413ea9a877 4200 {
ganlikun 0:13413ea9a877 4201 if(hi2c->XferOptions != I2C_NEXT_FRAME)
ganlikun 0:13413ea9a877 4202 {
ganlikun 0:13413ea9a877 4203 /* Disable Acknowledge */
ganlikun 0:13413ea9a877 4204 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 4205 }
ganlikun 0:13413ea9a877 4206 else
ganlikun 0:13413ea9a877 4207 {
ganlikun 0:13413ea9a877 4208 /* Enable Acknowledge */
ganlikun 0:13413ea9a877 4209 hi2c->Instance->CR1 |= I2C_CR1_ACK;
ganlikun 0:13413ea9a877 4210 }
ganlikun 0:13413ea9a877 4211
ganlikun 0:13413ea9a877 4212 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 4213 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 4214 }
ganlikun 0:13413ea9a877 4215 else
ganlikun 0:13413ea9a877 4216 {
ganlikun 0:13413ea9a877 4217 /* Disable Acknowledge */
ganlikun 0:13413ea9a877 4218 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 4219
ganlikun 0:13413ea9a877 4220 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 4221 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 4222
ganlikun 0:13413ea9a877 4223 /* Generate Stop */
ganlikun 0:13413ea9a877 4224 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 4225 }
ganlikun 0:13413ea9a877 4226 }
ganlikun 0:13413ea9a877 4227 else if(hi2c->XferCount == 2U)
ganlikun 0:13413ea9a877 4228 {
ganlikun 0:13413ea9a877 4229 if(hi2c->XferOptions != I2C_NEXT_FRAME)
ganlikun 0:13413ea9a877 4230 {
ganlikun 0:13413ea9a877 4231 /* Disable Acknowledge */
ganlikun 0:13413ea9a877 4232 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 4233
ganlikun 0:13413ea9a877 4234 /* Enable Pos */
ganlikun 0:13413ea9a877 4235 hi2c->Instance->CR1 |= I2C_CR1_POS;
ganlikun 0:13413ea9a877 4236 }
ganlikun 0:13413ea9a877 4237 else
ganlikun 0:13413ea9a877 4238 {
ganlikun 0:13413ea9a877 4239 /* Enable Acknowledge */
ganlikun 0:13413ea9a877 4240 hi2c->Instance->CR1 |= I2C_CR1_ACK;
ganlikun 0:13413ea9a877 4241 }
ganlikun 0:13413ea9a877 4242
ganlikun 0:13413ea9a877 4243 if((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN)
ganlikun 0:13413ea9a877 4244 {
ganlikun 0:13413ea9a877 4245 /* Enable Last DMA bit */
ganlikun 0:13413ea9a877 4246 hi2c->Instance->CR2 |= I2C_CR2_LAST;
ganlikun 0:13413ea9a877 4247 }
ganlikun 0:13413ea9a877 4248
ganlikun 0:13413ea9a877 4249 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 4250 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 4251 }
ganlikun 0:13413ea9a877 4252 else
ganlikun 0:13413ea9a877 4253 {
ganlikun 0:13413ea9a877 4254 /* Enable Acknowledge */
ganlikun 0:13413ea9a877 4255 hi2c->Instance->CR1 |= I2C_CR1_ACK;
ganlikun 0:13413ea9a877 4256
ganlikun 0:13413ea9a877 4257 if((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN)
ganlikun 0:13413ea9a877 4258 {
ganlikun 0:13413ea9a877 4259 /* Enable Last DMA bit */
ganlikun 0:13413ea9a877 4260 hi2c->Instance->CR2 |= I2C_CR2_LAST;
ganlikun 0:13413ea9a877 4261 }
ganlikun 0:13413ea9a877 4262
ganlikun 0:13413ea9a877 4263 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 4264 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 4265 }
ganlikun 0:13413ea9a877 4266
ganlikun 0:13413ea9a877 4267 /* Reset Event counter */
ganlikun 0:13413ea9a877 4268 hi2c->EventCount = 0U;
ganlikun 0:13413ea9a877 4269 }
ganlikun 0:13413ea9a877 4270 }
ganlikun 0:13413ea9a877 4271 else
ganlikun 0:13413ea9a877 4272 {
ganlikun 0:13413ea9a877 4273 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 4274 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 4275 }
ganlikun 0:13413ea9a877 4276
ganlikun 0:13413ea9a877 4277 return HAL_OK;
ganlikun 0:13413ea9a877 4278 }
ganlikun 0:13413ea9a877 4279
ganlikun 0:13413ea9a877 4280 /**
ganlikun 0:13413ea9a877 4281 * @brief Handle TXE flag for Slave
ganlikun 0:13413ea9a877 4282 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 4283 * the configuration information for I2C module
ganlikun 0:13413ea9a877 4284 * @retval HAL status
ganlikun 0:13413ea9a877 4285 */
ganlikun 0:13413ea9a877 4286 static HAL_StatusTypeDef I2C_SlaveTransmit_TXE(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 4287 {
ganlikun 0:13413ea9a877 4288 /* Declaration of temporary variables to prevent undefined behavior of volatile usage */
ganlikun 0:13413ea9a877 4289 uint32_t CurrentState = hi2c->State;
ganlikun 0:13413ea9a877 4290
ganlikun 0:13413ea9a877 4291 if(hi2c->XferCount != 0U)
ganlikun 0:13413ea9a877 4292 {
ganlikun 0:13413ea9a877 4293 /* Write data to DR */
ganlikun 0:13413ea9a877 4294 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
ganlikun 0:13413ea9a877 4295 hi2c->XferCount--;
ganlikun 0:13413ea9a877 4296
ganlikun 0:13413ea9a877 4297 if((hi2c->XferCount == 0U) && (CurrentState == HAL_I2C_STATE_BUSY_TX_LISTEN))
ganlikun 0:13413ea9a877 4298 {
ganlikun 0:13413ea9a877 4299 /* Last Byte is received, disable Interrupt */
ganlikun 0:13413ea9a877 4300 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
ganlikun 0:13413ea9a877 4301
ganlikun 0:13413ea9a877 4302 /* Set state at HAL_I2C_STATE_LISTEN */
ganlikun 0:13413ea9a877 4303 hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX;
ganlikun 0:13413ea9a877 4304 hi2c->State = HAL_I2C_STATE_LISTEN;
ganlikun 0:13413ea9a877 4305
ganlikun 0:13413ea9a877 4306 /* Call the Tx complete callback to inform upper layer of the end of receive process */
ganlikun 0:13413ea9a877 4307 HAL_I2C_SlaveTxCpltCallback(hi2c);
ganlikun 0:13413ea9a877 4308 }
ganlikun 0:13413ea9a877 4309 }
ganlikun 0:13413ea9a877 4310 return HAL_OK;
ganlikun 0:13413ea9a877 4311 }
ganlikun 0:13413ea9a877 4312
ganlikun 0:13413ea9a877 4313 /**
ganlikun 0:13413ea9a877 4314 * @brief Handle BTF flag for Slave transmitter
ganlikun 0:13413ea9a877 4315 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 4316 * the configuration information for I2C module
ganlikun 0:13413ea9a877 4317 * @retval HAL status
ganlikun 0:13413ea9a877 4318 */
ganlikun 0:13413ea9a877 4319 static HAL_StatusTypeDef I2C_SlaveTransmit_BTF(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 4320 {
ganlikun 0:13413ea9a877 4321 if(hi2c->XferCount != 0U)
ganlikun 0:13413ea9a877 4322 {
ganlikun 0:13413ea9a877 4323 /* Write data to DR */
ganlikun 0:13413ea9a877 4324 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
ganlikun 0:13413ea9a877 4325 hi2c->XferCount--;
ganlikun 0:13413ea9a877 4326 }
ganlikun 0:13413ea9a877 4327 return HAL_OK;
ganlikun 0:13413ea9a877 4328 }
ganlikun 0:13413ea9a877 4329
ganlikun 0:13413ea9a877 4330 /**
ganlikun 0:13413ea9a877 4331 * @brief Handle RXNE flag for Slave
ganlikun 0:13413ea9a877 4332 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 4333 * the configuration information for I2C module
ganlikun 0:13413ea9a877 4334 * @retval HAL status
ganlikun 0:13413ea9a877 4335 */
ganlikun 0:13413ea9a877 4336 static HAL_StatusTypeDef I2C_SlaveReceive_RXNE(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 4337 {
ganlikun 0:13413ea9a877 4338 /* Declaration of temporary variables to prevent undefined behavior of volatile usage */
ganlikun 0:13413ea9a877 4339 uint32_t CurrentState = hi2c->State;
ganlikun 0:13413ea9a877 4340
ganlikun 0:13413ea9a877 4341 if(hi2c->XferCount != 0U)
ganlikun 0:13413ea9a877 4342 {
ganlikun 0:13413ea9a877 4343 /* Read data from DR */
ganlikun 0:13413ea9a877 4344 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 4345 hi2c->XferCount--;
ganlikun 0:13413ea9a877 4346
ganlikun 0:13413ea9a877 4347 if((hi2c->XferCount == 0U) && (CurrentState == HAL_I2C_STATE_BUSY_RX_LISTEN))
ganlikun 0:13413ea9a877 4348 {
ganlikun 0:13413ea9a877 4349 /* Last Byte is received, disable Interrupt */
ganlikun 0:13413ea9a877 4350 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
ganlikun 0:13413ea9a877 4351
ganlikun 0:13413ea9a877 4352 /* Set state at HAL_I2C_STATE_LISTEN */
ganlikun 0:13413ea9a877 4353 hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX;
ganlikun 0:13413ea9a877 4354 hi2c->State = HAL_I2C_STATE_LISTEN;
ganlikun 0:13413ea9a877 4355
ganlikun 0:13413ea9a877 4356 /* Call the Rx complete callback to inform upper layer of the end of receive process */
ganlikun 0:13413ea9a877 4357 HAL_I2C_SlaveRxCpltCallback(hi2c);
ganlikun 0:13413ea9a877 4358 }
ganlikun 0:13413ea9a877 4359 }
ganlikun 0:13413ea9a877 4360 return HAL_OK;
ganlikun 0:13413ea9a877 4361 }
ganlikun 0:13413ea9a877 4362
ganlikun 0:13413ea9a877 4363 /**
ganlikun 0:13413ea9a877 4364 * @brief Handle BTF flag for Slave receiver
ganlikun 0:13413ea9a877 4365 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 4366 * the configuration information for I2C module
ganlikun 0:13413ea9a877 4367 * @retval HAL status
ganlikun 0:13413ea9a877 4368 */
ganlikun 0:13413ea9a877 4369 static HAL_StatusTypeDef I2C_SlaveReceive_BTF(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 4370 {
ganlikun 0:13413ea9a877 4371 if(hi2c->XferCount != 0U)
ganlikun 0:13413ea9a877 4372 {
ganlikun 0:13413ea9a877 4373 /* Read data from DR */
ganlikun 0:13413ea9a877 4374 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 4375 hi2c->XferCount--;
ganlikun 0:13413ea9a877 4376 }
ganlikun 0:13413ea9a877 4377 return HAL_OK;
ganlikun 0:13413ea9a877 4378 }
ganlikun 0:13413ea9a877 4379
ganlikun 0:13413ea9a877 4380 /**
ganlikun 0:13413ea9a877 4381 * @brief Handle ADD flag for Slave
ganlikun 0:13413ea9a877 4382 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 4383 * the configuration information for I2C module
ganlikun 0:13413ea9a877 4384 * @retval HAL status
ganlikun 0:13413ea9a877 4385 */
ganlikun 0:13413ea9a877 4386 static HAL_StatusTypeDef I2C_Slave_ADDR(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 4387 {
ganlikun 0:13413ea9a877 4388 uint8_t TransferDirection = I2C_DIRECTION_RECEIVE;
ganlikun 0:13413ea9a877 4389 uint16_t SlaveAddrCode = 0U;
ganlikun 0:13413ea9a877 4390
ganlikun 0:13413ea9a877 4391 /* Transfer Direction requested by Master */
ganlikun 0:13413ea9a877 4392 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TRA) == RESET)
ganlikun 0:13413ea9a877 4393 {
ganlikun 0:13413ea9a877 4394 TransferDirection = I2C_DIRECTION_TRANSMIT;
ganlikun 0:13413ea9a877 4395 }
ganlikun 0:13413ea9a877 4396
ganlikun 0:13413ea9a877 4397 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_DUALF) == RESET)
ganlikun 0:13413ea9a877 4398 {
ganlikun 0:13413ea9a877 4399 SlaveAddrCode = hi2c->Init.OwnAddress1;
ganlikun 0:13413ea9a877 4400 }
ganlikun 0:13413ea9a877 4401 else
ganlikun 0:13413ea9a877 4402 {
ganlikun 0:13413ea9a877 4403 SlaveAddrCode = hi2c->Init.OwnAddress2;
ganlikun 0:13413ea9a877 4404 }
ganlikun 0:13413ea9a877 4405
ganlikun 0:13413ea9a877 4406 /* Call Slave Addr callback */
ganlikun 0:13413ea9a877 4407 HAL_I2C_AddrCallback(hi2c, TransferDirection, SlaveAddrCode);
ganlikun 0:13413ea9a877 4408
ganlikun 0:13413ea9a877 4409 return HAL_OK;
ganlikun 0:13413ea9a877 4410 }
ganlikun 0:13413ea9a877 4411
ganlikun 0:13413ea9a877 4412 /**
ganlikun 0:13413ea9a877 4413 * @brief Handle STOPF flag for Slave
ganlikun 0:13413ea9a877 4414 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 4415 * the configuration information for I2C module
ganlikun 0:13413ea9a877 4416 * @retval HAL status
ganlikun 0:13413ea9a877 4417 */
ganlikun 0:13413ea9a877 4418 static HAL_StatusTypeDef I2C_Slave_STOPF(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 4419 {
ganlikun 0:13413ea9a877 4420 /* Declaration of temporary variable to prevent undefined behavior of volatile usage */
ganlikun 0:13413ea9a877 4421 uint32_t CurrentState = hi2c->State;
ganlikun 0:13413ea9a877 4422
ganlikun 0:13413ea9a877 4423 /* Disable EVT, BUF and ERR interrupt */
ganlikun 0:13413ea9a877 4424 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
ganlikun 0:13413ea9a877 4425
ganlikun 0:13413ea9a877 4426 /* Clear STOPF flag */
ganlikun 0:13413ea9a877 4427 __HAL_I2C_CLEAR_STOPFLAG(hi2c);
ganlikun 0:13413ea9a877 4428
ganlikun 0:13413ea9a877 4429 /* Disable Acknowledge */
ganlikun 0:13413ea9a877 4430 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 4431
ganlikun 0:13413ea9a877 4432 /* If a DMA is ongoing, Update handle size context */
ganlikun 0:13413ea9a877 4433 if((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN)
ganlikun 0:13413ea9a877 4434 {
ganlikun 0:13413ea9a877 4435 if((hi2c->State == HAL_I2C_STATE_BUSY_RX) || (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN))
ganlikun 0:13413ea9a877 4436 {
ganlikun 0:13413ea9a877 4437 hi2c->XferCount = __HAL_DMA_GET_COUNTER(hi2c->hdmarx);
ganlikun 0:13413ea9a877 4438 }
ganlikun 0:13413ea9a877 4439 else
ganlikun 0:13413ea9a877 4440 {
ganlikun 0:13413ea9a877 4441 hi2c->XferCount = __HAL_DMA_GET_COUNTER(hi2c->hdmatx);
ganlikun 0:13413ea9a877 4442 }
ganlikun 0:13413ea9a877 4443 }
ganlikun 0:13413ea9a877 4444
ganlikun 0:13413ea9a877 4445 /* All data are not transferred, so set error code accordingly */
ganlikun 0:13413ea9a877 4446 if(hi2c->XferCount != 0U)
ganlikun 0:13413ea9a877 4447 {
ganlikun 0:13413ea9a877 4448 /* Store Last receive data if any */
ganlikun 0:13413ea9a877 4449 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET)
ganlikun 0:13413ea9a877 4450 {
ganlikun 0:13413ea9a877 4451 /* Read data from DR */
ganlikun 0:13413ea9a877 4452 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 4453 hi2c->XferCount--;
ganlikun 0:13413ea9a877 4454 }
ganlikun 0:13413ea9a877 4455
ganlikun 0:13413ea9a877 4456 /* Store Last receive data if any */
ganlikun 0:13413ea9a877 4457 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET)
ganlikun 0:13413ea9a877 4458 {
ganlikun 0:13413ea9a877 4459 /* Read data from DR */
ganlikun 0:13413ea9a877 4460 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 4461 hi2c->XferCount--;
ganlikun 0:13413ea9a877 4462 }
ganlikun 0:13413ea9a877 4463
ganlikun 0:13413ea9a877 4464 /* Set ErrorCode corresponding to a Non-Acknowledge */
ganlikun 0:13413ea9a877 4465 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
ganlikun 0:13413ea9a877 4466 }
ganlikun 0:13413ea9a877 4467
ganlikun 0:13413ea9a877 4468 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
ganlikun 0:13413ea9a877 4469 {
ganlikun 0:13413ea9a877 4470 /* Call the corresponding callback to inform upper layer of End of Transfer */
ganlikun 0:13413ea9a877 4471 I2C_ITError(hi2c);
ganlikun 0:13413ea9a877 4472 }
ganlikun 0:13413ea9a877 4473 else
ganlikun 0:13413ea9a877 4474 {
ganlikun 0:13413ea9a877 4475 if((CurrentState == HAL_I2C_STATE_LISTEN ) || (CurrentState == HAL_I2C_STATE_BUSY_RX_LISTEN) || \
ganlikun 0:13413ea9a877 4476 (CurrentState == HAL_I2C_STATE_BUSY_TX_LISTEN))
ganlikun 0:13413ea9a877 4477 {
ganlikun 0:13413ea9a877 4478 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
ganlikun 0:13413ea9a877 4479 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 4480 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 4481 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 4482
ganlikun 0:13413ea9a877 4483 /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */
ganlikun 0:13413ea9a877 4484 HAL_I2C_ListenCpltCallback(hi2c);
ganlikun 0:13413ea9a877 4485 }
ganlikun 0:13413ea9a877 4486 else
ganlikun 0:13413ea9a877 4487 {
ganlikun 0:13413ea9a877 4488 if((hi2c->PreviousState == I2C_STATE_SLAVE_BUSY_RX) || (CurrentState == HAL_I2C_STATE_BUSY_RX))
ganlikun 0:13413ea9a877 4489 {
ganlikun 0:13413ea9a877 4490 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 4491 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 4492 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 4493
ganlikun 0:13413ea9a877 4494 HAL_I2C_SlaveRxCpltCallback(hi2c);
ganlikun 0:13413ea9a877 4495 }
ganlikun 0:13413ea9a877 4496 }
ganlikun 0:13413ea9a877 4497 }
ganlikun 0:13413ea9a877 4498 return HAL_OK;
ganlikun 0:13413ea9a877 4499 }
ganlikun 0:13413ea9a877 4500
ganlikun 0:13413ea9a877 4501 /**
ganlikun 0:13413ea9a877 4502 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 4503 * the configuration information for I2C module
ganlikun 0:13413ea9a877 4504 * @retval HAL status
ganlikun 0:13413ea9a877 4505 */
ganlikun 0:13413ea9a877 4506 static HAL_StatusTypeDef I2C_Slave_AF(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 4507 {
ganlikun 0:13413ea9a877 4508 /* Declaration of temporary variables to prevent undefined behavior of volatile usage */
ganlikun 0:13413ea9a877 4509 uint32_t CurrentState = hi2c->State;
ganlikun 0:13413ea9a877 4510 uint32_t CurrentXferOptions = hi2c->XferOptions;
ganlikun 0:13413ea9a877 4511
ganlikun 0:13413ea9a877 4512 if(((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME)) && \
ganlikun 0:13413ea9a877 4513 (CurrentState == HAL_I2C_STATE_LISTEN))
ganlikun 0:13413ea9a877 4514 {
ganlikun 0:13413ea9a877 4515 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
ganlikun 0:13413ea9a877 4516
ganlikun 0:13413ea9a877 4517 /* Disable EVT, BUF and ERR interrupt */
ganlikun 0:13413ea9a877 4518 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
ganlikun 0:13413ea9a877 4519
ganlikun 0:13413ea9a877 4520 /* Clear AF flag */
ganlikun 0:13413ea9a877 4521 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
ganlikun 0:13413ea9a877 4522
ganlikun 0:13413ea9a877 4523 /* Disable Acknowledge */
ganlikun 0:13413ea9a877 4524 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 4525
ganlikun 0:13413ea9a877 4526 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 4527 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 4528 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 4529
ganlikun 0:13413ea9a877 4530 /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */
ganlikun 0:13413ea9a877 4531 HAL_I2C_ListenCpltCallback(hi2c);
ganlikun 0:13413ea9a877 4532 }
ganlikun 0:13413ea9a877 4533 else if(CurrentState == HAL_I2C_STATE_BUSY_TX)
ganlikun 0:13413ea9a877 4534 {
ganlikun 0:13413ea9a877 4535 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
ganlikun 0:13413ea9a877 4536 hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX;
ganlikun 0:13413ea9a877 4537 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 4538 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 4539
ganlikun 0:13413ea9a877 4540 /* Disable EVT, BUF and ERR interrupt */
ganlikun 0:13413ea9a877 4541 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
ganlikun 0:13413ea9a877 4542
ganlikun 0:13413ea9a877 4543 /* Clear AF flag */
ganlikun 0:13413ea9a877 4544 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
ganlikun 0:13413ea9a877 4545
ganlikun 0:13413ea9a877 4546 /* Disable Acknowledge */
ganlikun 0:13413ea9a877 4547 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 4548
ganlikun 0:13413ea9a877 4549 HAL_I2C_SlaveTxCpltCallback(hi2c);
ganlikun 0:13413ea9a877 4550 }
ganlikun 0:13413ea9a877 4551 else
ganlikun 0:13413ea9a877 4552 {
ganlikun 0:13413ea9a877 4553 /* Clear AF flag only */
ganlikun 0:13413ea9a877 4554 /* State Listen, but XferOptions == FIRST or NEXT */
ganlikun 0:13413ea9a877 4555 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
ganlikun 0:13413ea9a877 4556 }
ganlikun 0:13413ea9a877 4557
ganlikun 0:13413ea9a877 4558 return HAL_OK;
ganlikun 0:13413ea9a877 4559 }
ganlikun 0:13413ea9a877 4560
ganlikun 0:13413ea9a877 4561 /**
ganlikun 0:13413ea9a877 4562 * @brief I2C interrupts error process
ganlikun 0:13413ea9a877 4563 * @param hi2c I2C handle.
ganlikun 0:13413ea9a877 4564 * @retval None
ganlikun 0:13413ea9a877 4565 */
ganlikun 0:13413ea9a877 4566 static void I2C_ITError(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 4567 {
ganlikun 0:13413ea9a877 4568 /* Declaration of temporary variable to prevent undefined behavior of volatile usage */
ganlikun 0:13413ea9a877 4569 uint32_t CurrentState = hi2c->State;
ganlikun 0:13413ea9a877 4570
ganlikun 0:13413ea9a877 4571 if((CurrentState == HAL_I2C_STATE_BUSY_TX_LISTEN) || (CurrentState == HAL_I2C_STATE_BUSY_RX_LISTEN))
ganlikun 0:13413ea9a877 4572 {
ganlikun 0:13413ea9a877 4573 /* keep HAL_I2C_STATE_LISTEN */
ganlikun 0:13413ea9a877 4574 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 4575 hi2c->State = HAL_I2C_STATE_LISTEN;
ganlikun 0:13413ea9a877 4576 }
ganlikun 0:13413ea9a877 4577 else
ganlikun 0:13413ea9a877 4578 {
ganlikun 0:13413ea9a877 4579 /* If state is an abort treatment on going, don't change state */
ganlikun 0:13413ea9a877 4580 /* This change will be do later */
ganlikun 0:13413ea9a877 4581 if((hi2c->State != HAL_I2C_STATE_ABORT) && ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) != I2C_CR2_DMAEN))
ganlikun 0:13413ea9a877 4582 {
ganlikun 0:13413ea9a877 4583 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 4584 }
ganlikun 0:13413ea9a877 4585 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 4586 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 4587 }
ganlikun 0:13413ea9a877 4588
ganlikun 0:13413ea9a877 4589 /* Disable Pos bit in I2C CR1 when error occurred in Master/Mem Receive IT Process */
ganlikun 0:13413ea9a877 4590 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
ganlikun 0:13413ea9a877 4591
ganlikun 0:13413ea9a877 4592 /* Abort DMA transfer */
ganlikun 0:13413ea9a877 4593 if((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN)
ganlikun 0:13413ea9a877 4594 {
ganlikun 0:13413ea9a877 4595 hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN;
ganlikun 0:13413ea9a877 4596
ganlikun 0:13413ea9a877 4597 if(hi2c->hdmatx->State != HAL_DMA_STATE_READY)
ganlikun 0:13413ea9a877 4598 {
ganlikun 0:13413ea9a877 4599 /* Set the DMA Abort callback :
ganlikun 0:13413ea9a877 4600 will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */
ganlikun 0:13413ea9a877 4601 hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort;
ganlikun 0:13413ea9a877 4602
ganlikun 0:13413ea9a877 4603 if(HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK)
ganlikun 0:13413ea9a877 4604 {
ganlikun 0:13413ea9a877 4605 /* Disable I2C peripheral to prevent dummy data in buffer */
ganlikun 0:13413ea9a877 4606 __HAL_I2C_DISABLE(hi2c);
ganlikun 0:13413ea9a877 4607
ganlikun 0:13413ea9a877 4608 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 4609
ganlikun 0:13413ea9a877 4610 /* Call Directly XferAbortCallback function in case of error */
ganlikun 0:13413ea9a877 4611 hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx);
ganlikun 0:13413ea9a877 4612 }
ganlikun 0:13413ea9a877 4613 }
ganlikun 0:13413ea9a877 4614 else
ganlikun 0:13413ea9a877 4615 {
ganlikun 0:13413ea9a877 4616 /* Set the DMA Abort callback :
ganlikun 0:13413ea9a877 4617 will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */
ganlikun 0:13413ea9a877 4618 hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort;
ganlikun 0:13413ea9a877 4619
ganlikun 0:13413ea9a877 4620 if(HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK)
ganlikun 0:13413ea9a877 4621 {
ganlikun 0:13413ea9a877 4622 /* Store Last receive data if any */
ganlikun 0:13413ea9a877 4623 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET)
ganlikun 0:13413ea9a877 4624 {
ganlikun 0:13413ea9a877 4625 /* Read data from DR */
ganlikun 0:13413ea9a877 4626 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 4627 }
ganlikun 0:13413ea9a877 4628
ganlikun 0:13413ea9a877 4629 /* Disable I2C peripheral to prevent dummy data in buffer */
ganlikun 0:13413ea9a877 4630 __HAL_I2C_DISABLE(hi2c);
ganlikun 0:13413ea9a877 4631
ganlikun 0:13413ea9a877 4632 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 4633
ganlikun 0:13413ea9a877 4634 /* Call Directly hi2c->hdmarx->XferAbortCallback function in case of error */
ganlikun 0:13413ea9a877 4635 hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx);
ganlikun 0:13413ea9a877 4636 }
ganlikun 0:13413ea9a877 4637 }
ganlikun 0:13413ea9a877 4638 }
ganlikun 0:13413ea9a877 4639 else if(hi2c->State == HAL_I2C_STATE_ABORT)
ganlikun 0:13413ea9a877 4640 {
ganlikun 0:13413ea9a877 4641 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 4642 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 4643
ganlikun 0:13413ea9a877 4644 /* Store Last receive data if any */
ganlikun 0:13413ea9a877 4645 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET)
ganlikun 0:13413ea9a877 4646 {
ganlikun 0:13413ea9a877 4647 /* Read data from DR */
ganlikun 0:13413ea9a877 4648 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 4649 }
ganlikun 0:13413ea9a877 4650
ganlikun 0:13413ea9a877 4651 /* Disable I2C peripheral to prevent dummy data in buffer */
ganlikun 0:13413ea9a877 4652 __HAL_I2C_DISABLE(hi2c);
ganlikun 0:13413ea9a877 4653
ganlikun 0:13413ea9a877 4654 /* Call the corresponding callback to inform upper layer of End of Transfer */
ganlikun 0:13413ea9a877 4655 HAL_I2C_AbortCpltCallback(hi2c);
ganlikun 0:13413ea9a877 4656 }
ganlikun 0:13413ea9a877 4657 else
ganlikun 0:13413ea9a877 4658 {
ganlikun 0:13413ea9a877 4659 /* Store Last receive data if any */
ganlikun 0:13413ea9a877 4660 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET)
ganlikun 0:13413ea9a877 4661 {
ganlikun 0:13413ea9a877 4662 /* Read data from DR */
ganlikun 0:13413ea9a877 4663 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
ganlikun 0:13413ea9a877 4664 }
ganlikun 0:13413ea9a877 4665
ganlikun 0:13413ea9a877 4666 /* Call user error callback */
ganlikun 0:13413ea9a877 4667 HAL_I2C_ErrorCallback(hi2c);
ganlikun 0:13413ea9a877 4668 }
ganlikun 0:13413ea9a877 4669 /* STOP Flag is not set after a NACK reception */
ganlikun 0:13413ea9a877 4670 /* So may inform upper layer that listen phase is stopped */
ganlikun 0:13413ea9a877 4671 /* during NACK error treatment */
ganlikun 0:13413ea9a877 4672 if((hi2c->State == HAL_I2C_STATE_LISTEN) && ((hi2c->ErrorCode & HAL_I2C_ERROR_AF) == HAL_I2C_ERROR_AF))
ganlikun 0:13413ea9a877 4673 {
ganlikun 0:13413ea9a877 4674 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
ganlikun 0:13413ea9a877 4675 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 4676 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 4677 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 4678
ganlikun 0:13413ea9a877 4679 /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */
ganlikun 0:13413ea9a877 4680 HAL_I2C_ListenCpltCallback(hi2c);
ganlikun 0:13413ea9a877 4681 }
ganlikun 0:13413ea9a877 4682 }
ganlikun 0:13413ea9a877 4683
ganlikun 0:13413ea9a877 4684 /**
ganlikun 0:13413ea9a877 4685 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 4686 * the configuration information for I2C module
ganlikun 0:13413ea9a877 4687 * @param DevAddress Target device address: The device 7 bits address value
ganlikun 0:13413ea9a877 4688 * in datasheet must be shift at right before call interface
ganlikun 0:13413ea9a877 4689 * @param Timeout Timeout duration
ganlikun 0:13413ea9a877 4690 * @param Tickstart Tick start value
ganlikun 0:13413ea9a877 4691 * @retval HAL status
ganlikun 0:13413ea9a877 4692 */
ganlikun 0:13413ea9a877 4693 static HAL_StatusTypeDef I2C_MasterRequestWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart)
ganlikun 0:13413ea9a877 4694 {
ganlikun 0:13413ea9a877 4695 /* Declaration of temporary variable to prevent undefined behavior of volatile usage */
ganlikun 0:13413ea9a877 4696 uint32_t CurrentXferOptions = hi2c->XferOptions;
ganlikun 0:13413ea9a877 4697
ganlikun 0:13413ea9a877 4698 /* Generate Start condition if first transfer */
ganlikun 0:13413ea9a877 4699 if((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_NO_OPTION_FRAME))
ganlikun 0:13413ea9a877 4700 {
ganlikun 0:13413ea9a877 4701 /* Generate Start */
ganlikun 0:13413ea9a877 4702 hi2c->Instance->CR1 |= I2C_CR1_START;
ganlikun 0:13413ea9a877 4703 }
ganlikun 0:13413ea9a877 4704 else if(hi2c->PreviousState == I2C_STATE_MASTER_BUSY_RX)
ganlikun 0:13413ea9a877 4705 {
ganlikun 0:13413ea9a877 4706 /* Generate ReStart */
ganlikun 0:13413ea9a877 4707 hi2c->Instance->CR1 |= I2C_CR1_START;
ganlikun 0:13413ea9a877 4708 }
ganlikun 0:13413ea9a877 4709
ganlikun 0:13413ea9a877 4710 /* Wait until SB flag is set */
ganlikun 0:13413ea9a877 4711 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 4712 {
ganlikun 0:13413ea9a877 4713 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 4714 }
ganlikun 0:13413ea9a877 4715
ganlikun 0:13413ea9a877 4716 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
ganlikun 0:13413ea9a877 4717 {
ganlikun 0:13413ea9a877 4718 /* Send slave address */
ganlikun 0:13413ea9a877 4719 hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);
ganlikun 0:13413ea9a877 4720 }
ganlikun 0:13413ea9a877 4721 else
ganlikun 0:13413ea9a877 4722 {
ganlikun 0:13413ea9a877 4723 /* Send header of slave address */
ganlikun 0:13413ea9a877 4724 hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(DevAddress);
ganlikun 0:13413ea9a877 4725
ganlikun 0:13413ea9a877 4726 /* Wait until ADD10 flag is set */
ganlikun 0:13413ea9a877 4727 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADD10, Timeout, Tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 4728 {
ganlikun 0:13413ea9a877 4729 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
ganlikun 0:13413ea9a877 4730 {
ganlikun 0:13413ea9a877 4731 return HAL_ERROR;
ganlikun 0:13413ea9a877 4732 }
ganlikun 0:13413ea9a877 4733 else
ganlikun 0:13413ea9a877 4734 {
ganlikun 0:13413ea9a877 4735 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 4736 }
ganlikun 0:13413ea9a877 4737 }
ganlikun 0:13413ea9a877 4738
ganlikun 0:13413ea9a877 4739 /* Send slave address */
ganlikun 0:13413ea9a877 4740 hi2c->Instance->DR = I2C_10BIT_ADDRESS(DevAddress);
ganlikun 0:13413ea9a877 4741 }
ganlikun 0:13413ea9a877 4742
ganlikun 0:13413ea9a877 4743 /* Wait until ADDR flag is set */
ganlikun 0:13413ea9a877 4744 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 4745 {
ganlikun 0:13413ea9a877 4746 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
ganlikun 0:13413ea9a877 4747 {
ganlikun 0:13413ea9a877 4748 return HAL_ERROR;
ganlikun 0:13413ea9a877 4749 }
ganlikun 0:13413ea9a877 4750 else
ganlikun 0:13413ea9a877 4751 {
ganlikun 0:13413ea9a877 4752 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 4753 }
ganlikun 0:13413ea9a877 4754 }
ganlikun 0:13413ea9a877 4755
ganlikun 0:13413ea9a877 4756 return HAL_OK;
ganlikun 0:13413ea9a877 4757 }
ganlikun 0:13413ea9a877 4758
ganlikun 0:13413ea9a877 4759 /**
ganlikun 0:13413ea9a877 4760 * @brief Master sends target device address for read request.
ganlikun 0:13413ea9a877 4761 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 4762 * the configuration information for I2C module
ganlikun 0:13413ea9a877 4763 * @param DevAddress Target device address: The device 7 bits address value
ganlikun 0:13413ea9a877 4764 * in datasheet must be shift at right before call interface
ganlikun 0:13413ea9a877 4765 * @param Timeout Timeout duration
ganlikun 0:13413ea9a877 4766 * @param Tickstart Tick start value
ganlikun 0:13413ea9a877 4767 * @retval HAL status
ganlikun 0:13413ea9a877 4768 */
ganlikun 0:13413ea9a877 4769 static HAL_StatusTypeDef I2C_MasterRequestRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart)
ganlikun 0:13413ea9a877 4770 {
ganlikun 0:13413ea9a877 4771 /* Declaration of temporary variable to prevent undefined behavior of volatile usage */
ganlikun 0:13413ea9a877 4772 uint32_t CurrentXferOptions = hi2c->XferOptions;
ganlikun 0:13413ea9a877 4773
ganlikun 0:13413ea9a877 4774 /* Enable Acknowledge */
ganlikun 0:13413ea9a877 4775 hi2c->Instance->CR1 |= I2C_CR1_ACK;
ganlikun 0:13413ea9a877 4776
ganlikun 0:13413ea9a877 4777 /* Generate Start condition if first transfer */
ganlikun 0:13413ea9a877 4778 if((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_NO_OPTION_FRAME))
ganlikun 0:13413ea9a877 4779 {
ganlikun 0:13413ea9a877 4780 /* Generate Start */
ganlikun 0:13413ea9a877 4781 hi2c->Instance->CR1 |= I2C_CR1_START;
ganlikun 0:13413ea9a877 4782 }
ganlikun 0:13413ea9a877 4783 else if(hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX)
ganlikun 0:13413ea9a877 4784 {
ganlikun 0:13413ea9a877 4785 /* Generate ReStart */
ganlikun 0:13413ea9a877 4786 hi2c->Instance->CR1 |= I2C_CR1_START;
ganlikun 0:13413ea9a877 4787 }
ganlikun 0:13413ea9a877 4788
ganlikun 0:13413ea9a877 4789 /* Wait until SB flag is set */
ganlikun 0:13413ea9a877 4790 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 4791 {
ganlikun 0:13413ea9a877 4792 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 4793 }
ganlikun 0:13413ea9a877 4794
ganlikun 0:13413ea9a877 4795 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
ganlikun 0:13413ea9a877 4796 {
ganlikun 0:13413ea9a877 4797 /* Send slave address */
ganlikun 0:13413ea9a877 4798 hi2c->Instance->DR = I2C_7BIT_ADD_READ(DevAddress);
ganlikun 0:13413ea9a877 4799 }
ganlikun 0:13413ea9a877 4800 else
ganlikun 0:13413ea9a877 4801 {
ganlikun 0:13413ea9a877 4802 /* Send header of slave address */
ganlikun 0:13413ea9a877 4803 hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(DevAddress);
ganlikun 0:13413ea9a877 4804
ganlikun 0:13413ea9a877 4805 /* Wait until ADD10 flag is set */
ganlikun 0:13413ea9a877 4806 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADD10, Timeout, Tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 4807 {
ganlikun 0:13413ea9a877 4808 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
ganlikun 0:13413ea9a877 4809 {
ganlikun 0:13413ea9a877 4810 return HAL_ERROR;
ganlikun 0:13413ea9a877 4811 }
ganlikun 0:13413ea9a877 4812 else
ganlikun 0:13413ea9a877 4813 {
ganlikun 0:13413ea9a877 4814 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 4815 }
ganlikun 0:13413ea9a877 4816 }
ganlikun 0:13413ea9a877 4817
ganlikun 0:13413ea9a877 4818 /* Send slave address */
ganlikun 0:13413ea9a877 4819 hi2c->Instance->DR = I2C_10BIT_ADDRESS(DevAddress);
ganlikun 0:13413ea9a877 4820
ganlikun 0:13413ea9a877 4821 /* Wait until ADDR flag is set */
ganlikun 0:13413ea9a877 4822 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 4823 {
ganlikun 0:13413ea9a877 4824 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
ganlikun 0:13413ea9a877 4825 {
ganlikun 0:13413ea9a877 4826 return HAL_ERROR;
ganlikun 0:13413ea9a877 4827 }
ganlikun 0:13413ea9a877 4828 else
ganlikun 0:13413ea9a877 4829 {
ganlikun 0:13413ea9a877 4830 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 4831 }
ganlikun 0:13413ea9a877 4832 }
ganlikun 0:13413ea9a877 4833
ganlikun 0:13413ea9a877 4834 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 4835 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 4836
ganlikun 0:13413ea9a877 4837 /* Generate Restart */
ganlikun 0:13413ea9a877 4838 hi2c->Instance->CR1 |= I2C_CR1_START;
ganlikun 0:13413ea9a877 4839
ganlikun 0:13413ea9a877 4840 /* Wait until SB flag is set */
ganlikun 0:13413ea9a877 4841 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 4842 {
ganlikun 0:13413ea9a877 4843 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 4844 }
ganlikun 0:13413ea9a877 4845
ganlikun 0:13413ea9a877 4846 /* Send header of slave address */
ganlikun 0:13413ea9a877 4847 hi2c->Instance->DR = I2C_10BIT_HEADER_READ(DevAddress);
ganlikun 0:13413ea9a877 4848 }
ganlikun 0:13413ea9a877 4849
ganlikun 0:13413ea9a877 4850 /* Wait until ADDR flag is set */
ganlikun 0:13413ea9a877 4851 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 4852 {
ganlikun 0:13413ea9a877 4853 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
ganlikun 0:13413ea9a877 4854 {
ganlikun 0:13413ea9a877 4855 return HAL_ERROR;
ganlikun 0:13413ea9a877 4856 }
ganlikun 0:13413ea9a877 4857 else
ganlikun 0:13413ea9a877 4858 {
ganlikun 0:13413ea9a877 4859 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 4860 }
ganlikun 0:13413ea9a877 4861 }
ganlikun 0:13413ea9a877 4862
ganlikun 0:13413ea9a877 4863 return HAL_OK;
ganlikun 0:13413ea9a877 4864 }
ganlikun 0:13413ea9a877 4865
ganlikun 0:13413ea9a877 4866 /**
ganlikun 0:13413ea9a877 4867 * @brief Master sends target device address followed by internal memory address for write request.
ganlikun 0:13413ea9a877 4868 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 4869 * the configuration information for I2C module
ganlikun 0:13413ea9a877 4870 * @param DevAddress Target device address
ganlikun 0:13413ea9a877 4871 * @param MemAddress Internal memory address
ganlikun 0:13413ea9a877 4872 * @param MemAddSize Size of internal memory address
ganlikun 0:13413ea9a877 4873 * @param Timeout Timeout duration
ganlikun 0:13413ea9a877 4874 * @param Tickstart Tick start value
ganlikun 0:13413ea9a877 4875 * @retval HAL status
ganlikun 0:13413ea9a877 4876 */
ganlikun 0:13413ea9a877 4877 static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart)
ganlikun 0:13413ea9a877 4878 {
ganlikun 0:13413ea9a877 4879 /* Generate Start */
ganlikun 0:13413ea9a877 4880 hi2c->Instance->CR1 |= I2C_CR1_START;
ganlikun 0:13413ea9a877 4881
ganlikun 0:13413ea9a877 4882 /* Wait until SB flag is set */
ganlikun 0:13413ea9a877 4883 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 4884 {
ganlikun 0:13413ea9a877 4885 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 4886 }
ganlikun 0:13413ea9a877 4887
ganlikun 0:13413ea9a877 4888 /* Send slave address */
ganlikun 0:13413ea9a877 4889 hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);
ganlikun 0:13413ea9a877 4890
ganlikun 0:13413ea9a877 4891 /* Wait until ADDR flag is set */
ganlikun 0:13413ea9a877 4892 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 4893 {
ganlikun 0:13413ea9a877 4894 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
ganlikun 0:13413ea9a877 4895 {
ganlikun 0:13413ea9a877 4896 return HAL_ERROR;
ganlikun 0:13413ea9a877 4897 }
ganlikun 0:13413ea9a877 4898 else
ganlikun 0:13413ea9a877 4899 {
ganlikun 0:13413ea9a877 4900 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 4901 }
ganlikun 0:13413ea9a877 4902 }
ganlikun 0:13413ea9a877 4903
ganlikun 0:13413ea9a877 4904 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 4905 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 4906
ganlikun 0:13413ea9a877 4907 /* Wait until TXE flag is set */
ganlikun 0:13413ea9a877 4908 if(I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 4909 {
ganlikun 0:13413ea9a877 4910 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
ganlikun 0:13413ea9a877 4911 {
ganlikun 0:13413ea9a877 4912 /* Generate Stop */
ganlikun 0:13413ea9a877 4913 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 4914 return HAL_ERROR;
ganlikun 0:13413ea9a877 4915 }
ganlikun 0:13413ea9a877 4916 else
ganlikun 0:13413ea9a877 4917 {
ganlikun 0:13413ea9a877 4918 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 4919 }
ganlikun 0:13413ea9a877 4920 }
ganlikun 0:13413ea9a877 4921
ganlikun 0:13413ea9a877 4922 /* If Memory address size is 8Bit */
ganlikun 0:13413ea9a877 4923 if(MemAddSize == I2C_MEMADD_SIZE_8BIT)
ganlikun 0:13413ea9a877 4924 {
ganlikun 0:13413ea9a877 4925 /* Send Memory Address */
ganlikun 0:13413ea9a877 4926 hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress);
ganlikun 0:13413ea9a877 4927 }
ganlikun 0:13413ea9a877 4928 /* If Memory address size is 16Bit */
ganlikun 0:13413ea9a877 4929 else
ganlikun 0:13413ea9a877 4930 {
ganlikun 0:13413ea9a877 4931 /* Send MSB of Memory Address */
ganlikun 0:13413ea9a877 4932 hi2c->Instance->DR = I2C_MEM_ADD_MSB(MemAddress);
ganlikun 0:13413ea9a877 4933
ganlikun 0:13413ea9a877 4934 /* Wait until TXE flag is set */
ganlikun 0:13413ea9a877 4935 if(I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 4936 {
ganlikun 0:13413ea9a877 4937 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
ganlikun 0:13413ea9a877 4938 {
ganlikun 0:13413ea9a877 4939 /* Generate Stop */
ganlikun 0:13413ea9a877 4940 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 4941 return HAL_ERROR;
ganlikun 0:13413ea9a877 4942 }
ganlikun 0:13413ea9a877 4943 else
ganlikun 0:13413ea9a877 4944 {
ganlikun 0:13413ea9a877 4945 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 4946 }
ganlikun 0:13413ea9a877 4947 }
ganlikun 0:13413ea9a877 4948
ganlikun 0:13413ea9a877 4949 /* Send LSB of Memory Address */
ganlikun 0:13413ea9a877 4950 hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress);
ganlikun 0:13413ea9a877 4951 }
ganlikun 0:13413ea9a877 4952
ganlikun 0:13413ea9a877 4953 return HAL_OK;
ganlikun 0:13413ea9a877 4954 }
ganlikun 0:13413ea9a877 4955
ganlikun 0:13413ea9a877 4956 /**
ganlikun 0:13413ea9a877 4957 * @brief Master sends target device address followed by internal memory address for read request.
ganlikun 0:13413ea9a877 4958 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 4959 * the configuration information for I2C module
ganlikun 0:13413ea9a877 4960 * @param DevAddress Target device address
ganlikun 0:13413ea9a877 4961 * @param MemAddress Internal memory address
ganlikun 0:13413ea9a877 4962 * @param MemAddSize Size of internal memory address
ganlikun 0:13413ea9a877 4963 * @param Timeout Timeout duration
ganlikun 0:13413ea9a877 4964 * @param Tickstart Tick start value
ganlikun 0:13413ea9a877 4965 * @retval HAL status
ganlikun 0:13413ea9a877 4966 */
ganlikun 0:13413ea9a877 4967 static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart)
ganlikun 0:13413ea9a877 4968 {
ganlikun 0:13413ea9a877 4969 /* Enable Acknowledge */
ganlikun 0:13413ea9a877 4970 hi2c->Instance->CR1 |= I2C_CR1_ACK;
ganlikun 0:13413ea9a877 4971
ganlikun 0:13413ea9a877 4972 /* Generate Start */
ganlikun 0:13413ea9a877 4973 hi2c->Instance->CR1 |= I2C_CR1_START;
ganlikun 0:13413ea9a877 4974
ganlikun 0:13413ea9a877 4975 /* Wait until SB flag is set */
ganlikun 0:13413ea9a877 4976 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 4977 {
ganlikun 0:13413ea9a877 4978 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 4979 }
ganlikun 0:13413ea9a877 4980
ganlikun 0:13413ea9a877 4981 /* Send slave address */
ganlikun 0:13413ea9a877 4982 hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);
ganlikun 0:13413ea9a877 4983
ganlikun 0:13413ea9a877 4984 /* Wait until ADDR flag is set */
ganlikun 0:13413ea9a877 4985 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 4986 {
ganlikun 0:13413ea9a877 4987 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
ganlikun 0:13413ea9a877 4988 {
ganlikun 0:13413ea9a877 4989 return HAL_ERROR;
ganlikun 0:13413ea9a877 4990 }
ganlikun 0:13413ea9a877 4991 else
ganlikun 0:13413ea9a877 4992 {
ganlikun 0:13413ea9a877 4993 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 4994 }
ganlikun 0:13413ea9a877 4995 }
ganlikun 0:13413ea9a877 4996
ganlikun 0:13413ea9a877 4997 /* Clear ADDR flag */
ganlikun 0:13413ea9a877 4998 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
ganlikun 0:13413ea9a877 4999
ganlikun 0:13413ea9a877 5000 /* Wait until TXE flag is set */
ganlikun 0:13413ea9a877 5001 if(I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 5002 {
ganlikun 0:13413ea9a877 5003 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
ganlikun 0:13413ea9a877 5004 {
ganlikun 0:13413ea9a877 5005 /* Generate Stop */
ganlikun 0:13413ea9a877 5006 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 5007 return HAL_ERROR;
ganlikun 0:13413ea9a877 5008 }
ganlikun 0:13413ea9a877 5009 else
ganlikun 0:13413ea9a877 5010 {
ganlikun 0:13413ea9a877 5011 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 5012 }
ganlikun 0:13413ea9a877 5013 }
ganlikun 0:13413ea9a877 5014
ganlikun 0:13413ea9a877 5015 /* If Memory address size is 8Bit */
ganlikun 0:13413ea9a877 5016 if(MemAddSize == I2C_MEMADD_SIZE_8BIT)
ganlikun 0:13413ea9a877 5017 {
ganlikun 0:13413ea9a877 5018 /* Send Memory Address */
ganlikun 0:13413ea9a877 5019 hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress);
ganlikun 0:13413ea9a877 5020 }
ganlikun 0:13413ea9a877 5021 /* If Memory address size is 16Bit */
ganlikun 0:13413ea9a877 5022 else
ganlikun 0:13413ea9a877 5023 {
ganlikun 0:13413ea9a877 5024 /* Send MSB of Memory Address */
ganlikun 0:13413ea9a877 5025 hi2c->Instance->DR = I2C_MEM_ADD_MSB(MemAddress);
ganlikun 0:13413ea9a877 5026
ganlikun 0:13413ea9a877 5027 /* Wait until TXE flag is set */
ganlikun 0:13413ea9a877 5028 if(I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 5029 {
ganlikun 0:13413ea9a877 5030 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
ganlikun 0:13413ea9a877 5031 {
ganlikun 0:13413ea9a877 5032 /* Generate Stop */
ganlikun 0:13413ea9a877 5033 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 5034 return HAL_ERROR;
ganlikun 0:13413ea9a877 5035 }
ganlikun 0:13413ea9a877 5036 else
ganlikun 0:13413ea9a877 5037 {
ganlikun 0:13413ea9a877 5038 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 5039 }
ganlikun 0:13413ea9a877 5040 }
ganlikun 0:13413ea9a877 5041
ganlikun 0:13413ea9a877 5042 /* Send LSB of Memory Address */
ganlikun 0:13413ea9a877 5043 hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress);
ganlikun 0:13413ea9a877 5044 }
ganlikun 0:13413ea9a877 5045
ganlikun 0:13413ea9a877 5046 /* Wait until TXE flag is set */
ganlikun 0:13413ea9a877 5047 if(I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 5048 {
ganlikun 0:13413ea9a877 5049 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
ganlikun 0:13413ea9a877 5050 {
ganlikun 0:13413ea9a877 5051 /* Generate Stop */
ganlikun 0:13413ea9a877 5052 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 5053 return HAL_ERROR;
ganlikun 0:13413ea9a877 5054 }
ganlikun 0:13413ea9a877 5055 else
ganlikun 0:13413ea9a877 5056 {
ganlikun 0:13413ea9a877 5057 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 5058 }
ganlikun 0:13413ea9a877 5059 }
ganlikun 0:13413ea9a877 5060
ganlikun 0:13413ea9a877 5061 /* Generate Restart */
ganlikun 0:13413ea9a877 5062 hi2c->Instance->CR1 |= I2C_CR1_START;
ganlikun 0:13413ea9a877 5063
ganlikun 0:13413ea9a877 5064 /* Wait until SB flag is set */
ganlikun 0:13413ea9a877 5065 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 5066 {
ganlikun 0:13413ea9a877 5067 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 5068 }
ganlikun 0:13413ea9a877 5069
ganlikun 0:13413ea9a877 5070 /* Send slave address */
ganlikun 0:13413ea9a877 5071 hi2c->Instance->DR = I2C_7BIT_ADD_READ(DevAddress);
ganlikun 0:13413ea9a877 5072
ganlikun 0:13413ea9a877 5073 /* Wait until ADDR flag is set */
ganlikun 0:13413ea9a877 5074 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK)
ganlikun 0:13413ea9a877 5075 {
ganlikun 0:13413ea9a877 5076 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
ganlikun 0:13413ea9a877 5077 {
ganlikun 0:13413ea9a877 5078 return HAL_ERROR;
ganlikun 0:13413ea9a877 5079 }
ganlikun 0:13413ea9a877 5080 else
ganlikun 0:13413ea9a877 5081 {
ganlikun 0:13413ea9a877 5082 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 5083 }
ganlikun 0:13413ea9a877 5084 }
ganlikun 0:13413ea9a877 5085
ganlikun 0:13413ea9a877 5086 return HAL_OK;
ganlikun 0:13413ea9a877 5087 }
ganlikun 0:13413ea9a877 5088
ganlikun 0:13413ea9a877 5089 /**
ganlikun 0:13413ea9a877 5090 * @brief DMA I2C process complete callback.
ganlikun 0:13413ea9a877 5091 * @param hdma DMA handle
ganlikun 0:13413ea9a877 5092 * @retval None
ganlikun 0:13413ea9a877 5093 */
ganlikun 0:13413ea9a877 5094 static void I2C_DMAXferCplt(DMA_HandleTypeDef *hdma)
ganlikun 0:13413ea9a877 5095 {
ganlikun 0:13413ea9a877 5096 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
ganlikun 0:13413ea9a877 5097
ganlikun 0:13413ea9a877 5098 /* Declaration of temporary variable to prevent undefined behavior of volatile usage */
ganlikun 0:13413ea9a877 5099 uint32_t CurrentState = hi2c->State;
ganlikun 0:13413ea9a877 5100 uint32_t CurrentMode = hi2c->Mode;
ganlikun 0:13413ea9a877 5101
ganlikun 0:13413ea9a877 5102 if((CurrentState == HAL_I2C_STATE_BUSY_TX) || ((CurrentState == HAL_I2C_STATE_BUSY_RX) && (CurrentMode == HAL_I2C_MODE_SLAVE)))
ganlikun 0:13413ea9a877 5103 {
ganlikun 0:13413ea9a877 5104 /* Disable DMA Request */
ganlikun 0:13413ea9a877 5105 hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN;
ganlikun 0:13413ea9a877 5106
ganlikun 0:13413ea9a877 5107 hi2c->XferCount = 0U;
ganlikun 0:13413ea9a877 5108
ganlikun 0:13413ea9a877 5109 /* Enable EVT and ERR interrupt */
ganlikun 0:13413ea9a877 5110 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
ganlikun 0:13413ea9a877 5111 }
ganlikun 0:13413ea9a877 5112 else
ganlikun 0:13413ea9a877 5113 {
ganlikun 0:13413ea9a877 5114 /* Disable Acknowledge */
ganlikun 0:13413ea9a877 5115 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 5116
ganlikun 0:13413ea9a877 5117 /* Generate Stop */
ganlikun 0:13413ea9a877 5118 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 5119
ganlikun 0:13413ea9a877 5120 /* Disable Last DMA */
ganlikun 0:13413ea9a877 5121 hi2c->Instance->CR2 &= ~I2C_CR2_LAST;
ganlikun 0:13413ea9a877 5122
ganlikun 0:13413ea9a877 5123 /* Disable DMA Request */
ganlikun 0:13413ea9a877 5124 hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN;
ganlikun 0:13413ea9a877 5125
ganlikun 0:13413ea9a877 5126 hi2c->XferCount = 0U;
ganlikun 0:13413ea9a877 5127
ganlikun 0:13413ea9a877 5128 /* Check if Errors has been detected during transfer */
ganlikun 0:13413ea9a877 5129 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
ganlikun 0:13413ea9a877 5130 {
ganlikun 0:13413ea9a877 5131 HAL_I2C_ErrorCallback(hi2c);
ganlikun 0:13413ea9a877 5132 }
ganlikun 0:13413ea9a877 5133 else
ganlikun 0:13413ea9a877 5134 {
ganlikun 0:13413ea9a877 5135 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 5136
ganlikun 0:13413ea9a877 5137 if(hi2c->Mode == HAL_I2C_MODE_MEM)
ganlikun 0:13413ea9a877 5138 {
ganlikun 0:13413ea9a877 5139 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 5140
ganlikun 0:13413ea9a877 5141 HAL_I2C_MemRxCpltCallback(hi2c);
ganlikun 0:13413ea9a877 5142 }
ganlikun 0:13413ea9a877 5143 else
ganlikun 0:13413ea9a877 5144 {
ganlikun 0:13413ea9a877 5145 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 5146
ganlikun 0:13413ea9a877 5147 HAL_I2C_MasterRxCpltCallback(hi2c);
ganlikun 0:13413ea9a877 5148 }
ganlikun 0:13413ea9a877 5149 }
ganlikun 0:13413ea9a877 5150 }
ganlikun 0:13413ea9a877 5151 }
ganlikun 0:13413ea9a877 5152
ganlikun 0:13413ea9a877 5153 /**
ganlikun 0:13413ea9a877 5154 * @brief DMA I2C communication error callback.
ganlikun 0:13413ea9a877 5155 * @param hdma DMA handle
ganlikun 0:13413ea9a877 5156 * @retval None
ganlikun 0:13413ea9a877 5157 */
ganlikun 0:13413ea9a877 5158 static void I2C_DMAError(DMA_HandleTypeDef *hdma)
ganlikun 0:13413ea9a877 5159 {
ganlikun 0:13413ea9a877 5160 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
ganlikun 0:13413ea9a877 5161
ganlikun 0:13413ea9a877 5162 /* Ignore DMA FIFO error */
ganlikun 0:13413ea9a877 5163 if(HAL_DMA_GetError(hdma) != HAL_DMA_ERROR_FE)
ganlikun 0:13413ea9a877 5164 {
ganlikun 0:13413ea9a877 5165 /* Disable Acknowledge */
ganlikun 0:13413ea9a877 5166 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 5167
ganlikun 0:13413ea9a877 5168 hi2c->XferCount = 0U;
ganlikun 0:13413ea9a877 5169
ganlikun 0:13413ea9a877 5170 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 5171 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 5172
ganlikun 0:13413ea9a877 5173 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
ganlikun 0:13413ea9a877 5174
ganlikun 0:13413ea9a877 5175 HAL_I2C_ErrorCallback(hi2c);
ganlikun 0:13413ea9a877 5176 }
ganlikun 0:13413ea9a877 5177 }
ganlikun 0:13413ea9a877 5178
ganlikun 0:13413ea9a877 5179 /**
ganlikun 0:13413ea9a877 5180 * @brief DMA I2C communication abort callback
ganlikun 0:13413ea9a877 5181 * (To be called at end of DMA Abort procedure).
ganlikun 0:13413ea9a877 5182 * @param hdma: DMA handle.
ganlikun 0:13413ea9a877 5183 * @retval None
ganlikun 0:13413ea9a877 5184 */
ganlikun 0:13413ea9a877 5185 static void I2C_DMAAbort(DMA_HandleTypeDef *hdma)
ganlikun 0:13413ea9a877 5186 {
ganlikun 0:13413ea9a877 5187 I2C_HandleTypeDef* hi2c = ( I2C_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
ganlikun 0:13413ea9a877 5188
ganlikun 0:13413ea9a877 5189 /* Disable Acknowledge */
ganlikun 0:13413ea9a877 5190 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
ganlikun 0:13413ea9a877 5191
ganlikun 0:13413ea9a877 5192 hi2c->XferCount = 0U;
ganlikun 0:13413ea9a877 5193
ganlikun 0:13413ea9a877 5194 /* Reset XferAbortCallback */
ganlikun 0:13413ea9a877 5195 hi2c->hdmatx->XferAbortCallback = NULL;
ganlikun 0:13413ea9a877 5196 hi2c->hdmarx->XferAbortCallback = NULL;
ganlikun 0:13413ea9a877 5197
ganlikun 0:13413ea9a877 5198 /* Check if come from abort from user */
ganlikun 0:13413ea9a877 5199 if(hi2c->State == HAL_I2C_STATE_ABORT)
ganlikun 0:13413ea9a877 5200 {
ganlikun 0:13413ea9a877 5201 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 5202 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 5203 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 5204
ganlikun 0:13413ea9a877 5205 /* Disable I2C peripheral to prevent dummy data in buffer */
ganlikun 0:13413ea9a877 5206 __HAL_I2C_DISABLE(hi2c);
ganlikun 0:13413ea9a877 5207
ganlikun 0:13413ea9a877 5208 /* Call the corresponding callback to inform upper layer of End of Transfer */
ganlikun 0:13413ea9a877 5209 HAL_I2C_AbortCpltCallback(hi2c);
ganlikun 0:13413ea9a877 5210 }
ganlikun 0:13413ea9a877 5211 else
ganlikun 0:13413ea9a877 5212 {
ganlikun 0:13413ea9a877 5213 hi2c->State = HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 5214 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 5215
ganlikun 0:13413ea9a877 5216 /* Disable I2C peripheral to prevent dummy data in buffer */
ganlikun 0:13413ea9a877 5217 __HAL_I2C_DISABLE(hi2c);
ganlikun 0:13413ea9a877 5218
ganlikun 0:13413ea9a877 5219 /* Call the corresponding callback to inform upper layer of End of Transfer */
ganlikun 0:13413ea9a877 5220 HAL_I2C_ErrorCallback(hi2c);
ganlikun 0:13413ea9a877 5221 }
ganlikun 0:13413ea9a877 5222 }
ganlikun 0:13413ea9a877 5223
ganlikun 0:13413ea9a877 5224 /**
ganlikun 0:13413ea9a877 5225 * @brief This function handles I2C Communication Timeout.
ganlikun 0:13413ea9a877 5226 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 5227 * the configuration information for I2C module
ganlikun 0:13413ea9a877 5228 * @param Flag specifies the I2C flag to check.
ganlikun 0:13413ea9a877 5229 * @param Status The new Flag status (SET or RESET).
ganlikun 0:13413ea9a877 5230 * @param Timeout Timeout duration
ganlikun 0:13413ea9a877 5231 * @param Tickstart Tick start value
ganlikun 0:13413ea9a877 5232 * @retval HAL status
ganlikun 0:13413ea9a877 5233 */
ganlikun 0:13413ea9a877 5234 static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart)
ganlikun 0:13413ea9a877 5235 {
ganlikun 0:13413ea9a877 5236 /* Wait until flag is set */
ganlikun 0:13413ea9a877 5237 while((__HAL_I2C_GET_FLAG(hi2c, Flag) ? SET : RESET) == Status)
ganlikun 0:13413ea9a877 5238 {
ganlikun 0:13413ea9a877 5239 /* Check for the Timeout */
ganlikun 0:13413ea9a877 5240 if(Timeout != HAL_MAX_DELAY)
ganlikun 0:13413ea9a877 5241 {
ganlikun 0:13413ea9a877 5242 if((Timeout == 0U)||((HAL_GetTick() - Tickstart ) > Timeout))
ganlikun 0:13413ea9a877 5243 {
ganlikun 0:13413ea9a877 5244 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 5245 hi2c->State= HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 5246 hi2c->Mode = HAL_I2C_MODE_NONE;
ganlikun 0:13413ea9a877 5247
ganlikun 0:13413ea9a877 5248 /* Process Unlocked */
ganlikun 0:13413ea9a877 5249 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 5250
ganlikun 0:13413ea9a877 5251 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 5252 }
ganlikun 0:13413ea9a877 5253 }
ganlikun 0:13413ea9a877 5254 }
ganlikun 0:13413ea9a877 5255
ganlikun 0:13413ea9a877 5256 return HAL_OK;
ganlikun 0:13413ea9a877 5257 }
ganlikun 0:13413ea9a877 5258
ganlikun 0:13413ea9a877 5259 /**
ganlikun 0:13413ea9a877 5260 * @brief This function handles I2C Communication Timeout for Master addressing phase.
ganlikun 0:13413ea9a877 5261 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 5262 * the configuration information for I2C module
ganlikun 0:13413ea9a877 5263 * @param Flag specifies the I2C flag to check.
ganlikun 0:13413ea9a877 5264 * @param Timeout Timeout duration
ganlikun 0:13413ea9a877 5265 * @param Tickstart Tick start value
ganlikun 0:13413ea9a877 5266 * @retval HAL status
ganlikun 0:13413ea9a877 5267 */
ganlikun 0:13413ea9a877 5268 static HAL_StatusTypeDef I2C_WaitOnMasterAddressFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, uint32_t Timeout, uint32_t Tickstart)
ganlikun 0:13413ea9a877 5269 {
ganlikun 0:13413ea9a877 5270 while(__HAL_I2C_GET_FLAG(hi2c, Flag) == RESET)
ganlikun 0:13413ea9a877 5271 {
ganlikun 0:13413ea9a877 5272 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET)
ganlikun 0:13413ea9a877 5273 {
ganlikun 0:13413ea9a877 5274 /* Generate Stop */
ganlikun 0:13413ea9a877 5275 hi2c->Instance->CR1 |= I2C_CR1_STOP;
ganlikun 0:13413ea9a877 5276
ganlikun 0:13413ea9a877 5277 /* Clear AF Flag */
ganlikun 0:13413ea9a877 5278 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
ganlikun 0:13413ea9a877 5279
ganlikun 0:13413ea9a877 5280 hi2c->ErrorCode = HAL_I2C_ERROR_AF;
ganlikun 0:13413ea9a877 5281 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 5282 hi2c->State= HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 5283
ganlikun 0:13413ea9a877 5284 /* Process Unlocked */
ganlikun 0:13413ea9a877 5285 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 5286
ganlikun 0:13413ea9a877 5287 return HAL_ERROR;
ganlikun 0:13413ea9a877 5288 }
ganlikun 0:13413ea9a877 5289
ganlikun 0:13413ea9a877 5290 /* Check for the Timeout */
ganlikun 0:13413ea9a877 5291 if(Timeout != HAL_MAX_DELAY)
ganlikun 0:13413ea9a877 5292 {
ganlikun 0:13413ea9a877 5293 if((Timeout == 0U)||((HAL_GetTick() - Tickstart ) > Timeout))
ganlikun 0:13413ea9a877 5294 {
ganlikun 0:13413ea9a877 5295 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 5296 hi2c->State= HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 5297
ganlikun 0:13413ea9a877 5298 /* Process Unlocked */
ganlikun 0:13413ea9a877 5299 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 5300
ganlikun 0:13413ea9a877 5301 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 5302 }
ganlikun 0:13413ea9a877 5303 }
ganlikun 0:13413ea9a877 5304 }
ganlikun 0:13413ea9a877 5305 return HAL_OK;
ganlikun 0:13413ea9a877 5306 }
ganlikun 0:13413ea9a877 5307
ganlikun 0:13413ea9a877 5308 /**
ganlikun 0:13413ea9a877 5309 * @brief This function handles I2C Communication Timeout for specific usage of TXE flag.
ganlikun 0:13413ea9a877 5310 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 5311 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 5312 * @param Timeout Timeout duration
ganlikun 0:13413ea9a877 5313 * @param Tickstart Tick start value
ganlikun 0:13413ea9a877 5314 * @retval HAL status
ganlikun 0:13413ea9a877 5315 */
ganlikun 0:13413ea9a877 5316 static HAL_StatusTypeDef I2C_WaitOnTXEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
ganlikun 0:13413ea9a877 5317 {
ganlikun 0:13413ea9a877 5318 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE) == RESET)
ganlikun 0:13413ea9a877 5319 {
ganlikun 0:13413ea9a877 5320 /* Check if a NACK is detected */
ganlikun 0:13413ea9a877 5321 if(I2C_IsAcknowledgeFailed(hi2c) != HAL_OK)
ganlikun 0:13413ea9a877 5322 {
ganlikun 0:13413ea9a877 5323 return HAL_ERROR;
ganlikun 0:13413ea9a877 5324 }
ganlikun 0:13413ea9a877 5325
ganlikun 0:13413ea9a877 5326 /* Check for the Timeout */
ganlikun 0:13413ea9a877 5327 if(Timeout != HAL_MAX_DELAY)
ganlikun 0:13413ea9a877 5328 {
ganlikun 0:13413ea9a877 5329 if((Timeout == 0U) || ((HAL_GetTick()-Tickstart) > Timeout))
ganlikun 0:13413ea9a877 5330 {
ganlikun 0:13413ea9a877 5331 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
ganlikun 0:13413ea9a877 5332 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 5333 hi2c->State= HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 5334
ganlikun 0:13413ea9a877 5335 /* Process Unlocked */
ganlikun 0:13413ea9a877 5336 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 5337
ganlikun 0:13413ea9a877 5338 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 5339 }
ganlikun 0:13413ea9a877 5340 }
ganlikun 0:13413ea9a877 5341 }
ganlikun 0:13413ea9a877 5342 return HAL_OK;
ganlikun 0:13413ea9a877 5343 }
ganlikun 0:13413ea9a877 5344
ganlikun 0:13413ea9a877 5345 /**
ganlikun 0:13413ea9a877 5346 * @brief This function handles I2C Communication Timeout for specific usage of BTF flag.
ganlikun 0:13413ea9a877 5347 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 5348 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 5349 * @param Timeout Timeout duration
ganlikun 0:13413ea9a877 5350 * @param Tickstart Tick start value
ganlikun 0:13413ea9a877 5351 * @retval HAL status
ganlikun 0:13413ea9a877 5352 */
ganlikun 0:13413ea9a877 5353 static HAL_StatusTypeDef I2C_WaitOnBTFFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
ganlikun 0:13413ea9a877 5354 {
ganlikun 0:13413ea9a877 5355 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == RESET)
ganlikun 0:13413ea9a877 5356 {
ganlikun 0:13413ea9a877 5357 /* Check if a NACK is detected */
ganlikun 0:13413ea9a877 5358 if(I2C_IsAcknowledgeFailed(hi2c) != HAL_OK)
ganlikun 0:13413ea9a877 5359 {
ganlikun 0:13413ea9a877 5360 return HAL_ERROR;
ganlikun 0:13413ea9a877 5361 }
ganlikun 0:13413ea9a877 5362
ganlikun 0:13413ea9a877 5363 /* Check for the Timeout */
ganlikun 0:13413ea9a877 5364 if(Timeout != HAL_MAX_DELAY)
ganlikun 0:13413ea9a877 5365 {
ganlikun 0:13413ea9a877 5366 if((Timeout == 0U) || ((HAL_GetTick()-Tickstart) > Timeout))
ganlikun 0:13413ea9a877 5367 {
ganlikun 0:13413ea9a877 5368 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
ganlikun 0:13413ea9a877 5369 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 5370 hi2c->State= HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 5371
ganlikun 0:13413ea9a877 5372 /* Process Unlocked */
ganlikun 0:13413ea9a877 5373 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 5374
ganlikun 0:13413ea9a877 5375 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 5376 }
ganlikun 0:13413ea9a877 5377 }
ganlikun 0:13413ea9a877 5378 }
ganlikun 0:13413ea9a877 5379 return HAL_OK;
ganlikun 0:13413ea9a877 5380 }
ganlikun 0:13413ea9a877 5381
ganlikun 0:13413ea9a877 5382 /**
ganlikun 0:13413ea9a877 5383 * @brief This function handles I2C Communication Timeout for specific usage of STOP flag.
ganlikun 0:13413ea9a877 5384 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 5385 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 5386 * @param Timeout Timeout duration
ganlikun 0:13413ea9a877 5387 * @param Tickstart Tick start value
ganlikun 0:13413ea9a877 5388 * @retval HAL status
ganlikun 0:13413ea9a877 5389 */
ganlikun 0:13413ea9a877 5390 static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
ganlikun 0:13413ea9a877 5391 {
ganlikun 0:13413ea9a877 5392 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET)
ganlikun 0:13413ea9a877 5393 {
ganlikun 0:13413ea9a877 5394 /* Check if a NACK is detected */
ganlikun 0:13413ea9a877 5395 if(I2C_IsAcknowledgeFailed(hi2c) != HAL_OK)
ganlikun 0:13413ea9a877 5396 {
ganlikun 0:13413ea9a877 5397 return HAL_ERROR;
ganlikun 0:13413ea9a877 5398 }
ganlikun 0:13413ea9a877 5399
ganlikun 0:13413ea9a877 5400 /* Check for the Timeout */
ganlikun 0:13413ea9a877 5401 if((Timeout == 0U) || ((HAL_GetTick()-Tickstart) > Timeout))
ganlikun 0:13413ea9a877 5402 {
ganlikun 0:13413ea9a877 5403 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
ganlikun 0:13413ea9a877 5404 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 5405 hi2c->State= HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 5406
ganlikun 0:13413ea9a877 5407 /* Process Unlocked */
ganlikun 0:13413ea9a877 5408 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 5409
ganlikun 0:13413ea9a877 5410 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 5411 }
ganlikun 0:13413ea9a877 5412 }
ganlikun 0:13413ea9a877 5413 return HAL_OK;
ganlikun 0:13413ea9a877 5414 }
ganlikun 0:13413ea9a877 5415
ganlikun 0:13413ea9a877 5416 /**
ganlikun 0:13413ea9a877 5417 * @brief This function handles I2C Communication Timeout for specific usage of RXNE flag.
ganlikun 0:13413ea9a877 5418 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 5419 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 5420 * @param Timeout Timeout duration
ganlikun 0:13413ea9a877 5421 * @param Tickstart Tick start value
ganlikun 0:13413ea9a877 5422 * @retval HAL status
ganlikun 0:13413ea9a877 5423 */
ganlikun 0:13413ea9a877 5424 static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
ganlikun 0:13413ea9a877 5425 {
ganlikun 0:13413ea9a877 5426
ganlikun 0:13413ea9a877 5427 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == RESET)
ganlikun 0:13413ea9a877 5428 {
ganlikun 0:13413ea9a877 5429 /* Check if a STOPF is detected */
ganlikun 0:13413ea9a877 5430 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == SET)
ganlikun 0:13413ea9a877 5431 {
ganlikun 0:13413ea9a877 5432 /* Clear STOP Flag */
ganlikun 0:13413ea9a877 5433 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
ganlikun 0:13413ea9a877 5434
ganlikun 0:13413ea9a877 5435 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
ganlikun 0:13413ea9a877 5436 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 5437 hi2c->State= HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 5438
ganlikun 0:13413ea9a877 5439 /* Process Unlocked */
ganlikun 0:13413ea9a877 5440 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 5441
ganlikun 0:13413ea9a877 5442 return HAL_ERROR;
ganlikun 0:13413ea9a877 5443 }
ganlikun 0:13413ea9a877 5444
ganlikun 0:13413ea9a877 5445 /* Check for the Timeout */
ganlikun 0:13413ea9a877 5446 if((Timeout == 0U) || ((HAL_GetTick()-Tickstart) > Timeout))
ganlikun 0:13413ea9a877 5447 {
ganlikun 0:13413ea9a877 5448 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
ganlikun 0:13413ea9a877 5449 hi2c->State= HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 5450
ganlikun 0:13413ea9a877 5451 /* Process Unlocked */
ganlikun 0:13413ea9a877 5452 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 5453
ganlikun 0:13413ea9a877 5454 return HAL_TIMEOUT;
ganlikun 0:13413ea9a877 5455 }
ganlikun 0:13413ea9a877 5456 }
ganlikun 0:13413ea9a877 5457 return HAL_OK;
ganlikun 0:13413ea9a877 5458 }
ganlikun 0:13413ea9a877 5459
ganlikun 0:13413ea9a877 5460 /**
ganlikun 0:13413ea9a877 5461 * @brief This function handles Acknowledge failed detection during an I2C Communication.
ganlikun 0:13413ea9a877 5462 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
ganlikun 0:13413ea9a877 5463 * the configuration information for the specified I2C.
ganlikun 0:13413ea9a877 5464 * @retval HAL status
ganlikun 0:13413ea9a877 5465 */
ganlikun 0:13413ea9a877 5466 static HAL_StatusTypeDef I2C_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c)
ganlikun 0:13413ea9a877 5467 {
ganlikun 0:13413ea9a877 5468 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET)
ganlikun 0:13413ea9a877 5469 {
ganlikun 0:13413ea9a877 5470 /* Clear NACKF Flag */
ganlikun 0:13413ea9a877 5471 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
ganlikun 0:13413ea9a877 5472
ganlikun 0:13413ea9a877 5473 hi2c->ErrorCode = HAL_I2C_ERROR_AF;
ganlikun 0:13413ea9a877 5474 hi2c->PreviousState = I2C_STATE_NONE;
ganlikun 0:13413ea9a877 5475 hi2c->State= HAL_I2C_STATE_READY;
ganlikun 0:13413ea9a877 5476
ganlikun 0:13413ea9a877 5477 /* Process Unlocked */
ganlikun 0:13413ea9a877 5478 __HAL_UNLOCK(hi2c);
ganlikun 0:13413ea9a877 5479
ganlikun 0:13413ea9a877 5480 return HAL_ERROR;
ganlikun 0:13413ea9a877 5481 }
ganlikun 0:13413ea9a877 5482 return HAL_OK;
ganlikun 0:13413ea9a877 5483 }
ganlikun 0:13413ea9a877 5484 /**
ganlikun 0:13413ea9a877 5485 * @}
ganlikun 0:13413ea9a877 5486 */
ganlikun 0:13413ea9a877 5487
ganlikun 0:13413ea9a877 5488 #endif /* HAL_I2C_MODULE_ENABLED */
ganlikun 0:13413ea9a877 5489
ganlikun 0:13413ea9a877 5490 /**
ganlikun 0:13413ea9a877 5491 * @}
ganlikun 0:13413ea9a877 5492 */
ganlikun 0:13413ea9a877 5493
ganlikun 0:13413ea9a877 5494 /**
ganlikun 0:13413ea9a877 5495 * @}
ganlikun 0:13413ea9a877 5496 */
ganlikun 0:13413ea9a877 5497
ganlikun 0:13413ea9a877 5498 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
ganlikun 0:13413ea9a877 5499