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