1 /**
2   ******************************************************************************
3   * @file    stm32f1xx_hal_i2c.c
4   * @author  MCD Application Team
5   * @brief   I2C HAL module driver.
6   *          This file provides firmware functions to manage the following
7   *          functionalities of the Inter Integrated Circuit (I2C) peripheral:
8   *           + Initialization and de-initialization functions
9   *           + IO operation functions
10   *           + Peripheral State, Mode and Error functions
11   *
12   @verbatim
13   ==============================================================================
14                         ##### How to use this driver #####
15   ==============================================================================
16   [..]
17     The I2C HAL driver can be used as follows:
18 
19     (#) Declare a I2C_HandleTypeDef handle structure, for example:
20         I2C_HandleTypeDef  hi2c;
21 
22     (#)Initialize the I2C low level resources by implementing the @ref HAL_I2C_MspInit() API:
23         (##) Enable the I2Cx interface clock
24         (##) I2C pins configuration
25             (+++) Enable the clock for the I2C GPIOs
26             (+++) Configure I2C pins as alternate function open-drain
27         (##) NVIC configuration if you need to use interrupt process
28             (+++) Configure the I2Cx interrupt priority
29             (+++) Enable the NVIC I2C IRQ Channel
30         (##) DMA Configuration if you need to use DMA process
31             (+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive channel
32             (+++) Enable the DMAx interface clock using
33             (+++) Configure the DMA handle parameters
34             (+++) Configure the DMA Tx or Rx channel
35             (+++) Associate the initialized DMA handle to the hi2c DMA Tx or Rx handle
36             (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on
37                   the DMA Tx or Rx channel
38 
39     (#) Configure the Communication Speed, Duty cycle, Addressing mode, Own Address1,
40         Dual Addressing mode, Own Address2, General call and Nostretch mode in the hi2c Init structure.
41 
42     (#) Initialize the I2C registers by calling the @ref HAL_I2C_Init(), configures also the low level Hardware
43         (GPIO, CLOCK, NVIC...etc) by calling the customized @ref HAL_I2C_MspInit() API.
44 
45     (#) To check if target device is ready for communication, use the function @ref HAL_I2C_IsDeviceReady()
46 
47     (#) For I2C IO and IO MEM operations, three operation modes are available within this driver :
48 
49     *** Polling mode IO operation ***
50     =================================
51     [..]
52       (+) Transmit in master mode an amount of data in blocking mode using @ref HAL_I2C_Master_Transmit()
53       (+) Receive in master mode an amount of data in blocking mode using @ref HAL_I2C_Master_Receive()
54       (+) Transmit in slave mode an amount of data in blocking mode using @ref HAL_I2C_Slave_Transmit()
55       (+) Receive in slave mode an amount of data in blocking mode using @ref HAL_I2C_Slave_Receive()
56 
57     *** Polling mode IO MEM operation ***
58     =====================================
59     [..]
60       (+) Write an amount of data in blocking mode to a specific memory address using @ref HAL_I2C_Mem_Write()
61       (+) Read an amount of data in blocking mode from a specific memory address using @ref HAL_I2C_Mem_Read()
62 
63 
64     *** Interrupt mode IO operation ***
65     ===================================
66     [..]
67       (+) Transmit in master mode an amount of data in non-blocking mode using @ref HAL_I2C_Master_Transmit_IT()
68       (+) At transmission end of transfer, @ref HAL_I2C_MasterTxCpltCallback() is executed and user can
69            add his own code by customization of function pointer @ref HAL_I2C_MasterTxCpltCallback()
70       (+) Receive in master mode an amount of data in non-blocking mode using @ref HAL_I2C_Master_Receive_IT()
71       (+) At reception end of transfer, @ref HAL_I2C_MasterRxCpltCallback() is executed and user can
72            add his own code by customization of function pointer @ref HAL_I2C_MasterRxCpltCallback()
73       (+) Transmit in slave mode an amount of data in non-blocking mode using @ref HAL_I2C_Slave_Transmit_IT()
74       (+) At transmission end of transfer, @ref HAL_I2C_SlaveTxCpltCallback() is executed and user can
75            add his own code by customization of function pointer @ref HAL_I2C_SlaveTxCpltCallback()
76       (+) Receive in slave mode an amount of data in non-blocking mode using @ref HAL_I2C_Slave_Receive_IT()
77       (+) At reception end of transfer, @ref HAL_I2C_SlaveRxCpltCallback() is executed and user can
78            add his own code by customization of function pointer @ref HAL_I2C_SlaveRxCpltCallback()
79       (+) In case of transfer Error, @ref HAL_I2C_ErrorCallback() function is executed and user can
80            add his own code by customization of function pointer @ref HAL_I2C_ErrorCallback()
81       (+) Abort a master I2C process communication with Interrupt using @ref HAL_I2C_Master_Abort_IT()
82       (+) End of abort process, @ref HAL_I2C_AbortCpltCallback() is executed and user can
83            add his own code by customization of function pointer @ref HAL_I2C_AbortCpltCallback()
84 
85     *** Interrupt mode or DMA mode IO sequential operation ***
86     ==========================================================
87     [..]
88       (@) These interfaces allow to manage a sequential transfer with a repeated start condition
89           when a direction change during transfer
90     [..]
91       (+) A specific option field manage the different steps of a sequential transfer
92       (+) Option field values are defined through @ref I2C_XferOptions_definition and are listed below:
93       (++) I2C_FIRST_AND_LAST_FRAME: No sequential usage, functional is same as associated interfaces in no sequential mode
94       (++) I2C_FIRST_FRAME: Sequential usage, this option allow to manage a sequence with start condition, address
95                             and data to transfer without a final stop condition
96       (++) I2C_FIRST_AND_NEXT_FRAME: Sequential usage (Master only), this option allow to manage a sequence with start condition, address
97                             and data to transfer without a final stop condition, an then permit a call the same master sequential interface
98                             several times (like @ref HAL_I2C_Master_Seq_Transmit_IT() then @ref HAL_I2C_Master_Seq_Transmit_IT()
99                             or @ref HAL_I2C_Master_Seq_Transmit_DMA() then @ref HAL_I2C_Master_Seq_Transmit_DMA())
100       (++) I2C_NEXT_FRAME: Sequential usage, this option allow to manage a sequence with a restart condition, address
101                             and with new data to transfer if the direction change or manage only the new data to transfer
102                             if no direction change and without a final stop condition in both cases
103       (++) I2C_LAST_FRAME: Sequential usage, this option allow to manage a sequance with a restart condition, address
104                             and with new data to transfer if the direction change or manage only the new data to transfer
105                             if no direction change and with a final stop condition in both cases
106       (++) I2C_LAST_FRAME_NO_STOP: Sequential usage (Master only), this option allow to manage a restart condition after several call of the same master sequential
107                             interface several times (link with option I2C_FIRST_AND_NEXT_FRAME).
108                             Usage can, transfer several bytes one by one using HAL_I2C_Master_Seq_Transmit_IT(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME)
109                               or HAL_I2C_Master_Seq_Receive_IT(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME)
110                               or HAL_I2C_Master_Seq_Transmit_DMA(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME)
111                               or HAL_I2C_Master_Seq_Receive_DMA(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME).
112                             Then usage of this option I2C_LAST_FRAME_NO_STOP at the last Transmit or Receive sequence permit to call the opposite interface Receive or Transmit
113                               without stopping the communication and so generate a restart condition.
114       (++) I2C_OTHER_FRAME: Sequential usage (Master only), this option allow to manage a restart condition after each call of the same master sequential
115                             interface.
116                             Usage can, transfer several bytes one by one with a restart with slave address between each bytes using HAL_I2C_Master_Seq_Transmit_IT(option I2C_FIRST_FRAME then I2C_OTHER_FRAME)
117                               or HAL_I2C_Master_Seq_Receive_IT(option I2C_FIRST_FRAME then I2C_OTHER_FRAME)
118                               or HAL_I2C_Master_Seq_Transmit_DMA(option I2C_FIRST_FRAME then I2C_OTHER_FRAME)
119                               or HAL_I2C_Master_Seq_Receive_DMA(option I2C_FIRST_FRAME then I2C_OTHER_FRAME).
120                             Then usage of this option I2C_OTHER_AND_LAST_FRAME at the last frame to help automatic generation of STOP condition.
121 
122       (+) Different sequential I2C interfaces are listed below:
123       (++) Sequential transmit in master I2C mode an amount of data in non-blocking mode using @ref HAL_I2C_Master_Seq_Transmit_IT()
124             or using @ref HAL_I2C_Master_Seq_Transmit_DMA()
125       (+++) At transmission end of current frame transfer, @ref HAL_I2C_MasterTxCpltCallback() is executed and user can
126            add his own code by customization of function pointer @ref HAL_I2C_MasterTxCpltCallback()
127       (++) Sequential receive in master I2C mode an amount of data in non-blocking mode using @ref HAL_I2C_Master_Seq_Receive_IT()
128             or using @ref HAL_I2C_Master_Seq_Receive_DMA()
129       (+++) At reception end of current frame transfer, @ref HAL_I2C_MasterRxCpltCallback() is executed and user can
130            add his own code by customization of function pointer @ref HAL_I2C_MasterRxCpltCallback()
131       (++) Abort a master IT or DMA I2C process communication with Interrupt using @ref HAL_I2C_Master_Abort_IT()
132       (+++) End of abort process, @ref HAL_I2C_AbortCpltCallback() is executed and user can
133            add his own code by customization of function pointer @ref HAL_I2C_AbortCpltCallback()
134       (++) Enable/disable the Address listen mode in slave I2C mode using @ref HAL_I2C_EnableListen_IT() @ref HAL_I2C_DisableListen_IT()
135       (+++) When address slave I2C match, @ref HAL_I2C_AddrCallback() is executed and user can
136            add his own code to check the Address Match Code and the transmission direction request by master (Write/Read).
137       (+++) At Listen mode end @ref HAL_I2C_ListenCpltCallback() is executed and user can
138            add his own code by customization of function pointer @ref HAL_I2C_ListenCpltCallback()
139       (++) Sequential transmit in slave I2C mode an amount of data in non-blocking mode using @ref HAL_I2C_Slave_Seq_Transmit_IT()
140             or using @ref HAL_I2C_Slave_Seq_Transmit_DMA()
141       (+++) At transmission end of current frame transfer, @ref HAL_I2C_SlaveTxCpltCallback() is executed and user can
142            add his own code by customization of function pointer @ref HAL_I2C_SlaveTxCpltCallback()
143       (++) Sequential receive in slave I2C mode an amount of data in non-blocking mode using @ref HAL_I2C_Slave_Seq_Receive_IT()
144             or using @ref HAL_I2C_Slave_Seq_Receive_DMA()
145       (+++) At reception end of current frame transfer, @ref HAL_I2C_SlaveRxCpltCallback() is executed and user can
146            add his own code by customization of function pointer @ref HAL_I2C_SlaveRxCpltCallback()
147       (++) In case of transfer Error, @ref HAL_I2C_ErrorCallback() function is executed and user can
148            add his own code by customization of function pointer @ref HAL_I2C_ErrorCallback()
149 
150     *** Interrupt mode IO MEM operation ***
151     =======================================
152     [..]
153       (+) Write an amount of data in non-blocking mode with Interrupt to a specific memory address using
154           @ref HAL_I2C_Mem_Write_IT()
155       (+) At Memory end of write transfer, @ref HAL_I2C_MemTxCpltCallback() is executed and user can
156            add his own code by customization of function pointer @ref HAL_I2C_MemTxCpltCallback()
157       (+) Read an amount of data in non-blocking mode with Interrupt from a specific memory address using
158           @ref HAL_I2C_Mem_Read_IT()
159       (+) At Memory end of read transfer, @ref HAL_I2C_MemRxCpltCallback() is executed and user can
160            add his own code by customization of function pointer @ref HAL_I2C_MemRxCpltCallback()
161       (+) In case of transfer Error, @ref HAL_I2C_ErrorCallback() function is executed and user can
162            add his own code by customization of function pointer @ref HAL_I2C_ErrorCallback()
163 
164     *** DMA mode IO operation ***
165     ==============================
166     [..]
167       (+) Transmit in master mode an amount of data in non-blocking mode (DMA) using
168           @ref HAL_I2C_Master_Transmit_DMA()
169       (+) At transmission end of transfer, @ref HAL_I2C_MasterTxCpltCallback() is executed and user can
170            add his own code by customization of function pointer @ref HAL_I2C_MasterTxCpltCallback()
171       (+) Receive in master mode an amount of data in non-blocking mode (DMA) using
172           @ref HAL_I2C_Master_Receive_DMA()
173       (+) At reception end of transfer, @ref HAL_I2C_MasterRxCpltCallback() is executed and user can
174            add his own code by customization of function pointer @ref HAL_I2C_MasterRxCpltCallback()
175       (+) Transmit in slave mode an amount of data in non-blocking mode (DMA) using
176           @ref HAL_I2C_Slave_Transmit_DMA()
177       (+) At transmission end of transfer, @ref HAL_I2C_SlaveTxCpltCallback() is executed and user can
178            add his own code by customization of function pointer @ref HAL_I2C_SlaveTxCpltCallback()
179       (+) Receive in slave mode an amount of data in non-blocking mode (DMA) using
180           @ref HAL_I2C_Slave_Receive_DMA()
181       (+) At reception end of transfer, @ref HAL_I2C_SlaveRxCpltCallback() is executed and user can
182            add his own code by customization of function pointer @ref HAL_I2C_SlaveRxCpltCallback()
183       (+) In case of transfer Error, @ref HAL_I2C_ErrorCallback() function is executed and user can
184            add his own code by customization of function pointer @ref HAL_I2C_ErrorCallback()
185       (+) Abort a master I2C process communication with Interrupt using @ref HAL_I2C_Master_Abort_IT()
186       (+) End of abort process, @ref HAL_I2C_AbortCpltCallback() is executed and user can
187            add his own code by customization of function pointer @ref HAL_I2C_AbortCpltCallback()
188 
189     *** DMA mode IO MEM operation ***
190     =================================
191     [..]
192       (+) Write an amount of data in non-blocking mode with DMA to a specific memory address using
193           @ref HAL_I2C_Mem_Write_DMA()
194       (+) At Memory end of write transfer, @ref HAL_I2C_MemTxCpltCallback() is executed and user can
195            add his own code by customization of function pointer @ref HAL_I2C_MemTxCpltCallback()
196       (+) Read an amount of data in non-blocking mode with DMA from a specific memory address using
197           @ref HAL_I2C_Mem_Read_DMA()
198       (+) At Memory end of read transfer, @ref HAL_I2C_MemRxCpltCallback() is executed and user can
199            add his own code by customization of function pointer @ref HAL_I2C_MemRxCpltCallback()
200       (+) In case of transfer Error, @ref HAL_I2C_ErrorCallback() function is executed and user can
201            add his own code by customization of function pointer @ref HAL_I2C_ErrorCallback()
202 
203 
204      *** I2C HAL driver macros list ***
205      ==================================
206      [..]
207        Below the list of most used macros in I2C HAL driver.
208 
209       (+) @ref __HAL_I2C_ENABLE:     Enable the I2C peripheral
210       (+) @ref __HAL_I2C_DISABLE:    Disable the I2C peripheral
211       (+) @ref __HAL_I2C_GET_FLAG:   Checks whether the specified I2C flag is set or not
212       (+) @ref __HAL_I2C_CLEAR_FLAG: Clear the specified I2C pending flag
213       (+) @ref __HAL_I2C_ENABLE_IT:  Enable the specified I2C interrupt
214       (+) @ref __HAL_I2C_DISABLE_IT: Disable the specified I2C interrupt
215 
216      *** Callback registration ***
217      =============================================
218     [..]
219      The compilation flag USE_HAL_I2C_REGISTER_CALLBACKS when set to 1
220      allows the user to configure dynamically the driver callbacks.
221      Use Functions @ref HAL_I2C_RegisterCallback() or @ref HAL_I2C_RegisterAddrCallback()
222      to register an interrupt callback.
223     [..]
224      Function @ref HAL_I2C_RegisterCallback() allows to register following callbacks:
225        (+) MasterTxCpltCallback : callback for Master transmission end of transfer.
226        (+) MasterRxCpltCallback : callback for Master reception end of transfer.
227        (+) SlaveTxCpltCallback  : callback for Slave transmission end of transfer.
228        (+) SlaveRxCpltCallback  : callback for Slave reception end of transfer.
229        (+) ListenCpltCallback   : callback for end of listen mode.
230        (+) MemTxCpltCallback    : callback for Memory transmission end of transfer.
231        (+) MemRxCpltCallback    : callback for Memory reception end of transfer.
232        (+) ErrorCallback        : callback for error detection.
233        (+) AbortCpltCallback    : callback for abort completion process.
234        (+) MspInitCallback      : callback for Msp Init.
235        (+) MspDeInitCallback    : callback for Msp DeInit.
236      This function takes as parameters the HAL peripheral handle, the Callback ID
237      and a pointer to the user callback function.
238     [..]
239      For specific callback AddrCallback use dedicated register callbacks : @ref HAL_I2C_RegisterAddrCallback().
240     [..]
241      Use function @ref HAL_I2C_UnRegisterCallback to reset a callback to the default
242      weak function.
243      @ref HAL_I2C_UnRegisterCallback takes as parameters the HAL peripheral handle,
244      and the Callback ID.
245      This function allows to reset following callbacks:
246        (+) MasterTxCpltCallback : callback for Master transmission end of transfer.
247        (+) MasterRxCpltCallback : callback for Master reception end of transfer.
248        (+) SlaveTxCpltCallback  : callback for Slave transmission end of transfer.
249        (+) SlaveRxCpltCallback  : callback for Slave reception end of transfer.
250        (+) ListenCpltCallback   : callback for end of listen mode.
251        (+) MemTxCpltCallback    : callback for Memory transmission end of transfer.
252        (+) MemRxCpltCallback    : callback for Memory reception end of transfer.
253        (+) ErrorCallback        : callback for error detection.
254        (+) AbortCpltCallback    : callback for abort completion process.
255        (+) MspInitCallback      : callback for Msp Init.
256        (+) MspDeInitCallback    : callback for Msp DeInit.
257     [..]
258      For callback AddrCallback use dedicated register callbacks : @ref HAL_I2C_UnRegisterAddrCallback().
259     [..]
260      By default, after the @ref HAL_I2C_Init() and when the state is @ref HAL_I2C_STATE_RESET
261      all callbacks are set to the corresponding weak functions:
262      examples @ref HAL_I2C_MasterTxCpltCallback(), @ref HAL_I2C_MasterRxCpltCallback().
263      Exception done for MspInit and MspDeInit functions that are
264      reset to the legacy weak functions in the @ref HAL_I2C_Init()/ @ref HAL_I2C_DeInit() only when
265      these callbacks are null (not registered beforehand).
266      If MspInit or MspDeInit are not null, the @ref HAL_I2C_Init()/ @ref HAL_I2C_DeInit()
267      keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state.
268     [..]
269      Callbacks can be registered/unregistered in @ref HAL_I2C_STATE_READY state only.
270      Exception done MspInit/MspDeInit functions that can be registered/unregistered
271      in @ref HAL_I2C_STATE_READY or @ref HAL_I2C_STATE_RESET state,
272      thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit.
273      Then, the user first registers the MspInit/MspDeInit user callbacks
274      using @ref HAL_I2C_RegisterCallback() before calling @ref HAL_I2C_DeInit()
275      or @ref HAL_I2C_Init() function.
276     [..]
277      When the compilation flag USE_HAL_I2C_REGISTER_CALLBACKS is set to 0 or
278      not defined, the callback registration feature is not available and all callbacks
279      are set to the corresponding weak functions.
280 
281 
282      *** I2C Workarounds linked to Silicon Limitation ***
283      ====================================================
284      [..]
285        Below the list of all silicon limitations implemented for HAL on STM32F1xx product.
286        (@) See ErrataSheet to know full silicon limitation list of your product.
287 
288        (+) Workarounds Implemented inside I2C HAL Driver
289           (++) Wrong data read into data register (Polling and Interrupt mode)
290           (++) Start cannot be generated after a misplaced Stop
291           (++) Some software events must be managed before the current byte is being transferred:
292                Workaround: Use DMA in general, except when the Master is receiving a single byte.
293                For Interupt mode, I2C should have the highest priority in the application.
294           (++) Mismatch on the "Setup time for a repeated Start condition" timing parameter:
295                Workaround: Reduce the frequency down to 88 kHz or use the I2C Fast-mode if
296                supported by the slave.
297           (++) Data valid time (tVD;DAT) violated without the OVR flag being set:
298                Workaround: If the slave device allows it, use the clock stretching mechanism
299                by programming NoStretchMode = I2C_NOSTRETCH_DISABLE in @ref HAL_I2C_Init.
300 
301      [..]
302        (@) You can refer to the I2C HAL driver header file for more useful macros
303 
304   @endverbatim
305   ******************************************************************************
306   * @attention
307   *
308   * <h2><center>&copy; Copyright (c) 2016 STMicroelectronics.
309   * All rights reserved.</center></h2>
310   *
311   * This software component is licensed by ST under BSD 3-Clause license,
312   * the "License"; You may not use this file except in compliance with the
313   * License. You may obtain a copy of the License at:
314   *                        opensource.org/licenses/BSD-3-Clause
315   *
316   ******************************************************************************
317   */
318 
319 /* Includes ------------------------------------------------------------------*/
320 #include "stm32f1xx_hal.h"
321 
322 /** @addtogroup STM32F1xx_HAL_Driver
323   * @{
324   */
325 
326 /** @defgroup I2C I2C
327   * @brief I2C HAL module driver
328   * @{
329   */
330 
331 #ifdef HAL_I2C_MODULE_ENABLED
332 
333 /* Private typedef -----------------------------------------------------------*/
334 /* Private define ------------------------------------------------------------*/
335 /** @addtogroup I2C_Private_Define
336   * @{
337   */
338 #define I2C_TIMEOUT_FLAG          35U         /*!< Timeout 35 ms             */
339 #define I2C_TIMEOUT_BUSY_FLAG     25U         /*!< Timeout 25 ms             */
340 #define I2C_TIMEOUT_STOP_FLAG     5U          /*!< Timeout 5 ms              */
341 #define I2C_NO_OPTION_FRAME       0xFFFF0000U /*!< XferOptions default value */
342 
343 /* Private define for @ref PreviousState usage */
344 #define I2C_STATE_MSK             ((uint32_t)((uint32_t)((uint32_t)HAL_I2C_STATE_BUSY_TX | (uint32_t)HAL_I2C_STATE_BUSY_RX) & (uint32_t)(~((uint32_t)HAL_I2C_STATE_READY)))) /*!< Mask State define, keep only RX and TX bits            */
345 #define I2C_STATE_NONE            ((uint32_t)(HAL_I2C_MODE_NONE))                                                        /*!< Default Value                                          */
346 #define I2C_STATE_MASTER_BUSY_TX  ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_TX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_MASTER))            /*!< Master Busy TX, combinaison of State LSB and Mode enum */
347 #define I2C_STATE_MASTER_BUSY_RX  ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_RX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_MASTER))            /*!< Master Busy RX, combinaison of State LSB and Mode enum */
348 #define I2C_STATE_SLAVE_BUSY_TX   ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_TX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_SLAVE))             /*!< Slave Busy TX, combinaison of State LSB and Mode enum  */
349 #define I2C_STATE_SLAVE_BUSY_RX   ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_RX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_SLAVE))             /*!< Slave Busy RX, combinaison of State LSB and Mode enum  */
350 
351 /**
352   * @}
353   */
354 
355 /* Private macro -------------------------------------------------------------*/
356 /* Private variables ---------------------------------------------------------*/
357 /* Private function prototypes -----------------------------------------------*/
358 
359 /** @defgroup I2C_Private_Functions I2C Private Functions
360   * @{
361   */
362 /* Private functions to handle DMA transfer */
363 static void I2C_DMAXferCplt(DMA_HandleTypeDef *hdma);
364 static void I2C_DMAError(DMA_HandleTypeDef *hdma);
365 static void I2C_DMAAbort(DMA_HandleTypeDef *hdma);
366 
367 static void I2C_ITError(I2C_HandleTypeDef *hi2c);
368 
369 static HAL_StatusTypeDef I2C_MasterRequestWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart);
370 static HAL_StatusTypeDef I2C_MasterRequestRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart);
371 static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart);
372 static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart);
373 
374 /* Private functions to handle flags during polling transfer */
375 static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart);
376 static HAL_StatusTypeDef I2C_WaitOnMasterAddressFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, uint32_t Timeout, uint32_t Tickstart);
377 static HAL_StatusTypeDef I2C_WaitOnTXEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart);
378 static HAL_StatusTypeDef I2C_WaitOnBTFFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart);
379 static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart);
380 static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart);
381 static HAL_StatusTypeDef I2C_WaitOnSTOPRequestThroughIT(I2C_HandleTypeDef *hi2c);
382 static HAL_StatusTypeDef I2C_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c);
383 
384 /* Private functions for I2C transfer IRQ handler */
385 static void I2C_MasterTransmit_TXE(I2C_HandleTypeDef *hi2c);
386 static void I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c);
387 static void I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c);
388 static void I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c);
389 static void I2C_Master_SB(I2C_HandleTypeDef *hi2c);
390 static void I2C_Master_ADD10(I2C_HandleTypeDef *hi2c);
391 static void I2C_Master_ADDR(I2C_HandleTypeDef *hi2c);
392 
393 static void I2C_SlaveTransmit_TXE(I2C_HandleTypeDef *hi2c);
394 static void I2C_SlaveTransmit_BTF(I2C_HandleTypeDef *hi2c);
395 static void I2C_SlaveReceive_RXNE(I2C_HandleTypeDef *hi2c);
396 static void I2C_SlaveReceive_BTF(I2C_HandleTypeDef *hi2c);
397 static void I2C_Slave_ADDR(I2C_HandleTypeDef *hi2c, uint32_t IT2Flags);
398 static void I2C_Slave_STOPF(I2C_HandleTypeDef *hi2c);
399 static void I2C_Slave_AF(I2C_HandleTypeDef *hi2c);
400 
401 static void I2C_MemoryTransmit_TXE_BTF(I2C_HandleTypeDef *hi2c);
402 
403 /* Private function to Convert Specific options */
404 static void I2C_ConvertOtherXferOptions(I2C_HandleTypeDef *hi2c);
405 /**
406   * @}
407   */
408 
409 /* Exported functions --------------------------------------------------------*/
410 
411 /** @defgroup I2C_Exported_Functions I2C Exported Functions
412   * @{
413   */
414 
415 /** @defgroup I2C_Exported_Functions_Group1 Initialization and de-initialization functions
416  *  @brief    Initialization and Configuration functions
417  *
418 @verbatim
419  ===============================================================================
420               ##### Initialization and de-initialization functions #####
421  ===============================================================================
422     [..]  This subsection provides a set of functions allowing to initialize and
423           deinitialize the I2Cx peripheral:
424 
425       (+) User must Implement HAL_I2C_MspInit() function in which he configures
426           all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC).
427 
428       (+) Call the function HAL_I2C_Init() to configure the selected device with
429           the selected configuration:
430         (++) Communication Speed
431         (++) Duty cycle
432         (++) Addressing mode
433         (++) Own Address 1
434         (++) Dual Addressing mode
435         (++) Own Address 2
436         (++) General call mode
437         (++) Nostretch mode
438 
439       (+) Call the function HAL_I2C_DeInit() to restore the default configuration
440           of the selected I2Cx peripheral.
441 
442 @endverbatim
443   * @{
444   */
445 
446 /**
447   * @brief  Initializes the I2C according to the specified parameters
448   *         in the I2C_InitTypeDef and initialize the associated handle.
449   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
450   *                the configuration information for the specified I2C.
451   * @retval HAL status
452   */
HAL_I2C_Init(I2C_HandleTypeDef * hi2c)453 HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c)
454 {
455   uint32_t freqrange;
456   uint32_t pclk1;
457 
458   /* Check the I2C handle allocation */
459   if (hi2c == NULL)
460   {
461     return HAL_ERROR;
462   }
463 
464   /* Check the parameters */
465   assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance));
466   assert_param(IS_I2C_CLOCK_SPEED(hi2c->Init.ClockSpeed));
467   assert_param(IS_I2C_DUTY_CYCLE(hi2c->Init.DutyCycle));
468   assert_param(IS_I2C_OWN_ADDRESS1(hi2c->Init.OwnAddress1));
469   assert_param(IS_I2C_ADDRESSING_MODE(hi2c->Init.AddressingMode));
470   assert_param(IS_I2C_DUAL_ADDRESS(hi2c->Init.DualAddressMode));
471   assert_param(IS_I2C_OWN_ADDRESS2(hi2c->Init.OwnAddress2));
472   assert_param(IS_I2C_GENERAL_CALL(hi2c->Init.GeneralCallMode));
473   assert_param(IS_I2C_NO_STRETCH(hi2c->Init.NoStretchMode));
474 
475   if (hi2c->State == HAL_I2C_STATE_RESET)
476   {
477     /* Allocate lock resource and initialize it */
478     hi2c->Lock = HAL_UNLOCKED;
479 
480 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
481     /* Init the I2C Callback settings */
482     hi2c->MasterTxCpltCallback = HAL_I2C_MasterTxCpltCallback; /* Legacy weak MasterTxCpltCallback */
483     hi2c->MasterRxCpltCallback = HAL_I2C_MasterRxCpltCallback; /* Legacy weak MasterRxCpltCallback */
484     hi2c->SlaveTxCpltCallback  = HAL_I2C_SlaveTxCpltCallback;  /* Legacy weak SlaveTxCpltCallback  */
485     hi2c->SlaveRxCpltCallback  = HAL_I2C_SlaveRxCpltCallback;  /* Legacy weak SlaveRxCpltCallback  */
486     hi2c->ListenCpltCallback   = HAL_I2C_ListenCpltCallback;   /* Legacy weak ListenCpltCallback   */
487     hi2c->MemTxCpltCallback    = HAL_I2C_MemTxCpltCallback;    /* Legacy weak MemTxCpltCallback    */
488     hi2c->MemRxCpltCallback    = HAL_I2C_MemRxCpltCallback;    /* Legacy weak MemRxCpltCallback    */
489     hi2c->ErrorCallback        = HAL_I2C_ErrorCallback;        /* Legacy weak ErrorCallback        */
490     hi2c->AbortCpltCallback    = HAL_I2C_AbortCpltCallback;    /* Legacy weak AbortCpltCallback    */
491     hi2c->AddrCallback         = HAL_I2C_AddrCallback;         /* Legacy weak AddrCallback         */
492 
493     if (hi2c->MspInitCallback == NULL)
494     {
495       hi2c->MspInitCallback = HAL_I2C_MspInit; /* Legacy weak MspInit  */
496     }
497 
498     /* Init the low level hardware : GPIO, CLOCK, NVIC */
499     hi2c->MspInitCallback(hi2c);
500 #else
501     /* Init the low level hardware : GPIO, CLOCK, NVIC */
502     HAL_I2C_MspInit(hi2c);
503 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
504   }
505 
506   hi2c->State = HAL_I2C_STATE_BUSY;
507 
508   /* Disable the selected I2C peripheral */
509   __HAL_I2C_DISABLE(hi2c);
510 
511   /*Reset I2C*/
512   hi2c->Instance->CR1 |= I2C_CR1_SWRST;
513   hi2c->Instance->CR1 &= ~I2C_CR1_SWRST;
514 
515   /* Get PCLK1 frequency */
516   pclk1 = HAL_RCC_GetPCLK1Freq();
517 
518   /* Check the minimum allowed PCLK1 frequency */
519   if (I2C_MIN_PCLK_FREQ(pclk1, hi2c->Init.ClockSpeed) == 1U)
520   {
521     return HAL_ERROR;
522   }
523 
524   /* Calculate frequency range */
525   freqrange = I2C_FREQRANGE(pclk1);
526 
527   /*---------------------------- I2Cx CR2 Configuration ----------------------*/
528   /* Configure I2Cx: Frequency range */
529   MODIFY_REG(hi2c->Instance->CR2, I2C_CR2_FREQ, freqrange);
530 
531   /*---------------------------- I2Cx TRISE Configuration --------------------*/
532   /* Configure I2Cx: Rise Time */
533   MODIFY_REG(hi2c->Instance->TRISE, I2C_TRISE_TRISE, I2C_RISE_TIME(freqrange, hi2c->Init.ClockSpeed));
534 
535   /*---------------------------- I2Cx CCR Configuration ----------------------*/
536   /* Configure I2Cx: Speed */
537   MODIFY_REG(hi2c->Instance->CCR, (I2C_CCR_FS | I2C_CCR_DUTY | I2C_CCR_CCR), I2C_SPEED(pclk1, hi2c->Init.ClockSpeed, hi2c->Init.DutyCycle));
538 
539   /*---------------------------- I2Cx CR1 Configuration ----------------------*/
540   /* Configure I2Cx: Generalcall and NoStretch mode */
541   MODIFY_REG(hi2c->Instance->CR1, (I2C_CR1_ENGC | I2C_CR1_NOSTRETCH), (hi2c->Init.GeneralCallMode | hi2c->Init.NoStretchMode));
542 
543   /*---------------------------- I2Cx OAR1 Configuration ---------------------*/
544   /* Configure I2Cx: Own Address1 and addressing mode */
545   MODIFY_REG(hi2c->Instance->OAR1, (I2C_OAR1_ADDMODE | I2C_OAR1_ADD8_9 | I2C_OAR1_ADD1_7 | I2C_OAR1_ADD0), (hi2c->Init.AddressingMode | hi2c->Init.OwnAddress1));
546 
547   /*---------------------------- I2Cx OAR2 Configuration ---------------------*/
548   /* Configure I2Cx: Dual mode and Own Address2 */
549   MODIFY_REG(hi2c->Instance->OAR2, (I2C_OAR2_ENDUAL | I2C_OAR2_ADD2), (hi2c->Init.DualAddressMode | hi2c->Init.OwnAddress2));
550 
551   /* Enable the selected I2C peripheral */
552   __HAL_I2C_ENABLE(hi2c);
553 
554   hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
555   hi2c->State = HAL_I2C_STATE_READY;
556   hi2c->PreviousState = I2C_STATE_NONE;
557   hi2c->Mode = HAL_I2C_MODE_NONE;
558 
559   return HAL_OK;
560 }
561 
562 /**
563   * @brief  DeInitialize the I2C peripheral.
564   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
565   *         the configuration information for the specified I2C.
566   * @retval HAL status
567   */
HAL_I2C_DeInit(I2C_HandleTypeDef * hi2c)568 HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c)
569 {
570   /* Check the I2C handle allocation */
571   if (hi2c == NULL)
572   {
573     return HAL_ERROR;
574   }
575 
576   /* Check the parameters */
577   assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance));
578 
579   hi2c->State = HAL_I2C_STATE_BUSY;
580 
581   /* Disable the I2C Peripheral Clock */
582   __HAL_I2C_DISABLE(hi2c);
583 
584 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
585   if (hi2c->MspDeInitCallback == NULL)
586   {
587     hi2c->MspDeInitCallback = HAL_I2C_MspDeInit; /* Legacy weak MspDeInit  */
588   }
589 
590   /* DeInit the low level hardware: GPIO, CLOCK, NVIC */
591   hi2c->MspDeInitCallback(hi2c);
592 #else
593   /* DeInit the low level hardware: GPIO, CLOCK, NVIC */
594   HAL_I2C_MspDeInit(hi2c);
595 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
596 
597   hi2c->ErrorCode     = HAL_I2C_ERROR_NONE;
598   hi2c->State         = HAL_I2C_STATE_RESET;
599   hi2c->PreviousState = I2C_STATE_NONE;
600   hi2c->Mode          = HAL_I2C_MODE_NONE;
601 
602   /* Release Lock */
603   __HAL_UNLOCK(hi2c);
604 
605   return HAL_OK;
606 }
607 
608 /**
609   * @brief  Initialize the I2C MSP.
610   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
611   *         the configuration information for the specified I2C.
612   * @retval None
613   */
HAL_I2C_MspInit(I2C_HandleTypeDef * hi2c)614 __weak void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c)
615 {
616   /* Prevent unused argument(s) compilation warning */
617   UNUSED(hi2c);
618 
619   /* NOTE : This function should not be modified, when the callback is needed,
620             the HAL_I2C_MspInit could be implemented in the user file
621    */
622 }
623 
624 /**
625   * @brief  DeInitialize the I2C MSP.
626   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
627   *         the configuration information for the specified I2C.
628   * @retval None
629   */
HAL_I2C_MspDeInit(I2C_HandleTypeDef * hi2c)630 __weak void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c)
631 {
632   /* Prevent unused argument(s) compilation warning */
633   UNUSED(hi2c);
634 
635   /* NOTE : This function should not be modified, when the callback is needed,
636             the HAL_I2C_MspDeInit could be implemented in the user file
637    */
638 }
639 
640 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
641 /**
642   * @brief  Register a User I2C Callback
643   *         To be used instead of the weak predefined callback
644   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
645   *                the configuration information for the specified I2C.
646   * @param  CallbackID ID of the callback to be registered
647   *         This parameter can be one of the following values:
648   *          @arg @ref HAL_I2C_MASTER_TX_COMPLETE_CB_ID Master Tx Transfer completed callback ID
649   *          @arg @ref HAL_I2C_MASTER_RX_COMPLETE_CB_ID Master Rx Transfer completed callback ID
650   *          @arg @ref HAL_I2C_SLAVE_TX_COMPLETE_CB_ID Slave Tx Transfer completed callback ID
651   *          @arg @ref HAL_I2C_SLAVE_RX_COMPLETE_CB_ID Slave Rx Transfer completed callback ID
652   *          @arg @ref HAL_I2C_LISTEN_COMPLETE_CB_ID Listen Complete callback ID
653   *          @arg @ref HAL_I2C_MEM_TX_COMPLETE_CB_ID Memory Tx Transfer callback ID
654   *          @arg @ref HAL_I2C_MEM_RX_COMPLETE_CB_ID Memory Rx Transfer completed callback ID
655   *          @arg @ref HAL_I2C_ERROR_CB_ID Error callback ID
656   *          @arg @ref HAL_I2C_ABORT_CB_ID Abort callback ID
657   *          @arg @ref HAL_I2C_MSPINIT_CB_ID MspInit callback ID
658   *          @arg @ref HAL_I2C_MSPDEINIT_CB_ID MspDeInit callback ID
659   * @param  pCallback pointer to the Callback function
660   * @retval HAL status
661   */
HAL_I2C_RegisterCallback(I2C_HandleTypeDef * hi2c,HAL_I2C_CallbackIDTypeDef CallbackID,pI2C_CallbackTypeDef pCallback)662 HAL_StatusTypeDef HAL_I2C_RegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID, pI2C_CallbackTypeDef pCallback)
663 {
664   HAL_StatusTypeDef status = HAL_OK;
665 
666   if (pCallback == NULL)
667   {
668     /* Update the error code */
669     hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
670 
671     return HAL_ERROR;
672   }
673   /* Process locked */
674   __HAL_LOCK(hi2c);
675 
676   if (HAL_I2C_STATE_READY == hi2c->State)
677   {
678     switch (CallbackID)
679     {
680       case HAL_I2C_MASTER_TX_COMPLETE_CB_ID :
681         hi2c->MasterTxCpltCallback = pCallback;
682         break;
683 
684       case HAL_I2C_MASTER_RX_COMPLETE_CB_ID :
685         hi2c->MasterRxCpltCallback = pCallback;
686         break;
687 
688       case HAL_I2C_SLAVE_TX_COMPLETE_CB_ID :
689         hi2c->SlaveTxCpltCallback = pCallback;
690         break;
691 
692       case HAL_I2C_SLAVE_RX_COMPLETE_CB_ID :
693         hi2c->SlaveRxCpltCallback = pCallback;
694         break;
695 
696       case HAL_I2C_LISTEN_COMPLETE_CB_ID :
697         hi2c->ListenCpltCallback = pCallback;
698         break;
699 
700       case HAL_I2C_MEM_TX_COMPLETE_CB_ID :
701         hi2c->MemTxCpltCallback = pCallback;
702         break;
703 
704       case HAL_I2C_MEM_RX_COMPLETE_CB_ID :
705         hi2c->MemRxCpltCallback = pCallback;
706         break;
707 
708       case HAL_I2C_ERROR_CB_ID :
709         hi2c->ErrorCallback = pCallback;
710         break;
711 
712       case HAL_I2C_ABORT_CB_ID :
713         hi2c->AbortCpltCallback = pCallback;
714         break;
715 
716       case HAL_I2C_MSPINIT_CB_ID :
717         hi2c->MspInitCallback = pCallback;
718         break;
719 
720       case HAL_I2C_MSPDEINIT_CB_ID :
721         hi2c->MspDeInitCallback = pCallback;
722         break;
723 
724       default :
725         /* Update the error code */
726         hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
727 
728         /* Return error status */
729         status =  HAL_ERROR;
730         break;
731     }
732   }
733   else if (HAL_I2C_STATE_RESET == hi2c->State)
734   {
735     switch (CallbackID)
736     {
737       case HAL_I2C_MSPINIT_CB_ID :
738         hi2c->MspInitCallback = pCallback;
739         break;
740 
741       case HAL_I2C_MSPDEINIT_CB_ID :
742         hi2c->MspDeInitCallback = pCallback;
743         break;
744 
745       default :
746         /* Update the error code */
747         hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
748 
749         /* Return error status */
750         status =  HAL_ERROR;
751         break;
752     }
753   }
754   else
755   {
756     /* Update the error code */
757     hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
758 
759     /* Return error status */
760     status =  HAL_ERROR;
761   }
762 
763   /* Release Lock */
764   __HAL_UNLOCK(hi2c);
765   return status;
766 }
767 
768 /**
769   * @brief  Unregister an I2C Callback
770   *         I2C callback is redirected to the weak predefined callback
771   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
772   *                the configuration information for the specified I2C.
773   * @param  CallbackID ID of the callback to be unregistered
774   *         This parameter can be one of the following values:
775   *         This parameter can be one of the following values:
776   *          @arg @ref HAL_I2C_MASTER_TX_COMPLETE_CB_ID Master Tx Transfer completed callback ID
777   *          @arg @ref HAL_I2C_MASTER_RX_COMPLETE_CB_ID Master Rx Transfer completed callback ID
778   *          @arg @ref HAL_I2C_SLAVE_TX_COMPLETE_CB_ID Slave Tx Transfer completed callback ID
779   *          @arg @ref HAL_I2C_SLAVE_RX_COMPLETE_CB_ID Slave Rx Transfer completed callback ID
780   *          @arg @ref HAL_I2C_LISTEN_COMPLETE_CB_ID Listen Complete callback ID
781   *          @arg @ref HAL_I2C_MEM_TX_COMPLETE_CB_ID Memory Tx Transfer callback ID
782   *          @arg @ref HAL_I2C_MEM_RX_COMPLETE_CB_ID Memory Rx Transfer completed callback ID
783   *          @arg @ref HAL_I2C_ERROR_CB_ID Error callback ID
784   *          @arg @ref HAL_I2C_ABORT_CB_ID Abort callback ID
785   *          @arg @ref HAL_I2C_MSPINIT_CB_ID MspInit callback ID
786   *          @arg @ref HAL_I2C_MSPDEINIT_CB_ID MspDeInit callback ID
787   * @retval HAL status
788   */
HAL_I2C_UnRegisterCallback(I2C_HandleTypeDef * hi2c,HAL_I2C_CallbackIDTypeDef CallbackID)789 HAL_StatusTypeDef HAL_I2C_UnRegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID)
790 {
791   HAL_StatusTypeDef status = HAL_OK;
792 
793   /* Process locked */
794   __HAL_LOCK(hi2c);
795 
796   if (HAL_I2C_STATE_READY == hi2c->State)
797   {
798     switch (CallbackID)
799     {
800       case HAL_I2C_MASTER_TX_COMPLETE_CB_ID :
801         hi2c->MasterTxCpltCallback = HAL_I2C_MasterTxCpltCallback; /* Legacy weak MasterTxCpltCallback */
802         break;
803 
804       case HAL_I2C_MASTER_RX_COMPLETE_CB_ID :
805         hi2c->MasterRxCpltCallback = HAL_I2C_MasterRxCpltCallback; /* Legacy weak MasterRxCpltCallback */
806         break;
807 
808       case HAL_I2C_SLAVE_TX_COMPLETE_CB_ID :
809         hi2c->SlaveTxCpltCallback = HAL_I2C_SlaveTxCpltCallback;   /* Legacy weak SlaveTxCpltCallback  */
810         break;
811 
812       case HAL_I2C_SLAVE_RX_COMPLETE_CB_ID :
813         hi2c->SlaveRxCpltCallback = HAL_I2C_SlaveRxCpltCallback;   /* Legacy weak SlaveRxCpltCallback  */
814         break;
815 
816       case HAL_I2C_LISTEN_COMPLETE_CB_ID :
817         hi2c->ListenCpltCallback = HAL_I2C_ListenCpltCallback;     /* Legacy weak ListenCpltCallback   */
818         break;
819 
820       case HAL_I2C_MEM_TX_COMPLETE_CB_ID :
821         hi2c->MemTxCpltCallback = HAL_I2C_MemTxCpltCallback;       /* Legacy weak MemTxCpltCallback    */
822         break;
823 
824       case HAL_I2C_MEM_RX_COMPLETE_CB_ID :
825         hi2c->MemRxCpltCallback = HAL_I2C_MemRxCpltCallback;       /* Legacy weak MemRxCpltCallback    */
826         break;
827 
828       case HAL_I2C_ERROR_CB_ID :
829         hi2c->ErrorCallback = HAL_I2C_ErrorCallback;               /* Legacy weak ErrorCallback        */
830         break;
831 
832       case HAL_I2C_ABORT_CB_ID :
833         hi2c->AbortCpltCallback = HAL_I2C_AbortCpltCallback;       /* Legacy weak AbortCpltCallback    */
834         break;
835 
836       case HAL_I2C_MSPINIT_CB_ID :
837         hi2c->MspInitCallback = HAL_I2C_MspInit;                   /* Legacy weak MspInit              */
838         break;
839 
840       case HAL_I2C_MSPDEINIT_CB_ID :
841         hi2c->MspDeInitCallback = HAL_I2C_MspDeInit;               /* Legacy weak MspDeInit            */
842         break;
843 
844       default :
845         /* Update the error code */
846         hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
847 
848         /* Return error status */
849         status =  HAL_ERROR;
850         break;
851     }
852   }
853   else if (HAL_I2C_STATE_RESET == hi2c->State)
854   {
855     switch (CallbackID)
856     {
857       case HAL_I2C_MSPINIT_CB_ID :
858         hi2c->MspInitCallback = HAL_I2C_MspInit;                   /* Legacy weak MspInit              */
859         break;
860 
861       case HAL_I2C_MSPDEINIT_CB_ID :
862         hi2c->MspDeInitCallback = HAL_I2C_MspDeInit;               /* Legacy weak MspDeInit            */
863         break;
864 
865       default :
866         /* Update the error code */
867         hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
868 
869         /* Return error status */
870         status =  HAL_ERROR;
871         break;
872     }
873   }
874   else
875   {
876     /* Update the error code */
877     hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
878 
879     /* Return error status */
880     status =  HAL_ERROR;
881   }
882 
883   /* Release Lock */
884   __HAL_UNLOCK(hi2c);
885   return status;
886 }
887 
888 /**
889   * @brief  Register the Slave Address Match I2C Callback
890   *         To be used instead of the weak HAL_I2C_AddrCallback() predefined callback
891   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
892   *                the configuration information for the specified I2C.
893   * @param  pCallback pointer to the Address Match Callback function
894   * @retval HAL status
895   */
HAL_I2C_RegisterAddrCallback(I2C_HandleTypeDef * hi2c,pI2C_AddrCallbackTypeDef pCallback)896 HAL_StatusTypeDef HAL_I2C_RegisterAddrCallback(I2C_HandleTypeDef *hi2c, pI2C_AddrCallbackTypeDef pCallback)
897 {
898   HAL_StatusTypeDef status = HAL_OK;
899 
900   if (pCallback == NULL)
901   {
902     /* Update the error code */
903     hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
904 
905     return HAL_ERROR;
906   }
907   /* Process locked */
908   __HAL_LOCK(hi2c);
909 
910   if (HAL_I2C_STATE_READY == hi2c->State)
911   {
912     hi2c->AddrCallback = pCallback;
913   }
914   else
915   {
916     /* Update the error code */
917     hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
918 
919     /* Return error status */
920     status =  HAL_ERROR;
921   }
922 
923   /* Release Lock */
924   __HAL_UNLOCK(hi2c);
925   return status;
926 }
927 
928 /**
929   * @brief  UnRegister the Slave Address Match I2C Callback
930   *         Info Ready I2C Callback is redirected to the weak HAL_I2C_AddrCallback() predefined callback
931   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
932   *                the configuration information for the specified I2C.
933   * @retval HAL status
934   */
HAL_I2C_UnRegisterAddrCallback(I2C_HandleTypeDef * hi2c)935 HAL_StatusTypeDef HAL_I2C_UnRegisterAddrCallback(I2C_HandleTypeDef *hi2c)
936 {
937   HAL_StatusTypeDef status = HAL_OK;
938 
939   /* Process locked */
940   __HAL_LOCK(hi2c);
941 
942   if (HAL_I2C_STATE_READY == hi2c->State)
943   {
944     hi2c->AddrCallback = HAL_I2C_AddrCallback; /* Legacy weak AddrCallback  */
945   }
946   else
947   {
948     /* Update the error code */
949     hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
950 
951     /* Return error status */
952     status =  HAL_ERROR;
953   }
954 
955   /* Release Lock */
956   __HAL_UNLOCK(hi2c);
957   return status;
958 }
959 
960 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
961 
962 /**
963   * @}
964   */
965 
966 /** @defgroup I2C_Exported_Functions_Group2 Input and Output operation functions
967  *  @brief   Data transfers functions
968  *
969 @verbatim
970  ===============================================================================
971                       ##### IO operation functions #####
972  ===============================================================================
973     [..]
974     This subsection provides a set of functions allowing to manage the I2C data
975     transfers.
976 
977     (#) There are two modes of transfer:
978        (++) Blocking mode : The communication is performed in the polling mode.
979             The status of all data processing is returned by the same function
980             after finishing transfer.
981        (++) No-Blocking mode : The communication is performed using Interrupts
982             or DMA. These functions return the status of the transfer startup.
983             The end of the data processing will be indicated through the
984             dedicated I2C IRQ when using Interrupt mode or the DMA IRQ when
985             using DMA mode.
986 
987     (#) Blocking mode functions are :
988         (++) HAL_I2C_Master_Transmit()
989         (++) HAL_I2C_Master_Receive()
990         (++) HAL_I2C_Slave_Transmit()
991         (++) HAL_I2C_Slave_Receive()
992         (++) HAL_I2C_Mem_Write()
993         (++) HAL_I2C_Mem_Read()
994         (++) HAL_I2C_IsDeviceReady()
995 
996     (#) No-Blocking mode functions with Interrupt are :
997         (++) HAL_I2C_Master_Transmit_IT()
998         (++) HAL_I2C_Master_Receive_IT()
999         (++) HAL_I2C_Slave_Transmit_IT()
1000         (++) HAL_I2C_Slave_Receive_IT()
1001         (++) HAL_I2C_Mem_Write_IT()
1002         (++) HAL_I2C_Mem_Read_IT()
1003         (++) HAL_I2C_Master_Seq_Transmit_IT()
1004         (++) HAL_I2C_Master_Seq_Receive_IT()
1005         (++) HAL_I2C_Slave_Seq_Transmit_IT()
1006         (++) HAL_I2C_Slave_Seq_Receive_IT()
1007         (++) HAL_I2C_EnableListen_IT()
1008         (++) HAL_I2C_DisableListen_IT()
1009         (++) HAL_I2C_Master_Abort_IT()
1010 
1011     (#) No-Blocking mode functions with DMA are :
1012         (++) HAL_I2C_Master_Transmit_DMA()
1013         (++) HAL_I2C_Master_Receive_DMA()
1014         (++) HAL_I2C_Slave_Transmit_DMA()
1015         (++) HAL_I2C_Slave_Receive_DMA()
1016         (++) HAL_I2C_Mem_Write_DMA()
1017         (++) HAL_I2C_Mem_Read_DMA()
1018         (++) HAL_I2C_Master_Seq_Transmit_DMA()
1019         (++) HAL_I2C_Master_Seq_Receive_DMA()
1020         (++) HAL_I2C_Slave_Seq_Transmit_DMA()
1021         (++) HAL_I2C_Slave_Seq_Receive_DMA()
1022 
1023     (#) A set of Transfer Complete Callbacks are provided in non Blocking mode:
1024         (++) HAL_I2C_MasterTxCpltCallback()
1025         (++) HAL_I2C_MasterRxCpltCallback()
1026         (++) HAL_I2C_SlaveTxCpltCallback()
1027         (++) HAL_I2C_SlaveRxCpltCallback()
1028         (++) HAL_I2C_MemTxCpltCallback()
1029         (++) HAL_I2C_MemRxCpltCallback()
1030         (++) HAL_I2C_AddrCallback()
1031         (++) HAL_I2C_ListenCpltCallback()
1032         (++) HAL_I2C_ErrorCallback()
1033         (++) HAL_I2C_AbortCpltCallback()
1034 
1035 @endverbatim
1036   * @{
1037   */
1038 
1039 /**
1040   * @brief  Transmits in master mode an amount of data in blocking mode.
1041   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
1042   *                the configuration information for the specified I2C.
1043   * @param  DevAddress Target device address: The device 7 bits address value
1044   *         in datasheet must be shifted to the left before calling the interface
1045   * @param  pData Pointer to data buffer
1046   * @param  Size Amount of data to be sent
1047   * @param  Timeout Timeout duration
1048   * @retval HAL status
1049   */
HAL_I2C_Master_Transmit(I2C_HandleTypeDef * hi2c,uint16_t DevAddress,uint8_t * pData,uint16_t Size,uint32_t Timeout)1050 HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
1051 {
1052   /* Init tickstart for timeout management*/
1053   uint32_t tickstart = HAL_GetTick();
1054 
1055   if (hi2c->State == HAL_I2C_STATE_READY)
1056   {
1057     /* Wait until BUSY flag is reset */
1058     if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
1059     {
1060       return HAL_BUSY;
1061     }
1062 
1063     /* Process Locked */
1064     __HAL_LOCK(hi2c);
1065 
1066     /* Check if the I2C is already enabled */
1067     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
1068     {
1069       /* Enable I2C peripheral */
1070       __HAL_I2C_ENABLE(hi2c);
1071     }
1072 
1073     /* Disable Pos */
1074     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
1075 
1076     hi2c->State       = HAL_I2C_STATE_BUSY_TX;
1077     hi2c->Mode        = HAL_I2C_MODE_MASTER;
1078     hi2c->ErrorCode   = HAL_I2C_ERROR_NONE;
1079 
1080     /* Prepare transfer parameters */
1081     hi2c->pBuffPtr    = pData;
1082     hi2c->XferCount   = Size;
1083     hi2c->XferSize    = hi2c->XferCount;
1084     hi2c->XferOptions = I2C_NO_OPTION_FRAME;
1085 
1086     /* Send Slave Address */
1087     if (I2C_MasterRequestWrite(hi2c, DevAddress, Timeout, tickstart) != HAL_OK)
1088     {
1089       return HAL_ERROR;
1090     }
1091 
1092     /* Clear ADDR flag */
1093     __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
1094 
1095     while (hi2c->XferSize > 0U)
1096     {
1097       /* Wait until TXE flag is set */
1098       if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1099       {
1100         if (hi2c->ErrorCode == HAL_I2C_ERROR_AF)
1101         {
1102           /* Generate Stop */
1103           SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
1104         }
1105         return HAL_ERROR;
1106       }
1107 
1108       /* Write data to DR */
1109       hi2c->Instance->DR = *hi2c->pBuffPtr;
1110 
1111       /* Increment Buffer pointer */
1112       hi2c->pBuffPtr++;
1113 
1114       /* Update counter */
1115       hi2c->XferCount--;
1116       hi2c->XferSize--;
1117 
1118       if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U))
1119       {
1120         /* Write data to DR */
1121         hi2c->Instance->DR = *hi2c->pBuffPtr;
1122 
1123         /* Increment Buffer pointer */
1124         hi2c->pBuffPtr++;
1125 
1126         /* Update counter */
1127         hi2c->XferCount--;
1128         hi2c->XferSize--;
1129       }
1130 
1131       /* Wait until BTF flag is set */
1132       if (I2C_WaitOnBTFFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1133       {
1134         if (hi2c->ErrorCode == HAL_I2C_ERROR_AF)
1135         {
1136           /* Generate Stop */
1137           SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
1138         }
1139         return HAL_ERROR;
1140       }
1141     }
1142 
1143     /* Generate Stop */
1144     SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
1145 
1146     hi2c->State = HAL_I2C_STATE_READY;
1147     hi2c->Mode = HAL_I2C_MODE_NONE;
1148 
1149     /* Process Unlocked */
1150     __HAL_UNLOCK(hi2c);
1151 
1152     return HAL_OK;
1153   }
1154   else
1155   {
1156     return HAL_BUSY;
1157   }
1158 }
1159 
1160 /**
1161   * @brief  Receives in master mode an amount of data in blocking mode.
1162   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
1163   *                the configuration information for the specified I2C.
1164   * @param  DevAddress Target device address: The device 7 bits address value
1165   *         in datasheet must be shifted to the left before calling the interface
1166   * @param  pData Pointer to data buffer
1167   * @param  Size Amount of data to be sent
1168   * @param  Timeout Timeout duration
1169   * @retval HAL status
1170   */
HAL_I2C_Master_Receive(I2C_HandleTypeDef * hi2c,uint16_t DevAddress,uint8_t * pData,uint16_t Size,uint32_t Timeout)1171 HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
1172 {
1173   __IO uint32_t count = 0U;
1174 
1175   /* Init tickstart for timeout management*/
1176   uint32_t tickstart = HAL_GetTick();
1177 
1178   if (hi2c->State == HAL_I2C_STATE_READY)
1179   {
1180     /* Wait until BUSY flag is reset */
1181     if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
1182     {
1183       return HAL_BUSY;
1184     }
1185 
1186     /* Process Locked */
1187     __HAL_LOCK(hi2c);
1188 
1189     /* Check if the I2C is already enabled */
1190     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
1191     {
1192       /* Enable I2C peripheral */
1193       __HAL_I2C_ENABLE(hi2c);
1194     }
1195 
1196     /* Disable Pos */
1197     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
1198 
1199     hi2c->State       = HAL_I2C_STATE_BUSY_RX;
1200     hi2c->Mode        = HAL_I2C_MODE_MASTER;
1201     hi2c->ErrorCode   = HAL_I2C_ERROR_NONE;
1202 
1203     /* Prepare transfer parameters */
1204     hi2c->pBuffPtr    = pData;
1205     hi2c->XferCount   = Size;
1206     hi2c->XferSize    = hi2c->XferCount;
1207     hi2c->XferOptions = I2C_NO_OPTION_FRAME;
1208 
1209     /* Send Slave Address */
1210     if (I2C_MasterRequestRead(hi2c, DevAddress, Timeout, tickstart) != HAL_OK)
1211     {
1212       return HAL_ERROR;
1213     }
1214 
1215     if (hi2c->XferSize == 0U)
1216     {
1217       /* Clear ADDR flag */
1218       __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
1219 
1220       /* Generate Stop */
1221       SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
1222     }
1223     else if (hi2c->XferSize == 1U)
1224     {
1225       /* Disable Acknowledge */
1226       CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1227 
1228       /* Disable all active IRQs around ADDR clearing and STOP programming because the EV6_3
1229       software sequence must complete before the current byte end of transfer */
1230       __disable_irq();
1231 
1232       /* Clear ADDR flag */
1233       __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
1234 
1235       /* Generate Stop */
1236       SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
1237 
1238       /* Re-enable IRQs */
1239       __enable_irq();
1240     }
1241     else if (hi2c->XferSize == 2U)
1242     {
1243       /* Enable Pos */
1244       SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
1245 
1246       /* Disable all active IRQs around ADDR clearing and STOP programming because the EV6_3
1247       software sequence must complete before the current byte end of transfer */
1248       __disable_irq();
1249 
1250       /* Clear ADDR flag */
1251       __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
1252 
1253       /* Disable Acknowledge */
1254       CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1255 
1256       /* Re-enable IRQs */
1257       __enable_irq();
1258     }
1259     else
1260     {
1261       /* Enable Acknowledge */
1262       SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1263 
1264       /* Clear ADDR flag */
1265       __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
1266     }
1267 
1268     while (hi2c->XferSize > 0U)
1269     {
1270       if (hi2c->XferSize <= 3U)
1271       {
1272         /* One byte */
1273         if (hi2c->XferSize == 1U)
1274         {
1275           /* Wait until RXNE flag is set */
1276           if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1277           {
1278             return HAL_ERROR;
1279           }
1280 
1281           /* Read data from DR */
1282           *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
1283 
1284           /* Increment Buffer pointer */
1285           hi2c->pBuffPtr++;
1286 
1287           /* Update counter */
1288           hi2c->XferSize--;
1289           hi2c->XferCount--;
1290         }
1291         /* Two bytes */
1292         else if (hi2c->XferSize == 2U)
1293         {
1294           /* Wait until BTF flag is set */
1295           if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)
1296           {
1297             return HAL_ERROR;
1298           }
1299 
1300           /* Disable all active IRQs around ADDR clearing and STOP programming because the EV6_3
1301              software sequence must complete before the current byte end of transfer */
1302           __disable_irq();
1303 
1304           /* Generate Stop */
1305           SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
1306 
1307           /* Read data from DR */
1308           *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
1309 
1310           /* Increment Buffer pointer */
1311           hi2c->pBuffPtr++;
1312 
1313           /* Update counter */
1314           hi2c->XferSize--;
1315           hi2c->XferCount--;
1316 
1317           /* Re-enable IRQs */
1318           __enable_irq();
1319 
1320           /* Read data from DR */
1321           *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
1322 
1323           /* Increment Buffer pointer */
1324           hi2c->pBuffPtr++;
1325 
1326           /* Update counter */
1327           hi2c->XferSize--;
1328           hi2c->XferCount--;
1329         }
1330         /* 3 Last bytes */
1331         else
1332         {
1333           /* Wait until BTF flag is set */
1334           if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)
1335           {
1336             return HAL_ERROR;
1337           }
1338 
1339           /* Disable Acknowledge */
1340           CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1341 
1342           /* Disable all active IRQs around ADDR clearing and STOP programming because the EV6_3
1343              software sequence must complete before the current byte end of transfer */
1344           __disable_irq();
1345 
1346           /* Read data from DR */
1347           *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
1348 
1349           /* Increment Buffer pointer */
1350           hi2c->pBuffPtr++;
1351 
1352           /* Update counter */
1353           hi2c->XferSize--;
1354           hi2c->XferCount--;
1355 
1356           /* Wait until BTF flag is set */
1357           count = I2C_TIMEOUT_FLAG * (SystemCoreClock / 25U / 1000U);
1358           do
1359           {
1360             count--;
1361             if (count == 0U)
1362             {
1363               hi2c->PreviousState       = I2C_STATE_NONE;
1364               hi2c->State               = HAL_I2C_STATE_READY;
1365               hi2c->Mode                = HAL_I2C_MODE_NONE;
1366               hi2c->ErrorCode           |= HAL_I2C_ERROR_TIMEOUT;
1367 
1368               /* Re-enable IRQs */
1369               __enable_irq();
1370 
1371               /* Process Unlocked */
1372               __HAL_UNLOCK(hi2c);
1373 
1374               return HAL_ERROR;
1375             }
1376           }
1377           while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == RESET);
1378 
1379           /* Generate Stop */
1380           SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
1381 
1382           /* Read data from DR */
1383           *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
1384 
1385           /* Increment Buffer pointer */
1386           hi2c->pBuffPtr++;
1387 
1388           /* Update counter */
1389           hi2c->XferSize--;
1390           hi2c->XferCount--;
1391 
1392           /* Re-enable IRQs */
1393           __enable_irq();
1394 
1395           /* Read data from DR */
1396           *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
1397 
1398           /* Increment Buffer pointer */
1399           hi2c->pBuffPtr++;
1400 
1401           /* Update counter */
1402           hi2c->XferSize--;
1403           hi2c->XferCount--;
1404         }
1405       }
1406       else
1407       {
1408         /* Wait until RXNE flag is set */
1409         if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1410         {
1411           return HAL_ERROR;
1412         }
1413 
1414         /* Read data from DR */
1415         *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
1416 
1417         /* Increment Buffer pointer */
1418         hi2c->pBuffPtr++;
1419 
1420         /* Update counter */
1421         hi2c->XferSize--;
1422         hi2c->XferCount--;
1423 
1424         if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET)
1425         {
1426           /* Read data from DR */
1427           *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
1428 
1429           /* Increment Buffer pointer */
1430           hi2c->pBuffPtr++;
1431 
1432           /* Update counter */
1433           hi2c->XferSize--;
1434           hi2c->XferCount--;
1435         }
1436       }
1437     }
1438 
1439     hi2c->State = HAL_I2C_STATE_READY;
1440     hi2c->Mode = HAL_I2C_MODE_NONE;
1441 
1442     /* Process Unlocked */
1443     __HAL_UNLOCK(hi2c);
1444 
1445     return HAL_OK;
1446   }
1447   else
1448   {
1449     return HAL_BUSY;
1450   }
1451 }
1452 
1453 /**
1454   * @brief  Transmits in slave mode an amount of data in blocking mode.
1455   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
1456   *                the configuration information for the specified I2C.
1457   * @param  pData Pointer to data buffer
1458   * @param  Size Amount of data to be sent
1459   * @param  Timeout Timeout duration
1460   * @retval HAL status
1461   */
HAL_I2C_Slave_Transmit(I2C_HandleTypeDef * hi2c,uint8_t * pData,uint16_t Size,uint32_t Timeout)1462 HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout)
1463 {
1464   /* Init tickstart for timeout management*/
1465   uint32_t tickstart = HAL_GetTick();
1466 
1467   if (hi2c->State == HAL_I2C_STATE_READY)
1468   {
1469     if ((pData == NULL) || (Size == 0U))
1470     {
1471       return  HAL_ERROR;
1472     }
1473 
1474     /* Process Locked */
1475     __HAL_LOCK(hi2c);
1476 
1477     /* Check if the I2C is already enabled */
1478     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
1479     {
1480       /* Enable I2C peripheral */
1481       __HAL_I2C_ENABLE(hi2c);
1482     }
1483 
1484     /* Disable Pos */
1485     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
1486 
1487     hi2c->State       = HAL_I2C_STATE_BUSY_TX;
1488     hi2c->Mode        = HAL_I2C_MODE_SLAVE;
1489     hi2c->ErrorCode   = HAL_I2C_ERROR_NONE;
1490 
1491     /* Prepare transfer parameters */
1492     hi2c->pBuffPtr    = pData;
1493     hi2c->XferCount   = Size;
1494     hi2c->XferSize    = hi2c->XferCount;
1495     hi2c->XferOptions = I2C_NO_OPTION_FRAME;
1496 
1497     /* Enable Address Acknowledge */
1498     SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1499 
1500     /* Wait until ADDR flag is set */
1501     if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK)
1502     {
1503       return HAL_ERROR;
1504     }
1505 
1506     /* Clear ADDR flag */
1507     __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
1508 
1509     /* If 10bit addressing mode is selected */
1510     if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT)
1511     {
1512       /* Wait until ADDR flag is set */
1513       if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK)
1514       {
1515         return HAL_ERROR;
1516       }
1517 
1518       /* Clear ADDR flag */
1519       __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
1520     }
1521 
1522     while (hi2c->XferSize > 0U)
1523     {
1524       /* Wait until TXE flag is set */
1525       if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1526       {
1527         /* Disable Address Acknowledge */
1528         CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1529 
1530         return HAL_ERROR;
1531       }
1532 
1533       /* Write data to DR */
1534       hi2c->Instance->DR = *hi2c->pBuffPtr;
1535 
1536       /* Increment Buffer pointer */
1537       hi2c->pBuffPtr++;
1538 
1539       /* Update counter */
1540       hi2c->XferCount--;
1541       hi2c->XferSize--;
1542 
1543       if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U))
1544       {
1545         /* Write data to DR */
1546         hi2c->Instance->DR = *hi2c->pBuffPtr;
1547 
1548         /* Increment Buffer pointer */
1549         hi2c->pBuffPtr++;
1550 
1551         /* Update counter */
1552         hi2c->XferCount--;
1553         hi2c->XferSize--;
1554       }
1555     }
1556 
1557     /* Wait until AF flag is set */
1558     if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_AF, RESET, Timeout, tickstart) != HAL_OK)
1559     {
1560       return HAL_ERROR;
1561     }
1562 
1563     /* Clear AF flag */
1564     __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
1565 
1566     /* Disable Address Acknowledge */
1567     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1568 
1569     hi2c->State = HAL_I2C_STATE_READY;
1570     hi2c->Mode = HAL_I2C_MODE_NONE;
1571 
1572     /* Process Unlocked */
1573     __HAL_UNLOCK(hi2c);
1574 
1575     return HAL_OK;
1576   }
1577   else
1578   {
1579     return HAL_BUSY;
1580   }
1581 }
1582 
1583 /**
1584   * @brief  Receive in slave mode an amount of data in blocking mode
1585   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
1586   *         the configuration information for the specified I2C.
1587   * @param  pData Pointer to data buffer
1588   * @param  Size Amount of data to be sent
1589   * @param  Timeout Timeout duration
1590   * @retval HAL status
1591   */
HAL_I2C_Slave_Receive(I2C_HandleTypeDef * hi2c,uint8_t * pData,uint16_t Size,uint32_t Timeout)1592 HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout)
1593 {
1594   /* Init tickstart for timeout management*/
1595   uint32_t tickstart = HAL_GetTick();
1596 
1597   if (hi2c->State == HAL_I2C_STATE_READY)
1598   {
1599     if ((pData == NULL) || (Size == (uint16_t)0))
1600     {
1601       return HAL_ERROR;
1602     }
1603 
1604     /* Process Locked */
1605     __HAL_LOCK(hi2c);
1606 
1607     /* Check if the I2C is already enabled */
1608     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
1609     {
1610       /* Enable I2C peripheral */
1611       __HAL_I2C_ENABLE(hi2c);
1612     }
1613 
1614     /* Disable Pos */
1615     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
1616 
1617     hi2c->State       = HAL_I2C_STATE_BUSY_RX;
1618     hi2c->Mode        = HAL_I2C_MODE_SLAVE;
1619     hi2c->ErrorCode   = HAL_I2C_ERROR_NONE;
1620 
1621     /* Prepare transfer parameters */
1622     hi2c->pBuffPtr    = pData;
1623     hi2c->XferCount   = Size;
1624     hi2c->XferSize    = hi2c->XferCount;
1625     hi2c->XferOptions = I2C_NO_OPTION_FRAME;
1626 
1627     /* Enable Address Acknowledge */
1628     SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1629 
1630     /* Wait until ADDR flag is set */
1631     if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK)
1632     {
1633       return HAL_ERROR;
1634     }
1635 
1636     /* Clear ADDR flag */
1637     __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
1638 
1639     while (hi2c->XferSize > 0U)
1640     {
1641       /* Wait until RXNE flag is set */
1642       if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1643       {
1644         /* Disable Address Acknowledge */
1645         CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1646 
1647         return HAL_ERROR;
1648       }
1649 
1650       /* Read data from DR */
1651       *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
1652 
1653       /* Increment Buffer pointer */
1654       hi2c->pBuffPtr++;
1655 
1656       /* Update counter */
1657       hi2c->XferSize--;
1658       hi2c->XferCount--;
1659 
1660       if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U))
1661       {
1662         /* Read data from DR */
1663         *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
1664 
1665         /* Increment Buffer pointer */
1666         hi2c->pBuffPtr++;
1667 
1668         /* Update counter */
1669         hi2c->XferSize--;
1670         hi2c->XferCount--;
1671       }
1672     }
1673 
1674     /* Wait until STOP flag is set */
1675     if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1676     {
1677       /* Disable Address Acknowledge */
1678       CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1679 
1680       return HAL_ERROR;
1681     }
1682 
1683     /* Clear STOP flag */
1684     __HAL_I2C_CLEAR_STOPFLAG(hi2c);
1685 
1686     /* Disable Address Acknowledge */
1687     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1688 
1689     hi2c->State = HAL_I2C_STATE_READY;
1690     hi2c->Mode = HAL_I2C_MODE_NONE;
1691 
1692     /* Process Unlocked */
1693     __HAL_UNLOCK(hi2c);
1694 
1695     return HAL_OK;
1696   }
1697   else
1698   {
1699     return HAL_BUSY;
1700   }
1701 }
1702 
1703 /**
1704   * @brief  Transmit in master mode an amount of data in non-blocking mode with Interrupt
1705   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
1706   *                the configuration information for the specified I2C.
1707   * @param  DevAddress Target device address: The device 7 bits address value
1708   *         in datasheet must be shifted to the left before calling the interface
1709   * @param  pData Pointer to data buffer
1710   * @param  Size Amount of data to be sent
1711   * @retval HAL status
1712   */
HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef * hi2c,uint16_t DevAddress,uint8_t * pData,uint16_t Size)1713 HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
1714 {
1715   __IO uint32_t count = 0U;
1716 
1717   if (hi2c->State == HAL_I2C_STATE_READY)
1718   {
1719     /* Wait until BUSY flag is reset */
1720     count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U);
1721     do
1722     {
1723       count--;
1724       if (count == 0U)
1725       {
1726         hi2c->PreviousState       = I2C_STATE_NONE;
1727         hi2c->State               = HAL_I2C_STATE_READY;
1728         hi2c->Mode                = HAL_I2C_MODE_NONE;
1729         hi2c->ErrorCode           |= HAL_I2C_ERROR_TIMEOUT;
1730 
1731         /* Process Unlocked */
1732         __HAL_UNLOCK(hi2c);
1733 
1734         return HAL_ERROR;
1735       }
1736     }
1737     while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
1738 
1739     /* Process Locked */
1740     __HAL_LOCK(hi2c);
1741 
1742     /* Check if the I2C is already enabled */
1743     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
1744     {
1745       /* Enable I2C peripheral */
1746       __HAL_I2C_ENABLE(hi2c);
1747     }
1748 
1749     /* Disable Pos */
1750     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
1751 
1752     hi2c->State     = HAL_I2C_STATE_BUSY_TX;
1753     hi2c->Mode      = HAL_I2C_MODE_MASTER;
1754     hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1755 
1756     /* Prepare transfer parameters */
1757     hi2c->pBuffPtr    = pData;
1758     hi2c->XferCount   = Size;
1759     hi2c->XferSize    = hi2c->XferCount;
1760     hi2c->XferOptions = I2C_NO_OPTION_FRAME;
1761     hi2c->Devaddress  = DevAddress;
1762 
1763     /* Process Unlocked */
1764     __HAL_UNLOCK(hi2c);
1765 
1766     /* Note : The I2C interrupts must be enabled after unlocking current process
1767               to avoid the risk of I2C interrupt handle execution before current
1768               process unlock */
1769     /* Enable EVT, BUF and ERR interrupt */
1770     __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
1771 
1772     /* Generate Start */
1773     SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
1774 
1775     return HAL_OK;
1776   }
1777   else
1778   {
1779     return HAL_BUSY;
1780   }
1781 }
1782 
1783 /**
1784   * @brief  Receive in master mode an amount of data in non-blocking mode with Interrupt
1785   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
1786   *                the configuration information for the specified I2C.
1787   * @param  DevAddress Target device address: The device 7 bits address value
1788   *         in datasheet must be shifted to the left before calling the interface
1789   * @param  pData Pointer to data buffer
1790   * @param  Size Amount of data to be sent
1791   * @retval HAL status
1792   */
HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef * hi2c,uint16_t DevAddress,uint8_t * pData,uint16_t Size)1793 HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
1794 {
1795   __IO uint32_t count = 0U;
1796 
1797   if (hi2c->State == HAL_I2C_STATE_READY)
1798   {
1799     /* Wait until BUSY flag is reset */
1800     count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U);
1801     do
1802     {
1803       count--;
1804       if (count == 0U)
1805       {
1806         hi2c->PreviousState       = I2C_STATE_NONE;
1807         hi2c->State               = HAL_I2C_STATE_READY;
1808         hi2c->Mode                = HAL_I2C_MODE_NONE;
1809         hi2c->ErrorCode           |= HAL_I2C_ERROR_TIMEOUT;
1810 
1811         /* Process Unlocked */
1812         __HAL_UNLOCK(hi2c);
1813 
1814         return HAL_ERROR;
1815       }
1816     }
1817     while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
1818 
1819     /* Process Locked */
1820     __HAL_LOCK(hi2c);
1821 
1822     /* Check if the I2C is already enabled */
1823     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
1824     {
1825       /* Enable I2C peripheral */
1826       __HAL_I2C_ENABLE(hi2c);
1827     }
1828 
1829     /* Disable Pos */
1830     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
1831 
1832     hi2c->State     = HAL_I2C_STATE_BUSY_RX;
1833     hi2c->Mode      = HAL_I2C_MODE_MASTER;
1834     hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1835 
1836     /* Prepare transfer parameters */
1837     hi2c->pBuffPtr    = pData;
1838     hi2c->XferCount   = Size;
1839     hi2c->XferSize    = hi2c->XferCount;
1840     hi2c->XferOptions = I2C_NO_OPTION_FRAME;
1841     hi2c->Devaddress  = DevAddress;
1842 
1843 
1844     /* Process Unlocked */
1845     __HAL_UNLOCK(hi2c);
1846 
1847     /* Note : The I2C interrupts must be enabled after unlocking current process
1848     to avoid the risk of I2C interrupt handle execution before current
1849     process unlock */
1850 
1851     /* Enable EVT, BUF and ERR interrupt */
1852     __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
1853 
1854     /* Enable Acknowledge */
1855     SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1856 
1857     /* Generate Start */
1858     SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
1859 
1860     return HAL_OK;
1861   }
1862   else
1863   {
1864     return HAL_BUSY;
1865   }
1866 }
1867 
1868 /**
1869   * @brief  Transmit in slave mode an amount of data in non-blocking mode with Interrupt
1870   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
1871   *         the configuration information for the specified I2C.
1872   * @param  pData Pointer to data buffer
1873   * @param  Size Amount of data to be sent
1874   * @retval HAL status
1875   */
HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef * hi2c,uint8_t * pData,uint16_t Size)1876 HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
1877 {
1878 
1879   if (hi2c->State == HAL_I2C_STATE_READY)
1880   {
1881     if ((pData == NULL) || (Size == 0U))
1882     {
1883       return  HAL_ERROR;
1884     }
1885 
1886     /* Process Locked */
1887     __HAL_LOCK(hi2c);
1888 
1889     /* Check if the I2C is already enabled */
1890     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
1891     {
1892       /* Enable I2C peripheral */
1893       __HAL_I2C_ENABLE(hi2c);
1894     }
1895 
1896     /* Disable Pos */
1897     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
1898 
1899     hi2c->State     = HAL_I2C_STATE_BUSY_TX;
1900     hi2c->Mode      = HAL_I2C_MODE_SLAVE;
1901     hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1902 
1903     /* Prepare transfer parameters */
1904     hi2c->pBuffPtr    = pData;
1905     hi2c->XferCount   = Size;
1906     hi2c->XferSize    = hi2c->XferCount;
1907     hi2c->XferOptions = I2C_NO_OPTION_FRAME;
1908 
1909     /* Enable Address Acknowledge */
1910     SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1911 
1912     /* Process Unlocked */
1913     __HAL_UNLOCK(hi2c);
1914 
1915     /* Note : The I2C interrupts must be enabled after unlocking current process
1916               to avoid the risk of I2C interrupt handle execution before current
1917               process unlock */
1918 
1919     /* Enable EVT, BUF and ERR interrupt */
1920     __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
1921 
1922     return HAL_OK;
1923   }
1924   else
1925   {
1926     return HAL_BUSY;
1927   }
1928 }
1929 
1930 /**
1931   * @brief  Receive in slave mode an amount of data in non-blocking mode with Interrupt
1932   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
1933   *                the configuration information for the specified I2C.
1934   * @param  pData Pointer to data buffer
1935   * @param  Size Amount of data to be sent
1936   * @retval HAL status
1937   */
HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef * hi2c,uint8_t * pData,uint16_t Size)1938 HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
1939 {
1940 
1941   if (hi2c->State == HAL_I2C_STATE_READY)
1942   {
1943     if ((pData == NULL) || (Size == 0U))
1944     {
1945       return  HAL_ERROR;
1946     }
1947 
1948     /* Process Locked */
1949     __HAL_LOCK(hi2c);
1950 
1951     /* Check if the I2C is already enabled */
1952     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
1953     {
1954       /* Enable I2C peripheral */
1955       __HAL_I2C_ENABLE(hi2c);
1956     }
1957 
1958     /* Disable Pos */
1959     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
1960 
1961     hi2c->State     = HAL_I2C_STATE_BUSY_RX;
1962     hi2c->Mode      = HAL_I2C_MODE_SLAVE;
1963     hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1964 
1965     /* Prepare transfer parameters */
1966     hi2c->pBuffPtr    = pData;
1967     hi2c->XferCount   = Size;
1968     hi2c->XferSize    = hi2c->XferCount;
1969     hi2c->XferOptions = I2C_NO_OPTION_FRAME;
1970 
1971     /* Enable Address Acknowledge */
1972     SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1973 
1974     /* Process Unlocked */
1975     __HAL_UNLOCK(hi2c);
1976 
1977     /* Note : The I2C interrupts must be enabled after unlocking current process
1978               to avoid the risk of I2C interrupt handle execution before current
1979               process unlock */
1980 
1981     /* Enable EVT, BUF and ERR interrupt */
1982     __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
1983 
1984     return HAL_OK;
1985   }
1986   else
1987   {
1988     return HAL_BUSY;
1989   }
1990 }
1991 
1992 /**
1993   * @brief  Transmit in master mode an amount of data in non-blocking mode with DMA
1994   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
1995   *                the configuration information for the specified I2C.
1996   * @param  DevAddress Target device address: The device 7 bits address value
1997   *         in datasheet must be shifted to the left before calling the interface
1998   * @param  pData Pointer to data buffer
1999   * @param  Size Amount of data to be sent
2000   * @retval HAL status
2001   */
HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef * hi2c,uint16_t DevAddress,uint8_t * pData,uint16_t Size)2002 HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
2003 {
2004   __IO uint32_t count = 0U;
2005   HAL_StatusTypeDef dmaxferstatus;
2006 
2007   if (hi2c->State == HAL_I2C_STATE_READY)
2008   {
2009     /* Wait until BUSY flag is reset */
2010     count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U);
2011     do
2012     {
2013       count--;
2014       if (count == 0U)
2015       {
2016         hi2c->PreviousState       = I2C_STATE_NONE;
2017         hi2c->State               = HAL_I2C_STATE_READY;
2018         hi2c->Mode                = HAL_I2C_MODE_NONE;
2019         hi2c->ErrorCode           |= HAL_I2C_ERROR_TIMEOUT;
2020 
2021         /* Process Unlocked */
2022         __HAL_UNLOCK(hi2c);
2023 
2024         return HAL_ERROR;
2025       }
2026     }
2027     while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
2028 
2029     /* Process Locked */
2030     __HAL_LOCK(hi2c);
2031 
2032     /* Check if the I2C is already enabled */
2033     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
2034     {
2035       /* Enable I2C peripheral */
2036       __HAL_I2C_ENABLE(hi2c);
2037     }
2038 
2039     /* Disable Pos */
2040     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
2041 
2042     hi2c->State     = HAL_I2C_STATE_BUSY_TX;
2043     hi2c->Mode      = HAL_I2C_MODE_MASTER;
2044     hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2045 
2046     /* Prepare transfer parameters */
2047     hi2c->pBuffPtr    = pData;
2048     hi2c->XferCount   = Size;
2049     hi2c->XferSize    = hi2c->XferCount;
2050     hi2c->XferOptions = I2C_NO_OPTION_FRAME;
2051     hi2c->Devaddress  = DevAddress;
2052 
2053     if (hi2c->XferSize > 0U)
2054     {
2055       if (hi2c->hdmatx != NULL)
2056       {
2057         /* Set the I2C DMA transfer complete callback */
2058         hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt;
2059 
2060         /* Set the DMA error callback */
2061         hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
2062 
2063         /* Set the unused DMA callbacks to NULL */
2064         hi2c->hdmatx->XferHalfCpltCallback = NULL;
2065         hi2c->hdmatx->XferAbortCallback = NULL;
2066 
2067         /* Enable the DMA channel */
2068         dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize);
2069       }
2070       else
2071       {
2072         /* Update I2C state */
2073         hi2c->State     = HAL_I2C_STATE_READY;
2074         hi2c->Mode      = HAL_I2C_MODE_NONE;
2075 
2076         /* Update I2C error code */
2077         hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
2078 
2079         /* Process Unlocked */
2080         __HAL_UNLOCK(hi2c);
2081 
2082         return HAL_ERROR;
2083       }
2084 
2085       if (dmaxferstatus == HAL_OK)
2086       {
2087         /* Process Unlocked */
2088         __HAL_UNLOCK(hi2c);
2089 
2090         /* Note : The I2C interrupts must be enabled after unlocking current process
2091         to avoid the risk of I2C interrupt handle execution before current
2092         process unlock */
2093 
2094         /* Enable EVT and ERR interrupt */
2095         __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
2096 
2097         /* Enable DMA Request */
2098         SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
2099 
2100         /* Enable Acknowledge */
2101         SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
2102 
2103         /* Generate Start */
2104         SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
2105       }
2106       else
2107       {
2108         /* Update I2C state */
2109         hi2c->State     = HAL_I2C_STATE_READY;
2110         hi2c->Mode      = HAL_I2C_MODE_NONE;
2111 
2112         /* Update I2C error code */
2113         hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
2114 
2115         /* Process Unlocked */
2116         __HAL_UNLOCK(hi2c);
2117 
2118         return HAL_ERROR;
2119       }
2120     }
2121     else
2122     {
2123       /* Enable Acknowledge */
2124       SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
2125 
2126       /* Generate Start */
2127       SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
2128 
2129       /* Process Unlocked */
2130       __HAL_UNLOCK(hi2c);
2131 
2132       /* Note : The I2C interrupts must be enabled after unlocking current process
2133       to avoid the risk of I2C interrupt handle execution before current
2134       process unlock */
2135 
2136       /* Enable EVT, BUF and ERR interrupt */
2137       __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
2138     }
2139 
2140     return HAL_OK;
2141   }
2142   else
2143   {
2144     return HAL_BUSY;
2145   }
2146 }
2147 
2148 /**
2149   * @brief  Receive in master mode an amount of data in non-blocking mode with DMA
2150   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
2151   *                the configuration information for the specified I2C.
2152   * @param  DevAddress Target device address: The device 7 bits address value
2153   *         in datasheet must be shifted to the left before calling the interface
2154   * @param  pData Pointer to data buffer
2155   * @param  Size Amount of data to be sent
2156   * @retval HAL status
2157   */
HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef * hi2c,uint16_t DevAddress,uint8_t * pData,uint16_t Size)2158 HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
2159 {
2160   __IO uint32_t count = 0U;
2161   HAL_StatusTypeDef dmaxferstatus;
2162 
2163   if (hi2c->State == HAL_I2C_STATE_READY)
2164   {
2165     /* Wait until BUSY flag is reset */
2166     count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U);
2167     do
2168     {
2169       count--;
2170       if (count == 0U)
2171       {
2172         hi2c->PreviousState       = I2C_STATE_NONE;
2173         hi2c->State               = HAL_I2C_STATE_READY;
2174         hi2c->Mode                = HAL_I2C_MODE_NONE;
2175         hi2c->ErrorCode           |= HAL_I2C_ERROR_TIMEOUT;
2176 
2177         /* Process Unlocked */
2178         __HAL_UNLOCK(hi2c);
2179 
2180         return HAL_ERROR;
2181       }
2182     }
2183     while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
2184 
2185     /* Process Locked */
2186     __HAL_LOCK(hi2c);
2187 
2188     /* Check if the I2C is already enabled */
2189     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
2190     {
2191       /* Enable I2C peripheral */
2192       __HAL_I2C_ENABLE(hi2c);
2193     }
2194 
2195     /* Disable Pos */
2196     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
2197 
2198     hi2c->State     = HAL_I2C_STATE_BUSY_RX;
2199     hi2c->Mode      = HAL_I2C_MODE_MASTER;
2200     hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2201 
2202     /* Prepare transfer parameters */
2203     hi2c->pBuffPtr    = pData;
2204     hi2c->XferCount   = Size;
2205     hi2c->XferSize    = hi2c->XferCount;
2206     hi2c->XferOptions = I2C_NO_OPTION_FRAME;
2207     hi2c->Devaddress  = DevAddress;
2208 
2209     if (hi2c->XferSize > 0U)
2210     {
2211       if (hi2c->hdmarx != NULL)
2212       {
2213         /* Set the I2C DMA transfer complete callback */
2214         hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt;
2215 
2216         /* Set the DMA error callback */
2217         hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
2218 
2219         /* Set the unused DMA callbacks to NULL */
2220         hi2c->hdmarx->XferHalfCpltCallback = NULL;
2221         hi2c->hdmarx->XferAbortCallback = NULL;
2222 
2223         /* Enable the DMA channel */
2224         dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize);
2225       }
2226       else
2227       {
2228         /* Update I2C state */
2229         hi2c->State     = HAL_I2C_STATE_READY;
2230         hi2c->Mode      = HAL_I2C_MODE_NONE;
2231 
2232         /* Update I2C error code */
2233         hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
2234 
2235         /* Process Unlocked */
2236         __HAL_UNLOCK(hi2c);
2237 
2238         return HAL_ERROR;
2239       }
2240 
2241       if (dmaxferstatus == HAL_OK)
2242       {
2243         /* Enable Acknowledge */
2244         SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
2245 
2246         /* Generate Start */
2247         SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
2248 
2249         /* Process Unlocked */
2250         __HAL_UNLOCK(hi2c);
2251 
2252         /* Note : The I2C interrupts must be enabled after unlocking current process
2253         to avoid the risk of I2C interrupt handle execution before current
2254         process unlock */
2255 
2256         /* Enable EVT and ERR interrupt */
2257         __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
2258 
2259         /* Enable DMA Request */
2260         SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
2261       }
2262       else
2263       {
2264         /* Update I2C state */
2265         hi2c->State     = HAL_I2C_STATE_READY;
2266         hi2c->Mode      = HAL_I2C_MODE_NONE;
2267 
2268         /* Update I2C error code */
2269         hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
2270 
2271         /* Process Unlocked */
2272         __HAL_UNLOCK(hi2c);
2273 
2274         return HAL_ERROR;
2275       }
2276     }
2277     else
2278     {
2279       /* Process Unlocked */
2280       __HAL_UNLOCK(hi2c);
2281 
2282       /* Note : The I2C interrupts must be enabled after unlocking current process
2283       to avoid the risk of I2C interrupt handle execution before current
2284       process unlock */
2285 
2286       /* Enable EVT, BUF and ERR interrupt */
2287       __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
2288 
2289       /* Enable Acknowledge */
2290       SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
2291 
2292       /* Generate Start */
2293       SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
2294     }
2295 
2296     return HAL_OK;
2297   }
2298   else
2299   {
2300     return HAL_BUSY;
2301   }
2302 }
2303 
2304 /**
2305   * @brief  Transmit in slave mode an amount of data in non-blocking mode with DMA
2306   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
2307   *                the configuration information for the specified I2C.
2308   * @param  pData Pointer to data buffer
2309   * @param  Size Amount of data to be sent
2310   * @retval HAL status
2311   */
HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef * hi2c,uint8_t * pData,uint16_t Size)2312 HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
2313 {
2314   HAL_StatusTypeDef dmaxferstatus;
2315 
2316   if (hi2c->State == HAL_I2C_STATE_READY)
2317   {
2318     if ((pData == NULL) || (Size == 0U))
2319     {
2320       return  HAL_ERROR;
2321     }
2322 
2323     /* Process Locked */
2324     __HAL_LOCK(hi2c);
2325 
2326     /* Check if the I2C is already enabled */
2327     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
2328     {
2329       /* Enable I2C peripheral */
2330       __HAL_I2C_ENABLE(hi2c);
2331     }
2332 
2333     /* Disable Pos */
2334     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
2335 
2336     hi2c->State     = HAL_I2C_STATE_BUSY_TX;
2337     hi2c->Mode      = HAL_I2C_MODE_SLAVE;
2338     hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2339 
2340     /* Prepare transfer parameters */
2341     hi2c->pBuffPtr    = pData;
2342     hi2c->XferCount   = Size;
2343     hi2c->XferSize    = hi2c->XferCount;
2344     hi2c->XferOptions = I2C_NO_OPTION_FRAME;
2345 
2346     if (hi2c->hdmatx != NULL)
2347     {
2348       /* Set the I2C DMA transfer complete callback */
2349       hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt;
2350 
2351       /* Set the DMA error callback */
2352       hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
2353 
2354       /* Set the unused DMA callbacks to NULL */
2355       hi2c->hdmatx->XferHalfCpltCallback = NULL;
2356       hi2c->hdmatx->XferAbortCallback = NULL;
2357 
2358       /* Enable the DMA channel */
2359       dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize);
2360     }
2361     else
2362     {
2363       /* Update I2C state */
2364       hi2c->State     = HAL_I2C_STATE_LISTEN;
2365       hi2c->Mode      = HAL_I2C_MODE_NONE;
2366 
2367       /* Update I2C error code */
2368       hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
2369 
2370       /* Process Unlocked */
2371       __HAL_UNLOCK(hi2c);
2372 
2373       return HAL_ERROR;
2374     }
2375 
2376     if (dmaxferstatus == HAL_OK)
2377     {
2378       /* Enable Address Acknowledge */
2379       SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
2380 
2381       /* Process Unlocked */
2382       __HAL_UNLOCK(hi2c);
2383 
2384       /* Note : The I2C interrupts must be enabled after unlocking current process
2385       to avoid the risk of I2C interrupt handle execution before current
2386       process unlock */
2387       /* Enable EVT and ERR interrupt */
2388       __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
2389 
2390       /* Enable DMA Request */
2391       hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
2392 
2393       return HAL_OK;
2394     }
2395     else
2396     {
2397       /* Update I2C state */
2398       hi2c->State     = HAL_I2C_STATE_READY;
2399       hi2c->Mode      = HAL_I2C_MODE_NONE;
2400 
2401       /* Update I2C error code */
2402       hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
2403 
2404       /* Process Unlocked */
2405       __HAL_UNLOCK(hi2c);
2406 
2407       return HAL_ERROR;
2408     }
2409   }
2410   else
2411   {
2412     return HAL_BUSY;
2413   }
2414 }
2415 
2416 /**
2417   * @brief  Receive in slave mode an amount of data in non-blocking mode with DMA
2418   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
2419   *                the configuration information for the specified I2C.
2420   * @param  pData Pointer to data buffer
2421   * @param  Size Amount of data to be sent
2422   * @retval HAL status
2423   */
HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef * hi2c,uint8_t * pData,uint16_t Size)2424 HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
2425 {
2426   HAL_StatusTypeDef dmaxferstatus;
2427 
2428   if (hi2c->State == HAL_I2C_STATE_READY)
2429   {
2430     if ((pData == NULL) || (Size == 0U))
2431     {
2432       return  HAL_ERROR;
2433     }
2434 
2435     /* Process Locked */
2436     __HAL_LOCK(hi2c);
2437 
2438     /* Check if the I2C is already enabled */
2439     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
2440     {
2441       /* Enable I2C peripheral */
2442       __HAL_I2C_ENABLE(hi2c);
2443     }
2444 
2445     /* Disable Pos */
2446     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
2447 
2448     hi2c->State     = HAL_I2C_STATE_BUSY_RX;
2449     hi2c->Mode      = HAL_I2C_MODE_SLAVE;
2450     hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2451 
2452     /* Prepare transfer parameters */
2453     hi2c->pBuffPtr    = pData;
2454     hi2c->XferCount   = Size;
2455     hi2c->XferSize    = hi2c->XferCount;
2456     hi2c->XferOptions = I2C_NO_OPTION_FRAME;
2457 
2458     if (hi2c->hdmarx != NULL)
2459     {
2460       /* Set the I2C DMA transfer complete callback */
2461       hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt;
2462 
2463       /* Set the DMA error callback */
2464       hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
2465 
2466       /* Set the unused DMA callbacks to NULL */
2467       hi2c->hdmarx->XferHalfCpltCallback = NULL;
2468       hi2c->hdmarx->XferAbortCallback = NULL;
2469 
2470       /* Enable the DMA channel */
2471       dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize);
2472     }
2473     else
2474     {
2475       /* Update I2C state */
2476       hi2c->State     = HAL_I2C_STATE_LISTEN;
2477       hi2c->Mode      = HAL_I2C_MODE_NONE;
2478 
2479       /* Update I2C error code */
2480       hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
2481 
2482       /* Process Unlocked */
2483       __HAL_UNLOCK(hi2c);
2484 
2485       return HAL_ERROR;
2486     }
2487 
2488     if (dmaxferstatus == HAL_OK)
2489     {
2490       /* Enable Address Acknowledge */
2491       SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
2492 
2493       /* Process Unlocked */
2494       __HAL_UNLOCK(hi2c);
2495 
2496       /* Note : The I2C interrupts must be enabled after unlocking current process
2497       to avoid the risk of I2C interrupt handle execution before current
2498       process unlock */
2499       /* Enable EVT and ERR interrupt */
2500       __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
2501 
2502       /* Enable DMA Request */
2503       SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
2504 
2505       return HAL_OK;
2506     }
2507     else
2508     {
2509       /* Update I2C state */
2510       hi2c->State     = HAL_I2C_STATE_READY;
2511       hi2c->Mode      = HAL_I2C_MODE_NONE;
2512 
2513       /* Update I2C error code */
2514       hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
2515 
2516       /* Process Unlocked */
2517       __HAL_UNLOCK(hi2c);
2518 
2519       return HAL_ERROR;
2520     }
2521   }
2522   else
2523   {
2524     return HAL_BUSY;
2525   }
2526 }
2527 
2528 /**
2529   * @brief  Write an amount of data in blocking mode to a specific memory address
2530   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
2531   *                the configuration information for the specified I2C.
2532   * @param  DevAddress Target device address: The device 7 bits address value
2533   *         in datasheet must be shifted to the left before calling the interface
2534   * @param  MemAddress Internal memory address
2535   * @param  MemAddSize Size of internal memory address
2536   * @param  pData Pointer to data buffer
2537   * @param  Size Amount of data to be sent
2538   * @param  Timeout Timeout duration
2539   * @retval HAL status
2540   */
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)2541 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)
2542 {
2543   /* Init tickstart for timeout management*/
2544   uint32_t tickstart = HAL_GetTick();
2545 
2546   /* Check the parameters */
2547   assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
2548 
2549   if (hi2c->State == HAL_I2C_STATE_READY)
2550   {
2551     /* Wait until BUSY flag is reset */
2552     if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
2553     {
2554       return HAL_BUSY;
2555     }
2556 
2557     /* Process Locked */
2558     __HAL_LOCK(hi2c);
2559 
2560     /* Check if the I2C is already enabled */
2561     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
2562     {
2563       /* Enable I2C peripheral */
2564       __HAL_I2C_ENABLE(hi2c);
2565     }
2566 
2567     /* Disable Pos */
2568     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
2569 
2570     hi2c->State     = HAL_I2C_STATE_BUSY_TX;
2571     hi2c->Mode      = HAL_I2C_MODE_MEM;
2572     hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2573 
2574     /* Prepare transfer parameters */
2575     hi2c->pBuffPtr    = pData;
2576     hi2c->XferCount   = Size;
2577     hi2c->XferSize    = hi2c->XferCount;
2578     hi2c->XferOptions = I2C_NO_OPTION_FRAME;
2579 
2580     /* Send Slave Address and Memory Address */
2581     if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK)
2582     {
2583       return HAL_ERROR;
2584     }
2585 
2586     while (hi2c->XferSize > 0U)
2587     {
2588       /* Wait until TXE flag is set */
2589       if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
2590       {
2591         if (hi2c->ErrorCode == HAL_I2C_ERROR_AF)
2592         {
2593           /* Generate Stop */
2594           SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
2595         }
2596         return HAL_ERROR;
2597       }
2598 
2599       /* Write data to DR */
2600       hi2c->Instance->DR = *hi2c->pBuffPtr;
2601 
2602       /* Increment Buffer pointer */
2603       hi2c->pBuffPtr++;
2604 
2605       /* Update counter */
2606       hi2c->XferSize--;
2607       hi2c->XferCount--;
2608 
2609       if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U))
2610       {
2611         /* Write data to DR */
2612         hi2c->Instance->DR = *hi2c->pBuffPtr;
2613 
2614         /* Increment Buffer pointer */
2615         hi2c->pBuffPtr++;
2616 
2617         /* Update counter */
2618         hi2c->XferSize--;
2619         hi2c->XferCount--;
2620       }
2621     }
2622 
2623     /* Wait until BTF flag is set */
2624     if (I2C_WaitOnBTFFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
2625     {
2626       if (hi2c->ErrorCode == HAL_I2C_ERROR_AF)
2627       {
2628         /* Generate Stop */
2629         SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
2630       }
2631       return HAL_ERROR;
2632     }
2633 
2634     /* Generate Stop */
2635     SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
2636 
2637     hi2c->State = HAL_I2C_STATE_READY;
2638     hi2c->Mode = HAL_I2C_MODE_NONE;
2639 
2640     /* Process Unlocked */
2641     __HAL_UNLOCK(hi2c);
2642 
2643     return HAL_OK;
2644   }
2645   else
2646   {
2647     return HAL_BUSY;
2648   }
2649 }
2650 
2651 /**
2652   * @brief  Read an amount of data in blocking mode from a specific memory address
2653   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
2654   *                the configuration information for the specified I2C.
2655   * @param  DevAddress Target device address: The device 7 bits address value
2656   *         in datasheet must be shifted to the left before calling the interface
2657   * @param  MemAddress Internal memory address
2658   * @param  MemAddSize Size of internal memory address
2659   * @param  pData Pointer to data buffer
2660   * @param  Size Amount of data to be sent
2661   * @param  Timeout Timeout duration
2662   * @retval HAL status
2663   */
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)2664 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)
2665 {
2666   __IO uint32_t count = 0U;
2667 
2668   /* Init tickstart for timeout management*/
2669   uint32_t tickstart = HAL_GetTick();
2670 
2671   /* Check the parameters */
2672   assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
2673 
2674   if (hi2c->State == HAL_I2C_STATE_READY)
2675   {
2676     /* Wait until BUSY flag is reset */
2677     if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
2678     {
2679       return HAL_BUSY;
2680     }
2681 
2682     /* Process Locked */
2683     __HAL_LOCK(hi2c);
2684 
2685     /* Check if the I2C is already enabled */
2686     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
2687     {
2688       /* Enable I2C peripheral */
2689       __HAL_I2C_ENABLE(hi2c);
2690     }
2691 
2692     /* Disable Pos */
2693     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
2694 
2695     hi2c->State     = HAL_I2C_STATE_BUSY_RX;
2696     hi2c->Mode      = HAL_I2C_MODE_MEM;
2697     hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2698 
2699     /* Prepare transfer parameters */
2700     hi2c->pBuffPtr    = pData;
2701     hi2c->XferCount   = Size;
2702     hi2c->XferSize    = hi2c->XferCount;
2703     hi2c->XferOptions = I2C_NO_OPTION_FRAME;
2704 
2705     /* Send Slave Address and Memory Address */
2706     if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK)
2707     {
2708       return HAL_ERROR;
2709     }
2710 
2711     if (hi2c->XferSize == 0U)
2712     {
2713       /* Clear ADDR flag */
2714       __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
2715 
2716       /* Generate Stop */
2717       SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
2718     }
2719     else if (hi2c->XferSize == 1U)
2720     {
2721       /* Disable Acknowledge */
2722       CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
2723 
2724       /* Disable all active IRQs around ADDR clearing and STOP programming because the EV6_3
2725          software sequence must complete before the current byte end of transfer */
2726       __disable_irq();
2727 
2728       /* Clear ADDR flag */
2729       __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
2730 
2731       /* Generate Stop */
2732       SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
2733 
2734       /* Re-enable IRQs */
2735       __enable_irq();
2736     }
2737     else if (hi2c->XferSize == 2U)
2738     {
2739       /* Enable Pos */
2740       SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
2741 
2742       /* Disable all active IRQs around ADDR clearing and STOP programming because the EV6_3
2743          software sequence must complete before the current byte end of transfer */
2744       __disable_irq();
2745 
2746       /* Clear ADDR flag */
2747       __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
2748 
2749       /* Disable Acknowledge */
2750       CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
2751 
2752       /* Re-enable IRQs */
2753       __enable_irq();
2754     }
2755     else
2756     {
2757       /* Enable Acknowledge */
2758       SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
2759       /* Clear ADDR flag */
2760       __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
2761     }
2762 
2763     while (hi2c->XferSize > 0U)
2764     {
2765       if (hi2c->XferSize <= 3U)
2766       {
2767         /* One byte */
2768         if (hi2c->XferSize == 1U)
2769         {
2770           /* Wait until RXNE flag is set */
2771           if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
2772           {
2773             return HAL_ERROR;
2774           }
2775 
2776           /* Read data from DR */
2777           *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
2778 
2779           /* Increment Buffer pointer */
2780           hi2c->pBuffPtr++;
2781 
2782           /* Update counter */
2783           hi2c->XferSize--;
2784           hi2c->XferCount--;
2785         }
2786         /* Two bytes */
2787         else if (hi2c->XferSize == 2U)
2788         {
2789           /* Wait until BTF flag is set */
2790           if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)
2791           {
2792             return HAL_ERROR;
2793           }
2794 
2795           /* Disable all active IRQs around ADDR clearing and STOP programming because the EV6_3
2796              software sequence must complete before the current byte end of transfer */
2797           __disable_irq();
2798 
2799           /* Generate Stop */
2800           SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
2801 
2802           /* Read data from DR */
2803           *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
2804 
2805           /* Increment Buffer pointer */
2806           hi2c->pBuffPtr++;
2807 
2808           /* Update counter */
2809           hi2c->XferSize--;
2810           hi2c->XferCount--;
2811 
2812           /* Re-enable IRQs */
2813           __enable_irq();
2814 
2815           /* Read data from DR */
2816           *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
2817 
2818           /* Increment Buffer pointer */
2819           hi2c->pBuffPtr++;
2820 
2821           /* Update counter */
2822           hi2c->XferSize--;
2823           hi2c->XferCount--;
2824         }
2825         /* 3 Last bytes */
2826         else
2827         {
2828           /* Wait until BTF flag is set */
2829           if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)
2830           {
2831             return HAL_ERROR;
2832           }
2833 
2834           /* Disable Acknowledge */
2835           CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
2836 
2837           /* Disable all active IRQs around ADDR clearing and STOP programming because the EV6_3
2838              software sequence must complete before the current byte end of transfer */
2839           __disable_irq();
2840 
2841           /* Read data from DR */
2842           *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
2843 
2844           /* Increment Buffer pointer */
2845           hi2c->pBuffPtr++;
2846 
2847           /* Update counter */
2848           hi2c->XferSize--;
2849           hi2c->XferCount--;
2850 
2851           /* Wait until BTF flag is set */
2852           count = I2C_TIMEOUT_FLAG * (SystemCoreClock / 25U / 1000U);
2853           do
2854           {
2855             count--;
2856             if (count == 0U)
2857             {
2858               hi2c->PreviousState       = I2C_STATE_NONE;
2859               hi2c->State               = HAL_I2C_STATE_READY;
2860               hi2c->Mode                = HAL_I2C_MODE_NONE;
2861               hi2c->ErrorCode           |= HAL_I2C_ERROR_TIMEOUT;
2862 
2863               /* Re-enable IRQs */
2864               __enable_irq();
2865 
2866               /* Process Unlocked */
2867               __HAL_UNLOCK(hi2c);
2868 
2869               return HAL_ERROR;
2870             }
2871           }
2872           while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == RESET);
2873 
2874           /* Generate Stop */
2875           SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
2876 
2877           /* Read data from DR */
2878           *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
2879 
2880           /* Increment Buffer pointer */
2881           hi2c->pBuffPtr++;
2882 
2883           /* Update counter */
2884           hi2c->XferSize--;
2885           hi2c->XferCount--;
2886 
2887           /* Re-enable IRQs */
2888           __enable_irq();
2889 
2890           /* Read data from DR */
2891           *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
2892 
2893           /* Increment Buffer pointer */
2894           hi2c->pBuffPtr++;
2895 
2896           /* Update counter */
2897           hi2c->XferSize--;
2898           hi2c->XferCount--;
2899         }
2900       }
2901       else
2902       {
2903         /* Wait until RXNE flag is set */
2904         if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
2905         {
2906           return HAL_ERROR;
2907         }
2908 
2909         /* Read data from DR */
2910         *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
2911 
2912         /* Increment Buffer pointer */
2913         hi2c->pBuffPtr++;
2914 
2915         /* Update counter */
2916         hi2c->XferSize--;
2917         hi2c->XferCount--;
2918 
2919         if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET)
2920         {
2921           /* Read data from DR */
2922           *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
2923 
2924           /* Increment Buffer pointer */
2925           hi2c->pBuffPtr++;
2926 
2927           /* Update counter */
2928           hi2c->XferSize--;
2929           hi2c->XferCount--;
2930         }
2931       }
2932     }
2933 
2934     hi2c->State = HAL_I2C_STATE_READY;
2935     hi2c->Mode = HAL_I2C_MODE_NONE;
2936 
2937     /* Process Unlocked */
2938     __HAL_UNLOCK(hi2c);
2939 
2940     return HAL_OK;
2941   }
2942   else
2943   {
2944     return HAL_BUSY;
2945   }
2946 }
2947 
2948 /**
2949   * @brief  Write an amount of data in non-blocking mode with Interrupt to a specific memory address
2950   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
2951   *                the configuration information for the specified I2C.
2952   * @param  DevAddress Target device address: The device 7 bits address value
2953   *         in datasheet must be shifted to the left before calling the interface
2954   * @param  MemAddress Internal memory address
2955   * @param  MemAddSize Size of internal memory address
2956   * @param  pData Pointer to data buffer
2957   * @param  Size Amount of data to be sent
2958   * @retval HAL status
2959   */
HAL_I2C_Mem_Write_IT(I2C_HandleTypeDef * hi2c,uint16_t DevAddress,uint16_t MemAddress,uint16_t MemAddSize,uint8_t * pData,uint16_t Size)2960 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)
2961 {
2962   __IO uint32_t count = 0U;
2963 
2964   /* Check the parameters */
2965   assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
2966 
2967   if (hi2c->State == HAL_I2C_STATE_READY)
2968   {
2969     /* Wait until BUSY flag is reset */
2970     count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U);
2971     do
2972     {
2973       count--;
2974       if (count == 0U)
2975       {
2976         hi2c->PreviousState       = I2C_STATE_NONE;
2977         hi2c->State               = HAL_I2C_STATE_READY;
2978         hi2c->Mode                = HAL_I2C_MODE_NONE;
2979         hi2c->ErrorCode           |= HAL_I2C_ERROR_TIMEOUT;
2980 
2981         /* Process Unlocked */
2982         __HAL_UNLOCK(hi2c);
2983 
2984         return HAL_ERROR;
2985       }
2986     }
2987     while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
2988 
2989     /* Process Locked */
2990     __HAL_LOCK(hi2c);
2991 
2992     /* Check if the I2C is already enabled */
2993     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
2994     {
2995       /* Enable I2C peripheral */
2996       __HAL_I2C_ENABLE(hi2c);
2997     }
2998 
2999     /* Disable Pos */
3000     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
3001 
3002     hi2c->State     = HAL_I2C_STATE_BUSY_TX;
3003     hi2c->Mode      = HAL_I2C_MODE_MEM;
3004     hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3005 
3006     /* Prepare transfer parameters */
3007     hi2c->pBuffPtr    = pData;
3008     hi2c->XferCount   = Size;
3009     hi2c->XferSize    = hi2c->XferCount;
3010     hi2c->XferOptions = I2C_NO_OPTION_FRAME;
3011     hi2c->Devaddress  = DevAddress;
3012     hi2c->Memaddress  = MemAddress;
3013     hi2c->MemaddSize  = MemAddSize;
3014     hi2c->EventCount  = 0U;
3015 
3016     /* Generate Start */
3017     SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
3018 
3019     /* Process Unlocked */
3020     __HAL_UNLOCK(hi2c);
3021 
3022     /* Note : The I2C interrupts must be enabled after unlocking current process
3023     to avoid the risk of I2C interrupt handle execution before current
3024     process unlock */
3025 
3026     /* Enable EVT, BUF and ERR interrupt */
3027     __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
3028 
3029     return HAL_OK;
3030   }
3031   else
3032   {
3033     return HAL_BUSY;
3034   }
3035 }
3036 
3037 /**
3038   * @brief  Read an amount of data in non-blocking mode with Interrupt from a specific memory address
3039   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
3040   *                the configuration information for the specified I2C.
3041   * @param  DevAddress Target device address
3042   * @param  MemAddress Internal memory address
3043   * @param  MemAddSize Size of internal memory address
3044   * @param  pData Pointer to data buffer
3045   * @param  Size Amount of data to be sent
3046   * @retval HAL status
3047   */
HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef * hi2c,uint16_t DevAddress,uint16_t MemAddress,uint16_t MemAddSize,uint8_t * pData,uint16_t Size)3048 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)
3049 {
3050   __IO uint32_t count = 0U;
3051 
3052   /* Check the parameters */
3053   assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
3054 
3055   if (hi2c->State == HAL_I2C_STATE_READY)
3056   {
3057     /* Wait until BUSY flag is reset */
3058     count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U);
3059     do
3060     {
3061       count--;
3062       if (count == 0U)
3063       {
3064         hi2c->PreviousState       = I2C_STATE_NONE;
3065         hi2c->State               = HAL_I2C_STATE_READY;
3066         hi2c->Mode                = HAL_I2C_MODE_NONE;
3067         hi2c->ErrorCode           |= HAL_I2C_ERROR_TIMEOUT;
3068 
3069         /* Process Unlocked */
3070         __HAL_UNLOCK(hi2c);
3071 
3072         return HAL_ERROR;
3073       }
3074     }
3075     while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
3076 
3077     /* Process Locked */
3078     __HAL_LOCK(hi2c);
3079 
3080     /* Check if the I2C is already enabled */
3081     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
3082     {
3083       /* Enable I2C peripheral */
3084       __HAL_I2C_ENABLE(hi2c);
3085     }
3086 
3087     /* Disable Pos */
3088     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
3089 
3090     hi2c->State     = HAL_I2C_STATE_BUSY_RX;
3091     hi2c->Mode      = HAL_I2C_MODE_MEM;
3092     hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3093 
3094     /* Prepare transfer parameters */
3095     hi2c->pBuffPtr    = pData;
3096     hi2c->XferCount   = Size;
3097     hi2c->XferSize    = hi2c->XferCount;
3098     hi2c->XferOptions = I2C_NO_OPTION_FRAME;
3099     hi2c->Devaddress  = DevAddress;
3100     hi2c->Memaddress  = MemAddress;
3101     hi2c->MemaddSize  = MemAddSize;
3102     hi2c->EventCount  = 0U;
3103 
3104     /* Enable Acknowledge */
3105     SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
3106 
3107     /* Generate Start */
3108     SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
3109 
3110     /* Process Unlocked */
3111     __HAL_UNLOCK(hi2c);
3112 
3113     if (hi2c->XferSize > 0U)
3114     {
3115       /* Note : The I2C interrupts must be enabled after unlocking current process
3116       to avoid the risk of I2C interrupt handle execution before current
3117       process unlock */
3118 
3119       /* Enable EVT, BUF and ERR interrupt */
3120       __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
3121     }
3122     return HAL_OK;
3123   }
3124   else
3125   {
3126     return HAL_BUSY;
3127   }
3128 }
3129 
3130 /**
3131   * @brief  Write an amount of data in non-blocking mode with DMA to a specific memory address
3132   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
3133   *                the configuration information for the specified I2C.
3134   * @param  DevAddress Target device address: The device 7 bits address value
3135   *         in datasheet must be shifted to the left before calling the interface
3136   * @param  MemAddress Internal memory address
3137   * @param  MemAddSize Size of internal memory address
3138   * @param  pData Pointer to data buffer
3139   * @param  Size Amount of data to be sent
3140   * @retval HAL status
3141   */
HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef * hi2c,uint16_t DevAddress,uint16_t MemAddress,uint16_t MemAddSize,uint8_t * pData,uint16_t Size)3142 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)
3143 {
3144   __IO uint32_t count = 0U;
3145   HAL_StatusTypeDef dmaxferstatus;
3146 
3147   /* Init tickstart for timeout management*/
3148   uint32_t tickstart = HAL_GetTick();
3149 
3150   /* Check the parameters */
3151   assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
3152 
3153   if (hi2c->State == HAL_I2C_STATE_READY)
3154   {
3155     /* Wait until BUSY flag is reset */
3156     count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U);
3157     do
3158     {
3159       count--;
3160       if (count == 0U)
3161       {
3162         hi2c->PreviousState       = I2C_STATE_NONE;
3163         hi2c->State               = HAL_I2C_STATE_READY;
3164         hi2c->Mode                = HAL_I2C_MODE_NONE;
3165         hi2c->ErrorCode           |= HAL_I2C_ERROR_TIMEOUT;
3166 
3167         /* Process Unlocked */
3168         __HAL_UNLOCK(hi2c);
3169 
3170         return HAL_ERROR;
3171       }
3172     }
3173     while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
3174 
3175     /* Process Locked */
3176     __HAL_LOCK(hi2c);
3177 
3178     /* Check if the I2C is already enabled */
3179     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
3180     {
3181       /* Enable I2C peripheral */
3182       __HAL_I2C_ENABLE(hi2c);
3183     }
3184 
3185     /* Disable Pos */
3186     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
3187 
3188     hi2c->State     = HAL_I2C_STATE_BUSY_TX;
3189     hi2c->Mode      = HAL_I2C_MODE_MEM;
3190     hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3191 
3192     /* Prepare transfer parameters */
3193     hi2c->pBuffPtr    = pData;
3194     hi2c->XferCount   = Size;
3195     hi2c->XferSize    = hi2c->XferCount;
3196     hi2c->XferOptions = I2C_NO_OPTION_FRAME;
3197 
3198     if (hi2c->XferSize > 0U)
3199     {
3200       if (hi2c->hdmatx != NULL)
3201       {
3202         /* Set the I2C DMA transfer complete callback */
3203         hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt;
3204 
3205         /* Set the DMA error callback */
3206         hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
3207 
3208         /* Set the unused DMA callbacks to NULL */
3209         hi2c->hdmatx->XferHalfCpltCallback = NULL;
3210         hi2c->hdmatx->XferAbortCallback = NULL;
3211 
3212         /* Enable the DMA channel */
3213         dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize);
3214       }
3215       else
3216       {
3217         /* Update I2C state */
3218         hi2c->State     = HAL_I2C_STATE_READY;
3219         hi2c->Mode      = HAL_I2C_MODE_NONE;
3220 
3221         /* Update I2C error code */
3222         hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
3223 
3224         /* Process Unlocked */
3225         __HAL_UNLOCK(hi2c);
3226 
3227         return HAL_ERROR;
3228       }
3229 
3230       if (dmaxferstatus == HAL_OK)
3231       {
3232         /* Send Slave Address and Memory Address */
3233         if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK)
3234         {
3235           /* Abort the ongoing DMA */
3236           dmaxferstatus = HAL_DMA_Abort_IT(hi2c->hdmatx);
3237 
3238           /* Prevent unused argument(s) compilation and MISRA warning */
3239           UNUSED(dmaxferstatus);
3240 
3241           /* Set the unused I2C DMA transfer complete callback to NULL */
3242           hi2c->hdmatx->XferCpltCallback = NULL;
3243 
3244           /* Disable Acknowledge */
3245           CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
3246 
3247           hi2c->XferSize = 0U;
3248           hi2c->XferCount = 0U;
3249 
3250           /* Disable I2C peripheral to prevent dummy data in buffer */
3251           __HAL_I2C_DISABLE(hi2c);
3252 
3253           return HAL_ERROR;
3254         }
3255 
3256         /* Clear ADDR flag */
3257         __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
3258 
3259         /* Process Unlocked */
3260         __HAL_UNLOCK(hi2c);
3261 
3262         /* Note : The I2C interrupts must be enabled after unlocking current process
3263         to avoid the risk of I2C interrupt handle execution before current
3264         process unlock */
3265         /* Enable ERR interrupt */
3266         __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_ERR);
3267 
3268         /* Enable DMA Request */
3269         SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
3270 
3271         return HAL_OK;
3272       }
3273       else
3274       {
3275         /* Update I2C state */
3276         hi2c->State     = HAL_I2C_STATE_READY;
3277         hi2c->Mode      = HAL_I2C_MODE_NONE;
3278 
3279         /* Update I2C error code */
3280         hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
3281 
3282         /* Process Unlocked */
3283         __HAL_UNLOCK(hi2c);
3284 
3285         return HAL_ERROR;
3286       }
3287     }
3288     else
3289     {
3290       /* Update I2C state */
3291       hi2c->State     = HAL_I2C_STATE_READY;
3292       hi2c->Mode      = HAL_I2C_MODE_NONE;
3293 
3294       /* Update I2C error code */
3295       hi2c->ErrorCode |= HAL_I2C_ERROR_SIZE;
3296 
3297       /* Process Unlocked */
3298       __HAL_UNLOCK(hi2c);
3299 
3300       return HAL_ERROR;
3301     }
3302   }
3303   else
3304   {
3305     return HAL_BUSY;
3306   }
3307 }
3308 
3309 /**
3310   * @brief  Reads an amount of data in non-blocking mode with DMA from a specific memory address.
3311   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
3312   *                the configuration information for the specified I2C.
3313   * @param  DevAddress Target device address: The device 7 bits address value
3314   *         in datasheet must be shifted to the left before calling the interface
3315   * @param  MemAddress Internal memory address
3316   * @param  MemAddSize Size of internal memory address
3317   * @param  pData Pointer to data buffer
3318   * @param  Size Amount of data to be read
3319   * @retval HAL status
3320   */
HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef * hi2c,uint16_t DevAddress,uint16_t MemAddress,uint16_t MemAddSize,uint8_t * pData,uint16_t Size)3321 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)
3322 {
3323   /* Init tickstart for timeout management*/
3324   uint32_t tickstart = HAL_GetTick();
3325   __IO uint32_t count = 0U;
3326   HAL_StatusTypeDef dmaxferstatus;
3327 
3328   /* Check the parameters */
3329   assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
3330 
3331   if (hi2c->State == HAL_I2C_STATE_READY)
3332   {
3333     /* Wait until BUSY flag is reset */
3334     count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U);
3335     do
3336     {
3337       count--;
3338       if (count == 0U)
3339       {
3340         hi2c->PreviousState       = I2C_STATE_NONE;
3341         hi2c->State               = HAL_I2C_STATE_READY;
3342         hi2c->Mode                = HAL_I2C_MODE_NONE;
3343         hi2c->ErrorCode           |= HAL_I2C_ERROR_TIMEOUT;
3344 
3345         /* Process Unlocked */
3346         __HAL_UNLOCK(hi2c);
3347 
3348         return HAL_ERROR;
3349       }
3350     }
3351     while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
3352 
3353     /* Process Locked */
3354     __HAL_LOCK(hi2c);
3355 
3356     /* Check if the I2C is already enabled */
3357     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
3358     {
3359       /* Enable I2C peripheral */
3360       __HAL_I2C_ENABLE(hi2c);
3361     }
3362 
3363     /* Disable Pos */
3364     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
3365 
3366     hi2c->State     = HAL_I2C_STATE_BUSY_RX;
3367     hi2c->Mode      = HAL_I2C_MODE_MEM;
3368     hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3369 
3370     /* Prepare transfer parameters */
3371     hi2c->pBuffPtr    = pData;
3372     hi2c->XferCount   = Size;
3373     hi2c->XferSize    = hi2c->XferCount;
3374     hi2c->XferOptions = I2C_NO_OPTION_FRAME;
3375 
3376     if (hi2c->XferSize > 0U)
3377     {
3378       if (hi2c->hdmarx != NULL)
3379       {
3380         /* Set the I2C DMA transfer complete callback */
3381         hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt;
3382 
3383         /* Set the DMA error callback */
3384         hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
3385 
3386         /* Set the unused DMA callbacks to NULL */
3387         hi2c->hdmarx->XferHalfCpltCallback = NULL;
3388         hi2c->hdmarx->XferAbortCallback = NULL;
3389 
3390         /* Enable the DMA channel */
3391         dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize);
3392       }
3393       else
3394       {
3395         /* Update I2C state */
3396         hi2c->State     = HAL_I2C_STATE_READY;
3397         hi2c->Mode      = HAL_I2C_MODE_NONE;
3398 
3399         /* Update I2C error code */
3400         hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
3401 
3402         /* Process Unlocked */
3403         __HAL_UNLOCK(hi2c);
3404 
3405         return HAL_ERROR;
3406       }
3407 
3408       if (dmaxferstatus == HAL_OK)
3409       {
3410         /* Send Slave Address and Memory Address */
3411         if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK)
3412         {
3413           /* Abort the ongoing DMA */
3414           dmaxferstatus = HAL_DMA_Abort_IT(hi2c->hdmarx);
3415 
3416           /* Prevent unused argument(s) compilation and MISRA warning */
3417           UNUSED(dmaxferstatus);
3418 
3419           /* Set the unused I2C DMA transfer complete callback to NULL */
3420           hi2c->hdmarx->XferCpltCallback = NULL;
3421 
3422           /* Disable Acknowledge */
3423           CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
3424 
3425           hi2c->XferSize = 0U;
3426           hi2c->XferCount = 0U;
3427 
3428           /* Disable I2C peripheral to prevent dummy data in buffer */
3429           __HAL_I2C_DISABLE(hi2c);
3430 
3431           return HAL_ERROR;
3432         }
3433 
3434         if (hi2c->XferSize == 1U)
3435         {
3436           /* Disable Acknowledge */
3437           CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
3438         }
3439         else
3440         {
3441           /* Enable Last DMA bit */
3442           SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST);
3443         }
3444 
3445         /* Clear ADDR flag */
3446         __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
3447 
3448         /* Process Unlocked */
3449         __HAL_UNLOCK(hi2c);
3450 
3451         /* Note : The I2C interrupts must be enabled after unlocking current process
3452         to avoid the risk of I2C interrupt handle execution before current
3453         process unlock */
3454         /* Enable ERR interrupt */
3455         __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_ERR);
3456 
3457         /* Enable DMA Request */
3458         hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
3459       }
3460       else
3461       {
3462         /* Update I2C state */
3463         hi2c->State     = HAL_I2C_STATE_READY;
3464         hi2c->Mode      = HAL_I2C_MODE_NONE;
3465 
3466         /* Update I2C error code */
3467         hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
3468 
3469         /* Process Unlocked */
3470         __HAL_UNLOCK(hi2c);
3471 
3472         return HAL_ERROR;
3473       }
3474     }
3475     else
3476     {
3477       /* Send Slave Address and Memory Address */
3478       if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK)
3479       {
3480         return HAL_ERROR;
3481       }
3482 
3483       /* Clear ADDR flag */
3484       __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
3485 
3486       /* Generate Stop */
3487       SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
3488 
3489       hi2c->State = HAL_I2C_STATE_READY;
3490 
3491       /* Process Unlocked */
3492       __HAL_UNLOCK(hi2c);
3493     }
3494 
3495     return HAL_OK;
3496   }
3497   else
3498   {
3499     return HAL_BUSY;
3500   }
3501 }
3502 
3503 /**
3504   * @brief  Checks if target device is ready for communication.
3505   * @note   This function is used with Memory devices
3506   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
3507   *                the configuration information for the specified I2C.
3508   * @param  DevAddress Target device address: The device 7 bits address value
3509   *         in datasheet must be shifted to the left before calling the interface
3510   * @param  Trials Number of trials
3511   * @param  Timeout Timeout duration
3512   * @retval HAL status
3513   */
HAL_I2C_IsDeviceReady(I2C_HandleTypeDef * hi2c,uint16_t DevAddress,uint32_t Trials,uint32_t Timeout)3514 HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout)
3515 {
3516   /* Get tick */
3517   uint32_t tickstart = HAL_GetTick();
3518   uint32_t I2C_Trials = 1U;
3519   FlagStatus tmp1;
3520   FlagStatus tmp2;
3521 
3522   if (hi2c->State == HAL_I2C_STATE_READY)
3523   {
3524     /* Wait until BUSY flag is reset */
3525     if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
3526     {
3527       return HAL_BUSY;
3528     }
3529 
3530     /* Process Locked */
3531     __HAL_LOCK(hi2c);
3532 
3533     /* Check if the I2C is already enabled */
3534     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
3535     {
3536       /* Enable I2C peripheral */
3537       __HAL_I2C_ENABLE(hi2c);
3538     }
3539 
3540     /* Disable Pos */
3541     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
3542 
3543     hi2c->State = HAL_I2C_STATE_BUSY;
3544     hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3545     hi2c->XferOptions = I2C_NO_OPTION_FRAME;
3546 
3547     do
3548     {
3549       /* Generate Start */
3550       SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
3551 
3552       /* Wait until SB flag is set */
3553       if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, tickstart) != HAL_OK)
3554       {
3555         if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START)
3556         {
3557           hi2c->ErrorCode = HAL_I2C_WRONG_START;
3558         }
3559         return HAL_TIMEOUT;
3560       }
3561 
3562       /* Send slave address */
3563       hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);
3564 
3565       /* Wait until ADDR or AF flag are set */
3566       /* Get tick */
3567       tickstart = HAL_GetTick();
3568 
3569       tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR);
3570       tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF);
3571       while ((hi2c->State != HAL_I2C_STATE_TIMEOUT) && (tmp1 == RESET) && (tmp2 == RESET))
3572       {
3573         if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
3574         {
3575           hi2c->State = HAL_I2C_STATE_TIMEOUT;
3576         }
3577         tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR);
3578         tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF);
3579       }
3580 
3581       hi2c->State = HAL_I2C_STATE_READY;
3582 
3583       /* Check if the ADDR flag has been set */
3584       if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR) == SET)
3585       {
3586         /* Generate Stop */
3587         SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
3588 
3589         /* Clear ADDR Flag */
3590         __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
3591 
3592         /* Wait until BUSY flag is reset */
3593         if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
3594         {
3595           return HAL_ERROR;
3596         }
3597 
3598         hi2c->State = HAL_I2C_STATE_READY;
3599 
3600         /* Process Unlocked */
3601         __HAL_UNLOCK(hi2c);
3602 
3603         return HAL_OK;
3604       }
3605       else
3606       {
3607         /* Generate Stop */
3608         SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
3609 
3610         /* Clear AF Flag */
3611         __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
3612 
3613         /* Wait until BUSY flag is reset */
3614         if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
3615         {
3616           return HAL_ERROR;
3617         }
3618       }
3619 
3620       /* Increment Trials */
3621       I2C_Trials++;
3622     }
3623     while (I2C_Trials < Trials);
3624 
3625     hi2c->State = HAL_I2C_STATE_READY;
3626 
3627     /* Process Unlocked */
3628     __HAL_UNLOCK(hi2c);
3629 
3630     return HAL_ERROR;
3631   }
3632   else
3633   {
3634     return HAL_BUSY;
3635   }
3636 }
3637 
3638 /**
3639   * @brief  Sequential transmit in master I2C mode an amount of data in non-blocking mode with Interrupt.
3640   * @note   This interface allow to manage repeated start condition when a direction change during transfer
3641   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
3642   *         the configuration information for the specified I2C.
3643   * @param  DevAddress Target device address: The device 7 bits address value
3644   *         in datasheet must be shifted to the left before calling the interface
3645   * @param  pData Pointer to data buffer
3646   * @param  Size Amount of data to be sent
3647   * @param  XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition
3648   * @retval HAL status
3649   */
HAL_I2C_Master_Seq_Transmit_IT(I2C_HandleTypeDef * hi2c,uint16_t DevAddress,uint8_t * pData,uint16_t Size,uint32_t XferOptions)3650 HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
3651 {
3652   __IO uint32_t Prev_State = 0x00U;
3653   __IO uint32_t count      = 0x00U;
3654 
3655   /* Check the parameters */
3656   assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
3657 
3658   if (hi2c->State == HAL_I2C_STATE_READY)
3659   {
3660     /* Check Busy Flag only if FIRST call of Master interface */
3661     if ((READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP) || (XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME))
3662     {
3663       /* Wait until BUSY flag is reset */
3664       count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U);
3665       do
3666       {
3667         count--;
3668         if (count == 0U)
3669         {
3670           hi2c->PreviousState       = I2C_STATE_NONE;
3671           hi2c->State               = HAL_I2C_STATE_READY;
3672           hi2c->Mode                = HAL_I2C_MODE_NONE;
3673           hi2c->ErrorCode           |= HAL_I2C_ERROR_TIMEOUT;
3674 
3675           /* Process Unlocked */
3676           __HAL_UNLOCK(hi2c);
3677 
3678           return HAL_ERROR;
3679         }
3680       }
3681       while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
3682     }
3683 
3684     /* Process Locked */
3685     __HAL_LOCK(hi2c);
3686 
3687     /* Check if the I2C is already enabled */
3688     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
3689     {
3690       /* Enable I2C peripheral */
3691       __HAL_I2C_ENABLE(hi2c);
3692     }
3693 
3694     /* Disable Pos */
3695     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
3696 
3697     hi2c->State     = HAL_I2C_STATE_BUSY_TX;
3698     hi2c->Mode      = HAL_I2C_MODE_MASTER;
3699     hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3700 
3701     /* Prepare transfer parameters */
3702     hi2c->pBuffPtr    = pData;
3703     hi2c->XferCount   = Size;
3704     hi2c->XferSize    = hi2c->XferCount;
3705     hi2c->XferOptions = XferOptions;
3706     hi2c->Devaddress  = DevAddress;
3707 
3708     Prev_State = hi2c->PreviousState;
3709 
3710     /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */
3711     /* Mean Previous state is same as current state */
3712     if ((Prev_State != I2C_STATE_MASTER_BUSY_TX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1))
3713     {
3714       /* Generate Start */
3715       SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
3716     }
3717 
3718     /* Process Unlocked */
3719     __HAL_UNLOCK(hi2c);
3720 
3721     /* Note : The I2C interrupts must be enabled after unlocking current process
3722     to avoid the risk of I2C interrupt handle execution before current
3723     process unlock */
3724 
3725     /* Enable EVT, BUF and ERR interrupt */
3726     __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
3727 
3728     return HAL_OK;
3729   }
3730   else
3731   {
3732     return HAL_BUSY;
3733   }
3734 }
3735 
3736 /**
3737   * @brief  Sequential transmit in master I2C mode an amount of data in non-blocking mode with DMA.
3738   * @note   This interface allow to manage repeated start condition when a direction change during transfer
3739   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
3740   *         the configuration information for the specified I2C.
3741   * @param  DevAddress Target device address: The device 7 bits address value
3742   *         in datasheet must be shifted to the left before calling the interface
3743   * @param  pData Pointer to data buffer
3744   * @param  Size Amount of data to be sent
3745   * @param  XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition
3746   * @retval HAL status
3747   */
HAL_I2C_Master_Seq_Transmit_DMA(I2C_HandleTypeDef * hi2c,uint16_t DevAddress,uint8_t * pData,uint16_t Size,uint32_t XferOptions)3748 HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
3749 {
3750   __IO uint32_t Prev_State = 0x00U;
3751   __IO uint32_t count      = 0x00U;
3752   HAL_StatusTypeDef dmaxferstatus;
3753 
3754   /* Check the parameters */
3755   assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
3756 
3757   if (hi2c->State == HAL_I2C_STATE_READY)
3758   {
3759     /* Check Busy Flag only if FIRST call of Master interface */
3760     if ((READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP) || (XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME))
3761     {
3762       /* Wait until BUSY flag is reset */
3763       count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U);
3764       do
3765       {
3766         count--;
3767         if (count == 0U)
3768         {
3769           hi2c->PreviousState       = I2C_STATE_NONE;
3770           hi2c->State               = HAL_I2C_STATE_READY;
3771           hi2c->Mode                = HAL_I2C_MODE_NONE;
3772           hi2c->ErrorCode           |= HAL_I2C_ERROR_TIMEOUT;
3773 
3774           /* Process Unlocked */
3775           __HAL_UNLOCK(hi2c);
3776 
3777           return HAL_ERROR;
3778         }
3779       }
3780       while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
3781     }
3782 
3783     /* Process Locked */
3784     __HAL_LOCK(hi2c);
3785 
3786     /* Check if the I2C is already enabled */
3787     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
3788     {
3789       /* Enable I2C peripheral */
3790       __HAL_I2C_ENABLE(hi2c);
3791     }
3792 
3793     /* Disable Pos */
3794     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
3795 
3796     hi2c->State     = HAL_I2C_STATE_BUSY_TX;
3797     hi2c->Mode      = HAL_I2C_MODE_MASTER;
3798     hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3799 
3800     /* Prepare transfer parameters */
3801     hi2c->pBuffPtr    = pData;
3802     hi2c->XferCount   = Size;
3803     hi2c->XferSize    = hi2c->XferCount;
3804     hi2c->XferOptions = XferOptions;
3805     hi2c->Devaddress  = DevAddress;
3806 
3807     Prev_State = hi2c->PreviousState;
3808 
3809     if (hi2c->XferSize > 0U)
3810     {
3811       if (hi2c->hdmatx != NULL)
3812       {
3813         /* Set the I2C DMA transfer complete callback */
3814         hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt;
3815 
3816         /* Set the DMA error callback */
3817         hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
3818 
3819         /* Set the unused DMA callbacks to NULL */
3820         hi2c->hdmatx->XferHalfCpltCallback = NULL;
3821         hi2c->hdmatx->XferAbortCallback = NULL;
3822 
3823         /* Enable the DMA channel */
3824         dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize);
3825       }
3826       else
3827       {
3828         /* Update I2C state */
3829         hi2c->State     = HAL_I2C_STATE_READY;
3830         hi2c->Mode      = HAL_I2C_MODE_NONE;
3831 
3832         /* Update I2C error code */
3833         hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
3834 
3835         /* Process Unlocked */
3836         __HAL_UNLOCK(hi2c);
3837 
3838         return HAL_ERROR;
3839       }
3840 
3841       if (dmaxferstatus == HAL_OK)
3842       {
3843         /* Enable Acknowledge */
3844         SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
3845 
3846         /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */
3847         /* Mean Previous state is same as current state */
3848         if ((Prev_State != I2C_STATE_MASTER_BUSY_TX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1))
3849         {
3850           /* Generate Start */
3851           SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
3852         }
3853 
3854         /* Process Unlocked */
3855         __HAL_UNLOCK(hi2c);
3856 
3857         /* Note : The I2C interrupts must be enabled after unlocking current process
3858         to avoid the risk of I2C interrupt handle execution before current
3859         process unlock */
3860 
3861         /* If XferOptions is not associated to a new frame, mean no start bit is request, enable directly the DMA request */
3862         /* In other cases, DMA request is enabled after Slave address treatment in IRQHandler */
3863         if ((XferOptions == I2C_NEXT_FRAME) || (XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP))
3864         {
3865           /* Enable DMA Request */
3866           SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
3867         }
3868 
3869         /* Enable EVT and ERR interrupt */
3870         __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
3871       }
3872       else
3873       {
3874         /* Update I2C state */
3875         hi2c->State     = HAL_I2C_STATE_READY;
3876         hi2c->Mode      = HAL_I2C_MODE_NONE;
3877 
3878         /* Update I2C error code */
3879         hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
3880 
3881         /* Process Unlocked */
3882         __HAL_UNLOCK(hi2c);
3883 
3884         return HAL_ERROR;
3885       }
3886     }
3887     else
3888     {
3889       /* Enable Acknowledge */
3890       SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
3891 
3892       /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */
3893       /* Mean Previous state is same as current state */
3894       if ((Prev_State != I2C_STATE_MASTER_BUSY_TX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1))
3895       {
3896         /* Generate Start */
3897         SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
3898       }
3899 
3900       /* Process Unlocked */
3901       __HAL_UNLOCK(hi2c);
3902 
3903       /* Note : The I2C interrupts must be enabled after unlocking current process
3904       to avoid the risk of I2C interrupt handle execution before current
3905       process unlock */
3906 
3907       /* Enable EVT, BUF and ERR interrupt */
3908       __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
3909     }
3910 
3911     return HAL_OK;
3912   }
3913   else
3914   {
3915     return HAL_BUSY;
3916   }
3917 }
3918 
3919 /**
3920   * @brief  Sequential receive in master I2C mode an amount of data in non-blocking mode with Interrupt
3921   * @note   This interface allow to manage repeated start condition when a direction change during transfer
3922   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
3923   *         the configuration information for the specified I2C.
3924   * @param  DevAddress Target device address: The device 7 bits address value
3925   *         in datasheet must be shifted to the left before calling the interface
3926   * @param  pData Pointer to data buffer
3927   * @param  Size Amount of data to be sent
3928   * @param  XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition
3929   * @retval HAL status
3930   */
HAL_I2C_Master_Seq_Receive_IT(I2C_HandleTypeDef * hi2c,uint16_t DevAddress,uint8_t * pData,uint16_t Size,uint32_t XferOptions)3931 HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
3932 {
3933   __IO uint32_t Prev_State = 0x00U;
3934   __IO uint32_t count = 0U;
3935   uint32_t enableIT = (I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
3936 
3937   /* Check the parameters */
3938   assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
3939 
3940   if (hi2c->State == HAL_I2C_STATE_READY)
3941   {
3942     /* Check Busy Flag only if FIRST call of Master interface */
3943     if ((READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP) || (XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME))
3944     {
3945       /* Wait until BUSY flag is reset */
3946       count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U);
3947       do
3948       {
3949         count--;
3950         if (count == 0U)
3951         {
3952           hi2c->PreviousState       = I2C_STATE_NONE;
3953           hi2c->State               = HAL_I2C_STATE_READY;
3954           hi2c->Mode                = HAL_I2C_MODE_NONE;
3955           hi2c->ErrorCode           |= HAL_I2C_ERROR_TIMEOUT;
3956 
3957           /* Process Unlocked */
3958           __HAL_UNLOCK(hi2c);
3959 
3960           return HAL_ERROR;
3961         }
3962       }
3963       while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
3964     }
3965 
3966     /* Process Locked */
3967     __HAL_LOCK(hi2c);
3968 
3969     /* Check if the I2C is already enabled */
3970     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
3971     {
3972       /* Enable I2C peripheral */
3973       __HAL_I2C_ENABLE(hi2c);
3974     }
3975 
3976     /* Disable Pos */
3977     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
3978 
3979     hi2c->State     = HAL_I2C_STATE_BUSY_RX;
3980     hi2c->Mode      = HAL_I2C_MODE_MASTER;
3981     hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3982 
3983     /* Prepare transfer parameters */
3984     hi2c->pBuffPtr    = pData;
3985     hi2c->XferCount   = Size;
3986     hi2c->XferSize    = hi2c->XferCount;
3987     hi2c->XferOptions = XferOptions;
3988     hi2c->Devaddress  = DevAddress;
3989 
3990     Prev_State = hi2c->PreviousState;
3991 
3992     if ((hi2c->XferCount == 2U) && ((XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP)))
3993     {
3994       if (Prev_State == I2C_STATE_MASTER_BUSY_RX)
3995       {
3996         /* Disable Acknowledge */
3997         CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
3998 
3999         /* Enable Pos */
4000         SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
4001 
4002         /* Remove Enabling of IT_BUF, mean RXNE treatment, treat the 2 bytes through BTF */
4003         enableIT &= ~I2C_IT_BUF;
4004       }
4005       else
4006       {
4007         /* Enable Acknowledge */
4008         SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
4009       }
4010     }
4011     else
4012     {
4013       /* Enable Acknowledge */
4014       SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
4015     }
4016 
4017     /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */
4018     /* Mean Previous state is same as current state */
4019     if ((Prev_State != I2C_STATE_MASTER_BUSY_RX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1))
4020     {
4021       /* Generate Start */
4022       SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
4023     }
4024 
4025     /* Process Unlocked */
4026     __HAL_UNLOCK(hi2c);
4027 
4028     /* Note : The I2C interrupts must be enabled after unlocking current process
4029     to avoid the risk of I2C interrupt handle execution before current
4030     process unlock */
4031 
4032     /* Enable interrupts */
4033     __HAL_I2C_ENABLE_IT(hi2c, enableIT);
4034 
4035     return HAL_OK;
4036   }
4037   else
4038   {
4039     return HAL_BUSY;
4040   }
4041 }
4042 
4043 /**
4044   * @brief  Sequential receive in master mode an amount of data in non-blocking mode with DMA
4045   * @note   This interface allow to manage repeated start condition when a direction change during transfer
4046   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
4047   *         the configuration information for the specified I2C.
4048   * @param  DevAddress Target device address: The device 7 bits address value
4049   *         in datasheet must be shifted to the left before calling the interface
4050   * @param  pData Pointer to data buffer
4051   * @param  Size Amount of data to be sent
4052   * @param  XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition
4053   * @retval HAL status
4054   */
HAL_I2C_Master_Seq_Receive_DMA(I2C_HandleTypeDef * hi2c,uint16_t DevAddress,uint8_t * pData,uint16_t Size,uint32_t XferOptions)4055 HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
4056 {
4057   __IO uint32_t Prev_State = 0x00U;
4058   __IO uint32_t count = 0U;
4059   uint32_t enableIT = (I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
4060   HAL_StatusTypeDef dmaxferstatus;
4061 
4062   /* Check the parameters */
4063   assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
4064 
4065   if (hi2c->State == HAL_I2C_STATE_READY)
4066   {
4067     /* Check Busy Flag only if FIRST call of Master interface */
4068     if ((READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP) || (XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME))
4069     {
4070       /* Wait until BUSY flag is reset */
4071       count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U);
4072       do
4073       {
4074         count--;
4075         if (count == 0U)
4076         {
4077           hi2c->PreviousState       = I2C_STATE_NONE;
4078           hi2c->State               = HAL_I2C_STATE_READY;
4079           hi2c->Mode                = HAL_I2C_MODE_NONE;
4080           hi2c->ErrorCode           |= HAL_I2C_ERROR_TIMEOUT;
4081 
4082           /* Process Unlocked */
4083           __HAL_UNLOCK(hi2c);
4084 
4085           return HAL_ERROR;
4086         }
4087       }
4088       while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
4089     }
4090 
4091     /* Process Locked */
4092     __HAL_LOCK(hi2c);
4093 
4094     /* Check if the I2C is already enabled */
4095     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
4096     {
4097       /* Enable I2C peripheral */
4098       __HAL_I2C_ENABLE(hi2c);
4099     }
4100 
4101     /* Disable Pos */
4102     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
4103 
4104     /* Clear Last DMA bit */
4105     CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_LAST);
4106 
4107     hi2c->State     = HAL_I2C_STATE_BUSY_RX;
4108     hi2c->Mode      = HAL_I2C_MODE_MASTER;
4109     hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
4110 
4111     /* Prepare transfer parameters */
4112     hi2c->pBuffPtr    = pData;
4113     hi2c->XferCount   = Size;
4114     hi2c->XferSize    = hi2c->XferCount;
4115     hi2c->XferOptions = XferOptions;
4116     hi2c->Devaddress  = DevAddress;
4117 
4118     Prev_State = hi2c->PreviousState;
4119 
4120     if (hi2c->XferSize > 0U)
4121     {
4122       if ((hi2c->XferCount == 2U) && ((XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP)))
4123       {
4124         if (Prev_State == I2C_STATE_MASTER_BUSY_RX)
4125         {
4126           /* Disable Acknowledge */
4127           CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
4128 
4129           /* Enable Pos */
4130           SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
4131 
4132           /* Enable Last DMA bit */
4133           SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST);
4134         }
4135         else
4136         {
4137           /* Enable Acknowledge */
4138           SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
4139         }
4140       }
4141       else
4142       {
4143         /* Enable Acknowledge */
4144         SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
4145 
4146         if ((XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_OTHER_AND_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP))
4147         {
4148           /* Enable Last DMA bit */
4149           SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST);
4150         }
4151       }
4152       if (hi2c->hdmarx != NULL)
4153       {
4154         /* Set the I2C DMA transfer complete callback */
4155         hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt;
4156 
4157         /* Set the DMA error callback */
4158         hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
4159 
4160         /* Set the unused DMA callbacks to NULL */
4161         hi2c->hdmarx->XferHalfCpltCallback = NULL;
4162         hi2c->hdmarx->XferAbortCallback = NULL;
4163 
4164         /* Enable the DMA channel */
4165         dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize);
4166       }
4167       else
4168       {
4169         /* Update I2C state */
4170         hi2c->State     = HAL_I2C_STATE_READY;
4171         hi2c->Mode      = HAL_I2C_MODE_NONE;
4172 
4173         /* Update I2C error code */
4174         hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
4175 
4176         /* Process Unlocked */
4177         __HAL_UNLOCK(hi2c);
4178 
4179         return HAL_ERROR;
4180       }
4181       if (dmaxferstatus == HAL_OK)
4182       {
4183         /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */
4184         /* Mean Previous state is same as current state */
4185         if ((Prev_State != I2C_STATE_MASTER_BUSY_RX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1))
4186         {
4187           /* Generate Start */
4188           SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
4189 
4190           /* Update interrupt for only EVT and ERR */
4191           enableIT = (I2C_IT_EVT | I2C_IT_ERR);
4192         }
4193         else
4194         {
4195           /* Update interrupt for only ERR */
4196           enableIT = I2C_IT_ERR;
4197         }
4198 
4199         /* Process Unlocked */
4200         __HAL_UNLOCK(hi2c);
4201 
4202         /* Note : The I2C interrupts must be enabled after unlocking current process
4203         to avoid the risk of I2C interrupt handle execution before current
4204         process unlock */
4205 
4206         /* If XferOptions is not associated to a new frame, mean no start bit is request, enable directly the DMA request */
4207         /* In other cases, DMA request is enabled after Slave address treatment in IRQHandler */
4208         if ((XferOptions == I2C_NEXT_FRAME) || (XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP))
4209         {
4210           /* Enable DMA Request */
4211           SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
4212         }
4213 
4214         /* Enable EVT and ERR interrupt */
4215         __HAL_I2C_ENABLE_IT(hi2c, enableIT);
4216       }
4217       else
4218       {
4219         /* Update I2C state */
4220         hi2c->State     = HAL_I2C_STATE_READY;
4221         hi2c->Mode      = HAL_I2C_MODE_NONE;
4222 
4223         /* Update I2C error code */
4224         hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
4225 
4226         /* Process Unlocked */
4227         __HAL_UNLOCK(hi2c);
4228 
4229         return HAL_ERROR;
4230       }
4231     }
4232     else
4233     {
4234       /* Enable Acknowledge */
4235       SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
4236 
4237       /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */
4238       /* Mean Previous state is same as current state */
4239       if ((Prev_State != I2C_STATE_MASTER_BUSY_RX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1))
4240       {
4241         /* Generate Start */
4242         SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
4243       }
4244 
4245       /* Process Unlocked */
4246       __HAL_UNLOCK(hi2c);
4247 
4248       /* Note : The I2C interrupts must be enabled after unlocking current process
4249       to avoid the risk of I2C interrupt handle execution before current
4250       process unlock */
4251 
4252       /* Enable interrupts */
4253       __HAL_I2C_ENABLE_IT(hi2c, enableIT);
4254     }
4255     return HAL_OK;
4256   }
4257   else
4258   {
4259     return HAL_BUSY;
4260   }
4261 }
4262 
4263 /**
4264   * @brief  Sequential transmit in slave mode an amount of data in non-blocking mode with Interrupt
4265   * @note   This interface allow to manage repeated start condition when a direction change during transfer
4266   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
4267   *         the configuration information for the specified I2C.
4268   * @param  pData Pointer to data buffer
4269   * @param  Size Amount of data to be sent
4270   * @param  XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition
4271   * @retval HAL status
4272   */
HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef * hi2c,uint8_t * pData,uint16_t Size,uint32_t XferOptions)4273 HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
4274 {
4275   /* Check the parameters */
4276   assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
4277 
4278   if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN)
4279   {
4280     if ((pData == NULL) || (Size == 0U))
4281     {
4282       return  HAL_ERROR;
4283     }
4284 
4285     /* Process Locked */
4286     __HAL_LOCK(hi2c);
4287 
4288     /* Check if the I2C is already enabled */
4289     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
4290     {
4291       /* Enable I2C peripheral */
4292       __HAL_I2C_ENABLE(hi2c);
4293     }
4294 
4295     /* Disable Pos */
4296     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
4297 
4298     hi2c->State     = HAL_I2C_STATE_BUSY_TX_LISTEN;
4299     hi2c->Mode      = HAL_I2C_MODE_SLAVE;
4300     hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
4301 
4302     /* Prepare transfer parameters */
4303     hi2c->pBuffPtr    = pData;
4304     hi2c->XferCount   = Size;
4305     hi2c->XferSize    = hi2c->XferCount;
4306     hi2c->XferOptions = XferOptions;
4307 
4308     /* Clear ADDR flag */
4309     __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
4310 
4311     /* Process Unlocked */
4312     __HAL_UNLOCK(hi2c);
4313 
4314     /* Note : The I2C interrupts must be enabled after unlocking current process
4315               to avoid the risk of I2C interrupt handle execution before current
4316               process unlock */
4317 
4318     /* Enable EVT, BUF and ERR interrupt */
4319     __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
4320 
4321     return HAL_OK;
4322   }
4323   else
4324   {
4325     return HAL_BUSY;
4326   }
4327 }
4328 
4329 /**
4330   * @brief  Sequential transmit in slave mode an amount of data in non-blocking mode with DMA
4331   * @note   This interface allow to manage repeated start condition when a direction change during transfer
4332   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
4333   *         the configuration information for the specified I2C.
4334   * @param  pData Pointer to data buffer
4335   * @param  Size Amount of data to be sent
4336   * @param  XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition
4337   * @retval HAL status
4338   */
HAL_I2C_Slave_Seq_Transmit_DMA(I2C_HandleTypeDef * hi2c,uint8_t * pData,uint16_t Size,uint32_t XferOptions)4339 HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
4340 {
4341   HAL_StatusTypeDef dmaxferstatus;
4342 
4343   /* Check the parameters */
4344   assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
4345 
4346   if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN)
4347   {
4348     if ((pData == NULL) || (Size == 0U))
4349     {
4350       return  HAL_ERROR;
4351     }
4352 
4353     /* Process Locked */
4354     __HAL_LOCK(hi2c);
4355 
4356     /* Disable Interrupts, to prevent preemption during treatment in case of multicall */
4357     __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
4358 
4359     /* I2C cannot manage full duplex exchange so disable previous IT enabled if any */
4360     /* and then toggle the HAL slave RX state to TX state */
4361     if (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN)
4362     {
4363       if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN)
4364       {
4365         /* Abort DMA Xfer if any */
4366         if (hi2c->hdmarx != NULL)
4367         {
4368           CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
4369 
4370           /* Set the I2C DMA Abort callback :
4371            will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */
4372           hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort;
4373 
4374           /* Abort DMA RX */
4375           if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK)
4376           {
4377             /* Call Directly XferAbortCallback function in case of error */
4378             hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx);
4379           }
4380         }
4381       }
4382     }
4383     else if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN)
4384     {
4385       if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN)
4386       {
4387         CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
4388 
4389         /* Abort DMA Xfer if any */
4390         if (hi2c->hdmatx != NULL)
4391         {
4392           /* Set the I2C DMA Abort callback :
4393            will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */
4394           hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort;
4395 
4396           /* Abort DMA TX */
4397           if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK)
4398           {
4399             /* Call Directly XferAbortCallback function in case of error */
4400             hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx);
4401           }
4402         }
4403       }
4404     }
4405     else
4406     {
4407       /* Nothing to do */
4408     }
4409 
4410     /* Check if the I2C is already enabled */
4411     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
4412     {
4413       /* Enable I2C peripheral */
4414       __HAL_I2C_ENABLE(hi2c);
4415     }
4416 
4417     /* Disable Pos */
4418     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
4419 
4420     hi2c->State     = HAL_I2C_STATE_BUSY_TX_LISTEN;
4421     hi2c->Mode      = HAL_I2C_MODE_SLAVE;
4422     hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
4423 
4424     /* Prepare transfer parameters */
4425     hi2c->pBuffPtr    = pData;
4426     hi2c->XferCount   = Size;
4427     hi2c->XferSize    = hi2c->XferCount;
4428     hi2c->XferOptions = XferOptions;
4429 
4430     if (hi2c->hdmatx != NULL)
4431     {
4432       /* Set the I2C DMA transfer complete callback */
4433       hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt;
4434 
4435       /* Set the DMA error callback */
4436       hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
4437 
4438       /* Set the unused DMA callbacks to NULL */
4439       hi2c->hdmatx->XferHalfCpltCallback = NULL;
4440       hi2c->hdmatx->XferAbortCallback = NULL;
4441 
4442       /* Enable the DMA channel */
4443       dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize);
4444     }
4445     else
4446     {
4447       /* Update I2C state */
4448       hi2c->State     = HAL_I2C_STATE_LISTEN;
4449       hi2c->Mode      = HAL_I2C_MODE_NONE;
4450 
4451       /* Update I2C error code */
4452       hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
4453 
4454       /* Process Unlocked */
4455       __HAL_UNLOCK(hi2c);
4456 
4457       return HAL_ERROR;
4458     }
4459 
4460     if (dmaxferstatus == HAL_OK)
4461     {
4462       /* Enable Address Acknowledge */
4463       SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
4464 
4465       /* Clear ADDR flag */
4466       __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
4467 
4468       /* Process Unlocked */
4469       __HAL_UNLOCK(hi2c);
4470 
4471       /* Note : The I2C interrupts must be enabled after unlocking current process
4472       to avoid the risk of I2C interrupt handle execution before current
4473       process unlock */
4474       /* Enable EVT and ERR interrupt */
4475       __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
4476 
4477       /* Enable DMA Request */
4478       hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
4479 
4480       return HAL_OK;
4481     }
4482     else
4483     {
4484       /* Update I2C state */
4485       hi2c->State     = HAL_I2C_STATE_READY;
4486       hi2c->Mode      = HAL_I2C_MODE_NONE;
4487 
4488       /* Update I2C error code */
4489       hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
4490 
4491       /* Process Unlocked */
4492       __HAL_UNLOCK(hi2c);
4493 
4494       return HAL_ERROR;
4495     }
4496   }
4497   else
4498   {
4499     return HAL_BUSY;
4500   }
4501 }
4502 
4503 /**
4504   * @brief  Sequential receive in slave mode an amount of data in non-blocking mode with Interrupt
4505   * @note   This interface allow to manage repeated start condition when a direction change during transfer
4506   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
4507   *         the configuration information for the specified I2C.
4508   * @param  pData Pointer to data buffer
4509   * @param  Size Amount of data to be sent
4510   * @param  XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition
4511   * @retval HAL status
4512   */
HAL_I2C_Slave_Seq_Receive_IT(I2C_HandleTypeDef * hi2c,uint8_t * pData,uint16_t Size,uint32_t XferOptions)4513 HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
4514 {
4515   /* Check the parameters */
4516   assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
4517 
4518   if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN)
4519   {
4520     if ((pData == NULL) || (Size == 0U))
4521     {
4522       return  HAL_ERROR;
4523     }
4524 
4525     /* Process Locked */
4526     __HAL_LOCK(hi2c);
4527 
4528     /* Check if the I2C is already enabled */
4529     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
4530     {
4531       /* Enable I2C peripheral */
4532       __HAL_I2C_ENABLE(hi2c);
4533     }
4534 
4535     /* Disable Pos */
4536     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
4537 
4538     hi2c->State     = HAL_I2C_STATE_BUSY_RX_LISTEN;
4539     hi2c->Mode      = HAL_I2C_MODE_SLAVE;
4540     hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
4541 
4542     /* Prepare transfer parameters */
4543     hi2c->pBuffPtr    = pData;
4544     hi2c->XferCount   = Size;
4545     hi2c->XferSize    = hi2c->XferCount;
4546     hi2c->XferOptions = XferOptions;
4547 
4548     /* Clear ADDR flag */
4549     __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
4550 
4551     /* Process Unlocked */
4552     __HAL_UNLOCK(hi2c);
4553 
4554     /* Note : The I2C interrupts must be enabled after unlocking current process
4555               to avoid the risk of I2C interrupt handle execution before current
4556               process unlock */
4557 
4558     /* Enable EVT, BUF and ERR interrupt */
4559     __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
4560 
4561     return HAL_OK;
4562   }
4563   else
4564   {
4565     return HAL_BUSY;
4566   }
4567 }
4568 
4569 /**
4570   * @brief  Sequential receive in slave mode an amount of data in non-blocking mode with DMA
4571   * @note   This interface allow to manage repeated start condition when a direction change during transfer
4572   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
4573   *         the configuration information for the specified I2C.
4574   * @param  pData Pointer to data buffer
4575   * @param  Size Amount of data to be sent
4576   * @param  XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition
4577   * @retval HAL status
4578   */
HAL_I2C_Slave_Seq_Receive_DMA(I2C_HandleTypeDef * hi2c,uint8_t * pData,uint16_t Size,uint32_t XferOptions)4579 HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
4580 {
4581   HAL_StatusTypeDef dmaxferstatus;
4582 
4583   /* Check the parameters */
4584   assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
4585 
4586   if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN)
4587   {
4588     if ((pData == NULL) || (Size == 0U))
4589     {
4590       return  HAL_ERROR;
4591     }
4592 
4593     /* Process Locked */
4594     __HAL_LOCK(hi2c);
4595 
4596     /* Disable Interrupts, to prevent preemption during treatment in case of multicall */
4597     __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
4598 
4599     /* I2C cannot manage full duplex exchange so disable previous IT enabled if any */
4600     /* and then toggle the HAL slave RX state to TX state */
4601     if (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN)
4602     {
4603       if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN)
4604       {
4605         /* Abort DMA Xfer if any */
4606         if (hi2c->hdmarx != NULL)
4607         {
4608           CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
4609 
4610           /* Set the I2C DMA Abort callback :
4611            will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */
4612           hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort;
4613 
4614           /* Abort DMA RX */
4615           if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK)
4616           {
4617             /* Call Directly XferAbortCallback function in case of error */
4618             hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx);
4619           }
4620         }
4621       }
4622     }
4623     else if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN)
4624     {
4625       if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN)
4626       {
4627         CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
4628 
4629         /* Abort DMA Xfer if any */
4630         if (hi2c->hdmatx != NULL)
4631         {
4632           /* Set the I2C DMA Abort callback :
4633            will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */
4634           hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort;
4635 
4636           /* Abort DMA TX */
4637           if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK)
4638           {
4639             /* Call Directly XferAbortCallback function in case of error */
4640             hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx);
4641           }
4642         }
4643       }
4644     }
4645     else
4646     {
4647       /* Nothing to do */
4648     }
4649 
4650     /* Check if the I2C is already enabled */
4651     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
4652     {
4653       /* Enable I2C peripheral */
4654       __HAL_I2C_ENABLE(hi2c);
4655     }
4656 
4657     /* Disable Pos */
4658     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
4659 
4660     hi2c->State     = HAL_I2C_STATE_BUSY_RX_LISTEN;
4661     hi2c->Mode      = HAL_I2C_MODE_SLAVE;
4662     hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
4663 
4664     /* Prepare transfer parameters */
4665     hi2c->pBuffPtr    = pData;
4666     hi2c->XferCount   = Size;
4667     hi2c->XferSize    = hi2c->XferCount;
4668     hi2c->XferOptions = XferOptions;
4669 
4670     if (hi2c->hdmarx != NULL)
4671     {
4672       /* Set the I2C DMA transfer complete callback */
4673       hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt;
4674 
4675       /* Set the DMA error callback */
4676       hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
4677 
4678       /* Set the unused DMA callbacks to NULL */
4679       hi2c->hdmarx->XferHalfCpltCallback = NULL;
4680       hi2c->hdmarx->XferAbortCallback = NULL;
4681 
4682       /* Enable the DMA channel */
4683       dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize);
4684     }
4685     else
4686     {
4687       /* Update I2C state */
4688       hi2c->State     = HAL_I2C_STATE_LISTEN;
4689       hi2c->Mode      = HAL_I2C_MODE_NONE;
4690 
4691       /* Update I2C error code */
4692       hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
4693 
4694       /* Process Unlocked */
4695       __HAL_UNLOCK(hi2c);
4696 
4697       return HAL_ERROR;
4698     }
4699 
4700     if (dmaxferstatus == HAL_OK)
4701     {
4702       /* Enable Address Acknowledge */
4703       SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
4704 
4705       /* Clear ADDR flag */
4706       __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
4707 
4708       /* Process Unlocked */
4709       __HAL_UNLOCK(hi2c);
4710 
4711       /* Enable DMA Request */
4712       SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
4713 
4714       /* Note : The I2C interrupts must be enabled after unlocking current process
4715       to avoid the risk of I2C interrupt handle execution before current
4716       process unlock */
4717       /* Enable EVT and ERR interrupt */
4718       __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
4719 
4720       return HAL_OK;
4721     }
4722     else
4723     {
4724       /* Update I2C state */
4725       hi2c->State     = HAL_I2C_STATE_READY;
4726       hi2c->Mode      = HAL_I2C_MODE_NONE;
4727 
4728       /* Update I2C error code */
4729       hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
4730 
4731       /* Process Unlocked */
4732       __HAL_UNLOCK(hi2c);
4733 
4734       return HAL_ERROR;
4735     }
4736   }
4737   else
4738   {
4739     return HAL_BUSY;
4740   }
4741 }
4742 
4743 /**
4744   * @brief  Enable the Address listen mode with Interrupt.
4745   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
4746   *                the configuration information for the specified I2C.
4747   * @retval HAL status
4748   */
HAL_I2C_EnableListen_IT(I2C_HandleTypeDef * hi2c)4749 HAL_StatusTypeDef HAL_I2C_EnableListen_IT(I2C_HandleTypeDef *hi2c)
4750 {
4751   if (hi2c->State == HAL_I2C_STATE_READY)
4752   {
4753     hi2c->State = HAL_I2C_STATE_LISTEN;
4754 
4755     /* Check if the I2C is already enabled */
4756     if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
4757     {
4758       /* Enable I2C peripheral */
4759       __HAL_I2C_ENABLE(hi2c);
4760     }
4761 
4762     /* Enable Address Acknowledge */
4763     SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
4764 
4765     /* Enable EVT and ERR interrupt */
4766     __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
4767 
4768     return HAL_OK;
4769   }
4770   else
4771   {
4772     return HAL_BUSY;
4773   }
4774 }
4775 
4776 /**
4777   * @brief  Disable the Address listen mode with Interrupt.
4778   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
4779   *                the configuration information for the specified I2C.
4780   * @retval HAL status
4781   */
HAL_I2C_DisableListen_IT(I2C_HandleTypeDef * hi2c)4782 HAL_StatusTypeDef HAL_I2C_DisableListen_IT(I2C_HandleTypeDef *hi2c)
4783 {
4784   /* Declaration of tmp to prevent undefined behavior of volatile usage */
4785   uint32_t tmp;
4786 
4787   /* Disable Address listen mode only if a transfer is not ongoing */
4788   if (hi2c->State == HAL_I2C_STATE_LISTEN)
4789   {
4790     tmp = (uint32_t)(hi2c->State) & I2C_STATE_MSK;
4791     hi2c->PreviousState = tmp | (uint32_t)(hi2c->Mode);
4792     hi2c->State = HAL_I2C_STATE_READY;
4793     hi2c->Mode = HAL_I2C_MODE_NONE;
4794 
4795     /* Disable Address Acknowledge */
4796     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
4797 
4798     /* Disable EVT and ERR interrupt */
4799     __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
4800 
4801     return HAL_OK;
4802   }
4803   else
4804   {
4805     return HAL_BUSY;
4806   }
4807 }
4808 
4809 /**
4810   * @brief  Abort a master I2C IT or DMA process communication with Interrupt.
4811   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
4812   *         the configuration information for the specified I2C.
4813   * @param  DevAddress Target device address: The device 7 bits address value
4814   *         in datasheet must be shifted to the left before calling the interface
4815   * @retval HAL status
4816   */
HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef * hi2c,uint16_t DevAddress)4817 HAL_StatusTypeDef HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress)
4818 {
4819   /* Declaration of temporary variables to prevent undefined behavior of volatile usage */
4820   HAL_I2C_ModeTypeDef CurrentMode   = hi2c->Mode;
4821 
4822   /* Prevent unused argument(s) compilation warning */
4823   UNUSED(DevAddress);
4824 
4825   /* Abort Master transfer during Receive or Transmit process    */
4826   if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET) && (CurrentMode == HAL_I2C_MODE_MASTER))
4827   {
4828     /* Process Locked */
4829     __HAL_LOCK(hi2c);
4830 
4831     hi2c->PreviousState = I2C_STATE_NONE;
4832     hi2c->State = HAL_I2C_STATE_ABORT;
4833 
4834     /* Disable Acknowledge */
4835     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
4836 
4837     /* Generate Stop */
4838     SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
4839 
4840     hi2c->XferCount = 0U;
4841 
4842     /* Disable EVT, BUF and ERR interrupt */
4843     __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
4844 
4845     /* Process Unlocked */
4846     __HAL_UNLOCK(hi2c);
4847 
4848     /* Call the corresponding callback to inform upper layer of End of Transfer */
4849     I2C_ITError(hi2c);
4850 
4851     return HAL_OK;
4852   }
4853   else
4854   {
4855     /* Wrong usage of abort function */
4856     /* This function should be used only in case of abort monitored by master device */
4857     /* Or periphal is not in busy state, mean there is no active sequence to be abort */
4858     return HAL_ERROR;
4859   }
4860 }
4861 
4862 /**
4863   * @}
4864   */
4865 
4866 /** @defgroup I2C_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks
4867  * @{
4868  */
4869 
4870 /**
4871   * @brief  This function handles I2C event interrupt request.
4872   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
4873   *                the configuration information for the specified I2C.
4874   * @retval None
4875   */
HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef * hi2c)4876 void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c)
4877 {
4878   uint32_t sr1itflags;
4879   uint32_t sr2itflags               = 0U;
4880   uint32_t itsources                = READ_REG(hi2c->Instance->CR2);
4881   uint32_t CurrentXferOptions       = hi2c->XferOptions;
4882   HAL_I2C_ModeTypeDef CurrentMode   = hi2c->Mode;
4883   HAL_I2C_StateTypeDef CurrentState = hi2c->State;
4884 
4885   /* Master or Memory mode selected */
4886   if ((CurrentMode == HAL_I2C_MODE_MASTER) || (CurrentMode == HAL_I2C_MODE_MEM))
4887   {
4888     sr2itflags   = READ_REG(hi2c->Instance->SR2);
4889     sr1itflags   = READ_REG(hi2c->Instance->SR1);
4890 
4891     /* Exit IRQ event until Start Bit detected in case of Other frame requested */
4892     if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_SB) == RESET) && (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(CurrentXferOptions) == 1U))
4893     {
4894       return;
4895     }
4896 
4897     /* SB Set ----------------------------------------------------------------*/
4898     if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_SB) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET))
4899     {
4900       /* Convert OTHER_xxx XferOptions if any */
4901       I2C_ConvertOtherXferOptions(hi2c);
4902 
4903       I2C_Master_SB(hi2c);
4904     }
4905     /* ADD10 Set -------------------------------------------------------------*/
4906     else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_ADD10) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET))
4907     {
4908       I2C_Master_ADD10(hi2c);
4909     }
4910     /* ADDR Set --------------------------------------------------------------*/
4911     else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_ADDR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET))
4912     {
4913       I2C_Master_ADDR(hi2c);
4914     }
4915     /* I2C in mode Transmitter -----------------------------------------------*/
4916     else if (I2C_CHECK_FLAG(sr2itflags, I2C_FLAG_TRA) != RESET)
4917     {
4918       /* Do not check buffer and BTF flag if a Xfer DMA is on going */
4919       if (READ_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN) != I2C_CR2_DMAEN)
4920       {
4921         /* TXE set and BTF reset -----------------------------------------------*/
4922         if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_TXE) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_BUF) != RESET) && (I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) == RESET))
4923         {
4924           I2C_MasterTransmit_TXE(hi2c);
4925         }
4926         /* BTF set -------------------------------------------------------------*/
4927         else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET))
4928         {
4929           if (CurrentState == HAL_I2C_STATE_BUSY_TX)
4930           {
4931             I2C_MasterTransmit_BTF(hi2c);
4932           }
4933           else /* HAL_I2C_MODE_MEM */
4934           {
4935             if (CurrentMode == HAL_I2C_MODE_MEM)
4936             {
4937               I2C_MemoryTransmit_TXE_BTF(hi2c);
4938             }
4939           }
4940         }
4941         else
4942         {
4943           /* Do nothing */
4944         }
4945       }
4946     }
4947     /* I2C in mode Receiver --------------------------------------------------*/
4948     else
4949     {
4950       /* Do not check buffer and BTF flag if a Xfer DMA is on going */
4951       if (READ_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN) != I2C_CR2_DMAEN)
4952       {
4953         /* RXNE set and BTF reset -----------------------------------------------*/
4954         if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_RXNE) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_BUF) != RESET) && (I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) == RESET))
4955         {
4956           I2C_MasterReceive_RXNE(hi2c);
4957         }
4958         /* BTF set -------------------------------------------------------------*/
4959         else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET))
4960         {
4961           I2C_MasterReceive_BTF(hi2c);
4962         }
4963         else
4964         {
4965           /* Do nothing */
4966         }
4967       }
4968     }
4969   }
4970   /* Slave mode selected */
4971   else
4972   {
4973     /* If an error is detected, read only SR1 register to prevent */
4974     /* a clear of ADDR flags by reading SR2 after reading SR1 in Error treatment */
4975     if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
4976     {
4977       sr1itflags   = READ_REG(hi2c->Instance->SR1);
4978     }
4979     else
4980     {
4981       sr2itflags   = READ_REG(hi2c->Instance->SR2);
4982       sr1itflags   = READ_REG(hi2c->Instance->SR1);
4983     }
4984 
4985     /* ADDR set --------------------------------------------------------------*/
4986     if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_ADDR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET))
4987     {
4988       /* Now time to read SR2, this will clear ADDR flag automatically */
4989       if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
4990       {
4991         sr2itflags   = READ_REG(hi2c->Instance->SR2);
4992       }
4993       I2C_Slave_ADDR(hi2c, sr2itflags);
4994     }
4995     /* STOPF set --------------------------------------------------------------*/
4996     else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET))
4997     {
4998       I2C_Slave_STOPF(hi2c);
4999     }
5000     /* I2C in mode Transmitter -----------------------------------------------*/
5001     else if ((CurrentState == HAL_I2C_STATE_BUSY_TX) || (CurrentState == HAL_I2C_STATE_BUSY_TX_LISTEN))
5002     {
5003       /* TXE set and BTF reset -----------------------------------------------*/
5004       if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_TXE) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_BUF) != RESET) && (I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) == RESET))
5005       {
5006         I2C_SlaveTransmit_TXE(hi2c);
5007       }
5008       /* BTF set -------------------------------------------------------------*/
5009       else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET))
5010       {
5011         I2C_SlaveTransmit_BTF(hi2c);
5012       }
5013       else
5014       {
5015         /* Do nothing */
5016       }
5017     }
5018     /* I2C in mode Receiver --------------------------------------------------*/
5019     else
5020     {
5021       /* RXNE set and BTF reset ----------------------------------------------*/
5022       if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_RXNE) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_BUF) != RESET) && (I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) == RESET))
5023       {
5024         I2C_SlaveReceive_RXNE(hi2c);
5025       }
5026       /* BTF set -------------------------------------------------------------*/
5027       else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET))
5028       {
5029         I2C_SlaveReceive_BTF(hi2c);
5030       }
5031       else
5032       {
5033         /* Do nothing */
5034       }
5035     }
5036   }
5037 }
5038 
5039 /**
5040   * @brief  This function handles I2C error interrupt request.
5041   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
5042   *                the configuration information for the specified I2C.
5043   * @retval None
5044   */
HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef * hi2c)5045 void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c)
5046 {
5047   HAL_I2C_ModeTypeDef tmp1;
5048   uint32_t tmp2;
5049   HAL_I2C_StateTypeDef tmp3;
5050   uint32_t tmp4;
5051   uint32_t sr1itflags = READ_REG(hi2c->Instance->SR1);
5052   uint32_t itsources  = READ_REG(hi2c->Instance->CR2);
5053   uint32_t error      = HAL_I2C_ERROR_NONE;
5054   HAL_I2C_ModeTypeDef CurrentMode   = hi2c->Mode;
5055 
5056   /* I2C Bus error interrupt occurred ----------------------------------------*/
5057   if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BERR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERR) != RESET))
5058   {
5059     error |= HAL_I2C_ERROR_BERR;
5060 
5061     /* Clear BERR flag */
5062     __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_BERR);
5063 
5064     /* Workaround: Start cannot be generated after a misplaced Stop */
5065     SET_BIT(hi2c->Instance->CR1, I2C_CR1_SWRST);
5066   }
5067 
5068   /* I2C Arbitration Lost error interrupt occurred ---------------------------*/
5069   if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_ARLO) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERR) != RESET))
5070   {
5071     error |= HAL_I2C_ERROR_ARLO;
5072 
5073     /* Clear ARLO flag */
5074     __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ARLO);
5075   }
5076 
5077   /* I2C Acknowledge failure error interrupt occurred ------------------------*/
5078   if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_AF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERR) != RESET))
5079   {
5080     tmp1 = CurrentMode;
5081     tmp2 = hi2c->XferCount;
5082     tmp3 = hi2c->State;
5083     tmp4 = hi2c->PreviousState;
5084     if ((tmp1 == HAL_I2C_MODE_SLAVE) && (tmp2 == 0U) && \
5085         ((tmp3 == HAL_I2C_STATE_BUSY_TX) || (tmp3 == HAL_I2C_STATE_BUSY_TX_LISTEN) || \
5086          ((tmp3 == HAL_I2C_STATE_LISTEN) && (tmp4 == I2C_STATE_SLAVE_BUSY_TX))))
5087     {
5088       I2C_Slave_AF(hi2c);
5089     }
5090     else
5091     {
5092       /* Clear AF flag */
5093       __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
5094 
5095       error |= HAL_I2C_ERROR_AF;
5096 
5097       /* Do not generate a STOP in case of Slave receive non acknowledge during transfer (mean not at the end of transfer) */
5098       if ((CurrentMode == HAL_I2C_MODE_MASTER) || (CurrentMode == HAL_I2C_MODE_MEM))
5099       {
5100         /* Generate Stop */
5101         SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
5102       }
5103     }
5104   }
5105 
5106   /* I2C Over-Run/Under-Run interrupt occurred -------------------------------*/
5107   if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_OVR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERR) != RESET))
5108   {
5109     error |= HAL_I2C_ERROR_OVR;
5110     /* Clear OVR flag */
5111     __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_OVR);
5112   }
5113 
5114   /* Call the Error Callback in case of Error detected -----------------------*/
5115   if (error != HAL_I2C_ERROR_NONE)
5116   {
5117     hi2c->ErrorCode |= error;
5118     I2C_ITError(hi2c);
5119   }
5120 }
5121 
5122 /**
5123   * @brief  Master Tx Transfer completed callback.
5124   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
5125   *                the configuration information for the specified I2C.
5126   * @retval None
5127   */
HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef * hi2c)5128 __weak void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c)
5129 {
5130   /* Prevent unused argument(s) compilation warning */
5131   UNUSED(hi2c);
5132 
5133   /* NOTE : This function should not be modified, when the callback is needed,
5134             the HAL_I2C_MasterTxCpltCallback could be implemented in the user file
5135    */
5136 }
5137 
5138 /**
5139   * @brief  Master Rx Transfer completed callback.
5140   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
5141   *                the configuration information for the specified I2C.
5142   * @retval None
5143   */
HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef * hi2c)5144 __weak void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)
5145 {
5146   /* Prevent unused argument(s) compilation warning */
5147   UNUSED(hi2c);
5148 
5149   /* NOTE : This function should not be modified, when the callback is needed,
5150             the HAL_I2C_MasterRxCpltCallback could be implemented in the user file
5151    */
5152 }
5153 
5154 /** @brief  Slave Tx Transfer completed callback.
5155   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
5156   *                the configuration information for the specified I2C.
5157   * @retval None
5158   */
HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef * hi2c)5159 __weak void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c)
5160 {
5161   /* Prevent unused argument(s) compilation warning */
5162   UNUSED(hi2c);
5163 
5164   /* NOTE : This function should not be modified, when the callback is needed,
5165             the HAL_I2C_SlaveTxCpltCallback could be implemented in the user file
5166    */
5167 }
5168 
5169 /**
5170   * @brief  Slave Rx Transfer completed callback.
5171   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
5172   *                the configuration information for the specified I2C.
5173   * @retval None
5174   */
HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef * hi2c)5175 __weak void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c)
5176 {
5177   /* Prevent unused argument(s) compilation warning */
5178   UNUSED(hi2c);
5179 
5180   /* NOTE : This function should not be modified, when the callback is needed,
5181             the HAL_I2C_SlaveRxCpltCallback could be implemented in the user file
5182    */
5183 }
5184 
5185 /**
5186   * @brief  Slave Address Match callback.
5187   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
5188   *                the configuration information for the specified I2C.
5189   * @param  TransferDirection Master request Transfer Direction (Write/Read), value of @ref I2C_XferDirection_definition
5190   * @param  AddrMatchCode Address Match Code
5191   * @retval None
5192   */
HAL_I2C_AddrCallback(I2C_HandleTypeDef * hi2c,uint8_t TransferDirection,uint16_t AddrMatchCode)5193 __weak void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode)
5194 {
5195   /* Prevent unused argument(s) compilation warning */
5196   UNUSED(hi2c);
5197   UNUSED(TransferDirection);
5198   UNUSED(AddrMatchCode);
5199 
5200   /* NOTE : This function should not be modified, when the callback is needed,
5201             the HAL_I2C_AddrCallback() could be implemented in the user file
5202    */
5203 }
5204 
5205 /**
5206   * @brief  Listen Complete callback.
5207   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
5208   *                the configuration information for the specified I2C.
5209   * @retval None
5210   */
HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef * hi2c)5211 __weak void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c)
5212 {
5213   /* Prevent unused argument(s) compilation warning */
5214   UNUSED(hi2c);
5215 
5216   /* NOTE : This function should not be modified, when the callback is needed,
5217             the HAL_I2C_ListenCpltCallback() could be implemented in the user file
5218   */
5219 }
5220 
5221 /**
5222   * @brief  Memory Tx Transfer completed callback.
5223   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
5224   *                the configuration information for the specified I2C.
5225   * @retval None
5226   */
HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef * hi2c)5227 __weak void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c)
5228 {
5229   /* Prevent unused argument(s) compilation warning */
5230   UNUSED(hi2c);
5231 
5232   /* NOTE : This function should not be modified, when the callback is needed,
5233             the HAL_I2C_MemTxCpltCallback could be implemented in the user file
5234    */
5235 }
5236 
5237 /**
5238   * @brief  Memory Rx Transfer completed callback.
5239   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
5240   *                the configuration information for the specified I2C.
5241   * @retval None
5242   */
HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef * hi2c)5243 __weak void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c)
5244 {
5245   /* Prevent unused argument(s) compilation warning */
5246   UNUSED(hi2c);
5247 
5248   /* NOTE : This function should not be modified, when the callback is needed,
5249             the HAL_I2C_MemRxCpltCallback could be implemented in the user file
5250    */
5251 }
5252 
5253 /**
5254   * @brief  I2C error callback.
5255   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
5256   *                the configuration information for the specified I2C.
5257   * @retval None
5258   */
HAL_I2C_ErrorCallback(I2C_HandleTypeDef * hi2c)5259 __weak void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c)
5260 {
5261   /* Prevent unused argument(s) compilation warning */
5262   UNUSED(hi2c);
5263 
5264   /* NOTE : This function should not be modified, when the callback is needed,
5265             the HAL_I2C_ErrorCallback could be implemented in the user file
5266    */
5267 }
5268 
5269 /**
5270   * @brief  I2C abort callback.
5271   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
5272   *                the configuration information for the specified I2C.
5273   * @retval None
5274   */
HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef * hi2c)5275 __weak void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c)
5276 {
5277   /* Prevent unused argument(s) compilation warning */
5278   UNUSED(hi2c);
5279 
5280   /* NOTE : This function should not be modified, when the callback is needed,
5281             the HAL_I2C_AbortCpltCallback could be implemented in the user file
5282    */
5283 }
5284 
5285 /**
5286   * @}
5287   */
5288 
5289 /** @defgroup I2C_Exported_Functions_Group3 Peripheral State, Mode and Error functions
5290  *  @brief   Peripheral State, Mode and Error functions
5291   *
5292 @verbatim
5293  ===============================================================================
5294             ##### Peripheral State, Mode and Error functions #####
5295  ===============================================================================
5296     [..]
5297     This subsection permit to get in run-time the status of the peripheral
5298     and the data flow.
5299 
5300 @endverbatim
5301   * @{
5302   */
5303 
5304 /**
5305   * @brief  Return the I2C handle state.
5306   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
5307   *                the configuration information for the specified I2C.
5308   * @retval HAL state
5309   */
HAL_I2C_GetState(I2C_HandleTypeDef * hi2c)5310 HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c)
5311 {
5312   /* Return I2C handle state */
5313   return hi2c->State;
5314 }
5315 
5316 /**
5317   * @brief  Returns the I2C Master, Slave, Memory or no mode.
5318   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
5319   *         the configuration information for I2C module
5320   * @retval HAL mode
5321   */
HAL_I2C_GetMode(I2C_HandleTypeDef * hi2c)5322 HAL_I2C_ModeTypeDef HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c)
5323 {
5324   return hi2c->Mode;
5325 }
5326 
5327 /**
5328   * @brief  Return the I2C error code.
5329   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
5330   *              the configuration information for the specified I2C.
5331   * @retval I2C Error Code
5332   */
HAL_I2C_GetError(I2C_HandleTypeDef * hi2c)5333 uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c)
5334 {
5335   return hi2c->ErrorCode;
5336 }
5337 
5338 /**
5339   * @}
5340   */
5341 
5342 /**
5343   * @}
5344   */
5345 
5346 /** @addtogroup I2C_Private_Functions
5347   * @{
5348   */
5349 
5350 /**
5351   * @brief  Handle TXE flag for Master
5352   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
5353   *         the configuration information for I2C module
5354   * @retval None
5355   */
I2C_MasterTransmit_TXE(I2C_HandleTypeDef * hi2c)5356 static void I2C_MasterTransmit_TXE(I2C_HandleTypeDef *hi2c)
5357 {
5358   /* Declaration of temporary variables to prevent undefined behavior of volatile usage */
5359   HAL_I2C_StateTypeDef CurrentState = hi2c->State;
5360   HAL_I2C_ModeTypeDef CurrentMode   = hi2c->Mode;
5361   uint32_t CurrentXferOptions       = hi2c->XferOptions;
5362 
5363   if ((hi2c->XferSize == 0U) && (CurrentState == HAL_I2C_STATE_BUSY_TX))
5364   {
5365     /* Call TxCpltCallback() directly if no stop mode is set */
5366     if ((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) && (CurrentXferOptions != I2C_NO_OPTION_FRAME))
5367     {
5368       __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
5369 
5370       hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX;
5371       hi2c->Mode = HAL_I2C_MODE_NONE;
5372       hi2c->State = HAL_I2C_STATE_READY;
5373 
5374 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
5375       hi2c->MasterTxCpltCallback(hi2c);
5376 #else
5377       HAL_I2C_MasterTxCpltCallback(hi2c);
5378 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
5379     }
5380     else /* Generate Stop condition then Call TxCpltCallback() */
5381     {
5382       /* Disable EVT, BUF and ERR interrupt */
5383       __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
5384 
5385       /* Generate Stop */
5386       SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
5387 
5388       hi2c->PreviousState = I2C_STATE_NONE;
5389       hi2c->State = HAL_I2C_STATE_READY;
5390 
5391       if (hi2c->Mode == HAL_I2C_MODE_MEM)
5392       {
5393         hi2c->Mode = HAL_I2C_MODE_NONE;
5394 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
5395         hi2c->MemTxCpltCallback(hi2c);
5396 #else
5397         HAL_I2C_MemTxCpltCallback(hi2c);
5398 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
5399       }
5400       else
5401       {
5402         hi2c->Mode = HAL_I2C_MODE_NONE;
5403 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
5404         hi2c->MasterTxCpltCallback(hi2c);
5405 #else
5406         HAL_I2C_MasterTxCpltCallback(hi2c);
5407 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
5408       }
5409     }
5410   }
5411   else if ((CurrentState == HAL_I2C_STATE_BUSY_TX) || \
5412            ((CurrentMode == HAL_I2C_MODE_MEM) && (CurrentState == HAL_I2C_STATE_BUSY_RX)))
5413   {
5414     if (hi2c->XferCount == 0U)
5415     {
5416       /* Disable BUF interrupt */
5417       __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
5418     }
5419     else
5420     {
5421       if (hi2c->Mode == HAL_I2C_MODE_MEM)
5422       {
5423         I2C_MemoryTransmit_TXE_BTF(hi2c);
5424       }
5425       else
5426       {
5427         /* Write data to DR */
5428         hi2c->Instance->DR = *hi2c->pBuffPtr;
5429 
5430         /* Increment Buffer pointer */
5431         hi2c->pBuffPtr++;
5432 
5433         /* Update counter */
5434         hi2c->XferCount--;
5435       }
5436     }
5437   }
5438   else
5439   {
5440     /* Do nothing */
5441   }
5442 }
5443 
5444 /**
5445   * @brief  Handle BTF flag for Master transmitter
5446   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
5447   *         the configuration information for I2C module
5448   * @retval None
5449   */
I2C_MasterTransmit_BTF(I2C_HandleTypeDef * hi2c)5450 static void I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c)
5451 {
5452   /* Declaration of temporary variables to prevent undefined behavior of volatile usage */
5453   uint32_t CurrentXferOptions = hi2c->XferOptions;
5454 
5455   if (hi2c->State == HAL_I2C_STATE_BUSY_TX)
5456   {
5457     if (hi2c->XferCount != 0U)
5458     {
5459       /* Write data to DR */
5460       hi2c->Instance->DR = *hi2c->pBuffPtr;
5461 
5462       /* Increment Buffer pointer */
5463       hi2c->pBuffPtr++;
5464 
5465       /* Update counter */
5466       hi2c->XferCount--;
5467     }
5468     else
5469     {
5470       /* Call TxCpltCallback() directly if no stop mode is set */
5471       if ((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) && (CurrentXferOptions != I2C_NO_OPTION_FRAME))
5472       {
5473         __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
5474 
5475         hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX;
5476         hi2c->Mode = HAL_I2C_MODE_NONE;
5477         hi2c->State = HAL_I2C_STATE_READY;
5478 
5479 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
5480         hi2c->MasterTxCpltCallback(hi2c);
5481 #else
5482         HAL_I2C_MasterTxCpltCallback(hi2c);
5483 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
5484       }
5485       else /* Generate Stop condition then Call TxCpltCallback() */
5486       {
5487         /* Disable EVT, BUF and ERR interrupt */
5488         __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
5489 
5490         /* Generate Stop */
5491         SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
5492 
5493         hi2c->PreviousState = I2C_STATE_NONE;
5494         hi2c->State = HAL_I2C_STATE_READY;
5495         if (hi2c->Mode == HAL_I2C_MODE_MEM)
5496         {
5497           hi2c->Mode = HAL_I2C_MODE_NONE;
5498 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
5499           hi2c->MemTxCpltCallback(hi2c);
5500 #else
5501           HAL_I2C_MemTxCpltCallback(hi2c);
5502 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
5503         }
5504         else
5505         {
5506           hi2c->Mode = HAL_I2C_MODE_NONE;
5507 
5508 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
5509           hi2c->MasterTxCpltCallback(hi2c);
5510 #else
5511           HAL_I2C_MasterTxCpltCallback(hi2c);
5512 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
5513         }
5514       }
5515     }
5516   }
5517   else
5518   {
5519     /* Do nothing */
5520   }
5521 }
5522 
5523 /**
5524   * @brief  Handle TXE and BTF flag for Memory transmitter
5525   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
5526   *         the configuration information for I2C module
5527   * @retval None
5528   */
I2C_MemoryTransmit_TXE_BTF(I2C_HandleTypeDef * hi2c)5529 static void I2C_MemoryTransmit_TXE_BTF(I2C_HandleTypeDef *hi2c)
5530 {
5531   /* Declaration of temporary variables to prevent undefined behavior of volatile usage */
5532   HAL_I2C_StateTypeDef CurrentState = hi2c->State;
5533 
5534   if (hi2c->EventCount == 0U)
5535   {
5536     /* If Memory address size is 8Bit */
5537     if (hi2c->MemaddSize == I2C_MEMADD_SIZE_8BIT)
5538     {
5539       /* Send Memory Address */
5540       hi2c->Instance->DR = I2C_MEM_ADD_LSB(hi2c->Memaddress);
5541 
5542       hi2c->EventCount += 2U;
5543     }
5544     /* If Memory address size is 16Bit */
5545     else
5546     {
5547       /* Send MSB of Memory Address */
5548       hi2c->Instance->DR = I2C_MEM_ADD_MSB(hi2c->Memaddress);
5549 
5550       hi2c->EventCount++;
5551     }
5552   }
5553   else if (hi2c->EventCount == 1U)
5554   {
5555     /* Send LSB of Memory Address */
5556     hi2c->Instance->DR = I2C_MEM_ADD_LSB(hi2c->Memaddress);
5557 
5558     hi2c->EventCount++;
5559   }
5560   else if (hi2c->EventCount == 2U)
5561   {
5562     if (CurrentState == HAL_I2C_STATE_BUSY_RX)
5563     {
5564       /* Generate Restart */
5565       hi2c->Instance->CR1 |= I2C_CR1_START;
5566 
5567       hi2c->EventCount++;
5568     }
5569     else if ((hi2c->XferCount > 0U) && (CurrentState == HAL_I2C_STATE_BUSY_TX))
5570     {
5571       /* Write data to DR */
5572       hi2c->Instance->DR = *hi2c->pBuffPtr;
5573 
5574       /* Increment Buffer pointer */
5575       hi2c->pBuffPtr++;
5576 
5577       /* Update counter */
5578       hi2c->XferCount--;
5579     }
5580     else if ((hi2c->XferCount == 0U) && (CurrentState == HAL_I2C_STATE_BUSY_TX))
5581     {
5582       /* Generate Stop condition then Call TxCpltCallback() */
5583       /* Disable EVT, BUF and ERR interrupt */
5584       __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
5585 
5586       /* Generate Stop */
5587       SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
5588 
5589       hi2c->PreviousState = I2C_STATE_NONE;
5590       hi2c->State = HAL_I2C_STATE_READY;
5591       hi2c->Mode = HAL_I2C_MODE_NONE;
5592 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
5593       hi2c->MemTxCpltCallback(hi2c);
5594 #else
5595       HAL_I2C_MemTxCpltCallback(hi2c);
5596 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
5597     }
5598     else
5599     {
5600       /* Do nothing */
5601     }
5602   }
5603   else
5604   {
5605     /* Do nothing */
5606   }
5607 }
5608 
5609 /**
5610   * @brief  Handle RXNE flag for Master
5611   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
5612   *         the configuration information for I2C module
5613   * @retval None
5614   */
I2C_MasterReceive_RXNE(I2C_HandleTypeDef * hi2c)5615 static void I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c)
5616 {
5617   if (hi2c->State == HAL_I2C_STATE_BUSY_RX)
5618   {
5619     uint32_t tmp;
5620 
5621     tmp = hi2c->XferCount;
5622     if (tmp > 3U)
5623     {
5624       /* Read data from DR */
5625       *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
5626 
5627       /* Increment Buffer pointer */
5628       hi2c->pBuffPtr++;
5629 
5630       /* Update counter */
5631       hi2c->XferCount--;
5632 
5633       if (hi2c->XferCount == (uint16_t)3)
5634       {
5635         /* Disable BUF interrupt, this help to treat correctly the last 4 bytes
5636         on BTF subroutine */
5637         /* Disable BUF interrupt */
5638         __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
5639       }
5640     }
5641     else if ((hi2c->XferOptions != I2C_FIRST_AND_NEXT_FRAME) && ((tmp == 1U) || (tmp == 0U)))
5642     {
5643       if (I2C_WaitOnSTOPRequestThroughIT(hi2c) == HAL_OK)
5644       {
5645         /* Disable Acknowledge */
5646         CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
5647 
5648         /* Disable EVT, BUF and ERR interrupt */
5649         __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
5650 
5651         /* Read data from DR */
5652         *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
5653 
5654         /* Increment Buffer pointer */
5655         hi2c->pBuffPtr++;
5656 
5657         /* Update counter */
5658         hi2c->XferCount--;
5659 
5660         hi2c->State = HAL_I2C_STATE_READY;
5661 
5662         if (hi2c->Mode == HAL_I2C_MODE_MEM)
5663         {
5664           hi2c->Mode = HAL_I2C_MODE_NONE;
5665           hi2c->PreviousState = I2C_STATE_NONE;
5666 
5667 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
5668           hi2c->MemRxCpltCallback(hi2c);
5669 #else
5670           HAL_I2C_MemRxCpltCallback(hi2c);
5671 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
5672         }
5673         else
5674         {
5675           hi2c->Mode = HAL_I2C_MODE_NONE;
5676           hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX;
5677 
5678 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
5679           hi2c->MasterRxCpltCallback(hi2c);
5680 #else
5681           HAL_I2C_MasterRxCpltCallback(hi2c);
5682 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
5683         }
5684       }
5685       else
5686       {
5687         /* Disable EVT, BUF and ERR interrupt */
5688         __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
5689 
5690         /* Read data from DR */
5691         *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
5692 
5693         /* Increment Buffer pointer */
5694         hi2c->pBuffPtr++;
5695 
5696         /* Update counter */
5697         hi2c->XferCount--;
5698 
5699         hi2c->State = HAL_I2C_STATE_READY;
5700         hi2c->Mode = HAL_I2C_MODE_NONE;
5701 
5702         /* Call user error callback */
5703 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
5704         hi2c->ErrorCallback(hi2c);
5705 #else
5706         HAL_I2C_ErrorCallback(hi2c);
5707 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
5708       }
5709     }
5710     else
5711     {
5712       /* Do nothing */
5713     }
5714   }
5715 }
5716 
5717 /**
5718   * @brief  Handle BTF flag for Master receiver
5719   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
5720   *         the configuration information for I2C module
5721   * @retval None
5722   */
I2C_MasterReceive_BTF(I2C_HandleTypeDef * hi2c)5723 static void I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c)
5724 {
5725   /* Declaration of temporary variables to prevent undefined behavior of volatile usage */
5726   uint32_t CurrentXferOptions = hi2c->XferOptions;
5727 
5728   if (hi2c->XferCount == 4U)
5729   {
5730     /* Disable BUF interrupt, this help to treat correctly the last 2 bytes
5731        on BTF subroutine if there is a reception delay between N-1 and N byte */
5732     __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
5733 
5734     /* Read data from DR */
5735     *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
5736 
5737     /* Increment Buffer pointer */
5738     hi2c->pBuffPtr++;
5739 
5740     /* Update counter */
5741     hi2c->XferCount--;
5742   }
5743   else if (hi2c->XferCount == 3U)
5744   {
5745     /* Disable BUF interrupt, this help to treat correctly the last 2 bytes
5746        on BTF subroutine if there is a reception delay between N-1 and N byte */
5747     __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
5748 
5749     if ((CurrentXferOptions != I2C_NEXT_FRAME) && (CurrentXferOptions != I2C_FIRST_AND_NEXT_FRAME))
5750     {
5751       /* Disable Acknowledge */
5752       CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
5753     }
5754 
5755     /* Read data from DR */
5756     *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
5757 
5758     /* Increment Buffer pointer */
5759     hi2c->pBuffPtr++;
5760 
5761     /* Update counter */
5762     hi2c->XferCount--;
5763   }
5764   else if (hi2c->XferCount == 2U)
5765   {
5766     /* Prepare next transfer or stop current transfer */
5767     if ((CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME_NO_STOP))
5768     {
5769       /* Disable Acknowledge */
5770       CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
5771     }
5772     else if ((CurrentXferOptions == I2C_NEXT_FRAME) || (CurrentXferOptions == I2C_FIRST_AND_NEXT_FRAME))
5773     {
5774       /* Enable Acknowledge */
5775       SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
5776     }
5777     else if (CurrentXferOptions != I2C_LAST_FRAME_NO_STOP)
5778     {
5779       /* Generate Stop */
5780       SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
5781     }
5782     else
5783     {
5784       /* Do nothing */
5785     }
5786 
5787     /* Read data from DR */
5788     *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
5789 
5790     /* Increment Buffer pointer */
5791     hi2c->pBuffPtr++;
5792 
5793     /* Update counter */
5794     hi2c->XferCount--;
5795 
5796     /* Read data from DR */
5797     *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
5798 
5799     /* Increment Buffer pointer */
5800     hi2c->pBuffPtr++;
5801 
5802     /* Update counter */
5803     hi2c->XferCount--;
5804 
5805     /* Disable EVT and ERR interrupt */
5806     __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
5807 
5808     hi2c->State = HAL_I2C_STATE_READY;
5809     if (hi2c->Mode == HAL_I2C_MODE_MEM)
5810     {
5811       hi2c->Mode = HAL_I2C_MODE_NONE;
5812       hi2c->PreviousState = I2C_STATE_NONE;
5813 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
5814       hi2c->MemRxCpltCallback(hi2c);
5815 #else
5816       HAL_I2C_MemRxCpltCallback(hi2c);
5817 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
5818     }
5819     else
5820     {
5821       hi2c->Mode = HAL_I2C_MODE_NONE;
5822       hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX;
5823 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
5824       hi2c->MasterRxCpltCallback(hi2c);
5825 #else
5826       HAL_I2C_MasterRxCpltCallback(hi2c);
5827 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
5828     }
5829   }
5830   else
5831   {
5832     /* Read data from DR */
5833     *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
5834 
5835     /* Increment Buffer pointer */
5836     hi2c->pBuffPtr++;
5837 
5838     /* Update counter */
5839     hi2c->XferCount--;
5840   }
5841 }
5842 
5843 /**
5844   * @brief  Handle SB flag for Master
5845   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
5846   *         the configuration information for I2C module
5847   * @retval None
5848   */
I2C_Master_SB(I2C_HandleTypeDef * hi2c)5849 static void I2C_Master_SB(I2C_HandleTypeDef *hi2c)
5850 {
5851   if (hi2c->Mode == HAL_I2C_MODE_MEM)
5852   {
5853     if (hi2c->EventCount == 0U)
5854     {
5855       /* Send slave address */
5856       hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(hi2c->Devaddress);
5857     }
5858     else
5859     {
5860       hi2c->Instance->DR = I2C_7BIT_ADD_READ(hi2c->Devaddress);
5861     }
5862   }
5863   else
5864   {
5865     if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
5866     {
5867       /* Send slave 7 Bits address */
5868       if (hi2c->State == HAL_I2C_STATE_BUSY_TX)
5869       {
5870         hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(hi2c->Devaddress);
5871       }
5872       else
5873       {
5874         hi2c->Instance->DR = I2C_7BIT_ADD_READ(hi2c->Devaddress);
5875       }
5876 
5877       if (((hi2c->hdmatx != NULL) && (hi2c->hdmatx->XferCpltCallback != NULL))
5878           || ((hi2c->hdmarx != NULL) && (hi2c->hdmarx->XferCpltCallback != NULL)))
5879       {
5880         /* Enable DMA Request */
5881         SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
5882       }
5883     }
5884     else
5885     {
5886       if (hi2c->EventCount == 0U)
5887       {
5888         /* Send header of slave address */
5889         hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(hi2c->Devaddress);
5890       }
5891       else if (hi2c->EventCount == 1U)
5892       {
5893         /* Send header of slave address */
5894         hi2c->Instance->DR = I2C_10BIT_HEADER_READ(hi2c->Devaddress);
5895       }
5896       else
5897       {
5898         /* Do nothing */
5899       }
5900     }
5901   }
5902 }
5903 
5904 /**
5905   * @brief  Handle ADD10 flag for Master
5906   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
5907   *         the configuration information for I2C module
5908   * @retval None
5909   */
I2C_Master_ADD10(I2C_HandleTypeDef * hi2c)5910 static void I2C_Master_ADD10(I2C_HandleTypeDef *hi2c)
5911 {
5912   /* Send slave address */
5913   hi2c->Instance->DR = I2C_10BIT_ADDRESS(hi2c->Devaddress);
5914 
5915   if (((hi2c->hdmatx != NULL) && (hi2c->hdmatx->XferCpltCallback != NULL))
5916       || ((hi2c->hdmarx != NULL) && (hi2c->hdmarx->XferCpltCallback != NULL)))
5917   {
5918     /* Enable DMA Request */
5919     SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
5920   }
5921 }
5922 
5923 /**
5924   * @brief  Handle ADDR flag for Master
5925   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
5926   *         the configuration information for I2C module
5927   * @retval None
5928   */
I2C_Master_ADDR(I2C_HandleTypeDef * hi2c)5929 static void I2C_Master_ADDR(I2C_HandleTypeDef *hi2c)
5930 {
5931   /* Declaration of temporary variable to prevent undefined behavior of volatile usage */
5932   HAL_I2C_ModeTypeDef CurrentMode       = hi2c->Mode;
5933   uint32_t CurrentXferOptions           = hi2c->XferOptions;
5934   uint32_t Prev_State                   = hi2c->PreviousState;
5935 
5936   if (hi2c->State == HAL_I2C_STATE_BUSY_RX)
5937   {
5938     if ((hi2c->EventCount == 0U) && (CurrentMode == HAL_I2C_MODE_MEM))
5939     {
5940       /* Clear ADDR flag */
5941       __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
5942     }
5943     else if ((hi2c->EventCount == 0U) && (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT))
5944     {
5945       /* Clear ADDR flag */
5946       __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
5947 
5948       /* Generate Restart */
5949       SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
5950 
5951       hi2c->EventCount++;
5952     }
5953     else
5954     {
5955       if (hi2c->XferCount == 0U)
5956       {
5957         /* Clear ADDR flag */
5958         __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
5959 
5960         /* Generate Stop */
5961         SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
5962       }
5963       else if (hi2c->XferCount == 1U)
5964       {
5965         if (CurrentXferOptions == I2C_NO_OPTION_FRAME)
5966         {
5967           /* Disable Acknowledge */
5968           CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
5969 
5970           if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN)
5971           {
5972             /* Disable Acknowledge */
5973             CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
5974 
5975             /* Clear ADDR flag */
5976             __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
5977           }
5978           else
5979           {
5980             /* Clear ADDR flag */
5981             __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
5982 
5983             /* Generate Stop */
5984             SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
5985           }
5986         }
5987         /* Prepare next transfer or stop current transfer */
5988         else if ((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) \
5989                  && ((Prev_State != I2C_STATE_MASTER_BUSY_RX) || (CurrentXferOptions == I2C_FIRST_FRAME)))
5990         {
5991           if ((CurrentXferOptions != I2C_NEXT_FRAME) && (CurrentXferOptions != I2C_FIRST_AND_NEXT_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME_NO_STOP))
5992           {
5993             /* Disable Acknowledge */
5994             CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
5995           }
5996           else
5997           {
5998             /* Enable Acknowledge */
5999             SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
6000           }
6001 
6002           /* Clear ADDR flag */
6003           __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
6004         }
6005         else
6006         {
6007           /* Disable Acknowledge */
6008           CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
6009 
6010           /* Clear ADDR flag */
6011           __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
6012 
6013           /* Generate Stop */
6014           SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
6015         }
6016       }
6017       else if (hi2c->XferCount == 2U)
6018       {
6019         if ((CurrentXferOptions != I2C_NEXT_FRAME) && (CurrentXferOptions != I2C_FIRST_AND_NEXT_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME_NO_STOP))
6020         {
6021           /* Enable Pos */
6022           SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
6023 
6024           /* Clear ADDR flag */
6025           __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
6026 
6027           /* Disable Acknowledge */
6028           CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
6029         }
6030         else
6031         {
6032           /* Enable Acknowledge */
6033           SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
6034 
6035           /* Clear ADDR flag */
6036           __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
6037         }
6038 
6039         if (((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) && ((CurrentXferOptions == I2C_NO_OPTION_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME_NO_STOP) || (CurrentXferOptions == I2C_LAST_FRAME)))
6040         {
6041           /* Enable Last DMA bit */
6042           SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST);
6043         }
6044       }
6045       else
6046       {
6047         /* Enable Acknowledge */
6048         SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
6049 
6050         if (((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) && ((CurrentXferOptions == I2C_NO_OPTION_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME_NO_STOP) || (CurrentXferOptions == I2C_LAST_FRAME)))
6051         {
6052           /* Enable Last DMA bit */
6053           SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST);
6054         }
6055 
6056         /* Clear ADDR flag */
6057         __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
6058       }
6059 
6060       /* Reset Event counter  */
6061       hi2c->EventCount = 0U;
6062     }
6063   }
6064   else
6065   {
6066     /* Clear ADDR flag */
6067     __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
6068   }
6069 }
6070 
6071 /**
6072   * @brief  Handle TXE flag for Slave
6073   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
6074   *         the configuration information for I2C module
6075   * @retval None
6076   */
I2C_SlaveTransmit_TXE(I2C_HandleTypeDef * hi2c)6077 static void I2C_SlaveTransmit_TXE(I2C_HandleTypeDef *hi2c)
6078 {
6079   /* Declaration of temporary variables to prevent undefined behavior of volatile usage */
6080   HAL_I2C_StateTypeDef CurrentState = hi2c->State;
6081 
6082   if (hi2c->XferCount != 0U)
6083   {
6084     /* Write data to DR */
6085     hi2c->Instance->DR = *hi2c->pBuffPtr;
6086 
6087     /* Increment Buffer pointer */
6088     hi2c->pBuffPtr++;
6089 
6090     /* Update counter */
6091     hi2c->XferCount--;
6092 
6093     if ((hi2c->XferCount == 0U) && (CurrentState == HAL_I2C_STATE_BUSY_TX_LISTEN))
6094     {
6095       /* Last Byte is received, disable Interrupt */
6096       __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
6097 
6098       /* Set state at HAL_I2C_STATE_LISTEN */
6099       hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX;
6100       hi2c->State = HAL_I2C_STATE_LISTEN;
6101 
6102       /* Call the corresponding callback to inform upper layer of End of Transfer */
6103 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6104       hi2c->SlaveTxCpltCallback(hi2c);
6105 #else
6106       HAL_I2C_SlaveTxCpltCallback(hi2c);
6107 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
6108     }
6109   }
6110 }
6111 
6112 /**
6113   * @brief  Handle BTF flag for Slave transmitter
6114   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
6115   *         the configuration information for I2C module
6116   * @retval None
6117   */
I2C_SlaveTransmit_BTF(I2C_HandleTypeDef * hi2c)6118 static void I2C_SlaveTransmit_BTF(I2C_HandleTypeDef *hi2c)
6119 {
6120   if (hi2c->XferCount != 0U)
6121   {
6122     /* Write data to DR */
6123     hi2c->Instance->DR = *hi2c->pBuffPtr;
6124 
6125     /* Increment Buffer pointer */
6126     hi2c->pBuffPtr++;
6127 
6128     /* Update counter */
6129     hi2c->XferCount--;
6130   }
6131 }
6132 
6133 /**
6134   * @brief  Handle RXNE flag for Slave
6135   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
6136   *         the configuration information for I2C module
6137   * @retval None
6138   */
I2C_SlaveReceive_RXNE(I2C_HandleTypeDef * hi2c)6139 static void I2C_SlaveReceive_RXNE(I2C_HandleTypeDef *hi2c)
6140 {
6141   /* Declaration of temporary variables to prevent undefined behavior of volatile usage */
6142   HAL_I2C_StateTypeDef CurrentState = hi2c->State;
6143 
6144   if (hi2c->XferCount != 0U)
6145   {
6146     /* Read data from DR */
6147     *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
6148 
6149     /* Increment Buffer pointer */
6150     hi2c->pBuffPtr++;
6151 
6152     /* Update counter */
6153     hi2c->XferCount--;
6154 
6155     if ((hi2c->XferCount == 0U) && (CurrentState == HAL_I2C_STATE_BUSY_RX_LISTEN))
6156     {
6157       /* Last Byte is received, disable Interrupt */
6158       __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
6159 
6160       /* Set state at HAL_I2C_STATE_LISTEN */
6161       hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX;
6162       hi2c->State = HAL_I2C_STATE_LISTEN;
6163 
6164       /* Call the corresponding callback to inform upper layer of End of Transfer */
6165 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6166       hi2c->SlaveRxCpltCallback(hi2c);
6167 #else
6168       HAL_I2C_SlaveRxCpltCallback(hi2c);
6169 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
6170     }
6171   }
6172 }
6173 
6174 /**
6175   * @brief  Handle BTF flag for Slave receiver
6176   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
6177   *         the configuration information for I2C module
6178   * @retval None
6179   */
I2C_SlaveReceive_BTF(I2C_HandleTypeDef * hi2c)6180 static void I2C_SlaveReceive_BTF(I2C_HandleTypeDef *hi2c)
6181 {
6182   if (hi2c->XferCount != 0U)
6183   {
6184     /* Read data from DR */
6185     *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
6186 
6187     /* Increment Buffer pointer */
6188     hi2c->pBuffPtr++;
6189 
6190     /* Update counter */
6191     hi2c->XferCount--;
6192   }
6193 }
6194 
6195 /**
6196   * @brief  Handle ADD flag for Slave
6197   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
6198   *         the configuration information for I2C module
6199   * @param  IT2Flags Interrupt2 flags to handle.
6200   * @retval None
6201   */
I2C_Slave_ADDR(I2C_HandleTypeDef * hi2c,uint32_t IT2Flags)6202 static void I2C_Slave_ADDR(I2C_HandleTypeDef *hi2c, uint32_t IT2Flags)
6203 {
6204   uint8_t TransferDirection = I2C_DIRECTION_RECEIVE;
6205   uint16_t SlaveAddrCode;
6206 
6207   if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN)
6208   {
6209     /* Disable BUF interrupt, BUF enabling is manage through slave specific interface */
6210     __HAL_I2C_DISABLE_IT(hi2c, (I2C_IT_BUF));
6211 
6212     /* Transfer Direction requested by Master */
6213     if (I2C_CHECK_FLAG(IT2Flags, I2C_FLAG_TRA) == RESET)
6214     {
6215       TransferDirection = I2C_DIRECTION_TRANSMIT;
6216     }
6217 
6218     if (I2C_CHECK_FLAG(IT2Flags, I2C_FLAG_DUALF) == RESET)
6219     {
6220       SlaveAddrCode = (uint16_t)hi2c->Init.OwnAddress1;
6221     }
6222     else
6223     {
6224       SlaveAddrCode = (uint16_t)hi2c->Init.OwnAddress2;
6225     }
6226 
6227     /* Process Unlocked */
6228     __HAL_UNLOCK(hi2c);
6229 
6230     /* Call Slave Addr callback */
6231 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6232     hi2c->AddrCallback(hi2c, TransferDirection, SlaveAddrCode);
6233 #else
6234     HAL_I2C_AddrCallback(hi2c, TransferDirection, SlaveAddrCode);
6235 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
6236   }
6237   else
6238   {
6239     /* Clear ADDR flag */
6240     __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
6241 
6242     /* Process Unlocked */
6243     __HAL_UNLOCK(hi2c);
6244   }
6245 }
6246 
6247 /**
6248   * @brief  Handle STOPF flag for Slave
6249   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
6250   *         the configuration information for I2C module
6251   * @retval None
6252   */
I2C_Slave_STOPF(I2C_HandleTypeDef * hi2c)6253 static void I2C_Slave_STOPF(I2C_HandleTypeDef *hi2c)
6254 {
6255   /* Declaration of temporary variable to prevent undefined behavior of volatile usage */
6256   HAL_I2C_StateTypeDef CurrentState = hi2c->State;
6257 
6258   /* Disable EVT, BUF and ERR interrupt */
6259   __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
6260 
6261   /* Clear STOPF flag */
6262   __HAL_I2C_CLEAR_STOPFLAG(hi2c);
6263 
6264   /* Disable Acknowledge */
6265   CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
6266 
6267   /* If a DMA is ongoing, Update handle size context */
6268   if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN)
6269   {
6270     if ((CurrentState == HAL_I2C_STATE_BUSY_RX) || (CurrentState == HAL_I2C_STATE_BUSY_RX_LISTEN))
6271     {
6272       hi2c->XferCount = (uint16_t)(__HAL_DMA_GET_COUNTER(hi2c->hdmarx));
6273 
6274       if (hi2c->XferCount != 0U)
6275       {
6276         /* Set ErrorCode corresponding to a Non-Acknowledge */
6277         hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
6278       }
6279 
6280       /* Disable, stop the current DMA */
6281       CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
6282 
6283       /* Abort DMA Xfer if any */
6284       if (HAL_DMA_GetState(hi2c->hdmarx) != HAL_DMA_STATE_READY)
6285       {
6286         /* Set the I2C DMA Abort callback :
6287         will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */
6288         hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort;
6289 
6290         /* Abort DMA RX */
6291         if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK)
6292         {
6293           /* Call Directly XferAbortCallback function in case of error */
6294           hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx);
6295         }
6296       }
6297     }
6298     else
6299     {
6300       hi2c->XferCount = (uint16_t)(__HAL_DMA_GET_COUNTER(hi2c->hdmatx));
6301 
6302       if (hi2c->XferCount != 0U)
6303       {
6304         /* Set ErrorCode corresponding to a Non-Acknowledge */
6305         hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
6306       }
6307 
6308       /* Disable, stop the current DMA */
6309       CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
6310 
6311       /* Abort DMA Xfer if any */
6312       if (HAL_DMA_GetState(hi2c->hdmatx) != HAL_DMA_STATE_READY)
6313       {
6314         /* Set the I2C DMA Abort callback :
6315         will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */
6316         hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort;
6317 
6318         /* Abort DMA TX */
6319         if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK)
6320         {
6321           /* Call Directly XferAbortCallback function in case of error */
6322           hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx);
6323         }
6324       }
6325     }
6326   }
6327 
6328   /* All data are not transferred, so set error code accordingly */
6329   if (hi2c->XferCount != 0U)
6330   {
6331     /* Store Last receive data if any */
6332     if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET)
6333     {
6334       /* Read data from DR */
6335       *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
6336 
6337       /* Increment Buffer pointer */
6338       hi2c->pBuffPtr++;
6339 
6340       /* Update counter */
6341       hi2c->XferCount--;
6342     }
6343 
6344     /* Store Last receive data if any */
6345     if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET)
6346     {
6347       /* Read data from DR */
6348       *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
6349 
6350       /* Increment Buffer pointer */
6351       hi2c->pBuffPtr++;
6352 
6353       /* Update counter */
6354       hi2c->XferCount--;
6355     }
6356 
6357     if (hi2c->XferCount != 0U)
6358     {
6359       /* Set ErrorCode corresponding to a Non-Acknowledge */
6360       hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
6361     }
6362   }
6363 
6364   if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
6365   {
6366     /* Call the corresponding callback to inform upper layer of End of Transfer */
6367     I2C_ITError(hi2c);
6368   }
6369   else
6370   {
6371     if (CurrentState == HAL_I2C_STATE_BUSY_RX_LISTEN)
6372     {
6373       /* Set state at HAL_I2C_STATE_LISTEN */
6374       hi2c->PreviousState = I2C_STATE_NONE;
6375       hi2c->State = HAL_I2C_STATE_LISTEN;
6376 
6377       /* Call the corresponding callback to inform upper layer of End of Transfer */
6378 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6379       hi2c->SlaveRxCpltCallback(hi2c);
6380 #else
6381       HAL_I2C_SlaveRxCpltCallback(hi2c);
6382 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
6383     }
6384 
6385     if (hi2c->State == HAL_I2C_STATE_LISTEN)
6386     {
6387       hi2c->XferOptions = I2C_NO_OPTION_FRAME;
6388       hi2c->PreviousState = I2C_STATE_NONE;
6389       hi2c->State = HAL_I2C_STATE_READY;
6390       hi2c->Mode = HAL_I2C_MODE_NONE;
6391 
6392       /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */
6393 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6394       hi2c->ListenCpltCallback(hi2c);
6395 #else
6396       HAL_I2C_ListenCpltCallback(hi2c);
6397 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
6398     }
6399     else
6400     {
6401       if ((hi2c->PreviousState  == I2C_STATE_SLAVE_BUSY_RX) || (CurrentState == HAL_I2C_STATE_BUSY_RX))
6402       {
6403         hi2c->PreviousState = I2C_STATE_NONE;
6404         hi2c->State = HAL_I2C_STATE_READY;
6405         hi2c->Mode = HAL_I2C_MODE_NONE;
6406 
6407 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6408         hi2c->SlaveRxCpltCallback(hi2c);
6409 #else
6410         HAL_I2C_SlaveRxCpltCallback(hi2c);
6411 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
6412       }
6413     }
6414   }
6415 }
6416 
6417 /**
6418   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
6419   *         the configuration information for I2C module
6420   * @retval None
6421   */
I2C_Slave_AF(I2C_HandleTypeDef * hi2c)6422 static void I2C_Slave_AF(I2C_HandleTypeDef *hi2c)
6423 {
6424   /* Declaration of temporary variables to prevent undefined behavior of volatile usage */
6425   HAL_I2C_StateTypeDef CurrentState = hi2c->State;
6426   uint32_t CurrentXferOptions       = hi2c->XferOptions;
6427 
6428   if (((CurrentXferOptions ==  I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME)) && \
6429       (CurrentState == HAL_I2C_STATE_LISTEN))
6430   {
6431     hi2c->XferOptions = I2C_NO_OPTION_FRAME;
6432 
6433     /* Disable EVT, BUF and ERR interrupt */
6434     __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
6435 
6436     /* Clear AF flag */
6437     __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
6438 
6439     /* Disable Acknowledge */
6440     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
6441 
6442     hi2c->PreviousState = I2C_STATE_NONE;
6443     hi2c->State         = HAL_I2C_STATE_READY;
6444     hi2c->Mode          = HAL_I2C_MODE_NONE;
6445 
6446     /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */
6447 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6448     hi2c->ListenCpltCallback(hi2c);
6449 #else
6450     HAL_I2C_ListenCpltCallback(hi2c);
6451 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
6452   }
6453   else if (CurrentState == HAL_I2C_STATE_BUSY_TX)
6454   {
6455     hi2c->XferOptions   = I2C_NO_OPTION_FRAME;
6456     hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX;
6457     hi2c->State         = HAL_I2C_STATE_READY;
6458     hi2c->Mode          = HAL_I2C_MODE_NONE;
6459 
6460     /* Disable EVT, BUF and ERR interrupt */
6461     __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
6462 
6463     /* Clear AF flag */
6464     __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
6465 
6466     /* Disable Acknowledge */
6467     CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
6468 
6469 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6470     hi2c->SlaveTxCpltCallback(hi2c);
6471 #else
6472     HAL_I2C_SlaveTxCpltCallback(hi2c);
6473 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
6474   }
6475   else
6476   {
6477     /* Clear AF flag only */
6478     /* State Listen, but XferOptions == FIRST or NEXT */
6479     __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
6480   }
6481 }
6482 
6483 /**
6484   * @brief  I2C interrupts error process
6485   * @param  hi2c I2C handle.
6486   * @retval None
6487   */
I2C_ITError(I2C_HandleTypeDef * hi2c)6488 static void I2C_ITError(I2C_HandleTypeDef *hi2c)
6489 {
6490   /* Declaration of temporary variable to prevent undefined behavior of volatile usage */
6491   HAL_I2C_StateTypeDef CurrentState = hi2c->State;
6492   HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode;
6493   uint32_t CurrentError;
6494 
6495   if (((CurrentMode == HAL_I2C_MODE_MASTER) || (CurrentMode == HAL_I2C_MODE_MEM)) && (CurrentState == HAL_I2C_STATE_BUSY_RX))
6496   {
6497     /* Disable Pos bit in I2C CR1 when error occurred in Master/Mem Receive IT Process */
6498     hi2c->Instance->CR1 &= ~I2C_CR1_POS;
6499   }
6500 
6501   if (((uint32_t)CurrentState & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN)
6502   {
6503     /* keep HAL_I2C_STATE_LISTEN */
6504     hi2c->PreviousState = I2C_STATE_NONE;
6505     hi2c->State = HAL_I2C_STATE_LISTEN;
6506   }
6507   else
6508   {
6509     /* If state is an abort treatment on going, don't change state */
6510     /* This change will be do later */
6511     if ((READ_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN) != I2C_CR2_DMAEN) && (CurrentState != HAL_I2C_STATE_ABORT))
6512     {
6513       hi2c->State = HAL_I2C_STATE_READY;
6514       hi2c->Mode = HAL_I2C_MODE_NONE;
6515     }
6516     hi2c->PreviousState = I2C_STATE_NONE;
6517   }
6518 
6519   /* Abort DMA transfer */
6520   if (READ_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN) == I2C_CR2_DMAEN)
6521   {
6522     hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN;
6523 
6524     if (hi2c->hdmatx->State != HAL_DMA_STATE_READY)
6525     {
6526       /* Set the DMA Abort callback :
6527       will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */
6528       hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort;
6529 
6530       if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK)
6531       {
6532         /* Disable I2C peripheral to prevent dummy data in buffer */
6533         __HAL_I2C_DISABLE(hi2c);
6534 
6535         hi2c->State = HAL_I2C_STATE_READY;
6536 
6537         /* Call Directly XferAbortCallback function in case of error */
6538         hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx);
6539       }
6540     }
6541     else
6542     {
6543       /* Set the DMA Abort callback :
6544       will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */
6545       hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort;
6546 
6547       if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK)
6548       {
6549         /* Store Last receive data if any */
6550         if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET)
6551         {
6552           /* Read data from DR */
6553           *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
6554 
6555           /* Increment Buffer pointer */
6556           hi2c->pBuffPtr++;
6557         }
6558 
6559         /* Disable I2C peripheral to prevent dummy data in buffer */
6560         __HAL_I2C_DISABLE(hi2c);
6561 
6562         hi2c->State = HAL_I2C_STATE_READY;
6563 
6564         /* Call Directly hi2c->hdmarx->XferAbortCallback function in case of error */
6565         hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx);
6566       }
6567     }
6568   }
6569   else if (hi2c->State == HAL_I2C_STATE_ABORT)
6570   {
6571     hi2c->State = HAL_I2C_STATE_READY;
6572     hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
6573 
6574     /* Store Last receive data if any */
6575     if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET)
6576     {
6577       /* Read data from DR */
6578       *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
6579 
6580       /* Increment Buffer pointer */
6581       hi2c->pBuffPtr++;
6582     }
6583 
6584     /* Disable I2C peripheral to prevent dummy data in buffer */
6585     __HAL_I2C_DISABLE(hi2c);
6586 
6587     /* Call the corresponding callback to inform upper layer of End of Transfer */
6588 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6589     hi2c->AbortCpltCallback(hi2c);
6590 #else
6591     HAL_I2C_AbortCpltCallback(hi2c);
6592 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
6593   }
6594   else
6595   {
6596     /* Store Last receive data if any */
6597     if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET)
6598     {
6599       /* Read data from DR */
6600       *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
6601 
6602       /* Increment Buffer pointer */
6603       hi2c->pBuffPtr++;
6604     }
6605 
6606     /* Call user error callback */
6607 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6608     hi2c->ErrorCallback(hi2c);
6609 #else
6610     HAL_I2C_ErrorCallback(hi2c);
6611 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
6612   }
6613 
6614   /* STOP Flag is not set after a NACK reception, BusError, ArbitrationLost, OverRun */
6615   CurrentError = hi2c->ErrorCode;
6616 
6617   if (((CurrentError & HAL_I2C_ERROR_BERR) == HAL_I2C_ERROR_BERR) || \
6618       ((CurrentError & HAL_I2C_ERROR_ARLO) == HAL_I2C_ERROR_ARLO) || \
6619       ((CurrentError & HAL_I2C_ERROR_AF) == HAL_I2C_ERROR_AF)     || \
6620       ((CurrentError & HAL_I2C_ERROR_OVR) == HAL_I2C_ERROR_OVR))
6621   {
6622     /* Disable EVT, BUF and ERR interrupt */
6623     __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
6624   }
6625 
6626   /* So may inform upper layer that listen phase is stopped */
6627   /* during NACK error treatment */
6628   CurrentState = hi2c->State;
6629   if (((hi2c->ErrorCode & HAL_I2C_ERROR_AF) == HAL_I2C_ERROR_AF) && (CurrentState == HAL_I2C_STATE_LISTEN))
6630   {
6631     hi2c->XferOptions   = I2C_NO_OPTION_FRAME;
6632     hi2c->PreviousState = I2C_STATE_NONE;
6633     hi2c->State         = HAL_I2C_STATE_READY;
6634     hi2c->Mode          = HAL_I2C_MODE_NONE;
6635 
6636     /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */
6637 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6638     hi2c->ListenCpltCallback(hi2c);
6639 #else
6640     HAL_I2C_ListenCpltCallback(hi2c);
6641 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
6642   }
6643 }
6644 
6645 /**
6646   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
6647   *         the configuration information for I2C module
6648   * @param  DevAddress Target device address: The device 7 bits address value
6649   *         in datasheet must be shifted to the left before calling the interface
6650   * @param  Timeout Timeout duration
6651   * @param  Tickstart Tick start value
6652   * @retval HAL status
6653   */
I2C_MasterRequestWrite(I2C_HandleTypeDef * hi2c,uint16_t DevAddress,uint32_t Timeout,uint32_t Tickstart)6654 static HAL_StatusTypeDef I2C_MasterRequestWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart)
6655 {
6656   /* Declaration of temporary variable to prevent undefined behavior of volatile usage */
6657   uint32_t CurrentXferOptions = hi2c->XferOptions;
6658 
6659   /* Generate Start condition if first transfer */
6660   if ((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_NO_OPTION_FRAME))
6661   {
6662     /* Generate Start */
6663     SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
6664   }
6665   else if (hi2c->PreviousState == I2C_STATE_MASTER_BUSY_RX)
6666   {
6667     /* Generate ReStart */
6668     SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
6669   }
6670   else
6671   {
6672     /* Do nothing */
6673   }
6674 
6675   /* Wait until SB flag is set */
6676   if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK)
6677   {
6678     if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START)
6679     {
6680       hi2c->ErrorCode = HAL_I2C_WRONG_START;
6681     }
6682     return HAL_TIMEOUT;
6683   }
6684 
6685   if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
6686   {
6687     /* Send slave address */
6688     hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);
6689   }
6690   else
6691   {
6692     /* Send header of slave address */
6693     hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(DevAddress);
6694 
6695     /* Wait until ADD10 flag is set */
6696     if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADD10, Timeout, Tickstart) != HAL_OK)
6697     {
6698       return HAL_ERROR;
6699     }
6700 
6701     /* Send slave address */
6702     hi2c->Instance->DR = I2C_10BIT_ADDRESS(DevAddress);
6703   }
6704 
6705   /* Wait until ADDR flag is set */
6706   if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK)
6707   {
6708     return HAL_ERROR;
6709   }
6710 
6711   return HAL_OK;
6712 }
6713 
6714 /**
6715   * @brief  Master sends target device address for read request.
6716   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
6717   *         the configuration information for I2C module
6718   * @param  DevAddress Target device address: The device 7 bits address value
6719   *         in datasheet must be shifted to the left before calling the interface
6720   * @param  Timeout Timeout duration
6721   * @param  Tickstart Tick start value
6722   * @retval HAL status
6723   */
I2C_MasterRequestRead(I2C_HandleTypeDef * hi2c,uint16_t DevAddress,uint32_t Timeout,uint32_t Tickstart)6724 static HAL_StatusTypeDef I2C_MasterRequestRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart)
6725 {
6726   /* Declaration of temporary variable to prevent undefined behavior of volatile usage */
6727   uint32_t CurrentXferOptions = hi2c->XferOptions;
6728 
6729   /* Enable Acknowledge */
6730   SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
6731 
6732   /* Generate Start condition if first transfer */
6733   if ((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME)  || (CurrentXferOptions == I2C_NO_OPTION_FRAME))
6734   {
6735     /* Generate Start */
6736     SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
6737   }
6738   else if (hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX)
6739   {
6740     /* Generate ReStart */
6741     SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
6742   }
6743   else
6744   {
6745     /* Do nothing */
6746   }
6747 
6748   /* Wait until SB flag is set */
6749   if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK)
6750   {
6751     if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START)
6752     {
6753       hi2c->ErrorCode = HAL_I2C_WRONG_START;
6754     }
6755     return HAL_TIMEOUT;
6756   }
6757 
6758   if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
6759   {
6760     /* Send slave address */
6761     hi2c->Instance->DR = I2C_7BIT_ADD_READ(DevAddress);
6762   }
6763   else
6764   {
6765     /* Send header of slave address */
6766     hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(DevAddress);
6767 
6768     /* Wait until ADD10 flag is set */
6769     if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADD10, Timeout, Tickstart) != HAL_OK)
6770     {
6771       return HAL_ERROR;
6772     }
6773 
6774     /* Send slave address */
6775     hi2c->Instance->DR = I2C_10BIT_ADDRESS(DevAddress);
6776 
6777     /* Wait until ADDR flag is set */
6778     if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK)
6779     {
6780       return HAL_ERROR;
6781     }
6782 
6783     /* Clear ADDR flag */
6784     __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
6785 
6786     /* Generate Restart */
6787     SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
6788 
6789     /* Wait until SB flag is set */
6790     if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK)
6791     {
6792       if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START)
6793       {
6794         hi2c->ErrorCode = HAL_I2C_WRONG_START;
6795       }
6796       return HAL_TIMEOUT;
6797     }
6798 
6799     /* Send header of slave address */
6800     hi2c->Instance->DR = I2C_10BIT_HEADER_READ(DevAddress);
6801   }
6802 
6803   /* Wait until ADDR flag is set */
6804   if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK)
6805   {
6806     return HAL_ERROR;
6807   }
6808 
6809   return HAL_OK;
6810 }
6811 
6812 /**
6813   * @brief  Master sends target device address followed by internal memory address for write request.
6814   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
6815   *         the configuration information for I2C module
6816   * @param  DevAddress Target device address: The device 7 bits address value
6817   *         in datasheet must be shifted to the left before calling the interface
6818   * @param  MemAddress Internal memory address
6819   * @param  MemAddSize Size of internal memory address
6820   * @param  Timeout Timeout duration
6821   * @param  Tickstart Tick start value
6822   * @retval HAL status
6823   */
I2C_RequestMemoryWrite(I2C_HandleTypeDef * hi2c,uint16_t DevAddress,uint16_t MemAddress,uint16_t MemAddSize,uint32_t Timeout,uint32_t Tickstart)6824 static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart)
6825 {
6826   /* Generate Start */
6827   SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
6828 
6829   /* Wait until SB flag is set */
6830   if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK)
6831   {
6832     if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START)
6833     {
6834       hi2c->ErrorCode = HAL_I2C_WRONG_START;
6835     }
6836     return HAL_TIMEOUT;
6837   }
6838 
6839   /* Send slave address */
6840   hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);
6841 
6842   /* Wait until ADDR flag is set */
6843   if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK)
6844   {
6845     return HAL_ERROR;
6846   }
6847 
6848   /* Clear ADDR flag */
6849   __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
6850 
6851   /* Wait until TXE flag is set */
6852   if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
6853   {
6854     if (hi2c->ErrorCode == HAL_I2C_ERROR_AF)
6855     {
6856       /* Generate Stop */
6857       SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
6858     }
6859     return HAL_ERROR;
6860   }
6861 
6862   /* If Memory address size is 8Bit */
6863   if (MemAddSize == I2C_MEMADD_SIZE_8BIT)
6864   {
6865     /* Send Memory Address */
6866     hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress);
6867   }
6868   /* If Memory address size is 16Bit */
6869   else
6870   {
6871     /* Send MSB of Memory Address */
6872     hi2c->Instance->DR = I2C_MEM_ADD_MSB(MemAddress);
6873 
6874     /* Wait until TXE flag is set */
6875     if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
6876     {
6877       if (hi2c->ErrorCode == HAL_I2C_ERROR_AF)
6878       {
6879         /* Generate Stop */
6880         SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
6881       }
6882       return HAL_ERROR;
6883     }
6884 
6885     /* Send LSB of Memory Address */
6886     hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress);
6887   }
6888 
6889   return HAL_OK;
6890 }
6891 
6892 /**
6893   * @brief  Master sends target device address followed by internal memory address for read request.
6894   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
6895   *         the configuration information for I2C module
6896   * @param  DevAddress Target device address: The device 7 bits address value
6897   *         in datasheet must be shifted to the left before calling the interface
6898   * @param  MemAddress Internal memory address
6899   * @param  MemAddSize Size of internal memory address
6900   * @param  Timeout Timeout duration
6901   * @param  Tickstart Tick start value
6902   * @retval HAL status
6903   */
I2C_RequestMemoryRead(I2C_HandleTypeDef * hi2c,uint16_t DevAddress,uint16_t MemAddress,uint16_t MemAddSize,uint32_t Timeout,uint32_t Tickstart)6904 static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart)
6905 {
6906   /* Enable Acknowledge */
6907   SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
6908 
6909   /* Generate Start */
6910   SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
6911 
6912   /* Wait until SB flag is set */
6913   if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK)
6914   {
6915     if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START)
6916     {
6917       hi2c->ErrorCode = HAL_I2C_WRONG_START;
6918     }
6919     return HAL_TIMEOUT;
6920   }
6921 
6922   /* Send slave address */
6923   hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);
6924 
6925   /* Wait until ADDR flag is set */
6926   if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK)
6927   {
6928     return HAL_ERROR;
6929   }
6930 
6931   /* Clear ADDR flag */
6932   __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
6933 
6934   /* Wait until TXE flag is set */
6935   if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
6936   {
6937     if (hi2c->ErrorCode == HAL_I2C_ERROR_AF)
6938     {
6939       /* Generate Stop */
6940       SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
6941     }
6942     return HAL_ERROR;
6943   }
6944 
6945   /* If Memory address size is 8Bit */
6946   if (MemAddSize == I2C_MEMADD_SIZE_8BIT)
6947   {
6948     /* Send Memory Address */
6949     hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress);
6950   }
6951   /* If Memory address size is 16Bit */
6952   else
6953   {
6954     /* Send MSB of Memory Address */
6955     hi2c->Instance->DR = I2C_MEM_ADD_MSB(MemAddress);
6956 
6957     /* Wait until TXE flag is set */
6958     if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
6959     {
6960       if (hi2c->ErrorCode == HAL_I2C_ERROR_AF)
6961       {
6962         /* Generate Stop */
6963         SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
6964       }
6965       return HAL_ERROR;
6966     }
6967 
6968     /* Send LSB of Memory Address */
6969     hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress);
6970   }
6971 
6972   /* Wait until TXE flag is set */
6973   if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
6974   {
6975     if (hi2c->ErrorCode == HAL_I2C_ERROR_AF)
6976     {
6977       /* Generate Stop */
6978       SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
6979     }
6980     return HAL_ERROR;
6981   }
6982 
6983   /* Generate Restart */
6984   SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
6985 
6986   /* Wait until SB flag is set */
6987   if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK)
6988   {
6989     if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START)
6990     {
6991       hi2c->ErrorCode = HAL_I2C_WRONG_START;
6992     }
6993     return HAL_TIMEOUT;
6994   }
6995 
6996   /* Send slave address */
6997   hi2c->Instance->DR = I2C_7BIT_ADD_READ(DevAddress);
6998 
6999   /* Wait until ADDR flag is set */
7000   if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK)
7001   {
7002     return HAL_ERROR;
7003   }
7004 
7005   return HAL_OK;
7006 }
7007 
7008 /**
7009   * @brief  DMA I2C process complete callback.
7010   * @param  hdma DMA handle
7011   * @retval None
7012   */
I2C_DMAXferCplt(DMA_HandleTypeDef * hdma)7013 static void I2C_DMAXferCplt(DMA_HandleTypeDef *hdma)
7014 {
7015   I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; /* Derogation MISRAC2012-Rule-11.5 */
7016 
7017   /* Declaration of temporary variable to prevent undefined behavior of volatile usage */
7018   HAL_I2C_StateTypeDef CurrentState = hi2c->State;
7019   HAL_I2C_ModeTypeDef CurrentMode   = hi2c->Mode;
7020   uint32_t CurrentXferOptions       = hi2c->XferOptions;
7021 
7022   /* Disable EVT and ERR interrupt */
7023   __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
7024 
7025   /* Clear Complete callback */
7026   if (hi2c->hdmatx != NULL)
7027   {
7028     hi2c->hdmatx->XferCpltCallback = NULL;
7029   }
7030   if (hi2c->hdmarx != NULL)
7031   {
7032     hi2c->hdmarx->XferCpltCallback = NULL;
7033   }
7034 
7035   if ((((uint32_t)CurrentState & (uint32_t)HAL_I2C_STATE_BUSY_TX) == (uint32_t)HAL_I2C_STATE_BUSY_TX) || ((((uint32_t)CurrentState & (uint32_t)HAL_I2C_STATE_BUSY_RX) == (uint32_t)HAL_I2C_STATE_BUSY_RX) && (CurrentMode == HAL_I2C_MODE_SLAVE)))
7036   {
7037     /* Disable DMA Request */
7038     CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
7039 
7040     hi2c->XferCount = 0U;
7041 
7042     if (CurrentState == HAL_I2C_STATE_BUSY_TX_LISTEN)
7043     {
7044       /* Set state at HAL_I2C_STATE_LISTEN */
7045       hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX;
7046       hi2c->State = HAL_I2C_STATE_LISTEN;
7047 
7048       /* Call the corresponding callback to inform upper layer of End of Transfer */
7049 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
7050       hi2c->SlaveTxCpltCallback(hi2c);
7051 #else
7052       HAL_I2C_SlaveTxCpltCallback(hi2c);
7053 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
7054     }
7055     else if (CurrentState == HAL_I2C_STATE_BUSY_RX_LISTEN)
7056     {
7057       /* Set state at HAL_I2C_STATE_LISTEN */
7058       hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX;
7059       hi2c->State = HAL_I2C_STATE_LISTEN;
7060 
7061       /* Call the corresponding callback to inform upper layer of End of Transfer */
7062 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
7063       hi2c->SlaveRxCpltCallback(hi2c);
7064 #else
7065       HAL_I2C_SlaveRxCpltCallback(hi2c);
7066 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
7067     }
7068     else
7069     {
7070       /* Do nothing */
7071     }
7072 
7073     /* Enable EVT and ERR interrupt to treat end of transfer in IRQ handler */
7074     __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
7075   }
7076   /* Check current Mode, in case of treatment DMA handler have been preempted by a prior interrupt */
7077   else if (hi2c->Mode != HAL_I2C_MODE_NONE)
7078   {
7079     if (hi2c->XferCount == (uint16_t)1)
7080     {
7081       /* Disable Acknowledge */
7082       CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
7083     }
7084 
7085     /* Disable EVT and ERR interrupt */
7086     __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
7087 
7088     /* Prepare next transfer or stop current transfer */
7089     if ((CurrentXferOptions == I2C_NO_OPTION_FRAME) || (CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_OTHER_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME))
7090     {
7091       /* Generate Stop */
7092       SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
7093     }
7094 
7095     /* Disable Last DMA */
7096     CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_LAST);
7097 
7098     /* Disable DMA Request */
7099     CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
7100 
7101     hi2c->XferCount = 0U;
7102 
7103     /* Check if Errors has been detected during transfer */
7104     if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
7105     {
7106 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
7107       hi2c->ErrorCallback(hi2c);
7108 #else
7109       HAL_I2C_ErrorCallback(hi2c);
7110 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
7111     }
7112     else
7113     {
7114       hi2c->State = HAL_I2C_STATE_READY;
7115 
7116       if (hi2c->Mode == HAL_I2C_MODE_MEM)
7117       {
7118         hi2c->Mode = HAL_I2C_MODE_NONE;
7119         hi2c->PreviousState = I2C_STATE_NONE;
7120 
7121 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
7122         hi2c->MemRxCpltCallback(hi2c);
7123 #else
7124         HAL_I2C_MemRxCpltCallback(hi2c);
7125 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
7126       }
7127       else
7128       {
7129         hi2c->Mode = HAL_I2C_MODE_NONE;
7130         hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX;
7131 
7132 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
7133         hi2c->MasterRxCpltCallback(hi2c);
7134 #else
7135         HAL_I2C_MasterRxCpltCallback(hi2c);
7136 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
7137       }
7138     }
7139   }
7140   else
7141   {
7142     /* Do nothing */
7143   }
7144 }
7145 
7146 /**
7147   * @brief  DMA I2C communication error callback.
7148   * @param  hdma DMA handle
7149   * @retval None
7150   */
I2C_DMAError(DMA_HandleTypeDef * hdma)7151 static void I2C_DMAError(DMA_HandleTypeDef *hdma)
7152 {
7153   I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; /* Derogation MISRAC2012-Rule-11.5 */
7154 
7155   /* Clear Complete callback */
7156   if (hi2c->hdmatx != NULL)
7157   {
7158     hi2c->hdmatx->XferCpltCallback = NULL;
7159   }
7160   if (hi2c->hdmarx != NULL)
7161   {
7162     hi2c->hdmarx->XferCpltCallback = NULL;
7163   }
7164 
7165   /* Disable Acknowledge */
7166   CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
7167 
7168   hi2c->XferCount       = 0U;
7169   hi2c->State           = HAL_I2C_STATE_READY;
7170   hi2c->Mode            = HAL_I2C_MODE_NONE;
7171   hi2c->ErrorCode       |= HAL_I2C_ERROR_DMA;
7172 
7173 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
7174   hi2c->ErrorCallback(hi2c);
7175 #else
7176   HAL_I2C_ErrorCallback(hi2c);
7177 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
7178 }
7179 
7180 /**
7181   * @brief DMA I2C communication abort callback
7182   *        (To be called at end of DMA Abort procedure).
7183   * @param hdma DMA handle.
7184   * @retval None
7185   */
I2C_DMAAbort(DMA_HandleTypeDef * hdma)7186 static void I2C_DMAAbort(DMA_HandleTypeDef *hdma)
7187 {
7188   __IO uint32_t count = 0U;
7189   I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; /* Derogation MISRAC2012-Rule-11.5 */
7190 
7191   /* Declaration of temporary variable to prevent undefined behavior of volatile usage */
7192   HAL_I2C_StateTypeDef CurrentState = hi2c->State;
7193 
7194   /* During abort treatment, check that there is no pending STOP request */
7195   /* Wait until STOP flag is reset */
7196   count = I2C_TIMEOUT_FLAG * (SystemCoreClock / 25U / 1000U);
7197   do
7198   {
7199     if (count == 0U)
7200     {
7201       hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
7202       break;
7203     }
7204     count--;
7205   }
7206   while (READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP);
7207 
7208   /* Clear Complete callback */
7209   if (hi2c->hdmatx != NULL)
7210   {
7211     hi2c->hdmatx->XferCpltCallback = NULL;
7212   }
7213   if (hi2c->hdmarx != NULL)
7214   {
7215     hi2c->hdmarx->XferCpltCallback = NULL;
7216   }
7217 
7218   /* Disable Acknowledge */
7219   CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
7220 
7221   hi2c->XferCount = 0U;
7222 
7223   /* Reset XferAbortCallback */
7224   if (hi2c->hdmatx != NULL)
7225   {
7226     hi2c->hdmatx->XferAbortCallback = NULL;
7227   }
7228   if (hi2c->hdmarx != NULL)
7229   {
7230     hi2c->hdmarx->XferAbortCallback = NULL;
7231   }
7232 
7233   /* Disable I2C peripheral to prevent dummy data in buffer */
7234   __HAL_I2C_DISABLE(hi2c);
7235 
7236   /* Check if come from abort from user */
7237   if (hi2c->State == HAL_I2C_STATE_ABORT)
7238   {
7239     hi2c->State         = HAL_I2C_STATE_READY;
7240     hi2c->Mode          = HAL_I2C_MODE_NONE;
7241     hi2c->ErrorCode     = HAL_I2C_ERROR_NONE;
7242 
7243     /* Call the corresponding callback to inform upper layer of End of Transfer */
7244 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
7245     hi2c->AbortCpltCallback(hi2c);
7246 #else
7247     HAL_I2C_AbortCpltCallback(hi2c);
7248 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
7249   }
7250   else
7251   {
7252     if (((uint32_t)CurrentState & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN)
7253     {
7254       /* Renable I2C peripheral */
7255       __HAL_I2C_ENABLE(hi2c);
7256 
7257       /* Enable Acknowledge */
7258       SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
7259 
7260       /* keep HAL_I2C_STATE_LISTEN */
7261       hi2c->PreviousState = I2C_STATE_NONE;
7262       hi2c->State = HAL_I2C_STATE_LISTEN;
7263     }
7264     else
7265     {
7266       hi2c->State = HAL_I2C_STATE_READY;
7267       hi2c->Mode = HAL_I2C_MODE_NONE;
7268     }
7269 
7270     /* Call the corresponding callback to inform upper layer of End of Transfer */
7271 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
7272     hi2c->ErrorCallback(hi2c);
7273 #else
7274     HAL_I2C_ErrorCallback(hi2c);
7275 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
7276   }
7277 }
7278 
7279 /**
7280   * @brief  This function handles I2C Communication Timeout.
7281   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
7282   *         the configuration information for I2C module
7283   * @param  Flag specifies the I2C flag to check.
7284   * @param  Status The new Flag status (SET or RESET).
7285   * @param  Timeout Timeout duration
7286   * @param  Tickstart Tick start value
7287   * @retval HAL status
7288   */
I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef * hi2c,uint32_t Flag,FlagStatus Status,uint32_t Timeout,uint32_t Tickstart)7289 static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart)
7290 {
7291   /* Wait until flag is set */
7292   while (__HAL_I2C_GET_FLAG(hi2c, Flag) == Status)
7293   {
7294     /* Check for the Timeout */
7295     if (Timeout != HAL_MAX_DELAY)
7296     {
7297       if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
7298       {
7299         hi2c->PreviousState     = I2C_STATE_NONE;
7300         hi2c->State             = HAL_I2C_STATE_READY;
7301         hi2c->Mode              = HAL_I2C_MODE_NONE;
7302         hi2c->ErrorCode         |= HAL_I2C_ERROR_TIMEOUT;
7303 
7304         /* Process Unlocked */
7305         __HAL_UNLOCK(hi2c);
7306 
7307         return HAL_ERROR;
7308       }
7309     }
7310   }
7311   return HAL_OK;
7312 }
7313 
7314 /**
7315   * @brief  This function handles I2C Communication Timeout for Master addressing phase.
7316   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
7317   *         the configuration information for I2C module
7318   * @param  Flag specifies the I2C flag to check.
7319   * @param  Timeout Timeout duration
7320   * @param  Tickstart Tick start value
7321   * @retval HAL status
7322   */
I2C_WaitOnMasterAddressFlagUntilTimeout(I2C_HandleTypeDef * hi2c,uint32_t Flag,uint32_t Timeout,uint32_t Tickstart)7323 static HAL_StatusTypeDef I2C_WaitOnMasterAddressFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, uint32_t Timeout, uint32_t Tickstart)
7324 {
7325   while (__HAL_I2C_GET_FLAG(hi2c, Flag) == RESET)
7326   {
7327     if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET)
7328     {
7329       /* Generate Stop */
7330       SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
7331 
7332       /* Clear AF Flag */
7333       __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
7334 
7335       hi2c->PreviousState       = I2C_STATE_NONE;
7336       hi2c->State               = HAL_I2C_STATE_READY;
7337       hi2c->Mode                = HAL_I2C_MODE_NONE;
7338       hi2c->ErrorCode           |= HAL_I2C_ERROR_AF;
7339 
7340       /* Process Unlocked */
7341       __HAL_UNLOCK(hi2c);
7342 
7343       return HAL_ERROR;
7344     }
7345 
7346     /* Check for the Timeout */
7347     if (Timeout != HAL_MAX_DELAY)
7348     {
7349       if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
7350       {
7351         hi2c->PreviousState       = I2C_STATE_NONE;
7352         hi2c->State               = HAL_I2C_STATE_READY;
7353         hi2c->Mode                = HAL_I2C_MODE_NONE;
7354         hi2c->ErrorCode           |= HAL_I2C_ERROR_TIMEOUT;
7355 
7356         /* Process Unlocked */
7357         __HAL_UNLOCK(hi2c);
7358 
7359         return HAL_ERROR;
7360       }
7361     }
7362   }
7363   return HAL_OK;
7364 }
7365 
7366 /**
7367   * @brief  This function handles I2C Communication Timeout for specific usage of TXE flag.
7368   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
7369   *                the configuration information for the specified I2C.
7370   * @param  Timeout Timeout duration
7371   * @param  Tickstart Tick start value
7372   * @retval HAL status
7373   */
I2C_WaitOnTXEFlagUntilTimeout(I2C_HandleTypeDef * hi2c,uint32_t Timeout,uint32_t Tickstart)7374 static HAL_StatusTypeDef I2C_WaitOnTXEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
7375 {
7376   while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE) == RESET)
7377   {
7378     /* Check if a NACK is detected */
7379     if (I2C_IsAcknowledgeFailed(hi2c) != HAL_OK)
7380     {
7381       return HAL_ERROR;
7382     }
7383 
7384     /* Check for the Timeout */
7385     if (Timeout != HAL_MAX_DELAY)
7386     {
7387       if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
7388       {
7389         hi2c->PreviousState       = I2C_STATE_NONE;
7390         hi2c->State               = HAL_I2C_STATE_READY;
7391         hi2c->Mode                = HAL_I2C_MODE_NONE;
7392         hi2c->ErrorCode           |= HAL_I2C_ERROR_TIMEOUT;
7393 
7394         /* Process Unlocked */
7395         __HAL_UNLOCK(hi2c);
7396 
7397         return HAL_ERROR;
7398       }
7399     }
7400   }
7401   return HAL_OK;
7402 }
7403 
7404 /**
7405   * @brief  This function handles I2C Communication Timeout for specific usage of BTF flag.
7406   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
7407   *                the configuration information for the specified I2C.
7408   * @param  Timeout Timeout duration
7409   * @param  Tickstart Tick start value
7410   * @retval HAL status
7411   */
I2C_WaitOnBTFFlagUntilTimeout(I2C_HandleTypeDef * hi2c,uint32_t Timeout,uint32_t Tickstart)7412 static HAL_StatusTypeDef I2C_WaitOnBTFFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
7413 {
7414   while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == RESET)
7415   {
7416     /* Check if a NACK is detected */
7417     if (I2C_IsAcknowledgeFailed(hi2c) != HAL_OK)
7418     {
7419       return HAL_ERROR;
7420     }
7421 
7422     /* Check for the Timeout */
7423     if (Timeout != HAL_MAX_DELAY)
7424     {
7425       if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
7426       {
7427         hi2c->PreviousState       = I2C_STATE_NONE;
7428         hi2c->State               = HAL_I2C_STATE_READY;
7429         hi2c->Mode                = HAL_I2C_MODE_NONE;
7430         hi2c->ErrorCode           |= HAL_I2C_ERROR_TIMEOUT;
7431 
7432         /* Process Unlocked */
7433         __HAL_UNLOCK(hi2c);
7434 
7435         return HAL_ERROR;
7436       }
7437     }
7438   }
7439   return HAL_OK;
7440 }
7441 
7442 /**
7443   * @brief  This function handles I2C Communication Timeout for specific usage of STOP flag.
7444   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
7445   *                the configuration information for the specified I2C.
7446   * @param  Timeout Timeout duration
7447   * @param  Tickstart Tick start value
7448   * @retval HAL status
7449   */
I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef * hi2c,uint32_t Timeout,uint32_t Tickstart)7450 static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
7451 {
7452   while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET)
7453   {
7454     /* Check if a NACK is detected */
7455     if (I2C_IsAcknowledgeFailed(hi2c) != HAL_OK)
7456     {
7457       return HAL_ERROR;
7458     }
7459 
7460     /* Check for the Timeout */
7461     if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
7462     {
7463       hi2c->PreviousState       = I2C_STATE_NONE;
7464       hi2c->State               = HAL_I2C_STATE_READY;
7465       hi2c->Mode                = HAL_I2C_MODE_NONE;
7466       hi2c->ErrorCode           |= HAL_I2C_ERROR_TIMEOUT;
7467 
7468       /* Process Unlocked */
7469       __HAL_UNLOCK(hi2c);
7470 
7471       return HAL_ERROR;
7472     }
7473   }
7474   return HAL_OK;
7475 }
7476 
7477 /**
7478   * @brief  This function handles I2C Communication Timeout for specific usage of STOP request through Interrupt.
7479   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
7480   *                the configuration information for the specified I2C.
7481   * @retval HAL status
7482   */
I2C_WaitOnSTOPRequestThroughIT(I2C_HandleTypeDef * hi2c)7483 static HAL_StatusTypeDef I2C_WaitOnSTOPRequestThroughIT(I2C_HandleTypeDef *hi2c)
7484 {
7485   __IO uint32_t count = 0U;
7486 
7487   /* Wait until STOP flag is reset */
7488   count = I2C_TIMEOUT_STOP_FLAG * (SystemCoreClock / 25U / 1000U);
7489   do
7490   {
7491     count--;
7492     if (count == 0U)
7493     {
7494       hi2c->ErrorCode           |= HAL_I2C_ERROR_TIMEOUT;
7495 
7496       return HAL_ERROR;
7497     }
7498   }
7499   while (READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP);
7500 
7501   return HAL_OK;
7502 }
7503 
7504 /**
7505   * @brief  This function handles I2C Communication Timeout for specific usage of RXNE flag.
7506   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
7507   *                the configuration information for the specified I2C.
7508   * @param  Timeout Timeout duration
7509   * @param  Tickstart Tick start value
7510   * @retval HAL status
7511   */
I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef * hi2c,uint32_t Timeout,uint32_t Tickstart)7512 static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
7513 {
7514 
7515   while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == RESET)
7516   {
7517     /* Check if a STOPF is detected */
7518     if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == SET)
7519     {
7520       /* Clear STOP Flag */
7521       __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
7522 
7523       hi2c->PreviousState       = I2C_STATE_NONE;
7524       hi2c->State               = HAL_I2C_STATE_READY;
7525       hi2c->Mode                = HAL_I2C_MODE_NONE;
7526       hi2c->ErrorCode           |= HAL_I2C_ERROR_NONE;
7527 
7528       /* Process Unlocked */
7529       __HAL_UNLOCK(hi2c);
7530 
7531       return HAL_ERROR;
7532     }
7533 
7534     /* Check for the Timeout */
7535     if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
7536     {
7537       hi2c->PreviousState       = I2C_STATE_NONE;
7538       hi2c->State               = HAL_I2C_STATE_READY;
7539       hi2c->Mode                = HAL_I2C_MODE_NONE;
7540       hi2c->ErrorCode           |= HAL_I2C_ERROR_TIMEOUT;
7541 
7542       /* Process Unlocked */
7543       __HAL_UNLOCK(hi2c);
7544 
7545       return HAL_ERROR;
7546     }
7547   }
7548   return HAL_OK;
7549 }
7550 
7551 /**
7552   * @brief  This function handles Acknowledge failed detection during an I2C Communication.
7553   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
7554   *                the configuration information for the specified I2C.
7555   * @retval HAL status
7556   */
I2C_IsAcknowledgeFailed(I2C_HandleTypeDef * hi2c)7557 static HAL_StatusTypeDef I2C_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c)
7558 {
7559   if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET)
7560   {
7561     /* Clear NACKF Flag */
7562     __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
7563 
7564     hi2c->PreviousState       = I2C_STATE_NONE;
7565     hi2c->State               = HAL_I2C_STATE_READY;
7566     hi2c->Mode                = HAL_I2C_MODE_NONE;
7567     hi2c->ErrorCode           |= HAL_I2C_ERROR_AF;
7568 
7569     /* Process Unlocked */
7570     __HAL_UNLOCK(hi2c);
7571 
7572     return HAL_ERROR;
7573   }
7574   return HAL_OK;
7575 }
7576 
7577 /**
7578   * @brief  Convert I2Cx OTHER_xxx XferOptions to functional XferOptions.
7579   * @param  hi2c I2C handle.
7580   * @retval None
7581   */
I2C_ConvertOtherXferOptions(I2C_HandleTypeDef * hi2c)7582 static void I2C_ConvertOtherXferOptions(I2C_HandleTypeDef *hi2c)
7583 {
7584   /* if user set XferOptions to I2C_OTHER_FRAME            */
7585   /* it request implicitly to generate a restart condition */
7586   /* set XferOptions to I2C_FIRST_FRAME                    */
7587   if (hi2c->XferOptions == I2C_OTHER_FRAME)
7588   {
7589     hi2c->XferOptions = I2C_FIRST_FRAME;
7590   }
7591   /* else if user set XferOptions to I2C_OTHER_AND_LAST_FRAME */
7592   /* it request implicitly to generate a restart condition    */
7593   /* then generate a stop condition at the end of transfer    */
7594   /* set XferOptions to I2C_FIRST_AND_LAST_FRAME              */
7595   else if (hi2c->XferOptions == I2C_OTHER_AND_LAST_FRAME)
7596   {
7597     hi2c->XferOptions = I2C_FIRST_AND_LAST_FRAME;
7598   }
7599   else
7600   {
7601     /* Nothing to do */
7602   }
7603 }
7604 
7605 /**
7606   * @}
7607   */
7608 
7609 #endif /* HAL_I2C_MODULE_ENABLED */
7610 /**
7611   * @}
7612   */
7613 
7614 /**
7615   * @}
7616   */
7617 
7618 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
7619