added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
<>
Date:
Fri Sep 02 15:07:44 2016 +0100
Revision:
144:ef7eb2e8f9f7
This updates the lib to the mbed lib v125

Who changed what in which revision?

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