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