2 ******************************************************************************
\r
3 * @file stm32f7xx_hal_i2c.c
\r
4 * @author MCD Application Team
\r
7 * @brief I2C HAL module driver.
\r
8 * This file provides firmware functions to manage the following
\r
9 * functionalities of the Inter Integrated Circuit (I2C) peripheral:
\r
10 * + Initialization and de-initialization functions
\r
11 * + IO operation functions
\r
12 * + Peripheral State and Errors functions
\r
15 ==============================================================================
\r
16 ##### How to use this driver #####
\r
17 ==============================================================================
\r
19 The I2C HAL driver can be used as follows:
\r
21 (#) Declare a I2C_HandleTypeDef handle structure, for example:
\r
22 I2C_HandleTypeDef hi2c;
\r
24 (#)Initialize the I2C low level resources by implement the HAL_I2C_MspInit ()API:
\r
25 (##) Enable the I2Cx interface clock
\r
26 (##) I2C pins configuration
\r
27 (+++) Enable the clock for the I2C GPIOs
\r
28 (+++) Configure I2C pins as alternate function open-drain
\r
29 (##) NVIC configuration if you need to use interrupt process
\r
30 (+++) Configure the I2Cx interrupt priority
\r
31 (+++) Enable the NVIC I2C IRQ Channel
\r
32 (##) DMA Configuration if you need to use DMA process
\r
33 (+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive stream
\r
34 (+++) Enable the DMAx interface clock using
\r
35 (+++) Configure the DMA handle parameters
\r
36 (+++) Configure the DMA Tx or Rx Stream
\r
37 (+++) Associate the initialized DMA handle to the hi2c DMA Tx or Rx handle
\r
38 (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx or Rx Stream
\r
40 (#) Configure the Communication Clock Timing, Own Address1, Master Addressing Mode, Dual Addressing mode,
\r
41 Own Address2, Own Address2 Mask, General call and Nostretch mode in the hi2c Init structure.
\r
43 (#) Initialize the I2C registers by calling the HAL_I2C_Init(), configures also the low level Hardware
\r
44 (GPIO, CLOCK, NVIC...etc) by calling the customed HAL_I2C_MspInit(&hi2c) API.
\r
46 (#) To check if target device is ready for communication, use the function HAL_I2C_IsDeviceReady()
\r
48 (#) For I2C IO and IO MEM operations, three operation modes are available within this driver :
\r
50 *** Polling mode IO operation ***
\r
51 =================================
\r
53 (+) Transmit in master mode an amount of data in blocking mode using HAL_I2C_Master_Transmit()
\r
54 (+) Receive in master mode an amount of data in blocking mode using HAL_I2C_Master_Receive()
\r
55 (+) Transmit in slave mode an amount of data in blocking mode using HAL_I2C_Slave_Transmit()
\r
56 (+) Receive in slave mode an amount of data in blocking mode using HAL_I2C_Slave_Receive()
\r
58 *** Polling mode IO MEM operation ***
\r
59 =====================================
\r
61 (+) Write an amount of data in blocking mode to a specific memory address using HAL_I2C_Mem_Write()
\r
62 (+) Read an amount of data in blocking mode from a specific memory address using HAL_I2C_Mem_Read()
\r
65 *** Interrupt mode IO operation ***
\r
66 ===================================
\r
68 (+) Transmit in master mode an amount of data in non blocking mode using HAL_I2C_Master_Transmit_IT()
\r
69 (+) At transmission end of transfer HAL_I2C_MasterTxCpltCallback is executed and user can
\r
70 add his own code by customization of function pointer HAL_I2C_MasterTxCpltCallback
\r
71 (+) Receive in master mode an amount of data in non blocking mode using HAL_I2C_Master_Receive_IT()
\r
72 (+) At reception end of transfer HAL_I2C_MasterRxCpltCallback is executed and user can
\r
73 add his own code by customization of function pointer HAL_I2C_MasterRxCpltCallback
\r
74 (+) Transmit in slave mode an amount of data in non blocking mode using HAL_I2C_Slave_Transmit_IT()
\r
75 (+) At transmission end of transfer HAL_I2C_SlaveTxCpltCallback is executed and user can
\r
76 add his own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback
\r
77 (+) Receive in slave mode an amount of data in non blocking mode using HAL_I2C_Slave_Receive_IT()
\r
78 (+) At reception end of transfer HAL_I2C_SlaveRxCpltCallback is executed and user can
\r
79 add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback
\r
80 (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can
\r
81 add his own code by customization of function pointer HAL_I2C_ErrorCallback
\r
83 *** Interrupt mode IO MEM operation ***
\r
84 =======================================
\r
86 (+) Write an amount of data in no-blocking mode with Interrupt to a specific memory address using
\r
87 HAL_I2C_Mem_Write_IT()
\r
88 (+) At MEM end of write transfer HAL_I2C_MemTxCpltCallback is executed and user can
\r
89 add his own code by customization of function pointer HAL_I2C_MemTxCpltCallback
\r
90 (+) Read an amount of data in no-blocking mode with Interrupt from a specific memory address using
\r
91 HAL_I2C_Mem_Read_IT()
\r
92 (+) At MEM end of read transfer HAL_I2C_MemRxCpltCallback is executed and user can
\r
93 add his own code by customization of function pointer HAL_I2C_MemRxCpltCallback
\r
94 (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can
\r
95 add his own code by customization of function pointer HAL_I2C_ErrorCallback
\r
97 *** DMA mode IO operation ***
\r
98 ==============================
\r
100 (+) Transmit in master mode an amount of data in non blocking mode (DMA) using
\r
101 HAL_I2C_Master_Transmit_DMA()
\r
102 (+) At transmission end of transfer HAL_I2C_MasterTxCpltCallback is executed and user can
\r
103 add his own code by customization of function pointer HAL_I2C_MasterTxCpltCallback
\r
104 (+) Receive in master mode an amount of data in non blocking mode (DMA) using
\r
105 HAL_I2C_Master_Receive_DMA()
\r
106 (+) At reception end of transfer HAL_I2C_MasterRxCpltCallback is executed and user can
\r
107 add his own code by customization of function pointer HAL_I2C_MasterRxCpltCallback
\r
108 (+) Transmit in slave mode an amount of data in non blocking mode (DMA) using
\r
109 HAL_I2C_Slave_Transmit_DMA()
\r
110 (+) At transmission end of transfer HAL_I2C_SlaveTxCpltCallback is executed and user can
\r
111 add his own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback
\r
112 (+) Receive in slave mode an amount of data in non blocking mode (DMA) using
\r
113 HAL_I2C_Slave_Receive_DMA()
\r
114 (+) At reception end of transfer HAL_I2C_SlaveRxCpltCallback is executed and user can
\r
115 add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback
\r
116 (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can
\r
117 add his own code by customization of function pointer HAL_I2C_ErrorCallback
\r
119 *** DMA mode IO MEM operation ***
\r
120 =================================
\r
122 (+) Write an amount of data in no-blocking mode with DMA to a specific memory address using
\r
123 HAL_I2C_Mem_Write_DMA()
\r
124 (+) At MEM end of write transfer HAL_I2C_MemTxCpltCallback is executed and user can
\r
125 add his own code by customization of function pointer HAL_I2C_MemTxCpltCallback
\r
126 (+) Read an amount of data in no-blocking mode with DMA from a specific memory address using
\r
127 HAL_I2C_Mem_Read_DMA()
\r
128 (+) At MEM end of read transfer HAL_I2C_MemRxCpltCallback is executed and user can
\r
129 add his own code by customization of function pointer HAL_I2C_MemRxCpltCallback
\r
130 (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can
\r
131 add his own code by customization of function pointer HAL_I2C_ErrorCallback
\r
134 *** I2C HAL driver macros list ***
\r
135 ==================================
\r
137 Below the list of most used macros in I2C HAL driver.
\r
139 (+) __HAL_I2C_ENABLE: Enable the I2C peripheral
\r
140 (+) __HAL_I2C_DISABLE: Disable the I2C peripheral
\r
141 (+) __HAL_I2C_GET_FLAG : Checks whether the specified I2C flag is set or not
\r
142 (+) __HAL_I2C_CLEAR_FLAG : Clear the specified I2C pending flag
\r
143 (+) __HAL_I2C_ENABLE_IT: Enable the specified I2C interrupt
\r
144 (+) __HAL_I2C_DISABLE_IT: Disable the specified I2C interrupt
\r
147 (@) You can refer to the I2C HAL driver header file for more useful macros
\r
150 ******************************************************************************
\r
153 * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
\r
155 * Redistribution and use in source and binary forms, with or without modification,
\r
156 * are permitted provided that the following conditions are met:
\r
157 * 1. Redistributions of source code must retain the above copyright notice,
\r
158 * this list of conditions and the following disclaimer.
\r
159 * 2. Redistributions in binary form must reproduce the above copyright notice,
\r
160 * this list of conditions and the following disclaimer in the documentation
\r
161 * and/or other materials provided with the distribution.
\r
162 * 3. Neither the name of STMicroelectronics nor the names of its contributors
\r
163 * may be used to endorse or promote products derived from this software
\r
164 * without specific prior written permission.
\r
166 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
\r
167 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
\r
168 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
\r
169 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
\r
170 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
\r
171 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
\r
172 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
\r
173 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
\r
174 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
\r
175 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\r
177 ******************************************************************************
\r
180 /* Includes ------------------------------------------------------------------*/
\r
181 #include "stm32f7xx_hal.h"
\r
183 /** @addtogroup STM32F7xx_HAL_Driver
\r
187 /** @defgroup I2C I2C
\r
188 * @brief I2C HAL module driver
\r
192 #ifdef HAL_I2C_MODULE_ENABLED
\r
194 /* Private typedef -----------------------------------------------------------*/
\r
195 /* Private constants ---------------------------------------------------------*/
\r
196 /** @addtogroup I2C_Private_Constants I2C Private Constants
\r
199 #define TIMING_CLEAR_MASK ((uint32_t)0xF0FFFFFF) /*<! I2C TIMING clear register Mask */
\r
200 #define I2C_TIMEOUT_ADDR ((uint32_t)10000) /* 10 s */
\r
201 #define I2C_TIMEOUT_BUSY ((uint32_t)25) /* 25 ms */
\r
202 #define I2C_TIMEOUT_DIR ((uint32_t)25) /* 25 ms */
\r
203 #define I2C_TIMEOUT_RXNE ((uint32_t)25) /* 25 ms */
\r
204 #define I2C_TIMEOUT_STOPF ((uint32_t)25) /* 25 ms */
\r
205 #define I2C_TIMEOUT_TC ((uint32_t)25) /* 25 ms */
\r
206 #define I2C_TIMEOUT_TCR ((uint32_t)25) /* 25 ms */
\r
207 #define I2C_TIMEOUT_TXIS ((uint32_t)25) /* 25 ms */
\r
208 #define I2C_TIMEOUT_FLAG ((uint32_t)25) /* 25 ms */
\r
213 /* Private macro -------------------------------------------------------------*/
\r
214 /* Private variables ---------------------------------------------------------*/
\r
215 /* Private function prototypes -----------------------------------------------*/
\r
216 /** @addtogroup I2C_Private_Functions I2C Private Functions
\r
219 static void I2C_DMAMasterTransmitCplt(DMA_HandleTypeDef *hdma);
\r
220 static void I2C_DMAMasterReceiveCplt(DMA_HandleTypeDef *hdma);
\r
221 static void I2C_DMASlaveTransmitCplt(DMA_HandleTypeDef *hdma);
\r
222 static void I2C_DMASlaveReceiveCplt(DMA_HandleTypeDef *hdma);
\r
223 static void I2C_DMAMemTransmitCplt(DMA_HandleTypeDef *hdma);
\r
224 static void I2C_DMAMemReceiveCplt(DMA_HandleTypeDef *hdma);
\r
225 static void I2C_DMAError(DMA_HandleTypeDef *hdma);
\r
227 static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout);
\r
228 static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout);
\r
229 static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout);
\r
230 static HAL_StatusTypeDef I2C_WaitOnTXISFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout);
\r
231 static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout);
\r
232 static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout);
\r
233 static HAL_StatusTypeDef I2C_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c, uint32_t Timeout);
\r
235 static HAL_StatusTypeDef I2C_MasterTransmit_ISR(I2C_HandleTypeDef *hi2c);
\r
236 static HAL_StatusTypeDef I2C_MasterReceive_ISR(I2C_HandleTypeDef *hi2c);
\r
238 static HAL_StatusTypeDef I2C_SlaveTransmit_ISR(I2C_HandleTypeDef *hi2c);
\r
239 static HAL_StatusTypeDef I2C_SlaveReceive_ISR(I2C_HandleTypeDef *hi2c);
\r
241 static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request);
\r
246 /* Exported functions --------------------------------------------------------*/
\r
248 /** @defgroup I2C_Exported_Functions I2C Exported Functions
\r
252 /** @defgroup I2C_Exported_Functions_Group1 Initialization and de-initialization functions
\r
253 * @brief Initialization and Configuration functions
\r
256 ===============================================================================
\r
257 ##### Initialization and de-initialization functions #####
\r
258 ===============================================================================
\r
259 [..] This subsection provides a set of functions allowing to initialize and
\r
260 de-initialize the I2Cx peripheral:
\r
262 (+) User must Implement HAL_I2C_MspInit() function in which he configures
\r
263 all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC ).
\r
265 (+) Call the function HAL_I2C_Init() to configure the selected device with
\r
266 the selected configuration:
\r
269 (++) Addressing mode (Master, Slave)
\r
270 (++) Dual Addressing mode
\r
272 (++) Own Address 2 Mask
\r
273 (++) General call mode
\r
274 (++) Nostretch mode
\r
276 (+) Call the function HAL_I2C_DeInit() to restore the default configuration
\r
277 of the selected I2Cx peripheral.
\r
284 * @brief Initializes the I2C according to the specified parameters
\r
285 * in the I2C_InitTypeDef and create the associated handle.
\r
286 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
287 * the configuration information for the specified I2C.
\r
288 * @retval HAL status
\r
290 HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c)
\r
292 /* Check the I2C handle allocation */
\r
298 /* Check the parameters */
\r
299 assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance));
\r
300 assert_param(IS_I2C_OWN_ADDRESS1(hi2c->Init.OwnAddress1));
\r
301 assert_param(IS_I2C_ADDRESSING_MODE(hi2c->Init.AddressingMode));
\r
302 assert_param(IS_I2C_DUAL_ADDRESS(hi2c->Init.DualAddressMode));
\r
303 assert_param(IS_I2C_OWN_ADDRESS2(hi2c->Init.OwnAddress2));
\r
304 assert_param(IS_I2C_OWN_ADDRESS2_MASK(hi2c->Init.OwnAddress2Masks));
\r
305 assert_param(IS_I2C_GENERAL_CALL(hi2c->Init.GeneralCallMode));
\r
306 assert_param(IS_I2C_NO_STRETCH(hi2c->Init.NoStretchMode));
\r
308 if(hi2c->State == HAL_I2C_STATE_RESET)
\r
310 /* Allocate lock resource and initialize it */
\r
311 hi2c->Lock = HAL_UNLOCKED;
\r
312 /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */
\r
313 HAL_I2C_MspInit(hi2c);
\r
316 hi2c->State = HAL_I2C_STATE_BUSY;
\r
318 /* Disable the selected I2C peripheral */
\r
319 __HAL_I2C_DISABLE(hi2c);
\r
321 /*---------------------------- I2Cx TIMINGR Configuration ------------------*/
\r
322 /* Configure I2Cx: Frequency range */
\r
323 hi2c->Instance->TIMINGR = hi2c->Init.Timing & TIMING_CLEAR_MASK;
\r
325 /*---------------------------- I2Cx OAR1 Configuration ---------------------*/
\r
326 /* Configure I2Cx: Own Address1 and ack own address1 mode */
\r
327 hi2c->Instance->OAR1 &= ~I2C_OAR1_OA1EN;
\r
328 if(hi2c->Init.OwnAddress1 != 0)
\r
330 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
\r
332 hi2c->Instance->OAR1 = (I2C_OAR1_OA1EN | hi2c->Init.OwnAddress1);
\r
334 else /* I2C_ADDRESSINGMODE_10BIT */
\r
336 hi2c->Instance->OAR1 = (I2C_OAR1_OA1EN | I2C_OAR1_OA1MODE | hi2c->Init.OwnAddress1);
\r
340 /*---------------------------- I2Cx CR2 Configuration ----------------------*/
\r
341 /* Configure I2Cx: Addressing Master mode */
\r
342 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT)
\r
344 hi2c->Instance->CR2 = (I2C_CR2_ADD10);
\r
346 /* Enable the AUTOEND by default, and enable NACK (should be disable only during Slave process */
\r
347 hi2c->Instance->CR2 |= (I2C_CR2_AUTOEND | I2C_CR2_NACK);
\r
349 /*---------------------------- I2Cx OAR2 Configuration ---------------------*/
\r
350 /* Configure I2Cx: Dual mode and Own Address2 */
\r
351 hi2c->Instance->OAR2 = (hi2c->Init.DualAddressMode | hi2c->Init.OwnAddress2 | (hi2c->Init.OwnAddress2Masks << 8));
\r
353 /*---------------------------- I2Cx CR1 Configuration ----------------------*/
\r
354 /* Configure I2Cx: Generalcall and NoStretch mode */
\r
355 hi2c->Instance->CR1 = (hi2c->Init.GeneralCallMode | hi2c->Init.NoStretchMode);
\r
357 /* Enable the selected I2C peripheral */
\r
358 __HAL_I2C_ENABLE(hi2c);
\r
360 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
\r
361 hi2c->State = HAL_I2C_STATE_READY;
\r
367 * @brief DeInitializes the I2C peripheral.
\r
368 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
369 * the configuration information for the specified I2C.
\r
370 * @retval HAL status
\r
372 HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c)
\r
374 /* Check the I2C handle allocation */
\r
380 /* Check the parameters */
\r
381 assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance));
\r
383 hi2c->State = HAL_I2C_STATE_BUSY;
\r
385 /* Disable the I2C Peripheral Clock */
\r
386 __HAL_I2C_DISABLE(hi2c);
\r
388 /* DeInit the low level hardware: GPIO, CLOCK, NVIC */
\r
389 HAL_I2C_MspDeInit(hi2c);
\r
391 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
\r
393 hi2c->State = HAL_I2C_STATE_RESET;
\r
396 __HAL_UNLOCK(hi2c);
\r
402 * @brief I2C MSP Init.
\r
403 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
404 * the configuration information for the specified I2C.
\r
407 __weak void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c)
\r
409 /* NOTE : This function Should not be modified, when the callback is needed,
\r
410 the HAL_I2C_MspInit could be implemented in the user file
\r
415 * @brief I2C MSP DeInit
\r
416 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
417 * the configuration information for the specified I2C.
\r
420 __weak void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c)
\r
422 /* NOTE : This function Should not be modified, when the callback is needed,
\r
423 the HAL_I2C_MspDeInit could be implemented in the user file
\r
431 /** @defgroup I2C_Exported_Functions_Group2 Input and Output operation functions
\r
432 * @brief Data transfers functions
\r
435 ===============================================================================
\r
436 ##### IO operation functions #####
\r
437 ===============================================================================
\r
439 This subsection provides a set of functions allowing to manage the I2C data
\r
442 (#) There are two modes of transfer:
\r
443 (++) Blocking mode : The communication is performed in the polling mode.
\r
444 The status of all data processing is returned by the same function
\r
445 after finishing transfer.
\r
446 (++) No-Blocking mode : The communication is performed using Interrupts
\r
447 or DMA. These functions return the status of the transfer startup.
\r
448 The end of the data processing will be indicated through the
\r
449 dedicated I2C IRQ when using Interrupt mode or the DMA IRQ when
\r
452 (#) Blocking mode functions are :
\r
453 (++) HAL_I2C_Master_Transmit()
\r
454 (++) HAL_I2C_Master_Receive()
\r
455 (++) HAL_I2C_Slave_Transmit()
\r
456 (++) HAL_I2C_Slave_Receive()
\r
457 (++) HAL_I2C_Mem_Write()
\r
458 (++) HAL_I2C_Mem_Read()
\r
459 (++) HAL_I2C_IsDeviceReady()
\r
461 (#) No-Blocking mode functions with Interrupt are :
\r
462 (++) HAL_I2C_Master_Transmit_IT()
\r
463 (++) HAL_I2C_Master_Receive_IT()
\r
464 (++) HAL_I2C_Slave_Transmit_IT()
\r
465 (++) HAL_I2C_Slave_Receive_IT()
\r
466 (++) HAL_I2C_Mem_Write_IT()
\r
467 (++) HAL_I2C_Mem_Read_IT()
\r
469 (#) No-Blocking mode functions with DMA are :
\r
470 (++) HAL_I2C_Master_Transmit_DMA()
\r
471 (++) HAL_I2C_Master_Receive_DMA()
\r
472 (++) HAL_I2C_Slave_Transmit_DMA()
\r
473 (++) HAL_I2C_Slave_Receive_DMA()
\r
474 (++) HAL_I2C_Mem_Write_DMA()
\r
475 (++) HAL_I2C_Mem_Read_DMA()
\r
477 (#) A set of Transfer Complete Callbacks are provided in non Blocking mode:
\r
478 (++) HAL_I2C_MemTxCpltCallback()
\r
479 (++) HAL_I2C_MemRxCpltCallback()
\r
480 (++) HAL_I2C_MasterTxCpltCallback()
\r
481 (++) HAL_I2C_MasterRxCpltCallback()
\r
482 (++) HAL_I2C_SlaveTxCpltCallback()
\r
483 (++) HAL_I2C_SlaveRxCpltCallback()
\r
484 (++) HAL_I2C_ErrorCallback()
\r
491 * @brief Transmits in master mode an amount of data in blocking mode.
\r
492 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
493 * the configuration information for the specified I2C.
\r
494 * @param DevAddress: Target device address
\r
495 * @param pData: Pointer to data buffer
\r
496 * @param Size: Amount of data to be sent
\r
497 * @param Timeout: Timeout duration
\r
498 * @retval HAL status
\r
500 HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
\r
502 uint32_t sizetmp = 0;
\r
504 if(hi2c->State == HAL_I2C_STATE_READY)
\r
506 if((pData == NULL ) || (Size == 0))
\r
511 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
\r
516 /* Process Locked */
\r
519 hi2c->State = HAL_I2C_STATE_MASTER_BUSY_TX;
\r
520 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
\r
522 /* Send Slave Address */
\r
523 /* Set NBYTES to write and reload if size > 255 and generate RESTART */
\r
524 /* Size > 255, need to set RELOAD bit */
\r
527 I2C_TransferConfig(hi2c,DevAddress,255, I2C_RELOAD_MODE, I2C_GENERATE_START_WRITE);
\r
532 I2C_TransferConfig(hi2c,DevAddress,Size, I2C_AUTOEND_MODE, I2C_GENERATE_START_WRITE);
\r
538 /* Wait until TXIS flag is set */
\r
539 if(I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout) != HAL_OK)
\r
541 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
547 return HAL_TIMEOUT;
\r
550 /* Write data to TXDR */
\r
551 hi2c->Instance->TXDR = (*pData++);
\r
555 if((sizetmp == 0)&&(Size!=0))
\r
557 /* Wait until TXE flag is set */
\r
558 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout) != HAL_OK)
\r
560 return HAL_TIMEOUT;
\r
565 I2C_TransferConfig(hi2c,DevAddress,255, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
\r
570 I2C_TransferConfig(hi2c,DevAddress,Size, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
\r
577 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
\r
578 /* Wait until STOPF flag is set */
\r
579 if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout) != HAL_OK)
\r
581 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
587 return HAL_TIMEOUT;
\r
591 /* Clear STOP Flag */
\r
592 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
\r
594 /* Clear Configuration Register 2 */
\r
595 I2C_RESET_CR2(hi2c);
\r
597 hi2c->State = HAL_I2C_STATE_READY;
\r
599 /* Process Unlocked */
\r
600 __HAL_UNLOCK(hi2c);
\r
611 * @brief Receives in master mode an amount of data in blocking mode.
\r
612 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
613 * the configuration information for the specified I2C.
\r
614 * @param DevAddress: Target device address
\r
615 * @param pData: Pointer to data buffer
\r
616 * @param Size: Amount of data to be sent
\r
617 * @param Timeout: Timeout duration
\r
618 * @retval HAL status
\r
620 HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
\r
622 uint32_t sizetmp = 0;
\r
624 if(hi2c->State == HAL_I2C_STATE_READY)
\r
626 if((pData == NULL ) || (Size == 0))
\r
631 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
\r
636 /* Process Locked */
\r
639 hi2c->State = HAL_I2C_STATE_MASTER_BUSY_RX;
\r
640 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
\r
642 /* Send Slave Address */
\r
643 /* Set NBYTES to write and reload if size > 255 and generate RESTART */
\r
644 /* Size > 255, need to set RELOAD bit */
\r
647 I2C_TransferConfig(hi2c,DevAddress,255, I2C_RELOAD_MODE, I2C_GENERATE_START_READ);
\r
652 I2C_TransferConfig(hi2c,DevAddress,Size, I2C_AUTOEND_MODE, I2C_GENERATE_START_READ);
\r
658 /* Wait until RXNE flag is set */
\r
659 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, Timeout) != HAL_OK)
\r
661 return HAL_TIMEOUT;
\r
664 /* Write data to RXDR */
\r
665 (*pData++) =hi2c->Instance->RXDR;
\r
669 if((sizetmp == 0)&&(Size!=0))
\r
671 /* Wait until TCR flag is set */
\r
672 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout) != HAL_OK)
\r
674 return HAL_TIMEOUT;
\r
679 I2C_TransferConfig(hi2c,DevAddress,255, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
\r
684 I2C_TransferConfig(hi2c,DevAddress,Size, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
\r
691 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
\r
692 /* Wait until STOPF flag is set */
\r
693 if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, I2C_TIMEOUT_STOPF) != HAL_OK)
\r
695 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
701 return HAL_TIMEOUT;
\r
705 /* Clear STOP Flag */
\r
706 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
\r
708 /* Clear Configuration Register 2 */
\r
709 I2C_RESET_CR2(hi2c);
\r
711 hi2c->State = HAL_I2C_STATE_READY;
\r
713 /* Process Unlocked */
\r
714 __HAL_UNLOCK(hi2c);
\r
725 * @brief Transmits in slave mode an amount of data in blocking mode.
\r
726 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
727 * the configuration information for the specified I2C.
\r
728 * @param pData: Pointer to data buffer
\r
729 * @param Size: Amount of data to be sent
\r
730 * @param Timeout: Timeout duration
\r
731 * @retval HAL status
\r
733 HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout)
\r
735 if(hi2c->State == HAL_I2C_STATE_READY)
\r
737 if((pData == NULL ) || (Size == 0))
\r
742 /* Process Locked */
\r
745 hi2c->State = HAL_I2C_STATE_SLAVE_BUSY_RX;
\r
746 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
\r
748 /* Enable Address Acknowledge */
\r
749 hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
\r
751 /* Wait until ADDR flag is set */
\r
752 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout) != HAL_OK)
\r
754 /* Disable Address Acknowledge */
\r
755 hi2c->Instance->CR2 |= I2C_CR2_NACK;
\r
756 return HAL_TIMEOUT;
\r
759 /* Clear ADDR flag */
\r
760 __HAL_I2C_CLEAR_FLAG(hi2c,I2C_FLAG_ADDR);
\r
762 /* If 10bit addressing mode is selected */
\r
763 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT)
\r
765 /* Wait until ADDR flag is set */
\r
766 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout) != HAL_OK)
\r
768 /* Disable Address Acknowledge */
\r
769 hi2c->Instance->CR2 |= I2C_CR2_NACK;
\r
770 return HAL_TIMEOUT;
\r
773 /* Clear ADDR flag */
\r
774 __HAL_I2C_CLEAR_FLAG(hi2c,I2C_FLAG_ADDR);
\r
777 /* Wait until DIR flag is set Transmitter mode */
\r
778 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_DIR, RESET, Timeout) != HAL_OK)
\r
780 /* Disable Address Acknowledge */
\r
781 hi2c->Instance->CR2 |= I2C_CR2_NACK;
\r
782 return HAL_TIMEOUT;
\r
787 /* Wait until TXIS flag is set */
\r
788 if(I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout) != HAL_OK)
\r
790 /* Disable Address Acknowledge */
\r
791 hi2c->Instance->CR2 |= I2C_CR2_NACK;
\r
793 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
799 return HAL_TIMEOUT;
\r
803 /* Read data from TXDR */
\r
804 hi2c->Instance->TXDR = (*pData++);
\r
808 /* Wait until STOP flag is set */
\r
809 if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, I2C_TIMEOUT_STOPF) != HAL_OK)
\r
811 /* Disable Address Acknowledge */
\r
812 hi2c->Instance->CR2 |= I2C_CR2_NACK;
\r
814 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
816 /* Normal use case for Transmitter mode */
\r
817 /* A NACK is generated to confirm the end of transfer */
\r
818 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
\r
822 return HAL_TIMEOUT;
\r
826 /* Clear STOP flag */
\r
827 __HAL_I2C_CLEAR_FLAG(hi2c,I2C_FLAG_STOPF);
\r
829 /* Wait until BUSY flag is reset */
\r
830 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout) != HAL_OK)
\r
832 /* Disable Address Acknowledge */
\r
833 hi2c->Instance->CR2 |= I2C_CR2_NACK;
\r
834 return HAL_TIMEOUT;
\r
837 /* Disable Address Acknowledge */
\r
838 hi2c->Instance->CR2 |= I2C_CR2_NACK;
\r
840 hi2c->State = HAL_I2C_STATE_READY;
\r
842 /* Process Unlocked */
\r
843 __HAL_UNLOCK(hi2c);
\r
854 * @brief Receive in slave mode an amount of data in blocking mode
\r
855 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
856 * the configuration information for the specified I2C.
\r
857 * @param pData: Pointer to data buffer
\r
858 * @param Size: Amount of data to be sent
\r
859 * @param Timeout: Timeout duration
\r
860 * @retval HAL status
\r
862 HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout)
\r
864 if(hi2c->State == HAL_I2C_STATE_READY)
\r
866 if((pData == NULL ) || (Size == 0))
\r
871 /* Process Locked */
\r
874 hi2c->State = HAL_I2C_STATE_SLAVE_BUSY_RX;
\r
875 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
\r
877 /* Enable Address Acknowledge */
\r
878 hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
\r
880 /* Wait until ADDR flag is set */
\r
881 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout) != HAL_OK)
\r
883 /* Disable Address Acknowledge */
\r
884 hi2c->Instance->CR2 |= I2C_CR2_NACK;
\r
885 return HAL_TIMEOUT;
\r
888 /* Clear ADDR flag */
\r
889 __HAL_I2C_CLEAR_FLAG(hi2c,I2C_FLAG_ADDR);
\r
891 /* Wait until DIR flag is reset Receiver mode */
\r
892 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_DIR, SET, Timeout) != HAL_OK)
\r
894 /* Disable Address Acknowledge */
\r
895 hi2c->Instance->CR2 |= I2C_CR2_NACK;
\r
896 return HAL_TIMEOUT;
\r
901 /* Wait until RXNE flag is set */
\r
902 if(I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout) != HAL_OK)
\r
904 /* Disable Address Acknowledge */
\r
905 hi2c->Instance->CR2 |= I2C_CR2_NACK;
\r
906 if(hi2c->ErrorCode == HAL_I2C_ERROR_TIMEOUT)
\r
908 return HAL_TIMEOUT;
\r
916 /* Read data from RXDR */
\r
917 (*pData++) = hi2c->Instance->RXDR;
\r
921 /* Wait until STOP flag is set */
\r
922 if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, I2C_TIMEOUT_STOPF) != HAL_OK)
\r
924 /* Disable Address Acknowledge */
\r
925 hi2c->Instance->CR2 |= I2C_CR2_NACK;
\r
927 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
933 return HAL_TIMEOUT;
\r
937 /* Clear STOP flag */
\r
938 __HAL_I2C_CLEAR_FLAG(hi2c,I2C_FLAG_STOPF);
\r
940 /* Wait until BUSY flag is reset */
\r
941 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout) != HAL_OK)
\r
943 /* Disable Address Acknowledge */
\r
944 hi2c->Instance->CR2 |= I2C_CR2_NACK;
\r
945 return HAL_TIMEOUT;
\r
949 /* Disable Address Acknowledge */
\r
950 hi2c->Instance->CR2 |= I2C_CR2_NACK;
\r
952 hi2c->State = HAL_I2C_STATE_READY;
\r
954 /* Process Unlocked */
\r
955 __HAL_UNLOCK(hi2c);
\r
966 * @brief Transmit in master mode an amount of data in no-blocking mode with Interrupt
\r
967 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
968 * the configuration information for the specified I2C.
\r
969 * @param DevAddress: Target device address
\r
970 * @param pData: Pointer to data buffer
\r
971 * @param Size: Amount of data to be sent
\r
972 * @retval HAL status
\r
974 HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
\r
976 if(hi2c->State == HAL_I2C_STATE_READY)
\r
978 if((pData == NULL) || (Size == 0))
\r
983 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
\r
988 /* Process Locked */
\r
991 hi2c->State = HAL_I2C_STATE_MASTER_BUSY_TX;
\r
992 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
\r
994 hi2c->pBuffPtr = pData;
\r
995 hi2c->XferCount = Size;
\r
998 hi2c->XferSize = 255;
\r
1002 hi2c->XferSize = Size;
\r
1005 /* Send Slave Address */
\r
1006 /* Set NBYTES to write and reload if size > 255 and generate RESTART */
\r
1007 if( (hi2c->XferSize == 255) && (hi2c->XferSize < hi2c->XferCount) )
\r
1009 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferSize, I2C_RELOAD_MODE, I2C_GENERATE_START_WRITE);
\r
1013 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferSize, I2C_AUTOEND_MODE, I2C_GENERATE_START_WRITE);
\r
1016 /* Process Unlocked */
\r
1017 __HAL_UNLOCK(hi2c);
\r
1019 /* Note : The I2C interrupts must be enabled after unlocking current process
\r
1020 to avoid the risk of I2C interrupt handle execution before current
\r
1024 /* Enable ERR, TC, STOP, NACK, TXI interrupt */
\r
1025 /* possible to enable all of these */
\r
1026 /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */
\r
1027 __HAL_I2C_ENABLE_IT(hi2c,I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_TXI );
\r
1038 * @brief Receive in master mode an amount of data in no-blocking mode with Interrupt
\r
1039 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
1040 * the configuration information for the specified I2C.
\r
1041 * @param DevAddress: Target device address
\r
1042 * @param pData: Pointer to data buffer
\r
1043 * @param Size: Amount of data to be sent
\r
1044 * @retval HAL status
\r
1046 HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
\r
1048 if(hi2c->State == HAL_I2C_STATE_READY)
\r
1050 if((pData == NULL) || (Size == 0))
\r
1052 return HAL_ERROR;
\r
1055 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
\r
1060 /* Process Locked */
\r
1063 hi2c->State = HAL_I2C_STATE_MASTER_BUSY_RX;
\r
1064 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
\r
1066 hi2c->pBuffPtr = pData;
\r
1067 hi2c->XferCount = Size;
\r
1070 hi2c->XferSize = 255;
\r
1074 hi2c->XferSize = Size;
\r
1077 /* Send Slave Address */
\r
1078 /* Set NBYTES to write and reload if size > 255 and generate RESTART */
\r
1079 if( (hi2c->XferSize == 255) && (hi2c->XferSize < hi2c->XferCount) )
\r
1081 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferSize, I2C_RELOAD_MODE, I2C_GENERATE_START_READ);
\r
1085 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferSize, I2C_AUTOEND_MODE, I2C_GENERATE_START_READ);
\r
1088 /* Process Unlocked */
\r
1089 __HAL_UNLOCK(hi2c);
\r
1091 /* Note : The I2C interrupts must be enabled after unlocking current process
\r
1092 to avoid the risk of I2C interrupt handle execution before current
\r
1095 /* Enable ERR, TC, STOP, NACK, RXI interrupt */
\r
1096 /* possible to enable all of these */
\r
1097 /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */
\r
1098 __HAL_I2C_ENABLE_IT(hi2c,I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_RXI );
\r
1109 * @brief Transmit in slave mode an amount of data in no-blocking mode with Interrupt
\r
1110 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
1111 * the configuration information for the specified I2C.
\r
1112 * @param pData: Pointer to data buffer
\r
1113 * @param Size: Amount of data to be sent
\r
1114 * @retval HAL status
\r
1116 HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
\r
1118 if(hi2c->State == HAL_I2C_STATE_READY)
\r
1120 if((pData == NULL) || (Size == 0))
\r
1122 return HAL_ERROR;
\r
1125 /* Process Locked */
\r
1128 hi2c->State = HAL_I2C_STATE_SLAVE_BUSY_TX;
\r
1129 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
\r
1131 /* Enable Address Acknowledge */
\r
1132 hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
\r
1134 hi2c->pBuffPtr = pData;
\r
1135 hi2c->XferSize = Size;
\r
1136 hi2c->XferCount = Size;
\r
1138 /* Process Unlocked */
\r
1139 __HAL_UNLOCK(hi2c);
\r
1141 /* Note : The I2C interrupts must be enabled after unlocking current process
\r
1142 to avoid the risk of I2C interrupt handle execution before current
\r
1145 /* Enable ERR, TC, STOP, NACK, TXI interrupt */
\r
1146 /* possible to enable all of these */
\r
1147 /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */
\r
1148 __HAL_I2C_ENABLE_IT(hi2c,I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_TXI );
\r
1159 * @brief Receive in slave mode an amount of data in no-blocking mode with Interrupt
\r
1160 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
1161 * the configuration information for the specified I2C.
\r
1162 * @param pData: Pointer to data buffer
\r
1163 * @param Size: Amount of data to be sent
\r
1164 * @retval HAL status
\r
1166 HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
\r
1168 if(hi2c->State == HAL_I2C_STATE_READY)
\r
1170 if((pData == NULL) || (Size == 0))
\r
1172 return HAL_ERROR;
\r
1175 /* Process Locked */
\r
1178 hi2c->State = HAL_I2C_STATE_SLAVE_BUSY_RX;
\r
1179 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
\r
1181 /* Enable Address Acknowledge */
\r
1182 hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
\r
1184 hi2c->pBuffPtr = pData;
\r
1185 hi2c->XferSize = Size;
\r
1186 hi2c->XferCount = Size;
\r
1188 /* Process Unlocked */
\r
1189 __HAL_UNLOCK(hi2c);
\r
1191 /* Note : The I2C interrupts must be enabled after unlocking current process
\r
1192 to avoid the risk of I2C interrupt handle execution before current
\r
1195 /* Enable ERR, TC, STOP, NACK, RXI interrupt */
\r
1196 /* possible to enable all of these */
\r
1197 /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */
\r
1198 __HAL_I2C_ENABLE_IT(hi2c,I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI);
\r
1209 * @brief Transmit in master mode an amount of data in no-blocking mode with DMA
\r
1210 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
1211 * the configuration information for the specified I2C.
\r
1212 * @param DevAddress: Target device address
\r
1213 * @param pData: Pointer to data buffer
\r
1214 * @param Size: Amount of data to be sent
\r
1215 * @retval HAL status
\r
1217 HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
\r
1219 if(hi2c->State == HAL_I2C_STATE_READY)
\r
1221 if((pData == NULL) || (Size == 0))
\r
1223 return HAL_ERROR;
\r
1226 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
\r
1231 /* Process Locked */
\r
1234 hi2c->State = HAL_I2C_STATE_MASTER_BUSY_TX;
\r
1235 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
\r
1237 hi2c->pBuffPtr = pData;
\r
1238 hi2c->XferCount = Size;
\r
1241 hi2c->XferSize = 255;
\r
1245 hi2c->XferSize = Size;
\r
1248 /* Set the I2C DMA transfer complete callback */
\r
1249 hi2c->hdmatx->XferCpltCallback = I2C_DMAMasterTransmitCplt;
\r
1251 /* Set the DMA error callback */
\r
1252 hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
\r
1254 /* Enable the DMA channel */
\r
1255 HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->TXDR, hi2c->XferSize);
\r
1257 /* Send Slave Address */
\r
1258 /* Set NBYTES to write and reload if size > 255 and generate RESTART */
\r
1259 if( (hi2c->XferSize == 255) && (hi2c->XferSize < hi2c->XferCount) )
\r
1261 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferSize, I2C_RELOAD_MODE, I2C_GENERATE_START_WRITE);
\r
1265 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferSize, I2C_AUTOEND_MODE, I2C_GENERATE_START_WRITE);
\r
1268 /* Wait until TXIS flag is set */
\r
1269 if(I2C_WaitOnTXISFlagUntilTimeout(hi2c, I2C_TIMEOUT_TXIS) != HAL_OK)
\r
1271 /* Disable Address Acknowledge */
\r
1272 hi2c->Instance->CR2 |= I2C_CR2_NACK;
\r
1274 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
1280 return HAL_TIMEOUT;
\r
1285 /* Enable DMA Request */
\r
1286 hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;
\r
1288 /* Process Unlocked */
\r
1289 __HAL_UNLOCK(hi2c);
\r
1300 * @brief Receive in master mode an amount of data in no-blocking mode with DMA
\r
1301 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
1302 * the configuration information for the specified I2C.
\r
1303 * @param DevAddress: Target device address
\r
1304 * @param pData: Pointer to data buffer
\r
1305 * @param Size: Amount of data to be sent
\r
1306 * @retval HAL status
\r
1308 HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
\r
1310 if(hi2c->State == HAL_I2C_STATE_READY)
\r
1312 if((pData == NULL) || (Size == 0))
\r
1314 return HAL_ERROR;
\r
1317 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
\r
1322 /* Process Locked */
\r
1325 hi2c->State = HAL_I2C_STATE_MASTER_BUSY_RX;
\r
1326 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
\r
1328 hi2c->pBuffPtr = pData;
\r
1329 hi2c->XferCount = Size;
\r
1332 hi2c->XferSize = 255;
\r
1336 hi2c->XferSize = Size;
\r
1339 /* Set the I2C DMA transfer complete callback */
\r
1340 hi2c->hdmarx->XferCpltCallback = I2C_DMAMasterReceiveCplt;
\r
1342 /* Set the DMA error callback */
\r
1343 hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
\r
1345 /* Enable the DMA channel */
\r
1346 HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)pData, hi2c->XferSize);
\r
1348 /* Send Slave Address */
\r
1349 /* Set NBYTES to write and reload if size > 255 and generate RESTART */
\r
1350 if( (hi2c->XferSize == 255) && (hi2c->XferSize < hi2c->XferCount) )
\r
1352 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferSize, I2C_RELOAD_MODE, I2C_GENERATE_START_READ);
\r
1356 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferSize, I2C_AUTOEND_MODE, I2C_GENERATE_START_READ);
\r
1359 /* Wait until RXNE flag is set */
\r
1360 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, I2C_TIMEOUT_RXNE) != HAL_OK)
\r
1362 return HAL_TIMEOUT;
\r
1366 /* Enable DMA Request */
\r
1367 hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN;
\r
1369 /* Process Unlocked */
\r
1370 __HAL_UNLOCK(hi2c);
\r
1381 * @brief Transmit in slave mode an amount of data in no-blocking mode with DMA
\r
1382 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
1383 * the configuration information for the specified I2C.
\r
1384 * @param pData: Pointer to data buffer
\r
1385 * @param Size: Amount of data to be sent
\r
1386 * @retval HAL status
\r
1388 HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
\r
1390 if(hi2c->State == HAL_I2C_STATE_READY)
\r
1392 if((pData == NULL) || (Size == 0))
\r
1394 return HAL_ERROR;
\r
1396 /* Process Locked */
\r
1397 __HAL_LOCK(hi2c);
\r
1399 hi2c->State = HAL_I2C_STATE_SLAVE_BUSY_TX;
\r
1400 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
\r
1402 hi2c->pBuffPtr = pData;
\r
1403 hi2c->XferCount = Size;
\r
1404 hi2c->XferSize = Size;
\r
1406 /* Set the I2C DMA transfer complete callback */
\r
1407 hi2c->hdmatx->XferCpltCallback = I2C_DMASlaveTransmitCplt;
\r
1409 /* Set the DMA error callback */
\r
1410 hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
\r
1412 /* Enable the DMA channel */
\r
1413 HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->TXDR, hi2c->XferSize);
\r
1415 /* Enable Address Acknowledge */
\r
1416 hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
\r
1418 /* Wait until ADDR flag is set */
\r
1419 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, I2C_TIMEOUT_ADDR) != HAL_OK)
\r
1421 /* Disable Address Acknowledge */
\r
1422 hi2c->Instance->CR2 |= I2C_CR2_NACK;
\r
1423 return HAL_TIMEOUT;
\r
1426 /* Clear ADDR flag */
\r
1427 __HAL_I2C_CLEAR_FLAG(hi2c,I2C_FLAG_ADDR);
\r
1429 /* If 10bits addressing mode is selected */
\r
1430 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT)
\r
1432 /* Wait until ADDR flag is set */
\r
1433 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, I2C_TIMEOUT_ADDR) != HAL_OK)
\r
1435 /* Disable Address Acknowledge */
\r
1436 hi2c->Instance->CR2 |= I2C_CR2_NACK;
\r
1437 return HAL_TIMEOUT;
\r
1440 /* Clear ADDR flag */
\r
1441 __HAL_I2C_CLEAR_FLAG(hi2c,I2C_FLAG_ADDR);
\r
1444 /* Wait until DIR flag is set Transmitter mode */
\r
1445 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_DIR, RESET, I2C_TIMEOUT_BUSY) != HAL_OK)
\r
1447 /* Disable Address Acknowledge */
\r
1448 hi2c->Instance->CR2 |= I2C_CR2_NACK;
\r
1449 return HAL_TIMEOUT;
\r
1452 /* Enable DMA Request */
\r
1453 hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;
\r
1455 /* Process Unlocked */
\r
1456 __HAL_UNLOCK(hi2c);
\r
1467 * @brief Receive in slave mode an amount of data in no-blocking mode with DMA
\r
1468 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
1469 * the configuration information for the specified I2C.
\r
1470 * @param pData: Pointer to data buffer
\r
1471 * @param Size: Amount of data to be sent
\r
1472 * @retval HAL status
\r
1474 HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
\r
1476 if(hi2c->State == HAL_I2C_STATE_READY)
\r
1478 if((pData == NULL) || (Size == 0))
\r
1480 return HAL_ERROR;
\r
1482 /* Process Locked */
\r
1485 hi2c->State = HAL_I2C_STATE_SLAVE_BUSY_RX;
\r
1486 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
\r
1488 hi2c->pBuffPtr = pData;
\r
1489 hi2c->XferSize = Size;
\r
1490 hi2c->XferCount = Size;
\r
1492 /* Set the I2C DMA transfer complete callback */
\r
1493 hi2c->hdmarx->XferCpltCallback = I2C_DMASlaveReceiveCplt;
\r
1495 /* Set the DMA error callback */
\r
1496 hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
\r
1498 /* Enable the DMA channel */
\r
1499 HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)pData, Size);
\r
1501 /* Enable Address Acknowledge */
\r
1502 hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
\r
1504 /* Wait until ADDR flag is set */
\r
1505 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, I2C_TIMEOUT_ADDR) != HAL_OK)
\r
1507 /* Disable Address Acknowledge */
\r
1508 hi2c->Instance->CR2 |= I2C_CR2_NACK;
\r
1509 return HAL_TIMEOUT;
\r
1512 /* Clear ADDR flag */
\r
1513 __HAL_I2C_CLEAR_FLAG(hi2c,I2C_FLAG_ADDR);
\r
1515 /* Wait until DIR flag is set Receiver mode */
\r
1516 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_DIR, SET, I2C_TIMEOUT_DIR) != HAL_OK)
\r
1518 /* Disable Address Acknowledge */
\r
1519 hi2c->Instance->CR2 |= I2C_CR2_NACK;
\r
1520 return HAL_TIMEOUT;
\r
1523 /* Enable DMA Request */
\r
1524 hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN;
\r
1526 /* Process Unlocked */
\r
1527 __HAL_UNLOCK(hi2c);
\r
1537 * @brief Write an amount of data in blocking mode to a specific memory address
\r
1538 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
1539 * the configuration information for the specified I2C.
\r
1540 * @param DevAddress: Target device address
\r
1541 * @param MemAddress: Internal memory address
\r
1542 * @param MemAddSize: Size of internal memory address
\r
1543 * @param pData: Pointer to data buffer
\r
1544 * @param Size: Amount of data to be sent
\r
1545 * @param Timeout: Timeout duration
\r
1546 * @retval HAL status
\r
1548 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)
\r
1550 uint32_t Sizetmp = 0;
\r
1552 /* Check the parameters */
\r
1553 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
\r
1555 if(hi2c->State == HAL_I2C_STATE_READY)
\r
1557 if((pData == NULL) || (Size == 0))
\r
1559 return HAL_ERROR;
\r
1562 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
\r
1567 /* Process Locked */
\r
1570 hi2c->State = HAL_I2C_STATE_MEM_BUSY_TX;
\r
1571 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
\r
1573 /* Send Slave Address and Memory Address */
\r
1574 if(I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, Timeout) != HAL_OK)
\r
1576 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
1578 /* Process Unlocked */
\r
1579 __HAL_UNLOCK(hi2c);
\r
1584 /* Process Unlocked */
\r
1585 __HAL_UNLOCK(hi2c);
\r
1586 return HAL_TIMEOUT;
\r
1590 /* Set NBYTES to write and reload if size > 255 */
\r
1591 /* Size > 255, need to set RELOAD bit */
\r
1594 I2C_TransferConfig(hi2c,DevAddress,255, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
\r
1599 I2C_TransferConfig(hi2c,DevAddress,Size, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
\r
1605 /* Wait until TXIS flag is set */
\r
1606 if(I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout) != HAL_OK)
\r
1608 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
1614 return HAL_TIMEOUT;
\r
1618 /* Write data to DR */
\r
1619 hi2c->Instance->TXDR = (*pData++);
\r
1623 if((Sizetmp == 0)&&(Size!=0))
\r
1625 /* Wait until TCR flag is set */
\r
1626 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout) != HAL_OK)
\r
1628 return HAL_TIMEOUT;
\r
1634 I2C_TransferConfig(hi2c,DevAddress,255, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
\r
1639 I2C_TransferConfig(hi2c,DevAddress,Size, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
\r
1646 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
\r
1647 /* Wait until STOPF flag is reset */
\r
1648 if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, I2C_TIMEOUT_STOPF) != HAL_OK)
\r
1650 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
1656 return HAL_TIMEOUT;
\r
1660 /* Clear STOP Flag */
\r
1661 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
\r
1663 /* Clear Configuration Register 2 */
\r
1664 I2C_RESET_CR2(hi2c);
\r
1666 hi2c->State = HAL_I2C_STATE_READY;
\r
1668 /* Process Unlocked */
\r
1669 __HAL_UNLOCK(hi2c);
\r
1680 * @brief Read an amount of data in blocking mode from a specific memory address
\r
1681 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
1682 * the configuration information for the specified I2C.
\r
1683 * @param DevAddress: Target device address
\r
1684 * @param MemAddress: Internal memory address
\r
1685 * @param MemAddSize: Size of internal memory address
\r
1686 * @param pData: Pointer to data buffer
\r
1687 * @param Size: Amount of data to be sent
\r
1688 * @param Timeout: Timeout duration
\r
1689 * @retval HAL status
\r
1691 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)
\r
1693 uint32_t Sizetmp = 0;
\r
1695 /* Check the parameters */
\r
1696 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
\r
1698 if(hi2c->State == HAL_I2C_STATE_READY)
\r
1700 if((pData == NULL) || (Size == 0))
\r
1702 return HAL_ERROR;
\r
1705 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
\r
1710 /* Process Locked */
\r
1713 hi2c->State = HAL_I2C_STATE_MEM_BUSY_RX;
\r
1714 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
\r
1716 /* Send Slave Address and Memory Address */
\r
1717 if(I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, Timeout) != HAL_OK)
\r
1719 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
1721 /* Process Unlocked */
\r
1722 __HAL_UNLOCK(hi2c);
\r
1727 /* Process Unlocked */
\r
1728 __HAL_UNLOCK(hi2c);
\r
1729 return HAL_TIMEOUT;
\r
1733 /* Send Slave Address */
\r
1734 /* Set NBYTES to write and reload if size > 255 and generate RESTART */
\r
1735 /* Size > 255, need to set RELOAD bit */
\r
1738 I2C_TransferConfig(hi2c,DevAddress,255, I2C_RELOAD_MODE, I2C_GENERATE_START_READ);
\r
1743 I2C_TransferConfig(hi2c,DevAddress,Size, I2C_AUTOEND_MODE, I2C_GENERATE_START_READ);
\r
1749 /* Wait until RXNE flag is set */
\r
1750 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, Timeout) != HAL_OK)
\r
1752 return HAL_TIMEOUT;
\r
1755 /* Read data from RXDR */
\r
1756 (*pData++) = hi2c->Instance->RXDR;
\r
1758 /* Decrement the Size counter */
\r
1762 if((Sizetmp == 0)&&(Size!=0))
\r
1764 /* Wait until TCR flag is set */
\r
1765 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout) != HAL_OK)
\r
1767 return HAL_TIMEOUT;
\r
1772 I2C_TransferConfig(hi2c,DevAddress,255, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
\r
1777 I2C_TransferConfig(hi2c,DevAddress,Size, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
\r
1784 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
\r
1785 /* Wait until STOPF flag is reset */
\r
1786 if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, I2C_TIMEOUT_STOPF) != HAL_OK)
\r
1788 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
1794 return HAL_TIMEOUT;
\r
1798 /* Clear STOP Flag */
\r
1799 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
\r
1801 /* Clear Configuration Register 2 */
\r
1802 I2C_RESET_CR2(hi2c);
\r
1804 hi2c->State = HAL_I2C_STATE_READY;
\r
1806 /* Process Unlocked */
\r
1807 __HAL_UNLOCK(hi2c);
\r
1817 * @brief Write an amount of data in no-blocking mode with Interrupt to a specific memory address
\r
1818 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
1819 * the configuration information for the specified I2C.
\r
1820 * @param DevAddress: Target device address
\r
1821 * @param MemAddress: Internal memory address
\r
1822 * @param MemAddSize: Size of internal memory address
\r
1823 * @param pData: Pointer to data buffer
\r
1824 * @param Size: Amount of data to be sent
\r
1825 * @retval HAL status
\r
1827 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)
\r
1829 /* Check the parameters */
\r
1830 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
\r
1832 if(hi2c->State == HAL_I2C_STATE_READY)
\r
1834 if((pData == NULL) || (Size == 0))
\r
1836 return HAL_ERROR;
\r
1839 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
\r
1844 /* Process Locked */
\r
1847 hi2c->State = HAL_I2C_STATE_MEM_BUSY_TX;
\r
1848 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
\r
1850 hi2c->pBuffPtr = pData;
\r
1851 hi2c->XferCount = Size;
\r
1854 hi2c->XferSize = 255;
\r
1858 hi2c->XferSize = Size;
\r
1861 /* Send Slave Address and Memory Address */
\r
1862 if(I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG) != HAL_OK)
\r
1864 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
1866 /* Process Unlocked */
\r
1867 __HAL_UNLOCK(hi2c);
\r
1872 /* Process Unlocked */
\r
1873 __HAL_UNLOCK(hi2c);
\r
1874 return HAL_TIMEOUT;
\r
1878 /* Set NBYTES to write and reload if size > 255 */
\r
1879 /* Size > 255, need to set RELOAD bit */
\r
1880 if( (hi2c->XferSize == 255) && (hi2c->XferSize < hi2c->XferCount) )
\r
1882 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
\r
1886 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
\r
1889 /* Process Unlocked */
\r
1890 __HAL_UNLOCK(hi2c);
\r
1892 /* Note : The I2C interrupts must be enabled after unlocking current process
\r
1893 to avoid the risk of I2C interrupt handle execution before current
\r
1896 /* Enable ERR, TC, STOP, NACK, TXI interrupt */
\r
1897 /* possible to enable all of these */
\r
1898 /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */
\r
1899 __HAL_I2C_ENABLE_IT(hi2c,I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_TXI );
\r
1910 * @brief Read an amount of data in no-blocking mode with Interrupt from a specific memory address
\r
1911 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
1912 * the configuration information for the specified I2C.
\r
1913 * @param DevAddress: Target device address
\r
1914 * @param MemAddress: Internal memory address
\r
1915 * @param MemAddSize: Size of internal memory address
\r
1916 * @param pData: Pointer to data buffer
\r
1917 * @param Size: Amount of data to be sent
\r
1918 * @retval HAL status
\r
1920 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)
\r
1922 /* Check the parameters */
\r
1923 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
\r
1925 if(hi2c->State == HAL_I2C_STATE_READY)
\r
1927 if((pData == NULL) || (Size == 0))
\r
1929 return HAL_ERROR;
\r
1932 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
\r
1937 /* Process Locked */
\r
1940 hi2c->State = HAL_I2C_STATE_MEM_BUSY_RX;
\r
1942 hi2c->pBuffPtr = pData;
\r
1943 hi2c->XferCount = Size;
\r
1946 hi2c->XferSize = 255;
\r
1950 hi2c->XferSize = Size;
\r
1953 /* Send Slave Address and Memory Address */
\r
1954 if(I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG) != HAL_OK)
\r
1956 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
1958 /* Process Unlocked */
\r
1959 __HAL_UNLOCK(hi2c);
\r
1964 /* Process Unlocked */
\r
1965 __HAL_UNLOCK(hi2c);
\r
1966 return HAL_TIMEOUT;
\r
1970 /* Set NBYTES to write and reload if size > 255 and generate RESTART */
\r
1971 /* Size > 255, need to set RELOAD bit */
\r
1972 if( (hi2c->XferSize == 255) && (hi2c->XferSize < hi2c->XferCount) )
\r
1974 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferSize, I2C_RELOAD_MODE, I2C_GENERATE_START_READ);
\r
1978 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferSize, I2C_AUTOEND_MODE, I2C_GENERATE_START_READ);
\r
1981 /* Process Unlocked */
\r
1982 __HAL_UNLOCK(hi2c);
\r
1984 /* Note : The I2C interrupts must be enabled after unlocking current process
\r
1985 to avoid the risk of I2C interrupt handle execution before current
\r
1988 /* Enable ERR, TC, STOP, NACK, RXI interrupt */
\r
1989 /* possible to enable all of these */
\r
1990 /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */
\r
1991 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_RXI );
\r
2001 * @brief Write an amount of data in no-blocking mode with DMA to a specific memory address
\r
2002 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
2003 * the configuration information for the specified I2C.
\r
2004 * @param DevAddress: Target device address
\r
2005 * @param MemAddress: Internal memory address
\r
2006 * @param MemAddSize: Size of internal memory address
\r
2007 * @param pData: Pointer to data buffer
\r
2008 * @param Size: Amount of data to be sent
\r
2009 * @retval HAL status
\r
2011 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)
\r
2013 /* Check the parameters */
\r
2014 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
\r
2016 if(hi2c->State == HAL_I2C_STATE_READY)
\r
2018 if((pData == NULL) || (Size == 0))
\r
2020 return HAL_ERROR;
\r
2023 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
\r
2028 /* Process Locked */
\r
2031 hi2c->State = HAL_I2C_STATE_MEM_BUSY_TX;
\r
2032 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
\r
2034 hi2c->pBuffPtr = pData;
\r
2035 hi2c->XferCount = Size;
\r
2038 hi2c->XferSize = 255;
\r
2042 hi2c->XferSize = Size;
\r
2045 /* Set the I2C DMA transfer complete callback */
\r
2046 hi2c->hdmatx->XferCpltCallback = I2C_DMAMemTransmitCplt;
\r
2048 /* Set the DMA error callback */
\r
2049 hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
\r
2051 /* Enable the DMA channel */
\r
2052 HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->TXDR, hi2c->XferSize);
\r
2054 /* Send Slave Address and Memory Address */
\r
2055 if(I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG) != HAL_OK)
\r
2057 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
2059 /* Process Unlocked */
\r
2060 __HAL_UNLOCK(hi2c);
\r
2065 /* Process Unlocked */
\r
2066 __HAL_UNLOCK(hi2c);
\r
2067 return HAL_TIMEOUT;
\r
2071 /* Send Slave Address */
\r
2072 /* Set NBYTES to write and reload if size > 255 */
\r
2073 if( (hi2c->XferSize == 255) && (hi2c->XferSize < hi2c->XferCount) )
\r
2075 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
\r
2079 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
\r
2082 /* Wait until TXIS flag is set */
\r
2083 if(I2C_WaitOnTXISFlagUntilTimeout(hi2c, I2C_TIMEOUT_TXIS) != HAL_OK)
\r
2085 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
2091 return HAL_TIMEOUT;
\r
2095 /* Enable DMA Request */
\r
2096 hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;
\r
2098 /* Process Unlocked */
\r
2099 __HAL_UNLOCK(hi2c);
\r
2110 * @brief Reads an amount of data in no-blocking mode with DMA from a specific memory address.
\r
2111 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
2112 * the configuration information for the specified I2C.
\r
2113 * @param DevAddress: Target device address
\r
2114 * @param MemAddress: Internal memory address
\r
2115 * @param MemAddSize: Size of internal memory address
\r
2116 * @param pData: Pointer to data buffer
\r
2117 * @param Size: Amount of data to be read
\r
2118 * @retval HAL status
\r
2120 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)
\r
2122 /* Check the parameters */
\r
2123 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
\r
2125 if(hi2c->State == HAL_I2C_STATE_READY)
\r
2127 if((pData == NULL) || (Size == 0))
\r
2129 return HAL_ERROR;
\r
2132 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
\r
2137 /* Process Locked */
\r
2140 hi2c->State = HAL_I2C_STATE_MEM_BUSY_RX;
\r
2142 hi2c->pBuffPtr = pData;
\r
2143 hi2c->XferCount = Size;
\r
2146 hi2c->XferSize = 255;
\r
2150 hi2c->XferSize = Size;
\r
2153 /* Set the I2C DMA transfer complete callback */
\r
2154 hi2c->hdmarx->XferCpltCallback = I2C_DMAMemReceiveCplt;
\r
2156 /* Set the DMA error callback */
\r
2157 hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
\r
2159 /* Enable the DMA channel */
\r
2160 HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)pData, hi2c->XferSize);
\r
2162 /* Send Slave Address and Memory Address */
\r
2163 if(I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG) != HAL_OK)
\r
2165 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
2167 /* Process Unlocked */
\r
2168 __HAL_UNLOCK(hi2c);
\r
2173 /* Process Unlocked */
\r
2174 __HAL_UNLOCK(hi2c);
\r
2175 return HAL_TIMEOUT;
\r
2179 /* Set NBYTES to write and reload if size > 255 and generate RESTART */
\r
2180 if( (hi2c->XferSize == 255) && (hi2c->XferSize < hi2c->XferCount) )
\r
2182 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferSize, I2C_RELOAD_MODE, I2C_GENERATE_START_READ);
\r
2186 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferSize, I2C_AUTOEND_MODE, I2C_GENERATE_START_READ);
\r
2189 /* Wait until RXNE flag is set */
\r
2190 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, I2C_TIMEOUT_RXNE) != HAL_OK)
\r
2192 return HAL_TIMEOUT;
\r
2195 /* Enable DMA Request */
\r
2196 hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN;
\r
2198 /* Process Unlocked */
\r
2199 __HAL_UNLOCK(hi2c);
\r
2210 * @brief Checks if target device is ready for communication.
\r
2211 * @note This function is used with Memory devices
\r
2212 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
2213 * the configuration information for the specified I2C.
\r
2214 * @param DevAddress: Target device address
\r
2215 * @param Trials: Number of trials
\r
2216 * @param Timeout: Timeout duration
\r
2217 * @retval HAL status
\r
2219 HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout)
\r
2221 uint32_t tickstart = 0;
\r
2223 __IO uint32_t I2C_Trials = 0;
\r
2225 if(hi2c->State == HAL_I2C_STATE_READY)
\r
2227 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
\r
2232 /* Process Locked */
\r
2235 hi2c->State = HAL_I2C_STATE_BUSY;
\r
2236 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
\r
2240 /* Generate Start */
\r
2241 hi2c->Instance->CR2 = I2C_GENERATE_START(hi2c->Init.AddressingMode,DevAddress);
\r
2243 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
\r
2244 /* Wait until STOPF flag is set or a NACK flag is set*/
\r
2245 tickstart = HAL_GetTick();
\r
2246 while((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET) && (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == RESET) && (hi2c->State != HAL_I2C_STATE_TIMEOUT))
\r
2248 if(Timeout != HAL_MAX_DELAY)
\r
2250 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
\r
2252 /* Device is ready */
\r
2253 hi2c->State = HAL_I2C_STATE_READY;
\r
2254 /* Process Unlocked */
\r
2255 __HAL_UNLOCK(hi2c);
\r
2256 return HAL_TIMEOUT;
\r
2261 /* Check if the NACKF flag has not been set */
\r
2262 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == RESET)
\r
2264 /* Wait until STOPF flag is reset */
\r
2265 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_STOPF, RESET, Timeout) != HAL_OK)
\r
2267 return HAL_TIMEOUT;
\r
2270 /* Clear STOP Flag */
\r
2271 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
\r
2273 /* Device is ready */
\r
2274 hi2c->State = HAL_I2C_STATE_READY;
\r
2276 /* Process Unlocked */
\r
2277 __HAL_UNLOCK(hi2c);
\r
2283 /* Wait until STOPF flag is reset */
\r
2284 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_STOPF, RESET, Timeout) != HAL_OK)
\r
2286 return HAL_TIMEOUT;
\r
2289 /* Clear NACK Flag */
\r
2290 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
\r
2292 /* Clear STOP Flag, auto generated with autoend*/
\r
2293 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
\r
2296 /* Check if the maximum allowed number of trials has been reached */
\r
2297 if (I2C_Trials++ == Trials)
\r
2299 /* Generate Stop */
\r
2300 hi2c->Instance->CR2 |= I2C_CR2_STOP;
\r
2302 /* Wait until STOPF flag is reset */
\r
2303 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_STOPF, RESET, Timeout) != HAL_OK)
\r
2305 return HAL_TIMEOUT;
\r
2308 /* Clear STOP Flag */
\r
2309 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
\r
2311 }while(I2C_Trials < Trials);
\r
2313 hi2c->State = HAL_I2C_STATE_READY;
\r
2315 /* Process Unlocked */
\r
2316 __HAL_UNLOCK(hi2c);
\r
2318 return HAL_TIMEOUT;
\r
2329 /** @defgroup IRQ_Handler_and_Callbacks IRQ Handler and Callbacks
\r
2334 * @brief This function handles I2C event interrupt request.
\r
2335 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
2336 * the configuration information for the specified I2C.
\r
2339 void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c)
\r
2341 /* I2C in mode Transmitter ---------------------------------------------------*/
\r
2342 if (((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXIS) == SET) || (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TCR) == SET) || (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TC) == SET) || (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == SET) || (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET) || (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR) == SET)) && (__HAL_I2C_GET_IT_SOURCE(hi2c, (I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_TXI | I2C_IT_ADDRI)) == SET))
\r
2344 /* Slave mode selected */
\r
2345 if (hi2c->State == HAL_I2C_STATE_SLAVE_BUSY_TX)
\r
2347 I2C_SlaveTransmit_ISR(hi2c);
\r
2351 if (((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXIS) == SET) || (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TCR) == SET) || (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TC) == SET) || (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == SET) || (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET)) && (__HAL_I2C_GET_IT_SOURCE(hi2c, (I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_TXI)) == SET))
\r
2353 /* Master mode selected */
\r
2354 if ((hi2c->State == HAL_I2C_STATE_MASTER_BUSY_TX) || (hi2c->State == HAL_I2C_STATE_MEM_BUSY_TX))
\r
2356 I2C_MasterTransmit_ISR(hi2c);
\r
2360 /* I2C in mode Receiver ----------------------------------------------------*/
\r
2361 if (((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET) || (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TCR) == SET) || (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TC) == SET) || (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == SET) || (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET) || (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR) == SET)) && (__HAL_I2C_GET_IT_SOURCE(hi2c, (I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_RXI | I2C_IT_ADDRI)) == SET))
\r
2363 /* Slave mode selected */
\r
2364 if (hi2c->State == HAL_I2C_STATE_SLAVE_BUSY_RX)
\r
2366 I2C_SlaveReceive_ISR(hi2c);
\r
2369 if (((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET) || (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TCR) == SET) || (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TC) == SET) || (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == SET) || (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET)) && (__HAL_I2C_GET_IT_SOURCE(hi2c, (I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_RXI)) == SET))
\r
2371 /* Master mode selected */
\r
2372 if ((hi2c->State == HAL_I2C_STATE_MASTER_BUSY_RX) || (hi2c->State == HAL_I2C_STATE_MEM_BUSY_RX))
\r
2374 I2C_MasterReceive_ISR(hi2c);
\r
2380 * @brief This function handles I2C error interrupt request.
\r
2381 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
2382 * the configuration information for the specified I2C.
\r
2385 void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c)
\r
2387 /* I2C Bus error interrupt occurred ------------------------------------*/
\r
2388 if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BERR) == SET) && (__HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_ERRI) == SET))
\r
2390 hi2c->ErrorCode |= HAL_I2C_ERROR_BERR;
\r
2392 /* Clear BERR flag */
\r
2393 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_BERR);
\r
2396 /* I2C Over-Run/Under-Run interrupt occurred ----------------------------------------*/
\r
2397 if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_OVR) == SET) && (__HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_ERRI) == SET))
\r
2399 hi2c->ErrorCode |= HAL_I2C_ERROR_OVR;
\r
2401 /* Clear OVR flag */
\r
2402 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_OVR);
\r
2405 /* I2C Arbitration Loss error interrupt occurred -------------------------------------*/
\r
2406 if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ARLO) == SET) && (__HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_ERRI) == SET))
\r
2408 hi2c->ErrorCode |= HAL_I2C_ERROR_ARLO;
\r
2410 /* Clear ARLO flag */
\r
2411 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ARLO);
\r
2414 /* Call the Error Callback in case of Error detected */
\r
2415 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
\r
2417 hi2c->State = HAL_I2C_STATE_READY;
\r
2419 HAL_I2C_ErrorCallback(hi2c);
\r
2424 * @brief Master Tx Transfer completed callbacks.
\r
2425 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
2426 * the configuration information for the specified I2C.
\r
2429 __weak void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c)
\r
2431 /* NOTE : This function Should not be modified, when the callback is needed,
\r
2432 the HAL_I2C_TxCpltCallback could be implemented in the user file
\r
2437 * @brief Master Rx Transfer completed callbacks.
\r
2438 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
2439 * the configuration information for the specified I2C.
\r
2442 __weak void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)
\r
2444 /* NOTE : This function Should not be modified, when the callback is needed,
\r
2445 the HAL_I2C_TxCpltCallback could be implemented in the user file
\r
2449 /** @brief Slave Tx Transfer completed callbacks.
\r
2450 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
2451 * the configuration information for the specified I2C.
\r
2454 __weak void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c)
\r
2456 /* NOTE : This function Should not be modified, when the callback is needed,
\r
2457 the HAL_I2C_TxCpltCallback could be implemented in the user file
\r
2462 * @brief Slave Rx Transfer completed callbacks.
\r
2463 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
2464 * the configuration information for the specified I2C.
\r
2467 __weak void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c)
\r
2469 /* NOTE : This function Should not be modified, when the callback is needed,
\r
2470 the HAL_I2C_TxCpltCallback could be implemented in the user file
\r
2475 * @brief Memory Tx Transfer completed callbacks.
\r
2476 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
2477 * the configuration information for the specified I2C.
\r
2480 __weak void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c)
\r
2482 /* NOTE : This function Should not be modified, when the callback is needed,
\r
2483 the HAL_I2C_TxCpltCallback could be implemented in the user file
\r
2488 * @brief Memory Rx Transfer completed callbacks.
\r
2489 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
2490 * the configuration information for the specified I2C.
\r
2493 __weak void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c)
\r
2495 /* NOTE : This function Should not be modified, when the callback is needed,
\r
2496 the HAL_I2C_TxCpltCallback could be implemented in the user file
\r
2501 * @brief I2C error callbacks.
\r
2502 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
2503 * the configuration information for the specified I2C.
\r
2506 __weak void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c)
\r
2508 /* NOTE : This function Should not be modified, when the callback is needed,
\r
2509 the HAL_I2C_ErrorCallback could be implemented in the user file
\r
2517 /** @defgroup I2C_Exported_Functions_Group3 Peripheral State and Errors functions
\r
2518 * @brief Peripheral State and Errors functions
\r
2521 ===============================================================================
\r
2522 ##### Peripheral State and Errors functions #####
\r
2523 ===============================================================================
\r
2525 This subsection permit to get in run-time the status of the peripheral
\r
2526 and the data flow.
\r
2533 * @brief Returns the I2C state.
\r
2534 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
2535 * the configuration information for the specified I2C.
\r
2536 * @retval HAL state
\r
2538 HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c)
\r
2540 return hi2c->State;
\r
2544 * @brief Return the I2C error code
\r
2545 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
2546 * the configuration information for the specified I2C.
\r
2547 * @retval I2C Error Code
\r
2549 uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c)
\r
2551 return hi2c->ErrorCode;
\r
2562 /** @addtogroup I2C_Private_Functions
\r
2567 * @brief Handle Interrupt Flags Master Transmit Mode
\r
2568 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
2569 * the configuration information for the specified I2C.
\r
2570 * @retval HAL status
\r
2572 static HAL_StatusTypeDef I2C_MasterTransmit_ISR(I2C_HandleTypeDef *hi2c)
\r
2574 uint16_t DevAddress;
\r
2576 /* Process Locked */
\r
2577 __HAL_LOCK(hi2c);
\r
2579 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXIS) == SET)
\r
2581 /* Write data to TXDR */
\r
2582 hi2c->Instance->TXDR = (*hi2c->pBuffPtr++);
\r
2584 hi2c->XferCount--;
\r
2586 else if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TCR) == SET)
\r
2588 if((hi2c->XferSize == 0)&&(hi2c->XferCount!=0))
\r
2590 DevAddress = (hi2c->Instance->CR2 & I2C_CR2_SADD);
\r
2592 if(hi2c->XferCount > 255)
\r
2594 I2C_TransferConfig(hi2c,DevAddress,255, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
\r
2595 hi2c->XferSize = 255;
\r
2599 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferCount, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
\r
2600 hi2c->XferSize = hi2c->XferCount;
\r
2605 /* Process Unlocked */
\r
2606 __HAL_UNLOCK(hi2c);
\r
2608 /* Wrong size Status regarding TCR flag event */
\r
2609 hi2c->ErrorCode |= HAL_I2C_ERROR_SIZE;
\r
2610 HAL_I2C_ErrorCallback(hi2c);
\r
2613 else if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TC) == SET)
\r
2615 if(hi2c->XferCount == 0)
\r
2617 /* Generate Stop */
\r
2618 hi2c->Instance->CR2 |= I2C_CR2_STOP;
\r
2622 /* Process Unlocked */
\r
2623 __HAL_UNLOCK(hi2c);
\r
2625 /* Wrong size Status regarding TCR flag event */
\r
2626 hi2c->ErrorCode |= HAL_I2C_ERROR_SIZE;
\r
2627 HAL_I2C_ErrorCallback(hi2c);
\r
2630 else if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == SET)
\r
2632 /* Disable ERR, TC, STOP, NACK, TXI interrupt */
\r
2633 __HAL_I2C_DISABLE_IT(hi2c,I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_TXI );
\r
2635 /* Clear STOP Flag */
\r
2636 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
\r
2638 /* Clear Configuration Register 2 */
\r
2639 I2C_RESET_CR2(hi2c);
\r
2641 hi2c->State = HAL_I2C_STATE_READY;
\r
2643 /* Process Unlocked */
\r
2644 __HAL_UNLOCK(hi2c);
\r
2646 if(hi2c->State == HAL_I2C_STATE_MEM_BUSY_TX)
\r
2648 HAL_I2C_MemTxCpltCallback(hi2c);
\r
2652 HAL_I2C_MasterTxCpltCallback(hi2c);
\r
2655 else if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET)
\r
2657 /* Clear NACK Flag */
\r
2658 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
\r
2660 /* Process Unlocked */
\r
2661 __HAL_UNLOCK(hi2c);
\r
2663 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
\r
2664 HAL_I2C_ErrorCallback(hi2c);
\r
2667 /* Process Unlocked */
\r
2668 __HAL_UNLOCK(hi2c);
\r
2674 * @brief Handle Interrupt Flags Master Receive Mode
\r
2675 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
2676 * the configuration information for the specified I2C.
\r
2677 * @retval HAL status
\r
2679 static HAL_StatusTypeDef I2C_MasterReceive_ISR(I2C_HandleTypeDef *hi2c)
\r
2681 uint16_t DevAddress;
\r
2683 /* Process Locked */
\r
2686 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET)
\r
2688 /* Read data from RXDR */
\r
2689 (*hi2c->pBuffPtr++) = hi2c->Instance->RXDR;
\r
2691 hi2c->XferCount--;
\r
2693 else if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TCR) == SET)
\r
2695 if((hi2c->XferSize == 0)&&(hi2c->XferCount!=0))
\r
2697 DevAddress = (hi2c->Instance->CR2 & I2C_CR2_SADD);
\r
2699 if(hi2c->XferCount > 255)
\r
2701 I2C_TransferConfig(hi2c,DevAddress,255, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
\r
2702 hi2c->XferSize = 255;
\r
2706 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferCount, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
\r
2707 hi2c->XferSize = hi2c->XferCount;
\r
2712 /* Process Unlocked */
\r
2713 __HAL_UNLOCK(hi2c);
\r
2715 /* Wrong size Status regarding TCR flag event */
\r
2716 hi2c->ErrorCode |= HAL_I2C_ERROR_SIZE;
\r
2717 HAL_I2C_ErrorCallback(hi2c);
\r
2720 else if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TC) == SET)
\r
2722 if(hi2c->XferCount == 0)
\r
2724 /* Generate Stop */
\r
2725 hi2c->Instance->CR2 |= I2C_CR2_STOP;
\r
2729 /* Process Unlocked */
\r
2730 __HAL_UNLOCK(hi2c);
\r
2732 /* Wrong size Status regarding TCR flag event */
\r
2733 hi2c->ErrorCode |= HAL_I2C_ERROR_SIZE;
\r
2734 HAL_I2C_ErrorCallback(hi2c);
\r
2737 else if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == SET)
\r
2739 /* Disable ERR, TC, STOP, NACK, TXI interrupt */
\r
2740 __HAL_I2C_DISABLE_IT(hi2c,I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_RXI );
\r
2742 /* Clear STOP Flag */
\r
2743 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
\r
2745 /* Clear Configuration Register 2 */
\r
2746 I2C_RESET_CR2(hi2c);
\r
2748 hi2c->State = HAL_I2C_STATE_READY;
\r
2750 /* Process Unlocked */
\r
2751 __HAL_UNLOCK(hi2c);
\r
2753 if(hi2c->State == HAL_I2C_STATE_MEM_BUSY_RX)
\r
2755 HAL_I2C_MemRxCpltCallback(hi2c);
\r
2759 HAL_I2C_MasterRxCpltCallback(hi2c);
\r
2762 else if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET)
\r
2764 /* Clear NACK Flag */
\r
2765 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
\r
2767 /* Process Unlocked */
\r
2768 __HAL_UNLOCK(hi2c);
\r
2770 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
\r
2771 HAL_I2C_ErrorCallback(hi2c);
\r
2774 /* Process Unlocked */
\r
2775 __HAL_UNLOCK(hi2c);
\r
2782 * @brief Handle Interrupt Flags Slave Transmit Mode
\r
2783 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
2784 * the configuration information for the specified I2C.
\r
2785 * @retval HAL status
\r
2787 static HAL_StatusTypeDef I2C_SlaveTransmit_ISR(I2C_HandleTypeDef *hi2c)
\r
2789 /* Process locked */
\r
2792 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) != RESET)
\r
2794 /* Check that I2C transfer finished */
\r
2795 /* if yes, normal usecase, a NACK is sent by the MASTER when Transfer is finished */
\r
2796 /* Mean XferCount == 0*/
\r
2797 /* So clear Flag NACKF only */
\r
2798 if(hi2c->XferCount == 0)
\r
2800 /* Clear NACK Flag */
\r
2801 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
\r
2803 /* Process Unlocked */
\r
2804 __HAL_UNLOCK(hi2c);
\r
2808 /* if no, error usecase, a Non-Acknowledge of last Data is generated by the MASTER*/
\r
2809 /* Clear NACK Flag */
\r
2810 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
\r
2812 /* Set ErrorCode corresponding to a Non-Acknowledge */
\r
2813 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
\r
2815 /* Process Unlocked */
\r
2816 __HAL_UNLOCK(hi2c);
\r
2818 /* Call the Error callback to prevent upper layer */
\r
2819 HAL_I2C_ErrorCallback(hi2c);
\r
2822 else if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR) == SET)
\r
2824 /* Clear ADDR flag */
\r
2825 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);
\r
2827 /* Check first if STOPF is set */
\r
2828 /* to prevent a Write Data in TX buffer */
\r
2829 /* which is stuck in TXDR until next */
\r
2830 /* communication with Master */
\r
2831 else if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == SET)
\r
2833 /* Disable ERRI, TCI, STOPI, NACKI, ADDRI, RXI, TXI interrupt */
\r
2834 __HAL_I2C_DISABLE_IT(hi2c,I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI );
\r
2836 /* Disable Address Acknowledge */
\r
2837 hi2c->Instance->CR2 |= I2C_CR2_NACK;
\r
2839 /* Clear STOP Flag */
\r
2840 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
\r
2842 hi2c->State = HAL_I2C_STATE_READY;
\r
2844 /* Process Unlocked */
\r
2845 __HAL_UNLOCK(hi2c);
\r
2847 HAL_I2C_SlaveTxCpltCallback(hi2c);
\r
2849 else if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXIS) == SET)
\r
2851 /* Write data to TXDR only if XferCount not reach "0" */
\r
2852 /* A TXIS flag can be set, during STOP treatment */
\r
2853 if(hi2c->XferCount > 0)
\r
2855 /* Write data to TXDR */
\r
2856 hi2c->Instance->TXDR = (*hi2c->pBuffPtr++);
\r
2857 hi2c->XferCount--;
\r
2861 /* Process Unlocked */
\r
2862 __HAL_UNLOCK(hi2c);
\r
2868 * @brief Handle Interrupt Flags Slave Receive Mode
\r
2869 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
2870 * the configuration information for the specified I2C.
\r
2871 * @retval HAL status
\r
2873 static HAL_StatusTypeDef I2C_SlaveReceive_ISR(I2C_HandleTypeDef *hi2c)
\r
2875 /* Process Locked */
\r
2878 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) != RESET)
\r
2880 /* Clear NACK Flag */
\r
2881 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
\r
2883 /* Process Unlocked */
\r
2884 __HAL_UNLOCK(hi2c);
\r
2886 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
\r
2887 HAL_I2C_ErrorCallback(hi2c);
\r
2889 else if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR) == SET)
\r
2891 /* Clear ADDR flag */
\r
2892 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);
\r
2894 else if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET)
\r
2896 /* Read data from RXDR */
\r
2897 (*hi2c->pBuffPtr++) = hi2c->Instance->RXDR;
\r
2899 hi2c->XferCount--;
\r
2901 else if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == SET)
\r
2903 /* Disable ERRI, TCI, STOPI, NACKI, ADDRI, RXI, TXI interrupt */
\r
2904 __HAL_I2C_DISABLE_IT(hi2c,I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_RXI );
\r
2906 /* Disable Address Acknowledge */
\r
2907 hi2c->Instance->CR2 |= I2C_CR2_NACK;
\r
2909 /* Clear STOP Flag */
\r
2910 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
\r
2912 hi2c->State = HAL_I2C_STATE_READY;
\r
2914 /* Process Unlocked */
\r
2915 __HAL_UNLOCK(hi2c);
\r
2917 HAL_I2C_SlaveRxCpltCallback(hi2c);
\r
2920 /* Process Unlocked */
\r
2921 __HAL_UNLOCK(hi2c);
\r
2927 * @brief Master sends target device address followed by internal memory address for write request.
\r
2928 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
2929 * the configuration information for the specified I2C.
\r
2930 * @param DevAddress: Target device address
\r
2931 * @param MemAddress: Internal memory address
\r
2932 * @param MemAddSize: Size of internal memory address
\r
2933 * @param Timeout: Timeout duration
\r
2934 * @retval HAL status
\r
2936 static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout)
\r
2938 I2C_TransferConfig(hi2c,DevAddress,MemAddSize, I2C_RELOAD_MODE, I2C_GENERATE_START_WRITE);
\r
2940 /* Wait until TXIS flag is set */
\r
2941 if(I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout) != HAL_OK)
\r
2943 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
2949 return HAL_TIMEOUT;
\r
2953 /* If Memory address size is 8Bit */
\r
2954 if(MemAddSize == I2C_MEMADD_SIZE_8BIT)
\r
2956 /* Send Memory Address */
\r
2957 hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress);
\r
2959 /* If Memory address size is 16Bit */
\r
2962 /* Send MSB of Memory Address */
\r
2963 hi2c->Instance->TXDR = I2C_MEM_ADD_MSB(MemAddress);
\r
2965 /* Wait until TXIS flag is set */
\r
2966 if(I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout) != HAL_OK)
\r
2968 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
2974 return HAL_TIMEOUT;
\r
2978 /* Send LSB of Memory Address */
\r
2979 hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress);
\r
2982 /* Wait until TCR flag is set */
\r
2983 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout) != HAL_OK)
\r
2985 return HAL_TIMEOUT;
\r
2992 * @brief Master sends target device address followed by internal memory address for read request.
\r
2993 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
2994 * the configuration information for the specified I2C.
\r
2995 * @param DevAddress: Target device address
\r
2996 * @param MemAddress: Internal memory address
\r
2997 * @param MemAddSize: Size of internal memory address
\r
2998 * @param Timeout: Timeout duration
\r
2999 * @retval HAL status
\r
3001 static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout)
\r
3003 I2C_TransferConfig(hi2c,DevAddress,MemAddSize, I2C_SOFTEND_MODE, I2C_GENERATE_START_WRITE);
\r
3005 /* Wait until TXIS flag is set */
\r
3006 if(I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout) != HAL_OK)
\r
3008 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
3014 return HAL_TIMEOUT;
\r
3018 /* If Memory address size is 8Bit */
\r
3019 if(MemAddSize == I2C_MEMADD_SIZE_8BIT)
\r
3021 /* Send Memory Address */
\r
3022 hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress);
\r
3024 /* If Memory address size is 16Bit */
\r
3027 /* Send MSB of Memory Address */
\r
3028 hi2c->Instance->TXDR = I2C_MEM_ADD_MSB(MemAddress);
\r
3030 /* Wait until TXIS flag is set */
\r
3031 if(I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout) != HAL_OK)
\r
3033 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
3039 return HAL_TIMEOUT;
\r
3043 /* Send LSB of Memory Address */
\r
3044 hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress);
\r
3047 /* Wait until TC flag is set */
\r
3048 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TC, RESET, Timeout) != HAL_OK)
\r
3050 return HAL_TIMEOUT;
\r
3057 * @brief DMA I2C master transmit process complete callback.
\r
3058 * @param hdma: DMA handle
\r
3061 static void I2C_DMAMasterTransmitCplt(DMA_HandleTypeDef *hdma)
\r
3063 uint16_t DevAddress;
\r
3064 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
\r
3066 /* Check if last DMA request was done with RELOAD */
\r
3067 /* Set NBYTES to write and reload if size > 255 */
\r
3068 if( (hi2c->XferSize == 255) && (hi2c->XferSize < hi2c->XferCount) )
\r
3070 /* Wait until TCR flag is set */
\r
3071 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, I2C_TIMEOUT_TCR) != HAL_OK)
\r
3073 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
\r
3076 /* Disable DMA Request */
\r
3077 hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN;
\r
3079 /* Check if Errors has been detected during transfer */
\r
3080 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
\r
3082 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
\r
3083 /* Wait until STOPF flag is reset */
\r
3084 if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, I2C_TIMEOUT_STOPF) != HAL_OK)
\r
3086 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
3088 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
\r
3092 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
\r
3096 /* Clear STOP Flag */
\r
3097 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
\r
3099 /* Clear Configuration Register 2 */
\r
3100 I2C_RESET_CR2(hi2c);
\r
3102 hi2c->XferCount = 0;
\r
3104 hi2c->State = HAL_I2C_STATE_READY;
\r
3105 HAL_I2C_ErrorCallback(hi2c);
\r
3109 hi2c->pBuffPtr += hi2c->XferSize;
\r
3110 hi2c->XferCount -= hi2c->XferSize;
\r
3111 if(hi2c->XferCount > 255)
\r
3113 hi2c->XferSize = 255;
\r
3117 hi2c->XferSize = hi2c->XferCount;
\r
3120 DevAddress = (hi2c->Instance->CR2 & I2C_CR2_SADD);
\r
3122 /* Enable the DMA channel */
\r
3123 HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->TXDR, hi2c->XferSize);
\r
3125 /* Send Slave Address */
\r
3126 /* Set NBYTES to write and reload if size > 255 */
\r
3127 if( (hi2c->XferSize == 255) && (hi2c->XferSize < hi2c->XferCount) )
\r
3129 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
\r
3133 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
\r
3136 /* Wait until TXIS flag is set */
\r
3137 if(I2C_WaitOnTXISFlagUntilTimeout(hi2c, I2C_TIMEOUT_TXIS) != HAL_OK)
\r
3139 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
\r
3140 /* Wait until STOPF flag is reset */
\r
3141 if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, I2C_TIMEOUT_STOPF) != HAL_OK)
\r
3143 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
3145 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
\r
3149 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
\r
3153 /* Clear STOP Flag */
\r
3154 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
\r
3156 /* Clear Configuration Register 2 */
\r
3157 I2C_RESET_CR2(hi2c);
\r
3159 hi2c->XferCount = 0;
\r
3161 hi2c->State = HAL_I2C_STATE_READY;
\r
3162 HAL_I2C_ErrorCallback(hi2c);
\r
3166 /* Enable DMA Request */
\r
3167 hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;
\r
3173 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
\r
3174 /* Wait until STOPF flag is reset */
\r
3175 if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, I2C_TIMEOUT_STOPF) != HAL_OK)
\r
3177 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
3179 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
\r
3183 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
\r
3187 /* Clear STOP Flag */
\r
3188 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
\r
3190 /* Clear Configuration Register 2 */
\r
3191 I2C_RESET_CR2(hi2c);
\r
3193 /* Disable DMA Request */
\r
3194 hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN;
\r
3196 hi2c->XferCount = 0;
\r
3198 hi2c->State = HAL_I2C_STATE_READY;
\r
3200 /* Check if Errors has been detected during transfer */
\r
3201 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
\r
3203 HAL_I2C_ErrorCallback(hi2c);
\r
3207 HAL_I2C_MasterTxCpltCallback(hi2c);
\r
3213 * @brief DMA I2C slave transmit process complete callback.
\r
3214 * @param hdma: DMA handle
\r
3217 static void I2C_DMASlaveTransmitCplt(DMA_HandleTypeDef *hdma)
\r
3219 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
\r
3221 /* Wait until STOP flag is set */
\r
3222 if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, I2C_TIMEOUT_STOPF) != HAL_OK)
\r
3224 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
3226 /* Normal Use case, a AF is generated by master */
\r
3227 /* to inform slave the end of transfer */
\r
3228 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
\r
3232 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
\r
3236 /* Clear STOP flag */
\r
3237 __HAL_I2C_CLEAR_FLAG(hi2c,I2C_FLAG_STOPF);
\r
3239 /* Wait until BUSY flag is reset */
\r
3240 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY) != HAL_OK)
\r
3242 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
\r
3245 /* Disable DMA Request */
\r
3246 hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN;
\r
3248 hi2c->XferCount = 0;
\r
3250 hi2c->State = HAL_I2C_STATE_READY;
\r
3252 /* Check if Errors has been detected during transfer */
\r
3253 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
\r
3255 HAL_I2C_ErrorCallback(hi2c);
\r
3259 HAL_I2C_SlaveTxCpltCallback(hi2c);
\r
3264 * @brief DMA I2C master receive process complete callback
\r
3265 * @param hdma: DMA handle
\r
3268 static void I2C_DMAMasterReceiveCplt(DMA_HandleTypeDef *hdma)
\r
3270 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
\r
3271 uint16_t DevAddress;
\r
3273 /* Check if last DMA request was done with RELOAD */
\r
3274 /* Set NBYTES to write and reload if size > 255 */
\r
3275 if( (hi2c->XferSize == 255) && (hi2c->XferSize < hi2c->XferCount) )
\r
3277 /* Wait until TCR flag is set */
\r
3278 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, I2C_TIMEOUT_TCR) != HAL_OK)
\r
3280 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
\r
3283 /* Disable DMA Request */
\r
3284 hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN;
\r
3286 /* Check if Errors has been detected during transfer */
\r
3287 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
\r
3289 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
\r
3290 /* Wait until STOPF flag is reset */
\r
3291 if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, I2C_TIMEOUT_STOPF) != HAL_OK)
\r
3293 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
3295 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
\r
3299 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
\r
3303 /* Clear STOP Flag */
\r
3304 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
\r
3306 /* Clear Configuration Register 2 */
\r
3307 I2C_RESET_CR2(hi2c);
\r
3309 hi2c->XferCount = 0;
\r
3311 hi2c->State = HAL_I2C_STATE_READY;
\r
3312 HAL_I2C_ErrorCallback(hi2c);
\r
3316 hi2c->pBuffPtr += hi2c->XferSize;
\r
3317 hi2c->XferCount -= hi2c->XferSize;
\r
3318 if(hi2c->XferCount > 255)
\r
3320 hi2c->XferSize = 255;
\r
3324 hi2c->XferSize = hi2c->XferCount;
\r
3327 DevAddress = (hi2c->Instance->CR2 & I2C_CR2_SADD);
\r
3329 /* Enable the DMA channel */
\r
3330 HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize);
\r
3332 /* Send Slave Address */
\r
3333 /* Set NBYTES to write and reload if size > 255 */
\r
3334 if( (hi2c->XferSize == 255) && (hi2c->XferSize < hi2c->XferCount) )
\r
3336 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
\r
3340 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
\r
3343 /* Wait until RXNE flag is set */
\r
3344 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, I2C_TIMEOUT_RXNE) != HAL_OK)
\r
3346 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
\r
3349 /* Check if Errors has been detected during transfer */
\r
3350 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
\r
3352 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
\r
3353 /* Wait until STOPF flag is reset */
\r
3354 if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, I2C_TIMEOUT_STOPF) != HAL_OK)
\r
3356 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
3358 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
\r
3362 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
\r
3366 /* Clear STOP Flag */
\r
3367 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
\r
3369 /* Clear Configuration Register 2 */
\r
3370 I2C_RESET_CR2(hi2c);
\r
3372 hi2c->XferCount = 0;
\r
3374 hi2c->State = HAL_I2C_STATE_READY;
\r
3376 HAL_I2C_ErrorCallback(hi2c);
\r
3380 /* Enable DMA Request */
\r
3381 hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN;
\r
3387 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
\r
3388 /* Wait until STOPF flag is reset */
\r
3389 if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, I2C_TIMEOUT_STOPF) != HAL_OK)
\r
3391 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
3393 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
\r
3397 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
\r
3401 /* Clear STOP Flag */
\r
3402 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
\r
3404 /* Clear Configuration Register 2 */
\r
3405 I2C_RESET_CR2(hi2c);
\r
3407 /* Disable DMA Request */
\r
3408 hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN;
\r
3410 hi2c->XferCount = 0;
\r
3412 hi2c->State = HAL_I2C_STATE_READY;
\r
3414 /* Check if Errors has been detected during transfer */
\r
3415 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
\r
3417 HAL_I2C_ErrorCallback(hi2c);
\r
3421 HAL_I2C_MasterRxCpltCallback(hi2c);
\r
3427 * @brief DMA I2C slave receive process complete callback.
\r
3428 * @param hdma: DMA handle
\r
3431 static void I2C_DMASlaveReceiveCplt(DMA_HandleTypeDef *hdma)
\r
3433 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
\r
3435 /* Wait until STOPF flag is reset */
\r
3436 if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, I2C_TIMEOUT_STOPF) != HAL_OK)
\r
3438 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
3440 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
\r
3444 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
\r
3448 /* Clear STOPF flag */
\r
3449 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
\r
3451 /* Wait until BUSY flag is reset */
\r
3452 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY) != HAL_OK)
\r
3454 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
\r
3457 /* Disable DMA Request */
\r
3458 hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN;
\r
3460 /* Disable Address Acknowledge */
\r
3461 hi2c->Instance->CR2 |= I2C_CR2_NACK;
\r
3463 hi2c->XferCount = 0;
\r
3465 hi2c->State = HAL_I2C_STATE_READY;
\r
3467 /* Check if Errors has been detected during transfer */
\r
3468 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
\r
3470 HAL_I2C_ErrorCallback(hi2c);
\r
3474 HAL_I2C_SlaveRxCpltCallback(hi2c);
\r
3479 * @brief DMA I2C Memory Write process complete callback
\r
3480 * @param hdma : DMA handle
\r
3483 static void I2C_DMAMemTransmitCplt(DMA_HandleTypeDef *hdma)
\r
3485 uint16_t DevAddress;
\r
3486 I2C_HandleTypeDef* hi2c = ( I2C_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
\r
3488 /* Check if last DMA request was done with RELOAD */
\r
3489 /* Set NBYTES to write and reload if size > 255 */
\r
3490 if( (hi2c->XferSize == 255) && (hi2c->XferSize < hi2c->XferCount) )
\r
3492 /* Wait until TCR flag is set */
\r
3493 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, I2C_TIMEOUT_TCR) != HAL_OK)
\r
3495 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
\r
3498 /* Disable DMA Request */
\r
3499 hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN;
\r
3501 /* Check if Errors has been detected during transfer */
\r
3502 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
\r
3504 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
\r
3505 /* Wait until STOPF flag is reset */
\r
3506 if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, I2C_TIMEOUT_STOPF) != HAL_OK)
\r
3508 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
3510 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
\r
3514 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
\r
3518 /* Clear STOP Flag */
\r
3519 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
\r
3521 /* Clear Configuration Register 2 */
\r
3522 I2C_RESET_CR2(hi2c);
\r
3524 hi2c->XferCount = 0;
\r
3526 hi2c->State = HAL_I2C_STATE_READY;
\r
3527 HAL_I2C_ErrorCallback(hi2c);
\r
3531 hi2c->pBuffPtr += hi2c->XferSize;
\r
3532 hi2c->XferCount -= hi2c->XferSize;
\r
3533 if(hi2c->XferCount > 255)
\r
3535 hi2c->XferSize = 255;
\r
3539 hi2c->XferSize = hi2c->XferCount;
\r
3542 DevAddress = (hi2c->Instance->CR2 & I2C_CR2_SADD);
\r
3544 /* Enable the DMA channel */
\r
3545 HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->TXDR, hi2c->XferSize);
\r
3547 /* Send Slave Address */
\r
3548 /* Set NBYTES to write and reload if size > 255 */
\r
3549 if( (hi2c->XferSize == 255) && (hi2c->XferSize < hi2c->XferCount) )
\r
3551 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
\r
3555 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
\r
3558 /* Wait until TXIS flag is set */
\r
3559 if(I2C_WaitOnTXISFlagUntilTimeout(hi2c, I2C_TIMEOUT_TXIS) != HAL_OK)
\r
3561 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
\r
3562 /* Wait until STOPF flag is reset */
\r
3563 if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, I2C_TIMEOUT_STOPF) != HAL_OK)
\r
3565 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
3567 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
\r
3571 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
\r
3575 /* Clear STOP Flag */
\r
3576 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
\r
3578 /* Clear Configuration Register 2 */
\r
3579 I2C_RESET_CR2(hi2c);
\r
3581 hi2c->XferCount = 0;
\r
3583 hi2c->State = HAL_I2C_STATE_READY;
\r
3584 HAL_I2C_ErrorCallback(hi2c);
\r
3588 /* Enable DMA Request */
\r
3589 hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;
\r
3595 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
\r
3596 /* Wait until STOPF flag is reset */
\r
3597 if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, I2C_TIMEOUT_STOPF) != HAL_OK)
\r
3599 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
3601 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
\r
3605 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
\r
3609 /* Clear STOP Flag */
\r
3610 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
\r
3612 /* Clear Configuration Register 2 */
\r
3613 I2C_RESET_CR2(hi2c);
\r
3615 /* Disable DMA Request */
\r
3616 hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN;
\r
3618 hi2c->XferCount = 0;
\r
3620 hi2c->State = HAL_I2C_STATE_READY;
\r
3622 /* Check if Errors has been detected during transfer */
\r
3623 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
\r
3625 HAL_I2C_ErrorCallback(hi2c);
\r
3629 HAL_I2C_MemTxCpltCallback(hi2c);
\r
3635 * @brief DMA I2C Memory Read process complete callback
\r
3636 * @param hdma: DMA handle
\r
3639 static void I2C_DMAMemReceiveCplt(DMA_HandleTypeDef *hdma)
\r
3641 I2C_HandleTypeDef* hi2c = ( I2C_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
\r
3642 uint16_t DevAddress;
\r
3644 /* Check if last DMA request was done with RELOAD */
\r
3645 /* Set NBYTES to write and reload if size > 255 */
\r
3646 if( (hi2c->XferSize == 255) && (hi2c->XferSize < hi2c->XferCount) )
\r
3648 /* Wait until TCR flag is set */
\r
3649 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, I2C_TIMEOUT_TCR) != HAL_OK)
\r
3651 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
\r
3654 /* Disable DMA Request */
\r
3655 hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN;
\r
3657 /* Check if Errors has been detected during transfer */
\r
3658 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
\r
3660 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
\r
3661 /* Wait until STOPF flag is reset */
\r
3662 if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, I2C_TIMEOUT_STOPF) != HAL_OK)
\r
3664 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
3666 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
\r
3670 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
\r
3674 /* Clear STOP Flag */
\r
3675 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
\r
3677 /* Clear Configuration Register 2 */
\r
3678 I2C_RESET_CR2(hi2c);
\r
3680 hi2c->XferCount = 0;
\r
3682 hi2c->State = HAL_I2C_STATE_READY;
\r
3683 HAL_I2C_ErrorCallback(hi2c);
\r
3687 hi2c->pBuffPtr += hi2c->XferSize;
\r
3688 hi2c->XferCount -= hi2c->XferSize;
\r
3689 if(hi2c->XferCount > 255)
\r
3691 hi2c->XferSize = 255;
\r
3695 hi2c->XferSize = hi2c->XferCount;
\r
3698 DevAddress = (hi2c->Instance->CR2 & I2C_CR2_SADD);
\r
3700 /* Enable the DMA channel */
\r
3701 HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize);
\r
3703 /* Send Slave Address */
\r
3704 /* Set NBYTES to write and reload if size > 255 */
\r
3705 if( (hi2c->XferSize == 255) && (hi2c->XferSize < hi2c->XferCount) )
\r
3707 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
\r
3711 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
\r
3714 /* Wait until RXNE flag is set */
\r
3715 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, I2C_TIMEOUT_RXNE) != HAL_OK)
\r
3717 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
\r
3720 /* Check if Errors has been detected during transfer */
\r
3721 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
\r
3723 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
\r
3724 /* Wait until STOPF flag is reset */
\r
3725 if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, I2C_TIMEOUT_STOPF) != HAL_OK)
\r
3727 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
3729 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
\r
3733 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
\r
3737 /* Clear STOP Flag */
\r
3738 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
\r
3740 /* Clear Configuration Register 2 */
\r
3741 I2C_RESET_CR2(hi2c);
\r
3743 hi2c->XferCount = 0;
\r
3745 hi2c->State = HAL_I2C_STATE_READY;
\r
3746 HAL_I2C_ErrorCallback(hi2c);
\r
3750 /* Enable DMA Request */
\r
3751 hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN;
\r
3757 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
\r
3758 /* Wait until STOPF flag is reset */
\r
3759 if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, I2C_TIMEOUT_STOPF) != HAL_OK)
\r
3761 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
\r
3763 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
\r
3767 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
\r
3771 /* Clear STOP Flag */
\r
3772 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
\r
3774 /* Clear Configuration Register 2 */
\r
3775 I2C_RESET_CR2(hi2c);
\r
3777 /* Disable DMA Request */
\r
3778 hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN;
\r
3780 hi2c->XferCount = 0;
\r
3782 hi2c->State = HAL_I2C_STATE_READY;
\r
3784 /* Check if Errors has been detected during transfer */
\r
3785 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
\r
3787 HAL_I2C_ErrorCallback(hi2c);
\r
3791 HAL_I2C_MemRxCpltCallback(hi2c);
\r
3797 * @brief DMA I2C communication error callback.
\r
3798 * @param hdma : DMA handle
\r
3801 static void I2C_DMAError(DMA_HandleTypeDef *hdma)
\r
3803 I2C_HandleTypeDef* hi2c = ( I2C_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
\r
3805 /* Disable Acknowledge */
\r
3806 hi2c->Instance->CR2 |= I2C_CR2_NACK;
\r
3808 hi2c->XferCount = 0;
\r
3810 hi2c->State = HAL_I2C_STATE_READY;
\r
3812 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
\r
3814 HAL_I2C_ErrorCallback(hi2c);
\r
3818 * @brief This function handles I2C Communication Timeout.
\r
3819 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
3820 * the configuration information for the specified I2C.
\r
3821 * @param Flag: specifies the I2C flag to check.
\r
3822 * @param Status: The new Flag status (SET or RESET).
\r
3823 * @param Timeout: Timeout duration
\r
3824 * @retval HAL status
\r
3826 static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout)
\r
3828 uint32_t tickstart = HAL_GetTick();
\r
3830 /* Wait until flag is set */
\r
3831 if(Status == RESET)
\r
3833 while(__HAL_I2C_GET_FLAG(hi2c, Flag) == RESET)
\r
3835 /* Check for the Timeout */
\r
3836 if(Timeout != HAL_MAX_DELAY)
\r
3838 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
\r
3840 hi2c->State= HAL_I2C_STATE_READY;
\r
3841 /* Process Unlocked */
\r
3842 __HAL_UNLOCK(hi2c);
\r
3843 return HAL_TIMEOUT;
\r
3850 while(__HAL_I2C_GET_FLAG(hi2c, Flag) != RESET)
\r
3852 /* Check for the Timeout */
\r
3853 if(Timeout != HAL_MAX_DELAY)
\r
3855 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
\r
3857 hi2c->State= HAL_I2C_STATE_READY;
\r
3858 /* Process Unlocked */
\r
3859 __HAL_UNLOCK(hi2c);
\r
3860 return HAL_TIMEOUT;
\r
3869 * @brief This function handles I2C Communication Timeout for specific usage of TXIS flag.
\r
3870 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
3871 * the configuration information for the specified I2C.
\r
3872 * @param Timeout: Timeout duration
\r
3873 * @retval HAL status
\r
3875 static HAL_StatusTypeDef I2C_WaitOnTXISFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout)
\r
3877 uint32_t tickstart = HAL_GetTick();
\r
3879 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXIS) == RESET)
\r
3881 /* Check if a NACK is detected */
\r
3882 if(I2C_IsAcknowledgeFailed(hi2c, Timeout) != HAL_OK)
\r
3887 /* Check for the Timeout */
\r
3888 if(Timeout != HAL_MAX_DELAY)
\r
3890 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
\r
3892 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
\r
3893 hi2c->State= HAL_I2C_STATE_READY;
\r
3895 /* Process Unlocked */
\r
3896 __HAL_UNLOCK(hi2c);
\r
3898 return HAL_TIMEOUT;
\r
3906 * @brief This function handles I2C Communication Timeout for specific usage of STOP flag.
\r
3907 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
3908 * the configuration information for the specified I2C.
\r
3909 * @param Timeout: Timeout duration
\r
3910 * @retval HAL status
\r
3912 static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout)
\r
3914 uint32_t tickstart = 0x00;
\r
3915 tickstart = HAL_GetTick();
\r
3917 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET)
\r
3919 /* Check if a NACK is detected */
\r
3920 if(I2C_IsAcknowledgeFailed(hi2c, Timeout) != HAL_OK)
\r
3925 /* Check for the Timeout */
\r
3926 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
\r
3928 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
\r
3929 hi2c->State= HAL_I2C_STATE_READY;
\r
3931 /* Process Unlocked */
\r
3932 __HAL_UNLOCK(hi2c);
\r
3934 return HAL_TIMEOUT;
\r
3941 * @brief This function handles I2C Communication Timeout for specific usage of RXNE flag.
\r
3942 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
3943 * the configuration information for the specified I2C.
\r
3944 * @param Timeout: Timeout duration
\r
3945 * @retval HAL status
\r
3947 static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout)
\r
3949 uint32_t tickstart = 0x00;
\r
3950 tickstart = HAL_GetTick();
\r
3952 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == RESET)
\r
3954 /* Check if a STOPF is detected */
\r
3955 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == SET)
\r
3957 /* Clear STOP Flag */
\r
3958 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
\r
3960 /* Clear Configuration Register 2 */
\r
3961 I2C_RESET_CR2(hi2c);
\r
3963 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
\r
3964 hi2c->State= HAL_I2C_STATE_READY;
\r
3966 /* Process Unlocked */
\r
3967 __HAL_UNLOCK(hi2c);
\r
3972 /* Check for the Timeout */
\r
3973 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
\r
3975 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
\r
3976 hi2c->State= HAL_I2C_STATE_READY;
\r
3978 /* Process Unlocked */
\r
3979 __HAL_UNLOCK(hi2c);
\r
3981 return HAL_TIMEOUT;
\r
3988 * @brief This function handles Acknowledge failed detection during an I2C Communication.
\r
3989 * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
\r
3990 * the configuration information for the specified I2C.
\r
3991 * @param Timeout: Timeout duration
\r
3992 * @retval HAL status
\r
3994 static HAL_StatusTypeDef I2C_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c, uint32_t Timeout)
\r
3996 uint32_t tickstart = 0x00;
\r
3997 tickstart = HAL_GetTick();
\r
3999 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET)
\r
4001 /* Generate stop if necessary only in case of I2C peripheral in MASTER mode */
\r
4002 if((hi2c->State == HAL_I2C_STATE_MASTER_BUSY_TX) || (hi2c->State == HAL_I2C_STATE_MEM_BUSY_TX)
\r
4003 || (hi2c->State == HAL_I2C_STATE_MEM_BUSY_RX))
\r
4005 /* No need to generate the STOP condition if AUTOEND mode is enabled */
\r
4006 /* Generate the STOP condition only in case of SOFTEND mode is enabled */
\r
4007 if((hi2c->Instance->CR2 & I2C_AUTOEND_MODE) != I2C_AUTOEND_MODE)
\r
4009 /* Generate Stop */
\r
4010 hi2c->Instance->CR2 |= I2C_CR2_STOP;
\r
4014 /* Wait until STOP Flag is reset */
\r
4015 /* AutoEnd should be initiate after AF */
\r
4016 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET)
\r
4018 /* Check for the Timeout */
\r
4019 if(Timeout != HAL_MAX_DELAY)
\r
4021 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
\r
4023 hi2c->State= HAL_I2C_STATE_READY;
\r
4024 /* Process Unlocked */
\r
4025 __HAL_UNLOCK(hi2c);
\r
4026 return HAL_TIMEOUT;
\r
4031 /* Clear NACKF Flag */
\r
4032 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
\r
4034 /* Clear STOP Flag */
\r
4035 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
\r
4037 /* Clear Configuration Register 2 */
\r
4038 I2C_RESET_CR2(hi2c);
\r
4040 hi2c->ErrorCode = HAL_I2C_ERROR_AF;
\r
4041 hi2c->State= HAL_I2C_STATE_READY;
\r
4043 /* Process Unlocked */
\r
4044 __HAL_UNLOCK(hi2c);
\r
4052 * @brief Handles I2Cx communication when starting transfer or during transfer (TC or TCR flag are set).
\r
4053 * @param hi2c: I2C handle.
\r
4054 * @param DevAddress: specifies the slave address to be programmed.
\r
4055 * @param Size: specifies the number of bytes to be programmed.
\r
4056 * This parameter must be a value between 0 and 255.
\r
4057 * @param Mode: new state of the I2C START condition generation.
\r
4058 * This parameter can be one of the following values:
\r
4059 * @arg I2C_RELOAD_MODE: Enable Reload mode .
\r
4060 * @arg I2C_AUTOEND_MODE: Enable Automatic end mode.
\r
4061 * @arg I2C_SOFTEND_MODE: Enable Software end mode.
\r
4062 * @param Request: new state of the I2C START condition generation.
\r
4063 * This parameter can be one of the following values:
\r
4064 * @arg I2C_NO_STARTSTOP: Don't Generate stop and start condition.
\r
4065 * @arg I2C_GENERATE_STOP: Generate stop condition (Size should be set to 0).
\r
4066 * @arg I2C_GENERATE_START_READ: Generate Restart for read request.
\r
4067 * @arg I2C_GENERATE_START_WRITE: Generate Restart for write request.
\r
4070 static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request)
\r
4072 uint32_t tmpreg = 0;
\r
4074 /* Check the parameters */
\r
4075 assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance));
\r
4076 assert_param(IS_TRANSFER_MODE(Mode));
\r
4077 assert_param(IS_TRANSFER_REQUEST(Request));
\r
4079 /* Get the CR2 register value */
\r
4080 tmpreg = hi2c->Instance->CR2;
\r
4082 /* clear tmpreg specific bits */
\r
4083 tmpreg &= (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START | I2C_CR2_STOP));
\r
4085 /* update tmpreg */
\r
4086 tmpreg |= (uint32_t)(((uint32_t)DevAddress & I2C_CR2_SADD) | (((uint32_t)Size << 16 ) & I2C_CR2_NBYTES) | \
\r
4087 (uint32_t)Mode | (uint32_t)Request);
\r
4089 /* update CR2 register */
\r
4090 hi2c->Instance->CR2 = tmpreg;
\r
4101 #endif /* HAL_I2C_MODULE_ENABLED */
\r
4110 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
\r