mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
170:19eb464bc2be
mbed library release version 165

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
AnnaBridge 167:e84263d55307 5 * @version V1.2.1
AnnaBridge 167:e84263d55307 6 * @date 14-April-2017
<> 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 *
AnnaBridge 167:e84263d55307 207 * <h2><center>&copy; COPYRIGHT(c) 2017 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 */
AnnaBridge 167:e84263d55307 253 #define I2C_TIMEOUT_FLAG 35U /*!< Timeout 35 ms */
AnnaBridge 167:e84263d55307 254 #define I2C_TIMEOUT_BUSY_FLAG 25U /*!< Timeout 25 ms */
AnnaBridge 167:e84263d55307 255 #define I2C_NO_OPTION_FRAME 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
AnnaBridge 167:e84263d55307 658 if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 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
AnnaBridge 167:e84263d55307 1026 if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 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 {
AnnaBridge 167:e84263d55307 1079 if((pData == NULL) || (Size == 0))
<> 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
AnnaBridge 167:e84263d55307 1142 if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (Size != 0))
<> 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 {
Kojto 170:19eb464bc2be 1417 /* Generate Start condition if first transfer */
Kojto 170:19eb464bc2be 1418 if((XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME))
Kojto 170:19eb464bc2be 1419 {
Kojto 170:19eb464bc2be 1420 /* Generate Start */
<> 144:ef7eb2e8f9f7 1421 hi2c->Instance->CR1 |= I2C_CR1_START;
Kojto 170:19eb464bc2be 1422 }
Kojto 170:19eb464bc2be 1423 else if(Prev_State == I2C_STATE_MASTER_BUSY_RX) // MBED
Kojto 170:19eb464bc2be 1424 {
Kojto 170:19eb464bc2be 1425 /* Generate ReStart */
Kojto 170:19eb464bc2be 1426 hi2c->Instance->CR1 |= I2C_CR1_START;
Kojto 170:19eb464bc2be 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 {
Kojto 170:19eb464bc2be 1516 /* Generate Start condition if first transfer */
Kojto 170:19eb464bc2be 1517 if((XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME) || (XferOptions == I2C_NO_OPTION_FRAME))
Kojto 170:19eb464bc2be 1518 {
<> 144:ef7eb2e8f9f7 1519 /* Enable Acknowledge */
<> 144:ef7eb2e8f9f7 1520 hi2c->Instance->CR1 |= I2C_CR1_ACK;
Kojto 170:19eb464bc2be 1521
Kojto 170:19eb464bc2be 1522 /* Generate Start */
<> 144:ef7eb2e8f9f7 1523 hi2c->Instance->CR1 |= I2C_CR1_START;
Kojto 170:19eb464bc2be 1524 }
Kojto 170:19eb464bc2be 1525 else if(hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX)
Kojto 170:19eb464bc2be 1526 {
Kojto 170:19eb464bc2be 1527 /* Enable Acknowledge */
Kojto 170:19eb464bc2be 1528 hi2c->Instance->CR1 |= I2C_CR1_ACK;
Kojto 170:19eb464bc2be 1529
Kojto 170:19eb464bc2be 1530 /* Generate ReStart */
Kojto 170:19eb464bc2be 1531 hi2c->Instance->CR1 |= I2C_CR1_START;
Kojto 170:19eb464bc2be 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 {
AnnaBridge 167:e84263d55307 1567 if((pData == NULL) || (Size == 0))
<> 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 {
AnnaBridge 167:e84263d55307 1647 if((pData == NULL) || (Size == 0))
<> 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 {
AnnaBridge 167:e84263d55307 1730 if((pData == NULL) || (Size == 0))
<> 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 {
AnnaBridge 167:e84263d55307 1796 if((pData == NULL) || (Size == 0))
<> 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 {
AnnaBridge 167:e84263d55307 2162 /* Prevent unused argument(s) compilation warning */
AnnaBridge 167:e84263d55307 2163 UNUSED(DevAddress);
AnnaBridge 167:e84263d55307 2164
<> 144:ef7eb2e8f9f7 2165 /* Abort Master transfer during Receive or Transmit process */
<> 144:ef7eb2e8f9f7 2166 if(hi2c->Mode == HAL_I2C_MODE_MASTER)
<> 144:ef7eb2e8f9f7 2167 {
<> 144:ef7eb2e8f9f7 2168 /* Process Locked */
<> 144:ef7eb2e8f9f7 2169 __HAL_LOCK(hi2c);
<> 144:ef7eb2e8f9f7 2170
<> 144:ef7eb2e8f9f7 2171 hi2c->PreviousState = I2C_STATE_NONE;
<> 144:ef7eb2e8f9f7 2172 hi2c->State = HAL_I2C_STATE_ABORT;
<> 144:ef7eb2e8f9f7 2173
<> 144:ef7eb2e8f9f7 2174 /* Disable Acknowledge */
<> 144:ef7eb2e8f9f7 2175 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
<> 144:ef7eb2e8f9f7 2176
<> 144:ef7eb2e8f9f7 2177 /* Generate Stop */
<> 144:ef7eb2e8f9f7 2178 hi2c->Instance->CR1 |= I2C_CR1_STOP;
<> 144:ef7eb2e8f9f7 2179
<> 144:ef7eb2e8f9f7 2180 hi2c->XferCount = 0U;
<> 144:ef7eb2e8f9f7 2181
<> 144:ef7eb2e8f9f7 2182 /* Disable EVT, BUF and ERR interrupt */
<> 144:ef7eb2e8f9f7 2183 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
<> 144:ef7eb2e8f9f7 2184
<> 144:ef7eb2e8f9f7 2185 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2186 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 2187
<> 144:ef7eb2e8f9f7 2188 /* Call the corresponding callback to inform upper layer of End of Transfer */
<> 144:ef7eb2e8f9f7 2189 I2C_ITError(hi2c);
<> 144:ef7eb2e8f9f7 2190
<> 144:ef7eb2e8f9f7 2191 return HAL_OK;
<> 144:ef7eb2e8f9f7 2192 }
<> 144:ef7eb2e8f9f7 2193 else
<> 144:ef7eb2e8f9f7 2194 {
<> 144:ef7eb2e8f9f7 2195 /* Wrong usage of abort function */
<> 144:ef7eb2e8f9f7 2196 /* This function should be used only in case of abort monitored by master device */
<> 144:ef7eb2e8f9f7 2197 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 2198 }
<> 144:ef7eb2e8f9f7 2199 }
<> 144:ef7eb2e8f9f7 2200
<> 144:ef7eb2e8f9f7 2201 /**
<> 144:ef7eb2e8f9f7 2202 * @brief Transmit in slave mode an amount of data in non-blocking mode with DMA
<> 144:ef7eb2e8f9f7 2203 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 2204 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 2205 * @param pData Pointer to data buffer
<> 144:ef7eb2e8f9f7 2206 * @param Size Amount of data to be sent
<> 144:ef7eb2e8f9f7 2207 * @retval HAL status
<> 144:ef7eb2e8f9f7 2208 */
<> 144:ef7eb2e8f9f7 2209 HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
<> 144:ef7eb2e8f9f7 2210 {
<> 144:ef7eb2e8f9f7 2211 __IO uint32_t count = 0U;
<> 144:ef7eb2e8f9f7 2212
<> 144:ef7eb2e8f9f7 2213 if(hi2c->State == HAL_I2C_STATE_READY)
<> 144:ef7eb2e8f9f7 2214 {
AnnaBridge 167:e84263d55307 2215 if((pData == NULL) || (Size == 0))
<> 144:ef7eb2e8f9f7 2216 {
<> 144:ef7eb2e8f9f7 2217 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 2218 }
<> 144:ef7eb2e8f9f7 2219
<> 144:ef7eb2e8f9f7 2220 /* Wait until BUSY flag is reset */
<> 144:ef7eb2e8f9f7 2221 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock /25U /1000U);
<> 144:ef7eb2e8f9f7 2222 do
<> 144:ef7eb2e8f9f7 2223 {
<> 144:ef7eb2e8f9f7 2224 if(count-- == 0U)
<> 144:ef7eb2e8f9f7 2225 {
<> 144:ef7eb2e8f9f7 2226 hi2c->PreviousState = I2C_STATE_NONE;
<> 144:ef7eb2e8f9f7 2227 hi2c->State= HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 2228
<> 144:ef7eb2e8f9f7 2229 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2230 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 2231
<> 144:ef7eb2e8f9f7 2232 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2233 }
<> 144:ef7eb2e8f9f7 2234 }
<> 144:ef7eb2e8f9f7 2235 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
<> 144:ef7eb2e8f9f7 2236
<> 144:ef7eb2e8f9f7 2237 /* Process Locked */
<> 144:ef7eb2e8f9f7 2238 __HAL_LOCK(hi2c);
<> 144:ef7eb2e8f9f7 2239
<> 144:ef7eb2e8f9f7 2240 /* Check if the I2C is already enabled */
<> 144:ef7eb2e8f9f7 2241 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
<> 144:ef7eb2e8f9f7 2242 {
<> 144:ef7eb2e8f9f7 2243 /* Enable I2C peripheral */
<> 144:ef7eb2e8f9f7 2244 __HAL_I2C_ENABLE(hi2c);
<> 144:ef7eb2e8f9f7 2245 }
<> 144:ef7eb2e8f9f7 2246
<> 144:ef7eb2e8f9f7 2247 /* Disable Pos */
<> 144:ef7eb2e8f9f7 2248 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
<> 144:ef7eb2e8f9f7 2249
<> 144:ef7eb2e8f9f7 2250 hi2c->State = HAL_I2C_STATE_BUSY_TX;
<> 144:ef7eb2e8f9f7 2251 hi2c->Mode = HAL_I2C_MODE_SLAVE;
<> 144:ef7eb2e8f9f7 2252 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
<> 144:ef7eb2e8f9f7 2253
<> 144:ef7eb2e8f9f7 2254 /* Prepare transfer parameters */
<> 144:ef7eb2e8f9f7 2255 hi2c->pBuffPtr = pData;
<> 144:ef7eb2e8f9f7 2256 hi2c->XferCount = Size;
<> 144:ef7eb2e8f9f7 2257 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
<> 144:ef7eb2e8f9f7 2258 hi2c->XferSize = hi2c->XferCount;
<> 144:ef7eb2e8f9f7 2259
<> 144:ef7eb2e8f9f7 2260 /* Set the I2C DMA transfer complete callback */
<> 144:ef7eb2e8f9f7 2261 hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt;
<> 144:ef7eb2e8f9f7 2262
<> 144:ef7eb2e8f9f7 2263 /* Set the DMA error callback */
<> 144:ef7eb2e8f9f7 2264 hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
<> 144:ef7eb2e8f9f7 2265
<> 144:ef7eb2e8f9f7 2266 /* Set the unused DMA callbacks to NULL */
<> 144:ef7eb2e8f9f7 2267 hi2c->hdmatx->XferHalfCpltCallback = NULL;
<> 144:ef7eb2e8f9f7 2268 hi2c->hdmatx->XferM1CpltCallback = NULL;
<> 144:ef7eb2e8f9f7 2269 hi2c->hdmatx->XferM1HalfCpltCallback = NULL;
<> 144:ef7eb2e8f9f7 2270 hi2c->hdmatx->XferAbortCallback = NULL;
<> 144:ef7eb2e8f9f7 2271
<> 144:ef7eb2e8f9f7 2272 /* Enable the DMA Stream */
<> 144:ef7eb2e8f9f7 2273 HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize);
<> 144:ef7eb2e8f9f7 2274
<> 144:ef7eb2e8f9f7 2275 /* Enable Address Acknowledge */
<> 144:ef7eb2e8f9f7 2276 hi2c->Instance->CR1 |= I2C_CR1_ACK;
<> 144:ef7eb2e8f9f7 2277
<> 144:ef7eb2e8f9f7 2278 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2279 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 2280
<> 144:ef7eb2e8f9f7 2281 /* Note : The I2C interrupts must be enabled after unlocking current process
<> 144:ef7eb2e8f9f7 2282 to avoid the risk of I2C interrupt handle execution before current
<> 144:ef7eb2e8f9f7 2283 process unlock */
<> 144:ef7eb2e8f9f7 2284 /* Enable EVT and ERR interrupt */
<> 144:ef7eb2e8f9f7 2285 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
<> 144:ef7eb2e8f9f7 2286
<> 144:ef7eb2e8f9f7 2287 /* Enable DMA Request */
<> 144:ef7eb2e8f9f7 2288 hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
<> 144:ef7eb2e8f9f7 2289
<> 144:ef7eb2e8f9f7 2290 return HAL_OK;
<> 144:ef7eb2e8f9f7 2291 }
<> 144:ef7eb2e8f9f7 2292 else
<> 144:ef7eb2e8f9f7 2293 {
<> 144:ef7eb2e8f9f7 2294 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 2295 }
<> 144:ef7eb2e8f9f7 2296 }
<> 144:ef7eb2e8f9f7 2297
<> 144:ef7eb2e8f9f7 2298 /**
<> 144:ef7eb2e8f9f7 2299 * @brief Receive in slave mode an amount of data in non-blocking mode with DMA
<> 144:ef7eb2e8f9f7 2300 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 2301 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 2302 * @param pData Pointer to data buffer
<> 144:ef7eb2e8f9f7 2303 * @param Size Amount of data to be sent
<> 144:ef7eb2e8f9f7 2304 * @retval HAL status
<> 144:ef7eb2e8f9f7 2305 */
<> 144:ef7eb2e8f9f7 2306 HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
<> 144:ef7eb2e8f9f7 2307 {
<> 144:ef7eb2e8f9f7 2308 __IO uint32_t count = 0U;
<> 144:ef7eb2e8f9f7 2309
<> 144:ef7eb2e8f9f7 2310 if(hi2c->State == HAL_I2C_STATE_READY)
<> 144:ef7eb2e8f9f7 2311 {
AnnaBridge 167:e84263d55307 2312 if((pData == NULL) || (Size == 0))
<> 144:ef7eb2e8f9f7 2313 {
<> 144:ef7eb2e8f9f7 2314 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 2315 }
<> 144:ef7eb2e8f9f7 2316
<> 144:ef7eb2e8f9f7 2317 /* Wait until BUSY flag is reset */
<> 144:ef7eb2e8f9f7 2318 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock /25U /1000U);
<> 144:ef7eb2e8f9f7 2319 do
<> 144:ef7eb2e8f9f7 2320 {
<> 144:ef7eb2e8f9f7 2321 if(count-- == 0U)
<> 144:ef7eb2e8f9f7 2322 {
<> 144:ef7eb2e8f9f7 2323 hi2c->PreviousState = I2C_STATE_NONE;
<> 144:ef7eb2e8f9f7 2324 hi2c->State= HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 2325
<> 144:ef7eb2e8f9f7 2326 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2327 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 2328
<> 144:ef7eb2e8f9f7 2329 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2330 }
<> 144:ef7eb2e8f9f7 2331 }
<> 144:ef7eb2e8f9f7 2332 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
<> 144:ef7eb2e8f9f7 2333
<> 144:ef7eb2e8f9f7 2334 /* Process Locked */
<> 144:ef7eb2e8f9f7 2335 __HAL_LOCK(hi2c);
<> 144:ef7eb2e8f9f7 2336
<> 144:ef7eb2e8f9f7 2337 /* Check if the I2C is already enabled */
<> 144:ef7eb2e8f9f7 2338 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
<> 144:ef7eb2e8f9f7 2339 {
<> 144:ef7eb2e8f9f7 2340 /* Enable I2C peripheral */
<> 144:ef7eb2e8f9f7 2341 __HAL_I2C_ENABLE(hi2c);
<> 144:ef7eb2e8f9f7 2342 }
<> 144:ef7eb2e8f9f7 2343
<> 144:ef7eb2e8f9f7 2344 /* Disable Pos */
<> 144:ef7eb2e8f9f7 2345 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
<> 144:ef7eb2e8f9f7 2346
<> 144:ef7eb2e8f9f7 2347 hi2c->State = HAL_I2C_STATE_BUSY_RX;
<> 144:ef7eb2e8f9f7 2348 hi2c->Mode = HAL_I2C_MODE_SLAVE;
<> 144:ef7eb2e8f9f7 2349 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
<> 144:ef7eb2e8f9f7 2350
<> 144:ef7eb2e8f9f7 2351 /* Prepare transfer parameters */
<> 144:ef7eb2e8f9f7 2352 hi2c->pBuffPtr = pData;
<> 144:ef7eb2e8f9f7 2353 hi2c->XferCount = Size;
<> 144:ef7eb2e8f9f7 2354 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
<> 144:ef7eb2e8f9f7 2355 hi2c->XferSize = hi2c->XferCount;
<> 144:ef7eb2e8f9f7 2356
<> 144:ef7eb2e8f9f7 2357 /* Set the I2C DMA transfer complete callback */
<> 144:ef7eb2e8f9f7 2358 hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt;
<> 144:ef7eb2e8f9f7 2359
<> 144:ef7eb2e8f9f7 2360 /* Set the DMA error callback */
<> 144:ef7eb2e8f9f7 2361 hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
<> 144:ef7eb2e8f9f7 2362
<> 144:ef7eb2e8f9f7 2363 /* Set the unused DMA callbacks to NULL */
<> 144:ef7eb2e8f9f7 2364 hi2c->hdmarx->XferHalfCpltCallback = NULL;
<> 144:ef7eb2e8f9f7 2365 hi2c->hdmarx->XferM1CpltCallback = NULL;
<> 144:ef7eb2e8f9f7 2366 hi2c->hdmarx->XferM1HalfCpltCallback = NULL;
<> 144:ef7eb2e8f9f7 2367 hi2c->hdmarx->XferAbortCallback = NULL;
<> 144:ef7eb2e8f9f7 2368
<> 144:ef7eb2e8f9f7 2369 /* Enable the DMA Stream */
<> 144:ef7eb2e8f9f7 2370 HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize);
<> 144:ef7eb2e8f9f7 2371
<> 144:ef7eb2e8f9f7 2372 /* Enable Address Acknowledge */
<> 144:ef7eb2e8f9f7 2373 hi2c->Instance->CR1 |= I2C_CR1_ACK;
<> 144:ef7eb2e8f9f7 2374
<> 144:ef7eb2e8f9f7 2375 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2376 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 2377
<> 144:ef7eb2e8f9f7 2378 /* Note : The I2C interrupts must be enabled after unlocking current process
<> 144:ef7eb2e8f9f7 2379 to avoid the risk of I2C interrupt handle execution before current
<> 144:ef7eb2e8f9f7 2380 process unlock */
<> 144:ef7eb2e8f9f7 2381 /* Enable EVT and ERR interrupt */
<> 144:ef7eb2e8f9f7 2382 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
<> 144:ef7eb2e8f9f7 2383
<> 144:ef7eb2e8f9f7 2384 /* Enable DMA Request */
<> 144:ef7eb2e8f9f7 2385 hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
<> 144:ef7eb2e8f9f7 2386
<> 144:ef7eb2e8f9f7 2387 return HAL_OK;
<> 144:ef7eb2e8f9f7 2388 }
<> 144:ef7eb2e8f9f7 2389 else
<> 144:ef7eb2e8f9f7 2390 {
<> 144:ef7eb2e8f9f7 2391 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 2392 }
<> 144:ef7eb2e8f9f7 2393 }
<> 144:ef7eb2e8f9f7 2394 /**
<> 144:ef7eb2e8f9f7 2395 * @brief Write an amount of data in blocking mode to a specific memory address
<> 144:ef7eb2e8f9f7 2396 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 2397 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 2398 * @param DevAddress Target device address
<> 144:ef7eb2e8f9f7 2399 * @param MemAddress Internal memory address
<> 144:ef7eb2e8f9f7 2400 * @param MemAddSize Size of internal memory address
<> 144:ef7eb2e8f9f7 2401 * @param pData Pointer to data buffer
<> 144:ef7eb2e8f9f7 2402 * @param Size Amount of data to be sent
<> 144:ef7eb2e8f9f7 2403 * @param Timeout Timeout duration
<> 144:ef7eb2e8f9f7 2404 * @retval HAL status
<> 144:ef7eb2e8f9f7 2405 */
<> 144:ef7eb2e8f9f7 2406 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 2407 {
<> 144:ef7eb2e8f9f7 2408 uint32_t tickstart = 0x00U;
<> 144:ef7eb2e8f9f7 2409
<> 144:ef7eb2e8f9f7 2410 /* Init tickstart for timeout management*/
<> 144:ef7eb2e8f9f7 2411 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 2412
<> 144:ef7eb2e8f9f7 2413 /* Check the parameters */
<> 144:ef7eb2e8f9f7 2414 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
<> 144:ef7eb2e8f9f7 2415
<> 144:ef7eb2e8f9f7 2416 if(hi2c->State == HAL_I2C_STATE_READY)
<> 144:ef7eb2e8f9f7 2417 {
<> 144:ef7eb2e8f9f7 2418 /* Wait until BUSY flag is reset */
<> 144:ef7eb2e8f9f7 2419 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 2420 {
<> 144:ef7eb2e8f9f7 2421 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 2422 }
<> 144:ef7eb2e8f9f7 2423
<> 144:ef7eb2e8f9f7 2424 /* Process Locked */
<> 144:ef7eb2e8f9f7 2425 __HAL_LOCK(hi2c);
<> 144:ef7eb2e8f9f7 2426
<> 144:ef7eb2e8f9f7 2427 /* Check if the I2C is already enabled */
<> 144:ef7eb2e8f9f7 2428 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
<> 144:ef7eb2e8f9f7 2429 {
<> 144:ef7eb2e8f9f7 2430 /* Enable I2C peripheral */
<> 144:ef7eb2e8f9f7 2431 __HAL_I2C_ENABLE(hi2c);
<> 144:ef7eb2e8f9f7 2432 }
<> 144:ef7eb2e8f9f7 2433
<> 144:ef7eb2e8f9f7 2434 /* Disable Pos */
<> 144:ef7eb2e8f9f7 2435 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
<> 144:ef7eb2e8f9f7 2436
<> 144:ef7eb2e8f9f7 2437 hi2c->State = HAL_I2C_STATE_BUSY_TX;
<> 144:ef7eb2e8f9f7 2438 hi2c->Mode = HAL_I2C_MODE_MEM;
<> 144:ef7eb2e8f9f7 2439 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
<> 144:ef7eb2e8f9f7 2440
<> 144:ef7eb2e8f9f7 2441 /* Prepare transfer parameters */
<> 144:ef7eb2e8f9f7 2442 hi2c->pBuffPtr = pData;
<> 144:ef7eb2e8f9f7 2443 hi2c->XferCount = Size;
<> 144:ef7eb2e8f9f7 2444 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
<> 144:ef7eb2e8f9f7 2445 hi2c->XferSize = hi2c->XferCount;
<> 144:ef7eb2e8f9f7 2446
<> 144:ef7eb2e8f9f7 2447 /* Send Slave Address and Memory Address */
<> 144:ef7eb2e8f9f7 2448 if(I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 2449 {
<> 144:ef7eb2e8f9f7 2450 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
<> 144:ef7eb2e8f9f7 2451 {
<> 144:ef7eb2e8f9f7 2452 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2453 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 2454 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 2455 }
<> 144:ef7eb2e8f9f7 2456 else
<> 144:ef7eb2e8f9f7 2457 {
<> 144:ef7eb2e8f9f7 2458 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2459 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 2460 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2461 }
<> 144:ef7eb2e8f9f7 2462 }
<> 144:ef7eb2e8f9f7 2463
<> 144:ef7eb2e8f9f7 2464 while(hi2c->XferSize > 0U)
<> 144:ef7eb2e8f9f7 2465 {
<> 144:ef7eb2e8f9f7 2466 /* Wait until TXE flag is set */
<> 144:ef7eb2e8f9f7 2467 if(I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 2468 {
<> 144:ef7eb2e8f9f7 2469 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
<> 144:ef7eb2e8f9f7 2470 {
<> 144:ef7eb2e8f9f7 2471 /* Generate Stop */
<> 144:ef7eb2e8f9f7 2472 hi2c->Instance->CR1 |= I2C_CR1_STOP;
<> 144:ef7eb2e8f9f7 2473 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 2474 }
<> 144:ef7eb2e8f9f7 2475 else
<> 144:ef7eb2e8f9f7 2476 {
<> 144:ef7eb2e8f9f7 2477 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2478 }
<> 144:ef7eb2e8f9f7 2479 }
<> 144:ef7eb2e8f9f7 2480
<> 144:ef7eb2e8f9f7 2481 /* Write data to DR */
<> 144:ef7eb2e8f9f7 2482 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
<> 144:ef7eb2e8f9f7 2483 hi2c->XferSize--;
<> 144:ef7eb2e8f9f7 2484 hi2c->XferCount--;
<> 144:ef7eb2e8f9f7 2485
<> 144:ef7eb2e8f9f7 2486 if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U))
<> 144:ef7eb2e8f9f7 2487 {
<> 144:ef7eb2e8f9f7 2488 /* Write data to DR */
<> 144:ef7eb2e8f9f7 2489 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
<> 144:ef7eb2e8f9f7 2490 hi2c->XferSize--;
<> 144:ef7eb2e8f9f7 2491 hi2c->XferCount--;
<> 144:ef7eb2e8f9f7 2492 }
<> 144:ef7eb2e8f9f7 2493 }
<> 144:ef7eb2e8f9f7 2494
<> 144:ef7eb2e8f9f7 2495 /* Wait until BTF flag is set */
<> 144:ef7eb2e8f9f7 2496 if(I2C_WaitOnBTFFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 2497 {
<> 144:ef7eb2e8f9f7 2498 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
<> 144:ef7eb2e8f9f7 2499 {
<> 144:ef7eb2e8f9f7 2500 /* Generate Stop */
<> 144:ef7eb2e8f9f7 2501 hi2c->Instance->CR1 |= I2C_CR1_STOP;
<> 144:ef7eb2e8f9f7 2502 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 2503 }
<> 144:ef7eb2e8f9f7 2504 else
<> 144:ef7eb2e8f9f7 2505 {
<> 144:ef7eb2e8f9f7 2506 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2507 }
<> 144:ef7eb2e8f9f7 2508 }
<> 144:ef7eb2e8f9f7 2509
<> 144:ef7eb2e8f9f7 2510 /* Generate Stop */
<> 144:ef7eb2e8f9f7 2511 hi2c->Instance->CR1 |= I2C_CR1_STOP;
<> 144:ef7eb2e8f9f7 2512
<> 144:ef7eb2e8f9f7 2513 hi2c->State = HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 2514 hi2c->Mode = HAL_I2C_MODE_NONE;
<> 144:ef7eb2e8f9f7 2515
<> 144:ef7eb2e8f9f7 2516 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2517 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 2518
<> 144:ef7eb2e8f9f7 2519 return HAL_OK;
<> 144:ef7eb2e8f9f7 2520 }
<> 144:ef7eb2e8f9f7 2521 else
<> 144:ef7eb2e8f9f7 2522 {
<> 144:ef7eb2e8f9f7 2523 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 2524 }
<> 144:ef7eb2e8f9f7 2525 }
<> 144:ef7eb2e8f9f7 2526
<> 144:ef7eb2e8f9f7 2527 /**
<> 144:ef7eb2e8f9f7 2528 * @brief Read an amount of data in blocking mode from a specific memory address
<> 144:ef7eb2e8f9f7 2529 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 2530 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 2531 * @param DevAddress Target device address
<> 144:ef7eb2e8f9f7 2532 * @param MemAddress Internal memory address
<> 144:ef7eb2e8f9f7 2533 * @param MemAddSize Size of internal memory address
<> 144:ef7eb2e8f9f7 2534 * @param pData Pointer to data buffer
<> 144:ef7eb2e8f9f7 2535 * @param Size Amount of data to be sent
<> 144:ef7eb2e8f9f7 2536 * @param Timeout Timeout duration
<> 144:ef7eb2e8f9f7 2537 * @retval HAL status
<> 144:ef7eb2e8f9f7 2538 */
<> 144:ef7eb2e8f9f7 2539 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 2540 {
<> 144:ef7eb2e8f9f7 2541 uint32_t tickstart = 0x00U;
<> 144:ef7eb2e8f9f7 2542
<> 144:ef7eb2e8f9f7 2543 /* Init tickstart for timeout management*/
<> 144:ef7eb2e8f9f7 2544 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 2545
<> 144:ef7eb2e8f9f7 2546 /* Check the parameters */
<> 144:ef7eb2e8f9f7 2547 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
<> 144:ef7eb2e8f9f7 2548
<> 144:ef7eb2e8f9f7 2549 if(hi2c->State == HAL_I2C_STATE_READY)
<> 144:ef7eb2e8f9f7 2550 {
<> 144:ef7eb2e8f9f7 2551 /* Wait until BUSY flag is reset */
<> 144:ef7eb2e8f9f7 2552 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 2553 {
<> 144:ef7eb2e8f9f7 2554 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 2555 }
<> 144:ef7eb2e8f9f7 2556
<> 144:ef7eb2e8f9f7 2557 /* Process Locked */
<> 144:ef7eb2e8f9f7 2558 __HAL_LOCK(hi2c);
<> 144:ef7eb2e8f9f7 2559
<> 144:ef7eb2e8f9f7 2560 /* Check if the I2C is already enabled */
<> 144:ef7eb2e8f9f7 2561 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
<> 144:ef7eb2e8f9f7 2562 {
<> 144:ef7eb2e8f9f7 2563 /* Enable I2C peripheral */
<> 144:ef7eb2e8f9f7 2564 __HAL_I2C_ENABLE(hi2c);
<> 144:ef7eb2e8f9f7 2565 }
<> 144:ef7eb2e8f9f7 2566
<> 144:ef7eb2e8f9f7 2567 /* Disable Pos */
<> 144:ef7eb2e8f9f7 2568 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
<> 144:ef7eb2e8f9f7 2569
<> 144:ef7eb2e8f9f7 2570 hi2c->State = HAL_I2C_STATE_BUSY_RX;
<> 144:ef7eb2e8f9f7 2571 hi2c->Mode = HAL_I2C_MODE_MEM;
<> 144:ef7eb2e8f9f7 2572 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
<> 144:ef7eb2e8f9f7 2573
<> 144:ef7eb2e8f9f7 2574 /* Prepare transfer parameters */
<> 144:ef7eb2e8f9f7 2575 hi2c->pBuffPtr = pData;
<> 144:ef7eb2e8f9f7 2576 hi2c->XferCount = Size;
<> 144:ef7eb2e8f9f7 2577 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
<> 144:ef7eb2e8f9f7 2578 hi2c->XferSize = hi2c->XferCount;
<> 144:ef7eb2e8f9f7 2579
<> 144:ef7eb2e8f9f7 2580 /* Send Slave Address and Memory Address */
<> 144:ef7eb2e8f9f7 2581 if(I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 2582 {
<> 144:ef7eb2e8f9f7 2583 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
<> 144:ef7eb2e8f9f7 2584 {
<> 144:ef7eb2e8f9f7 2585 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2586 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 2587 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 2588 }
<> 144:ef7eb2e8f9f7 2589 else
<> 144:ef7eb2e8f9f7 2590 {
<> 144:ef7eb2e8f9f7 2591 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2592 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 2593 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2594 }
<> 144:ef7eb2e8f9f7 2595 }
<> 144:ef7eb2e8f9f7 2596
<> 144:ef7eb2e8f9f7 2597 if(hi2c->XferSize == 0U)
<> 144:ef7eb2e8f9f7 2598 {
<> 144:ef7eb2e8f9f7 2599 /* Clear ADDR flag */
<> 144:ef7eb2e8f9f7 2600 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
<> 144:ef7eb2e8f9f7 2601
<> 144:ef7eb2e8f9f7 2602 /* Generate Stop */
<> 144:ef7eb2e8f9f7 2603 hi2c->Instance->CR1 |= I2C_CR1_STOP;
<> 144:ef7eb2e8f9f7 2604 }
<> 144:ef7eb2e8f9f7 2605 else if(hi2c->XferSize == 1U)
<> 144:ef7eb2e8f9f7 2606 {
<> 144:ef7eb2e8f9f7 2607 /* Disable Acknowledge */
<> 144:ef7eb2e8f9f7 2608 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
<> 144:ef7eb2e8f9f7 2609
<> 144:ef7eb2e8f9f7 2610 /* Clear ADDR flag */
<> 144:ef7eb2e8f9f7 2611 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
<> 144:ef7eb2e8f9f7 2612
<> 144:ef7eb2e8f9f7 2613 /* Generate Stop */
<> 144:ef7eb2e8f9f7 2614 hi2c->Instance->CR1 |= I2C_CR1_STOP;
<> 144:ef7eb2e8f9f7 2615 }
<> 144:ef7eb2e8f9f7 2616 else if(hi2c->XferSize == 2U)
<> 144:ef7eb2e8f9f7 2617 {
<> 144:ef7eb2e8f9f7 2618 /* Disable Acknowledge */
<> 144:ef7eb2e8f9f7 2619 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
<> 144:ef7eb2e8f9f7 2620
<> 144:ef7eb2e8f9f7 2621 /* Enable Pos */
<> 144:ef7eb2e8f9f7 2622 hi2c->Instance->CR1 |= I2C_CR1_POS;
<> 144:ef7eb2e8f9f7 2623
<> 144:ef7eb2e8f9f7 2624 /* Clear ADDR flag */
<> 144:ef7eb2e8f9f7 2625 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
<> 144:ef7eb2e8f9f7 2626 }
<> 144:ef7eb2e8f9f7 2627 else
<> 144:ef7eb2e8f9f7 2628 {
<> 144:ef7eb2e8f9f7 2629 /* Clear ADDR flag */
<> 144:ef7eb2e8f9f7 2630 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
<> 144:ef7eb2e8f9f7 2631 }
<> 144:ef7eb2e8f9f7 2632
<> 144:ef7eb2e8f9f7 2633 while(hi2c->XferSize > 0U)
<> 144:ef7eb2e8f9f7 2634 {
<> 144:ef7eb2e8f9f7 2635 if(hi2c->XferSize <= 3U)
<> 144:ef7eb2e8f9f7 2636 {
<> 144:ef7eb2e8f9f7 2637 /* One byte */
<> 144:ef7eb2e8f9f7 2638 if(hi2c->XferSize== 1U)
<> 144:ef7eb2e8f9f7 2639 {
<> 144:ef7eb2e8f9f7 2640 /* Wait until RXNE flag is set */
<> 144:ef7eb2e8f9f7 2641 if(I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 2642 {
<> 144:ef7eb2e8f9f7 2643 if(hi2c->ErrorCode == HAL_I2C_ERROR_TIMEOUT)
<> 144:ef7eb2e8f9f7 2644 {
<> 144:ef7eb2e8f9f7 2645 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2646 }
<> 144:ef7eb2e8f9f7 2647 else
<> 144:ef7eb2e8f9f7 2648 {
<> 144:ef7eb2e8f9f7 2649 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 2650 }
<> 144:ef7eb2e8f9f7 2651 }
<> 144:ef7eb2e8f9f7 2652
<> 144:ef7eb2e8f9f7 2653 /* Read data from DR */
<> 144:ef7eb2e8f9f7 2654 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
<> 144:ef7eb2e8f9f7 2655 hi2c->XferSize--;
<> 144:ef7eb2e8f9f7 2656 hi2c->XferCount--;
<> 144:ef7eb2e8f9f7 2657 }
<> 144:ef7eb2e8f9f7 2658 /* Two bytes */
AnnaBridge 167:e84263d55307 2659 else if(hi2c->XferSize == 2U)
<> 144:ef7eb2e8f9f7 2660 {
<> 144:ef7eb2e8f9f7 2661 /* Wait until BTF flag is set */
<> 144:ef7eb2e8f9f7 2662 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 2663 {
<> 144:ef7eb2e8f9f7 2664 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2665 }
<> 144:ef7eb2e8f9f7 2666
<> 144:ef7eb2e8f9f7 2667 /* Generate Stop */
<> 144:ef7eb2e8f9f7 2668 hi2c->Instance->CR1 |= I2C_CR1_STOP;
<> 144:ef7eb2e8f9f7 2669
<> 144:ef7eb2e8f9f7 2670 /* Read data from DR */
<> 144:ef7eb2e8f9f7 2671 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
<> 144:ef7eb2e8f9f7 2672 hi2c->XferSize--;
<> 144:ef7eb2e8f9f7 2673 hi2c->XferCount--;
<> 144:ef7eb2e8f9f7 2674
<> 144:ef7eb2e8f9f7 2675 /* Read data from DR */
<> 144:ef7eb2e8f9f7 2676 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
<> 144:ef7eb2e8f9f7 2677 hi2c->XferSize--;
<> 144:ef7eb2e8f9f7 2678 hi2c->XferCount--;
<> 144:ef7eb2e8f9f7 2679 }
<> 144:ef7eb2e8f9f7 2680 /* 3 Last bytes */
<> 144:ef7eb2e8f9f7 2681 else
<> 144:ef7eb2e8f9f7 2682 {
<> 144:ef7eb2e8f9f7 2683 /* Wait until BTF flag is set */
<> 144:ef7eb2e8f9f7 2684 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 2685 {
<> 144:ef7eb2e8f9f7 2686 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2687 }
<> 144:ef7eb2e8f9f7 2688
<> 144:ef7eb2e8f9f7 2689 /* Disable Acknowledge */
<> 144:ef7eb2e8f9f7 2690 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
<> 144:ef7eb2e8f9f7 2691
<> 144:ef7eb2e8f9f7 2692 /* Read data from DR */
<> 144:ef7eb2e8f9f7 2693 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
<> 144:ef7eb2e8f9f7 2694 hi2c->XferSize--;
<> 144:ef7eb2e8f9f7 2695 hi2c->XferCount--;
<> 144:ef7eb2e8f9f7 2696
<> 144:ef7eb2e8f9f7 2697 /* Wait until BTF flag is set */
<> 144:ef7eb2e8f9f7 2698 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 2699 {
<> 144:ef7eb2e8f9f7 2700 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2701 }
<> 144:ef7eb2e8f9f7 2702
<> 144:ef7eb2e8f9f7 2703 /* Generate Stop */
<> 144:ef7eb2e8f9f7 2704 hi2c->Instance->CR1 |= I2C_CR1_STOP;
<> 144:ef7eb2e8f9f7 2705
<> 144:ef7eb2e8f9f7 2706 /* Read data from DR */
<> 144:ef7eb2e8f9f7 2707 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
<> 144:ef7eb2e8f9f7 2708 hi2c->XferSize--;
<> 144:ef7eb2e8f9f7 2709 hi2c->XferCount--;
<> 144:ef7eb2e8f9f7 2710
<> 144:ef7eb2e8f9f7 2711 /* Read data from DR */
<> 144:ef7eb2e8f9f7 2712 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
<> 144:ef7eb2e8f9f7 2713 hi2c->XferSize--;
<> 144:ef7eb2e8f9f7 2714 hi2c->XferCount--;
<> 144:ef7eb2e8f9f7 2715 }
<> 144:ef7eb2e8f9f7 2716 }
<> 144:ef7eb2e8f9f7 2717 else
<> 144:ef7eb2e8f9f7 2718 {
<> 144:ef7eb2e8f9f7 2719 /* Wait until RXNE flag is set */
<> 144:ef7eb2e8f9f7 2720 if(I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 2721 {
<> 144:ef7eb2e8f9f7 2722 if(hi2c->ErrorCode == HAL_I2C_ERROR_TIMEOUT)
<> 144:ef7eb2e8f9f7 2723 {
<> 144:ef7eb2e8f9f7 2724 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2725 }
<> 144:ef7eb2e8f9f7 2726 else
<> 144:ef7eb2e8f9f7 2727 {
<> 144:ef7eb2e8f9f7 2728 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 2729 }
<> 144:ef7eb2e8f9f7 2730 }
<> 144:ef7eb2e8f9f7 2731
<> 144:ef7eb2e8f9f7 2732 /* Read data from DR */
<> 144:ef7eb2e8f9f7 2733 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
<> 144:ef7eb2e8f9f7 2734 hi2c->XferSize--;
<> 144:ef7eb2e8f9f7 2735 hi2c->XferCount--;
<> 144:ef7eb2e8f9f7 2736
<> 144:ef7eb2e8f9f7 2737 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET)
<> 144:ef7eb2e8f9f7 2738 {
<> 144:ef7eb2e8f9f7 2739 /* Read data from DR */
<> 144:ef7eb2e8f9f7 2740 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
<> 144:ef7eb2e8f9f7 2741 hi2c->XferSize--;
<> 144:ef7eb2e8f9f7 2742 hi2c->XferCount--;
<> 144:ef7eb2e8f9f7 2743 }
<> 144:ef7eb2e8f9f7 2744 }
<> 144:ef7eb2e8f9f7 2745 }
<> 144:ef7eb2e8f9f7 2746
<> 144:ef7eb2e8f9f7 2747 hi2c->State = HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 2748 hi2c->Mode = HAL_I2C_MODE_NONE;
<> 144:ef7eb2e8f9f7 2749
<> 144:ef7eb2e8f9f7 2750 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2751 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 2752
<> 144:ef7eb2e8f9f7 2753 return HAL_OK;
<> 144:ef7eb2e8f9f7 2754 }
<> 144:ef7eb2e8f9f7 2755 else
<> 144:ef7eb2e8f9f7 2756 {
<> 144:ef7eb2e8f9f7 2757 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 2758 }
<> 144:ef7eb2e8f9f7 2759 }
<> 144:ef7eb2e8f9f7 2760
<> 144:ef7eb2e8f9f7 2761 /**
<> 144:ef7eb2e8f9f7 2762 * @brief Write an amount of data in non-blocking mode with Interrupt to a specific memory address
<> 144:ef7eb2e8f9f7 2763 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 2764 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 2765 * @param DevAddress Target device address
<> 144:ef7eb2e8f9f7 2766 * @param MemAddress Internal memory address
<> 144:ef7eb2e8f9f7 2767 * @param MemAddSize Size of internal memory address
<> 144:ef7eb2e8f9f7 2768 * @param pData Pointer to data buffer
<> 144:ef7eb2e8f9f7 2769 * @param Size Amount of data to be sent
<> 144:ef7eb2e8f9f7 2770 * @retval HAL status
<> 144:ef7eb2e8f9f7 2771 */
<> 144:ef7eb2e8f9f7 2772 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 2773 {
<> 144:ef7eb2e8f9f7 2774 __IO uint32_t count = 0U;
<> 144:ef7eb2e8f9f7 2775
<> 144:ef7eb2e8f9f7 2776 /* Check the parameters */
<> 144:ef7eb2e8f9f7 2777 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
<> 144:ef7eb2e8f9f7 2778
<> 144:ef7eb2e8f9f7 2779 if(hi2c->State == HAL_I2C_STATE_READY)
<> 144:ef7eb2e8f9f7 2780 {
<> 144:ef7eb2e8f9f7 2781 /* Wait until BUSY flag is reset */
<> 144:ef7eb2e8f9f7 2782 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock /25U /1000U);
<> 144:ef7eb2e8f9f7 2783 do
<> 144:ef7eb2e8f9f7 2784 {
<> 144:ef7eb2e8f9f7 2785 if(count-- == 0U)
<> 144:ef7eb2e8f9f7 2786 {
<> 144:ef7eb2e8f9f7 2787 hi2c->PreviousState = I2C_STATE_NONE;
<> 144:ef7eb2e8f9f7 2788 hi2c->State= HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 2789
<> 144:ef7eb2e8f9f7 2790 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2791 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 2792
<> 144:ef7eb2e8f9f7 2793 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2794 }
<> 144:ef7eb2e8f9f7 2795 }
<> 144:ef7eb2e8f9f7 2796 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
<> 144:ef7eb2e8f9f7 2797
<> 144:ef7eb2e8f9f7 2798 /* Process Locked */
<> 144:ef7eb2e8f9f7 2799 __HAL_LOCK(hi2c);
<> 144:ef7eb2e8f9f7 2800
<> 144:ef7eb2e8f9f7 2801 /* Check if the I2C is already enabled */
<> 144:ef7eb2e8f9f7 2802 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
<> 144:ef7eb2e8f9f7 2803 {
<> 144:ef7eb2e8f9f7 2804 /* Enable I2C peripheral */
<> 144:ef7eb2e8f9f7 2805 __HAL_I2C_ENABLE(hi2c);
<> 144:ef7eb2e8f9f7 2806 }
<> 144:ef7eb2e8f9f7 2807
<> 144:ef7eb2e8f9f7 2808 /* Disable Pos */
<> 144:ef7eb2e8f9f7 2809 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
<> 144:ef7eb2e8f9f7 2810
<> 144:ef7eb2e8f9f7 2811 hi2c->State = HAL_I2C_STATE_BUSY_TX;
<> 144:ef7eb2e8f9f7 2812 hi2c->Mode = HAL_I2C_MODE_MEM;
<> 144:ef7eb2e8f9f7 2813 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
<> 144:ef7eb2e8f9f7 2814
<> 144:ef7eb2e8f9f7 2815 /* Prepare transfer parameters */
<> 144:ef7eb2e8f9f7 2816 hi2c->pBuffPtr = pData;
<> 144:ef7eb2e8f9f7 2817 hi2c->XferSize = Size;
<> 144:ef7eb2e8f9f7 2818 hi2c->XferCount = Size;
<> 144:ef7eb2e8f9f7 2819 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
<> 144:ef7eb2e8f9f7 2820 hi2c->Devaddress = DevAddress;
<> 144:ef7eb2e8f9f7 2821 hi2c->Memaddress = MemAddress;
<> 144:ef7eb2e8f9f7 2822 hi2c->MemaddSize = MemAddSize;
<> 144:ef7eb2e8f9f7 2823 hi2c->EventCount = 0U;
<> 144:ef7eb2e8f9f7 2824
<> 144:ef7eb2e8f9f7 2825 /* Generate Start */
<> 144:ef7eb2e8f9f7 2826 hi2c->Instance->CR1 |= I2C_CR1_START;
<> 144:ef7eb2e8f9f7 2827
<> 144:ef7eb2e8f9f7 2828 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2829 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 2830
<> 144:ef7eb2e8f9f7 2831 /* Note : The I2C interrupts must be enabled after unlocking current process
<> 144:ef7eb2e8f9f7 2832 to avoid the risk of I2C interrupt handle execution before current
<> 144:ef7eb2e8f9f7 2833 process unlock */
<> 144:ef7eb2e8f9f7 2834
<> 144:ef7eb2e8f9f7 2835 /* Enable EVT, BUF and ERR interrupt */
<> 144:ef7eb2e8f9f7 2836 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
<> 144:ef7eb2e8f9f7 2837
<> 144:ef7eb2e8f9f7 2838 return HAL_OK;
<> 144:ef7eb2e8f9f7 2839 }
<> 144:ef7eb2e8f9f7 2840 else
<> 144:ef7eb2e8f9f7 2841 {
<> 144:ef7eb2e8f9f7 2842 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 2843 }
<> 144:ef7eb2e8f9f7 2844 }
<> 144:ef7eb2e8f9f7 2845
<> 144:ef7eb2e8f9f7 2846 /**
<> 144:ef7eb2e8f9f7 2847 * @brief Read an amount of data in non-blocking mode with Interrupt from a specific memory address
<> 144:ef7eb2e8f9f7 2848 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 2849 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 2850 * @param DevAddress Target device address
<> 144:ef7eb2e8f9f7 2851 * @param MemAddress Internal memory address
<> 144:ef7eb2e8f9f7 2852 * @param MemAddSize Size of internal memory address
<> 144:ef7eb2e8f9f7 2853 * @param pData Pointer to data buffer
<> 144:ef7eb2e8f9f7 2854 * @param Size Amount of data to be sent
<> 144:ef7eb2e8f9f7 2855 * @retval HAL status
<> 144:ef7eb2e8f9f7 2856 */
<> 144:ef7eb2e8f9f7 2857 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 2858 {
<> 144:ef7eb2e8f9f7 2859 __IO uint32_t count = 0U;
<> 144:ef7eb2e8f9f7 2860
<> 144:ef7eb2e8f9f7 2861 /* Check the parameters */
<> 144:ef7eb2e8f9f7 2862 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
<> 144:ef7eb2e8f9f7 2863
<> 144:ef7eb2e8f9f7 2864 if(hi2c->State == HAL_I2C_STATE_READY)
<> 144:ef7eb2e8f9f7 2865 {
<> 144:ef7eb2e8f9f7 2866 /* Wait until BUSY flag is reset */
<> 144:ef7eb2e8f9f7 2867 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock /25U /1000U);
<> 144:ef7eb2e8f9f7 2868 do
<> 144:ef7eb2e8f9f7 2869 {
<> 144:ef7eb2e8f9f7 2870 if(count-- == 0U)
<> 144:ef7eb2e8f9f7 2871 {
<> 144:ef7eb2e8f9f7 2872 hi2c->PreviousState = I2C_STATE_NONE;
<> 144:ef7eb2e8f9f7 2873 hi2c->State= HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 2874
<> 144:ef7eb2e8f9f7 2875 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2876 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 2877
<> 144:ef7eb2e8f9f7 2878 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2879 }
<> 144:ef7eb2e8f9f7 2880 }
<> 144:ef7eb2e8f9f7 2881 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
<> 144:ef7eb2e8f9f7 2882
<> 144:ef7eb2e8f9f7 2883 /* Process Locked */
<> 144:ef7eb2e8f9f7 2884 __HAL_LOCK(hi2c);
<> 144:ef7eb2e8f9f7 2885
<> 144:ef7eb2e8f9f7 2886 /* Check if the I2C is already enabled */
<> 144:ef7eb2e8f9f7 2887 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
<> 144:ef7eb2e8f9f7 2888 {
<> 144:ef7eb2e8f9f7 2889 /* Enable I2C peripheral */
<> 144:ef7eb2e8f9f7 2890 __HAL_I2C_ENABLE(hi2c);
<> 144:ef7eb2e8f9f7 2891 }
<> 144:ef7eb2e8f9f7 2892
<> 144:ef7eb2e8f9f7 2893 /* Disable Pos */
<> 144:ef7eb2e8f9f7 2894 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
<> 144:ef7eb2e8f9f7 2895
<> 144:ef7eb2e8f9f7 2896 hi2c->State = HAL_I2C_STATE_BUSY_RX;
<> 144:ef7eb2e8f9f7 2897 hi2c->Mode = HAL_I2C_MODE_MEM;
<> 144:ef7eb2e8f9f7 2898 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
<> 144:ef7eb2e8f9f7 2899
<> 144:ef7eb2e8f9f7 2900 /* Prepare transfer parameters */
<> 144:ef7eb2e8f9f7 2901 hi2c->pBuffPtr = pData;
<> 144:ef7eb2e8f9f7 2902 hi2c->XferSize = Size;
<> 144:ef7eb2e8f9f7 2903 hi2c->XferCount = Size;
<> 144:ef7eb2e8f9f7 2904 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
<> 144:ef7eb2e8f9f7 2905 hi2c->Devaddress = DevAddress;
<> 144:ef7eb2e8f9f7 2906 hi2c->Memaddress = MemAddress;
<> 144:ef7eb2e8f9f7 2907 hi2c->MemaddSize = MemAddSize;
<> 144:ef7eb2e8f9f7 2908 hi2c->EventCount = 0U;
<> 144:ef7eb2e8f9f7 2909
<> 144:ef7eb2e8f9f7 2910 /* Enable Acknowledge */
<> 144:ef7eb2e8f9f7 2911 hi2c->Instance->CR1 |= I2C_CR1_ACK;
<> 144:ef7eb2e8f9f7 2912
<> 144:ef7eb2e8f9f7 2913 /* Generate Start */
<> 144:ef7eb2e8f9f7 2914 hi2c->Instance->CR1 |= I2C_CR1_START;
<> 144:ef7eb2e8f9f7 2915
<> 144:ef7eb2e8f9f7 2916 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2917 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 2918
<> 144:ef7eb2e8f9f7 2919 if(hi2c->XferSize > 0U)
<> 144:ef7eb2e8f9f7 2920 {
<> 144:ef7eb2e8f9f7 2921 /* Note : The I2C interrupts must be enabled after unlocking current process
<> 144:ef7eb2e8f9f7 2922 to avoid the risk of I2C interrupt handle execution before current
<> 144:ef7eb2e8f9f7 2923 process unlock */
<> 144:ef7eb2e8f9f7 2924
<> 144:ef7eb2e8f9f7 2925 /* Enable EVT, BUF and ERR interrupt */
<> 144:ef7eb2e8f9f7 2926 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
<> 144:ef7eb2e8f9f7 2927 }
<> 144:ef7eb2e8f9f7 2928 return HAL_OK;
<> 144:ef7eb2e8f9f7 2929 }
<> 144:ef7eb2e8f9f7 2930 else
<> 144:ef7eb2e8f9f7 2931 {
<> 144:ef7eb2e8f9f7 2932 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 2933 }
<> 144:ef7eb2e8f9f7 2934 }
<> 144:ef7eb2e8f9f7 2935
<> 144:ef7eb2e8f9f7 2936 /**
<> 144:ef7eb2e8f9f7 2937 * @brief Write an amount of data in non-blocking mode with DMA to a specific memory address
<> 144:ef7eb2e8f9f7 2938 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 2939 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 2940 * @param DevAddress Target device address
<> 144:ef7eb2e8f9f7 2941 * @param MemAddress Internal memory address
<> 144:ef7eb2e8f9f7 2942 * @param MemAddSize Size of internal memory address
<> 144:ef7eb2e8f9f7 2943 * @param pData Pointer to data buffer
<> 144:ef7eb2e8f9f7 2944 * @param Size Amount of data to be sent
<> 144:ef7eb2e8f9f7 2945 * @retval HAL status
<> 144:ef7eb2e8f9f7 2946 */
<> 144:ef7eb2e8f9f7 2947 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 2948 {
<> 144:ef7eb2e8f9f7 2949 __IO uint32_t count = 0U;
<> 144:ef7eb2e8f9f7 2950
<> 144:ef7eb2e8f9f7 2951 uint32_t tickstart = 0x00U;
<> 144:ef7eb2e8f9f7 2952
<> 144:ef7eb2e8f9f7 2953 /* Init tickstart for timeout management*/
<> 144:ef7eb2e8f9f7 2954 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 2955
<> 144:ef7eb2e8f9f7 2956 /* Check the parameters */
<> 144:ef7eb2e8f9f7 2957 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
<> 144:ef7eb2e8f9f7 2958
<> 144:ef7eb2e8f9f7 2959 if(hi2c->State == HAL_I2C_STATE_READY)
<> 144:ef7eb2e8f9f7 2960 {
<> 144:ef7eb2e8f9f7 2961 /* Wait until BUSY flag is reset */
<> 144:ef7eb2e8f9f7 2962 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock /25U /1000U);
<> 144:ef7eb2e8f9f7 2963 do
<> 144:ef7eb2e8f9f7 2964 {
<> 144:ef7eb2e8f9f7 2965 if(count-- == 0U)
<> 144:ef7eb2e8f9f7 2966 {
<> 144:ef7eb2e8f9f7 2967 hi2c->PreviousState = I2C_STATE_NONE;
<> 144:ef7eb2e8f9f7 2968 hi2c->State= HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 2969
<> 144:ef7eb2e8f9f7 2970 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2971 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 2972
<> 144:ef7eb2e8f9f7 2973 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2974 }
<> 144:ef7eb2e8f9f7 2975 }
<> 144:ef7eb2e8f9f7 2976 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
<> 144:ef7eb2e8f9f7 2977
<> 144:ef7eb2e8f9f7 2978 /* Process Locked */
<> 144:ef7eb2e8f9f7 2979 __HAL_LOCK(hi2c);
<> 144:ef7eb2e8f9f7 2980
<> 144:ef7eb2e8f9f7 2981 /* Check if the I2C is already enabled */
<> 144:ef7eb2e8f9f7 2982 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
<> 144:ef7eb2e8f9f7 2983 {
<> 144:ef7eb2e8f9f7 2984 /* Enable I2C peripheral */
<> 144:ef7eb2e8f9f7 2985 __HAL_I2C_ENABLE(hi2c);
<> 144:ef7eb2e8f9f7 2986 }
<> 144:ef7eb2e8f9f7 2987
<> 144:ef7eb2e8f9f7 2988 /* Disable Pos */
<> 144:ef7eb2e8f9f7 2989 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
<> 144:ef7eb2e8f9f7 2990
<> 144:ef7eb2e8f9f7 2991 hi2c->State = HAL_I2C_STATE_BUSY_TX;
<> 144:ef7eb2e8f9f7 2992 hi2c->Mode = HAL_I2C_MODE_MEM;
<> 144:ef7eb2e8f9f7 2993 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
<> 144:ef7eb2e8f9f7 2994
<> 144:ef7eb2e8f9f7 2995 /* Prepare transfer parameters */
<> 144:ef7eb2e8f9f7 2996 hi2c->pBuffPtr = pData;
<> 144:ef7eb2e8f9f7 2997 hi2c->XferSize = Size;
<> 144:ef7eb2e8f9f7 2998 hi2c->XferCount = Size;
<> 144:ef7eb2e8f9f7 2999 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
<> 144:ef7eb2e8f9f7 3000
<> 144:ef7eb2e8f9f7 3001 if(hi2c->XferSize > 0U)
<> 144:ef7eb2e8f9f7 3002 {
<> 144:ef7eb2e8f9f7 3003 /* Set the I2C DMA transfer complete callback */
<> 144:ef7eb2e8f9f7 3004 hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt;
<> 144:ef7eb2e8f9f7 3005
<> 144:ef7eb2e8f9f7 3006 /* Set the DMA error callback */
<> 144:ef7eb2e8f9f7 3007 hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
<> 144:ef7eb2e8f9f7 3008
<> 144:ef7eb2e8f9f7 3009 /* Set the unused DMA callbacks to NULL */
<> 144:ef7eb2e8f9f7 3010 hi2c->hdmatx->XferHalfCpltCallback = NULL;
<> 144:ef7eb2e8f9f7 3011 hi2c->hdmatx->XferM1CpltCallback = NULL;
<> 144:ef7eb2e8f9f7 3012 hi2c->hdmatx->XferM1HalfCpltCallback = NULL;
<> 144:ef7eb2e8f9f7 3013 hi2c->hdmatx->XferAbortCallback = NULL;
<> 144:ef7eb2e8f9f7 3014
<> 144:ef7eb2e8f9f7 3015 /* Enable the DMA Stream */
<> 144:ef7eb2e8f9f7 3016 HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize);
<> 144:ef7eb2e8f9f7 3017
<> 144:ef7eb2e8f9f7 3018 /* Send Slave Address and Memory Address */
<> 144:ef7eb2e8f9f7 3019 if(I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 3020 {
<> 144:ef7eb2e8f9f7 3021 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
<> 144:ef7eb2e8f9f7 3022 {
<> 144:ef7eb2e8f9f7 3023 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 3024 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 3025 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 3026 }
<> 144:ef7eb2e8f9f7 3027 else
<> 144:ef7eb2e8f9f7 3028 {
<> 144:ef7eb2e8f9f7 3029 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 3030 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 3031 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 3032 }
<> 144:ef7eb2e8f9f7 3033 }
<> 144:ef7eb2e8f9f7 3034
<> 144:ef7eb2e8f9f7 3035 /* Clear ADDR flag */
<> 144:ef7eb2e8f9f7 3036 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
<> 144:ef7eb2e8f9f7 3037
<> 144:ef7eb2e8f9f7 3038 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 3039 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 3040
<> 144:ef7eb2e8f9f7 3041 /* Note : The I2C interrupts must be enabled after unlocking current process
<> 144:ef7eb2e8f9f7 3042 to avoid the risk of I2C interrupt handle execution before current
<> 144:ef7eb2e8f9f7 3043 process unlock */
<> 144:ef7eb2e8f9f7 3044 /* Enable ERR interrupt */
<> 144:ef7eb2e8f9f7 3045 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_ERR);
<> 144:ef7eb2e8f9f7 3046
<> 144:ef7eb2e8f9f7 3047 /* Enable DMA Request */
<> 144:ef7eb2e8f9f7 3048 hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
<> 144:ef7eb2e8f9f7 3049 }
<> 144:ef7eb2e8f9f7 3050 return HAL_OK;
<> 144:ef7eb2e8f9f7 3051 }
<> 144:ef7eb2e8f9f7 3052 else
<> 144:ef7eb2e8f9f7 3053 {
<> 144:ef7eb2e8f9f7 3054 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 3055 }
<> 144:ef7eb2e8f9f7 3056 }
<> 144:ef7eb2e8f9f7 3057
<> 144:ef7eb2e8f9f7 3058 /**
<> 144:ef7eb2e8f9f7 3059 * @brief Reads an amount of data in non-blocking mode with DMA from a specific memory address.
<> 144:ef7eb2e8f9f7 3060 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 3061 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 3062 * @param DevAddress Target device address
<> 144:ef7eb2e8f9f7 3063 * @param MemAddress Internal memory address
<> 144:ef7eb2e8f9f7 3064 * @param MemAddSize Size of internal memory address
<> 144:ef7eb2e8f9f7 3065 * @param pData Pointer to data buffer
<> 144:ef7eb2e8f9f7 3066 * @param Size Amount of data to be read
<> 144:ef7eb2e8f9f7 3067 * @retval HAL status
<> 144:ef7eb2e8f9f7 3068 */
<> 144:ef7eb2e8f9f7 3069 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 3070 {
<> 144:ef7eb2e8f9f7 3071 uint32_t tickstart = 0x00U;
<> 144:ef7eb2e8f9f7 3072
<> 144:ef7eb2e8f9f7 3073 /* Init tickstart for timeout management*/
<> 144:ef7eb2e8f9f7 3074 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 3075
<> 144:ef7eb2e8f9f7 3076 __IO uint32_t count = 0U;
<> 144:ef7eb2e8f9f7 3077
<> 144:ef7eb2e8f9f7 3078 /* Check the parameters */
<> 144:ef7eb2e8f9f7 3079 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
<> 144:ef7eb2e8f9f7 3080
<> 144:ef7eb2e8f9f7 3081 if(hi2c->State == HAL_I2C_STATE_READY)
<> 144:ef7eb2e8f9f7 3082 {
<> 144:ef7eb2e8f9f7 3083 /* Wait until BUSY flag is reset */
<> 144:ef7eb2e8f9f7 3084 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock /25U /1000U);
<> 144:ef7eb2e8f9f7 3085 do
<> 144:ef7eb2e8f9f7 3086 {
<> 144:ef7eb2e8f9f7 3087 if(count-- == 0U)
<> 144:ef7eb2e8f9f7 3088 {
<> 144:ef7eb2e8f9f7 3089 hi2c->PreviousState = I2C_STATE_NONE;
<> 144:ef7eb2e8f9f7 3090 hi2c->State= HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 3091
<> 144:ef7eb2e8f9f7 3092 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 3093 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 3094
<> 144:ef7eb2e8f9f7 3095 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 3096 }
<> 144:ef7eb2e8f9f7 3097 }
<> 144:ef7eb2e8f9f7 3098 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
<> 144:ef7eb2e8f9f7 3099
<> 144:ef7eb2e8f9f7 3100 /* Process Locked */
<> 144:ef7eb2e8f9f7 3101 __HAL_LOCK(hi2c);
<> 144:ef7eb2e8f9f7 3102
<> 144:ef7eb2e8f9f7 3103 /* Check if the I2C is already enabled */
<> 144:ef7eb2e8f9f7 3104 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
<> 144:ef7eb2e8f9f7 3105 {
<> 144:ef7eb2e8f9f7 3106 /* Enable I2C peripheral */
<> 144:ef7eb2e8f9f7 3107 __HAL_I2C_ENABLE(hi2c);
<> 144:ef7eb2e8f9f7 3108 }
<> 144:ef7eb2e8f9f7 3109
<> 144:ef7eb2e8f9f7 3110 /* Disable Pos */
<> 144:ef7eb2e8f9f7 3111 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
<> 144:ef7eb2e8f9f7 3112
<> 144:ef7eb2e8f9f7 3113 hi2c->State = HAL_I2C_STATE_BUSY_RX;
<> 144:ef7eb2e8f9f7 3114 hi2c->Mode = HAL_I2C_MODE_MEM;
<> 144:ef7eb2e8f9f7 3115 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
<> 144:ef7eb2e8f9f7 3116
<> 144:ef7eb2e8f9f7 3117 /* Prepare transfer parameters */
<> 144:ef7eb2e8f9f7 3118 hi2c->pBuffPtr = pData;
<> 144:ef7eb2e8f9f7 3119 hi2c->XferCount = Size;
<> 144:ef7eb2e8f9f7 3120 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
<> 144:ef7eb2e8f9f7 3121 hi2c->XferSize = hi2c->XferCount;
<> 144:ef7eb2e8f9f7 3122
<> 144:ef7eb2e8f9f7 3123 if(hi2c->XferSize > 0U)
<> 144:ef7eb2e8f9f7 3124 {
<> 144:ef7eb2e8f9f7 3125 /* Set the I2C DMA transfer complete callback */
<> 144:ef7eb2e8f9f7 3126 hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt;
<> 144:ef7eb2e8f9f7 3127
<> 144:ef7eb2e8f9f7 3128 /* Set the DMA error callback */
<> 144:ef7eb2e8f9f7 3129 hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
<> 144:ef7eb2e8f9f7 3130
<> 144:ef7eb2e8f9f7 3131 /* Set the unused DMA callbacks to NULL */
<> 144:ef7eb2e8f9f7 3132 hi2c->hdmarx->XferHalfCpltCallback = NULL;
<> 144:ef7eb2e8f9f7 3133 hi2c->hdmarx->XferM1CpltCallback = NULL;
<> 144:ef7eb2e8f9f7 3134 hi2c->hdmarx->XferM1HalfCpltCallback = NULL;
<> 144:ef7eb2e8f9f7 3135 hi2c->hdmarx->XferAbortCallback = NULL;
<> 144:ef7eb2e8f9f7 3136
<> 144:ef7eb2e8f9f7 3137 /* Enable the DMA Stream */
<> 144:ef7eb2e8f9f7 3138 HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize);
<> 144:ef7eb2e8f9f7 3139
<> 144:ef7eb2e8f9f7 3140 /* Send Slave Address and Memory Address */
<> 144:ef7eb2e8f9f7 3141 if(I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 3142 {
<> 144:ef7eb2e8f9f7 3143 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
<> 144:ef7eb2e8f9f7 3144 {
<> 144:ef7eb2e8f9f7 3145 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 3146 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 3147 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 3148 }
<> 144:ef7eb2e8f9f7 3149 else
<> 144:ef7eb2e8f9f7 3150 {
<> 144:ef7eb2e8f9f7 3151 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 3152 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 3153 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 3154 }
<> 144:ef7eb2e8f9f7 3155 }
<> 144:ef7eb2e8f9f7 3156
<> 144:ef7eb2e8f9f7 3157 if(Size == 1U)
<> 144:ef7eb2e8f9f7 3158 {
<> 144:ef7eb2e8f9f7 3159 /* Disable Acknowledge */
<> 144:ef7eb2e8f9f7 3160 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
<> 144:ef7eb2e8f9f7 3161 }
<> 144:ef7eb2e8f9f7 3162 else
<> 144:ef7eb2e8f9f7 3163 {
<> 144:ef7eb2e8f9f7 3164 /* Enable Last DMA bit */
<> 144:ef7eb2e8f9f7 3165 hi2c->Instance->CR2 |= I2C_CR2_LAST;
<> 144:ef7eb2e8f9f7 3166 }
<> 144:ef7eb2e8f9f7 3167
<> 144:ef7eb2e8f9f7 3168 /* Clear ADDR flag */
<> 144:ef7eb2e8f9f7 3169 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
<> 144:ef7eb2e8f9f7 3170
<> 144:ef7eb2e8f9f7 3171 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 3172 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 3173
<> 144:ef7eb2e8f9f7 3174 /* Note : The I2C interrupts must be enabled after unlocking current process
<> 144:ef7eb2e8f9f7 3175 to avoid the risk of I2C interrupt handle execution before current
<> 144:ef7eb2e8f9f7 3176 process unlock */
<> 144:ef7eb2e8f9f7 3177 /* Enable ERR interrupt */
<> 144:ef7eb2e8f9f7 3178 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_ERR);
<> 144:ef7eb2e8f9f7 3179
<> 144:ef7eb2e8f9f7 3180 /* Enable DMA Request */
<> 144:ef7eb2e8f9f7 3181 hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
<> 144:ef7eb2e8f9f7 3182 }
<> 144:ef7eb2e8f9f7 3183 else
<> 144:ef7eb2e8f9f7 3184 {
<> 144:ef7eb2e8f9f7 3185 /* Send Slave Address and Memory Address */
<> 144:ef7eb2e8f9f7 3186 if(I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 3187 {
<> 144:ef7eb2e8f9f7 3188 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
<> 144:ef7eb2e8f9f7 3189 {
<> 144:ef7eb2e8f9f7 3190 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 3191 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 3192 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 3193 }
<> 144:ef7eb2e8f9f7 3194 else
<> 144:ef7eb2e8f9f7 3195 {
<> 144:ef7eb2e8f9f7 3196 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 3197 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 3198 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 3199 }
<> 144:ef7eb2e8f9f7 3200 }
<> 144:ef7eb2e8f9f7 3201
<> 144:ef7eb2e8f9f7 3202 /* Clear ADDR flag */
<> 144:ef7eb2e8f9f7 3203 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
<> 144:ef7eb2e8f9f7 3204
<> 144:ef7eb2e8f9f7 3205 /* Generate Stop */
<> 144:ef7eb2e8f9f7 3206 hi2c->Instance->CR1 |= I2C_CR1_STOP;
<> 144:ef7eb2e8f9f7 3207
<> 144:ef7eb2e8f9f7 3208 hi2c->State = HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 3209
<> 144:ef7eb2e8f9f7 3210 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 3211 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 3212 }
<> 144:ef7eb2e8f9f7 3213
<> 144:ef7eb2e8f9f7 3214 return HAL_OK;
<> 144:ef7eb2e8f9f7 3215 }
<> 144:ef7eb2e8f9f7 3216 else
<> 144:ef7eb2e8f9f7 3217 {
<> 144:ef7eb2e8f9f7 3218 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 3219 }
<> 144:ef7eb2e8f9f7 3220 }
<> 144:ef7eb2e8f9f7 3221
<> 144:ef7eb2e8f9f7 3222 /**
<> 144:ef7eb2e8f9f7 3223 * @brief Checks if target device is ready for communication.
<> 144:ef7eb2e8f9f7 3224 * @note This function is used with Memory devices
<> 144:ef7eb2e8f9f7 3225 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 3226 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 3227 * @param DevAddress Target device address
<> 144:ef7eb2e8f9f7 3228 * @param Trials Number of trials
<> 144:ef7eb2e8f9f7 3229 * @param Timeout Timeout duration
<> 144:ef7eb2e8f9f7 3230 * @retval HAL status
<> 144:ef7eb2e8f9f7 3231 */
<> 144:ef7eb2e8f9f7 3232 HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout)
<> 144:ef7eb2e8f9f7 3233 {
<> 144:ef7eb2e8f9f7 3234 uint32_t tickstart = 0U, tmp1 = 0U, tmp2 = 0U, tmp3 = 0U, I2C_Trials = 1U;
<> 144:ef7eb2e8f9f7 3235
<> 144:ef7eb2e8f9f7 3236 /* Get tick */
<> 144:ef7eb2e8f9f7 3237 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 3238
<> 144:ef7eb2e8f9f7 3239 if(hi2c->State == HAL_I2C_STATE_READY)
<> 144:ef7eb2e8f9f7 3240 {
<> 144:ef7eb2e8f9f7 3241 /* Wait until BUSY flag is reset */
<> 144:ef7eb2e8f9f7 3242 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 3243 {
<> 144:ef7eb2e8f9f7 3244 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 3245 }
<> 144:ef7eb2e8f9f7 3246
<> 144:ef7eb2e8f9f7 3247 /* Process Locked */
<> 144:ef7eb2e8f9f7 3248 __HAL_LOCK(hi2c);
<> 144:ef7eb2e8f9f7 3249
<> 144:ef7eb2e8f9f7 3250 /* Check if the I2C is already enabled */
<> 144:ef7eb2e8f9f7 3251 if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
<> 144:ef7eb2e8f9f7 3252 {
<> 144:ef7eb2e8f9f7 3253 /* Enable I2C peripheral */
<> 144:ef7eb2e8f9f7 3254 __HAL_I2C_ENABLE(hi2c);
<> 144:ef7eb2e8f9f7 3255 }
<> 144:ef7eb2e8f9f7 3256
<> 144:ef7eb2e8f9f7 3257 /* Disable Pos */
<> 144:ef7eb2e8f9f7 3258 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
<> 144:ef7eb2e8f9f7 3259
<> 144:ef7eb2e8f9f7 3260 hi2c->State = HAL_I2C_STATE_BUSY;
<> 144:ef7eb2e8f9f7 3261 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
<> 144:ef7eb2e8f9f7 3262 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
<> 144:ef7eb2e8f9f7 3263
<> 144:ef7eb2e8f9f7 3264 do
<> 144:ef7eb2e8f9f7 3265 {
<> 144:ef7eb2e8f9f7 3266 /* Generate Start */
<> 144:ef7eb2e8f9f7 3267 hi2c->Instance->CR1 |= I2C_CR1_START;
<> 144:ef7eb2e8f9f7 3268
<> 144:ef7eb2e8f9f7 3269 /* Wait until SB flag is set */
<> 144:ef7eb2e8f9f7 3270 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 3271 {
<> 144:ef7eb2e8f9f7 3272 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 3273 }
<> 144:ef7eb2e8f9f7 3274
<> 144:ef7eb2e8f9f7 3275 /* Send slave address */
<> 144:ef7eb2e8f9f7 3276 hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);
<> 144:ef7eb2e8f9f7 3277
<> 144:ef7eb2e8f9f7 3278 /* Wait until ADDR or AF flag are set */
<> 144:ef7eb2e8f9f7 3279 /* Get tick */
<> 144:ef7eb2e8f9f7 3280 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 3281
<> 144:ef7eb2e8f9f7 3282 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR);
<> 144:ef7eb2e8f9f7 3283 tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF);
<> 144:ef7eb2e8f9f7 3284 tmp3 = hi2c->State;
<> 144:ef7eb2e8f9f7 3285 while((tmp1 == RESET) && (tmp2 == RESET) && (tmp3 != HAL_I2C_STATE_TIMEOUT))
<> 144:ef7eb2e8f9f7 3286 {
<> 144:ef7eb2e8f9f7 3287 if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout))
<> 144:ef7eb2e8f9f7 3288 {
<> 144:ef7eb2e8f9f7 3289 hi2c->State = HAL_I2C_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 3290 }
<> 144:ef7eb2e8f9f7 3291 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR);
<> 144:ef7eb2e8f9f7 3292 tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF);
<> 144:ef7eb2e8f9f7 3293 tmp3 = hi2c->State;
<> 144:ef7eb2e8f9f7 3294 }
<> 144:ef7eb2e8f9f7 3295
<> 144:ef7eb2e8f9f7 3296 hi2c->State = HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 3297
<> 144:ef7eb2e8f9f7 3298 /* Check if the ADDR flag has been set */
<> 144:ef7eb2e8f9f7 3299 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR) == SET)
<> 144:ef7eb2e8f9f7 3300 {
<> 144:ef7eb2e8f9f7 3301 /* Generate Stop */
<> 144:ef7eb2e8f9f7 3302 hi2c->Instance->CR1 |= I2C_CR1_STOP;
<> 144:ef7eb2e8f9f7 3303
<> 144:ef7eb2e8f9f7 3304 /* Clear ADDR Flag */
<> 144:ef7eb2e8f9f7 3305 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
<> 144:ef7eb2e8f9f7 3306
<> 144:ef7eb2e8f9f7 3307 /* Wait until BUSY flag is reset */
<> 144:ef7eb2e8f9f7 3308 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 3309 {
<> 144:ef7eb2e8f9f7 3310 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 3311 }
<> 144:ef7eb2e8f9f7 3312
<> 144:ef7eb2e8f9f7 3313 hi2c->State = HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 3314
<> 144:ef7eb2e8f9f7 3315 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 3316 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 3317
<> 144:ef7eb2e8f9f7 3318 return HAL_OK;
<> 144:ef7eb2e8f9f7 3319 }
<> 144:ef7eb2e8f9f7 3320 else
<> 144:ef7eb2e8f9f7 3321 {
<> 144:ef7eb2e8f9f7 3322 /* Generate Stop */
<> 144:ef7eb2e8f9f7 3323 hi2c->Instance->CR1 |= I2C_CR1_STOP;
<> 144:ef7eb2e8f9f7 3324
<> 144:ef7eb2e8f9f7 3325 /* Clear AF Flag */
<> 144:ef7eb2e8f9f7 3326 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
<> 144:ef7eb2e8f9f7 3327
<> 144:ef7eb2e8f9f7 3328 /* Wait until BUSY flag is reset */
<> 144:ef7eb2e8f9f7 3329 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 3330 {
<> 144:ef7eb2e8f9f7 3331 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 3332 }
<> 144:ef7eb2e8f9f7 3333 }
<> 144:ef7eb2e8f9f7 3334 }while(I2C_Trials++ < Trials);
<> 144:ef7eb2e8f9f7 3335
<> 144:ef7eb2e8f9f7 3336 hi2c->State = HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 3337
<> 144:ef7eb2e8f9f7 3338 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 3339 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 3340
<> 144:ef7eb2e8f9f7 3341 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 3342 }
<> 144:ef7eb2e8f9f7 3343 else
<> 144:ef7eb2e8f9f7 3344 {
<> 144:ef7eb2e8f9f7 3345 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 3346 }
<> 144:ef7eb2e8f9f7 3347 }
<> 144:ef7eb2e8f9f7 3348
<> 144:ef7eb2e8f9f7 3349 /**
<> 144:ef7eb2e8f9f7 3350 * @brief This function handles I2C event interrupt request.
<> 144:ef7eb2e8f9f7 3351 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 3352 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 3353 * @retval None
<> 144:ef7eb2e8f9f7 3354 */
<> 144:ef7eb2e8f9f7 3355 void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 3356 {
<> 144:ef7eb2e8f9f7 3357 uint32_t sr2itflags = READ_REG(hi2c->Instance->SR2);
<> 144:ef7eb2e8f9f7 3358 uint32_t sr1itflags = READ_REG(hi2c->Instance->SR1);
<> 144:ef7eb2e8f9f7 3359 uint32_t itsources = READ_REG(hi2c->Instance->CR2);
<> 144:ef7eb2e8f9f7 3360
<> 144:ef7eb2e8f9f7 3361 uint32_t CurrentMode = hi2c->Mode;
<> 144:ef7eb2e8f9f7 3362
<> 144:ef7eb2e8f9f7 3363 /* Master or Memory mode selected */
<> 144:ef7eb2e8f9f7 3364 if((CurrentMode == HAL_I2C_MODE_MASTER) || (CurrentMode == HAL_I2C_MODE_MEM))
<> 144:ef7eb2e8f9f7 3365 {
<> 144:ef7eb2e8f9f7 3366 /* SB Set ----------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 3367 if(((sr1itflags & I2C_FLAG_SB) != RESET) && ((itsources & I2C_IT_EVT) != RESET))
<> 144:ef7eb2e8f9f7 3368 {
<> 144:ef7eb2e8f9f7 3369 I2C_Master_SB(hi2c);
<> 144:ef7eb2e8f9f7 3370 }
<> 144:ef7eb2e8f9f7 3371 /* ADD10 Set -------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 3372 else if(((sr1itflags & I2C_FLAG_ADD10) != RESET) && ((itsources & I2C_IT_EVT) != RESET))
<> 144:ef7eb2e8f9f7 3373 {
<> 144:ef7eb2e8f9f7 3374 I2C_Master_ADD10(hi2c);
<> 144:ef7eb2e8f9f7 3375 }
<> 144:ef7eb2e8f9f7 3376 /* ADDR Set --------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 3377 else if(((sr1itflags & I2C_FLAG_ADDR) != RESET) && ((itsources & I2C_IT_EVT) != RESET))
<> 144:ef7eb2e8f9f7 3378 {
<> 144:ef7eb2e8f9f7 3379 I2C_Master_ADDR(hi2c);
<> 144:ef7eb2e8f9f7 3380 }
<> 144:ef7eb2e8f9f7 3381
<> 144:ef7eb2e8f9f7 3382 /* I2C in mode Transmitter -----------------------------------------------*/
<> 144:ef7eb2e8f9f7 3383 if((sr2itflags & I2C_FLAG_TRA) != RESET)
<> 144:ef7eb2e8f9f7 3384 {
<> 144:ef7eb2e8f9f7 3385 /* TXE set and BTF reset -----------------------------------------------*/
<> 144:ef7eb2e8f9f7 3386 if(((sr1itflags & I2C_FLAG_TXE) != RESET) && ((itsources & I2C_IT_BUF) != RESET) && ((sr1itflags & I2C_FLAG_BTF) == RESET))
<> 144:ef7eb2e8f9f7 3387 {
<> 144:ef7eb2e8f9f7 3388 I2C_MasterTransmit_TXE(hi2c);
<> 144:ef7eb2e8f9f7 3389 }
<> 144:ef7eb2e8f9f7 3390 /* BTF set -------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 3391 else if(((sr1itflags & I2C_FLAG_BTF) != RESET) && ((itsources & I2C_IT_EVT) != RESET))
<> 144:ef7eb2e8f9f7 3392 {
<> 144:ef7eb2e8f9f7 3393 I2C_MasterTransmit_BTF(hi2c);
<> 144:ef7eb2e8f9f7 3394 }
<> 144:ef7eb2e8f9f7 3395 }
<> 144:ef7eb2e8f9f7 3396 /* I2C in mode Receiver --------------------------------------------------*/
<> 144:ef7eb2e8f9f7 3397 else
<> 144:ef7eb2e8f9f7 3398 {
<> 144:ef7eb2e8f9f7 3399 /* RXNE set and BTF reset -----------------------------------------------*/
<> 144:ef7eb2e8f9f7 3400 if(((sr1itflags & I2C_FLAG_RXNE) != RESET) && ((itsources & I2C_IT_BUF) != RESET) && ((sr1itflags & I2C_FLAG_BTF) == RESET))
<> 144:ef7eb2e8f9f7 3401 {
<> 144:ef7eb2e8f9f7 3402 I2C_MasterReceive_RXNE(hi2c);
<> 144:ef7eb2e8f9f7 3403 }
<> 144:ef7eb2e8f9f7 3404 /* BTF set -------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 3405 else if(((sr1itflags & I2C_FLAG_BTF) != RESET) && ((itsources & I2C_IT_EVT) != RESET))
<> 144:ef7eb2e8f9f7 3406 {
<> 144:ef7eb2e8f9f7 3407 I2C_MasterReceive_BTF(hi2c);
<> 144:ef7eb2e8f9f7 3408 }
<> 144:ef7eb2e8f9f7 3409 }
<> 144:ef7eb2e8f9f7 3410 }
<> 144:ef7eb2e8f9f7 3411 /* Slave mode selected */
<> 144:ef7eb2e8f9f7 3412 else
<> 144:ef7eb2e8f9f7 3413 {
<> 144:ef7eb2e8f9f7 3414 /* ADDR set --------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 3415 if(((sr1itflags & I2C_FLAG_ADDR) != RESET) && ((itsources & I2C_IT_EVT) != RESET))
<> 144:ef7eb2e8f9f7 3416 {
<> 144:ef7eb2e8f9f7 3417 I2C_Slave_ADDR(hi2c);
<> 144:ef7eb2e8f9f7 3418 }
<> 144:ef7eb2e8f9f7 3419 /* STOPF set --------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 3420 else if(((sr1itflags & I2C_FLAG_STOPF) != RESET) && ((itsources & I2C_IT_EVT) != RESET))
<> 144:ef7eb2e8f9f7 3421 {
<> 144:ef7eb2e8f9f7 3422 I2C_Slave_STOPF(hi2c);
<> 144:ef7eb2e8f9f7 3423 }
<> 144:ef7eb2e8f9f7 3424 /* I2C in mode Transmitter -----------------------------------------------*/
<> 144:ef7eb2e8f9f7 3425 else if((sr2itflags & I2C_FLAG_TRA) != RESET)
<> 144:ef7eb2e8f9f7 3426 {
<> 144:ef7eb2e8f9f7 3427 /* TXE set and BTF reset -----------------------------------------------*/
<> 144:ef7eb2e8f9f7 3428 if(((sr1itflags & I2C_FLAG_TXE) != RESET) && ((itsources & I2C_IT_BUF) != RESET) && ((sr1itflags & I2C_FLAG_BTF) == RESET))
<> 144:ef7eb2e8f9f7 3429 {
<> 144:ef7eb2e8f9f7 3430 I2C_SlaveTransmit_TXE(hi2c);
<> 144:ef7eb2e8f9f7 3431 }
<> 144:ef7eb2e8f9f7 3432 /* BTF set -------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 3433 else if(((sr1itflags & I2C_FLAG_BTF) != RESET) && ((itsources & I2C_IT_EVT) != RESET))
<> 144:ef7eb2e8f9f7 3434 {
<> 144:ef7eb2e8f9f7 3435 I2C_SlaveTransmit_BTF(hi2c);
<> 144:ef7eb2e8f9f7 3436 }
<> 144:ef7eb2e8f9f7 3437 }
<> 144:ef7eb2e8f9f7 3438 /* I2C in mode Receiver --------------------------------------------------*/
<> 144:ef7eb2e8f9f7 3439 else
<> 144:ef7eb2e8f9f7 3440 {
<> 144:ef7eb2e8f9f7 3441 /* RXNE set and BTF reset ----------------------------------------------*/
<> 144:ef7eb2e8f9f7 3442 if(((sr1itflags & I2C_FLAG_RXNE) != RESET) && ((itsources & I2C_IT_BUF) != RESET) && ((sr1itflags & I2C_FLAG_BTF) == RESET))
<> 144:ef7eb2e8f9f7 3443 {
<> 144:ef7eb2e8f9f7 3444 I2C_SlaveReceive_RXNE(hi2c);
<> 144:ef7eb2e8f9f7 3445 }
<> 144:ef7eb2e8f9f7 3446 /* BTF set -------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 3447 else if(((sr1itflags & I2C_FLAG_BTF) != RESET) && ((itsources & I2C_IT_EVT) != RESET))
<> 144:ef7eb2e8f9f7 3448 {
<> 144:ef7eb2e8f9f7 3449 I2C_SlaveReceive_BTF(hi2c);
<> 144:ef7eb2e8f9f7 3450 }
<> 144:ef7eb2e8f9f7 3451 }
<> 144:ef7eb2e8f9f7 3452 }
<> 144:ef7eb2e8f9f7 3453 }
<> 144:ef7eb2e8f9f7 3454
<> 144:ef7eb2e8f9f7 3455 /**
<> 144:ef7eb2e8f9f7 3456 * @brief This function handles I2C error interrupt request.
<> 144:ef7eb2e8f9f7 3457 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 3458 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 3459 * @retval None
<> 144:ef7eb2e8f9f7 3460 */
<> 144:ef7eb2e8f9f7 3461 void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 3462 {
<> 144:ef7eb2e8f9f7 3463 uint32_t tmp1 = 0U, tmp2 = 0U, tmp3 = 0U, tmp4 = 0U;
<> 144:ef7eb2e8f9f7 3464 uint32_t sr1itflags = READ_REG(hi2c->Instance->SR1);
<> 144:ef7eb2e8f9f7 3465 uint32_t itsources = READ_REG(hi2c->Instance->CR2);
<> 144:ef7eb2e8f9f7 3466
<> 144:ef7eb2e8f9f7 3467 /* I2C Bus error interrupt occurred ----------------------------------------*/
<> 144:ef7eb2e8f9f7 3468 if(((sr1itflags & I2C_FLAG_BERR) != RESET) && ((itsources & I2C_IT_ERR) != RESET))
<> 144:ef7eb2e8f9f7 3469 {
<> 144:ef7eb2e8f9f7 3470 hi2c->ErrorCode |= HAL_I2C_ERROR_BERR;
<> 144:ef7eb2e8f9f7 3471
<> 144:ef7eb2e8f9f7 3472 /* Clear BERR flag */
<> 144:ef7eb2e8f9f7 3473 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_BERR);
<> 144:ef7eb2e8f9f7 3474 }
<> 144:ef7eb2e8f9f7 3475
<> 144:ef7eb2e8f9f7 3476 /* I2C Arbitration Loss error interrupt occurred ---------------------------*/
<> 144:ef7eb2e8f9f7 3477 if(((sr1itflags & I2C_FLAG_ARLO) != RESET) && ((itsources & I2C_IT_ERR) != RESET))
<> 144:ef7eb2e8f9f7 3478 {
<> 144:ef7eb2e8f9f7 3479 hi2c->ErrorCode |= HAL_I2C_ERROR_ARLO;
<> 144:ef7eb2e8f9f7 3480
<> 144:ef7eb2e8f9f7 3481 /* Clear ARLO flag */
<> 144:ef7eb2e8f9f7 3482 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ARLO);
<> 144:ef7eb2e8f9f7 3483 }
<> 144:ef7eb2e8f9f7 3484
<> 144:ef7eb2e8f9f7 3485 /* I2C Acknowledge failure error interrupt occurred ------------------------*/
<> 144:ef7eb2e8f9f7 3486 if(((sr1itflags & I2C_FLAG_AF) != RESET) && ((itsources & I2C_IT_ERR) != RESET))
<> 144:ef7eb2e8f9f7 3487 {
<> 144:ef7eb2e8f9f7 3488 tmp1 = hi2c->Mode;
<> 144:ef7eb2e8f9f7 3489 tmp2 = hi2c->XferCount;
<> 144:ef7eb2e8f9f7 3490 tmp3 = hi2c->State;
<> 144:ef7eb2e8f9f7 3491 tmp4 = hi2c->PreviousState;
<> 144:ef7eb2e8f9f7 3492 if((tmp1 == HAL_I2C_MODE_SLAVE) && (tmp2 == 0U) && \
<> 144:ef7eb2e8f9f7 3493 ((tmp3 == HAL_I2C_STATE_BUSY_TX) || (tmp3 == HAL_I2C_STATE_BUSY_TX_LISTEN) || \
<> 144:ef7eb2e8f9f7 3494 ((tmp3 == HAL_I2C_STATE_LISTEN) && (tmp4 == I2C_STATE_SLAVE_BUSY_TX))))
<> 144:ef7eb2e8f9f7 3495 {
<> 144:ef7eb2e8f9f7 3496 I2C_Slave_AF(hi2c);
<> 144:ef7eb2e8f9f7 3497 }
<> 144:ef7eb2e8f9f7 3498 else
<> 144:ef7eb2e8f9f7 3499 {
<> 144:ef7eb2e8f9f7 3500 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
<> 144:ef7eb2e8f9f7 3501
<> 144:ef7eb2e8f9f7 3502 /* Do not generate a STOP in case of Slave receive non acknowledge during transfer (mean not at the end of transfer) */
<> 144:ef7eb2e8f9f7 3503 if(hi2c->Mode == HAL_I2C_MODE_MASTER)
<> 144:ef7eb2e8f9f7 3504 {
<> 144:ef7eb2e8f9f7 3505 /* Generate Stop */
<> 144:ef7eb2e8f9f7 3506 SET_BIT(hi2c->Instance->CR1,I2C_CR1_STOP);
<> 144:ef7eb2e8f9f7 3507 }
<> 144:ef7eb2e8f9f7 3508
<> 144:ef7eb2e8f9f7 3509 /* Clear AF flag */
<> 144:ef7eb2e8f9f7 3510 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
<> 144:ef7eb2e8f9f7 3511 }
<> 144:ef7eb2e8f9f7 3512 }
<> 144:ef7eb2e8f9f7 3513
<> 144:ef7eb2e8f9f7 3514 /* I2C Over-Run/Under-Run interrupt occurred -------------------------------*/
<> 144:ef7eb2e8f9f7 3515 if(((sr1itflags & I2C_FLAG_OVR) != RESET) && ((itsources & I2C_IT_ERR) != RESET))
<> 144:ef7eb2e8f9f7 3516 {
<> 144:ef7eb2e8f9f7 3517 hi2c->ErrorCode |= HAL_I2C_ERROR_OVR;
<> 144:ef7eb2e8f9f7 3518 /* Clear OVR flag */
<> 144:ef7eb2e8f9f7 3519 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_OVR);
<> 144:ef7eb2e8f9f7 3520 }
<> 144:ef7eb2e8f9f7 3521
<> 144:ef7eb2e8f9f7 3522 /* Call the Error Callback in case of Error detected -----------------------*/
<> 144:ef7eb2e8f9f7 3523 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
<> 144:ef7eb2e8f9f7 3524 {
<> 144:ef7eb2e8f9f7 3525 I2C_ITError(hi2c);
<> 144:ef7eb2e8f9f7 3526 }
<> 144:ef7eb2e8f9f7 3527 }
<> 144:ef7eb2e8f9f7 3528
<> 144:ef7eb2e8f9f7 3529 /**
<> 144:ef7eb2e8f9f7 3530 * @brief Master Tx Transfer completed callback.
<> 144:ef7eb2e8f9f7 3531 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 3532 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 3533 * @retval None
<> 144:ef7eb2e8f9f7 3534 */
<> 144:ef7eb2e8f9f7 3535 __weak void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 3536 {
<> 144:ef7eb2e8f9f7 3537 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 3538 UNUSED(hi2c);
<> 144:ef7eb2e8f9f7 3539
<> 144:ef7eb2e8f9f7 3540 /* NOTE : This function should not be modified, when the callback is needed,
<> 144:ef7eb2e8f9f7 3541 the HAL_I2C_MasterTxCpltCallback can be implemented in the user file
<> 144:ef7eb2e8f9f7 3542 */
<> 144:ef7eb2e8f9f7 3543 }
<> 144:ef7eb2e8f9f7 3544
<> 144:ef7eb2e8f9f7 3545 /**
<> 144:ef7eb2e8f9f7 3546 * @brief Master Rx Transfer completed callback.
<> 144:ef7eb2e8f9f7 3547 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 3548 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 3549 * @retval None
<> 144:ef7eb2e8f9f7 3550 */
<> 144:ef7eb2e8f9f7 3551 __weak void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 3552 {
<> 144:ef7eb2e8f9f7 3553 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 3554 UNUSED(hi2c);
<> 144:ef7eb2e8f9f7 3555
<> 144:ef7eb2e8f9f7 3556 /* NOTE : This function should not be modified, when the callback is needed,
<> 144:ef7eb2e8f9f7 3557 the HAL_I2C_MasterRxCpltCallback can be implemented in the user file
<> 144:ef7eb2e8f9f7 3558 */
<> 144:ef7eb2e8f9f7 3559 }
<> 144:ef7eb2e8f9f7 3560
<> 144:ef7eb2e8f9f7 3561 /** @brief Slave Tx Transfer completed callback.
<> 144:ef7eb2e8f9f7 3562 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 3563 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 3564 * @retval None
<> 144:ef7eb2e8f9f7 3565 */
<> 144:ef7eb2e8f9f7 3566 __weak void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 3567 {
<> 144:ef7eb2e8f9f7 3568 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 3569 UNUSED(hi2c);
<> 144:ef7eb2e8f9f7 3570
<> 144:ef7eb2e8f9f7 3571 /* NOTE : This function should not be modified, when the callback is needed,
<> 144:ef7eb2e8f9f7 3572 the HAL_I2C_SlaveTxCpltCallback can be implemented in the user file
<> 144:ef7eb2e8f9f7 3573 */
<> 144:ef7eb2e8f9f7 3574 }
<> 144:ef7eb2e8f9f7 3575
<> 144:ef7eb2e8f9f7 3576 /**
<> 144:ef7eb2e8f9f7 3577 * @brief Slave Rx Transfer completed callback.
<> 144:ef7eb2e8f9f7 3578 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 3579 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 3580 * @retval None
<> 144:ef7eb2e8f9f7 3581 */
<> 144:ef7eb2e8f9f7 3582 __weak void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 3583 {
<> 144:ef7eb2e8f9f7 3584 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 3585 UNUSED(hi2c);
<> 144:ef7eb2e8f9f7 3586
<> 144:ef7eb2e8f9f7 3587 /* NOTE : This function should not be modified, when the callback is needed,
<> 144:ef7eb2e8f9f7 3588 the HAL_I2C_SlaveRxCpltCallback can be implemented in the user file
<> 144:ef7eb2e8f9f7 3589 */
<> 144:ef7eb2e8f9f7 3590 }
<> 144:ef7eb2e8f9f7 3591
<> 144:ef7eb2e8f9f7 3592 /**
<> 144:ef7eb2e8f9f7 3593 * @brief Slave Address Match callback.
<> 144:ef7eb2e8f9f7 3594 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 3595 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 3596 * @param TransferDirection Master request Transfer Direction (Write/Read), value of @ref I2C_XferOptions_definition
<> 144:ef7eb2e8f9f7 3597 * @param AddrMatchCode Address Match Code
<> 144:ef7eb2e8f9f7 3598 * @retval None
<> 144:ef7eb2e8f9f7 3599 */
<> 144:ef7eb2e8f9f7 3600 __weak void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode)
<> 144:ef7eb2e8f9f7 3601 {
<> 144:ef7eb2e8f9f7 3602 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 3603 UNUSED(hi2c);
<> 144:ef7eb2e8f9f7 3604 UNUSED(TransferDirection);
<> 144:ef7eb2e8f9f7 3605 UNUSED(AddrMatchCode);
<> 144:ef7eb2e8f9f7 3606
<> 144:ef7eb2e8f9f7 3607 /* NOTE : This function should not be modified, when the callback is needed,
<> 144:ef7eb2e8f9f7 3608 the HAL_I2C_AddrCallback can be implemented in the user file
<> 144:ef7eb2e8f9f7 3609 */
<> 144:ef7eb2e8f9f7 3610 }
<> 144:ef7eb2e8f9f7 3611
<> 144:ef7eb2e8f9f7 3612 /**
<> 144:ef7eb2e8f9f7 3613 * @brief Listen Complete callback.
<> 144:ef7eb2e8f9f7 3614 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 3615 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 3616 * @retval None
<> 144:ef7eb2e8f9f7 3617 */
<> 144:ef7eb2e8f9f7 3618 __weak void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 3619 {
<> 144:ef7eb2e8f9f7 3620 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 3621 UNUSED(hi2c);
<> 144:ef7eb2e8f9f7 3622
<> 144:ef7eb2e8f9f7 3623 /* NOTE : This function should not be modified, when the callback is needed,
<> 144:ef7eb2e8f9f7 3624 the HAL_I2C_ListenCpltCallback can be implemented in the user file
<> 144:ef7eb2e8f9f7 3625 */
<> 144:ef7eb2e8f9f7 3626 }
<> 144:ef7eb2e8f9f7 3627
<> 144:ef7eb2e8f9f7 3628 /**
<> 144:ef7eb2e8f9f7 3629 * @brief Memory Tx Transfer completed callback.
<> 144:ef7eb2e8f9f7 3630 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 3631 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 3632 * @retval None
<> 144:ef7eb2e8f9f7 3633 */
<> 144:ef7eb2e8f9f7 3634 __weak void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 3635 {
<> 144:ef7eb2e8f9f7 3636 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 3637 UNUSED(hi2c);
<> 144:ef7eb2e8f9f7 3638
<> 144:ef7eb2e8f9f7 3639 /* NOTE : This function should not be modified, when the callback is needed,
<> 144:ef7eb2e8f9f7 3640 the HAL_I2C_MemTxCpltCallback can be implemented in the user file
<> 144:ef7eb2e8f9f7 3641 */
<> 144:ef7eb2e8f9f7 3642 }
<> 144:ef7eb2e8f9f7 3643
<> 144:ef7eb2e8f9f7 3644 /**
<> 144:ef7eb2e8f9f7 3645 * @brief Memory Rx Transfer completed callback.
<> 144:ef7eb2e8f9f7 3646 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 3647 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 3648 * @retval None
<> 144:ef7eb2e8f9f7 3649 */
<> 144:ef7eb2e8f9f7 3650 __weak void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 3651 {
<> 144:ef7eb2e8f9f7 3652 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 3653 UNUSED(hi2c);
<> 144:ef7eb2e8f9f7 3654
<> 144:ef7eb2e8f9f7 3655 /* NOTE : This function should not be modified, when the callback is needed,
<> 144:ef7eb2e8f9f7 3656 the HAL_I2C_MemRxCpltCallback can be implemented in the user file
<> 144:ef7eb2e8f9f7 3657 */
<> 144:ef7eb2e8f9f7 3658 }
<> 144:ef7eb2e8f9f7 3659
<> 144:ef7eb2e8f9f7 3660 /**
<> 144:ef7eb2e8f9f7 3661 * @brief I2C error callback.
<> 144:ef7eb2e8f9f7 3662 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 3663 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 3664 * @retval None
<> 144:ef7eb2e8f9f7 3665 */
<> 144:ef7eb2e8f9f7 3666 __weak void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 3667 {
<> 144:ef7eb2e8f9f7 3668 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 3669 UNUSED(hi2c);
<> 144:ef7eb2e8f9f7 3670
<> 144:ef7eb2e8f9f7 3671 /* NOTE : This function should not be modified, when the callback is needed,
<> 144:ef7eb2e8f9f7 3672 the HAL_I2C_ErrorCallback can be implemented in the user file
<> 144:ef7eb2e8f9f7 3673 */
<> 144:ef7eb2e8f9f7 3674 }
<> 144:ef7eb2e8f9f7 3675
<> 144:ef7eb2e8f9f7 3676 /**
<> 144:ef7eb2e8f9f7 3677 * @brief I2C abort callback.
<> 144:ef7eb2e8f9f7 3678 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 3679 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 3680 * @retval None
<> 144:ef7eb2e8f9f7 3681 */
<> 144:ef7eb2e8f9f7 3682 __weak void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 3683 {
<> 144:ef7eb2e8f9f7 3684 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 3685 UNUSED(hi2c);
<> 144:ef7eb2e8f9f7 3686
<> 144:ef7eb2e8f9f7 3687 /* NOTE : This function should not be modified, when the callback is needed,
<> 144:ef7eb2e8f9f7 3688 the HAL_I2C_AbortCpltCallback could be implemented in the user file
<> 144:ef7eb2e8f9f7 3689 */
<> 144:ef7eb2e8f9f7 3690 }
<> 144:ef7eb2e8f9f7 3691
<> 144:ef7eb2e8f9f7 3692 /**
<> 144:ef7eb2e8f9f7 3693 * @}
<> 144:ef7eb2e8f9f7 3694 */
<> 144:ef7eb2e8f9f7 3695
<> 144:ef7eb2e8f9f7 3696 /** @defgroup I2C_Exported_Functions_Group3 Peripheral State, Mode and Error functions
<> 144:ef7eb2e8f9f7 3697 * @brief Peripheral State and Errors functions
<> 144:ef7eb2e8f9f7 3698 *
<> 144:ef7eb2e8f9f7 3699 @verbatim
<> 144:ef7eb2e8f9f7 3700 ===============================================================================
<> 144:ef7eb2e8f9f7 3701 ##### Peripheral State, Mode and Error functions #####
<> 144:ef7eb2e8f9f7 3702 ===============================================================================
<> 144:ef7eb2e8f9f7 3703 [..]
<> 144:ef7eb2e8f9f7 3704 This subsection permits to get in run-time the status of the peripheral
<> 144:ef7eb2e8f9f7 3705 and the data flow.
<> 144:ef7eb2e8f9f7 3706
<> 144:ef7eb2e8f9f7 3707 @endverbatim
<> 144:ef7eb2e8f9f7 3708 * @{
<> 144:ef7eb2e8f9f7 3709 */
<> 144:ef7eb2e8f9f7 3710
<> 144:ef7eb2e8f9f7 3711 /**
<> 144:ef7eb2e8f9f7 3712 * @brief Return the I2C handle state.
<> 144:ef7eb2e8f9f7 3713 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 3714 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 3715 * @retval HAL state
<> 144:ef7eb2e8f9f7 3716 */
<> 144:ef7eb2e8f9f7 3717 HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 3718 {
<> 144:ef7eb2e8f9f7 3719 /* Return I2C handle state */
<> 144:ef7eb2e8f9f7 3720 return hi2c->State;
<> 144:ef7eb2e8f9f7 3721 }
<> 144:ef7eb2e8f9f7 3722
<> 144:ef7eb2e8f9f7 3723 /**
<> 144:ef7eb2e8f9f7 3724 * @brief Return the I2C Master, Slave, Memory or no mode.
<> 144:ef7eb2e8f9f7 3725 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 3726 * the configuration information for I2C module
<> 144:ef7eb2e8f9f7 3727 * @retval HAL mode
<> 144:ef7eb2e8f9f7 3728 */
<> 144:ef7eb2e8f9f7 3729 HAL_I2C_ModeTypeDef HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 3730 {
<> 144:ef7eb2e8f9f7 3731 return hi2c->Mode;
<> 144:ef7eb2e8f9f7 3732 }
<> 144:ef7eb2e8f9f7 3733
<> 144:ef7eb2e8f9f7 3734 /**
<> 144:ef7eb2e8f9f7 3735 * @brief Return the I2C error code
<> 144:ef7eb2e8f9f7 3736 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 3737 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 3738 * @retval I2C Error Code
<> 144:ef7eb2e8f9f7 3739 */
<> 144:ef7eb2e8f9f7 3740 uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 3741 {
<> 144:ef7eb2e8f9f7 3742 return hi2c->ErrorCode;
<> 144:ef7eb2e8f9f7 3743 }
<> 144:ef7eb2e8f9f7 3744
<> 144:ef7eb2e8f9f7 3745 /**
<> 144:ef7eb2e8f9f7 3746 * @}
<> 144:ef7eb2e8f9f7 3747 */
<> 144:ef7eb2e8f9f7 3748
<> 144:ef7eb2e8f9f7 3749 /**
<> 144:ef7eb2e8f9f7 3750 * @brief Handle TXE flag for Master
<> 144:ef7eb2e8f9f7 3751 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 3752 * the configuration information for I2C module
<> 144:ef7eb2e8f9f7 3753 * @retval HAL status
<> 144:ef7eb2e8f9f7 3754 */
<> 144:ef7eb2e8f9f7 3755 static HAL_StatusTypeDef I2C_MasterTransmit_TXE(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 3756 {
<> 144:ef7eb2e8f9f7 3757 /* Declaration of temporary variables to prevent undefined behavior of volatile usage */
<> 144:ef7eb2e8f9f7 3758 uint32_t CurrentState = hi2c->State;
<> 144:ef7eb2e8f9f7 3759 uint32_t CurrentMode = hi2c->Mode;
<> 144:ef7eb2e8f9f7 3760 uint32_t CurrentXferOptions = hi2c->XferOptions;
<> 144:ef7eb2e8f9f7 3761
<> 144:ef7eb2e8f9f7 3762 if((hi2c->XferSize == 0U) && (CurrentState == HAL_I2C_STATE_BUSY_TX))
<> 144:ef7eb2e8f9f7 3763 {
<> 144:ef7eb2e8f9f7 3764 /* Call TxCpltCallback() directly if no stop mode is set */
<> 144:ef7eb2e8f9f7 3765 if((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) && (CurrentXferOptions != I2C_NO_OPTION_FRAME))
<> 144:ef7eb2e8f9f7 3766 {
<> 144:ef7eb2e8f9f7 3767 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
<> 144:ef7eb2e8f9f7 3768
<> 144:ef7eb2e8f9f7 3769 hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX;
<> 144:ef7eb2e8f9f7 3770 hi2c->Mode = HAL_I2C_MODE_NONE;
<> 144:ef7eb2e8f9f7 3771 hi2c->State = HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 3772
<> 144:ef7eb2e8f9f7 3773 HAL_I2C_MasterTxCpltCallback(hi2c);
<> 144:ef7eb2e8f9f7 3774 }
<> 144:ef7eb2e8f9f7 3775 else /* Generate Stop condition then Call TxCpltCallback() */
<> 144:ef7eb2e8f9f7 3776 {
<> 144:ef7eb2e8f9f7 3777 /* Disable EVT, BUF and ERR interrupt */
<> 144:ef7eb2e8f9f7 3778 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
<> 144:ef7eb2e8f9f7 3779
<> 144:ef7eb2e8f9f7 3780 /* Generate Stop */
<> 144:ef7eb2e8f9f7 3781 hi2c->Instance->CR1 |= I2C_CR1_STOP;
<> 144:ef7eb2e8f9f7 3782
<> 144:ef7eb2e8f9f7 3783 hi2c->PreviousState = I2C_STATE_NONE;
<> 144:ef7eb2e8f9f7 3784 hi2c->State = HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 3785
<> 144:ef7eb2e8f9f7 3786 if(hi2c->Mode == HAL_I2C_MODE_MEM)
<> 144:ef7eb2e8f9f7 3787 {
<> 144:ef7eb2e8f9f7 3788 hi2c->Mode = HAL_I2C_MODE_NONE;
<> 144:ef7eb2e8f9f7 3789 HAL_I2C_MemTxCpltCallback(hi2c);
<> 144:ef7eb2e8f9f7 3790 }
<> 144:ef7eb2e8f9f7 3791 else
<> 144:ef7eb2e8f9f7 3792 {
<> 144:ef7eb2e8f9f7 3793 hi2c->Mode = HAL_I2C_MODE_NONE;
<> 144:ef7eb2e8f9f7 3794 HAL_I2C_MasterTxCpltCallback(hi2c);
<> 144:ef7eb2e8f9f7 3795 }
<> 144:ef7eb2e8f9f7 3796 }
<> 144:ef7eb2e8f9f7 3797 }
<> 144:ef7eb2e8f9f7 3798 else if((CurrentState == HAL_I2C_STATE_BUSY_TX) || \
<> 144:ef7eb2e8f9f7 3799 ((CurrentMode == HAL_I2C_MODE_MEM) && (CurrentState == HAL_I2C_STATE_BUSY_RX)))
<> 144:ef7eb2e8f9f7 3800 {
<> 144:ef7eb2e8f9f7 3801 if(hi2c->XferCount == 0U)
<> 144:ef7eb2e8f9f7 3802 {
<> 144:ef7eb2e8f9f7 3803 /* Disable BUF interrupt */
<> 144:ef7eb2e8f9f7 3804 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
<> 144:ef7eb2e8f9f7 3805 }
<> 144:ef7eb2e8f9f7 3806 else
<> 144:ef7eb2e8f9f7 3807 {
<> 144:ef7eb2e8f9f7 3808 if(hi2c->Mode == HAL_I2C_MODE_MEM)
<> 144:ef7eb2e8f9f7 3809 {
AnnaBridge 167:e84263d55307 3810 if(hi2c->EventCount == 0U)
<> 144:ef7eb2e8f9f7 3811 {
<> 144:ef7eb2e8f9f7 3812 /* If Memory address size is 8Bit */
<> 144:ef7eb2e8f9f7 3813 if(hi2c->MemaddSize == I2C_MEMADD_SIZE_8BIT)
<> 144:ef7eb2e8f9f7 3814 {
<> 144:ef7eb2e8f9f7 3815 /* Send Memory Address */
<> 144:ef7eb2e8f9f7 3816 hi2c->Instance->DR = I2C_MEM_ADD_LSB(hi2c->Memaddress);
<> 144:ef7eb2e8f9f7 3817
AnnaBridge 167:e84263d55307 3818 hi2c->EventCount += 2U;
<> 144:ef7eb2e8f9f7 3819 }
<> 144:ef7eb2e8f9f7 3820 /* If Memory address size is 16Bit */
<> 144:ef7eb2e8f9f7 3821 else
<> 144:ef7eb2e8f9f7 3822 {
<> 144:ef7eb2e8f9f7 3823 /* Send MSB of Memory Address */
<> 144:ef7eb2e8f9f7 3824 hi2c->Instance->DR = I2C_MEM_ADD_MSB(hi2c->Memaddress);
<> 144:ef7eb2e8f9f7 3825
<> 144:ef7eb2e8f9f7 3826 hi2c->EventCount++;
<> 144:ef7eb2e8f9f7 3827 }
<> 144:ef7eb2e8f9f7 3828 }
AnnaBridge 167:e84263d55307 3829 else if(hi2c->EventCount == 1U)
<> 144:ef7eb2e8f9f7 3830 {
<> 144:ef7eb2e8f9f7 3831 /* Send LSB of Memory Address */
<> 144:ef7eb2e8f9f7 3832 hi2c->Instance->DR = I2C_MEM_ADD_LSB(hi2c->Memaddress);
<> 144:ef7eb2e8f9f7 3833
<> 144:ef7eb2e8f9f7 3834 hi2c->EventCount++;
<> 144:ef7eb2e8f9f7 3835 }
AnnaBridge 167:e84263d55307 3836 else if(hi2c->EventCount == 2U)
<> 144:ef7eb2e8f9f7 3837 {
<> 144:ef7eb2e8f9f7 3838 if(hi2c->State == HAL_I2C_STATE_BUSY_RX)
<> 144:ef7eb2e8f9f7 3839 {
<> 144:ef7eb2e8f9f7 3840 /* Generate Restart */
<> 144:ef7eb2e8f9f7 3841 hi2c->Instance->CR1 |= I2C_CR1_START;
<> 144:ef7eb2e8f9f7 3842 }
<> 144:ef7eb2e8f9f7 3843 else if(hi2c->State == HAL_I2C_STATE_BUSY_TX)
<> 144:ef7eb2e8f9f7 3844 {
<> 144:ef7eb2e8f9f7 3845 /* Write data to DR */
<> 144:ef7eb2e8f9f7 3846 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
<> 144:ef7eb2e8f9f7 3847 hi2c->XferCount--;
<> 144:ef7eb2e8f9f7 3848 }
<> 144:ef7eb2e8f9f7 3849 }
<> 144:ef7eb2e8f9f7 3850 }
<> 144:ef7eb2e8f9f7 3851 else
<> 144:ef7eb2e8f9f7 3852 {
<> 144:ef7eb2e8f9f7 3853 /* Write data to DR */
<> 144:ef7eb2e8f9f7 3854 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
<> 144:ef7eb2e8f9f7 3855 hi2c->XferCount--;
<> 144:ef7eb2e8f9f7 3856 }
<> 144:ef7eb2e8f9f7 3857 }
<> 144:ef7eb2e8f9f7 3858 }
<> 144:ef7eb2e8f9f7 3859 return HAL_OK;
<> 144:ef7eb2e8f9f7 3860 }
<> 144:ef7eb2e8f9f7 3861
<> 144:ef7eb2e8f9f7 3862 /**
<> 144:ef7eb2e8f9f7 3863 * @brief Handle BTF flag for Master transmitter
<> 144:ef7eb2e8f9f7 3864 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 3865 * the configuration information for I2C module
<> 144:ef7eb2e8f9f7 3866 * @retval HAL status
<> 144:ef7eb2e8f9f7 3867 */
<> 144:ef7eb2e8f9f7 3868 static HAL_StatusTypeDef I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 3869 {
<> 144:ef7eb2e8f9f7 3870 /* Declaration of temporary variables to prevent undefined behavior of volatile usage */
<> 144:ef7eb2e8f9f7 3871 uint32_t CurrentXferOptions = hi2c->XferOptions;
<> 144:ef7eb2e8f9f7 3872
<> 144:ef7eb2e8f9f7 3873 if(hi2c->State == HAL_I2C_STATE_BUSY_TX)
<> 144:ef7eb2e8f9f7 3874 {
<> 144:ef7eb2e8f9f7 3875 if(hi2c->XferCount != 0U)
<> 144:ef7eb2e8f9f7 3876 {
<> 144:ef7eb2e8f9f7 3877 /* Write data to DR */
<> 144:ef7eb2e8f9f7 3878 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
<> 144:ef7eb2e8f9f7 3879 hi2c->XferCount--;
<> 144:ef7eb2e8f9f7 3880 }
<> 144:ef7eb2e8f9f7 3881 else
<> 144:ef7eb2e8f9f7 3882 {
<> 144:ef7eb2e8f9f7 3883 /* Call TxCpltCallback() directly if no stop mode is set */
<> 144:ef7eb2e8f9f7 3884 if((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) && (CurrentXferOptions != I2C_NO_OPTION_FRAME))
<> 144:ef7eb2e8f9f7 3885 {
<> 144:ef7eb2e8f9f7 3886 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
<> 144:ef7eb2e8f9f7 3887
<> 144:ef7eb2e8f9f7 3888 hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX;
<> 144:ef7eb2e8f9f7 3889 hi2c->Mode = HAL_I2C_MODE_NONE;
<> 144:ef7eb2e8f9f7 3890 hi2c->State = HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 3891
<> 144:ef7eb2e8f9f7 3892 HAL_I2C_MasterTxCpltCallback(hi2c);
<> 144:ef7eb2e8f9f7 3893 }
<> 144:ef7eb2e8f9f7 3894 else /* Generate Stop condition then Call TxCpltCallback() */
<> 144:ef7eb2e8f9f7 3895 {
<> 144:ef7eb2e8f9f7 3896 /* Disable EVT, BUF and ERR interrupt */
<> 144:ef7eb2e8f9f7 3897 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
<> 144:ef7eb2e8f9f7 3898
<> 144:ef7eb2e8f9f7 3899 /* Generate Stop */
<> 144:ef7eb2e8f9f7 3900 hi2c->Instance->CR1 |= I2C_CR1_STOP;
<> 144:ef7eb2e8f9f7 3901
<> 144:ef7eb2e8f9f7 3902 hi2c->PreviousState = I2C_STATE_NONE;
<> 144:ef7eb2e8f9f7 3903 hi2c->State = HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 3904
<> 144:ef7eb2e8f9f7 3905 if(hi2c->Mode == HAL_I2C_MODE_MEM)
<> 144:ef7eb2e8f9f7 3906 {
<> 144:ef7eb2e8f9f7 3907 hi2c->Mode = HAL_I2C_MODE_NONE;
<> 144:ef7eb2e8f9f7 3908
<> 144:ef7eb2e8f9f7 3909 HAL_I2C_MemTxCpltCallback(hi2c);
<> 144:ef7eb2e8f9f7 3910 }
<> 144:ef7eb2e8f9f7 3911 else
<> 144:ef7eb2e8f9f7 3912 {
<> 144:ef7eb2e8f9f7 3913 hi2c->Mode = HAL_I2C_MODE_NONE;
<> 144:ef7eb2e8f9f7 3914
<> 144:ef7eb2e8f9f7 3915 HAL_I2C_MasterTxCpltCallback(hi2c);
<> 144:ef7eb2e8f9f7 3916 }
<> 144:ef7eb2e8f9f7 3917 }
<> 144:ef7eb2e8f9f7 3918 }
<> 144:ef7eb2e8f9f7 3919 }
<> 144:ef7eb2e8f9f7 3920 return HAL_OK;
<> 144:ef7eb2e8f9f7 3921 }
<> 144:ef7eb2e8f9f7 3922
<> 144:ef7eb2e8f9f7 3923 /**
<> 144:ef7eb2e8f9f7 3924 * @brief Handle RXNE flag for Master
<> 144:ef7eb2e8f9f7 3925 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 3926 * the configuration information for I2C module
<> 144:ef7eb2e8f9f7 3927 * @retval HAL status
<> 144:ef7eb2e8f9f7 3928 */
<> 144:ef7eb2e8f9f7 3929 static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 3930 {
<> 153:fa9ff456f731 3931
<> 144:ef7eb2e8f9f7 3932 if(hi2c->State == HAL_I2C_STATE_BUSY_RX)
<> 144:ef7eb2e8f9f7 3933 {
<> 144:ef7eb2e8f9f7 3934 uint32_t tmp = 0U;
<> 144:ef7eb2e8f9f7 3935
<> 144:ef7eb2e8f9f7 3936 tmp = hi2c->XferCount;
<> 144:ef7eb2e8f9f7 3937 if(tmp > 3U)
<> 144:ef7eb2e8f9f7 3938 {
<> 144:ef7eb2e8f9f7 3939 /* Read data from DR */
<> 144:ef7eb2e8f9f7 3940 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
<> 144:ef7eb2e8f9f7 3941 hi2c->XferCount--;
<> 144:ef7eb2e8f9f7 3942 }
<> 144:ef7eb2e8f9f7 3943 else if((tmp == 2U) || (tmp == 3U))
<> 144:ef7eb2e8f9f7 3944 {
<> 153:fa9ff456f731 3945 /* Disable Acknowledge */
<> 153:fa9ff456f731 3946 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
AnnaBridge 167:e84263d55307 3947
<> 153:fa9ff456f731 3948 /* Enable Pos */
<> 153:fa9ff456f731 3949 hi2c->Instance->CR1 |= I2C_CR1_POS;
<> 144:ef7eb2e8f9f7 3950
<> 144:ef7eb2e8f9f7 3951 /* Disable BUF interrupt */
<> 144:ef7eb2e8f9f7 3952 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
<> 144:ef7eb2e8f9f7 3953 }
<> 144:ef7eb2e8f9f7 3954 else
<> 144:ef7eb2e8f9f7 3955 {
<> 153:fa9ff456f731 3956 /* Disable Acknowledge */
<> 153:fa9ff456f731 3957 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
AnnaBridge 167:e84263d55307 3958
<> 153:fa9ff456f731 3959 if(hi2c->XferOptions == I2C_NEXT_FRAME)
<> 144:ef7eb2e8f9f7 3960 {
<> 153:fa9ff456f731 3961 /* Enable Pos */
<> 153:fa9ff456f731 3962 hi2c->Instance->CR1 |= I2C_CR1_POS;
<> 144:ef7eb2e8f9f7 3963 }
<> 144:ef7eb2e8f9f7 3964
<> 144:ef7eb2e8f9f7 3965 /* Disable EVT, BUF and ERR interrupt */
<> 144:ef7eb2e8f9f7 3966 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
<> 144:ef7eb2e8f9f7 3967
<> 144:ef7eb2e8f9f7 3968 /* Read data from DR */
<> 144:ef7eb2e8f9f7 3969 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
<> 144:ef7eb2e8f9f7 3970 hi2c->XferCount--;
<> 144:ef7eb2e8f9f7 3971
<> 144:ef7eb2e8f9f7 3972 hi2c->State = HAL_I2C_STATE_READY;
AnnaBridge 167:e84263d55307 3973 hi2c->PreviousState = I2C_STATE_NONE;
<> 144:ef7eb2e8f9f7 3974
<> 144:ef7eb2e8f9f7 3975 if(hi2c->Mode == HAL_I2C_MODE_MEM)
<> 144:ef7eb2e8f9f7 3976 {
<> 144:ef7eb2e8f9f7 3977 hi2c->Mode = HAL_I2C_MODE_NONE;
<> 144:ef7eb2e8f9f7 3978 HAL_I2C_MemRxCpltCallback(hi2c);
<> 144:ef7eb2e8f9f7 3979 }
<> 144:ef7eb2e8f9f7 3980 else
<> 144:ef7eb2e8f9f7 3981 {
<> 144:ef7eb2e8f9f7 3982 hi2c->Mode = HAL_I2C_MODE_NONE;
<> 144:ef7eb2e8f9f7 3983 HAL_I2C_MasterRxCpltCallback(hi2c);
<> 144:ef7eb2e8f9f7 3984 }
<> 144:ef7eb2e8f9f7 3985 }
<> 144:ef7eb2e8f9f7 3986 }
<> 144:ef7eb2e8f9f7 3987 return HAL_OK;
<> 144:ef7eb2e8f9f7 3988 }
<> 144:ef7eb2e8f9f7 3989
<> 144:ef7eb2e8f9f7 3990 /**
<> 144:ef7eb2e8f9f7 3991 * @brief Handle BTF flag for Master receiver
<> 144:ef7eb2e8f9f7 3992 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 3993 * the configuration information for I2C module
<> 144:ef7eb2e8f9f7 3994 * @retval HAL status
<> 144:ef7eb2e8f9f7 3995 */
<> 144:ef7eb2e8f9f7 3996 static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 3997 {
<> 144:ef7eb2e8f9f7 3998 /* Declaration of temporary variables to prevent undefined behavior of volatile usage */
<> 144:ef7eb2e8f9f7 3999 uint32_t CurrentXferOptions = hi2c->XferOptions;
<> 144:ef7eb2e8f9f7 4000
<> 144:ef7eb2e8f9f7 4001 if(hi2c->XferCount == 3U)
<> 144:ef7eb2e8f9f7 4002 {
<> 144:ef7eb2e8f9f7 4003 if((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME) || (CurrentXferOptions == I2C_NO_OPTION_FRAME))
<> 144:ef7eb2e8f9f7 4004 {
<> 144:ef7eb2e8f9f7 4005 /* Disable Acknowledge */
<> 144:ef7eb2e8f9f7 4006 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
<> 144:ef7eb2e8f9f7 4007 }
<> 144:ef7eb2e8f9f7 4008
<> 144:ef7eb2e8f9f7 4009 /* Read data from DR */
<> 144:ef7eb2e8f9f7 4010 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
<> 144:ef7eb2e8f9f7 4011 hi2c->XferCount--;
<> 144:ef7eb2e8f9f7 4012 }
<> 144:ef7eb2e8f9f7 4013 else if(hi2c->XferCount == 2U)
<> 144:ef7eb2e8f9f7 4014 {
<> 144:ef7eb2e8f9f7 4015 /* Prepare next transfer or stop current transfer */
<> 144:ef7eb2e8f9f7 4016 if((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) && (CurrentXferOptions != I2C_NO_OPTION_FRAME))
<> 144:ef7eb2e8f9f7 4017 {
<> 153:fa9ff456f731 4018 /* Disable Acknowledge */
<> 153:fa9ff456f731 4019 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
Kojto 170:19eb464bc2be 4020
Kojto 170:19eb464bc2be 4021 if((CurrentXferOptions == I2C_NEXT_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME))
Kojto 170:19eb464bc2be 4022 {
Kojto 170:19eb464bc2be 4023 /* Generate ReStart */
Kojto 170:19eb464bc2be 4024 hi2c->Instance->CR1 |= I2C_CR1_START;
Kojto 170:19eb464bc2be 4025 }
<> 144:ef7eb2e8f9f7 4026 }
<> 144:ef7eb2e8f9f7 4027 else
<> 144:ef7eb2e8f9f7 4028 {
<> 144:ef7eb2e8f9f7 4029 /* Generate Stop */
<> 144:ef7eb2e8f9f7 4030 hi2c->Instance->CR1 |= I2C_CR1_STOP;
<> 144:ef7eb2e8f9f7 4031 }
<> 144:ef7eb2e8f9f7 4032
<> 144:ef7eb2e8f9f7 4033 /* Read data from DR */
<> 144:ef7eb2e8f9f7 4034 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
<> 144:ef7eb2e8f9f7 4035 hi2c->XferCount--;
<> 144:ef7eb2e8f9f7 4036
<> 144:ef7eb2e8f9f7 4037 /* Read data from DR */
<> 144:ef7eb2e8f9f7 4038 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
<> 144:ef7eb2e8f9f7 4039 hi2c->XferCount--;
<> 144:ef7eb2e8f9f7 4040
<> 144:ef7eb2e8f9f7 4041 /* Disable EVT and ERR interrupt */
<> 144:ef7eb2e8f9f7 4042 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
<> 144:ef7eb2e8f9f7 4043
<> 144:ef7eb2e8f9f7 4044 hi2c->State = HAL_I2C_STATE_READY;
<> 153:fa9ff456f731 4045 hi2c->PreviousState = I2C_STATE_NONE;
<> 153:fa9ff456f731 4046
<> 144:ef7eb2e8f9f7 4047 if(hi2c->Mode == HAL_I2C_MODE_MEM)
<> 144:ef7eb2e8f9f7 4048 {
<> 144:ef7eb2e8f9f7 4049 hi2c->Mode = HAL_I2C_MODE_NONE;
<> 144:ef7eb2e8f9f7 4050
<> 144:ef7eb2e8f9f7 4051 HAL_I2C_MemRxCpltCallback(hi2c);
<> 144:ef7eb2e8f9f7 4052 }
<> 144:ef7eb2e8f9f7 4053 else
<> 144:ef7eb2e8f9f7 4054 {
<> 144:ef7eb2e8f9f7 4055 hi2c->Mode = HAL_I2C_MODE_NONE;
<> 144:ef7eb2e8f9f7 4056
<> 144:ef7eb2e8f9f7 4057 HAL_I2C_MasterRxCpltCallback(hi2c);
<> 144:ef7eb2e8f9f7 4058 }
<> 144:ef7eb2e8f9f7 4059 }
<> 144:ef7eb2e8f9f7 4060 else
<> 144:ef7eb2e8f9f7 4061 {
<> 144:ef7eb2e8f9f7 4062 /* Read data from DR */
<> 144:ef7eb2e8f9f7 4063 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
<> 144:ef7eb2e8f9f7 4064 hi2c->XferCount--;
<> 144:ef7eb2e8f9f7 4065 }
<> 144:ef7eb2e8f9f7 4066 return HAL_OK;
<> 144:ef7eb2e8f9f7 4067 }
<> 144:ef7eb2e8f9f7 4068
<> 153:fa9ff456f731 4069
<> 144:ef7eb2e8f9f7 4070 /**
<> 144:ef7eb2e8f9f7 4071 * @brief Handle SB flag for Master
<> 144:ef7eb2e8f9f7 4072 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 4073 * the configuration information for I2C module
<> 144:ef7eb2e8f9f7 4074 * @retval HAL status
<> 144:ef7eb2e8f9f7 4075 */
<> 144:ef7eb2e8f9f7 4076 static HAL_StatusTypeDef I2C_Master_SB(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 4077 {
<> 144:ef7eb2e8f9f7 4078 if(hi2c->Mode == HAL_I2C_MODE_MEM)
<> 144:ef7eb2e8f9f7 4079 {
<> 144:ef7eb2e8f9f7 4080 if(hi2c->EventCount == 0U)
<> 144:ef7eb2e8f9f7 4081 {
<> 144:ef7eb2e8f9f7 4082 /* Send slave address */
<> 144:ef7eb2e8f9f7 4083 hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(hi2c->Devaddress);
<> 144:ef7eb2e8f9f7 4084 }
<> 144:ef7eb2e8f9f7 4085 else
<> 144:ef7eb2e8f9f7 4086 {
<> 144:ef7eb2e8f9f7 4087 hi2c->Instance->DR = I2C_7BIT_ADD_READ(hi2c->Devaddress);
<> 144:ef7eb2e8f9f7 4088 }
<> 144:ef7eb2e8f9f7 4089 }
<> 144:ef7eb2e8f9f7 4090 else
<> 144:ef7eb2e8f9f7 4091 {
<> 144:ef7eb2e8f9f7 4092 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
<> 144:ef7eb2e8f9f7 4093 {
<> 144:ef7eb2e8f9f7 4094 /* Send slave 7 Bits address */
<> 144:ef7eb2e8f9f7 4095 if(hi2c->State == HAL_I2C_STATE_BUSY_TX)
<> 144:ef7eb2e8f9f7 4096 {
<> 144:ef7eb2e8f9f7 4097 hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(hi2c->Devaddress);
<> 144:ef7eb2e8f9f7 4098 }
<> 144:ef7eb2e8f9f7 4099 else
<> 144:ef7eb2e8f9f7 4100 {
<> 144:ef7eb2e8f9f7 4101 hi2c->Instance->DR = I2C_7BIT_ADD_READ(hi2c->Devaddress);
<> 144:ef7eb2e8f9f7 4102 }
<> 144:ef7eb2e8f9f7 4103 }
<> 144:ef7eb2e8f9f7 4104 else
<> 144:ef7eb2e8f9f7 4105 {
<> 144:ef7eb2e8f9f7 4106 if(hi2c->EventCount == 0U)
<> 144:ef7eb2e8f9f7 4107 {
<> 144:ef7eb2e8f9f7 4108 /* Send header of slave address */
<> 144:ef7eb2e8f9f7 4109 hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(hi2c->Devaddress);
<> 144:ef7eb2e8f9f7 4110 }
<> 144:ef7eb2e8f9f7 4111 else if(hi2c->EventCount == 1U)
<> 144:ef7eb2e8f9f7 4112 {
<> 144:ef7eb2e8f9f7 4113 /* Send header of slave address */
<> 144:ef7eb2e8f9f7 4114 hi2c->Instance->DR = I2C_10BIT_HEADER_READ(hi2c->Devaddress);
<> 144:ef7eb2e8f9f7 4115 }
<> 144:ef7eb2e8f9f7 4116 }
<> 144:ef7eb2e8f9f7 4117 }
<> 144:ef7eb2e8f9f7 4118
<> 144:ef7eb2e8f9f7 4119 return HAL_OK;
<> 144:ef7eb2e8f9f7 4120 }
<> 144:ef7eb2e8f9f7 4121
<> 144:ef7eb2e8f9f7 4122 /**
<> 144:ef7eb2e8f9f7 4123 * @brief Handle ADD10 flag for Master
<> 144:ef7eb2e8f9f7 4124 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 4125 * the configuration information for I2C module
<> 144:ef7eb2e8f9f7 4126 * @retval HAL status
<> 144:ef7eb2e8f9f7 4127 */
<> 144:ef7eb2e8f9f7 4128 static HAL_StatusTypeDef I2C_Master_ADD10(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 4129 {
<> 144:ef7eb2e8f9f7 4130 /* Send slave address */
<> 144:ef7eb2e8f9f7 4131 hi2c->Instance->DR = I2C_10BIT_ADDRESS(hi2c->Devaddress);
<> 144:ef7eb2e8f9f7 4132
<> 144:ef7eb2e8f9f7 4133 return HAL_OK;
<> 144:ef7eb2e8f9f7 4134 }
<> 144:ef7eb2e8f9f7 4135
<> 144:ef7eb2e8f9f7 4136 /**
<> 144:ef7eb2e8f9f7 4137 * @brief Handle ADDR flag for Master
<> 144:ef7eb2e8f9f7 4138 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 4139 * the configuration information for I2C module
<> 144:ef7eb2e8f9f7 4140 * @retval HAL status
<> 144:ef7eb2e8f9f7 4141 */
<> 144:ef7eb2e8f9f7 4142 static HAL_StatusTypeDef I2C_Master_ADDR(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 4143 {
<> 144:ef7eb2e8f9f7 4144 /* Declaration of temporary variable to prevent undefined behavior of volatile usage */
<> 144:ef7eb2e8f9f7 4145 uint32_t CurrentMode = hi2c->Mode;
<> 144:ef7eb2e8f9f7 4146 uint32_t CurrentXferOptions = hi2c->XferOptions;
<> 144:ef7eb2e8f9f7 4147 uint32_t Prev_State = hi2c->PreviousState;
<> 144:ef7eb2e8f9f7 4148
<> 144:ef7eb2e8f9f7 4149 if(hi2c->State == HAL_I2C_STATE_BUSY_RX)
<> 144:ef7eb2e8f9f7 4150 {
<> 144:ef7eb2e8f9f7 4151 if((hi2c->EventCount == 0U) && (CurrentMode == HAL_I2C_MODE_MEM))
<> 144:ef7eb2e8f9f7 4152 {
<> 144:ef7eb2e8f9f7 4153 /* Clear ADDR flag */
<> 144:ef7eb2e8f9f7 4154 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
<> 144:ef7eb2e8f9f7 4155 }
<> 144:ef7eb2e8f9f7 4156 else if((hi2c->EventCount == 0U) && (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT))
<> 144:ef7eb2e8f9f7 4157 {
<> 144:ef7eb2e8f9f7 4158 /* Clear ADDR flag */
<> 144:ef7eb2e8f9f7 4159 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
<> 144:ef7eb2e8f9f7 4160
<> 144:ef7eb2e8f9f7 4161 /* Generate Restart */
<> 144:ef7eb2e8f9f7 4162 hi2c->Instance->CR1 |= I2C_CR1_START;
<> 144:ef7eb2e8f9f7 4163
<> 144:ef7eb2e8f9f7 4164 hi2c->EventCount++;
<> 144:ef7eb2e8f9f7 4165 }
<> 144:ef7eb2e8f9f7 4166 else
<> 144:ef7eb2e8f9f7 4167 {
<> 144:ef7eb2e8f9f7 4168 if(hi2c->XferCount == 0U)
<> 144:ef7eb2e8f9f7 4169 {
<> 144:ef7eb2e8f9f7 4170 /* Clear ADDR flag */
<> 144:ef7eb2e8f9f7 4171 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
<> 144:ef7eb2e8f9f7 4172
<> 144:ef7eb2e8f9f7 4173 /* Generate Stop */
<> 144:ef7eb2e8f9f7 4174 hi2c->Instance->CR1 |= I2C_CR1_STOP;
<> 144:ef7eb2e8f9f7 4175 }
<> 144:ef7eb2e8f9f7 4176 else if(hi2c->XferCount == 1U)
<> 144:ef7eb2e8f9f7 4177 {
<> 144:ef7eb2e8f9f7 4178 if(CurrentXferOptions == I2C_NO_OPTION_FRAME)
<> 144:ef7eb2e8f9f7 4179 {
<> 144:ef7eb2e8f9f7 4180 /* Disable Acknowledge */
<> 144:ef7eb2e8f9f7 4181 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
<> 144:ef7eb2e8f9f7 4182
<> 144:ef7eb2e8f9f7 4183 if((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN)
<> 144:ef7eb2e8f9f7 4184 {
<> 144:ef7eb2e8f9f7 4185 /* Disable Acknowledge */
<> 144:ef7eb2e8f9f7 4186 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
<> 144:ef7eb2e8f9f7 4187
<> 144:ef7eb2e8f9f7 4188 /* Clear ADDR flag */
<> 144:ef7eb2e8f9f7 4189 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
<> 144:ef7eb2e8f9f7 4190 }
<> 144:ef7eb2e8f9f7 4191 else
<> 144:ef7eb2e8f9f7 4192 {
<> 144:ef7eb2e8f9f7 4193 /* Clear ADDR flag */
<> 144:ef7eb2e8f9f7 4194 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
<> 144:ef7eb2e8f9f7 4195
<> 144:ef7eb2e8f9f7 4196 /* Generate Stop */
<> 144:ef7eb2e8f9f7 4197 hi2c->Instance->CR1 |= I2C_CR1_STOP;
<> 144:ef7eb2e8f9f7 4198 }
<> 144:ef7eb2e8f9f7 4199 }
<> 144:ef7eb2e8f9f7 4200 /* Prepare next transfer or stop current transfer */
<> 144:ef7eb2e8f9f7 4201 else if((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) \
<> 144:ef7eb2e8f9f7 4202 && (Prev_State != I2C_STATE_MASTER_BUSY_RX))
<> 144:ef7eb2e8f9f7 4203 {
<> 144:ef7eb2e8f9f7 4204 if(hi2c->XferOptions != I2C_NEXT_FRAME)
<> 144:ef7eb2e8f9f7 4205 {
<> 144:ef7eb2e8f9f7 4206 /* Disable Acknowledge */
<> 144:ef7eb2e8f9f7 4207 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
<> 144:ef7eb2e8f9f7 4208 }
<> 144:ef7eb2e8f9f7 4209 else
<> 144:ef7eb2e8f9f7 4210 {
<> 144:ef7eb2e8f9f7 4211 /* Enable Acknowledge */
<> 144:ef7eb2e8f9f7 4212 hi2c->Instance->CR1 |= I2C_CR1_ACK;
<> 144:ef7eb2e8f9f7 4213 }
<> 144:ef7eb2e8f9f7 4214
<> 144:ef7eb2e8f9f7 4215 /* Clear ADDR flag */
<> 144:ef7eb2e8f9f7 4216 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
<> 144:ef7eb2e8f9f7 4217 }
<> 144:ef7eb2e8f9f7 4218 else
<> 144:ef7eb2e8f9f7 4219 {
<> 144:ef7eb2e8f9f7 4220 /* Disable Acknowledge */
<> 144:ef7eb2e8f9f7 4221 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
<> 144:ef7eb2e8f9f7 4222
<> 144:ef7eb2e8f9f7 4223 /* Clear ADDR flag */
<> 144:ef7eb2e8f9f7 4224 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
<> 144:ef7eb2e8f9f7 4225
<> 144:ef7eb2e8f9f7 4226 /* Generate Stop */
<> 144:ef7eb2e8f9f7 4227 hi2c->Instance->CR1 |= I2C_CR1_STOP;
<> 144:ef7eb2e8f9f7 4228 }
<> 144:ef7eb2e8f9f7 4229 }
<> 144:ef7eb2e8f9f7 4230 else if(hi2c->XferCount == 2U)
<> 144:ef7eb2e8f9f7 4231 {
<> 144:ef7eb2e8f9f7 4232 if(hi2c->XferOptions != I2C_NEXT_FRAME)
<> 144:ef7eb2e8f9f7 4233 {
<> 144:ef7eb2e8f9f7 4234 /* Disable Acknowledge */
<> 144:ef7eb2e8f9f7 4235 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
<> 144:ef7eb2e8f9f7 4236
<> 144:ef7eb2e8f9f7 4237 /* Enable Pos */
<> 144:ef7eb2e8f9f7 4238 hi2c->Instance->CR1 |= I2C_CR1_POS;
<> 144:ef7eb2e8f9f7 4239 }
<> 144:ef7eb2e8f9f7 4240 else
<> 144:ef7eb2e8f9f7 4241 {
<> 144:ef7eb2e8f9f7 4242 /* Enable Acknowledge */
<> 144:ef7eb2e8f9f7 4243 hi2c->Instance->CR1 |= I2C_CR1_ACK;
<> 144:ef7eb2e8f9f7 4244 }
<> 144:ef7eb2e8f9f7 4245
<> 144:ef7eb2e8f9f7 4246 if((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN)
<> 144:ef7eb2e8f9f7 4247 {
<> 144:ef7eb2e8f9f7 4248 /* Enable Last DMA bit */
<> 144:ef7eb2e8f9f7 4249 hi2c->Instance->CR2 |= I2C_CR2_LAST;
<> 144:ef7eb2e8f9f7 4250 }
<> 144:ef7eb2e8f9f7 4251
<> 144:ef7eb2e8f9f7 4252 /* Clear ADDR flag */
<> 144:ef7eb2e8f9f7 4253 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
<> 144:ef7eb2e8f9f7 4254 }
<> 144:ef7eb2e8f9f7 4255 else
<> 144:ef7eb2e8f9f7 4256 {
<> 144:ef7eb2e8f9f7 4257 /* Enable Acknowledge */
<> 144:ef7eb2e8f9f7 4258 hi2c->Instance->CR1 |= I2C_CR1_ACK;
<> 144:ef7eb2e8f9f7 4259
<> 144:ef7eb2e8f9f7 4260 if((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN)
<> 144:ef7eb2e8f9f7 4261 {
<> 144:ef7eb2e8f9f7 4262 /* Enable Last DMA bit */
<> 144:ef7eb2e8f9f7 4263 hi2c->Instance->CR2 |= I2C_CR2_LAST;
<> 144:ef7eb2e8f9f7 4264 }
<> 144:ef7eb2e8f9f7 4265
<> 144:ef7eb2e8f9f7 4266 /* Clear ADDR flag */
<> 144:ef7eb2e8f9f7 4267 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
<> 144:ef7eb2e8f9f7 4268 }
<> 144:ef7eb2e8f9f7 4269
<> 144:ef7eb2e8f9f7 4270 /* Reset Event counter */
<> 144:ef7eb2e8f9f7 4271 hi2c->EventCount = 0U;
<> 144:ef7eb2e8f9f7 4272 }
<> 144:ef7eb2e8f9f7 4273 }
<> 144:ef7eb2e8f9f7 4274 else
<> 144:ef7eb2e8f9f7 4275 {
<> 144:ef7eb2e8f9f7 4276 /* Clear ADDR flag */
<> 144:ef7eb2e8f9f7 4277 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
<> 144:ef7eb2e8f9f7 4278 }
<> 144:ef7eb2e8f9f7 4279
<> 144:ef7eb2e8f9f7 4280 return HAL_OK;
<> 144:ef7eb2e8f9f7 4281 }
<> 144:ef7eb2e8f9f7 4282
<> 144:ef7eb2e8f9f7 4283 /**
<> 144:ef7eb2e8f9f7 4284 * @brief Handle TXE flag for Slave
<> 144:ef7eb2e8f9f7 4285 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 4286 * the configuration information for I2C module
<> 144:ef7eb2e8f9f7 4287 * @retval HAL status
<> 144:ef7eb2e8f9f7 4288 */
<> 144:ef7eb2e8f9f7 4289 static HAL_StatusTypeDef I2C_SlaveTransmit_TXE(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 4290 {
<> 144:ef7eb2e8f9f7 4291 /* Declaration of temporary variables to prevent undefined behavior of volatile usage */
<> 144:ef7eb2e8f9f7 4292 uint32_t CurrentState = hi2c->State;
<> 144:ef7eb2e8f9f7 4293
<> 144:ef7eb2e8f9f7 4294 if(hi2c->XferCount != 0U)
<> 144:ef7eb2e8f9f7 4295 {
<> 144:ef7eb2e8f9f7 4296 /* Write data to DR */
<> 144:ef7eb2e8f9f7 4297 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
<> 144:ef7eb2e8f9f7 4298 hi2c->XferCount--;
<> 144:ef7eb2e8f9f7 4299
<> 144:ef7eb2e8f9f7 4300 if((hi2c->XferCount == 0U) && (CurrentState == HAL_I2C_STATE_BUSY_TX_LISTEN))
<> 144:ef7eb2e8f9f7 4301 {
<> 144:ef7eb2e8f9f7 4302 /* Last Byte is received, disable Interrupt */
<> 144:ef7eb2e8f9f7 4303 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
<> 144:ef7eb2e8f9f7 4304
<> 144:ef7eb2e8f9f7 4305 /* Set state at HAL_I2C_STATE_LISTEN */
<> 144:ef7eb2e8f9f7 4306 hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX;
<> 144:ef7eb2e8f9f7 4307 hi2c->State = HAL_I2C_STATE_LISTEN;
<> 144:ef7eb2e8f9f7 4308
<> 144:ef7eb2e8f9f7 4309 /* Call the Tx complete callback to inform upper layer of the end of receive process */
<> 144:ef7eb2e8f9f7 4310 HAL_I2C_SlaveTxCpltCallback(hi2c);
<> 144:ef7eb2e8f9f7 4311 }
<> 144:ef7eb2e8f9f7 4312 }
<> 144:ef7eb2e8f9f7 4313 return HAL_OK;
<> 144:ef7eb2e8f9f7 4314 }
<> 144:ef7eb2e8f9f7 4315
<> 144:ef7eb2e8f9f7 4316 /**
<> 144:ef7eb2e8f9f7 4317 * @brief Handle BTF flag for Slave transmitter
<> 144:ef7eb2e8f9f7 4318 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 4319 * the configuration information for I2C module
<> 144:ef7eb2e8f9f7 4320 * @retval HAL status
<> 144:ef7eb2e8f9f7 4321 */
<> 144:ef7eb2e8f9f7 4322 static HAL_StatusTypeDef I2C_SlaveTransmit_BTF(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 4323 {
<> 144:ef7eb2e8f9f7 4324 if(hi2c->XferCount != 0U)
<> 144:ef7eb2e8f9f7 4325 {
<> 144:ef7eb2e8f9f7 4326 /* Write data to DR */
<> 144:ef7eb2e8f9f7 4327 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
<> 144:ef7eb2e8f9f7 4328 hi2c->XferCount--;
<> 144:ef7eb2e8f9f7 4329 }
<> 144:ef7eb2e8f9f7 4330 return HAL_OK;
<> 144:ef7eb2e8f9f7 4331 }
<> 144:ef7eb2e8f9f7 4332
<> 144:ef7eb2e8f9f7 4333 /**
<> 144:ef7eb2e8f9f7 4334 * @brief Handle RXNE flag for Slave
<> 144:ef7eb2e8f9f7 4335 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 4336 * the configuration information for I2C module
<> 144:ef7eb2e8f9f7 4337 * @retval HAL status
<> 144:ef7eb2e8f9f7 4338 */
<> 144:ef7eb2e8f9f7 4339 static HAL_StatusTypeDef I2C_SlaveReceive_RXNE(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 4340 {
<> 144:ef7eb2e8f9f7 4341 /* Declaration of temporary variables to prevent undefined behavior of volatile usage */
<> 144:ef7eb2e8f9f7 4342 uint32_t CurrentState = hi2c->State;
<> 144:ef7eb2e8f9f7 4343
<> 144:ef7eb2e8f9f7 4344 if(hi2c->XferCount != 0U)
<> 144:ef7eb2e8f9f7 4345 {
<> 144:ef7eb2e8f9f7 4346 /* Read data from DR */
<> 144:ef7eb2e8f9f7 4347 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
<> 144:ef7eb2e8f9f7 4348 hi2c->XferCount--;
<> 144:ef7eb2e8f9f7 4349
<> 144:ef7eb2e8f9f7 4350 if((hi2c->XferCount == 0U) && (CurrentState == HAL_I2C_STATE_BUSY_RX_LISTEN))
<> 144:ef7eb2e8f9f7 4351 {
<> 144:ef7eb2e8f9f7 4352 /* Last Byte is received, disable Interrupt */
<> 144:ef7eb2e8f9f7 4353 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
<> 144:ef7eb2e8f9f7 4354
<> 144:ef7eb2e8f9f7 4355 /* Set state at HAL_I2C_STATE_LISTEN */
<> 144:ef7eb2e8f9f7 4356 hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX;
<> 144:ef7eb2e8f9f7 4357 hi2c->State = HAL_I2C_STATE_LISTEN;
<> 144:ef7eb2e8f9f7 4358
<> 144:ef7eb2e8f9f7 4359 /* Call the Rx complete callback to inform upper layer of the end of receive process */
<> 144:ef7eb2e8f9f7 4360 HAL_I2C_SlaveRxCpltCallback(hi2c);
<> 144:ef7eb2e8f9f7 4361 }
<> 144:ef7eb2e8f9f7 4362 }
<> 144:ef7eb2e8f9f7 4363 return HAL_OK;
<> 144:ef7eb2e8f9f7 4364 }
<> 144:ef7eb2e8f9f7 4365
<> 144:ef7eb2e8f9f7 4366 /**
<> 144:ef7eb2e8f9f7 4367 * @brief Handle BTF flag for Slave receiver
<> 144:ef7eb2e8f9f7 4368 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 4369 * the configuration information for I2C module
<> 144:ef7eb2e8f9f7 4370 * @retval HAL status
<> 144:ef7eb2e8f9f7 4371 */
<> 144:ef7eb2e8f9f7 4372 static HAL_StatusTypeDef I2C_SlaveReceive_BTF(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 4373 {
<> 144:ef7eb2e8f9f7 4374 if(hi2c->XferCount != 0U)
<> 144:ef7eb2e8f9f7 4375 {
<> 144:ef7eb2e8f9f7 4376 /* Read data from DR */
<> 144:ef7eb2e8f9f7 4377 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
<> 144:ef7eb2e8f9f7 4378 hi2c->XferCount--;
<> 144:ef7eb2e8f9f7 4379 }
<> 144:ef7eb2e8f9f7 4380 return HAL_OK;
<> 144:ef7eb2e8f9f7 4381 }
<> 144:ef7eb2e8f9f7 4382
<> 144:ef7eb2e8f9f7 4383 /**
<> 144:ef7eb2e8f9f7 4384 * @brief Handle ADD flag for Slave
<> 144:ef7eb2e8f9f7 4385 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 4386 * the configuration information for I2C module
<> 144:ef7eb2e8f9f7 4387 * @retval HAL status
<> 144:ef7eb2e8f9f7 4388 */
<> 144:ef7eb2e8f9f7 4389 static HAL_StatusTypeDef I2C_Slave_ADDR(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 4390 {
<> 144:ef7eb2e8f9f7 4391 uint8_t TransferDirection = I2C_DIRECTION_RECEIVE;
<> 144:ef7eb2e8f9f7 4392 uint16_t SlaveAddrCode = 0U;
<> 144:ef7eb2e8f9f7 4393
<> 144:ef7eb2e8f9f7 4394 /* Transfer Direction requested by Master */
<> 144:ef7eb2e8f9f7 4395 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TRA) == RESET)
<> 144:ef7eb2e8f9f7 4396 {
<> 144:ef7eb2e8f9f7 4397 TransferDirection = I2C_DIRECTION_TRANSMIT;
<> 144:ef7eb2e8f9f7 4398 }
<> 144:ef7eb2e8f9f7 4399
<> 144:ef7eb2e8f9f7 4400 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_DUALF) == RESET)
<> 144:ef7eb2e8f9f7 4401 {
<> 144:ef7eb2e8f9f7 4402 SlaveAddrCode = hi2c->Init.OwnAddress1;
<> 144:ef7eb2e8f9f7 4403 }
<> 144:ef7eb2e8f9f7 4404 else
<> 144:ef7eb2e8f9f7 4405 {
<> 144:ef7eb2e8f9f7 4406 SlaveAddrCode = hi2c->Init.OwnAddress2;
<> 144:ef7eb2e8f9f7 4407 }
<> 144:ef7eb2e8f9f7 4408
<> 144:ef7eb2e8f9f7 4409 /* Call Slave Addr callback */
<> 144:ef7eb2e8f9f7 4410 HAL_I2C_AddrCallback(hi2c, TransferDirection, SlaveAddrCode);
<> 144:ef7eb2e8f9f7 4411
<> 144:ef7eb2e8f9f7 4412 return HAL_OK;
<> 144:ef7eb2e8f9f7 4413 }
<> 144:ef7eb2e8f9f7 4414
<> 144:ef7eb2e8f9f7 4415 /**
<> 144:ef7eb2e8f9f7 4416 * @brief Handle STOPF flag for Slave
<> 144:ef7eb2e8f9f7 4417 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 4418 * the configuration information for I2C module
<> 144:ef7eb2e8f9f7 4419 * @retval HAL status
<> 144:ef7eb2e8f9f7 4420 */
<> 144:ef7eb2e8f9f7 4421 static HAL_StatusTypeDef I2C_Slave_STOPF(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 4422 {
<> 144:ef7eb2e8f9f7 4423 /* Declaration of temporary variable to prevent undefined behavior of volatile usage */
<> 144:ef7eb2e8f9f7 4424 uint32_t CurrentState = hi2c->State;
<> 144:ef7eb2e8f9f7 4425
<> 144:ef7eb2e8f9f7 4426 /* Disable EVT, BUF and ERR interrupt */
<> 144:ef7eb2e8f9f7 4427 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
<> 144:ef7eb2e8f9f7 4428
<> 144:ef7eb2e8f9f7 4429 /* Clear STOPF flag */
<> 144:ef7eb2e8f9f7 4430 __HAL_I2C_CLEAR_STOPFLAG(hi2c);
<> 144:ef7eb2e8f9f7 4431
<> 144:ef7eb2e8f9f7 4432 /* Disable Acknowledge */
<> 144:ef7eb2e8f9f7 4433 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
<> 144:ef7eb2e8f9f7 4434
<> 144:ef7eb2e8f9f7 4435 /* If a DMA is ongoing, Update handle size context */
<> 144:ef7eb2e8f9f7 4436 if((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN)
<> 144:ef7eb2e8f9f7 4437 {
<> 144:ef7eb2e8f9f7 4438 if((hi2c->State == HAL_I2C_STATE_BUSY_RX) || (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN))
<> 144:ef7eb2e8f9f7 4439 {
<> 144:ef7eb2e8f9f7 4440 hi2c->XferCount = __HAL_DMA_GET_COUNTER(hi2c->hdmarx);
<> 144:ef7eb2e8f9f7 4441 }
<> 144:ef7eb2e8f9f7 4442 else
<> 144:ef7eb2e8f9f7 4443 {
<> 144:ef7eb2e8f9f7 4444 hi2c->XferCount = __HAL_DMA_GET_COUNTER(hi2c->hdmatx);
<> 144:ef7eb2e8f9f7 4445 }
<> 144:ef7eb2e8f9f7 4446 }
<> 144:ef7eb2e8f9f7 4447
<> 144:ef7eb2e8f9f7 4448 /* All data are not transferred, so set error code accordingly */
<> 144:ef7eb2e8f9f7 4449 if(hi2c->XferCount != 0U)
<> 144:ef7eb2e8f9f7 4450 {
<> 144:ef7eb2e8f9f7 4451 /* Store Last receive data if any */
<> 144:ef7eb2e8f9f7 4452 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET)
<> 144:ef7eb2e8f9f7 4453 {
<> 144:ef7eb2e8f9f7 4454 /* Read data from DR */
<> 144:ef7eb2e8f9f7 4455 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
<> 144:ef7eb2e8f9f7 4456 hi2c->XferCount--;
<> 144:ef7eb2e8f9f7 4457 }
<> 144:ef7eb2e8f9f7 4458
<> 144:ef7eb2e8f9f7 4459 /* Store Last receive data if any */
<> 144:ef7eb2e8f9f7 4460 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET)
<> 144:ef7eb2e8f9f7 4461 {
<> 144:ef7eb2e8f9f7 4462 /* Read data from DR */
<> 144:ef7eb2e8f9f7 4463 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
<> 144:ef7eb2e8f9f7 4464 hi2c->XferCount--;
<> 144:ef7eb2e8f9f7 4465 }
<> 144:ef7eb2e8f9f7 4466
<> 144:ef7eb2e8f9f7 4467 /* Set ErrorCode corresponding to a Non-Acknowledge */
<> 144:ef7eb2e8f9f7 4468 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
<> 144:ef7eb2e8f9f7 4469 }
<> 144:ef7eb2e8f9f7 4470
<> 144:ef7eb2e8f9f7 4471 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
<> 144:ef7eb2e8f9f7 4472 {
<> 144:ef7eb2e8f9f7 4473 /* Call the corresponding callback to inform upper layer of End of Transfer */
<> 144:ef7eb2e8f9f7 4474 I2C_ITError(hi2c);
<> 144:ef7eb2e8f9f7 4475 }
<> 144:ef7eb2e8f9f7 4476 else
<> 144:ef7eb2e8f9f7 4477 {
<> 144:ef7eb2e8f9f7 4478 if((CurrentState == HAL_I2C_STATE_LISTEN ) || (CurrentState == HAL_I2C_STATE_BUSY_RX_LISTEN) || \
<> 144:ef7eb2e8f9f7 4479 (CurrentState == HAL_I2C_STATE_BUSY_TX_LISTEN))
<> 144:ef7eb2e8f9f7 4480 {
<> 144:ef7eb2e8f9f7 4481 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
<> 144:ef7eb2e8f9f7 4482 hi2c->PreviousState = I2C_STATE_NONE;
<> 144:ef7eb2e8f9f7 4483 hi2c->State = HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 4484 hi2c->Mode = HAL_I2C_MODE_NONE;
<> 144:ef7eb2e8f9f7 4485
<> 144:ef7eb2e8f9f7 4486 /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */
<> 144:ef7eb2e8f9f7 4487 HAL_I2C_ListenCpltCallback(hi2c);
<> 144:ef7eb2e8f9f7 4488 }
<> 144:ef7eb2e8f9f7 4489 else
<> 144:ef7eb2e8f9f7 4490 {
<> 144:ef7eb2e8f9f7 4491 if((hi2c->PreviousState == I2C_STATE_SLAVE_BUSY_RX) || (CurrentState == HAL_I2C_STATE_BUSY_RX))
<> 144:ef7eb2e8f9f7 4492 {
<> 144:ef7eb2e8f9f7 4493 hi2c->PreviousState = I2C_STATE_NONE;
<> 144:ef7eb2e8f9f7 4494 hi2c->State = HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 4495 hi2c->Mode = HAL_I2C_MODE_NONE;
<> 144:ef7eb2e8f9f7 4496
<> 144:ef7eb2e8f9f7 4497 HAL_I2C_SlaveRxCpltCallback(hi2c);
<> 144:ef7eb2e8f9f7 4498 }
<> 144:ef7eb2e8f9f7 4499 }
<> 144:ef7eb2e8f9f7 4500 }
<> 144:ef7eb2e8f9f7 4501 return HAL_OK;
<> 144:ef7eb2e8f9f7 4502 }
<> 144:ef7eb2e8f9f7 4503
<> 144:ef7eb2e8f9f7 4504 /**
<> 144:ef7eb2e8f9f7 4505 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 4506 * the configuration information for I2C module
<> 144:ef7eb2e8f9f7 4507 * @retval HAL status
<> 144:ef7eb2e8f9f7 4508 */
<> 144:ef7eb2e8f9f7 4509 static HAL_StatusTypeDef I2C_Slave_AF(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 4510 {
<> 144:ef7eb2e8f9f7 4511 /* Declaration of temporary variables to prevent undefined behavior of volatile usage */
<> 144:ef7eb2e8f9f7 4512 uint32_t CurrentState = hi2c->State;
<> 144:ef7eb2e8f9f7 4513 uint32_t CurrentXferOptions = hi2c->XferOptions;
<> 144:ef7eb2e8f9f7 4514
<> 144:ef7eb2e8f9f7 4515 if(((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME)) && \
<> 144:ef7eb2e8f9f7 4516 (CurrentState == HAL_I2C_STATE_LISTEN))
<> 144:ef7eb2e8f9f7 4517 {
<> 144:ef7eb2e8f9f7 4518 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
<> 144:ef7eb2e8f9f7 4519
<> 144:ef7eb2e8f9f7 4520 /* Disable EVT, BUF and ERR interrupt */
<> 144:ef7eb2e8f9f7 4521 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
<> 144:ef7eb2e8f9f7 4522
<> 144:ef7eb2e8f9f7 4523 /* Clear AF flag */
<> 144:ef7eb2e8f9f7 4524 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
<> 144:ef7eb2e8f9f7 4525
<> 144:ef7eb2e8f9f7 4526 /* Disable Acknowledge */
<> 144:ef7eb2e8f9f7 4527 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
<> 144:ef7eb2e8f9f7 4528
<> 144:ef7eb2e8f9f7 4529 hi2c->PreviousState = I2C_STATE_NONE;
<> 144:ef7eb2e8f9f7 4530 hi2c->State = HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 4531 hi2c->Mode = HAL_I2C_MODE_NONE;
<> 144:ef7eb2e8f9f7 4532
<> 144:ef7eb2e8f9f7 4533 /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */
<> 144:ef7eb2e8f9f7 4534 HAL_I2C_ListenCpltCallback(hi2c);
<> 144:ef7eb2e8f9f7 4535 }
<> 144:ef7eb2e8f9f7 4536 else if(CurrentState == HAL_I2C_STATE_BUSY_TX)
<> 144:ef7eb2e8f9f7 4537 {
<> 144:ef7eb2e8f9f7 4538 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
<> 144:ef7eb2e8f9f7 4539 hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX;
<> 144:ef7eb2e8f9f7 4540 hi2c->State = HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 4541 hi2c->Mode = HAL_I2C_MODE_NONE;
<> 144:ef7eb2e8f9f7 4542
<> 144:ef7eb2e8f9f7 4543 /* Disable EVT, BUF and ERR interrupt */
<> 144:ef7eb2e8f9f7 4544 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
<> 144:ef7eb2e8f9f7 4545
<> 144:ef7eb2e8f9f7 4546 /* Clear AF flag */
<> 144:ef7eb2e8f9f7 4547 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
<> 144:ef7eb2e8f9f7 4548
<> 144:ef7eb2e8f9f7 4549 /* Disable Acknowledge */
<> 144:ef7eb2e8f9f7 4550 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
<> 144:ef7eb2e8f9f7 4551
<> 144:ef7eb2e8f9f7 4552 HAL_I2C_SlaveTxCpltCallback(hi2c);
<> 144:ef7eb2e8f9f7 4553 }
<> 144:ef7eb2e8f9f7 4554 else
<> 144:ef7eb2e8f9f7 4555 {
<> 144:ef7eb2e8f9f7 4556 /* Clear AF flag only */
<> 144:ef7eb2e8f9f7 4557 /* State Listen, but XferOptions == FIRST or NEXT */
<> 144:ef7eb2e8f9f7 4558 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
<> 144:ef7eb2e8f9f7 4559 }
<> 144:ef7eb2e8f9f7 4560
<> 144:ef7eb2e8f9f7 4561 return HAL_OK;
<> 144:ef7eb2e8f9f7 4562 }
<> 144:ef7eb2e8f9f7 4563
<> 144:ef7eb2e8f9f7 4564 /**
<> 144:ef7eb2e8f9f7 4565 * @brief I2C interrupts error process
<> 144:ef7eb2e8f9f7 4566 * @param hi2c I2C handle.
<> 144:ef7eb2e8f9f7 4567 * @retval None
<> 144:ef7eb2e8f9f7 4568 */
<> 144:ef7eb2e8f9f7 4569 static void I2C_ITError(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 4570 {
<> 144:ef7eb2e8f9f7 4571 /* Declaration of temporary variable to prevent undefined behavior of volatile usage */
<> 144:ef7eb2e8f9f7 4572 uint32_t CurrentState = hi2c->State;
<> 144:ef7eb2e8f9f7 4573
<> 144:ef7eb2e8f9f7 4574 if((CurrentState == HAL_I2C_STATE_BUSY_TX_LISTEN) || (CurrentState == HAL_I2C_STATE_BUSY_RX_LISTEN))
<> 144:ef7eb2e8f9f7 4575 {
<> 144:ef7eb2e8f9f7 4576 /* keep HAL_I2C_STATE_LISTEN */
<> 144:ef7eb2e8f9f7 4577 hi2c->PreviousState = I2C_STATE_NONE;
<> 144:ef7eb2e8f9f7 4578 hi2c->State = HAL_I2C_STATE_LISTEN;
<> 144:ef7eb2e8f9f7 4579 }
<> 144:ef7eb2e8f9f7 4580 else
<> 144:ef7eb2e8f9f7 4581 {
<> 144:ef7eb2e8f9f7 4582 /* If state is an abort treatment on going, don't change state */
<> 144:ef7eb2e8f9f7 4583 /* This change will be do later */
<> 144:ef7eb2e8f9f7 4584 if((hi2c->State != HAL_I2C_STATE_ABORT) && ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) != I2C_CR2_DMAEN))
<> 144:ef7eb2e8f9f7 4585 {
<> 144:ef7eb2e8f9f7 4586 hi2c->State = HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 4587 }
<> 144:ef7eb2e8f9f7 4588 hi2c->PreviousState = I2C_STATE_NONE;
<> 144:ef7eb2e8f9f7 4589 hi2c->Mode = HAL_I2C_MODE_NONE;
<> 144:ef7eb2e8f9f7 4590 }
<> 144:ef7eb2e8f9f7 4591
<> 144:ef7eb2e8f9f7 4592 /* Disable Pos bit in I2C CR1 when error occurred in Master/Mem Receive IT Process */
<> 144:ef7eb2e8f9f7 4593 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
<> 144:ef7eb2e8f9f7 4594
<> 144:ef7eb2e8f9f7 4595 /* Abort DMA transfer */
<> 144:ef7eb2e8f9f7 4596 if((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN)
<> 144:ef7eb2e8f9f7 4597 {
<> 144:ef7eb2e8f9f7 4598 hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN;
<> 144:ef7eb2e8f9f7 4599
<> 144:ef7eb2e8f9f7 4600 if(hi2c->hdmatx->State != HAL_DMA_STATE_READY)
<> 144:ef7eb2e8f9f7 4601 {
<> 144:ef7eb2e8f9f7 4602 /* Set the DMA Abort callback :
<> 144:ef7eb2e8f9f7 4603 will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */
<> 144:ef7eb2e8f9f7 4604 hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort;
<> 144:ef7eb2e8f9f7 4605
<> 144:ef7eb2e8f9f7 4606 if(HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK)
<> 144:ef7eb2e8f9f7 4607 {
<> 144:ef7eb2e8f9f7 4608 /* Disable I2C peripheral to prevent dummy data in buffer */
<> 144:ef7eb2e8f9f7 4609 __HAL_I2C_DISABLE(hi2c);
<> 144:ef7eb2e8f9f7 4610
<> 144:ef7eb2e8f9f7 4611 hi2c->State = HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 4612
<> 144:ef7eb2e8f9f7 4613 /* Call Directly XferAbortCallback function in case of error */
<> 144:ef7eb2e8f9f7 4614 hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx);
<> 144:ef7eb2e8f9f7 4615 }
<> 144:ef7eb2e8f9f7 4616 }
<> 144:ef7eb2e8f9f7 4617 else
<> 144:ef7eb2e8f9f7 4618 {
<> 144:ef7eb2e8f9f7 4619 /* Set the DMA Abort callback :
<> 144:ef7eb2e8f9f7 4620 will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */
<> 144:ef7eb2e8f9f7 4621 hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort;
<> 144:ef7eb2e8f9f7 4622
<> 144:ef7eb2e8f9f7 4623 if(HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK)
<> 144:ef7eb2e8f9f7 4624 {
<> 144:ef7eb2e8f9f7 4625 /* Store Last receive data if any */
<> 144:ef7eb2e8f9f7 4626 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET)
<> 144:ef7eb2e8f9f7 4627 {
<> 144:ef7eb2e8f9f7 4628 /* Read data from DR */
<> 144:ef7eb2e8f9f7 4629 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
<> 144:ef7eb2e8f9f7 4630 }
<> 144:ef7eb2e8f9f7 4631
<> 144:ef7eb2e8f9f7 4632 /* Disable I2C peripheral to prevent dummy data in buffer */
<> 144:ef7eb2e8f9f7 4633 __HAL_I2C_DISABLE(hi2c);
<> 144:ef7eb2e8f9f7 4634
<> 144:ef7eb2e8f9f7 4635 hi2c->State = HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 4636
<> 144:ef7eb2e8f9f7 4637 /* Call Directly hi2c->hdmarx->XferAbortCallback function in case of error */
<> 144:ef7eb2e8f9f7 4638 hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx);
<> 144:ef7eb2e8f9f7 4639 }
<> 144:ef7eb2e8f9f7 4640 }
<> 144:ef7eb2e8f9f7 4641 }
<> 144:ef7eb2e8f9f7 4642 else if(hi2c->State == HAL_I2C_STATE_ABORT)
<> 144:ef7eb2e8f9f7 4643 {
<> 144:ef7eb2e8f9f7 4644 hi2c->State = HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 4645 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
<> 144:ef7eb2e8f9f7 4646
<> 144:ef7eb2e8f9f7 4647 /* Store Last receive data if any */
<> 144:ef7eb2e8f9f7 4648 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET)
<> 144:ef7eb2e8f9f7 4649 {
<> 144:ef7eb2e8f9f7 4650 /* Read data from DR */
<> 144:ef7eb2e8f9f7 4651 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
<> 144:ef7eb2e8f9f7 4652 }
<> 144:ef7eb2e8f9f7 4653
<> 144:ef7eb2e8f9f7 4654 /* Disable I2C peripheral to prevent dummy data in buffer */
<> 144:ef7eb2e8f9f7 4655 __HAL_I2C_DISABLE(hi2c);
<> 144:ef7eb2e8f9f7 4656
<> 144:ef7eb2e8f9f7 4657 /* Call the corresponding callback to inform upper layer of End of Transfer */
<> 144:ef7eb2e8f9f7 4658 HAL_I2C_AbortCpltCallback(hi2c);
<> 144:ef7eb2e8f9f7 4659 }
<> 144:ef7eb2e8f9f7 4660 else
<> 144:ef7eb2e8f9f7 4661 {
<> 144:ef7eb2e8f9f7 4662 /* Store Last receive data if any */
<> 144:ef7eb2e8f9f7 4663 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET)
<> 144:ef7eb2e8f9f7 4664 {
<> 144:ef7eb2e8f9f7 4665 /* Read data from DR */
<> 144:ef7eb2e8f9f7 4666 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
<> 144:ef7eb2e8f9f7 4667 }
<> 144:ef7eb2e8f9f7 4668
<> 144:ef7eb2e8f9f7 4669 /* Call user error callback */
<> 144:ef7eb2e8f9f7 4670 HAL_I2C_ErrorCallback(hi2c);
<> 144:ef7eb2e8f9f7 4671 }
<> 144:ef7eb2e8f9f7 4672 /* STOP Flag is not set after a NACK reception */
<> 144:ef7eb2e8f9f7 4673 /* So may inform upper layer that listen phase is stopped */
<> 144:ef7eb2e8f9f7 4674 /* during NACK error treatment */
<> 144:ef7eb2e8f9f7 4675 if((hi2c->State == HAL_I2C_STATE_LISTEN) && ((hi2c->ErrorCode & HAL_I2C_ERROR_AF) == HAL_I2C_ERROR_AF))
<> 144:ef7eb2e8f9f7 4676 {
<> 144:ef7eb2e8f9f7 4677 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
<> 144:ef7eb2e8f9f7 4678 hi2c->PreviousState = I2C_STATE_NONE;
<> 144:ef7eb2e8f9f7 4679 hi2c->State = HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 4680 hi2c->Mode = HAL_I2C_MODE_NONE;
<> 144:ef7eb2e8f9f7 4681
<> 144:ef7eb2e8f9f7 4682 /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */
<> 144:ef7eb2e8f9f7 4683 HAL_I2C_ListenCpltCallback(hi2c);
<> 144:ef7eb2e8f9f7 4684 }
<> 144:ef7eb2e8f9f7 4685 }
<> 144:ef7eb2e8f9f7 4686
<> 144:ef7eb2e8f9f7 4687 /**
<> 144:ef7eb2e8f9f7 4688 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 4689 * the configuration information for I2C module
<> 144:ef7eb2e8f9f7 4690 * @param DevAddress Target device address: The device 7 bits address value
<> 144:ef7eb2e8f9f7 4691 * in datasheet must be shift at right before call interface
<> 144:ef7eb2e8f9f7 4692 * @param Timeout Timeout duration
<> 144:ef7eb2e8f9f7 4693 * @param Tickstart Tick start value
<> 144:ef7eb2e8f9f7 4694 * @retval HAL status
<> 144:ef7eb2e8f9f7 4695 */
<> 144:ef7eb2e8f9f7 4696 static HAL_StatusTypeDef I2C_MasterRequestWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart)
<> 144:ef7eb2e8f9f7 4697 {
<> 144:ef7eb2e8f9f7 4698 /* Declaration of temporary variable to prevent undefined behavior of volatile usage */
<> 144:ef7eb2e8f9f7 4699 uint32_t CurrentXferOptions = hi2c->XferOptions;
<> 144:ef7eb2e8f9f7 4700
<> 144:ef7eb2e8f9f7 4701 /* Generate Start condition if first transfer */
<> 144:ef7eb2e8f9f7 4702 if((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_NO_OPTION_FRAME))
<> 144:ef7eb2e8f9f7 4703 {
<> 144:ef7eb2e8f9f7 4704 /* Generate Start */
<> 144:ef7eb2e8f9f7 4705 hi2c->Instance->CR1 |= I2C_CR1_START;
<> 144:ef7eb2e8f9f7 4706 }
<> 144:ef7eb2e8f9f7 4707 else if(hi2c->PreviousState == I2C_STATE_MASTER_BUSY_RX)
<> 144:ef7eb2e8f9f7 4708 {
<> 144:ef7eb2e8f9f7 4709 /* Generate ReStart */
<> 144:ef7eb2e8f9f7 4710 hi2c->Instance->CR1 |= I2C_CR1_START;
<> 144:ef7eb2e8f9f7 4711 }
<> 144:ef7eb2e8f9f7 4712
<> 144:ef7eb2e8f9f7 4713 /* Wait until SB flag is set */
<> 144:ef7eb2e8f9f7 4714 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 4715 {
<> 144:ef7eb2e8f9f7 4716 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 4717 }
<> 144:ef7eb2e8f9f7 4718
<> 144:ef7eb2e8f9f7 4719 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
<> 144:ef7eb2e8f9f7 4720 {
<> 144:ef7eb2e8f9f7 4721 /* Send slave address */
<> 144:ef7eb2e8f9f7 4722 hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);
<> 144:ef7eb2e8f9f7 4723 }
<> 144:ef7eb2e8f9f7 4724 else
<> 144:ef7eb2e8f9f7 4725 {
<> 144:ef7eb2e8f9f7 4726 /* Send header of slave address */
<> 144:ef7eb2e8f9f7 4727 hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(DevAddress);
<> 144:ef7eb2e8f9f7 4728
<> 144:ef7eb2e8f9f7 4729 /* Wait until ADD10 flag is set */
<> 144:ef7eb2e8f9f7 4730 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADD10, Timeout, Tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 4731 {
<> 144:ef7eb2e8f9f7 4732 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
<> 144:ef7eb2e8f9f7 4733 {
<> 144:ef7eb2e8f9f7 4734 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 4735 }
<> 144:ef7eb2e8f9f7 4736 else
<> 144:ef7eb2e8f9f7 4737 {
<> 144:ef7eb2e8f9f7 4738 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 4739 }
<> 144:ef7eb2e8f9f7 4740 }
<> 144:ef7eb2e8f9f7 4741
<> 144:ef7eb2e8f9f7 4742 /* Send slave address */
<> 144:ef7eb2e8f9f7 4743 hi2c->Instance->DR = I2C_10BIT_ADDRESS(DevAddress);
<> 144:ef7eb2e8f9f7 4744 }
<> 144:ef7eb2e8f9f7 4745
<> 144:ef7eb2e8f9f7 4746 /* Wait until ADDR flag is set */
<> 144:ef7eb2e8f9f7 4747 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 4748 {
<> 144:ef7eb2e8f9f7 4749 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
<> 144:ef7eb2e8f9f7 4750 {
<> 144:ef7eb2e8f9f7 4751 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 4752 }
<> 144:ef7eb2e8f9f7 4753 else
<> 144:ef7eb2e8f9f7 4754 {
<> 144:ef7eb2e8f9f7 4755 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 4756 }
<> 144:ef7eb2e8f9f7 4757 }
<> 144:ef7eb2e8f9f7 4758
<> 144:ef7eb2e8f9f7 4759 return HAL_OK;
<> 144:ef7eb2e8f9f7 4760 }
<> 144:ef7eb2e8f9f7 4761
<> 144:ef7eb2e8f9f7 4762 /**
<> 144:ef7eb2e8f9f7 4763 * @brief Master sends target device address for read request.
<> 144:ef7eb2e8f9f7 4764 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 4765 * the configuration information for I2C module
<> 144:ef7eb2e8f9f7 4766 * @param DevAddress Target device address: The device 7 bits address value
<> 144:ef7eb2e8f9f7 4767 * in datasheet must be shift at right before call interface
<> 144:ef7eb2e8f9f7 4768 * @param Timeout Timeout duration
<> 144:ef7eb2e8f9f7 4769 * @param Tickstart Tick start value
<> 144:ef7eb2e8f9f7 4770 * @retval HAL status
<> 144:ef7eb2e8f9f7 4771 */
<> 144:ef7eb2e8f9f7 4772 static HAL_StatusTypeDef I2C_MasterRequestRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart)
<> 144:ef7eb2e8f9f7 4773 {
<> 144:ef7eb2e8f9f7 4774 /* Declaration of temporary variable to prevent undefined behavior of volatile usage */
<> 144:ef7eb2e8f9f7 4775 uint32_t CurrentXferOptions = hi2c->XferOptions;
<> 144:ef7eb2e8f9f7 4776
<> 144:ef7eb2e8f9f7 4777 /* Enable Acknowledge */
<> 144:ef7eb2e8f9f7 4778 hi2c->Instance->CR1 |= I2C_CR1_ACK;
<> 144:ef7eb2e8f9f7 4779
<> 144:ef7eb2e8f9f7 4780 /* Generate Start condition if first transfer */
<> 144:ef7eb2e8f9f7 4781 if((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_NO_OPTION_FRAME))
<> 144:ef7eb2e8f9f7 4782 {
<> 144:ef7eb2e8f9f7 4783 /* Generate Start */
<> 144:ef7eb2e8f9f7 4784 hi2c->Instance->CR1 |= I2C_CR1_START;
<> 144:ef7eb2e8f9f7 4785 }
<> 144:ef7eb2e8f9f7 4786 else if(hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX)
<> 144:ef7eb2e8f9f7 4787 {
<> 144:ef7eb2e8f9f7 4788 /* Generate ReStart */
<> 144:ef7eb2e8f9f7 4789 hi2c->Instance->CR1 |= I2C_CR1_START;
<> 144:ef7eb2e8f9f7 4790 }
<> 144:ef7eb2e8f9f7 4791
<> 144:ef7eb2e8f9f7 4792 /* Wait until SB flag is set */
<> 144:ef7eb2e8f9f7 4793 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 4794 {
<> 144:ef7eb2e8f9f7 4795 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 4796 }
<> 144:ef7eb2e8f9f7 4797
<> 144:ef7eb2e8f9f7 4798 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
<> 144:ef7eb2e8f9f7 4799 {
<> 144:ef7eb2e8f9f7 4800 /* Send slave address */
<> 144:ef7eb2e8f9f7 4801 hi2c->Instance->DR = I2C_7BIT_ADD_READ(DevAddress);
<> 144:ef7eb2e8f9f7 4802 }
<> 144:ef7eb2e8f9f7 4803 else
<> 144:ef7eb2e8f9f7 4804 {
<> 144:ef7eb2e8f9f7 4805 /* Send header of slave address */
<> 144:ef7eb2e8f9f7 4806 hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(DevAddress);
<> 144:ef7eb2e8f9f7 4807
<> 144:ef7eb2e8f9f7 4808 /* Wait until ADD10 flag is set */
<> 144:ef7eb2e8f9f7 4809 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADD10, Timeout, Tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 4810 {
<> 144:ef7eb2e8f9f7 4811 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
<> 144:ef7eb2e8f9f7 4812 {
<> 144:ef7eb2e8f9f7 4813 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 4814 }
<> 144:ef7eb2e8f9f7 4815 else
<> 144:ef7eb2e8f9f7 4816 {
<> 144:ef7eb2e8f9f7 4817 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 4818 }
<> 144:ef7eb2e8f9f7 4819 }
<> 144:ef7eb2e8f9f7 4820
<> 144:ef7eb2e8f9f7 4821 /* Send slave address */
<> 144:ef7eb2e8f9f7 4822 hi2c->Instance->DR = I2C_10BIT_ADDRESS(DevAddress);
<> 144:ef7eb2e8f9f7 4823
<> 144:ef7eb2e8f9f7 4824 /* Wait until ADDR flag is set */
<> 144:ef7eb2e8f9f7 4825 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 4826 {
<> 144:ef7eb2e8f9f7 4827 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
<> 144:ef7eb2e8f9f7 4828 {
<> 144:ef7eb2e8f9f7 4829 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 4830 }
<> 144:ef7eb2e8f9f7 4831 else
<> 144:ef7eb2e8f9f7 4832 {
<> 144:ef7eb2e8f9f7 4833 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 4834 }
<> 144:ef7eb2e8f9f7 4835 }
<> 144:ef7eb2e8f9f7 4836
<> 144:ef7eb2e8f9f7 4837 /* Clear ADDR flag */
<> 144:ef7eb2e8f9f7 4838 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
<> 144:ef7eb2e8f9f7 4839
<> 144:ef7eb2e8f9f7 4840 /* Generate Restart */
<> 144:ef7eb2e8f9f7 4841 hi2c->Instance->CR1 |= I2C_CR1_START;
<> 144:ef7eb2e8f9f7 4842
<> 144:ef7eb2e8f9f7 4843 /* Wait until SB flag is set */
<> 144:ef7eb2e8f9f7 4844 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 4845 {
<> 144:ef7eb2e8f9f7 4846 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 4847 }
<> 144:ef7eb2e8f9f7 4848
<> 144:ef7eb2e8f9f7 4849 /* Send header of slave address */
<> 144:ef7eb2e8f9f7 4850 hi2c->Instance->DR = I2C_10BIT_HEADER_READ(DevAddress);
<> 144:ef7eb2e8f9f7 4851 }
<> 144:ef7eb2e8f9f7 4852
<> 144:ef7eb2e8f9f7 4853 /* Wait until ADDR flag is set */
<> 144:ef7eb2e8f9f7 4854 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 4855 {
<> 144:ef7eb2e8f9f7 4856 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
<> 144:ef7eb2e8f9f7 4857 {
<> 144:ef7eb2e8f9f7 4858 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 4859 }
<> 144:ef7eb2e8f9f7 4860 else
<> 144:ef7eb2e8f9f7 4861 {
<> 144:ef7eb2e8f9f7 4862 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 4863 }
<> 144:ef7eb2e8f9f7 4864 }
<> 144:ef7eb2e8f9f7 4865
<> 144:ef7eb2e8f9f7 4866 return HAL_OK;
<> 144:ef7eb2e8f9f7 4867 }
<> 144:ef7eb2e8f9f7 4868
<> 144:ef7eb2e8f9f7 4869 /**
<> 144:ef7eb2e8f9f7 4870 * @brief Master sends target device address followed by internal memory address for write request.
<> 144:ef7eb2e8f9f7 4871 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 4872 * the configuration information for I2C module
<> 144:ef7eb2e8f9f7 4873 * @param DevAddress Target device address
<> 144:ef7eb2e8f9f7 4874 * @param MemAddress Internal memory address
<> 144:ef7eb2e8f9f7 4875 * @param MemAddSize Size of internal memory address
<> 144:ef7eb2e8f9f7 4876 * @param Timeout Timeout duration
<> 144:ef7eb2e8f9f7 4877 * @param Tickstart Tick start value
<> 144:ef7eb2e8f9f7 4878 * @retval HAL status
<> 144:ef7eb2e8f9f7 4879 */
<> 144:ef7eb2e8f9f7 4880 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 4881 {
<> 144:ef7eb2e8f9f7 4882 /* Generate Start */
<> 144:ef7eb2e8f9f7 4883 hi2c->Instance->CR1 |= I2C_CR1_START;
<> 144:ef7eb2e8f9f7 4884
<> 144:ef7eb2e8f9f7 4885 /* Wait until SB flag is set */
<> 144:ef7eb2e8f9f7 4886 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 4887 {
<> 144:ef7eb2e8f9f7 4888 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 4889 }
<> 144:ef7eb2e8f9f7 4890
<> 144:ef7eb2e8f9f7 4891 /* Send slave address */
<> 144:ef7eb2e8f9f7 4892 hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);
<> 144:ef7eb2e8f9f7 4893
<> 144:ef7eb2e8f9f7 4894 /* Wait until ADDR flag is set */
<> 144:ef7eb2e8f9f7 4895 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 4896 {
<> 144:ef7eb2e8f9f7 4897 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
<> 144:ef7eb2e8f9f7 4898 {
<> 144:ef7eb2e8f9f7 4899 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 4900 }
<> 144:ef7eb2e8f9f7 4901 else
<> 144:ef7eb2e8f9f7 4902 {
<> 144:ef7eb2e8f9f7 4903 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 4904 }
<> 144:ef7eb2e8f9f7 4905 }
<> 144:ef7eb2e8f9f7 4906
<> 144:ef7eb2e8f9f7 4907 /* Clear ADDR flag */
<> 144:ef7eb2e8f9f7 4908 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
<> 144:ef7eb2e8f9f7 4909
<> 144:ef7eb2e8f9f7 4910 /* Wait until TXE flag is set */
<> 144:ef7eb2e8f9f7 4911 if(I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 4912 {
<> 144:ef7eb2e8f9f7 4913 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
<> 144:ef7eb2e8f9f7 4914 {
<> 144:ef7eb2e8f9f7 4915 /* Generate Stop */
<> 144:ef7eb2e8f9f7 4916 hi2c->Instance->CR1 |= I2C_CR1_STOP;
<> 144:ef7eb2e8f9f7 4917 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 4918 }
<> 144:ef7eb2e8f9f7 4919 else
<> 144:ef7eb2e8f9f7 4920 {
<> 144:ef7eb2e8f9f7 4921 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 4922 }
<> 144:ef7eb2e8f9f7 4923 }
<> 144:ef7eb2e8f9f7 4924
<> 144:ef7eb2e8f9f7 4925 /* If Memory address size is 8Bit */
<> 144:ef7eb2e8f9f7 4926 if(MemAddSize == I2C_MEMADD_SIZE_8BIT)
<> 144:ef7eb2e8f9f7 4927 {
<> 144:ef7eb2e8f9f7 4928 /* Send Memory Address */
<> 144:ef7eb2e8f9f7 4929 hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress);
<> 144:ef7eb2e8f9f7 4930 }
<> 144:ef7eb2e8f9f7 4931 /* If Memory address size is 16Bit */
<> 144:ef7eb2e8f9f7 4932 else
<> 144:ef7eb2e8f9f7 4933 {
<> 144:ef7eb2e8f9f7 4934 /* Send MSB of Memory Address */
<> 144:ef7eb2e8f9f7 4935 hi2c->Instance->DR = I2C_MEM_ADD_MSB(MemAddress);
<> 144:ef7eb2e8f9f7 4936
<> 144:ef7eb2e8f9f7 4937 /* Wait until TXE flag is set */
<> 144:ef7eb2e8f9f7 4938 if(I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 4939 {
<> 144:ef7eb2e8f9f7 4940 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
<> 144:ef7eb2e8f9f7 4941 {
<> 144:ef7eb2e8f9f7 4942 /* Generate Stop */
<> 144:ef7eb2e8f9f7 4943 hi2c->Instance->CR1 |= I2C_CR1_STOP;
<> 144:ef7eb2e8f9f7 4944 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 4945 }
<> 144:ef7eb2e8f9f7 4946 else
<> 144:ef7eb2e8f9f7 4947 {
<> 144:ef7eb2e8f9f7 4948 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 4949 }
<> 144:ef7eb2e8f9f7 4950 }
<> 144:ef7eb2e8f9f7 4951
<> 144:ef7eb2e8f9f7 4952 /* Send LSB of Memory Address */
<> 144:ef7eb2e8f9f7 4953 hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress);
<> 144:ef7eb2e8f9f7 4954 }
<> 144:ef7eb2e8f9f7 4955
<> 144:ef7eb2e8f9f7 4956 return HAL_OK;
<> 144:ef7eb2e8f9f7 4957 }
<> 144:ef7eb2e8f9f7 4958
<> 144:ef7eb2e8f9f7 4959 /**
<> 144:ef7eb2e8f9f7 4960 * @brief Master sends target device address followed by internal memory address for read request.
<> 144:ef7eb2e8f9f7 4961 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 4962 * the configuration information for I2C module
<> 144:ef7eb2e8f9f7 4963 * @param DevAddress Target device address
<> 144:ef7eb2e8f9f7 4964 * @param MemAddress Internal memory address
<> 144:ef7eb2e8f9f7 4965 * @param MemAddSize Size of internal memory address
<> 144:ef7eb2e8f9f7 4966 * @param Timeout Timeout duration
<> 144:ef7eb2e8f9f7 4967 * @param Tickstart Tick start value
<> 144:ef7eb2e8f9f7 4968 * @retval HAL status
<> 144:ef7eb2e8f9f7 4969 */
<> 144:ef7eb2e8f9f7 4970 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 4971 {
<> 144:ef7eb2e8f9f7 4972 /* Enable Acknowledge */
<> 144:ef7eb2e8f9f7 4973 hi2c->Instance->CR1 |= I2C_CR1_ACK;
<> 144:ef7eb2e8f9f7 4974
<> 144:ef7eb2e8f9f7 4975 /* Generate Start */
<> 144:ef7eb2e8f9f7 4976 hi2c->Instance->CR1 |= I2C_CR1_START;
<> 144:ef7eb2e8f9f7 4977
<> 144:ef7eb2e8f9f7 4978 /* Wait until SB flag is set */
<> 144:ef7eb2e8f9f7 4979 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 4980 {
<> 144:ef7eb2e8f9f7 4981 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 4982 }
<> 144:ef7eb2e8f9f7 4983
<> 144:ef7eb2e8f9f7 4984 /* Send slave address */
<> 144:ef7eb2e8f9f7 4985 hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);
<> 144:ef7eb2e8f9f7 4986
<> 144:ef7eb2e8f9f7 4987 /* Wait until ADDR flag is set */
<> 144:ef7eb2e8f9f7 4988 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 4989 {
<> 144:ef7eb2e8f9f7 4990 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
<> 144:ef7eb2e8f9f7 4991 {
<> 144:ef7eb2e8f9f7 4992 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 4993 }
<> 144:ef7eb2e8f9f7 4994 else
<> 144:ef7eb2e8f9f7 4995 {
<> 144:ef7eb2e8f9f7 4996 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 4997 }
<> 144:ef7eb2e8f9f7 4998 }
<> 144:ef7eb2e8f9f7 4999
<> 144:ef7eb2e8f9f7 5000 /* Clear ADDR flag */
<> 144:ef7eb2e8f9f7 5001 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
<> 144:ef7eb2e8f9f7 5002
<> 144:ef7eb2e8f9f7 5003 /* Wait until TXE flag is set */
<> 144:ef7eb2e8f9f7 5004 if(I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 5005 {
<> 144:ef7eb2e8f9f7 5006 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
<> 144:ef7eb2e8f9f7 5007 {
<> 144:ef7eb2e8f9f7 5008 /* Generate Stop */
<> 144:ef7eb2e8f9f7 5009 hi2c->Instance->CR1 |= I2C_CR1_STOP;
<> 144:ef7eb2e8f9f7 5010 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 5011 }
<> 144:ef7eb2e8f9f7 5012 else
<> 144:ef7eb2e8f9f7 5013 {
<> 144:ef7eb2e8f9f7 5014 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 5015 }
<> 144:ef7eb2e8f9f7 5016 }
<> 144:ef7eb2e8f9f7 5017
<> 144:ef7eb2e8f9f7 5018 /* If Memory address size is 8Bit */
<> 144:ef7eb2e8f9f7 5019 if(MemAddSize == I2C_MEMADD_SIZE_8BIT)
<> 144:ef7eb2e8f9f7 5020 {
<> 144:ef7eb2e8f9f7 5021 /* Send Memory Address */
<> 144:ef7eb2e8f9f7 5022 hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress);
<> 144:ef7eb2e8f9f7 5023 }
<> 144:ef7eb2e8f9f7 5024 /* If Memory address size is 16Bit */
<> 144:ef7eb2e8f9f7 5025 else
<> 144:ef7eb2e8f9f7 5026 {
<> 144:ef7eb2e8f9f7 5027 /* Send MSB of Memory Address */
<> 144:ef7eb2e8f9f7 5028 hi2c->Instance->DR = I2C_MEM_ADD_MSB(MemAddress);
<> 144:ef7eb2e8f9f7 5029
<> 144:ef7eb2e8f9f7 5030 /* Wait until TXE flag is set */
<> 144:ef7eb2e8f9f7 5031 if(I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 5032 {
<> 144:ef7eb2e8f9f7 5033 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
<> 144:ef7eb2e8f9f7 5034 {
<> 144:ef7eb2e8f9f7 5035 /* Generate Stop */
<> 144:ef7eb2e8f9f7 5036 hi2c->Instance->CR1 |= I2C_CR1_STOP;
<> 144:ef7eb2e8f9f7 5037 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 5038 }
<> 144:ef7eb2e8f9f7 5039 else
<> 144:ef7eb2e8f9f7 5040 {
<> 144:ef7eb2e8f9f7 5041 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 5042 }
<> 144:ef7eb2e8f9f7 5043 }
<> 144:ef7eb2e8f9f7 5044
<> 144:ef7eb2e8f9f7 5045 /* Send LSB of Memory Address */
<> 144:ef7eb2e8f9f7 5046 hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress);
<> 144:ef7eb2e8f9f7 5047 }
<> 144:ef7eb2e8f9f7 5048
<> 144:ef7eb2e8f9f7 5049 /* Wait until TXE flag is set */
<> 144:ef7eb2e8f9f7 5050 if(I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 5051 {
<> 144:ef7eb2e8f9f7 5052 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
<> 144:ef7eb2e8f9f7 5053 {
<> 144:ef7eb2e8f9f7 5054 /* Generate Stop */
<> 144:ef7eb2e8f9f7 5055 hi2c->Instance->CR1 |= I2C_CR1_STOP;
<> 144:ef7eb2e8f9f7 5056 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 5057 }
<> 144:ef7eb2e8f9f7 5058 else
<> 144:ef7eb2e8f9f7 5059 {
<> 144:ef7eb2e8f9f7 5060 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 5061 }
<> 144:ef7eb2e8f9f7 5062 }
<> 144:ef7eb2e8f9f7 5063
<> 144:ef7eb2e8f9f7 5064 /* Generate Restart */
<> 144:ef7eb2e8f9f7 5065 hi2c->Instance->CR1 |= I2C_CR1_START;
<> 144:ef7eb2e8f9f7 5066
<> 144:ef7eb2e8f9f7 5067 /* Wait until SB flag is set */
<> 144:ef7eb2e8f9f7 5068 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 5069 {
<> 144:ef7eb2e8f9f7 5070 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 5071 }
<> 144:ef7eb2e8f9f7 5072
<> 144:ef7eb2e8f9f7 5073 /* Send slave address */
<> 144:ef7eb2e8f9f7 5074 hi2c->Instance->DR = I2C_7BIT_ADD_READ(DevAddress);
<> 144:ef7eb2e8f9f7 5075
<> 144:ef7eb2e8f9f7 5076 /* Wait until ADDR flag is set */
<> 144:ef7eb2e8f9f7 5077 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK)
<> 144:ef7eb2e8f9f7 5078 {
<> 144:ef7eb2e8f9f7 5079 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
<> 144:ef7eb2e8f9f7 5080 {
<> 144:ef7eb2e8f9f7 5081 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 5082 }
<> 144:ef7eb2e8f9f7 5083 else
<> 144:ef7eb2e8f9f7 5084 {
<> 144:ef7eb2e8f9f7 5085 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 5086 }
<> 144:ef7eb2e8f9f7 5087 }
<> 144:ef7eb2e8f9f7 5088
<> 144:ef7eb2e8f9f7 5089 return HAL_OK;
<> 144:ef7eb2e8f9f7 5090 }
<> 144:ef7eb2e8f9f7 5091
<> 144:ef7eb2e8f9f7 5092 /**
<> 144:ef7eb2e8f9f7 5093 * @brief DMA I2C process complete callback.
<> 144:ef7eb2e8f9f7 5094 * @param hdma DMA handle
<> 144:ef7eb2e8f9f7 5095 * @retval None
<> 144:ef7eb2e8f9f7 5096 */
<> 144:ef7eb2e8f9f7 5097 static void I2C_DMAXferCplt(DMA_HandleTypeDef *hdma)
<> 144:ef7eb2e8f9f7 5098 {
<> 144:ef7eb2e8f9f7 5099 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
<> 144:ef7eb2e8f9f7 5100
<> 144:ef7eb2e8f9f7 5101 /* Declaration of temporary variable to prevent undefined behavior of volatile usage */
<> 144:ef7eb2e8f9f7 5102 uint32_t CurrentState = hi2c->State;
<> 144:ef7eb2e8f9f7 5103 uint32_t CurrentMode = hi2c->Mode;
<> 144:ef7eb2e8f9f7 5104
<> 144:ef7eb2e8f9f7 5105 if((CurrentState == HAL_I2C_STATE_BUSY_TX) || ((CurrentState == HAL_I2C_STATE_BUSY_RX) && (CurrentMode == HAL_I2C_MODE_SLAVE)))
<> 144:ef7eb2e8f9f7 5106 {
<> 144:ef7eb2e8f9f7 5107 /* Disable DMA Request */
<> 144:ef7eb2e8f9f7 5108 hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN;
<> 144:ef7eb2e8f9f7 5109
<> 144:ef7eb2e8f9f7 5110 hi2c->XferCount = 0U;
<> 144:ef7eb2e8f9f7 5111
<> 144:ef7eb2e8f9f7 5112 /* Enable EVT and ERR interrupt */
<> 144:ef7eb2e8f9f7 5113 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
<> 144:ef7eb2e8f9f7 5114 }
<> 144:ef7eb2e8f9f7 5115 else
<> 144:ef7eb2e8f9f7 5116 {
<> 144:ef7eb2e8f9f7 5117 /* Disable Acknowledge */
<> 144:ef7eb2e8f9f7 5118 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
<> 144:ef7eb2e8f9f7 5119
<> 144:ef7eb2e8f9f7 5120 /* Generate Stop */
<> 144:ef7eb2e8f9f7 5121 hi2c->Instance->CR1 |= I2C_CR1_STOP;
<> 144:ef7eb2e8f9f7 5122
<> 144:ef7eb2e8f9f7 5123 /* Disable Last DMA */
<> 144:ef7eb2e8f9f7 5124 hi2c->Instance->CR2 &= ~I2C_CR2_LAST;
<> 144:ef7eb2e8f9f7 5125
<> 144:ef7eb2e8f9f7 5126 /* Disable DMA Request */
<> 144:ef7eb2e8f9f7 5127 hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN;
<> 144:ef7eb2e8f9f7 5128
<> 144:ef7eb2e8f9f7 5129 hi2c->XferCount = 0U;
<> 144:ef7eb2e8f9f7 5130
<> 144:ef7eb2e8f9f7 5131 /* Check if Errors has been detected during transfer */
<> 144:ef7eb2e8f9f7 5132 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
<> 144:ef7eb2e8f9f7 5133 {
<> 144:ef7eb2e8f9f7 5134 HAL_I2C_ErrorCallback(hi2c);
<> 144:ef7eb2e8f9f7 5135 }
<> 144:ef7eb2e8f9f7 5136 else
<> 144:ef7eb2e8f9f7 5137 {
<> 144:ef7eb2e8f9f7 5138 hi2c->State = HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 5139
<> 144:ef7eb2e8f9f7 5140 if(hi2c->Mode == HAL_I2C_MODE_MEM)
<> 144:ef7eb2e8f9f7 5141 {
<> 144:ef7eb2e8f9f7 5142 hi2c->Mode = HAL_I2C_MODE_NONE;
<> 144:ef7eb2e8f9f7 5143
<> 144:ef7eb2e8f9f7 5144 HAL_I2C_MemRxCpltCallback(hi2c);
<> 144:ef7eb2e8f9f7 5145 }
<> 144:ef7eb2e8f9f7 5146 else
<> 144:ef7eb2e8f9f7 5147 {
<> 144:ef7eb2e8f9f7 5148 hi2c->Mode = HAL_I2C_MODE_NONE;
<> 144:ef7eb2e8f9f7 5149
<> 144:ef7eb2e8f9f7 5150 HAL_I2C_MasterRxCpltCallback(hi2c);
<> 144:ef7eb2e8f9f7 5151 }
<> 144:ef7eb2e8f9f7 5152 }
<> 144:ef7eb2e8f9f7 5153 }
<> 144:ef7eb2e8f9f7 5154 }
<> 144:ef7eb2e8f9f7 5155
<> 144:ef7eb2e8f9f7 5156 /**
<> 144:ef7eb2e8f9f7 5157 * @brief DMA I2C communication error callback.
<> 144:ef7eb2e8f9f7 5158 * @param hdma DMA handle
<> 144:ef7eb2e8f9f7 5159 * @retval None
<> 144:ef7eb2e8f9f7 5160 */
<> 144:ef7eb2e8f9f7 5161 static void I2C_DMAError(DMA_HandleTypeDef *hdma)
<> 144:ef7eb2e8f9f7 5162 {
<> 144:ef7eb2e8f9f7 5163 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
AnnaBridge 167:e84263d55307 5164
AnnaBridge 167:e84263d55307 5165 /* Ignore DMA FIFO error */
AnnaBridge 167:e84263d55307 5166 if(HAL_DMA_GetError(hdma) != HAL_DMA_ERROR_FE)
AnnaBridge 167:e84263d55307 5167 {
AnnaBridge 167:e84263d55307 5168 /* Disable Acknowledge */
AnnaBridge 167:e84263d55307 5169 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
AnnaBridge 167:e84263d55307 5170
AnnaBridge 167:e84263d55307 5171 hi2c->XferCount = 0U;
AnnaBridge 167:e84263d55307 5172
AnnaBridge 167:e84263d55307 5173 hi2c->State = HAL_I2C_STATE_READY;
AnnaBridge 167:e84263d55307 5174 hi2c->Mode = HAL_I2C_MODE_NONE;
AnnaBridge 167:e84263d55307 5175
AnnaBridge 167:e84263d55307 5176 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
AnnaBridge 167:e84263d55307 5177
AnnaBridge 167:e84263d55307 5178 HAL_I2C_ErrorCallback(hi2c);
AnnaBridge 167:e84263d55307 5179 }
<> 144:ef7eb2e8f9f7 5180 }
<> 144:ef7eb2e8f9f7 5181
<> 144:ef7eb2e8f9f7 5182 /**
<> 144:ef7eb2e8f9f7 5183 * @brief DMA I2C communication abort callback
<> 144:ef7eb2e8f9f7 5184 * (To be called at end of DMA Abort procedure).
<> 144:ef7eb2e8f9f7 5185 * @param hdma: DMA handle.
<> 144:ef7eb2e8f9f7 5186 * @retval None
<> 144:ef7eb2e8f9f7 5187 */
<> 144:ef7eb2e8f9f7 5188 static void I2C_DMAAbort(DMA_HandleTypeDef *hdma)
<> 144:ef7eb2e8f9f7 5189 {
<> 144:ef7eb2e8f9f7 5190 I2C_HandleTypeDef* hi2c = ( I2C_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
<> 144:ef7eb2e8f9f7 5191
<> 144:ef7eb2e8f9f7 5192 /* Disable Acknowledge */
<> 144:ef7eb2e8f9f7 5193 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
<> 144:ef7eb2e8f9f7 5194
<> 144:ef7eb2e8f9f7 5195 hi2c->XferCount = 0U;
<> 144:ef7eb2e8f9f7 5196
<> 144:ef7eb2e8f9f7 5197 /* Reset XferAbortCallback */
<> 144:ef7eb2e8f9f7 5198 hi2c->hdmatx->XferAbortCallback = NULL;
<> 144:ef7eb2e8f9f7 5199 hi2c->hdmarx->XferAbortCallback = NULL;
<> 144:ef7eb2e8f9f7 5200
<> 144:ef7eb2e8f9f7 5201 /* Check if come from abort from user */
<> 144:ef7eb2e8f9f7 5202 if(hi2c->State == HAL_I2C_STATE_ABORT)
<> 144:ef7eb2e8f9f7 5203 {
<> 144:ef7eb2e8f9f7 5204 hi2c->State = HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 5205 hi2c->Mode = HAL_I2C_MODE_NONE;
<> 144:ef7eb2e8f9f7 5206 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
<> 144:ef7eb2e8f9f7 5207
<> 144:ef7eb2e8f9f7 5208 /* Disable I2C peripheral to prevent dummy data in buffer */
<> 144:ef7eb2e8f9f7 5209 __HAL_I2C_DISABLE(hi2c);
<> 144:ef7eb2e8f9f7 5210
<> 144:ef7eb2e8f9f7 5211 /* Call the corresponding callback to inform upper layer of End of Transfer */
<> 144:ef7eb2e8f9f7 5212 HAL_I2C_AbortCpltCallback(hi2c);
<> 144:ef7eb2e8f9f7 5213 }
<> 144:ef7eb2e8f9f7 5214 else
<> 144:ef7eb2e8f9f7 5215 {
<> 144:ef7eb2e8f9f7 5216 hi2c->State = HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 5217 hi2c->Mode = HAL_I2C_MODE_NONE;
<> 144:ef7eb2e8f9f7 5218
<> 144:ef7eb2e8f9f7 5219 /* Disable I2C peripheral to prevent dummy data in buffer */
<> 144:ef7eb2e8f9f7 5220 __HAL_I2C_DISABLE(hi2c);
<> 144:ef7eb2e8f9f7 5221
<> 144:ef7eb2e8f9f7 5222 /* Call the corresponding callback to inform upper layer of End of Transfer */
<> 144:ef7eb2e8f9f7 5223 HAL_I2C_ErrorCallback(hi2c);
<> 144:ef7eb2e8f9f7 5224 }
<> 144:ef7eb2e8f9f7 5225 }
<> 144:ef7eb2e8f9f7 5226
<> 144:ef7eb2e8f9f7 5227 /**
<> 144:ef7eb2e8f9f7 5228 * @brief This function handles I2C Communication Timeout.
<> 144:ef7eb2e8f9f7 5229 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 5230 * the configuration information for I2C module
<> 144:ef7eb2e8f9f7 5231 * @param Flag specifies the I2C flag to check.
<> 144:ef7eb2e8f9f7 5232 * @param Status The new Flag status (SET or RESET).
<> 144:ef7eb2e8f9f7 5233 * @param Timeout Timeout duration
<> 144:ef7eb2e8f9f7 5234 * @param Tickstart Tick start value
<> 144:ef7eb2e8f9f7 5235 * @retval HAL status
<> 144:ef7eb2e8f9f7 5236 */
<> 144:ef7eb2e8f9f7 5237 static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart)
<> 144:ef7eb2e8f9f7 5238 {
<> 144:ef7eb2e8f9f7 5239 /* Wait until flag is set */
<> 144:ef7eb2e8f9f7 5240 while((__HAL_I2C_GET_FLAG(hi2c, Flag) ? SET : RESET) == Status)
<> 144:ef7eb2e8f9f7 5241 {
<> 144:ef7eb2e8f9f7 5242 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 5243 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 5244 {
<> 144:ef7eb2e8f9f7 5245 if((Timeout == 0U)||((HAL_GetTick() - Tickstart ) > Timeout))
<> 144:ef7eb2e8f9f7 5246 {
<> 144:ef7eb2e8f9f7 5247 hi2c->PreviousState = I2C_STATE_NONE;
<> 144:ef7eb2e8f9f7 5248 hi2c->State= HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 5249 hi2c->Mode = HAL_I2C_MODE_NONE;
<> 144:ef7eb2e8f9f7 5250
<> 144:ef7eb2e8f9f7 5251 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 5252 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 5253
<> 144:ef7eb2e8f9f7 5254 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 5255 }
<> 144:ef7eb2e8f9f7 5256 }
<> 144:ef7eb2e8f9f7 5257 }
<> 144:ef7eb2e8f9f7 5258
<> 144:ef7eb2e8f9f7 5259 return HAL_OK;
<> 144:ef7eb2e8f9f7 5260 }
<> 144:ef7eb2e8f9f7 5261
<> 144:ef7eb2e8f9f7 5262 /**
<> 144:ef7eb2e8f9f7 5263 * @brief This function handles I2C Communication Timeout for Master addressing phase.
<> 144:ef7eb2e8f9f7 5264 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 5265 * the configuration information for I2C module
<> 144:ef7eb2e8f9f7 5266 * @param Flag specifies the I2C flag to check.
<> 144:ef7eb2e8f9f7 5267 * @param Timeout Timeout duration
<> 144:ef7eb2e8f9f7 5268 * @param Tickstart Tick start value
<> 144:ef7eb2e8f9f7 5269 * @retval HAL status
<> 144:ef7eb2e8f9f7 5270 */
<> 144:ef7eb2e8f9f7 5271 static HAL_StatusTypeDef I2C_WaitOnMasterAddressFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, uint32_t Timeout, uint32_t Tickstart)
<> 144:ef7eb2e8f9f7 5272 {
<> 144:ef7eb2e8f9f7 5273 while(__HAL_I2C_GET_FLAG(hi2c, Flag) == RESET)
<> 144:ef7eb2e8f9f7 5274 {
<> 144:ef7eb2e8f9f7 5275 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET)
<> 144:ef7eb2e8f9f7 5276 {
<> 144:ef7eb2e8f9f7 5277 /* Generate Stop */
<> 144:ef7eb2e8f9f7 5278 hi2c->Instance->CR1 |= I2C_CR1_STOP;
<> 144:ef7eb2e8f9f7 5279
<> 144:ef7eb2e8f9f7 5280 /* Clear AF Flag */
<> 144:ef7eb2e8f9f7 5281 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
<> 144:ef7eb2e8f9f7 5282
<> 144:ef7eb2e8f9f7 5283 hi2c->ErrorCode = HAL_I2C_ERROR_AF;
<> 144:ef7eb2e8f9f7 5284 hi2c->PreviousState = I2C_STATE_NONE;
<> 144:ef7eb2e8f9f7 5285 hi2c->State= HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 5286
<> 144:ef7eb2e8f9f7 5287 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 5288 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 5289
<> 144:ef7eb2e8f9f7 5290 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 5291 }
<> 144:ef7eb2e8f9f7 5292
<> 144:ef7eb2e8f9f7 5293 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 5294 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 5295 {
<> 144:ef7eb2e8f9f7 5296 if((Timeout == 0U)||((HAL_GetTick() - Tickstart ) > Timeout))
<> 144:ef7eb2e8f9f7 5297 {
<> 144:ef7eb2e8f9f7 5298 hi2c->PreviousState = I2C_STATE_NONE;
<> 144:ef7eb2e8f9f7 5299 hi2c->State= HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 5300
<> 144:ef7eb2e8f9f7 5301 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 5302 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 5303
<> 144:ef7eb2e8f9f7 5304 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 5305 }
<> 144:ef7eb2e8f9f7 5306 }
<> 144:ef7eb2e8f9f7 5307 }
<> 144:ef7eb2e8f9f7 5308 return HAL_OK;
<> 144:ef7eb2e8f9f7 5309 }
<> 144:ef7eb2e8f9f7 5310
<> 144:ef7eb2e8f9f7 5311 /**
<> 144:ef7eb2e8f9f7 5312 * @brief This function handles I2C Communication Timeout for specific usage of TXE flag.
<> 144:ef7eb2e8f9f7 5313 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 5314 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 5315 * @param Timeout Timeout duration
<> 144:ef7eb2e8f9f7 5316 * @param Tickstart Tick start value
<> 144:ef7eb2e8f9f7 5317 * @retval HAL status
<> 144:ef7eb2e8f9f7 5318 */
<> 144:ef7eb2e8f9f7 5319 static HAL_StatusTypeDef I2C_WaitOnTXEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
<> 144:ef7eb2e8f9f7 5320 {
<> 144:ef7eb2e8f9f7 5321 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE) == RESET)
<> 144:ef7eb2e8f9f7 5322 {
<> 144:ef7eb2e8f9f7 5323 /* Check if a NACK is detected */
<> 144:ef7eb2e8f9f7 5324 if(I2C_IsAcknowledgeFailed(hi2c) != HAL_OK)
<> 144:ef7eb2e8f9f7 5325 {
<> 144:ef7eb2e8f9f7 5326 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 5327 }
<> 144:ef7eb2e8f9f7 5328
<> 144:ef7eb2e8f9f7 5329 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 5330 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 5331 {
<> 144:ef7eb2e8f9f7 5332 if((Timeout == 0U) || ((HAL_GetTick()-Tickstart) > Timeout))
<> 144:ef7eb2e8f9f7 5333 {
<> 144:ef7eb2e8f9f7 5334 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
<> 144:ef7eb2e8f9f7 5335 hi2c->PreviousState = I2C_STATE_NONE;
<> 144:ef7eb2e8f9f7 5336 hi2c->State= HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 5337
<> 144:ef7eb2e8f9f7 5338 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 5339 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 5340
<> 144:ef7eb2e8f9f7 5341 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 5342 }
<> 144:ef7eb2e8f9f7 5343 }
<> 144:ef7eb2e8f9f7 5344 }
<> 144:ef7eb2e8f9f7 5345 return HAL_OK;
<> 144:ef7eb2e8f9f7 5346 }
<> 144:ef7eb2e8f9f7 5347
<> 144:ef7eb2e8f9f7 5348 /**
<> 144:ef7eb2e8f9f7 5349 * @brief This function handles I2C Communication Timeout for specific usage of BTF flag.
<> 144:ef7eb2e8f9f7 5350 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 5351 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 5352 * @param Timeout Timeout duration
<> 144:ef7eb2e8f9f7 5353 * @param Tickstart Tick start value
<> 144:ef7eb2e8f9f7 5354 * @retval HAL status
<> 144:ef7eb2e8f9f7 5355 */
<> 144:ef7eb2e8f9f7 5356 static HAL_StatusTypeDef I2C_WaitOnBTFFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
<> 144:ef7eb2e8f9f7 5357 {
<> 144:ef7eb2e8f9f7 5358 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == RESET)
<> 144:ef7eb2e8f9f7 5359 {
<> 144:ef7eb2e8f9f7 5360 /* Check if a NACK is detected */
<> 144:ef7eb2e8f9f7 5361 if(I2C_IsAcknowledgeFailed(hi2c) != HAL_OK)
<> 144:ef7eb2e8f9f7 5362 {
<> 144:ef7eb2e8f9f7 5363 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 5364 }
<> 144:ef7eb2e8f9f7 5365
<> 144:ef7eb2e8f9f7 5366 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 5367 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 5368 {
<> 144:ef7eb2e8f9f7 5369 if((Timeout == 0U) || ((HAL_GetTick()-Tickstart) > Timeout))
<> 144:ef7eb2e8f9f7 5370 {
<> 144:ef7eb2e8f9f7 5371 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
<> 144:ef7eb2e8f9f7 5372 hi2c->PreviousState = I2C_STATE_NONE;
<> 144:ef7eb2e8f9f7 5373 hi2c->State= HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 5374
<> 144:ef7eb2e8f9f7 5375 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 5376 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 5377
<> 144:ef7eb2e8f9f7 5378 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 5379 }
<> 144:ef7eb2e8f9f7 5380 }
<> 144:ef7eb2e8f9f7 5381 }
<> 144:ef7eb2e8f9f7 5382 return HAL_OK;
<> 144:ef7eb2e8f9f7 5383 }
<> 144:ef7eb2e8f9f7 5384
<> 144:ef7eb2e8f9f7 5385 /**
<> 144:ef7eb2e8f9f7 5386 * @brief This function handles I2C Communication Timeout for specific usage of STOP flag.
<> 144:ef7eb2e8f9f7 5387 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 5388 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 5389 * @param Timeout Timeout duration
<> 144:ef7eb2e8f9f7 5390 * @param Tickstart Tick start value
<> 144:ef7eb2e8f9f7 5391 * @retval HAL status
<> 144:ef7eb2e8f9f7 5392 */
<> 144:ef7eb2e8f9f7 5393 static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
<> 144:ef7eb2e8f9f7 5394 {
<> 144:ef7eb2e8f9f7 5395 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET)
<> 144:ef7eb2e8f9f7 5396 {
<> 144:ef7eb2e8f9f7 5397 /* Check if a NACK is detected */
<> 144:ef7eb2e8f9f7 5398 if(I2C_IsAcknowledgeFailed(hi2c) != HAL_OK)
<> 144:ef7eb2e8f9f7 5399 {
<> 144:ef7eb2e8f9f7 5400 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 5401 }
<> 144:ef7eb2e8f9f7 5402
<> 144:ef7eb2e8f9f7 5403 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 5404 if((Timeout == 0U) || ((HAL_GetTick()-Tickstart) > Timeout))
<> 144:ef7eb2e8f9f7 5405 {
<> 144:ef7eb2e8f9f7 5406 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
<> 144:ef7eb2e8f9f7 5407 hi2c->PreviousState = I2C_STATE_NONE;
<> 144:ef7eb2e8f9f7 5408 hi2c->State= HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 5409
<> 144:ef7eb2e8f9f7 5410 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 5411 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 5412
<> 144:ef7eb2e8f9f7 5413 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 5414 }
<> 144:ef7eb2e8f9f7 5415 }
<> 144:ef7eb2e8f9f7 5416 return HAL_OK;
<> 144:ef7eb2e8f9f7 5417 }
<> 144:ef7eb2e8f9f7 5418
<> 144:ef7eb2e8f9f7 5419 /**
<> 144:ef7eb2e8f9f7 5420 * @brief This function handles I2C Communication Timeout for specific usage of RXNE flag.
<> 144:ef7eb2e8f9f7 5421 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 5422 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 5423 * @param Timeout Timeout duration
<> 144:ef7eb2e8f9f7 5424 * @param Tickstart Tick start value
<> 144:ef7eb2e8f9f7 5425 * @retval HAL status
<> 144:ef7eb2e8f9f7 5426 */
<> 144:ef7eb2e8f9f7 5427 static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
<> 144:ef7eb2e8f9f7 5428 {
<> 144:ef7eb2e8f9f7 5429
<> 144:ef7eb2e8f9f7 5430 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == RESET)
<> 144:ef7eb2e8f9f7 5431 {
<> 144:ef7eb2e8f9f7 5432 /* Check if a STOPF is detected */
<> 144:ef7eb2e8f9f7 5433 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == SET)
<> 144:ef7eb2e8f9f7 5434 {
<> 144:ef7eb2e8f9f7 5435 /* Clear STOP Flag */
<> 144:ef7eb2e8f9f7 5436 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
<> 144:ef7eb2e8f9f7 5437
<> 144:ef7eb2e8f9f7 5438 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
<> 144:ef7eb2e8f9f7 5439 hi2c->PreviousState = I2C_STATE_NONE;
<> 144:ef7eb2e8f9f7 5440 hi2c->State= HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 5441
<> 144:ef7eb2e8f9f7 5442 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 5443 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 5444
<> 144:ef7eb2e8f9f7 5445 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 5446 }
<> 144:ef7eb2e8f9f7 5447
<> 144:ef7eb2e8f9f7 5448 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 5449 if((Timeout == 0U) || ((HAL_GetTick()-Tickstart) > Timeout))
<> 144:ef7eb2e8f9f7 5450 {
<> 144:ef7eb2e8f9f7 5451 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
<> 144:ef7eb2e8f9f7 5452 hi2c->State= HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 5453
<> 144:ef7eb2e8f9f7 5454 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 5455 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 5456
<> 144:ef7eb2e8f9f7 5457 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 5458 }
<> 144:ef7eb2e8f9f7 5459 }
<> 144:ef7eb2e8f9f7 5460 return HAL_OK;
<> 144:ef7eb2e8f9f7 5461 }
<> 144:ef7eb2e8f9f7 5462
<> 144:ef7eb2e8f9f7 5463 /**
<> 144:ef7eb2e8f9f7 5464 * @brief This function handles Acknowledge failed detection during an I2C Communication.
<> 144:ef7eb2e8f9f7 5465 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 5466 * the configuration information for the specified I2C.
<> 144:ef7eb2e8f9f7 5467 * @retval HAL status
<> 144:ef7eb2e8f9f7 5468 */
<> 144:ef7eb2e8f9f7 5469 static HAL_StatusTypeDef I2C_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c)
<> 144:ef7eb2e8f9f7 5470 {
<> 144:ef7eb2e8f9f7 5471 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET)
<> 144:ef7eb2e8f9f7 5472 {
<> 144:ef7eb2e8f9f7 5473 /* Clear NACKF Flag */
<> 144:ef7eb2e8f9f7 5474 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
<> 144:ef7eb2e8f9f7 5475
<> 144:ef7eb2e8f9f7 5476 hi2c->ErrorCode = HAL_I2C_ERROR_AF;
<> 144:ef7eb2e8f9f7 5477 hi2c->PreviousState = I2C_STATE_NONE;
<> 144:ef7eb2e8f9f7 5478 hi2c->State= HAL_I2C_STATE_READY;
<> 144:ef7eb2e8f9f7 5479
<> 144:ef7eb2e8f9f7 5480 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 5481 __HAL_UNLOCK(hi2c);
<> 144:ef7eb2e8f9f7 5482
<> 144:ef7eb2e8f9f7 5483 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 5484 }
<> 144:ef7eb2e8f9f7 5485 return HAL_OK;
<> 144:ef7eb2e8f9f7 5486 }
<> 144:ef7eb2e8f9f7 5487 /**
<> 144:ef7eb2e8f9f7 5488 * @}
<> 144:ef7eb2e8f9f7 5489 */
<> 144:ef7eb2e8f9f7 5490
<> 144:ef7eb2e8f9f7 5491 #endif /* HAL_I2C_MODULE_ENABLED */
<> 144:ef7eb2e8f9f7 5492
<> 144:ef7eb2e8f9f7 5493 /**
<> 144:ef7eb2e8f9f7 5494 * @}
<> 144:ef7eb2e8f9f7 5495 */
<> 144:ef7eb2e8f9f7 5496
<> 144:ef7eb2e8f9f7 5497 /**
<> 144:ef7eb2e8f9f7 5498 * @}
<> 144:ef7eb2e8f9f7 5499 */
<> 144:ef7eb2e8f9f7 5500
<> 144:ef7eb2e8f9f7 5501 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/