38
|
1 /**
|
|
2 ******************************************************************************
|
|
3 * @file stm32f4xx_hal_i2c.c
|
|
4 * @author MCD Application Team
|
|
5 * @version V1.2.0
|
|
6 * @date 26-December-2014
|
|
7 * @brief I2C HAL module driver.
|
|
8 * This file provides firmware functions to manage the following
|
|
9 * functionalities of the Inter Integrated Circuit (I2C) peripheral:
|
|
10 * + Initialization and de-initialization functions
|
|
11 * + IO operation functions
|
|
12 * + Peripheral Control functions
|
|
13 * + Peripheral State functions
|
|
14 *
|
|
15 @verbatim
|
|
16 ==============================================================================
|
|
17 ##### How to use this driver #####
|
|
18 ==============================================================================
|
|
19 [..]
|
|
20 The I2C HAL driver can be used as follows:
|
|
21
|
|
22 (#) Declare a I2C_HandleTypeDef handle structure, for example:
|
|
23 I2C_HandleTypeDef hi2c;
|
|
24
|
|
25 (#)Initialize the I2C low level resources by implement the HAL_I2C_MspInit() API:
|
|
26 (##) Enable the I2Cx interface clock
|
|
27 (##) I2C pins configuration
|
|
28 (+++) Enable the clock for the I2C GPIOs
|
|
29 (+++) Configure I2C pins as alternate function open-drain
|
|
30 (##) NVIC configuration if you need to use interrupt process
|
|
31 (+++) Configure the I2Cx interrupt priority
|
|
32 (+++) Enable the NVIC I2C IRQ Channel
|
|
33 (##) DMA Configuration if you need to use DMA process
|
|
34 (+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive stream
|
|
35 (+++) Enable the DMAx interface clock using
|
|
36 (+++) Configure the DMA handle parameters
|
|
37 (+++) Configure the DMA Tx or Rx Stream
|
|
38 (+++) Associate the initialized DMA handle to the hi2c DMA Tx or Rx handle
|
|
39 (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on
|
|
40 the DMA Tx or Rx Stream
|
|
41
|
|
42 (#) Configure the Communication Speed, Duty cycle, Addressing mode, Own Address1,
|
|
43 Dual Addressing mode, Own Address2, General call and Nostretch mode in the hi2c Init structure.
|
|
44
|
|
45 (#) Initialize the I2C registers by calling the HAL_I2C_Init(), configures also the low level Hardware
|
|
46 (GPIO, CLOCK, NVIC...etc) by calling the customized HAL_I2C_MspInit(&hi2c) API.
|
|
47
|
|
48 (#) To check if target device is ready for communication, use the function HAL_I2C_IsDeviceReady()
|
|
49
|
|
50 (#) For I2C IO and IO MEM operations, three operation modes are available within this driver :
|
|
51
|
|
52 *** Polling mode IO operation ***
|
|
53 =================================
|
|
54 [..]
|
|
55 (+) Transmit in master mode an amount of data in blocking mode using HAL_I2C_Master_Transmit()
|
|
56 (+) Receive in master mode an amount of data in blocking mode using HAL_I2C_Master_Receive()
|
|
57 (+) Transmit in slave mode an amount of data in blocking mode using HAL_I2C_Slave_Transmit()
|
|
58 (+) Receive in slave mode an amount of data in blocking mode using HAL_I2C_Slave_Receive()
|
|
59
|
|
60 *** Polling mode IO MEM operation ***
|
|
61 =====================================
|
|
62 [..]
|
|
63 (+) Write an amount of data in blocking mode to a specific memory address using HAL_I2C_Mem_Write()
|
|
64 (+) Read an amount of data in blocking mode from a specific memory address using HAL_I2C_Mem_Read()
|
|
65
|
|
66
|
|
67 *** Interrupt mode IO operation ***
|
|
68 ===================================
|
|
69 [..]
|
|
70 (+) Transmit in master mode an amount of data in non blocking mode using HAL_I2C_Master_Transmit_IT()
|
|
71 (+) At transmission end of transfer HAL_I2C_MasterTxCpltCallback is executed and user can
|
|
72 add his own code by customization of function pointer HAL_I2C_MasterTxCpltCallback
|
|
73 (+) Receive in master mode an amount of data in non blocking mode using HAL_I2C_Master_Receive_IT()
|
|
74 (+) At reception end of transfer HAL_I2C_MasterRxCpltCallback is executed and user can
|
|
75 add his own code by customization of function pointer HAL_I2C_MasterRxCpltCallback
|
|
76 (+) Transmit in slave mode an amount of data in non blocking mode using HAL_I2C_Slave_Transmit_IT()
|
|
77 (+) At transmission end of transfer HAL_I2C_SlaveTxCpltCallback is executed and user can
|
|
78 add his own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback
|
|
79 (+) Receive in slave mode an amount of data in non blocking mode using HAL_I2C_Slave_Receive_IT()
|
|
80 (+) At reception end of transfer HAL_I2C_SlaveRxCpltCallback is executed and user can
|
|
81 add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback
|
|
82 (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can
|
|
83 add his own code by customization of function pointer HAL_I2C_ErrorCallback
|
|
84
|
|
85 *** Interrupt mode IO MEM operation ***
|
|
86 =======================================
|
|
87 [..]
|
|
88 (+) Write an amount of data in no-blocking mode with Interrupt to a specific memory address using
|
|
89 HAL_I2C_Mem_Write_IT()
|
|
90 (+) At MEM end of write transfer HAL_I2C_MemTxCpltCallback is executed and user can
|
|
91 add his own code by customization of function pointer HAL_I2C_MemTxCpltCallback
|
|
92 (+) Read an amount of data in no-blocking mode with Interrupt from a specific memory address using
|
|
93 HAL_I2C_Mem_Read_IT()
|
|
94 (+) At MEM end of read transfer HAL_I2C_MemRxCpltCallback is executed and user can
|
|
95 add his own code by customization of function pointer HAL_I2C_MemRxCpltCallback
|
|
96 (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can
|
|
97 add his own code by customization of function pointer HAL_I2C_ErrorCallback
|
|
98
|
|
99 *** DMA mode IO operation ***
|
|
100 ==============================
|
|
101 [..]
|
|
102 (+) Transmit in master mode an amount of data in non blocking mode (DMA) using
|
|
103 HAL_I2C_Master_Transmit_DMA()
|
|
104 (+) At transmission end of transfer HAL_I2C_MasterTxCpltCallback is executed and user can
|
|
105 add his own code by customization of function pointer HAL_I2C_MasterTxCpltCallback
|
|
106 (+) Receive in master mode an amount of data in non blocking mode (DMA) using
|
|
107 HAL_I2C_Master_Receive_DMA()
|
|
108 (+) At reception end of transfer HAL_I2C_MasterRxCpltCallback is executed and user can
|
|
109 add his own code by customization of function pointer HAL_I2C_MasterRxCpltCallback
|
|
110 (+) Transmit in slave mode an amount of data in non blocking mode (DMA) using
|
|
111 HAL_I2C_Slave_Transmit_DMA()
|
|
112 (+) At transmission end of transfer HAL_I2C_SlaveTxCpltCallback is executed and user can
|
|
113 add his own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback
|
|
114 (+) Receive in slave mode an amount of data in non blocking mode (DMA) using
|
|
115 HAL_I2C_Slave_Receive_DMA()
|
|
116 (+) At reception end of transfer HAL_I2C_SlaveRxCpltCallback is executed and user can
|
|
117 add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback
|
|
118 (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can
|
|
119 add his own code by customization of function pointer HAL_I2C_ErrorCallback
|
|
120
|
|
121 *** DMA mode IO MEM operation ***
|
|
122 =================================
|
|
123 [..]
|
|
124 (+) Write an amount of data in no-blocking mode with DMA to a specific memory address using
|
|
125 HAL_I2C_Mem_Write_DMA()
|
|
126 (+) At MEM end of write transfer HAL_I2C_MemTxCpltCallback is executed and user can
|
|
127 add his own code by customization of function pointer HAL_I2C_MemTxCpltCallback
|
|
128 (+) Read an amount of data in no-blocking mode with DMA from a specific memory address using
|
|
129 HAL_I2C_Mem_Read_DMA()
|
|
130 (+) At MEM end of read transfer HAL_I2C_MemRxCpltCallback is executed and user can
|
|
131 add his own code by customization of function pointer HAL_I2C_MemRxCpltCallback
|
|
132 (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can
|
|
133 add his own code by customization of function pointer HAL_I2C_ErrorCallback
|
|
134
|
|
135
|
|
136 *** I2C HAL driver macros list ***
|
|
137 ==================================
|
|
138 [..]
|
|
139 Below the list of most used macros in I2C HAL driver.
|
|
140
|
|
141 (+) __HAL_I2C_ENABLE: Enable the I2C peripheral
|
|
142 (+) __HAL_I2C_DISABLE: Disable the I2C peripheral
|
|
143 (+) __HAL_I2C_GET_FLAG : Checks whether the specified I2C flag is set or not
|
|
144 (+) __HAL_I2C_CLEAR_FLAG : Clear the specified I2C pending flag
|
|
145 (+) __HAL_I2C_ENABLE_IT: Enable the specified I2C interrupt
|
|
146 (+) __HAL_I2C_DISABLE_IT: Disable the specified I2C interrupt
|
|
147
|
|
148 [..]
|
|
149 (@) You can refer to the I2C HAL driver header file for more useful macros
|
|
150
|
|
151
|
|
152 @endverbatim
|
|
153 ******************************************************************************
|
|
154 * @attention
|
|
155 *
|
|
156 * <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
|
|
157 *
|
|
158 * Redistribution and use in source and binary forms, with or without modification,
|
|
159 * are permitted provided that the following conditions are met:
|
|
160 * 1. Redistributions of source code must retain the above copyright notice,
|
|
161 * this list of conditions and the following disclaimer.
|
|
162 * 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
163 * this list of conditions and the following disclaimer in the documentation
|
|
164 * and/or other materials provided with the distribution.
|
|
165 * 3. Neither the name of STMicroelectronics nor the names of its contributors
|
|
166 * may be used to endorse or promote products derived from this software
|
|
167 * without specific prior written permission.
|
|
168 *
|
|
169 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
170 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
171 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
172 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
173 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
174 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
175 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
176 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
177 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
178 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
179 *
|
|
180 ******************************************************************************
|
|
181 */
|
|
182
|
|
183 /* Includes ------------------------------------------------------------------*/
|
|
184 #include "stm32f4xx_hal.h"
|
|
185
|
|
186 /** @addtogroup STM32F4xx_HAL_Driver
|
|
187 * @{
|
|
188 */
|
|
189
|
|
190 /** @defgroup I2C I2C
|
|
191 * @brief I2C HAL module driver
|
|
192 * @{
|
|
193 */
|
|
194
|
|
195 #ifdef HAL_I2C_MODULE_ENABLED
|
|
196
|
|
197 /* Private typedef -----------------------------------------------------------*/
|
|
198 /* Private define ------------------------------------------------------------*/
|
|
199 /** @addtogroup I2C_Private_Constants
|
|
200 * @{
|
|
201 */
|
|
202 #define I2C_TIMEOUT_FLAG ((uint32_t)35) /* 35 ms */
|
|
203 #define I2C_TIMEOUT_ADDR_SLAVE ((uint32_t)10000) /* 10 s */
|
|
204 /**
|
|
205 * @}
|
|
206 */
|
|
207
|
|
208 /* Private macro -------------------------------------------------------------*/
|
|
209 /* Private variables ---------------------------------------------------------*/
|
|
210 /* Private function prototypes -----------------------------------------------*/
|
|
211 /** @addtogroup I2C_Private_Functions
|
|
212 * @{
|
|
213 */
|
|
214 static void I2C_DMAMasterTransmitCplt(DMA_HandleTypeDef *hdma);
|
|
215 static void I2C_DMAMasterReceiveCplt(DMA_HandleTypeDef *hdma);
|
|
216 static void I2C_DMASlaveTransmitCplt(DMA_HandleTypeDef *hdma);
|
|
217 static void I2C_DMASlaveReceiveCplt(DMA_HandleTypeDef *hdma);
|
|
218 static void I2C_DMAMemTransmitCplt(DMA_HandleTypeDef *hdma);
|
|
219 static void I2C_DMAMemReceiveCplt(DMA_HandleTypeDef *hdma);
|
|
220 static void I2C_DMAError(DMA_HandleTypeDef *hdma);
|
|
221
|
|
222 static HAL_StatusTypeDef I2C_MasterRequestWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout);
|
|
223 static HAL_StatusTypeDef I2C_MasterRequestRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout);
|
|
224 static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout);
|
|
225 static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout);
|
|
226 static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout);
|
|
227 static HAL_StatusTypeDef I2C_WaitOnMasterAddressFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, uint32_t Timeout);
|
|
228
|
|
229 static HAL_StatusTypeDef I2C_MasterTransmit_TXE(I2C_HandleTypeDef *hi2c);
|
|
230 static HAL_StatusTypeDef I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c);
|
|
231 static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c);
|
|
232 static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c);
|
|
233
|
|
234 static HAL_StatusTypeDef I2C_SlaveTransmit_TXE(I2C_HandleTypeDef *hi2c);
|
|
235 static HAL_StatusTypeDef I2C_SlaveTransmit_BTF(I2C_HandleTypeDef *hi2c);
|
|
236 static HAL_StatusTypeDef I2C_SlaveReceive_RXNE(I2C_HandleTypeDef *hi2c);
|
|
237 static HAL_StatusTypeDef I2C_SlaveReceive_BTF(I2C_HandleTypeDef *hi2c);
|
|
238 static HAL_StatusTypeDef I2C_Slave_ADDR(I2C_HandleTypeDef *hi2c);
|
|
239 static HAL_StatusTypeDef I2C_Slave_STOPF(I2C_HandleTypeDef *hi2c);
|
|
240 static HAL_StatusTypeDef I2C_Slave_AF(I2C_HandleTypeDef *hi2c);
|
|
241 /**
|
|
242 * @}
|
|
243 */
|
|
244
|
|
245 /* Exported functions --------------------------------------------------------*/
|
|
246 /** @defgroup I2C_Exported_Functions I2C Exported Functions
|
|
247 * @{
|
|
248 */
|
|
249
|
|
250 /** @defgroup I2C_Exported_Functions_Group1 Initialization and de-initialization functions
|
|
251 * @brief Initialization and Configuration functions
|
|
252 *
|
|
253 @verbatim
|
|
254 ===============================================================================
|
|
255 ##### Initialization and de-initialization functions #####
|
|
256 ===============================================================================
|
|
257 [..] This subsection provides a set of functions allowing to initialize and
|
|
258 de-initialize the I2Cx peripheral:
|
|
259
|
|
260 (+) User must Implement HAL_I2C_MspInit() function in which he configures
|
|
261 all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC).
|
|
262
|
|
263 (+) Call the function HAL_I2C_Init() to configure the selected device with
|
|
264 the selected configuration:
|
|
265 (++) Communication Speed
|
|
266 (++) Duty cycle
|
|
267 (++) Addressing mode
|
|
268 (++) Own Address 1
|
|
269 (++) Dual Addressing mode
|
|
270 (++) Own Address 2
|
|
271 (++) General call mode
|
|
272 (++) Nostretch mode
|
|
273
|
|
274 (+) Call the function HAL_I2C_DeInit() to restore the default configuration
|
|
275 of the selected I2Cx peripheral.
|
|
276
|
|
277 @endverbatim
|
|
278 * @{
|
|
279 */
|
|
280
|
|
281 /**
|
|
282 * @brief Initializes the I2C according to the specified parameters
|
|
283 * in the I2C_InitTypeDef and create the associated handle.
|
|
284 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
285 * the configuration information for I2C module
|
|
286 * @retval HAL status
|
|
287 */
|
|
288 HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c)
|
|
289 {
|
|
290 uint32_t freqrange = 0;
|
|
291 uint32_t pclk1 = 0;
|
|
292
|
|
293 /* Check the I2C handle allocation */
|
|
294 if(hi2c == NULL)
|
|
295 {
|
|
296 return HAL_ERROR;
|
|
297 }
|
|
298
|
|
299 /* Check the parameters */
|
|
300 assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance));
|
|
301 assert_param(IS_I2C_CLOCK_SPEED(hi2c->Init.ClockSpeed));
|
|
302 assert_param(IS_I2C_DUTY_CYCLE(hi2c->Init.DutyCycle));
|
|
303 assert_param(IS_I2C_OWN_ADDRESS1(hi2c->Init.OwnAddress1));
|
|
304 assert_param(IS_I2C_ADDRESSING_MODE(hi2c->Init.AddressingMode));
|
|
305 assert_param(IS_I2C_DUAL_ADDRESS(hi2c->Init.DualAddressMode));
|
|
306 assert_param(IS_I2C_OWN_ADDRESS2(hi2c->Init.OwnAddress2));
|
|
307 assert_param(IS_I2C_GENERAL_CALL(hi2c->Init.GeneralCallMode));
|
|
308 assert_param(IS_I2C_NO_STRETCH(hi2c->Init.NoStretchMode));
|
|
309
|
|
310 if(hi2c->State == HAL_I2C_STATE_RESET)
|
|
311 {
|
|
312 /* Init the low level hardware : GPIO, CLOCK, NVIC */
|
|
313 HAL_I2C_MspInit(hi2c);
|
|
314 }
|
|
315
|
|
316 hi2c->State = HAL_I2C_STATE_BUSY;
|
|
317
|
|
318 /* Disable the selected I2C peripheral */
|
|
319 __HAL_I2C_DISABLE(hi2c);
|
|
320
|
|
321 /* Get PCLK1 frequency */
|
|
322 pclk1 = HAL_RCC_GetPCLK1Freq();
|
|
323
|
|
324 /* Calculate frequency range */
|
|
325 freqrange = I2C_FREQRANGE(pclk1);
|
|
326
|
|
327 /*---------------------------- I2Cx CR2 Configuration ----------------------*/
|
|
328 /* Configure I2Cx: Frequency range */
|
|
329 hi2c->Instance->CR2 = freqrange;
|
|
330
|
|
331 /*---------------------------- I2Cx TRISE Configuration --------------------*/
|
|
332 /* Configure I2Cx: Rise Time */
|
|
333 hi2c->Instance->TRISE = I2C_RISE_TIME(freqrange, hi2c->Init.ClockSpeed);
|
|
334
|
|
335 /*---------------------------- I2Cx CCR Configuration ----------------------*/
|
|
336 /* Configure I2Cx: Speed */
|
|
337 hi2c->Instance->CCR = I2C_SPEED(pclk1, hi2c->Init.ClockSpeed, hi2c->Init.DutyCycle);
|
|
338
|
|
339 /*---------------------------- I2Cx CR1 Configuration ----------------------*/
|
|
340 /* Configure I2Cx: Generalcall and NoStretch mode */
|
|
341 hi2c->Instance->CR1 = (hi2c->Init.GeneralCallMode | hi2c->Init.NoStretchMode);
|
|
342
|
|
343 /*---------------------------- I2Cx OAR1 Configuration ---------------------*/
|
|
344 /* Configure I2Cx: Own Address1 and addressing mode */
|
|
345 hi2c->Instance->OAR1 = (hi2c->Init.AddressingMode | hi2c->Init.OwnAddress1);
|
|
346
|
|
347 /*---------------------------- I2Cx OAR2 Configuration ---------------------*/
|
|
348 /* Configure I2Cx: Dual mode and Own Address2 */
|
|
349 hi2c->Instance->OAR2 = (hi2c->Init.DualAddressMode | hi2c->Init.OwnAddress2);
|
|
350
|
|
351 /* Enable the selected I2C peripheral */
|
|
352 __HAL_I2C_ENABLE(hi2c);
|
|
353
|
|
354 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
355 hi2c->State = HAL_I2C_STATE_READY;
|
|
356
|
|
357 return HAL_OK;
|
|
358 }
|
|
359
|
|
360 /**
|
|
361 * @brief DeInitializes the I2C peripheral.
|
|
362 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
363 * the configuration information for I2C module
|
|
364 * @retval HAL status
|
|
365 */
|
|
366 HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c)
|
|
367 {
|
|
368 /* Check the I2C handle allocation */
|
|
369 if(hi2c == NULL)
|
|
370 {
|
|
371 return HAL_ERROR;
|
|
372 }
|
|
373
|
|
374 /* Check the parameters */
|
|
375 assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance));
|
|
376
|
|
377 hi2c->State = HAL_I2C_STATE_BUSY;
|
|
378
|
|
379 /* Disable the I2C Peripheral Clock */
|
|
380 __HAL_I2C_DISABLE(hi2c);
|
|
381
|
|
382 /* DeInit the low level hardware: GPIO, CLOCK, NVIC */
|
|
383 HAL_I2C_MspDeInit(hi2c);
|
|
384
|
|
385 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
386
|
|
387 hi2c->State = HAL_I2C_STATE_RESET;
|
|
388
|
|
389 /* Release Lock */
|
|
390 __HAL_UNLOCK(hi2c);
|
|
391
|
|
392 return HAL_OK;
|
|
393 }
|
|
394
|
|
395 /**
|
|
396 * @brief I2C MSP Init.
|
|
397 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
398 * the configuration information for I2C module
|
|
399 * @retval None
|
|
400 */
|
|
401 __weak void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c)
|
|
402 {
|
|
403 /* NOTE : This function Should not be modified, when the callback is needed,
|
|
404 the HAL_I2C_MspInit could be implemented in the user file
|
|
405 */
|
|
406 }
|
|
407
|
|
408 /**
|
|
409 * @brief I2C MSP DeInit
|
|
410 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
411 * the configuration information for I2C module
|
|
412 * @retval None
|
|
413 */
|
|
414 __weak void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c)
|
|
415 {
|
|
416 /* NOTE : This function Should not be modified, when the callback is needed,
|
|
417 the HAL_I2C_MspDeInit could be implemented in the user file
|
|
418 */
|
|
419 }
|
|
420
|
|
421 /**
|
|
422 * @}
|
|
423 */
|
|
424
|
|
425 /** @defgroup I2C_Exported_Functions_Group2 IO operation functions
|
|
426 * @brief Data transfers functions
|
|
427 *
|
|
428 @verbatim
|
|
429 ===============================================================================
|
|
430 ##### IO operation functions #####
|
|
431 ===============================================================================
|
|
432 [..]
|
|
433 This subsection provides a set of functions allowing to manage the I2C data
|
|
434 transfers.
|
|
435
|
|
436 (#) There are two modes of transfer:
|
|
437 (++) Blocking mode : The communication is performed in the polling mode.
|
|
438 The status of all data processing is returned by the same function
|
|
439 after finishing transfer.
|
|
440 (++) No-Blocking mode : The communication is performed using Interrupts
|
|
441 or DMA. These functions return the status of the transfer startup.
|
|
442 The end of the data processing will be indicated through the
|
|
443 dedicated I2C IRQ when using Interrupt mode or the DMA IRQ when
|
|
444 using DMA mode.
|
|
445
|
|
446 (#) Blocking mode functions are :
|
|
447 (++) HAL_I2C_Master_Transmit()
|
|
448 (++) HAL_I2C_Master_Receive()
|
|
449 (++) HAL_I2C_Slave_Transmit()
|
|
450 (++) HAL_I2C_Slave_Receive()
|
|
451 (++) HAL_I2C_Mem_Write()
|
|
452 (++) HAL_I2C_Mem_Read()
|
|
453 (++) HAL_I2C_IsDeviceReady()
|
|
454
|
|
455 (#) No-Blocking mode functions with Interrupt are :
|
|
456 (++) HAL_I2C_Master_Transmit_IT()
|
|
457 (++) HAL_I2C_Master_Receive_IT()
|
|
458 (++) HAL_I2C_Slave_Transmit_IT()
|
|
459 (++) HAL_I2C_Slave_Receive_IT()
|
|
460 (++) HAL_I2C_Mem_Write_IT()
|
|
461 (++) HAL_I2C_Mem_Read_IT()
|
|
462
|
|
463 (#) No-Blocking mode functions with DMA are :
|
|
464 (++) HAL_I2C_Master_Transmit_DMA()
|
|
465 (++) HAL_I2C_Master_Receive_DMA()
|
|
466 (++) HAL_I2C_Slave_Transmit_DMA()
|
|
467 (++) HAL_I2C_Slave_Receive_DMA()
|
|
468 (++) HAL_I2C_Mem_Write_DMA()
|
|
469 (++) HAL_I2C_Mem_Read_DMA()
|
|
470
|
|
471 (#) A set of Transfer Complete Callbacks are provided in non Blocking mode:
|
|
472 (++) HAL_I2C_MemTxCpltCallback()
|
|
473 (++) HAL_I2C_MemRxCpltCallback()
|
|
474 (++) HAL_I2C_MasterTxCpltCallback()
|
|
475 (++) HAL_I2C_MasterRxCpltCallback()
|
|
476 (++) HAL_I2C_SlaveTxCpltCallback()
|
|
477 (++) HAL_I2C_SlaveRxCpltCallback()
|
|
478 (++) HAL_I2C_ErrorCallback()
|
|
479
|
|
480 @endverbatim
|
|
481 * @{
|
|
482 */
|
|
483
|
|
484 /**
|
|
485 * @brief Transmits in master mode an amount of data in blocking mode.
|
|
486 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
487 * the configuration information for I2C module
|
|
488 * @param DevAddress: Target device address
|
|
489 * @param pData: Pointer to data buffer
|
|
490 * @param Size: Amount of data to be sent
|
|
491 * @param Timeout: Timeout duration
|
|
492 * @retval HAL status
|
|
493 */
|
|
494 HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
|
|
495 {
|
|
496 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
497 {
|
|
498 if((pData == NULL) || (Size == 0))
|
|
499 {
|
|
500 return HAL_ERROR;
|
|
501 }
|
|
502
|
|
503 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
504 {
|
|
505 return HAL_BUSY;
|
|
506 }
|
|
507
|
|
508 /* Process Locked */
|
|
509 __HAL_LOCK(hi2c);
|
|
510
|
|
511 hi2c->State = HAL_I2C_STATE_BUSY_TX;
|
|
512 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
513
|
|
514 /* Send Slave Address */
|
|
515 if(I2C_MasterRequestWrite(hi2c, DevAddress, Timeout) != HAL_OK)
|
|
516 {
|
|
517 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
518 {
|
|
519 /* Process Unlocked */
|
|
520 __HAL_UNLOCK(hi2c);
|
|
521 return HAL_ERROR;
|
|
522 }
|
|
523 else
|
|
524 {
|
|
525 /* Process Unlocked */
|
|
526 __HAL_UNLOCK(hi2c);
|
|
527 return HAL_TIMEOUT;
|
|
528 }
|
|
529 }
|
|
530
|
|
531 /* Clear ADDR flag */
|
|
532 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
533
|
|
534 while(Size > 0)
|
|
535 {
|
|
536 /* Wait until TXE flag is set */
|
|
537 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK)
|
|
538 {
|
|
539 return HAL_TIMEOUT;
|
|
540 }
|
|
541
|
|
542 /* Write data to DR */
|
|
543 hi2c->Instance->DR = (*pData++);
|
|
544 Size--;
|
|
545
|
|
546 if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (Size != 0))
|
|
547 {
|
|
548 /* Write data to DR */
|
|
549 hi2c->Instance->DR = (*pData++);
|
|
550 Size--;
|
|
551 }
|
|
552 }
|
|
553
|
|
554 /* Wait until TXE flag is set */
|
|
555 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK)
|
|
556 {
|
|
557 return HAL_TIMEOUT;
|
|
558 }
|
|
559
|
|
560 /* Generate Stop */
|
|
561 hi2c->Instance->CR1 |= I2C_CR1_STOP;
|
|
562
|
|
563 /* Wait until BUSY flag is reset */
|
|
564 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout) != HAL_OK)
|
|
565 {
|
|
566 return HAL_TIMEOUT;
|
|
567 }
|
|
568
|
|
569 hi2c->State = HAL_I2C_STATE_READY;
|
|
570
|
|
571 /* Process Unlocked */
|
|
572 __HAL_UNLOCK(hi2c);
|
|
573
|
|
574 return HAL_OK;
|
|
575 }
|
|
576 else
|
|
577 {
|
|
578 return HAL_BUSY;
|
|
579 }
|
|
580 }
|
|
581
|
|
582 /**
|
|
583 * @brief Receives in master mode an amount of data in blocking mode.
|
|
584 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
585 * the configuration information for I2C module
|
|
586 * @param DevAddress: Target device address
|
|
587 * @param pData: Pointer to data buffer
|
|
588 * @param Size: Amount of data to be sent
|
|
589 * @param Timeout: Timeout duration
|
|
590 * @retval HAL status
|
|
591 */
|
|
592 HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
|
|
593 {
|
|
594 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
595 {
|
|
596 if((pData == NULL) || (Size == 0))
|
|
597 {
|
|
598 return HAL_ERROR;
|
|
599 }
|
|
600
|
|
601 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
602 {
|
|
603 return HAL_BUSY;
|
|
604 }
|
|
605
|
|
606 /* Process Locked */
|
|
607 __HAL_LOCK(hi2c);
|
|
608
|
|
609 hi2c->State = HAL_I2C_STATE_BUSY_RX;
|
|
610 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
611
|
|
612 /* Send Slave Address */
|
|
613 if(I2C_MasterRequestRead(hi2c, DevAddress, Timeout) != HAL_OK)
|
|
614 {
|
|
615 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
616 {
|
|
617 /* Process Unlocked */
|
|
618 __HAL_UNLOCK(hi2c);
|
|
619 return HAL_ERROR;
|
|
620 }
|
|
621 else
|
|
622 {
|
|
623 /* Process Unlocked */
|
|
624 __HAL_UNLOCK(hi2c);
|
|
625 return HAL_TIMEOUT;
|
|
626 }
|
|
627 }
|
|
628
|
|
629 if(Size == 1)
|
|
630 {
|
|
631 /* Disable Acknowledge */
|
|
632 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
|
|
633
|
|
634 /* Clear ADDR flag */
|
|
635 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
636
|
|
637 /* Generate Stop */
|
|
638 hi2c->Instance->CR1 |= I2C_CR1_STOP;
|
|
639 }
|
|
640 else if(Size == 2)
|
|
641 {
|
|
642 /* Disable Acknowledge */
|
|
643 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
|
|
644
|
|
645 /* Enable Pos */
|
|
646 hi2c->Instance->CR1 |= I2C_CR1_POS;
|
|
647
|
|
648 /* Clear ADDR flag */
|
|
649 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
650 }
|
|
651 else
|
|
652 {
|
|
653 /* Enable Acknowledge */
|
|
654 hi2c->Instance->CR1 |= I2C_CR1_ACK;
|
|
655
|
|
656 /* Clear ADDR flag */
|
|
657 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
658 }
|
|
659
|
|
660 while(Size > 0)
|
|
661 {
|
|
662 if(Size <= 3)
|
|
663 {
|
|
664 /* One byte */
|
|
665 if(Size == 1)
|
|
666 {
|
|
667 /* Wait until RXNE flag is set */
|
|
668 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, Timeout) != HAL_OK)
|
|
669 {
|
|
670 return HAL_TIMEOUT;
|
|
671 }
|
|
672
|
|
673 /* Read data from DR */
|
|
674 (*pData++) = hi2c->Instance->DR;
|
|
675 Size--;
|
|
676 }
|
|
677 /* Two bytes */
|
|
678 else if(Size == 2)
|
|
679 {
|
|
680 /* Wait until BTF flag is set */
|
|
681 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout) != HAL_OK)
|
|
682 {
|
|
683 return HAL_TIMEOUT;
|
|
684 }
|
|
685
|
|
686 /* Generate Stop */
|
|
687 hi2c->Instance->CR1 |= I2C_CR1_STOP;
|
|
688
|
|
689 /* Read data from DR */
|
|
690 (*pData++) = hi2c->Instance->DR;
|
|
691 Size--;
|
|
692
|
|
693 /* Read data from DR */
|
|
694 (*pData++) = hi2c->Instance->DR;
|
|
695 Size--;
|
|
696 }
|
|
697 /* 3 Last bytes */
|
|
698 else
|
|
699 {
|
|
700 /* Wait until BTF flag is set */
|
|
701 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout) != HAL_OK)
|
|
702 {
|
|
703 return HAL_TIMEOUT;
|
|
704 }
|
|
705
|
|
706 /* Disable Acknowledge */
|
|
707 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
|
|
708
|
|
709 /* Read data from DR */
|
|
710 (*pData++) = hi2c->Instance->DR;
|
|
711 Size--;
|
|
712
|
|
713 /* Wait until BTF flag is set */
|
|
714 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout) != HAL_OK)
|
|
715 {
|
|
716 return HAL_TIMEOUT;
|
|
717 }
|
|
718
|
|
719 /* Generate Stop */
|
|
720 hi2c->Instance->CR1 |= I2C_CR1_STOP;
|
|
721
|
|
722 /* Read data from DR */
|
|
723 (*pData++) = hi2c->Instance->DR;
|
|
724 Size--;
|
|
725
|
|
726 /* Read data from DR */
|
|
727 (*pData++) = hi2c->Instance->DR;
|
|
728 Size--;
|
|
729 }
|
|
730 }
|
|
731 else
|
|
732 {
|
|
733 /* Wait until RXNE flag is set */
|
|
734 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, Timeout) != HAL_OK)
|
|
735 {
|
|
736 return HAL_TIMEOUT;
|
|
737 }
|
|
738
|
|
739 /* Read data from DR */
|
|
740 (*pData++) = hi2c->Instance->DR;
|
|
741 Size--;
|
|
742
|
|
743 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET)
|
|
744 {
|
|
745 /* Read data from DR */
|
|
746 (*pData++) = hi2c->Instance->DR;
|
|
747 Size--;
|
|
748 }
|
|
749 }
|
|
750 }
|
|
751
|
|
752 /* Disable Pos */
|
|
753 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
|
|
754
|
|
755 /* Wait until BUSY flag is reset */
|
|
756 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout) != HAL_OK)
|
|
757 {
|
|
758 return HAL_TIMEOUT;
|
|
759 }
|
|
760
|
|
761 hi2c->State = HAL_I2C_STATE_READY;
|
|
762
|
|
763 /* Process Unlocked */
|
|
764 __HAL_UNLOCK(hi2c);
|
|
765
|
|
766 return HAL_OK;
|
|
767 }
|
|
768 else
|
|
769 {
|
|
770 return HAL_BUSY;
|
|
771 }
|
|
772 }
|
|
773
|
|
774 /**
|
|
775 * @brief Transmits in slave mode an amount of data in blocking mode.
|
|
776 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
777 * the configuration information for I2C module
|
|
778 * @param pData: Pointer to data buffer
|
|
779 * @param Size: Amount of data to be sent
|
|
780 * @param Timeout: Timeout duration
|
|
781 * @retval HAL status
|
|
782 */
|
|
783 HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout)
|
|
784 {
|
|
785 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
786 {
|
|
787 if((pData == NULL) || (Size == 0))
|
|
788 {
|
|
789 return HAL_ERROR;
|
|
790 }
|
|
791
|
|
792 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
793 {
|
|
794 return HAL_BUSY;
|
|
795 }
|
|
796
|
|
797 /* Process Locked */
|
|
798 __HAL_LOCK(hi2c);
|
|
799
|
|
800 hi2c->State = HAL_I2C_STATE_BUSY_TX;
|
|
801 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
802
|
|
803 /* Enable Address Acknowledge */
|
|
804 hi2c->Instance->CR1 |= I2C_CR1_ACK;
|
|
805
|
|
806 /* Wait until ADDR flag is set */
|
|
807 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout) != HAL_OK)
|
|
808 {
|
|
809 return HAL_TIMEOUT;
|
|
810 }
|
|
811
|
|
812 /* Clear ADDR flag */
|
|
813 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
814
|
|
815 /* If 10bit addressing mode is selected */
|
|
816 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT)
|
|
817 {
|
|
818 /* Wait until ADDR flag is set */
|
|
819 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout) != HAL_OK)
|
|
820 {
|
|
821 return HAL_TIMEOUT;
|
|
822 }
|
|
823
|
|
824 /* Clear ADDR flag */
|
|
825 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
826 }
|
|
827
|
|
828 while(Size > 0)
|
|
829 {
|
|
830 /* Wait until TXE flag is set */
|
|
831 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK)
|
|
832 {
|
|
833 return HAL_TIMEOUT;
|
|
834 }
|
|
835
|
|
836 /* Write data to DR */
|
|
837 hi2c->Instance->DR = (*pData++);
|
|
838 Size--;
|
|
839
|
|
840 if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (Size != 0))
|
|
841 {
|
|
842 /* Write data to DR */
|
|
843 hi2c->Instance->DR = (*pData++);
|
|
844 Size--;
|
|
845 }
|
|
846 }
|
|
847
|
|
848 /* Wait until AF flag is set */
|
|
849 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_AF, RESET, Timeout) != HAL_OK)
|
|
850 {
|
|
851 return HAL_TIMEOUT;
|
|
852 }
|
|
853
|
|
854 /* Clear AF flag */
|
|
855 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
|
|
856
|
|
857 /* Disable Address Acknowledge */
|
|
858 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
|
|
859
|
|
860 /* Wait until BUSY flag is reset */
|
|
861 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout) != HAL_OK)
|
|
862 {
|
|
863 return HAL_TIMEOUT;
|
|
864 }
|
|
865
|
|
866 hi2c->State = HAL_I2C_STATE_READY;
|
|
867
|
|
868 /* Process Unlocked */
|
|
869 __HAL_UNLOCK(hi2c);
|
|
870
|
|
871 return HAL_OK;
|
|
872 }
|
|
873 else
|
|
874 {
|
|
875 return HAL_BUSY;
|
|
876 }
|
|
877 }
|
|
878
|
|
879 /**
|
|
880 * @brief Receive in slave mode an amount of data in blocking mode
|
|
881 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
882 * the configuration information for I2C module
|
|
883 * @param pData: Pointer to data buffer
|
|
884 * @param Size: Amount of data to be sent
|
|
885 * @param Timeout: Timeout duration
|
|
886 * @retval HAL status
|
|
887 */
|
|
888 HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout)
|
|
889 {
|
|
890 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
891 {
|
|
892 if((pData == NULL) || (Size == 0))
|
|
893 {
|
|
894 return HAL_ERROR;
|
|
895 }
|
|
896
|
|
897 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
898 {
|
|
899 return HAL_BUSY;
|
|
900 }
|
|
901
|
|
902 /* Process Locked */
|
|
903 __HAL_LOCK(hi2c);
|
|
904
|
|
905 hi2c->State = HAL_I2C_STATE_BUSY_RX;
|
|
906 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
907
|
|
908 /* Enable Address Acknowledge */
|
|
909 hi2c->Instance->CR1 |= I2C_CR1_ACK;
|
|
910
|
|
911 /* Wait until ADDR flag is set */
|
|
912 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout) != HAL_OK)
|
|
913 {
|
|
914 return HAL_TIMEOUT;
|
|
915 }
|
|
916
|
|
917 /* Clear ADDR flag */
|
|
918 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
919
|
|
920 while(Size > 0)
|
|
921 {
|
|
922 /* Wait until RXNE flag is set */
|
|
923 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, Timeout) != HAL_OK)
|
|
924 {
|
|
925 return HAL_TIMEOUT;
|
|
926 }
|
|
927
|
|
928 /* Read data from DR */
|
|
929 (*pData++) = hi2c->Instance->DR;
|
|
930 Size--;
|
|
931
|
|
932 if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (Size != 0))
|
|
933 {
|
|
934 /* Read data from DR */
|
|
935 (*pData++) = hi2c->Instance->DR;
|
|
936 Size--;
|
|
937 }
|
|
938 }
|
|
939
|
|
940 /* Wait until STOP flag is set */
|
|
941 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_STOPF, RESET, Timeout) != HAL_OK)
|
|
942 {
|
|
943 return HAL_TIMEOUT;
|
|
944 }
|
|
945
|
|
946 /* Clear STOP flag */
|
|
947 __HAL_I2C_CLEAR_STOPFLAG(hi2c);
|
|
948
|
|
949 /* Disable Address Acknowledge */
|
|
950 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
|
|
951
|
|
952 /* Wait until BUSY flag is reset */
|
|
953 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout) != HAL_OK)
|
|
954 {
|
|
955 return HAL_TIMEOUT;
|
|
956 }
|
|
957
|
|
958 hi2c->State = HAL_I2C_STATE_READY;
|
|
959
|
|
960 /* Process Unlocked */
|
|
961 __HAL_UNLOCK(hi2c);
|
|
962
|
|
963 return HAL_OK;
|
|
964 }
|
|
965 else
|
|
966 {
|
|
967 return HAL_BUSY;
|
|
968 }
|
|
969 }
|
|
970
|
|
971 /**
|
|
972 * @brief Transmit in master mode an amount of data in no-blocking mode with Interrupt
|
|
973 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
974 * the configuration information for I2C module
|
|
975 * @param DevAddress: Target device address
|
|
976 * @param pData: Pointer to data buffer
|
|
977 * @param Size: Amount of data to be sent
|
|
978 * @retval HAL status
|
|
979 */
|
|
980 HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
|
|
981 {
|
|
982 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
983 {
|
|
984 if((pData == NULL) || (Size == 0))
|
|
985 {
|
|
986 return HAL_ERROR;
|
|
987 }
|
|
988
|
|
989 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
990 {
|
|
991 return HAL_BUSY;
|
|
992 }
|
|
993
|
|
994 /* Process Locked */
|
|
995 __HAL_LOCK(hi2c);
|
|
996
|
|
997 hi2c->State = HAL_I2C_STATE_BUSY_TX;
|
|
998 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
999
|
|
1000 hi2c->pBuffPtr = pData;
|
|
1001 hi2c->XferSize = Size;
|
|
1002 hi2c->XferCount = Size;
|
|
1003
|
|
1004 /* Send Slave Address */
|
|
1005 if(I2C_MasterRequestWrite(hi2c, DevAddress, I2C_TIMEOUT_FLAG) != HAL_OK)
|
|
1006 {
|
|
1007 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
1008 {
|
|
1009 /* Process Unlocked */
|
|
1010 __HAL_UNLOCK(hi2c);
|
|
1011 return HAL_ERROR;
|
|
1012 }
|
|
1013 else
|
|
1014 {
|
|
1015 /* Process Unlocked */
|
|
1016 __HAL_UNLOCK(hi2c);
|
|
1017 return HAL_TIMEOUT;
|
|
1018 }
|
|
1019 }
|
|
1020
|
|
1021 /* Clear ADDR flag */
|
|
1022 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
1023
|
|
1024 /* Process Unlocked */
|
|
1025 __HAL_UNLOCK(hi2c);
|
|
1026
|
|
1027 /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
1028 to avoid the risk of I2C interrupt handle execution before current
|
|
1029 process unlock */
|
|
1030
|
|
1031 /* Enable EVT, BUF and ERR interrupt */
|
|
1032 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
|
|
1033
|
|
1034 return HAL_OK;
|
|
1035 }
|
|
1036 else
|
|
1037 {
|
|
1038 return HAL_BUSY;
|
|
1039 }
|
|
1040 }
|
|
1041
|
|
1042 /**
|
|
1043 * @brief Receive in master mode an amount of data in no-blocking mode with Interrupt
|
|
1044 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
1045 * the configuration information for I2C module
|
|
1046 * @param DevAddress: Target device address
|
|
1047 * @param pData: Pointer to data buffer
|
|
1048 * @param Size: Amount of data to be sent
|
|
1049 * @retval HAL status
|
|
1050 */
|
|
1051 HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
|
|
1052 {
|
|
1053 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
1054 {
|
|
1055 if((pData == NULL) || (Size == 0))
|
|
1056 {
|
|
1057 return HAL_ERROR;
|
|
1058 }
|
|
1059
|
|
1060 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
1061 {
|
|
1062 return HAL_BUSY;
|
|
1063 }
|
|
1064
|
|
1065 /* Process Locked */
|
|
1066 __HAL_LOCK(hi2c);
|
|
1067
|
|
1068 hi2c->State = HAL_I2C_STATE_BUSY_RX;
|
|
1069 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
1070
|
|
1071 hi2c->pBuffPtr = pData;
|
|
1072 hi2c->XferSize = Size;
|
|
1073 hi2c->XferCount = Size;
|
|
1074
|
|
1075 /* Send Slave Address */
|
|
1076 if(I2C_MasterRequestRead(hi2c, DevAddress, I2C_TIMEOUT_FLAG) != HAL_OK)
|
|
1077 {
|
|
1078 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
1079 {
|
|
1080 /* Process Unlocked */
|
|
1081 __HAL_UNLOCK(hi2c);
|
|
1082 return HAL_ERROR;
|
|
1083 }
|
|
1084 else
|
|
1085 {
|
|
1086 /* Process Unlocked */
|
|
1087 __HAL_UNLOCK(hi2c);
|
|
1088 return HAL_TIMEOUT;
|
|
1089 }
|
|
1090 }
|
|
1091
|
|
1092 if(hi2c->XferCount == 1)
|
|
1093 {
|
|
1094 /* Disable Acknowledge */
|
|
1095 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
|
|
1096
|
|
1097 /* Clear ADDR flag */
|
|
1098 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
1099
|
|
1100 /* Generate Stop */
|
|
1101 hi2c->Instance->CR1 |= I2C_CR1_STOP;
|
|
1102 }
|
|
1103 else if(hi2c->XferCount == 2)
|
|
1104 {
|
|
1105 /* Disable Acknowledge */
|
|
1106 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
|
|
1107
|
|
1108 /* Enable Pos */
|
|
1109 hi2c->Instance->CR1 |= I2C_CR1_POS;
|
|
1110
|
|
1111 /* Clear ADDR flag */
|
|
1112 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
1113 }
|
|
1114 else
|
|
1115 {
|
|
1116 /* Enable Acknowledge */
|
|
1117 hi2c->Instance->CR1 |= I2C_CR1_ACK;
|
|
1118
|
|
1119 /* Clear ADDR flag */
|
|
1120 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
1121 }
|
|
1122
|
|
1123 /* Process Unlocked */
|
|
1124 __HAL_UNLOCK(hi2c);
|
|
1125
|
|
1126 /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
1127 to avoid the risk of I2C interrupt handle execution before current
|
|
1128 process unlock */
|
|
1129
|
|
1130 /* Enable EVT, BUF and ERR interrupt */
|
|
1131 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
|
|
1132
|
|
1133 return HAL_OK;
|
|
1134 }
|
|
1135 else
|
|
1136 {
|
|
1137 return HAL_BUSY;
|
|
1138 }
|
|
1139 }
|
|
1140
|
|
1141 /**
|
|
1142 * @brief Transmit in slave mode an amount of data in no-blocking mode with Interrupt
|
|
1143 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
1144 * the configuration information for I2C module
|
|
1145 * @param pData: Pointer to data buffer
|
|
1146 * @param Size: Amount of data to be sent
|
|
1147 * @retval HAL status
|
|
1148 */
|
|
1149 HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
|
|
1150 {
|
|
1151 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
1152 {
|
|
1153 if((pData == NULL) || (Size == 0))
|
|
1154 {
|
|
1155 return HAL_ERROR;
|
|
1156 }
|
|
1157
|
|
1158 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
1159 {
|
|
1160 return HAL_BUSY;
|
|
1161 }
|
|
1162
|
|
1163 /* Process Locked */
|
|
1164 __HAL_LOCK(hi2c);
|
|
1165
|
|
1166 hi2c->State = HAL_I2C_STATE_BUSY_TX;
|
|
1167 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
1168
|
|
1169 hi2c->pBuffPtr = pData;
|
|
1170 hi2c->XferSize = Size;
|
|
1171 hi2c->XferCount = Size;
|
|
1172
|
|
1173 /* Enable Address Acknowledge */
|
|
1174 hi2c->Instance->CR1 |= I2C_CR1_ACK;
|
|
1175
|
|
1176 /* Process Unlocked */
|
|
1177 __HAL_UNLOCK(hi2c);
|
|
1178
|
|
1179 /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
1180 to avoid the risk of I2C interrupt handle execution before current
|
|
1181 process unlock */
|
|
1182
|
|
1183 /* Enable EVT, BUF and ERR interrupt */
|
|
1184 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
|
|
1185
|
|
1186 return HAL_OK;
|
|
1187 }
|
|
1188 else
|
|
1189 {
|
|
1190 return HAL_BUSY;
|
|
1191 }
|
|
1192 }
|
|
1193
|
|
1194 /**
|
|
1195 * @brief Receive in slave mode an amount of data in no-blocking mode with Interrupt
|
|
1196 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
1197 * the configuration information for I2C module
|
|
1198 * @param pData: Pointer to data buffer
|
|
1199 * @param Size: Amount of data to be sent
|
|
1200 * @retval HAL status
|
|
1201 */
|
|
1202 HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
|
|
1203 {
|
|
1204 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
1205 {
|
|
1206 if((pData == NULL) || (Size == 0))
|
|
1207 {
|
|
1208 return HAL_ERROR;
|
|
1209 }
|
|
1210
|
|
1211 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
1212 {
|
|
1213 return HAL_BUSY;
|
|
1214 }
|
|
1215
|
|
1216 /* Process Locked */
|
|
1217 __HAL_LOCK(hi2c);
|
|
1218
|
|
1219 hi2c->State = HAL_I2C_STATE_BUSY_RX;
|
|
1220 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
1221
|
|
1222 hi2c->pBuffPtr = pData;
|
|
1223 hi2c->XferSize = Size;
|
|
1224 hi2c->XferCount = Size;
|
|
1225
|
|
1226 /* Enable Address Acknowledge */
|
|
1227 hi2c->Instance->CR1 |= I2C_CR1_ACK;
|
|
1228
|
|
1229 /* Process Unlocked */
|
|
1230 __HAL_UNLOCK(hi2c);
|
|
1231
|
|
1232 /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
1233 to avoid the risk of I2C interrupt handle execution before current
|
|
1234 process unlock */
|
|
1235
|
|
1236 /* Enable EVT, BUF and ERR interrupt */
|
|
1237 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
|
|
1238
|
|
1239 return HAL_OK;
|
|
1240 }
|
|
1241 else
|
|
1242 {
|
|
1243 return HAL_BUSY;
|
|
1244 }
|
|
1245 }
|
|
1246
|
|
1247 /**
|
|
1248 * @brief Transmit in master mode an amount of data in no-blocking mode with DMA
|
|
1249 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
1250 * the configuration information for I2C module
|
|
1251 * @param DevAddress: Target device address
|
|
1252 * @param pData: Pointer to data buffer
|
|
1253 * @param Size: Amount of data to be sent
|
|
1254 * @retval HAL status
|
|
1255 */
|
|
1256 HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
|
|
1257 {
|
|
1258 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
1259 {
|
|
1260 if((pData == NULL) || (Size == 0))
|
|
1261 {
|
|
1262 return HAL_ERROR;
|
|
1263 }
|
|
1264
|
|
1265 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
1266 {
|
|
1267 return HAL_BUSY;
|
|
1268 }
|
|
1269
|
|
1270 /* Process Locked */
|
|
1271 __HAL_LOCK(hi2c);
|
|
1272
|
|
1273 hi2c->State = HAL_I2C_STATE_BUSY_TX;
|
|
1274 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
1275
|
|
1276 hi2c->pBuffPtr = pData;
|
|
1277 hi2c->XferSize = Size;
|
|
1278 hi2c->XferCount = Size;
|
|
1279
|
|
1280 /* Set the I2C DMA transfer complete callback */
|
|
1281 hi2c->hdmatx->XferCpltCallback = I2C_DMAMasterTransmitCplt;
|
|
1282
|
|
1283 /* Set the DMA error callback */
|
|
1284 hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
|
|
1285
|
|
1286 /* Enable the DMA Stream */
|
|
1287 HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->DR, Size);
|
|
1288
|
|
1289 /* Send Slave Address */
|
|
1290 if(I2C_MasterRequestWrite(hi2c, DevAddress, I2C_TIMEOUT_FLAG) != HAL_OK)
|
|
1291 {
|
|
1292 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
1293 {
|
|
1294 /* Process Unlocked */
|
|
1295 __HAL_UNLOCK(hi2c);
|
|
1296 return HAL_ERROR;
|
|
1297 }
|
|
1298 else
|
|
1299 {
|
|
1300 /* Process Unlocked */
|
|
1301 __HAL_UNLOCK(hi2c);
|
|
1302 return HAL_TIMEOUT;
|
|
1303 }
|
|
1304 }
|
|
1305
|
|
1306 /* Enable DMA Request */
|
|
1307 hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
|
|
1308
|
|
1309 /* Clear ADDR flag */
|
|
1310 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
1311
|
|
1312 /* Process Unlocked */
|
|
1313 __HAL_UNLOCK(hi2c);
|
|
1314
|
|
1315 return HAL_OK;
|
|
1316 }
|
|
1317 else
|
|
1318 {
|
|
1319 return HAL_BUSY;
|
|
1320 }
|
|
1321 }
|
|
1322
|
|
1323 /**
|
|
1324 * @brief Receive in master mode an amount of data in no-blocking mode with DMA
|
|
1325 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
1326 * the configuration information for I2C module
|
|
1327 * @param DevAddress: Target device address
|
|
1328 * @param pData: Pointer to data buffer
|
|
1329 * @param Size: Amount of data to be sent
|
|
1330 * @retval HAL status
|
|
1331 */
|
|
1332 HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
|
|
1333 {
|
|
1334 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
1335 {
|
|
1336 if((pData == NULL) || (Size == 0))
|
|
1337 {
|
|
1338 return HAL_ERROR;
|
|
1339 }
|
|
1340
|
|
1341 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
1342 {
|
|
1343 return HAL_BUSY;
|
|
1344 }
|
|
1345
|
|
1346 /* Process Locked */
|
|
1347 __HAL_LOCK(hi2c);
|
|
1348
|
|
1349 hi2c->State = HAL_I2C_STATE_BUSY_RX;
|
|
1350 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
1351
|
|
1352 hi2c->pBuffPtr = pData;
|
|
1353 hi2c->XferSize = Size;
|
|
1354 hi2c->XferCount = Size;
|
|
1355
|
|
1356 /* Set the I2C DMA transfer complete callback */
|
|
1357 hi2c->hdmarx->XferCpltCallback = I2C_DMAMasterReceiveCplt;
|
|
1358
|
|
1359 /* Set the DMA error callback */
|
|
1360 hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
|
|
1361
|
|
1362 /* Enable the DMA Stream */
|
|
1363 HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)pData, Size);
|
|
1364
|
|
1365 /* Send Slave Address */
|
|
1366 if(I2C_MasterRequestRead(hi2c, DevAddress, I2C_TIMEOUT_FLAG) != HAL_OK)
|
|
1367 {
|
|
1368 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
1369 {
|
|
1370 /* Process Unlocked */
|
|
1371 __HAL_UNLOCK(hi2c);
|
|
1372 return HAL_ERROR;
|
|
1373 }
|
|
1374 else
|
|
1375 {
|
|
1376 /* Process Unlocked */
|
|
1377 __HAL_UNLOCK(hi2c);
|
|
1378 return HAL_TIMEOUT;
|
|
1379 }
|
|
1380 }
|
|
1381
|
|
1382 if(Size == 1)
|
|
1383 {
|
|
1384 /* Disable Acknowledge */
|
|
1385 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
|
|
1386 }
|
|
1387 else
|
|
1388 {
|
|
1389 /* Enable Last DMA bit */
|
|
1390 hi2c->Instance->CR2 |= I2C_CR2_LAST;
|
|
1391 }
|
|
1392
|
|
1393 /* Enable DMA Request */
|
|
1394 hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
|
|
1395
|
|
1396 /* Clear ADDR flag */
|
|
1397 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
1398
|
|
1399 /* Process Unlocked */
|
|
1400 __HAL_UNLOCK(hi2c);
|
|
1401
|
|
1402 return HAL_OK;
|
|
1403 }
|
|
1404 else
|
|
1405 {
|
|
1406 return HAL_BUSY;
|
|
1407 }
|
|
1408 }
|
|
1409
|
|
1410 /**
|
|
1411 * @brief Transmit in slave mode an amount of data in no-blocking mode with DMA
|
|
1412 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
1413 * the configuration information for I2C module
|
|
1414 * @param pData: Pointer to data buffer
|
|
1415 * @param Size: Amount of data to be sent
|
|
1416 * @retval HAL status
|
|
1417 */
|
|
1418 HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
|
|
1419 {
|
|
1420 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
1421 {
|
|
1422 if((pData == NULL) || (Size == 0))
|
|
1423 {
|
|
1424 return HAL_ERROR;
|
|
1425 }
|
|
1426
|
|
1427 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
1428 {
|
|
1429 return HAL_BUSY;
|
|
1430 }
|
|
1431
|
|
1432 /* Process Locked */
|
|
1433 __HAL_LOCK(hi2c);
|
|
1434
|
|
1435 hi2c->State = HAL_I2C_STATE_BUSY_TX;
|
|
1436 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
1437
|
|
1438 hi2c->pBuffPtr = pData;
|
|
1439 hi2c->XferSize = Size;
|
|
1440 hi2c->XferCount = Size;
|
|
1441
|
|
1442 /* Set the I2C DMA transfer complete callback */
|
|
1443 hi2c->hdmatx->XferCpltCallback = I2C_DMASlaveTransmitCplt;
|
|
1444
|
|
1445 /* Set the DMA error callback */
|
|
1446 hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
|
|
1447
|
|
1448 /* Enable the DMA Stream */
|
|
1449 HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->DR, Size);
|
|
1450
|
|
1451 /* Enable DMA Request */
|
|
1452 hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
|
|
1453
|
|
1454 /* Enable Address Acknowledge */
|
|
1455 hi2c->Instance->CR1 |= I2C_CR1_ACK;
|
|
1456
|
|
1457 /* Wait until ADDR flag is set */
|
|
1458 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, I2C_TIMEOUT_ADDR_SLAVE) != HAL_OK)
|
|
1459 {
|
|
1460 return HAL_TIMEOUT;
|
|
1461 }
|
|
1462
|
|
1463 /* If 7bit addressing mode is selected */
|
|
1464 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
|
|
1465 {
|
|
1466 /* Clear ADDR flag */
|
|
1467 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
1468 }
|
|
1469 else
|
|
1470 {
|
|
1471 /* Clear ADDR flag */
|
|
1472 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
1473
|
|
1474 /* Wait until ADDR flag is set */
|
|
1475 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, I2C_TIMEOUT_ADDR_SLAVE) != HAL_OK)
|
|
1476 {
|
|
1477 return HAL_TIMEOUT;
|
|
1478 }
|
|
1479
|
|
1480 /* Clear ADDR flag */
|
|
1481 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
1482 }
|
|
1483
|
|
1484 /* Process Unlocked */
|
|
1485 __HAL_UNLOCK(hi2c);
|
|
1486
|
|
1487 return HAL_OK;
|
|
1488 }
|
|
1489 else
|
|
1490 {
|
|
1491 return HAL_BUSY;
|
|
1492 }
|
|
1493 }
|
|
1494
|
|
1495 /**
|
|
1496 * @brief Receive in slave mode an amount of data in no-blocking mode with DMA
|
|
1497 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
1498 * the configuration information for I2C module
|
|
1499 * @param pData: Pointer to data buffer
|
|
1500 * @param Size: Amount of data to be sent
|
|
1501 * @retval HAL status
|
|
1502 */
|
|
1503 HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
|
|
1504 {
|
|
1505 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
1506 {
|
|
1507 if((pData == NULL) || (Size == 0))
|
|
1508 {
|
|
1509 return HAL_ERROR;
|
|
1510 }
|
|
1511
|
|
1512 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
1513 {
|
|
1514 return HAL_BUSY;
|
|
1515 }
|
|
1516
|
|
1517 /* Process Locked */
|
|
1518 __HAL_LOCK(hi2c);
|
|
1519
|
|
1520 hi2c->State = HAL_I2C_STATE_BUSY_RX;
|
|
1521 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
1522
|
|
1523 hi2c->pBuffPtr = pData;
|
|
1524 hi2c->XferSize = Size;
|
|
1525 hi2c->XferCount = Size;
|
|
1526
|
|
1527 /* Set the I2C DMA transfer complete callback */
|
|
1528 hi2c->hdmarx->XferCpltCallback = I2C_DMASlaveReceiveCplt;
|
|
1529
|
|
1530 /* Set the DMA error callback */
|
|
1531 hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
|
|
1532
|
|
1533 /* Enable the DMA Stream */
|
|
1534 HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)pData, Size);
|
|
1535
|
|
1536 /* Enable DMA Request */
|
|
1537 hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
|
|
1538
|
|
1539 /* Enable Address Acknowledge */
|
|
1540 hi2c->Instance->CR1 |= I2C_CR1_ACK;
|
|
1541
|
|
1542 /* Wait until ADDR flag is set */
|
|
1543 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, I2C_TIMEOUT_ADDR_SLAVE) != HAL_OK)
|
|
1544 {
|
|
1545 return HAL_TIMEOUT;
|
|
1546 }
|
|
1547
|
|
1548 /* Clear ADDR flag */
|
|
1549 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
1550
|
|
1551 /* Process Unlocked */
|
|
1552 __HAL_UNLOCK(hi2c);
|
|
1553
|
|
1554 return HAL_OK;
|
|
1555 }
|
|
1556 else
|
|
1557 {
|
|
1558 return HAL_BUSY;
|
|
1559 }
|
|
1560 }
|
|
1561 /**
|
|
1562 * @brief Write an amount of data in blocking mode to a specific memory address
|
|
1563 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
1564 * the configuration information for I2C module
|
|
1565 * @param DevAddress: Target device address
|
|
1566 * @param MemAddress: Internal memory address
|
|
1567 * @param MemAddSize: Size of internal memory address
|
|
1568 * @param pData: Pointer to data buffer
|
|
1569 * @param Size: Amount of data to be sent
|
|
1570 * @param Timeout: Timeout duration
|
|
1571 * @retval HAL status
|
|
1572 */
|
|
1573 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)
|
|
1574 {
|
|
1575 /* Check the parameters */
|
|
1576 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
|
|
1577
|
|
1578 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
1579 {
|
|
1580 if((pData == NULL) || (Size == 0))
|
|
1581 {
|
|
1582 return HAL_ERROR;
|
|
1583 }
|
|
1584
|
|
1585 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
1586 {
|
|
1587 return HAL_BUSY;
|
|
1588 }
|
|
1589
|
|
1590 /* Process Locked */
|
|
1591 __HAL_LOCK(hi2c);
|
|
1592
|
|
1593 hi2c->State = HAL_I2C_STATE_MEM_BUSY_TX;
|
|
1594 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
1595
|
|
1596 /* Send Slave Address and Memory Address */
|
|
1597 if(I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, Timeout) != HAL_OK)
|
|
1598 {
|
|
1599 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
1600 {
|
|
1601 /* Process Unlocked */
|
|
1602 __HAL_UNLOCK(hi2c);
|
|
1603 return HAL_ERROR;
|
|
1604 }
|
|
1605 else
|
|
1606 {
|
|
1607 /* Process Unlocked */
|
|
1608 __HAL_UNLOCK(hi2c);
|
|
1609 return HAL_TIMEOUT;
|
|
1610 }
|
|
1611 }
|
|
1612
|
|
1613 while(Size > 0)
|
|
1614 {
|
|
1615 /* Wait until TXE flag is set */
|
|
1616 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK)
|
|
1617 {
|
|
1618 return HAL_TIMEOUT;
|
|
1619 }
|
|
1620
|
|
1621 /* Write data to DR */
|
|
1622 hi2c->Instance->DR = (*pData++);
|
|
1623 Size--;
|
|
1624
|
|
1625 if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (Size != 0))
|
|
1626 {
|
|
1627 /* Write data to DR */
|
|
1628 hi2c->Instance->DR = (*pData++);
|
|
1629 Size--;
|
|
1630 }
|
|
1631 }
|
|
1632
|
|
1633 /* Wait until TXE flag is set */
|
|
1634 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK)
|
|
1635 {
|
|
1636 return HAL_TIMEOUT;
|
|
1637 }
|
|
1638
|
|
1639 /* Generate Stop */
|
|
1640 hi2c->Instance->CR1 |= I2C_CR1_STOP;
|
|
1641
|
|
1642 /* Wait until BUSY flag is reset */
|
|
1643 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout) != HAL_OK)
|
|
1644 {
|
|
1645 return HAL_TIMEOUT;
|
|
1646 }
|
|
1647
|
|
1648 hi2c->State = HAL_I2C_STATE_READY;
|
|
1649
|
|
1650 /* Process Unlocked */
|
|
1651 __HAL_UNLOCK(hi2c);
|
|
1652
|
|
1653 return HAL_OK;
|
|
1654 }
|
|
1655 else
|
|
1656 {
|
|
1657 return HAL_BUSY;
|
|
1658 }
|
|
1659 }
|
|
1660
|
|
1661 /**
|
|
1662 * @brief Read an amount of data in blocking mode from a specific memory address
|
|
1663 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
1664 * the configuration information for I2C module
|
|
1665 * @param DevAddress: Target device address
|
|
1666 * @param MemAddress: Internal memory address
|
|
1667 * @param MemAddSize: Size of internal memory address
|
|
1668 * @param pData: Pointer to data buffer
|
|
1669 * @param Size: Amount of data to be sent
|
|
1670 * @param Timeout: Timeout duration
|
|
1671 * @retval HAL status
|
|
1672 */
|
|
1673 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)
|
|
1674 {
|
|
1675 /* Check the parameters */
|
|
1676 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
|
|
1677
|
|
1678 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
1679 {
|
|
1680 if((pData == NULL) || (Size == 0))
|
|
1681 {
|
|
1682 return HAL_ERROR;
|
|
1683 }
|
|
1684
|
|
1685 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
1686 {
|
|
1687 return HAL_BUSY;
|
|
1688 }
|
|
1689
|
|
1690 /* Process Locked */
|
|
1691 __HAL_LOCK(hi2c);
|
|
1692
|
|
1693 hi2c->State = HAL_I2C_STATE_MEM_BUSY_RX;
|
|
1694 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
1695
|
|
1696 /* Send Slave Address and Memory Address */
|
|
1697 if(I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, Timeout) != HAL_OK)
|
|
1698 {
|
|
1699 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
1700 {
|
|
1701 /* Process Unlocked */
|
|
1702 __HAL_UNLOCK(hi2c);
|
|
1703 return HAL_ERROR;
|
|
1704 }
|
|
1705 else
|
|
1706 {
|
|
1707 /* Process Unlocked */
|
|
1708 __HAL_UNLOCK(hi2c);
|
|
1709 return HAL_TIMEOUT;
|
|
1710 }
|
|
1711 }
|
|
1712
|
|
1713 if(Size == 1)
|
|
1714 {
|
|
1715 /* Disable Acknowledge */
|
|
1716 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
|
|
1717
|
|
1718 /* Clear ADDR flag */
|
|
1719 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
1720
|
|
1721 /* Generate Stop */
|
|
1722 hi2c->Instance->CR1 |= I2C_CR1_STOP;
|
|
1723 }
|
|
1724 else if(Size == 2)
|
|
1725 {
|
|
1726 /* Disable Acknowledge */
|
|
1727 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
|
|
1728
|
|
1729 /* Enable Pos */
|
|
1730 hi2c->Instance->CR1 |= I2C_CR1_POS;
|
|
1731
|
|
1732 /* Clear ADDR flag */
|
|
1733 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
1734 }
|
|
1735 else
|
|
1736 {
|
|
1737 /* Clear ADDR flag */
|
|
1738 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
1739 }
|
|
1740
|
|
1741 while(Size > 0)
|
|
1742 {
|
|
1743 if(Size <= 3)
|
|
1744 {
|
|
1745 /* One byte */
|
|
1746 if(Size== 1)
|
|
1747 {
|
|
1748 /* Wait until RXNE flag is set */
|
|
1749 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, Timeout) != HAL_OK)
|
|
1750 {
|
|
1751 return HAL_TIMEOUT;
|
|
1752 }
|
|
1753
|
|
1754 /* Read data from DR */
|
|
1755 (*pData++) = hi2c->Instance->DR;
|
|
1756 Size--;
|
|
1757 }
|
|
1758 /* Two bytes */
|
|
1759 else if(Size == 2)
|
|
1760 {
|
|
1761 /* Wait until BTF flag is set */
|
|
1762 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout) != HAL_OK)
|
|
1763 {
|
|
1764 return HAL_TIMEOUT;
|
|
1765 }
|
|
1766
|
|
1767 /* Generate Stop */
|
|
1768 hi2c->Instance->CR1 |= I2C_CR1_STOP;
|
|
1769
|
|
1770 /* Read data from DR */
|
|
1771 (*pData++) = hi2c->Instance->DR;
|
|
1772 Size--;
|
|
1773
|
|
1774 /* Read data from DR */
|
|
1775 (*pData++) = hi2c->Instance->DR;
|
|
1776 Size--;
|
|
1777 }
|
|
1778 /* 3 Last bytes */
|
|
1779 else
|
|
1780 {
|
|
1781 /* Wait until BTF flag is set */
|
|
1782 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout) != HAL_OK)
|
|
1783 {
|
|
1784 return HAL_TIMEOUT;
|
|
1785 }
|
|
1786
|
|
1787 /* Disable Acknowledge */
|
|
1788 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
|
|
1789
|
|
1790 /* Read data from DR */
|
|
1791 (*pData++) = hi2c->Instance->DR;
|
|
1792 Size--;
|
|
1793
|
|
1794 /* Wait until BTF flag is set */
|
|
1795 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout) != HAL_OK)
|
|
1796 {
|
|
1797 return HAL_TIMEOUT;
|
|
1798 }
|
|
1799
|
|
1800 /* Generate Stop */
|
|
1801 hi2c->Instance->CR1 |= I2C_CR1_STOP;
|
|
1802
|
|
1803 /* Read data from DR */
|
|
1804 (*pData++) = hi2c->Instance->DR;
|
|
1805 Size--;
|
|
1806
|
|
1807 /* Read data from DR */
|
|
1808 (*pData++) = hi2c->Instance->DR;
|
|
1809 Size--;
|
|
1810 }
|
|
1811 }
|
|
1812 else
|
|
1813 {
|
|
1814 /* Wait until RXNE flag is set */
|
|
1815 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, Timeout) != HAL_OK)
|
|
1816 {
|
|
1817 return HAL_TIMEOUT;
|
|
1818 }
|
|
1819
|
|
1820 /* Read data from DR */
|
|
1821 (*pData++) = hi2c->Instance->DR;
|
|
1822 Size--;
|
|
1823
|
|
1824 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET)
|
|
1825 {
|
|
1826 /* Read data from DR */
|
|
1827 (*pData++) = hi2c->Instance->DR;
|
|
1828 Size--;
|
|
1829 }
|
|
1830 }
|
|
1831 }
|
|
1832
|
|
1833 /* Disable Pos */
|
|
1834 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
|
|
1835
|
|
1836 /* Wait until BUSY flag is reset */
|
|
1837 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout) != HAL_OK)
|
|
1838 {
|
|
1839 return HAL_TIMEOUT;
|
|
1840 }
|
|
1841
|
|
1842 hi2c->State = HAL_I2C_STATE_READY;
|
|
1843
|
|
1844 /* Process Unlocked */
|
|
1845 __HAL_UNLOCK(hi2c);
|
|
1846
|
|
1847 return HAL_OK;
|
|
1848 }
|
|
1849 else
|
|
1850 {
|
|
1851 return HAL_BUSY;
|
|
1852 }
|
|
1853 }
|
|
1854 /**
|
|
1855 * @brief Write an amount of data in no-blocking mode with Interrupt to a specific memory address
|
|
1856 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
1857 * the configuration information for I2C module
|
|
1858 * @param DevAddress: Target device address
|
|
1859 * @param MemAddress: Internal memory address
|
|
1860 * @param MemAddSize: Size of internal memory address
|
|
1861 * @param pData: Pointer to data buffer
|
|
1862 * @param Size: Amount of data to be sent
|
|
1863 * @retval HAL status
|
|
1864 */
|
|
1865 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)
|
|
1866 {
|
|
1867 /* Check the parameters */
|
|
1868 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
|
|
1869
|
|
1870 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
1871 {
|
|
1872 if((pData == NULL) || (Size == 0))
|
|
1873 {
|
|
1874 return HAL_ERROR;
|
|
1875 }
|
|
1876
|
|
1877 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
1878 {
|
|
1879 return HAL_BUSY;
|
|
1880 }
|
|
1881
|
|
1882 /* Process Locked */
|
|
1883 __HAL_LOCK(hi2c);
|
|
1884
|
|
1885 hi2c->State = HAL_I2C_STATE_MEM_BUSY_TX;
|
|
1886 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
1887
|
|
1888 hi2c->pBuffPtr = pData;
|
|
1889 hi2c->XferSize = Size;
|
|
1890 hi2c->XferCount = Size;
|
|
1891
|
|
1892 /* Send Slave Address and Memory Address */
|
|
1893 if(I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG) != HAL_OK)
|
|
1894 {
|
|
1895 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
1896 {
|
|
1897 /* Process Unlocked */
|
|
1898 __HAL_UNLOCK(hi2c);
|
|
1899 return HAL_ERROR;
|
|
1900 }
|
|
1901 else
|
|
1902 {
|
|
1903 /* Process Unlocked */
|
|
1904 __HAL_UNLOCK(hi2c);
|
|
1905 return HAL_TIMEOUT;
|
|
1906 }
|
|
1907 }
|
|
1908
|
|
1909 /* Process Unlocked */
|
|
1910 __HAL_UNLOCK(hi2c);
|
|
1911
|
|
1912 /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
1913 to avoid the risk of I2C interrupt handle execution before current
|
|
1914 process unlock */
|
|
1915
|
|
1916 /* Enable EVT, BUF and ERR interrupt */
|
|
1917 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
|
|
1918
|
|
1919 return HAL_OK;
|
|
1920 }
|
|
1921 else
|
|
1922 {
|
|
1923 return HAL_BUSY;
|
|
1924 }
|
|
1925 }
|
|
1926
|
|
1927 /**
|
|
1928 * @brief Read an amount of data in no-blocking mode with Interrupt from a specific memory address
|
|
1929 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
1930 * the configuration information for I2C module
|
|
1931 * @param DevAddress: Target device address
|
|
1932 * @param MemAddress: Internal memory address
|
|
1933 * @param MemAddSize: Size of internal memory address
|
|
1934 * @param pData: Pointer to data buffer
|
|
1935 * @param Size: Amount of data to be sent
|
|
1936 * @retval HAL status
|
|
1937 */
|
|
1938 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)
|
|
1939 {
|
|
1940 /* Check the parameters */
|
|
1941 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
|
|
1942
|
|
1943 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
1944 {
|
|
1945 if((pData == NULL) || (Size == 0))
|
|
1946 {
|
|
1947 return HAL_ERROR;
|
|
1948 }
|
|
1949
|
|
1950 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
1951 {
|
|
1952 return HAL_BUSY;
|
|
1953 }
|
|
1954
|
|
1955 /* Process Locked */
|
|
1956 __HAL_LOCK(hi2c);
|
|
1957
|
|
1958 hi2c->State = HAL_I2C_STATE_MEM_BUSY_RX;
|
|
1959 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
1960
|
|
1961 hi2c->pBuffPtr = pData;
|
|
1962 hi2c->XferSize = Size;
|
|
1963 hi2c->XferCount = Size;
|
|
1964
|
|
1965 /* Send Slave Address and Memory Address */
|
|
1966 if(I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG) != HAL_OK)
|
|
1967 {
|
|
1968 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
1969 {
|
|
1970 /* Process Unlocked */
|
|
1971 __HAL_UNLOCK(hi2c);
|
|
1972 return HAL_ERROR;
|
|
1973 }
|
|
1974 else
|
|
1975 {
|
|
1976 /* Process Unlocked */
|
|
1977 __HAL_UNLOCK(hi2c);
|
|
1978 return HAL_TIMEOUT;
|
|
1979 }
|
|
1980 }
|
|
1981
|
|
1982 if(hi2c->XferCount == 1)
|
|
1983 {
|
|
1984 /* Disable Acknowledge */
|
|
1985 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
|
|
1986
|
|
1987 /* Clear ADDR flag */
|
|
1988 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
1989
|
|
1990 /* Generate Stop */
|
|
1991 hi2c->Instance->CR1 |= I2C_CR1_STOP;
|
|
1992 }
|
|
1993 else if(hi2c->XferCount == 2)
|
|
1994 {
|
|
1995 /* Disable Acknowledge */
|
|
1996 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
|
|
1997
|
|
1998 /* Enable Pos */
|
|
1999 hi2c->Instance->CR1 |= I2C_CR1_POS;
|
|
2000
|
|
2001 /* Clear ADDR flag */
|
|
2002 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
2003 }
|
|
2004 else
|
|
2005 {
|
|
2006 /* Enable Acknowledge */
|
|
2007 hi2c->Instance->CR1 |= I2C_CR1_ACK;
|
|
2008
|
|
2009 /* Clear ADDR flag */
|
|
2010 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
2011 }
|
|
2012
|
|
2013 /* Process Unlocked */
|
|
2014 __HAL_UNLOCK(hi2c);
|
|
2015
|
|
2016 /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
2017 to avoid the risk of I2C interrupt handle execution before current
|
|
2018 process unlock */
|
|
2019
|
|
2020 /* Enable EVT, BUF and ERR interrupt */
|
|
2021 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
|
|
2022
|
|
2023 return HAL_OK;
|
|
2024 }
|
|
2025 else
|
|
2026 {
|
|
2027 return HAL_BUSY;
|
|
2028 }
|
|
2029 }
|
|
2030 /**
|
|
2031 * @brief Write an amount of data in no-blocking mode with DMA to a specific memory address
|
|
2032 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
2033 * the configuration information for I2C module
|
|
2034 * @param DevAddress: Target device address
|
|
2035 * @param MemAddress: Internal memory address
|
|
2036 * @param MemAddSize: Size of internal memory address
|
|
2037 * @param pData: Pointer to data buffer
|
|
2038 * @param Size: Amount of data to be sent
|
|
2039 * @retval HAL status
|
|
2040 */
|
|
2041 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)
|
|
2042 {
|
|
2043 /* Check the parameters */
|
|
2044 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
|
|
2045
|
|
2046 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
2047 {
|
|
2048 if((pData == NULL) || (Size == 0))
|
|
2049 {
|
|
2050 return HAL_ERROR;
|
|
2051 }
|
|
2052
|
|
2053 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
2054 {
|
|
2055 return HAL_BUSY;
|
|
2056 }
|
|
2057
|
|
2058 /* Process Locked */
|
|
2059 __HAL_LOCK(hi2c);
|
|
2060
|
|
2061 hi2c->State = HAL_I2C_STATE_MEM_BUSY_TX;
|
|
2062 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
2063
|
|
2064 hi2c->pBuffPtr = pData;
|
|
2065 hi2c->XferSize = Size;
|
|
2066 hi2c->XferCount = Size;
|
|
2067
|
|
2068 /* Set the I2C DMA transfer complete callback */
|
|
2069 hi2c->hdmatx->XferCpltCallback = I2C_DMAMemTransmitCplt;
|
|
2070
|
|
2071 /* Set the DMA error callback */
|
|
2072 hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
|
|
2073
|
|
2074 /* Enable the DMA Stream */
|
|
2075 HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->DR, Size);
|
|
2076
|
|
2077 /* Send Slave Address and Memory Address */
|
|
2078 if(I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG) != HAL_OK)
|
|
2079 {
|
|
2080 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
2081 {
|
|
2082 /* Process Unlocked */
|
|
2083 __HAL_UNLOCK(hi2c);
|
|
2084 return HAL_ERROR;
|
|
2085 }
|
|
2086 else
|
|
2087 {
|
|
2088 /* Process Unlocked */
|
|
2089 __HAL_UNLOCK(hi2c);
|
|
2090 return HAL_TIMEOUT;
|
|
2091 }
|
|
2092 }
|
|
2093
|
|
2094 /* Enable DMA Request */
|
|
2095 hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
|
|
2096
|
|
2097 /* Process Unlocked */
|
|
2098 __HAL_UNLOCK(hi2c);
|
|
2099
|
|
2100 return HAL_OK;
|
|
2101 }
|
|
2102 else
|
|
2103 {
|
|
2104 return HAL_BUSY;
|
|
2105 }
|
|
2106 }
|
|
2107
|
|
2108 /**
|
|
2109 * @brief Reads an amount of data in no-blocking mode with DMA from a specific memory address.
|
|
2110 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
2111 * the configuration information for I2C module
|
|
2112 * @param DevAddress: Target device address
|
|
2113 * @param MemAddress: Internal memory address
|
|
2114 * @param MemAddSize: Size of internal memory address
|
|
2115 * @param pData: Pointer to data buffer
|
|
2116 * @param Size: Amount of data to be read
|
|
2117 * @retval HAL status
|
|
2118 */
|
|
2119 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)
|
|
2120 {
|
|
2121 /* Check the parameters */
|
|
2122 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
|
|
2123
|
|
2124 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
2125 {
|
|
2126 if((pData == NULL) || (Size == 0))
|
|
2127 {
|
|
2128 return HAL_ERROR;
|
|
2129 }
|
|
2130
|
|
2131 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
2132 {
|
|
2133 return HAL_BUSY;
|
|
2134 }
|
|
2135
|
|
2136 /* Process Locked */
|
|
2137 __HAL_LOCK(hi2c);
|
|
2138
|
|
2139 hi2c->State = HAL_I2C_STATE_MEM_BUSY_RX;
|
|
2140 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
2141
|
|
2142 hi2c->pBuffPtr = pData;
|
|
2143 hi2c->XferSize = Size;
|
|
2144 hi2c->XferCount = Size;
|
|
2145
|
|
2146 /* Set the I2C DMA transfer complete callback */
|
|
2147 hi2c->hdmarx->XferCpltCallback = I2C_DMAMemReceiveCplt;
|
|
2148
|
|
2149 /* Set the DMA error callback */
|
|
2150 hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
|
|
2151
|
|
2152 /* Enable the DMA Stream */
|
|
2153 HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)pData, Size);
|
|
2154
|
|
2155 /* Send Slave Address and Memory Address */
|
|
2156 if(I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG) != HAL_OK)
|
|
2157 {
|
|
2158 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
2159 {
|
|
2160 /* Process Unlocked */
|
|
2161 __HAL_UNLOCK(hi2c);
|
|
2162 return HAL_ERROR;
|
|
2163 }
|
|
2164 else
|
|
2165 {
|
|
2166 /* Process Unlocked */
|
|
2167 __HAL_UNLOCK(hi2c);
|
|
2168 return HAL_TIMEOUT;
|
|
2169 }
|
|
2170 }
|
|
2171
|
|
2172 if(Size == 1)
|
|
2173 {
|
|
2174 /* Disable Acknowledge */
|
|
2175 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
|
|
2176 }
|
|
2177 else
|
|
2178 {
|
|
2179 /* Enable Last DMA bit */
|
|
2180 hi2c->Instance->CR2 |= I2C_CR2_LAST;
|
|
2181 }
|
|
2182
|
|
2183 /* Enable DMA Request */
|
|
2184 hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
|
|
2185
|
|
2186 /* Clear ADDR flag */
|
|
2187 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
2188
|
|
2189 /* Process Unlocked */
|
|
2190 __HAL_UNLOCK(hi2c);
|
|
2191
|
|
2192 return HAL_OK;
|
|
2193 }
|
|
2194 else
|
|
2195 {
|
|
2196 return HAL_BUSY;
|
|
2197 }
|
|
2198 }
|
|
2199
|
|
2200 /**
|
|
2201 * @brief Checks if target device is ready for communication.
|
|
2202 * @note This function is used with Memory devices
|
|
2203 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
2204 * the configuration information for I2C module
|
|
2205 * @param DevAddress: Target device address
|
|
2206 * @param Trials: Number of trials
|
|
2207 * @param Timeout: Timeout duration
|
|
2208 * @retval HAL status
|
|
2209 */
|
|
2210 HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout)
|
|
2211 {
|
|
2212 uint32_t tickstart = 0, tmp1 = 0, tmp2 = 0, tmp3 = 0, I2C_Trials = 1;
|
|
2213
|
|
2214 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
2215 {
|
|
2216 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
2217 {
|
|
2218 return HAL_BUSY;
|
|
2219 }
|
|
2220
|
|
2221 /* Process Locked */
|
|
2222 __HAL_LOCK(hi2c);
|
|
2223
|
|
2224 hi2c->State = HAL_I2C_STATE_BUSY;
|
|
2225 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
2226
|
|
2227 do
|
|
2228 {
|
|
2229 /* Generate Start */
|
|
2230 hi2c->Instance->CR1 |= I2C_CR1_START;
|
|
2231
|
|
2232 /* Wait until SB flag is set */
|
|
2233 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK)
|
|
2234 {
|
|
2235 return HAL_TIMEOUT;
|
|
2236 }
|
|
2237
|
|
2238 /* Send slave address */
|
|
2239 hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);
|
|
2240
|
|
2241 /* Wait until ADDR or AF flag are set */
|
|
2242 /* Get tick */
|
|
2243 tickstart = HAL_GetTick();
|
|
2244
|
|
2245 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR);
|
|
2246 tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF);
|
|
2247 tmp3 = hi2c->State;
|
|
2248 while((tmp1 == RESET) && (tmp2 == RESET) && (tmp3 != HAL_I2C_STATE_TIMEOUT))
|
|
2249 {
|
|
2250 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
|
|
2251 {
|
|
2252 hi2c->State = HAL_I2C_STATE_TIMEOUT;
|
|
2253 }
|
|
2254 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR);
|
|
2255 tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF);
|
|
2256 tmp3 = hi2c->State;
|
|
2257 }
|
|
2258
|
|
2259 hi2c->State = HAL_I2C_STATE_READY;
|
|
2260
|
|
2261 /* Check if the ADDR flag has been set */
|
|
2262 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR) == SET)
|
|
2263 {
|
|
2264 /* Generate Stop */
|
|
2265 hi2c->Instance->CR1 |= I2C_CR1_STOP;
|
|
2266
|
|
2267 /* Clear ADDR Flag */
|
|
2268 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
2269
|
|
2270 /* Wait until BUSY flag is reset */
|
|
2271 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout) != HAL_OK)
|
|
2272 {
|
|
2273 return HAL_TIMEOUT;
|
|
2274 }
|
|
2275
|
|
2276 hi2c->State = HAL_I2C_STATE_READY;
|
|
2277
|
|
2278 /* Process Unlocked */
|
|
2279 __HAL_UNLOCK(hi2c);
|
|
2280
|
|
2281 return HAL_OK;
|
|
2282 }
|
|
2283 else
|
|
2284 {
|
|
2285 /* Generate Stop */
|
|
2286 hi2c->Instance->CR1 |= I2C_CR1_STOP;
|
|
2287
|
|
2288 /* Clear AF Flag */
|
|
2289 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
|
|
2290
|
|
2291 /* Wait until BUSY flag is reset */
|
|
2292 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout) != HAL_OK)
|
|
2293 {
|
|
2294 return HAL_TIMEOUT;
|
|
2295 }
|
|
2296 }
|
|
2297 }while(I2C_Trials++ < Trials);
|
|
2298
|
|
2299 hi2c->State = HAL_I2C_STATE_READY;
|
|
2300
|
|
2301 /* Process Unlocked */
|
|
2302 __HAL_UNLOCK(hi2c);
|
|
2303
|
|
2304 return HAL_ERROR;
|
|
2305 }
|
|
2306 else
|
|
2307 {
|
|
2308 return HAL_BUSY;
|
|
2309 }
|
|
2310 }
|
|
2311
|
|
2312 /**
|
|
2313 * @brief This function handles I2C event interrupt request.
|
|
2314 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
2315 * the configuration information for I2C module
|
|
2316 * @retval HAL status
|
|
2317 */
|
|
2318 void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c)
|
|
2319 {
|
|
2320 uint32_t tmp1 = 0, tmp2 = 0, tmp3 = 0, tmp4 = 0;
|
|
2321 /* Master mode selected */
|
|
2322 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_MSL) == SET)
|
|
2323 {
|
|
2324 /* I2C in mode Transmitter -----------------------------------------------*/
|
|
2325 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TRA) == SET)
|
|
2326 {
|
|
2327 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE);
|
|
2328 tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_BUF);
|
|
2329 tmp3 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF);
|
|
2330 tmp4 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_EVT);
|
|
2331 /* TXE set and BTF reset -----------------------------------------------*/
|
|
2332 if((tmp1 == SET) && (tmp2 == SET) && (tmp3 == RESET))
|
|
2333 {
|
|
2334 I2C_MasterTransmit_TXE(hi2c);
|
|
2335 }
|
|
2336 /* BTF set -------------------------------------------------------------*/
|
|
2337 else if((tmp3 == SET) && (tmp4 == SET))
|
|
2338 {
|
|
2339 I2C_MasterTransmit_BTF(hi2c);
|
|
2340 }
|
|
2341 }
|
|
2342 /* I2C in mode Receiver --------------------------------------------------*/
|
|
2343 else
|
|
2344 {
|
|
2345 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE);
|
|
2346 tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_BUF);
|
|
2347 tmp3 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF);
|
|
2348 tmp4 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_EVT);
|
|
2349 /* RXNE set and BTF reset -----------------------------------------------*/
|
|
2350 if((tmp1 == SET) && (tmp2 == SET) && (tmp3 == RESET))
|
|
2351 {
|
|
2352 I2C_MasterReceive_RXNE(hi2c);
|
|
2353 }
|
|
2354 /* BTF set -------------------------------------------------------------*/
|
|
2355 else if((tmp3 == SET) && (tmp4 == SET))
|
|
2356 {
|
|
2357 I2C_MasterReceive_BTF(hi2c);
|
|
2358 }
|
|
2359 }
|
|
2360 }
|
|
2361 /* Slave mode selected */
|
|
2362 else
|
|
2363 {
|
|
2364 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR);
|
|
2365 tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, (I2C_IT_EVT));
|
|
2366 tmp3 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF);
|
|
2367 tmp4 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TRA);
|
|
2368 /* ADDR set --------------------------------------------------------------*/
|
|
2369 if((tmp1 == SET) && (tmp2 == SET))
|
|
2370 {
|
|
2371 I2C_Slave_ADDR(hi2c);
|
|
2372 }
|
|
2373 /* STOPF set --------------------------------------------------------------*/
|
|
2374 else if((tmp3 == SET) && (tmp2 == SET))
|
|
2375 {
|
|
2376 I2C_Slave_STOPF(hi2c);
|
|
2377 }
|
|
2378 /* I2C in mode Transmitter -----------------------------------------------*/
|
|
2379 else if(tmp4 == SET)
|
|
2380 {
|
|
2381 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE);
|
|
2382 tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_BUF);
|
|
2383 tmp3 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF);
|
|
2384 tmp4 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_EVT);
|
|
2385 /* TXE set and BTF reset -----------------------------------------------*/
|
|
2386 if((tmp1 == SET) && (tmp2 == SET) && (tmp3 == RESET))
|
|
2387 {
|
|
2388 I2C_SlaveTransmit_TXE(hi2c);
|
|
2389 }
|
|
2390 /* BTF set -------------------------------------------------------------*/
|
|
2391 else if((tmp3 == SET) && (tmp4 == SET))
|
|
2392 {
|
|
2393 I2C_SlaveTransmit_BTF(hi2c);
|
|
2394 }
|
|
2395 }
|
|
2396 /* I2C in mode Receiver --------------------------------------------------*/
|
|
2397 else
|
|
2398 {
|
|
2399 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE);
|
|
2400 tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_BUF);
|
|
2401 tmp3 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF);
|
|
2402 tmp4 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_EVT);
|
|
2403 /* RXNE set and BTF reset ----------------------------------------------*/
|
|
2404 if((tmp1 == SET) && (tmp2 == SET) && (tmp3 == RESET))
|
|
2405 {
|
|
2406 I2C_SlaveReceive_RXNE(hi2c);
|
|
2407 }
|
|
2408 /* BTF set -------------------------------------------------------------*/
|
|
2409 else if((tmp3 == SET) && (tmp4 == SET))
|
|
2410 {
|
|
2411 I2C_SlaveReceive_BTF(hi2c);
|
|
2412 }
|
|
2413 }
|
|
2414 }
|
|
2415 }
|
|
2416
|
|
2417 /**
|
|
2418 * @brief This function handles I2C error interrupt request.
|
|
2419 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
2420 * the configuration information for I2C module
|
|
2421 * @retval HAL status
|
|
2422 */
|
|
2423 void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c)
|
|
2424 {
|
|
2425 uint32_t tmp1 = 0, tmp2 = 0, tmp3 = 0;
|
|
2426
|
|
2427 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BERR);
|
|
2428 tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_ERR);
|
|
2429 /* I2C Bus error interrupt occurred ----------------------------------------*/
|
|
2430 if((tmp1 == SET) && (tmp2 == SET))
|
|
2431 {
|
|
2432 hi2c->ErrorCode |= HAL_I2C_ERROR_BERR;
|
|
2433
|
|
2434 /* Clear BERR flag */
|
|
2435 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_BERR);
|
|
2436 }
|
|
2437
|
|
2438 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ARLO);
|
|
2439 tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_ERR);
|
|
2440 /* I2C Arbitration Loss error interrupt occurred ---------------------------*/
|
|
2441 if((tmp1 == SET) && (tmp2 == SET))
|
|
2442 {
|
|
2443 hi2c->ErrorCode |= HAL_I2C_ERROR_ARLO;
|
|
2444
|
|
2445 /* Clear ARLO flag */
|
|
2446 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ARLO);
|
|
2447 }
|
|
2448
|
|
2449 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF);
|
|
2450 tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_ERR);
|
|
2451 /* I2C Acknowledge failure error interrupt occurred ------------------------*/
|
|
2452 if((tmp1 == SET) && (tmp2 == SET))
|
|
2453 {
|
|
2454 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_MSL);
|
|
2455 tmp2 = hi2c->XferCount;
|
|
2456 tmp3 = hi2c->State;
|
|
2457 if((tmp1 == RESET) && (tmp2 == 0) && (tmp3 == HAL_I2C_STATE_BUSY_TX))
|
|
2458 {
|
|
2459 I2C_Slave_AF(hi2c);
|
|
2460 }
|
|
2461 else
|
|
2462 {
|
|
2463 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
|
|
2464 /* Clear AF flag */
|
|
2465 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
|
|
2466 }
|
|
2467 }
|
|
2468
|
|
2469 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_OVR);
|
|
2470 tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_ERR);
|
|
2471 /* I2C Over-Run/Under-Run interrupt occurred -------------------------------*/
|
|
2472 if((tmp1 == SET) && (tmp2 == SET))
|
|
2473 {
|
|
2474 hi2c->ErrorCode |= HAL_I2C_ERROR_OVR;
|
|
2475 /* Clear OVR flag */
|
|
2476 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_OVR);
|
|
2477 }
|
|
2478
|
|
2479 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
|
|
2480 {
|
|
2481 hi2c->State = HAL_I2C_STATE_READY;
|
|
2482
|
|
2483 /* Disable Pos bit in I2C CR1 when error occurred in Master/Mem Receive IT Process */
|
|
2484 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
|
|
2485
|
|
2486 HAL_I2C_ErrorCallback(hi2c);
|
|
2487 }
|
|
2488 }
|
|
2489
|
|
2490 /**
|
|
2491 * @brief Master Tx Transfer completed callbacks.
|
|
2492 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
2493 * the configuration information for I2C module
|
|
2494 * @retval None
|
|
2495 */
|
|
2496 __weak void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c)
|
|
2497 {
|
|
2498 /* NOTE : This function Should not be modified, when the callback is needed,
|
|
2499 the HAL_I2C_TxCpltCallback could be implemented in the user file
|
|
2500 */
|
|
2501 }
|
|
2502
|
|
2503 /**
|
|
2504 * @brief Master Rx Transfer completed callbacks.
|
|
2505 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
2506 * the configuration information for I2C module
|
|
2507 * @retval None
|
|
2508 */
|
|
2509 __weak void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)
|
|
2510 {
|
|
2511 /* NOTE : This function Should not be modified, when the callback is needed,
|
|
2512 the HAL_I2C_TxCpltCallback could be implemented in the user file
|
|
2513 */
|
|
2514 }
|
|
2515
|
|
2516 /** @brief Slave Tx Transfer completed callbacks.
|
|
2517 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
2518 * the configuration information for I2C module
|
|
2519 * @retval None
|
|
2520 */
|
|
2521 __weak void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c)
|
|
2522 {
|
|
2523 /* NOTE : This function Should not be modified, when the callback is needed,
|
|
2524 the HAL_I2C_TxCpltCallback could be implemented in the user file
|
|
2525 */
|
|
2526 }
|
|
2527
|
|
2528 /**
|
|
2529 * @brief Slave Rx Transfer completed callbacks.
|
|
2530 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
2531 * the configuration information for I2C module
|
|
2532 * @retval None
|
|
2533 */
|
|
2534 __weak void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c)
|
|
2535 {
|
|
2536 /* NOTE : This function Should not be modified, when the callback is needed,
|
|
2537 the HAL_I2C_TxCpltCallback could be implemented in the user file
|
|
2538 */
|
|
2539 }
|
|
2540
|
|
2541 /**
|
|
2542 * @brief Memory Tx Transfer completed callbacks.
|
|
2543 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
2544 * the configuration information for I2C module
|
|
2545 * @retval None
|
|
2546 */
|
|
2547 __weak void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c)
|
|
2548 {
|
|
2549 /* NOTE : This function Should not be modified, when the callback is needed,
|
|
2550 the HAL_I2C_TxCpltCallback could be implemented in the user file
|
|
2551 */
|
|
2552 }
|
|
2553
|
|
2554 /**
|
|
2555 * @brief Memory Rx Transfer completed callbacks.
|
|
2556 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
2557 * the configuration information for I2C module
|
|
2558 * @retval None
|
|
2559 */
|
|
2560 __weak void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c)
|
|
2561 {
|
|
2562 /* NOTE : This function Should not be modified, when the callback is needed,
|
|
2563 the HAL_I2C_TxCpltCallback could be implemented in the user file
|
|
2564 */
|
|
2565 }
|
|
2566
|
|
2567 /**
|
|
2568 * @brief I2C error callbacks.
|
|
2569 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
2570 * the configuration information for I2C module
|
|
2571 * @retval None
|
|
2572 */
|
|
2573 __weak void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c)
|
|
2574 {
|
|
2575 /* NOTE : This function Should not be modified, when the callback is needed,
|
|
2576 the HAL_I2C_ErrorCallback could be implemented in the user file
|
|
2577 */
|
|
2578 }
|
|
2579
|
|
2580 /**
|
|
2581 * @}
|
|
2582 */
|
|
2583
|
|
2584 /** @defgroup I2C_Exported_Functions_Group3 Peripheral State and Errors functions
|
|
2585 * @brief Peripheral State and Errors functions
|
|
2586 *
|
|
2587 @verbatim
|
|
2588 ===============================================================================
|
|
2589 ##### Peripheral State and Errors functions #####
|
|
2590 ===============================================================================
|
|
2591 [..]
|
|
2592 This subsection permits to get in run-time the status of the peripheral
|
|
2593 and the data flow.
|
|
2594
|
|
2595 @endverbatim
|
|
2596 * @{
|
|
2597 */
|
|
2598
|
|
2599 /**
|
|
2600 * @brief Returns the I2C state.
|
|
2601 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
2602 * the configuration information for I2C module
|
|
2603 * @retval HAL state
|
|
2604 */
|
|
2605 HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c)
|
|
2606 {
|
|
2607 return hi2c->State;
|
|
2608 }
|
|
2609
|
|
2610 /**
|
|
2611 * @brief Return the I2C error code
|
|
2612 * @param hi2c : pointer to a I2C_HandleTypeDef structure that contains
|
|
2613 * the configuration information for the specified I2C.
|
|
2614 * @retval I2C Error Code
|
|
2615 */
|
|
2616 uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c)
|
|
2617 {
|
|
2618 return hi2c->ErrorCode;
|
|
2619 }
|
|
2620
|
|
2621 /**
|
|
2622 * @}
|
|
2623 */
|
|
2624
|
|
2625 /**
|
|
2626 * @brief Handle TXE flag for Master
|
|
2627 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
2628 * the configuration information for I2C module
|
|
2629 * @retval HAL status
|
|
2630 */
|
|
2631 static HAL_StatusTypeDef I2C_MasterTransmit_TXE(I2C_HandleTypeDef *hi2c)
|
|
2632 {
|
|
2633 /* Write data to DR */
|
|
2634 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
|
|
2635 hi2c->XferCount--;
|
|
2636
|
|
2637 if(hi2c->XferCount == 0)
|
|
2638 {
|
|
2639 /* Disable BUF interrupt */
|
|
2640 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
|
|
2641 }
|
|
2642
|
|
2643 return HAL_OK;
|
|
2644 }
|
|
2645
|
|
2646 /**
|
|
2647 * @brief Handle BTF flag for Master transmitter
|
|
2648 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
2649 * the configuration information for I2C module
|
|
2650 * @retval HAL status
|
|
2651 */
|
|
2652 static HAL_StatusTypeDef I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c)
|
|
2653 {
|
|
2654 if(hi2c->XferCount != 0)
|
|
2655 {
|
|
2656 /* Write data to DR */
|
|
2657 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
|
|
2658 hi2c->XferCount--;
|
|
2659 }
|
|
2660 else
|
|
2661 {
|
|
2662 /* Disable EVT, BUF and ERR interrupt */
|
|
2663 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
|
|
2664
|
|
2665 /* Generate Stop */
|
|
2666 hi2c->Instance->CR1 |= I2C_CR1_STOP;
|
|
2667
|
|
2668 /* Wait until BUSY flag is reset */
|
|
2669 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
|
|
2670 {
|
|
2671 return HAL_TIMEOUT;
|
|
2672 }
|
|
2673
|
|
2674 if(hi2c->State == HAL_I2C_STATE_MEM_BUSY_TX)
|
|
2675 {
|
|
2676 hi2c->State = HAL_I2C_STATE_READY;
|
|
2677
|
|
2678 HAL_I2C_MemTxCpltCallback(hi2c);
|
|
2679 }
|
|
2680 else
|
|
2681 {
|
|
2682 hi2c->State = HAL_I2C_STATE_READY;
|
|
2683
|
|
2684 HAL_I2C_MasterTxCpltCallback(hi2c);
|
|
2685 }
|
|
2686 }
|
|
2687 return HAL_OK;
|
|
2688 }
|
|
2689
|
|
2690 /**
|
|
2691 * @brief Handle RXNE flag for Master
|
|
2692 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
2693 * the configuration information for I2C module
|
|
2694 * @retval HAL status
|
|
2695 */
|
|
2696 static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c)
|
|
2697 {
|
|
2698 uint32_t tmp = 0;
|
|
2699
|
|
2700 tmp = hi2c->XferCount;
|
|
2701 if(tmp > 3)
|
|
2702 {
|
|
2703 /* Read data from DR */
|
|
2704 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
|
|
2705 hi2c->XferCount--;
|
|
2706 }
|
|
2707 else if((tmp == 2) || (tmp == 3))
|
|
2708 {
|
|
2709 /* Disable BUF interrupt */
|
|
2710 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
|
|
2711 }
|
|
2712 else
|
|
2713 {
|
|
2714 /* Disable EVT, BUF and ERR interrupt */
|
|
2715 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
|
|
2716
|
|
2717 /* Read data from DR */
|
|
2718 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
|
|
2719 hi2c->XferCount--;
|
|
2720
|
|
2721 /* Wait until BUSY flag is reset */
|
|
2722 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
|
|
2723 {
|
|
2724 return HAL_TIMEOUT;
|
|
2725 }
|
|
2726
|
|
2727 /* Disable Pos */
|
|
2728 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
|
|
2729
|
|
2730 if(hi2c->State == HAL_I2C_STATE_MEM_BUSY_RX)
|
|
2731 {
|
|
2732 hi2c->State = HAL_I2C_STATE_READY;
|
|
2733
|
|
2734 HAL_I2C_MemRxCpltCallback(hi2c);
|
|
2735 }
|
|
2736 else
|
|
2737 {
|
|
2738 hi2c->State = HAL_I2C_STATE_READY;
|
|
2739
|
|
2740 HAL_I2C_MasterRxCpltCallback(hi2c);
|
|
2741 }
|
|
2742 }
|
|
2743 return HAL_OK;
|
|
2744 }
|
|
2745
|
|
2746 /**
|
|
2747 * @brief Handle BTF flag for Master receiver
|
|
2748 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
2749 * the configuration information for I2C module
|
|
2750 * @retval HAL status
|
|
2751 */
|
|
2752 static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c)
|
|
2753 {
|
|
2754 if(hi2c->XferCount == 3)
|
|
2755 {
|
|
2756 /* Disable Acknowledge */
|
|
2757 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
|
|
2758
|
|
2759 /* Read data from DR */
|
|
2760 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
|
|
2761 hi2c->XferCount--;
|
|
2762 }
|
|
2763 else if(hi2c->XferCount == 2)
|
|
2764 {
|
|
2765 /* Generate Stop */
|
|
2766 hi2c->Instance->CR1 |= I2C_CR1_STOP;
|
|
2767
|
|
2768 /* Read data from DR */
|
|
2769 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
|
|
2770 hi2c->XferCount--;
|
|
2771
|
|
2772 /* Read data from DR */
|
|
2773 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
|
|
2774 hi2c->XferCount--;
|
|
2775
|
|
2776 /* Disable EVT and ERR interrupt */
|
|
2777 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
|
|
2778
|
|
2779 /* Wait until BUSY flag is reset */
|
|
2780 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
|
|
2781 {
|
|
2782 return HAL_TIMEOUT;
|
|
2783 }
|
|
2784
|
|
2785 /* Disable Pos */
|
|
2786 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
|
|
2787
|
|
2788 if(hi2c->State == HAL_I2C_STATE_MEM_BUSY_RX)
|
|
2789 {
|
|
2790 hi2c->State = HAL_I2C_STATE_READY;
|
|
2791
|
|
2792 HAL_I2C_MemRxCpltCallback(hi2c);
|
|
2793 }
|
|
2794 else
|
|
2795 {
|
|
2796 hi2c->State = HAL_I2C_STATE_READY;
|
|
2797
|
|
2798 HAL_I2C_MasterRxCpltCallback(hi2c);
|
|
2799 }
|
|
2800 }
|
|
2801 else
|
|
2802 {
|
|
2803 /* Read data from DR */
|
|
2804 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
|
|
2805 hi2c->XferCount--;
|
|
2806 }
|
|
2807 return HAL_OK;
|
|
2808 }
|
|
2809
|
|
2810 /**
|
|
2811 * @brief Handle TXE flag for Slave
|
|
2812 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
2813 * the configuration information for I2C module
|
|
2814 * @retval HAL status
|
|
2815 */
|
|
2816 static HAL_StatusTypeDef I2C_SlaveTransmit_TXE(I2C_HandleTypeDef *hi2c)
|
|
2817 {
|
|
2818 if(hi2c->XferCount != 0)
|
|
2819 {
|
|
2820 /* Write data to DR */
|
|
2821 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
|
|
2822 hi2c->XferCount--;
|
|
2823 }
|
|
2824 return HAL_OK;
|
|
2825 }
|
|
2826
|
|
2827 /**
|
|
2828 * @brief Handle BTF flag for Slave transmitter
|
|
2829 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
2830 * the configuration information for I2C module
|
|
2831 * @retval HAL status
|
|
2832 */
|
|
2833 static HAL_StatusTypeDef I2C_SlaveTransmit_BTF(I2C_HandleTypeDef *hi2c)
|
|
2834 {
|
|
2835 if(hi2c->XferCount != 0)
|
|
2836 {
|
|
2837 /* Write data to DR */
|
|
2838 hi2c->Instance->DR = (*hi2c->pBuffPtr++);
|
|
2839 hi2c->XferCount--;
|
|
2840 }
|
|
2841 return HAL_OK;
|
|
2842 }
|
|
2843
|
|
2844 /**
|
|
2845 * @brief Handle RXNE flag for Slave
|
|
2846 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
2847 * the configuration information for I2C module
|
|
2848 * @retval HAL status
|
|
2849 */
|
|
2850 static HAL_StatusTypeDef I2C_SlaveReceive_RXNE(I2C_HandleTypeDef *hi2c)
|
|
2851 {
|
|
2852 if(hi2c->XferCount != 0)
|
|
2853 {
|
|
2854 /* Read data from DR */
|
|
2855 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
|
|
2856 hi2c->XferCount--;
|
|
2857 }
|
|
2858 return HAL_OK;
|
|
2859 }
|
|
2860
|
|
2861 /**
|
|
2862 * @brief Handle BTF flag for Slave receiver
|
|
2863 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
2864 * the configuration information for I2C module
|
|
2865 * @retval HAL status
|
|
2866 */
|
|
2867 static HAL_StatusTypeDef I2C_SlaveReceive_BTF(I2C_HandleTypeDef *hi2c)
|
|
2868 {
|
|
2869 if(hi2c->XferCount != 0)
|
|
2870 {
|
|
2871 /* Read data from DR */
|
|
2872 (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
|
|
2873 hi2c->XferCount--;
|
|
2874 }
|
|
2875 return HAL_OK;
|
|
2876 }
|
|
2877
|
|
2878 /**
|
|
2879 * @brief Handle ADD flag for Slave
|
|
2880 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
2881 * the configuration information for I2C module
|
|
2882 * @retval HAL status
|
|
2883 */
|
|
2884 static HAL_StatusTypeDef I2C_Slave_ADDR(I2C_HandleTypeDef *hi2c)
|
|
2885 {
|
|
2886 /* Clear ADDR flag */
|
|
2887 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
2888
|
|
2889 return HAL_OK;
|
|
2890 }
|
|
2891
|
|
2892 /**
|
|
2893 * @brief Handle STOPF flag for Slave
|
|
2894 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
2895 * the configuration information for I2C module
|
|
2896 * @retval HAL status
|
|
2897 */
|
|
2898 static HAL_StatusTypeDef I2C_Slave_STOPF(I2C_HandleTypeDef *hi2c)
|
|
2899 {
|
|
2900 /* Disable EVT, BUF and ERR interrupt */
|
|
2901 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
|
|
2902
|
|
2903 /* Clear STOPF flag */
|
|
2904 __HAL_I2C_CLEAR_STOPFLAG(hi2c);
|
|
2905
|
|
2906 /* Disable Acknowledge */
|
|
2907 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
|
|
2908
|
|
2909 /* Wait until BUSY flag is reset */
|
|
2910 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
|
|
2911 {
|
|
2912 return HAL_TIMEOUT;
|
|
2913 }
|
|
2914
|
|
2915 hi2c->State = HAL_I2C_STATE_READY;
|
|
2916
|
|
2917 HAL_I2C_SlaveRxCpltCallback(hi2c);
|
|
2918
|
|
2919 return HAL_OK;
|
|
2920 }
|
|
2921
|
|
2922 /**
|
|
2923 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
2924 * the configuration information for I2C module
|
|
2925 * @retval HAL status
|
|
2926 */
|
|
2927 static HAL_StatusTypeDef I2C_Slave_AF(I2C_HandleTypeDef *hi2c)
|
|
2928 {
|
|
2929 /* Disable EVT, BUF and ERR interrupt */
|
|
2930 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
|
|
2931
|
|
2932 /* Clear AF flag */
|
|
2933 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
|
|
2934
|
|
2935 /* Disable Acknowledge */
|
|
2936 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
|
|
2937
|
|
2938 /* Wait until BUSY flag is reset */
|
|
2939 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
|
|
2940 {
|
|
2941 return HAL_TIMEOUT;
|
|
2942 }
|
|
2943
|
|
2944 hi2c->State = HAL_I2C_STATE_READY;
|
|
2945
|
|
2946 HAL_I2C_SlaveTxCpltCallback(hi2c);
|
|
2947
|
|
2948 return HAL_OK;
|
|
2949 }
|
|
2950
|
|
2951 /**
|
|
2952 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
2953 * the configuration information for I2C module
|
|
2954 * @param DevAddress: Target device address
|
|
2955 * @param Timeout: Timeout duration
|
|
2956 * @retval HAL status
|
|
2957 */
|
|
2958 static HAL_StatusTypeDef I2C_MasterRequestWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout)
|
|
2959 {
|
|
2960 /* Generate Start */
|
|
2961 hi2c->Instance->CR1 |= I2C_CR1_START;
|
|
2962
|
|
2963 /* Wait until SB flag is set */
|
|
2964 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK)
|
|
2965 {
|
|
2966 return HAL_TIMEOUT;
|
|
2967 }
|
|
2968
|
|
2969 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
|
|
2970 {
|
|
2971 /* Send slave address */
|
|
2972 hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);
|
|
2973 }
|
|
2974 else
|
|
2975 {
|
|
2976 /* Send header of slave address */
|
|
2977 hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(DevAddress);
|
|
2978
|
|
2979 /* Wait until ADD10 flag is set */
|
|
2980 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADD10, Timeout) != HAL_OK)
|
|
2981 {
|
|
2982 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
2983 {
|
|
2984 return HAL_ERROR;
|
|
2985 }
|
|
2986 else
|
|
2987 {
|
|
2988 return HAL_TIMEOUT;
|
|
2989 }
|
|
2990 }
|
|
2991
|
|
2992 /* Send slave address */
|
|
2993 hi2c->Instance->DR = I2C_10BIT_ADDRESS(DevAddress);
|
|
2994 }
|
|
2995
|
|
2996 /* Wait until ADDR flag is set */
|
|
2997 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout) != HAL_OK)
|
|
2998 {
|
|
2999 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
3000 {
|
|
3001 return HAL_ERROR;
|
|
3002 }
|
|
3003 else
|
|
3004 {
|
|
3005 return HAL_TIMEOUT;
|
|
3006 }
|
|
3007 }
|
|
3008
|
|
3009 return HAL_OK;
|
|
3010 }
|
|
3011
|
|
3012 /**
|
|
3013 * @brief Master sends target device address for read request.
|
|
3014 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
3015 * the configuration information for I2C module
|
|
3016 * @param DevAddress: Target device address
|
|
3017 * @param Timeout: Timeout duration
|
|
3018 * @retval HAL status
|
|
3019 */
|
|
3020 static HAL_StatusTypeDef I2C_MasterRequestRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout)
|
|
3021 {
|
|
3022 /* Enable Acknowledge */
|
|
3023 hi2c->Instance->CR1 |= I2C_CR1_ACK;
|
|
3024
|
|
3025 /* Generate Start */
|
|
3026 hi2c->Instance->CR1 |= I2C_CR1_START;
|
|
3027
|
|
3028 /* Wait until SB flag is set */
|
|
3029 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK)
|
|
3030 {
|
|
3031 return HAL_TIMEOUT;
|
|
3032 }
|
|
3033
|
|
3034 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
|
|
3035 {
|
|
3036 /* Send slave address */
|
|
3037 hi2c->Instance->DR = I2C_7BIT_ADD_READ(DevAddress);
|
|
3038 }
|
|
3039 else
|
|
3040 {
|
|
3041 /* Send header of slave address */
|
|
3042 hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(DevAddress);
|
|
3043
|
|
3044 /* Wait until ADD10 flag is set */
|
|
3045 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADD10, Timeout) != HAL_OK)
|
|
3046 {
|
|
3047 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
3048 {
|
|
3049 return HAL_ERROR;
|
|
3050 }
|
|
3051 else
|
|
3052 {
|
|
3053 return HAL_TIMEOUT;
|
|
3054 }
|
|
3055 }
|
|
3056
|
|
3057 /* Send slave address */
|
|
3058 hi2c->Instance->DR = I2C_10BIT_ADDRESS(DevAddress);
|
|
3059
|
|
3060 /* Wait until ADDR flag is set */
|
|
3061 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout) != HAL_OK)
|
|
3062 {
|
|
3063 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
3064 {
|
|
3065 return HAL_ERROR;
|
|
3066 }
|
|
3067 else
|
|
3068 {
|
|
3069 return HAL_TIMEOUT;
|
|
3070 }
|
|
3071 }
|
|
3072
|
|
3073 /* Clear ADDR flag */
|
|
3074 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
3075
|
|
3076 /* Generate Restart */
|
|
3077 hi2c->Instance->CR1 |= I2C_CR1_START;
|
|
3078
|
|
3079 /* Wait until SB flag is set */
|
|
3080 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK)
|
|
3081 {
|
|
3082 return HAL_TIMEOUT;
|
|
3083 }
|
|
3084
|
|
3085 /* Send header of slave address */
|
|
3086 hi2c->Instance->DR = I2C_10BIT_HEADER_READ(DevAddress);
|
|
3087 }
|
|
3088
|
|
3089 /* Wait until ADDR flag is set */
|
|
3090 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout) != HAL_OK)
|
|
3091 {
|
|
3092 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
3093 {
|
|
3094 return HAL_ERROR;
|
|
3095 }
|
|
3096 else
|
|
3097 {
|
|
3098 return HAL_TIMEOUT;
|
|
3099 }
|
|
3100 }
|
|
3101
|
|
3102 return HAL_OK;
|
|
3103 }
|
|
3104
|
|
3105 /**
|
|
3106 * @brief Master sends target device address followed by internal memory address for write request.
|
|
3107 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
3108 * the configuration information for I2C module
|
|
3109 * @param DevAddress: Target device address
|
|
3110 * @param MemAddress: Internal memory address
|
|
3111 * @param MemAddSize: Size of internal memory address
|
|
3112 * @param Timeout: Timeout duration
|
|
3113 * @retval HAL status
|
|
3114 */
|
|
3115 static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout)
|
|
3116 {
|
|
3117 /* Generate Start */
|
|
3118 hi2c->Instance->CR1 |= I2C_CR1_START;
|
|
3119
|
|
3120 /* Wait until SB flag is set */
|
|
3121 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK)
|
|
3122 {
|
|
3123 return HAL_TIMEOUT;
|
|
3124 }
|
|
3125
|
|
3126 /* Send slave address */
|
|
3127 hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);
|
|
3128
|
|
3129 /* Wait until ADDR flag is set */
|
|
3130 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout) != HAL_OK)
|
|
3131 {
|
|
3132 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
3133 {
|
|
3134 return HAL_ERROR;
|
|
3135 }
|
|
3136 else
|
|
3137 {
|
|
3138 return HAL_TIMEOUT;
|
|
3139 }
|
|
3140 }
|
|
3141
|
|
3142 /* Clear ADDR flag */
|
|
3143 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
3144
|
|
3145 /* Wait until TXE flag is set */
|
|
3146 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK)
|
|
3147 {
|
|
3148 return HAL_TIMEOUT;
|
|
3149 }
|
|
3150
|
|
3151 /* If Memory address size is 8Bit */
|
|
3152 if(MemAddSize == I2C_MEMADD_SIZE_8BIT)
|
|
3153 {
|
|
3154 /* Send Memory Address */
|
|
3155 hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress);
|
|
3156 }
|
|
3157 /* If Memory address size is 16Bit */
|
|
3158 else
|
|
3159 {
|
|
3160 /* Send MSB of Memory Address */
|
|
3161 hi2c->Instance->DR = I2C_MEM_ADD_MSB(MemAddress);
|
|
3162
|
|
3163 /* Wait until TXE flag is set */
|
|
3164 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK)
|
|
3165 {
|
|
3166 return HAL_TIMEOUT;
|
|
3167 }
|
|
3168
|
|
3169 /* Send LSB of Memory Address */
|
|
3170 hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress);
|
|
3171 }
|
|
3172
|
|
3173 return HAL_OK;
|
|
3174 }
|
|
3175
|
|
3176 /**
|
|
3177 * @brief Master sends target device address followed by internal memory address for read request.
|
|
3178 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
3179 * the configuration information for I2C module
|
|
3180 * @param DevAddress: Target device address
|
|
3181 * @param MemAddress: Internal memory address
|
|
3182 * @param MemAddSize: Size of internal memory address
|
|
3183 * @param Timeout: Timeout duration
|
|
3184 * @retval HAL status
|
|
3185 */
|
|
3186 static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout)
|
|
3187 {
|
|
3188 /* Enable Acknowledge */
|
|
3189 hi2c->Instance->CR1 |= I2C_CR1_ACK;
|
|
3190
|
|
3191 /* Generate Start */
|
|
3192 hi2c->Instance->CR1 |= I2C_CR1_START;
|
|
3193
|
|
3194 /* Wait until SB flag is set */
|
|
3195 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK)
|
|
3196 {
|
|
3197 return HAL_TIMEOUT;
|
|
3198 }
|
|
3199
|
|
3200 /* Send slave address */
|
|
3201 hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);
|
|
3202
|
|
3203 /* Wait until ADDR flag is set */
|
|
3204 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout) != HAL_OK)
|
|
3205 {
|
|
3206 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
3207 {
|
|
3208 return HAL_ERROR;
|
|
3209 }
|
|
3210 else
|
|
3211 {
|
|
3212 return HAL_TIMEOUT;
|
|
3213 }
|
|
3214 }
|
|
3215
|
|
3216 /* Clear ADDR flag */
|
|
3217 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
|
|
3218
|
|
3219 /* Wait until TXE flag is set */
|
|
3220 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK)
|
|
3221 {
|
|
3222 return HAL_TIMEOUT;
|
|
3223 }
|
|
3224
|
|
3225 /* If Memory address size is 8Bit */
|
|
3226 if(MemAddSize == I2C_MEMADD_SIZE_8BIT)
|
|
3227 {
|
|
3228 /* Send Memory Address */
|
|
3229 hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress);
|
|
3230 }
|
|
3231 /* If Memory address size is 16Bit */
|
|
3232 else
|
|
3233 {
|
|
3234 /* Send MSB of Memory Address */
|
|
3235 hi2c->Instance->DR = I2C_MEM_ADD_MSB(MemAddress);
|
|
3236
|
|
3237 /* Wait until TXE flag is set */
|
|
3238 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK)
|
|
3239 {
|
|
3240 return HAL_TIMEOUT;
|
|
3241 }
|
|
3242
|
|
3243 /* Send LSB of Memory Address */
|
|
3244 hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress);
|
|
3245 }
|
|
3246
|
|
3247 /* Wait until TXE flag is set */
|
|
3248 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK)
|
|
3249 {
|
|
3250 return HAL_TIMEOUT;
|
|
3251 }
|
|
3252
|
|
3253 /* Generate Restart */
|
|
3254 hi2c->Instance->CR1 |= I2C_CR1_START;
|
|
3255
|
|
3256 /* Wait until SB flag is set */
|
|
3257 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK)
|
|
3258 {
|
|
3259 return HAL_TIMEOUT;
|
|
3260 }
|
|
3261
|
|
3262 /* Send slave address */
|
|
3263 hi2c->Instance->DR = I2C_7BIT_ADD_READ(DevAddress);
|
|
3264
|
|
3265 /* Wait until ADDR flag is set */
|
|
3266 if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout) != HAL_OK)
|
|
3267 {
|
|
3268 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
3269 {
|
|
3270 return HAL_ERROR;
|
|
3271 }
|
|
3272 else
|
|
3273 {
|
|
3274 return HAL_TIMEOUT;
|
|
3275 }
|
|
3276 }
|
|
3277
|
|
3278 return HAL_OK;
|
|
3279 }
|
|
3280
|
|
3281 /**
|
|
3282 * @brief DMA I2C master transmit process complete callback.
|
|
3283 * @param hdma: DMA handle
|
|
3284 * @retval None
|
|
3285 */
|
|
3286 static void I2C_DMAMasterTransmitCplt(DMA_HandleTypeDef *hdma)
|
|
3287 {
|
|
3288 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
|
|
3289
|
|
3290 /* Wait until BTF flag is reset */
|
|
3291 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, I2C_TIMEOUT_FLAG) != HAL_OK)
|
|
3292 {
|
|
3293 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
|
|
3294 }
|
|
3295
|
|
3296 /* Generate Stop */
|
|
3297 hi2c->Instance->CR1 |= I2C_CR1_STOP;
|
|
3298
|
|
3299 /* Disable DMA Request */
|
|
3300 hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN;
|
|
3301
|
|
3302 hi2c->XferCount = 0;
|
|
3303
|
|
3304 /* Wait until BUSY flag is reset */
|
|
3305 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
|
|
3306 {
|
|
3307 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
|
|
3308 }
|
|
3309
|
|
3310 hi2c->State = HAL_I2C_STATE_READY;
|
|
3311
|
|
3312 /* Check if Errors has been detected during transfer */
|
|
3313 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
|
|
3314 {
|
|
3315 HAL_I2C_ErrorCallback(hi2c);
|
|
3316 }
|
|
3317 else
|
|
3318 {
|
|
3319 HAL_I2C_MasterTxCpltCallback(hi2c);
|
|
3320 }
|
|
3321 }
|
|
3322
|
|
3323 /**
|
|
3324 * @brief DMA I2C slave transmit process complete callback.
|
|
3325 * @param hdma: DMA handle
|
|
3326 * @retval None
|
|
3327 */
|
|
3328 static void I2C_DMASlaveTransmitCplt(DMA_HandleTypeDef *hdma)
|
|
3329 {
|
|
3330 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
|
|
3331
|
|
3332 /* Wait until AF flag is reset */
|
|
3333 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_AF, RESET, I2C_TIMEOUT_FLAG) != HAL_OK)
|
|
3334 {
|
|
3335 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
|
|
3336 }
|
|
3337
|
|
3338 /* Clear AF flag */
|
|
3339 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
|
|
3340
|
|
3341 /* Disable Address Acknowledge */
|
|
3342 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
|
|
3343
|
|
3344 /* Disable DMA Request */
|
|
3345 hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN;
|
|
3346
|
|
3347 hi2c->XferCount = 0;
|
|
3348
|
|
3349 /* Wait until BUSY flag is reset */
|
|
3350 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
|
|
3351 {
|
|
3352 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
|
|
3353 }
|
|
3354
|
|
3355 hi2c->State = HAL_I2C_STATE_READY;
|
|
3356
|
|
3357 /* Check if Errors has been detected during transfer */
|
|
3358 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
|
|
3359 {
|
|
3360 HAL_I2C_ErrorCallback(hi2c);
|
|
3361 }
|
|
3362 else
|
|
3363 {
|
|
3364 HAL_I2C_SlaveTxCpltCallback(hi2c);
|
|
3365 }
|
|
3366 }
|
|
3367
|
|
3368 /**
|
|
3369 * @brief DMA I2C master receive process complete callback
|
|
3370 * @param hdma: DMA handle
|
|
3371 * @retval None
|
|
3372 */
|
|
3373 static void I2C_DMAMasterReceiveCplt(DMA_HandleTypeDef *hdma)
|
|
3374 {
|
|
3375 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
|
|
3376
|
|
3377 /* Generate Stop */
|
|
3378 hi2c->Instance->CR1 |= I2C_CR1_STOP;
|
|
3379
|
|
3380 /* Disable Last DMA */
|
|
3381 hi2c->Instance->CR2 &= ~I2C_CR2_LAST;
|
|
3382
|
|
3383 /* Disable Acknowledge */
|
|
3384 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
|
|
3385
|
|
3386 /* Disable DMA Request */
|
|
3387 hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN;
|
|
3388
|
|
3389 hi2c->XferCount = 0;
|
|
3390
|
|
3391 /* Wait until BUSY flag is reset */
|
|
3392 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
|
|
3393 {
|
|
3394 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
|
|
3395 }
|
|
3396
|
|
3397 hi2c->State = HAL_I2C_STATE_READY;
|
|
3398
|
|
3399 /* Check if Errors has been detected during transfer */
|
|
3400 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
|
|
3401 {
|
|
3402 HAL_I2C_ErrorCallback(hi2c);
|
|
3403 }
|
|
3404 else
|
|
3405 {
|
|
3406 HAL_I2C_MasterRxCpltCallback(hi2c);
|
|
3407 }
|
|
3408 }
|
|
3409
|
|
3410 /**
|
|
3411 * @brief DMA I2C slave receive process complete callback.
|
|
3412 * @param hdma: DMA handle
|
|
3413 * @retval None
|
|
3414 */
|
|
3415 static void I2C_DMASlaveReceiveCplt(DMA_HandleTypeDef *hdma)
|
|
3416 {
|
|
3417 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
|
|
3418
|
|
3419 /* Wait until STOPF flag is reset */
|
|
3420 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_STOPF, RESET, I2C_TIMEOUT_FLAG) != HAL_OK)
|
|
3421 {
|
|
3422 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
|
|
3423 }
|
|
3424
|
|
3425 /* Clear STOPF flag */
|
|
3426 __HAL_I2C_CLEAR_STOPFLAG(hi2c);
|
|
3427
|
|
3428 /* Disable Address Acknowledge */
|
|
3429 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
|
|
3430
|
|
3431 /* Disable DMA Request */
|
|
3432 hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN;
|
|
3433
|
|
3434 hi2c->XferCount = 0;
|
|
3435
|
|
3436 /* Wait until BUSY flag is reset */
|
|
3437 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
|
|
3438 {
|
|
3439 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
|
|
3440 }
|
|
3441
|
|
3442 hi2c->State = HAL_I2C_STATE_READY;
|
|
3443
|
|
3444 /* Check if Errors has been detected during transfer */
|
|
3445 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
|
|
3446 {
|
|
3447 HAL_I2C_ErrorCallback(hi2c);
|
|
3448 }
|
|
3449 else
|
|
3450 {
|
|
3451 HAL_I2C_SlaveRxCpltCallback(hi2c);
|
|
3452 }
|
|
3453 }
|
|
3454
|
|
3455 /**
|
|
3456 * @brief DMA I2C Memory Write process complete callback
|
|
3457 * @param hdma: DMA handle
|
|
3458 * @retval None
|
|
3459 */
|
|
3460 static void I2C_DMAMemTransmitCplt(DMA_HandleTypeDef *hdma)
|
|
3461 {
|
|
3462 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
|
|
3463
|
|
3464 /* Wait until BTF flag is reset */
|
|
3465 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, I2C_TIMEOUT_FLAG) != HAL_OK)
|
|
3466 {
|
|
3467 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
|
|
3468 }
|
|
3469
|
|
3470 /* Generate Stop */
|
|
3471 hi2c->Instance->CR1 |= I2C_CR1_STOP;
|
|
3472
|
|
3473 /* Disable DMA Request */
|
|
3474 hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN;
|
|
3475
|
|
3476 hi2c->XferCount = 0;
|
|
3477
|
|
3478 /* Wait until BUSY flag is reset */
|
|
3479 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
|
|
3480 {
|
|
3481 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
|
|
3482 }
|
|
3483
|
|
3484 hi2c->State = HAL_I2C_STATE_READY;
|
|
3485
|
|
3486 /* Check if Errors has been detected during transfer */
|
|
3487 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
|
|
3488 {
|
|
3489 HAL_I2C_ErrorCallback(hi2c);
|
|
3490 }
|
|
3491 else
|
|
3492 {
|
|
3493 HAL_I2C_MemTxCpltCallback(hi2c);
|
|
3494 }
|
|
3495 }
|
|
3496
|
|
3497 /**
|
|
3498 * @brief DMA I2C Memory Read process complete callback
|
|
3499 * @param hdma: DMA handle
|
|
3500 * @retval None
|
|
3501 */
|
|
3502 static void I2C_DMAMemReceiveCplt(DMA_HandleTypeDef *hdma)
|
|
3503 {
|
|
3504 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
|
|
3505
|
|
3506 /* Generate Stop */
|
|
3507 hi2c->Instance->CR1 |= I2C_CR1_STOP;
|
|
3508
|
|
3509 /* Disable Last DMA */
|
|
3510 hi2c->Instance->CR2 &= ~I2C_CR2_LAST;
|
|
3511
|
|
3512 /* Disable Acknowledge */
|
|
3513 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
|
|
3514
|
|
3515 /* Disable DMA Request */
|
|
3516 hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN;
|
|
3517
|
|
3518 hi2c->XferCount = 0;
|
|
3519
|
|
3520 /* Wait until BUSY flag is reset */
|
|
3521 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_FLAG) != HAL_OK)
|
|
3522 {
|
|
3523 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
|
|
3524 }
|
|
3525
|
|
3526 hi2c->State = HAL_I2C_STATE_READY;
|
|
3527
|
|
3528 /* Check if Errors has been detected during transfer */
|
|
3529 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
|
|
3530 {
|
|
3531 HAL_I2C_ErrorCallback(hi2c);
|
|
3532 }
|
|
3533 else
|
|
3534 {
|
|
3535 HAL_I2C_MemRxCpltCallback(hi2c);
|
|
3536 }
|
|
3537 }
|
|
3538
|
|
3539 /**
|
|
3540 * @brief DMA I2C communication error callback.
|
|
3541 * @param hdma: DMA handle
|
|
3542 * @retval None
|
|
3543 */
|
|
3544 static void I2C_DMAError(DMA_HandleTypeDef *hdma)
|
|
3545 {
|
|
3546 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
|
|
3547
|
|
3548 /* Disable Acknowledge */
|
|
3549 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
|
|
3550
|
|
3551 hi2c->XferCount = 0;
|
|
3552
|
|
3553 hi2c->State = HAL_I2C_STATE_READY;
|
|
3554
|
|
3555 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
|
|
3556
|
|
3557 HAL_I2C_ErrorCallback(hi2c);
|
|
3558 }
|
|
3559
|
|
3560 /**
|
|
3561 * @brief This function handles I2C Communication Timeout.
|
|
3562 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
3563 * the configuration information for I2C module
|
|
3564 * @param Flag: specifies the I2C flag to check.
|
|
3565 * @param Status: The new Flag status (SET or RESET).
|
|
3566 * @param Timeout: Timeout duration
|
|
3567 * @retval HAL status
|
|
3568 */
|
|
3569 static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout)
|
|
3570 {
|
|
3571 uint32_t tickstart = 0;
|
|
3572
|
|
3573 /* Get tick */
|
|
3574 tickstart = HAL_GetTick();
|
|
3575
|
|
3576 /* Wait until flag is set */
|
|
3577 if(Status == RESET)
|
|
3578 {
|
|
3579 while(__HAL_I2C_GET_FLAG(hi2c, Flag) == RESET)
|
|
3580 {
|
|
3581 /* Check for the Timeout */
|
|
3582 if(Timeout != HAL_MAX_DELAY)
|
|
3583 {
|
|
3584 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
|
|
3585 {
|
|
3586 hi2c->State= HAL_I2C_STATE_READY;
|
|
3587
|
|
3588 /* Process Unlocked */
|
|
3589 __HAL_UNLOCK(hi2c);
|
|
3590
|
|
3591 return HAL_TIMEOUT;
|
|
3592 }
|
|
3593 }
|
|
3594 }
|
|
3595 }
|
|
3596 else
|
|
3597 {
|
|
3598 while(__HAL_I2C_GET_FLAG(hi2c, Flag) != RESET)
|
|
3599 {
|
|
3600 /* Check for the Timeout */
|
|
3601 if(Timeout != HAL_MAX_DELAY)
|
|
3602 {
|
|
3603 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
|
|
3604 {
|
|
3605 hi2c->State= HAL_I2C_STATE_READY;
|
|
3606
|
|
3607 /* Process Unlocked */
|
|
3608 __HAL_UNLOCK(hi2c);
|
|
3609
|
|
3610 return HAL_TIMEOUT;
|
|
3611 }
|
|
3612 }
|
|
3613 }
|
|
3614 }
|
|
3615 return HAL_OK;
|
|
3616 }
|
|
3617
|
|
3618 /**
|
|
3619 * @brief This function handles I2C Communication Timeout for Master addressing phase.
|
|
3620 * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains
|
|
3621 * the configuration information for I2C module
|
|
3622 * @param Flag: specifies the I2C flag to check.
|
|
3623 * @param Timeout: Timeout duration
|
|
3624 * @retval HAL status
|
|
3625 */
|
|
3626 static HAL_StatusTypeDef I2C_WaitOnMasterAddressFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, uint32_t Timeout)
|
|
3627 {
|
|
3628 uint32_t tickstart = 0;
|
|
3629
|
|
3630 /* Get tick */
|
|
3631 tickstart = HAL_GetTick();
|
|
3632
|
|
3633 while(__HAL_I2C_GET_FLAG(hi2c, Flag) == RESET)
|
|
3634 {
|
|
3635 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET)
|
|
3636 {
|
|
3637 /* Generate Stop */
|
|
3638 hi2c->Instance->CR1 |= I2C_CR1_STOP;
|
|
3639
|
|
3640 /* Clear AF Flag */
|
|
3641 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
|
|
3642
|
|
3643 hi2c->ErrorCode = HAL_I2C_ERROR_AF;
|
|
3644 hi2c->State= HAL_I2C_STATE_READY;
|
|
3645
|
|
3646 /* Process Unlocked */
|
|
3647 __HAL_UNLOCK(hi2c);
|
|
3648
|
|
3649 return HAL_ERROR;
|
|
3650 }
|
|
3651
|
|
3652 /* Check for the Timeout */
|
|
3653 if(Timeout != HAL_MAX_DELAY)
|
|
3654 {
|
|
3655 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
|
|
3656 {
|
|
3657 hi2c->State= HAL_I2C_STATE_READY;
|
|
3658
|
|
3659 /* Process Unlocked */
|
|
3660 __HAL_UNLOCK(hi2c);
|
|
3661
|
|
3662 return HAL_TIMEOUT;
|
|
3663 }
|
|
3664 }
|
|
3665 }
|
|
3666 return HAL_OK;
|
|
3667 }
|
|
3668
|
|
3669 /**
|
|
3670 * @}
|
|
3671 */
|
|
3672
|
|
3673 #endif /* HAL_I2C_MODULE_ENABLED */
|
|
3674
|
|
3675 /**
|
|
3676 * @}
|
|
3677 */
|
|
3678
|
|
3679 /**
|
|
3680 * @}
|
|
3681 */
|
|
3682
|
|
3683 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|