0
|
1 /**
|
|
2 ******************************************************************************
|
|
3 * @file stm32l4xx_hal_i2c.c
|
|
4 * @author MCD Application Team
|
|
5 * @version V1.6.0
|
|
6 * @date 28-October-2016
|
|
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 State and Errors functions
|
|
13 *
|
|
14 @verbatim
|
|
15 ==============================================================================
|
|
16 ##### How to use this driver #####
|
|
17 ==============================================================================
|
|
18 [..]
|
|
19 The I2C HAL driver can be used as follows:
|
|
20
|
|
21 (#) Declare a I2C_HandleTypeDef handle structure, for example:
|
|
22 I2C_HandleTypeDef hi2c;
|
|
23
|
|
24 (#)Initialize the I2C low level resources by implementing the HAL_I2C_MspInit() API:
|
|
25 (##) Enable the I2Cx interface clock
|
|
26 (##) I2C pins configuration
|
|
27 (+++) Enable the clock for the I2C GPIOs
|
|
28 (+++) Configure I2C pins as alternate function open-drain
|
|
29 (##) NVIC configuration if you need to use interrupt process
|
|
30 (+++) Configure the I2Cx interrupt priority
|
|
31 (+++) Enable the NVIC I2C IRQ Channel
|
|
32 (##) DMA Configuration if you need to use DMA process
|
|
33 (+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive channel
|
|
34 (+++) Enable the DMAx interface clock using
|
|
35 (+++) Configure the DMA handle parameters
|
|
36 (+++) Configure the DMA Tx or Rx channel
|
|
37 (+++) Associate the initialized DMA handle to the hi2c DMA Tx or Rx handle
|
|
38 (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on
|
|
39 the DMA Tx or Rx channel
|
|
40
|
|
41 (#) Configure the Communication Clock Timing, Own Address1, Master Addressing mode, Dual Addressing mode,
|
|
42 Own Address2, Own Address2 Mask, General call and Nostretch mode in the hi2c Init structure.
|
|
43
|
|
44 (#) Initialize the I2C registers by calling the HAL_I2C_Init(), configures also the low level Hardware
|
|
45 (GPIO, CLOCK, NVIC...etc) by calling the customized HAL_I2C_MspInit(&hi2c) API.
|
|
46
|
|
47 (#) To check if target device is ready for communication, use the function HAL_I2C_IsDeviceReady()
|
|
48
|
|
49 (#) For I2C IO and IO MEM operations, three operation modes are available within this driver :
|
|
50
|
|
51 *** Polling mode IO operation ***
|
|
52 =================================
|
|
53 [..]
|
|
54 (+) Transmit in master mode an amount of data in blocking mode using HAL_I2C_Master_Transmit()
|
|
55 (+) Receive in master mode an amount of data in blocking mode using HAL_I2C_Master_Receive()
|
|
56 (+) Transmit in slave mode an amount of data in blocking mode using HAL_I2C_Slave_Transmit()
|
|
57 (+) Receive in slave mode an amount of data in blocking mode using HAL_I2C_Slave_Receive()
|
|
58
|
|
59 *** Polling mode IO MEM operation ***
|
|
60 =====================================
|
|
61 [..]
|
|
62 (+) Write an amount of data in blocking mode to a specific memory address using HAL_I2C_Mem_Write()
|
|
63 (+) Read an amount of data in blocking mode from a specific memory address using HAL_I2C_Mem_Read()
|
|
64
|
|
65
|
|
66 *** Interrupt mode IO operation ***
|
|
67 ===================================
|
|
68 [..]
|
|
69 (+) Transmit in master mode an amount of data in non-blocking mode using HAL_I2C_Master_Transmit_IT()
|
|
70 (+) At transmission end of transfer, HAL_I2C_MasterTxCpltCallback() is executed and user can
|
|
71 add his own code by customization of function pointer HAL_I2C_MasterTxCpltCallback()
|
|
72 (+) Receive in master mode an amount of data in non-blocking mode using HAL_I2C_Master_Receive_IT()
|
|
73 (+) At reception end of transfer, HAL_I2C_MasterRxCpltCallback() is executed and user can
|
|
74 add his own code by customization of function pointer HAL_I2C_MasterRxCpltCallback()
|
|
75 (+) Transmit in slave mode an amount of data in non-blocking mode using HAL_I2C_Slave_Transmit_IT()
|
|
76 (+) At transmission end of transfer, HAL_I2C_SlaveTxCpltCallback() is executed and user can
|
|
77 add his own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback()
|
|
78 (+) Receive in slave mode an amount of data in non-blocking mode using HAL_I2C_Slave_Receive_IT()
|
|
79 (+) At reception end of transfer, HAL_I2C_SlaveRxCpltCallback() is executed and user can
|
|
80 add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback()
|
|
81 (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can
|
|
82 add his own code by customization of function pointer HAL_I2C_ErrorCallback()
|
|
83 (+) Abort a master I2C process communication with Interrupt using HAL_I2C_Master_Abort_IT()
|
|
84 (+) End of abort process, HAL_I2C_AbortCpltCallback() is executed and user can
|
|
85 add his own code by customization of function pointer HAL_I2C_AbortCpltCallback()
|
|
86 (+) Discard a slave I2C process communication using __HAL_I2C_GENERATE_NACK() macro.
|
|
87 This action will inform Master to generate a Stop condition to discard the communication.
|
|
88
|
|
89
|
|
90 *** Interrupt mode IO sequential operation ***
|
|
91 ==============================================
|
|
92 [..]
|
|
93 (@) These interfaces allow to manage a sequential transfer with a repeated start condition
|
|
94 when a direction change during transfer
|
|
95 [..]
|
|
96 (+) A specific option field manage the different steps of a sequential transfer
|
|
97 (+) Option field values are defined through @ref I2C_XFEROPTIONS and are listed below:
|
|
98 (++) I2C_FIRST_AND_LAST_FRAME: No sequential usage, functionnal is same as associated interfaces in no sequential mode
|
|
99 (++) I2C_FIRST_FRAME: Sequential usage, this option allow to manage a sequence with start condition, address
|
|
100 and data to transfer without a final stop condition
|
|
101 (++) I2C_FIRST_AND_NEXT_FRAME: Sequential usage (Master only), this option allow to manage a sequence with start condition, address
|
|
102 and data to transfer without a final stop condition, an then permit a call the same master sequential interface
|
|
103 several times (like HAL_I2C_Master_Sequential_Transmit_IT() then HAL_I2C_Master_Sequential_Transmit_IT())
|
|
104 (++) I2C_NEXT_FRAME: Sequential usage, this option allow to manage a sequence with a restart condition, address
|
|
105 and with new data to transfer if the direction change or manage only the new data to transfer
|
|
106 if no direction change and without a final stop condition in both cases
|
|
107 (++) I2C_LAST_FRAME: Sequential usage, this option allow to manage a sequance with a restart condition, address
|
|
108 and with new data to transfer if the direction change or manage only the new data to transfer
|
|
109 if no direction change and with a final stop condition in both cases
|
|
110
|
|
111 (+) Differents sequential I2C interfaces are listed below:
|
|
112 (++) Sequential transmit in master I2C mode an amount of data in non-blocking mode using HAL_I2C_Master_Sequential_Transmit_IT()
|
|
113 (+++) At transmission end of current frame transfer, HAL_I2C_MasterTxCpltCallback() is executed and user can
|
|
114 add his own code by customization of function pointer HAL_I2C_MasterTxCpltCallback()
|
|
115 (++) Sequential receive in master I2C mode an amount of data in non-blocking mode using HAL_I2C_Master_Sequential_Receive_IT()
|
|
116 (+++) At reception end of current frame transfer, HAL_I2C_MasterRxCpltCallback() is executed and user can
|
|
117 add his own code by customization of function pointer HAL_I2C_MasterRxCpltCallback()
|
|
118 (++) Abort a master I2C process communication with Interrupt using HAL_I2C_Master_Abort_IT()
|
|
119 (+++) End of abort process, HAL_I2C_AbortCpltCallback() is executed and user can
|
|
120 add his own code by customization of function pointer HAL_I2C_AbortCpltCallback()
|
|
121 (++) Enable/disable the Address listen mode in slave I2C mode using HAL_I2C_EnableListen_IT() HAL_I2C_DisableListen_IT()
|
|
122 (+++) When address slave I2C match, HAL_I2C_AddrCallback() is executed and user can
|
|
123 add his own code to check the Address Match Code and the transmission direction request by master (Write/Read).
|
|
124 (+++) At Listen mode end HAL_I2C_ListenCpltCallback() is executed and user can
|
|
125 add his own code by customization of function pointer HAL_I2C_ListenCpltCallback()
|
|
126 (++) Sequential transmit in slave I2C mode an amount of data in non-blocking mode using HAL_I2C_Slave_Sequential_Transmit_IT()
|
|
127 (+++) At transmission end of current frame transfer, HAL_I2C_SlaveTxCpltCallback() is executed and user can
|
|
128 add his own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback()
|
|
129 (++) Sequential receive in slave I2C mode an amount of data in non-blocking mode using HAL_I2C_Slave_Sequential_Receive_IT()
|
|
130 (+++) At reception end of current frame transfer, HAL_I2C_SlaveRxCpltCallback() is executed and user can
|
|
131 add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback()
|
|
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 (++) Abort a master I2C process communication with Interrupt using HAL_I2C_Master_Abort_IT()
|
|
135 (++) End of abort process, HAL_I2C_AbortCpltCallback() is executed and user can
|
|
136 add his own code by customization of function pointer HAL_I2C_AbortCpltCallback()
|
|
137 (++) Discard a slave I2C process communication using __HAL_I2C_GENERATE_NACK() macro.
|
|
138 This action will inform Master to generate a Stop condition to discard the communication.
|
|
139
|
|
140 *** Interrupt mode IO MEM operation ***
|
|
141 =======================================
|
|
142 [..]
|
|
143 (+) Write an amount of data in non-blocking mode with Interrupt to a specific memory address using
|
|
144 HAL_I2C_Mem_Write_IT()
|
|
145 (+) At Memory end of write transfer, HAL_I2C_MemTxCpltCallback() is executed and user can
|
|
146 add his own code by customization of function pointer HAL_I2C_MemTxCpltCallback()
|
|
147 (+) Read an amount of data in non-blocking mode with Interrupt from a specific memory address using
|
|
148 HAL_I2C_Mem_Read_IT()
|
|
149 (+) At Memory end of read transfer, HAL_I2C_MemRxCpltCallback() is executed and user can
|
|
150 add his own code by customization of function pointer HAL_I2C_MemRxCpltCallback()
|
|
151 (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can
|
|
152 add his own code by customization of function pointer HAL_I2C_ErrorCallback()
|
|
153
|
|
154 *** DMA mode IO operation ***
|
|
155 ==============================
|
|
156 [..]
|
|
157 (+) Transmit in master mode an amount of data in non-blocking mode (DMA) using
|
|
158 HAL_I2C_Master_Transmit_DMA()
|
|
159 (+) At transmission end of transfer, HAL_I2C_MasterTxCpltCallback() is executed and user can
|
|
160 add his own code by customization of function pointer HAL_I2C_MasterTxCpltCallback()
|
|
161 (+) Receive in master mode an amount of data in non-blocking mode (DMA) using
|
|
162 HAL_I2C_Master_Receive_DMA()
|
|
163 (+) At reception end of transfer, HAL_I2C_MasterRxCpltCallback() is executed and user can
|
|
164 add his own code by customization of function pointer HAL_I2C_MasterRxCpltCallback()
|
|
165 (+) Transmit in slave mode an amount of data in non-blocking mode (DMA) using
|
|
166 HAL_I2C_Slave_Transmit_DMA()
|
|
167 (+) At transmission end of transfer, HAL_I2C_SlaveTxCpltCallback() is executed and user can
|
|
168 add his own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback()
|
|
169 (+) Receive in slave mode an amount of data in non-blocking mode (DMA) using
|
|
170 HAL_I2C_Slave_Receive_DMA()
|
|
171 (+) At reception end of transfer, HAL_I2C_SlaveRxCpltCallback() is executed and user can
|
|
172 add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback()
|
|
173 (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can
|
|
174 add his own code by customization of function pointer HAL_I2C_ErrorCallback()
|
|
175 (+) Abort a master I2C process communication with Interrupt using HAL_I2C_Master_Abort_IT()
|
|
176 (+) End of abort process, HAL_I2C_AbortCpltCallback() is executed and user can
|
|
177 add his own code by customization of function pointer HAL_I2C_AbortCpltCallback()
|
|
178 (+) Discard a slave I2C process communication using __HAL_I2C_GENERATE_NACK() macro.
|
|
179 This action will inform Master to generate a Stop condition to discard the communication.
|
|
180
|
|
181 *** DMA mode IO MEM operation ***
|
|
182 =================================
|
|
183 [..]
|
|
184 (+) Write an amount of data in non-blocking mode with DMA to a specific memory address using
|
|
185 HAL_I2C_Mem_Write_DMA()
|
|
186 (+) At Memory end of write transfer, HAL_I2C_MemTxCpltCallback() is executed and user can
|
|
187 add his own code by customization of function pointer HAL_I2C_MemTxCpltCallback()
|
|
188 (+) Read an amount of data in non-blocking mode with DMA from a specific memory address using
|
|
189 HAL_I2C_Mem_Read_DMA()
|
|
190 (+) At Memory end of read transfer, HAL_I2C_MemRxCpltCallback() is executed and user can
|
|
191 add his own code by customization of function pointer HAL_I2C_MemRxCpltCallback()
|
|
192 (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can
|
|
193 add his own code by customization of function pointer HAL_I2C_ErrorCallback()
|
|
194
|
|
195
|
|
196 *** I2C HAL driver macros list ***
|
|
197 ==================================
|
|
198 [..]
|
|
199 Below the list of most used macros in I2C HAL driver.
|
|
200
|
|
201 (+) __HAL_I2C_ENABLE: Enable the I2C peripheral
|
|
202 (+) __HAL_I2C_DISABLE: Disable the I2C peripheral
|
|
203 (+) __HAL_I2C_GENERATE_NACK: Generate a Non-Acknowledge I2C peripheral in Slave mode
|
|
204 (+) __HAL_I2C_GET_FLAG: Check whether the specified I2C flag is set or not
|
|
205 (+) __HAL_I2C_CLEAR_FLAG: Clear the specified I2C pending flag
|
|
206 (+) __HAL_I2C_ENABLE_IT: Enable the specified I2C interrupt
|
|
207 (+) __HAL_I2C_DISABLE_IT: Disable the specified I2C interrupt
|
|
208
|
|
209 [..]
|
|
210 (@) You can refer to the I2C HAL driver header file for more useful macros
|
|
211
|
|
212 @endverbatim
|
|
213 ******************************************************************************
|
|
214 * @attention
|
|
215 *
|
|
216 * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
|
|
217 *
|
|
218 * Redistribution and use in source and binary forms, with or without modification,
|
|
219 * are permitted provided that the following conditions are met:
|
|
220 * 1. Redistributions of source code must retain the above copyright notice,
|
|
221 * this list of conditions and the following disclaimer.
|
|
222 * 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
223 * this list of conditions and the following disclaimer in the documentation
|
|
224 * and/or other materials provided with the distribution.
|
|
225 * 3. Neither the name of STMicroelectronics nor the names of its contributors
|
|
226 * may be used to endorse or promote products derived from this software
|
|
227 * without specific prior written permission.
|
|
228 *
|
|
229 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
230 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
231 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
232 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
233 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
234 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
235 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
236 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
237 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
238 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
239 *
|
|
240 ******************************************************************************
|
|
241 */
|
|
242
|
|
243 /* Includes ------------------------------------------------------------------*/
|
|
244 #include "stm32l4xx_hal.h"
|
|
245
|
|
246 /** @addtogroup STM32L4xx_HAL_Driver
|
|
247 * @{
|
|
248 */
|
|
249
|
|
250 /** @defgroup I2C I2C
|
|
251 * @brief I2C HAL module driver
|
|
252 * @{
|
|
253 */
|
|
254
|
|
255 #ifdef HAL_I2C_MODULE_ENABLED
|
|
256
|
|
257 /* Private typedef -----------------------------------------------------------*/
|
|
258 /* Private define ------------------------------------------------------------*/
|
|
259
|
|
260 /** @defgroup I2C_Private_Define I2C Private Define
|
|
261 * @{
|
|
262 */
|
|
263 #define TIMING_CLEAR_MASK (0xF0FFFFFFU) /*!< I2C TIMING clear register Mask */
|
|
264 #define I2C_TIMEOUT_ADDR (10000U) /*!< 10 s */
|
|
265 #define I2C_TIMEOUT_BUSY (25U) /*!< 25 ms */
|
|
266 #define I2C_TIMEOUT_DIR (25U) /*!< 25 ms */
|
|
267 #define I2C_TIMEOUT_RXNE (25U) /*!< 25 ms */
|
|
268 #define I2C_TIMEOUT_STOPF (25U) /*!< 25 ms */
|
|
269 #define I2C_TIMEOUT_TC (25U) /*!< 25 ms */
|
|
270 #define I2C_TIMEOUT_TCR (25U) /*!< 25 ms */
|
|
271 #define I2C_TIMEOUT_TXIS (25U) /*!< 25 ms */
|
|
272 #define I2C_TIMEOUT_FLAG (25U) /*!< 25 ms */
|
|
273
|
|
274 #define MAX_NBYTE_SIZE 255U
|
|
275 #define SlaveAddr_SHIFT 7U
|
|
276 #define SlaveAddr_MSK 0x06U
|
|
277
|
|
278 /* Private define for @ref PreviousState usage */
|
|
279 #define I2C_STATE_MSK ((uint32_t)((HAL_I2C_STATE_BUSY_TX | HAL_I2C_STATE_BUSY_RX) & (~((uint32_t)HAL_I2C_STATE_READY)))) /*!< Mask State define, keep only RX and TX bits */
|
|
280 #define I2C_STATE_NONE ((uint32_t)(HAL_I2C_MODE_NONE)) /*!< Default Value */
|
|
281 #define I2C_STATE_MASTER_BUSY_TX ((uint32_t)((HAL_I2C_STATE_BUSY_TX & I2C_STATE_MSK) | HAL_I2C_MODE_MASTER)) /*!< Master Busy TX, combinaison of State LSB and Mode enum */
|
|
282 #define I2C_STATE_MASTER_BUSY_RX ((uint32_t)((HAL_I2C_STATE_BUSY_RX & I2C_STATE_MSK) | HAL_I2C_MODE_MASTER)) /*!< Master Busy RX, combinaison of State LSB and Mode enum */
|
|
283 #define I2C_STATE_SLAVE_BUSY_TX ((uint32_t)((HAL_I2C_STATE_BUSY_TX & I2C_STATE_MSK) | HAL_I2C_MODE_SLAVE)) /*!< Slave Busy TX, combinaison of State LSB and Mode enum */
|
|
284 #define I2C_STATE_SLAVE_BUSY_RX ((uint32_t)((HAL_I2C_STATE_BUSY_RX & I2C_STATE_MSK) | HAL_I2C_MODE_SLAVE)) /*!< Slave Busy RX, combinaison of State LSB and Mode enum */
|
|
285 #define I2C_STATE_MEM_BUSY_TX ((uint32_t)((HAL_I2C_STATE_BUSY_TX & I2C_STATE_MSK) | HAL_I2C_MODE_MEM)) /*!< Memory Busy TX, combinaison of State LSB and Mode enum */
|
|
286 #define I2C_STATE_MEM_BUSY_RX ((uint32_t)((HAL_I2C_STATE_BUSY_RX & I2C_STATE_MSK) | HAL_I2C_MODE_MEM)) /*!< Memory Busy RX, combinaison of State LSB and Mode enum */
|
|
287
|
|
288
|
|
289 /* Private define to centralize the enable/disable of Interrupts */
|
|
290 #define I2C_XFER_TX_IT (0x00000001U)
|
|
291 #define I2C_XFER_RX_IT (0x00000002U)
|
|
292 #define I2C_XFER_LISTEN_IT (0x00000004U)
|
|
293
|
|
294 #define I2C_XFER_ERROR_IT (0x00000011U)
|
|
295 #define I2C_XFER_CPLT_IT (0x00000012U)
|
|
296 #define I2C_XFER_RELOAD_IT (0x00000012U)
|
|
297
|
|
298 /* Private define Sequential Transfer Options default/reset value */
|
|
299 #define I2C_NO_OPTION_FRAME (0xFFFF0000U)
|
|
300 /**
|
|
301 * @}
|
|
302 */
|
|
303
|
|
304 /* Private macro -------------------------------------------------------------*/
|
|
305 #define I2C_GET_DMA_REMAIN_DATA(__HANDLE__) ((((__HANDLE__)->State) == HAL_I2C_STATE_BUSY_TX) ? \
|
|
306 ((uint32_t)((__HANDLE__)->hdmatx->Instance->CNDTR)) : \
|
|
307 ((uint32_t)((__HANDLE__)->hdmarx->Instance->CNDTR)))
|
|
308
|
|
309 /* Private variables ---------------------------------------------------------*/
|
|
310 /* Private function prototypes -----------------------------------------------*/
|
|
311
|
|
312 /** @defgroup I2C_Private_Functions I2C Private Functions
|
|
313 * @{
|
|
314 */
|
|
315 /* Private functions to handle DMA transfer */
|
|
316 static void I2C_DMAMasterTransmitCplt(DMA_HandleTypeDef *hdma);
|
|
317 static void I2C_DMAMasterReceiveCplt(DMA_HandleTypeDef *hdma);
|
|
318 static void I2C_DMASlaveTransmitCplt(DMA_HandleTypeDef *hdma);
|
|
319 static void I2C_DMASlaveReceiveCplt(DMA_HandleTypeDef *hdma);
|
|
320 static void I2C_DMAError(DMA_HandleTypeDef *hdma);
|
|
321 static void I2C_DMAAbort(DMA_HandleTypeDef *hdma);
|
|
322
|
|
323 /* Private functions to handle IT transfer */
|
|
324 static void I2C_ITAddrCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags);
|
|
325 static void I2C_ITMasterSequentialCplt(I2C_HandleTypeDef *hi2c);
|
|
326 static void I2C_ITSlaveSequentialCplt(I2C_HandleTypeDef *hi2c);
|
|
327 static void I2C_ITMasterCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags);
|
|
328 static void I2C_ITSlaveCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags);
|
|
329 static void I2C_ITListenCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags);
|
|
330 static void I2C_ITError(I2C_HandleTypeDef *hi2c, uint32_t ErrorCode);
|
|
331
|
|
332 /* Private functions to handle IT transfer */
|
|
333 static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart);
|
|
334 static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart);
|
|
335
|
|
336 /* Private functions for I2C transfer IRQ handler */
|
|
337 static HAL_StatusTypeDef I2C_Master_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources);
|
|
338 static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources);
|
|
339 static HAL_StatusTypeDef I2C_Master_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources);
|
|
340 static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources);
|
|
341
|
|
342 /* Private functions to handle flags during polling transfer */
|
|
343 static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart);
|
|
344 static HAL_StatusTypeDef I2C_WaitOnTXISFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart);
|
|
345 static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart);
|
|
346 static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart);
|
|
347 static HAL_StatusTypeDef I2C_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart);
|
|
348
|
|
349 /* Private functions to centralize the enable/disable of Interrupts */
|
|
350 static HAL_StatusTypeDef I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest);
|
|
351 static HAL_StatusTypeDef I2C_Disable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest);
|
|
352
|
|
353 /* Private functions to flush TXDR register */
|
|
354 static void I2C_Flush_TXDR(I2C_HandleTypeDef *hi2c);
|
|
355
|
|
356 /* Private functions to handle start, restart or stop a transfer */
|
|
357 static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request);
|
|
358 /**
|
|
359 * @}
|
|
360 */
|
|
361
|
|
362 /* Exported functions --------------------------------------------------------*/
|
|
363
|
|
364 /** @defgroup I2C_Exported_Functions I2C Exported Functions
|
|
365 * @{
|
|
366 */
|
|
367
|
|
368 /** @defgroup I2C_Exported_Functions_Group1 Initialization and de-initialization functions
|
|
369 * @brief Initialization and Configuration functions
|
|
370 *
|
|
371 @verbatim
|
|
372 ===============================================================================
|
|
373 ##### Initialization and de-initialization functions #####
|
|
374 ===============================================================================
|
|
375 [..] This subsection provides a set of functions allowing to initialize and
|
|
376 deinitialize the I2Cx peripheral:
|
|
377
|
|
378 (+) User must Implement HAL_I2C_MspInit() function in which he configures
|
|
379 all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC ).
|
|
380
|
|
381 (+) Call the function HAL_I2C_Init() to configure the selected device with
|
|
382 the selected configuration:
|
|
383 (++) Clock Timing
|
|
384 (++) Own Address 1
|
|
385 (++) Addressing mode (Master, Slave)
|
|
386 (++) Dual Addressing mode
|
|
387 (++) Own Address 2
|
|
388 (++) Own Address 2 Mask
|
|
389 (++) General call mode
|
|
390 (++) Nostretch mode
|
|
391
|
|
392 (+) Call the function HAL_I2C_DeInit() to restore the default configuration
|
|
393 of the selected I2Cx peripheral.
|
|
394
|
|
395 @endverbatim
|
|
396 * @{
|
|
397 */
|
|
398
|
|
399 /**
|
|
400 * @brief Initializes the I2C according to the specified parameters
|
|
401 * in the I2C_InitTypeDef and initialize the associated handle.
|
|
402 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
403 * the configuration information for the specified I2C.
|
|
404 * @retval HAL status
|
|
405 */
|
|
406 HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c)
|
|
407 {
|
|
408 /* Check the I2C handle allocation */
|
|
409 if(hi2c == NULL)
|
|
410 {
|
|
411 return HAL_ERROR;
|
|
412 }
|
|
413
|
|
414 /* Check the parameters */
|
|
415 assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance));
|
|
416 assert_param(IS_I2C_OWN_ADDRESS1(hi2c->Init.OwnAddress1));
|
|
417 assert_param(IS_I2C_ADDRESSING_MODE(hi2c->Init.AddressingMode));
|
|
418 assert_param(IS_I2C_DUAL_ADDRESS(hi2c->Init.DualAddressMode));
|
|
419 assert_param(IS_I2C_OWN_ADDRESS2(hi2c->Init.OwnAddress2));
|
|
420 assert_param(IS_I2C_OWN_ADDRESS2_MASK(hi2c->Init.OwnAddress2Masks));
|
|
421 assert_param(IS_I2C_GENERAL_CALL(hi2c->Init.GeneralCallMode));
|
|
422 assert_param(IS_I2C_NO_STRETCH(hi2c->Init.NoStretchMode));
|
|
423
|
|
424 if(hi2c->State == HAL_I2C_STATE_RESET)
|
|
425 {
|
|
426 /* Allocate lock resource and initialize it */
|
|
427 hi2c->Lock = HAL_UNLOCKED;
|
|
428
|
|
429 /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */
|
|
430 HAL_I2C_MspInit(hi2c);
|
|
431 }
|
|
432
|
|
433 hi2c->State = HAL_I2C_STATE_BUSY;
|
|
434
|
|
435 /* Disable the selected I2C peripheral */
|
|
436 __HAL_I2C_DISABLE(hi2c);
|
|
437
|
|
438 /*---------------------------- I2Cx TIMINGR Configuration ------------------*/
|
|
439 /* Configure I2Cx: Frequency range */
|
|
440 hi2c->Instance->TIMINGR = hi2c->Init.Timing & TIMING_CLEAR_MASK;
|
|
441
|
|
442 /*---------------------------- I2Cx OAR1 Configuration ---------------------*/
|
|
443 /* Disable Own Address1 before set the Own Address1 configuration */
|
|
444 hi2c->Instance->OAR1 &= ~I2C_OAR1_OA1EN;
|
|
445
|
|
446 /* Configure I2Cx: Own Address1 and ack own address1 mode */
|
|
447 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
|
|
448 {
|
|
449 hi2c->Instance->OAR1 = (I2C_OAR1_OA1EN | hi2c->Init.OwnAddress1);
|
|
450 }
|
|
451 else /* I2C_ADDRESSINGMODE_10BIT */
|
|
452 {
|
|
453 hi2c->Instance->OAR1 = (I2C_OAR1_OA1EN | I2C_OAR1_OA1MODE | hi2c->Init.OwnAddress1);
|
|
454 }
|
|
455
|
|
456 /*---------------------------- I2Cx CR2 Configuration ----------------------*/
|
|
457 /* Configure I2Cx: Addressing Master mode */
|
|
458 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT)
|
|
459 {
|
|
460 hi2c->Instance->CR2 = (I2C_CR2_ADD10);
|
|
461 }
|
|
462 /* Enable the AUTOEND by default, and enable NACK (should be disable only during Slave process */
|
|
463 hi2c->Instance->CR2 |= (I2C_CR2_AUTOEND | I2C_CR2_NACK);
|
|
464
|
|
465 /*---------------------------- I2Cx OAR2 Configuration ---------------------*/
|
|
466 /* Disable Own Address2 before set the Own Address2 configuration */
|
|
467 hi2c->Instance->OAR2 &= ~I2C_DUALADDRESS_ENABLE;
|
|
468
|
|
469 /* Configure I2Cx: Dual mode and Own Address2 */
|
|
470 hi2c->Instance->OAR2 = (hi2c->Init.DualAddressMode | hi2c->Init.OwnAddress2 | (hi2c->Init.OwnAddress2Masks << 8));
|
|
471
|
|
472 /*---------------------------- I2Cx CR1 Configuration ----------------------*/
|
|
473 /* Configure I2Cx: Generalcall and NoStretch mode */
|
|
474 hi2c->Instance->CR1 = (hi2c->Init.GeneralCallMode | hi2c->Init.NoStretchMode);
|
|
475
|
|
476 /* Enable the selected I2C peripheral */
|
|
477 __HAL_I2C_ENABLE(hi2c);
|
|
478
|
|
479 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
480 hi2c->State = HAL_I2C_STATE_READY;
|
|
481 hi2c->PreviousState = I2C_STATE_NONE;
|
|
482 hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
483
|
|
484 return HAL_OK;
|
|
485 }
|
|
486
|
|
487 /**
|
|
488 * @brief DeInitialize the I2C peripheral.
|
|
489 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
490 * the configuration information for the specified I2C.
|
|
491 * @retval HAL status
|
|
492 */
|
|
493 HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c)
|
|
494 {
|
|
495 /* Check the I2C handle allocation */
|
|
496 if(hi2c == NULL)
|
|
497 {
|
|
498 return HAL_ERROR;
|
|
499 }
|
|
500
|
|
501 /* Check the parameters */
|
|
502 assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance));
|
|
503
|
|
504 hi2c->State = HAL_I2C_STATE_BUSY;
|
|
505
|
|
506 /* Disable the I2C Peripheral Clock */
|
|
507 __HAL_I2C_DISABLE(hi2c);
|
|
508
|
|
509 /* DeInit the low level hardware: GPIO, CLOCK, NVIC */
|
|
510 HAL_I2C_MspDeInit(hi2c);
|
|
511
|
|
512 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
513 hi2c->State = HAL_I2C_STATE_RESET;
|
|
514 hi2c->PreviousState = I2C_STATE_NONE;
|
|
515 hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
516
|
|
517 /* Release Lock */
|
|
518 __HAL_UNLOCK(hi2c);
|
|
519
|
|
520 return HAL_OK;
|
|
521 }
|
|
522
|
|
523 /**
|
|
524 * @brief Initialize the I2C MSP.
|
|
525 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
526 * the configuration information for the specified I2C.
|
|
527 * @retval None
|
|
528 */
|
|
529 __weak void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c)
|
|
530 {
|
|
531 /* Prevent unused argument(s) compilation warning */
|
|
532 UNUSED(hi2c);
|
|
533
|
|
534 /* NOTE : This function should not be modified, when the callback is needed,
|
|
535 the HAL_I2C_MspInit could be implemented in the user file
|
|
536 */
|
|
537 }
|
|
538
|
|
539 /**
|
|
540 * @brief DeInitialize the I2C MSP.
|
|
541 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
542 * the configuration information for the specified I2C.
|
|
543 * @retval None
|
|
544 */
|
|
545 __weak void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c)
|
|
546 {
|
|
547 /* Prevent unused argument(s) compilation warning */
|
|
548 UNUSED(hi2c);
|
|
549
|
|
550 /* NOTE : This function should not be modified, when the callback is needed,
|
|
551 the HAL_I2C_MspDeInit could be implemented in the user file
|
|
552 */
|
|
553 }
|
|
554
|
|
555 /**
|
|
556 * @}
|
|
557 */
|
|
558
|
|
559 /** @defgroup I2C_Exported_Functions_Group2 Input and Output operation functions
|
|
560 * @brief Data transfers functions
|
|
561 *
|
|
562 @verbatim
|
|
563 ===============================================================================
|
|
564 ##### IO operation functions #####
|
|
565 ===============================================================================
|
|
566 [..]
|
|
567 This subsection provides a set of functions allowing to manage the I2C data
|
|
568 transfers.
|
|
569
|
|
570 (#) There are two modes of transfer:
|
|
571 (++) Blocking mode : The communication is performed in the polling mode.
|
|
572 The status of all data processing is returned by the same function
|
|
573 after finishing transfer.
|
|
574 (++) No-Blocking mode : The communication is performed using Interrupts
|
|
575 or DMA. These functions return the status of the transfer startup.
|
|
576 The end of the data processing will be indicated through the
|
|
577 dedicated I2C IRQ when using Interrupt mode or the DMA IRQ when
|
|
578 using DMA mode.
|
|
579
|
|
580 (#) Blocking mode functions are :
|
|
581 (++) HAL_I2C_Master_Transmit()
|
|
582 (++) HAL_I2C_Master_Receive()
|
|
583 (++) HAL_I2C_Slave_Transmit()
|
|
584 (++) HAL_I2C_Slave_Receive()
|
|
585 (++) HAL_I2C_Mem_Write()
|
|
586 (++) HAL_I2C_Mem_Read()
|
|
587 (++) HAL_I2C_IsDeviceReady()
|
|
588
|
|
589 (#) No-Blocking mode functions with Interrupt are :
|
|
590 (++) HAL_I2C_Master_Transmit_IT()
|
|
591 (++) HAL_I2C_Master_Receive_IT()
|
|
592 (++) HAL_I2C_Slave_Transmit_IT()
|
|
593 (++) HAL_I2C_Slave_Receive_IT()
|
|
594 (++) HAL_I2C_Mem_Write_IT()
|
|
595 (++) HAL_I2C_Mem_Read_IT()
|
|
596
|
|
597 (#) No-Blocking mode functions with DMA are :
|
|
598 (++) HAL_I2C_Master_Transmit_DMA()
|
|
599 (++) HAL_I2C_Master_Receive_DMA()
|
|
600 (++) HAL_I2C_Slave_Transmit_DMA()
|
|
601 (++) HAL_I2C_Slave_Receive_DMA()
|
|
602 (++) HAL_I2C_Mem_Write_DMA()
|
|
603 (++) HAL_I2C_Mem_Read_DMA()
|
|
604
|
|
605 (#) A set of Transfer Complete Callbacks are provided in non Blocking mode:
|
|
606 (++) HAL_I2C_MemTxCpltCallback()
|
|
607 (++) HAL_I2C_MemRxCpltCallback()
|
|
608 (++) HAL_I2C_MasterTxCpltCallback()
|
|
609 (++) HAL_I2C_MasterRxCpltCallback()
|
|
610 (++) HAL_I2C_SlaveTxCpltCallback()
|
|
611 (++) HAL_I2C_SlaveRxCpltCallback()
|
|
612 (++) HAL_I2C_ErrorCallback()
|
|
613
|
|
614 @endverbatim
|
|
615 * @{
|
|
616 */
|
|
617
|
|
618 /**
|
|
619 * @brief Transmits in master mode an amount of data in blocking mode.
|
|
620 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
621 * the configuration information for the specified I2C.
|
|
622 * @param DevAddress Target device address: The device 7 bits address value
|
|
623 * in datasheet must be shift at right before call interface
|
|
624 * @param pData Pointer to data buffer
|
|
625 * @param Size Amount of data to be sent
|
|
626 * @param Timeout Timeout duration
|
|
627 * @retval HAL status
|
|
628 */
|
|
629 HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
|
|
630 {
|
|
631 uint32_t tickstart = 0U;
|
|
632
|
|
633 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
634 {
|
|
635 /* Process Locked */
|
|
636 __HAL_LOCK(hi2c);
|
|
637
|
|
638 /* Init tickstart for timeout management*/
|
|
639 tickstart = HAL_GetTick();
|
|
640
|
|
641 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK)
|
|
642 {
|
|
643 return HAL_TIMEOUT;
|
|
644 }
|
|
645
|
|
646 hi2c->State = HAL_I2C_STATE_BUSY_TX;
|
|
647 hi2c->Mode = HAL_I2C_MODE_MASTER;
|
|
648 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
649
|
|
650 /* Prepare transfer parameters */
|
|
651 hi2c->pBuffPtr = pData;
|
|
652 hi2c->XferCount = Size;
|
|
653 hi2c->XferISR = NULL;
|
|
654
|
|
655 /* Send Slave Address */
|
|
656 /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */
|
|
657 if(hi2c->XferCount > MAX_NBYTE_SIZE)
|
|
658 {
|
|
659 hi2c->XferSize = MAX_NBYTE_SIZE;
|
|
660 I2C_TransferConfig(hi2c, DevAddress, hi2c->XferSize, I2C_RELOAD_MODE, I2C_GENERATE_START_WRITE);
|
|
661 }
|
|
662 else
|
|
663 {
|
|
664 hi2c->XferSize = hi2c->XferCount;
|
|
665 I2C_TransferConfig(hi2c, DevAddress, hi2c->XferSize, I2C_AUTOEND_MODE, I2C_GENERATE_START_WRITE);
|
|
666 }
|
|
667
|
|
668 while(hi2c->XferCount > 0U)
|
|
669 {
|
|
670 /* Wait until TXIS flag is set */
|
|
671 if(I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
|
|
672 {
|
|
673 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
674 {
|
|
675 return HAL_ERROR;
|
|
676 }
|
|
677 else
|
|
678 {
|
|
679 return HAL_TIMEOUT;
|
|
680 }
|
|
681 }
|
|
682 /* Write data to TXDR */
|
|
683 hi2c->Instance->TXDR = (*hi2c->pBuffPtr++);
|
|
684 hi2c->XferCount--;
|
|
685 hi2c->XferSize--;
|
|
686
|
|
687 if((hi2c->XferSize == 0U) && (hi2c->XferCount!=0U))
|
|
688 {
|
|
689 /* Wait until TCR flag is set */
|
|
690 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK)
|
|
691 {
|
|
692 return HAL_TIMEOUT;
|
|
693 }
|
|
694
|
|
695 if(hi2c->XferCount > MAX_NBYTE_SIZE)
|
|
696 {
|
|
697 hi2c->XferSize = MAX_NBYTE_SIZE;
|
|
698 I2C_TransferConfig(hi2c, DevAddress, hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
|
|
699 }
|
|
700 else
|
|
701 {
|
|
702 hi2c->XferSize = hi2c->XferCount;
|
|
703 I2C_TransferConfig(hi2c, DevAddress, hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
|
|
704 }
|
|
705 }
|
|
706 }
|
|
707
|
|
708 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
|
|
709 /* Wait until STOPF flag is set */
|
|
710 if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
|
|
711 {
|
|
712 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
713 {
|
|
714 return HAL_ERROR;
|
|
715 }
|
|
716 else
|
|
717 {
|
|
718 return HAL_TIMEOUT;
|
|
719 }
|
|
720 }
|
|
721
|
|
722 /* Clear STOP Flag */
|
|
723 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
|
|
724
|
|
725 /* Clear Configuration Register 2 */
|
|
726 I2C_RESET_CR2(hi2c);
|
|
727
|
|
728 hi2c->State = HAL_I2C_STATE_READY;
|
|
729 hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
730
|
|
731 /* Process Unlocked */
|
|
732 __HAL_UNLOCK(hi2c);
|
|
733
|
|
734 return HAL_OK;
|
|
735 }
|
|
736 else
|
|
737 {
|
|
738 return HAL_BUSY;
|
|
739 }
|
|
740 }
|
|
741
|
|
742 /**
|
|
743 * @brief Receives in master mode an amount of data in blocking mode.
|
|
744 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
745 * the configuration information for the specified I2C.
|
|
746 * @param DevAddress Target device address: The device 7 bits address value
|
|
747 * in datasheet must be shift at right before call interface
|
|
748 * @param pData Pointer to data buffer
|
|
749 * @param Size Amount of data to be sent
|
|
750 * @param Timeout Timeout duration
|
|
751 * @retval HAL status
|
|
752 */
|
|
753 HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
|
|
754 {
|
|
755 uint32_t tickstart = 0U;
|
|
756
|
|
757 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
758 {
|
|
759 /* Process Locked */
|
|
760 __HAL_LOCK(hi2c);
|
|
761
|
|
762 /* Init tickstart for timeout management*/
|
|
763 tickstart = HAL_GetTick();
|
|
764
|
|
765 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK)
|
|
766 {
|
|
767 return HAL_TIMEOUT;
|
|
768 }
|
|
769
|
|
770 hi2c->State = HAL_I2C_STATE_BUSY_RX;
|
|
771 hi2c->Mode = HAL_I2C_MODE_MASTER;
|
|
772 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
773
|
|
774 /* Prepare transfer parameters */
|
|
775 hi2c->pBuffPtr = pData;
|
|
776 hi2c->XferCount = Size;
|
|
777 hi2c->XferISR = NULL;
|
|
778
|
|
779 /* Send Slave Address */
|
|
780 /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */
|
|
781 if(hi2c->XferCount > MAX_NBYTE_SIZE)
|
|
782 {
|
|
783 hi2c->XferSize = MAX_NBYTE_SIZE;
|
|
784 I2C_TransferConfig(hi2c, DevAddress, hi2c->XferSize, I2C_RELOAD_MODE, I2C_GENERATE_START_READ);
|
|
785 }
|
|
786 else
|
|
787 {
|
|
788 hi2c->XferSize = hi2c->XferCount;
|
|
789 I2C_TransferConfig(hi2c, DevAddress, hi2c->XferSize, I2C_AUTOEND_MODE, I2C_GENERATE_START_READ);
|
|
790 }
|
|
791
|
|
792 while(hi2c->XferCount > 0U)
|
|
793 {
|
|
794 /* Wait until RXNE flag is set */
|
|
795 if(I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
|
|
796 {
|
|
797 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
798 {
|
|
799 return HAL_ERROR;
|
|
800 }
|
|
801 else
|
|
802 {
|
|
803 return HAL_TIMEOUT;
|
|
804 }
|
|
805 }
|
|
806
|
|
807 /* Read data from RXDR */
|
|
808 (*hi2c->pBuffPtr++) = hi2c->Instance->RXDR;
|
|
809 hi2c->XferSize--;
|
|
810 hi2c->XferCount--;
|
|
811
|
|
812 if((hi2c->XferSize == 0U) && (hi2c->XferCount != 0U))
|
|
813 {
|
|
814 /* Wait until TCR flag is set */
|
|
815 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK)
|
|
816 {
|
|
817 return HAL_TIMEOUT;
|
|
818 }
|
|
819
|
|
820 if(hi2c->XferCount > MAX_NBYTE_SIZE)
|
|
821 {
|
|
822 hi2c->XferSize = MAX_NBYTE_SIZE;
|
|
823 I2C_TransferConfig(hi2c, DevAddress, hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
|
|
824 }
|
|
825 else
|
|
826 {
|
|
827 hi2c->XferSize = hi2c->XferCount;
|
|
828 I2C_TransferConfig(hi2c, DevAddress, hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
|
|
829 }
|
|
830 }
|
|
831 }
|
|
832
|
|
833 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
|
|
834 /* Wait until STOPF flag is set */
|
|
835 if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
|
|
836 {
|
|
837 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
838 {
|
|
839 return HAL_ERROR;
|
|
840 }
|
|
841 else
|
|
842 {
|
|
843 return HAL_TIMEOUT;
|
|
844 }
|
|
845 }
|
|
846
|
|
847 /* Clear STOP Flag */
|
|
848 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
|
|
849
|
|
850 /* Clear Configuration Register 2 */
|
|
851 I2C_RESET_CR2(hi2c);
|
|
852
|
|
853 hi2c->State = HAL_I2C_STATE_READY;
|
|
854 hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
855
|
|
856 /* Process Unlocked */
|
|
857 __HAL_UNLOCK(hi2c);
|
|
858
|
|
859 return HAL_OK;
|
|
860 }
|
|
861 else
|
|
862 {
|
|
863 return HAL_BUSY;
|
|
864 }
|
|
865 }
|
|
866
|
|
867 /**
|
|
868 * @brief Transmits in slave mode an amount of data in blocking mode.
|
|
869 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
870 * the configuration information for the specified I2C.
|
|
871 * @param pData Pointer to data buffer
|
|
872 * @param Size Amount of data to be sent
|
|
873 * @param Timeout Timeout duration
|
|
874 * @retval HAL status
|
|
875 */
|
|
876 HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout)
|
|
877 {
|
|
878 uint32_t tickstart = 0U;
|
|
879
|
|
880 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
881 {
|
|
882 if((pData == NULL) || (Size == 0U))
|
|
883 {
|
|
884 return HAL_ERROR;
|
|
885 }
|
|
886 /* Process Locked */
|
|
887 __HAL_LOCK(hi2c);
|
|
888
|
|
889 /* Init tickstart for timeout management*/
|
|
890 tickstart = HAL_GetTick();
|
|
891
|
|
892 hi2c->State = HAL_I2C_STATE_BUSY_TX;
|
|
893 hi2c->Mode = HAL_I2C_MODE_SLAVE;
|
|
894 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
895
|
|
896 /* Prepare transfer parameters */
|
|
897 hi2c->pBuffPtr = pData;
|
|
898 hi2c->XferCount = Size;
|
|
899 hi2c->XferISR = NULL;
|
|
900
|
|
901 /* Enable Address Acknowledge */
|
|
902 hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
|
|
903
|
|
904 /* Wait until ADDR flag is set */
|
|
905 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK)
|
|
906 {
|
|
907 /* Disable Address Acknowledge */
|
|
908 hi2c->Instance->CR2 |= I2C_CR2_NACK;
|
|
909 return HAL_TIMEOUT;
|
|
910 }
|
|
911
|
|
912 /* Clear ADDR flag */
|
|
913 __HAL_I2C_CLEAR_FLAG(hi2c,I2C_FLAG_ADDR);
|
|
914
|
|
915 /* If 10bit addressing mode is selected */
|
|
916 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT)
|
|
917 {
|
|
918 /* Wait until ADDR flag is set */
|
|
919 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK)
|
|
920 {
|
|
921 /* Disable Address Acknowledge */
|
|
922 hi2c->Instance->CR2 |= I2C_CR2_NACK;
|
|
923 return HAL_TIMEOUT;
|
|
924 }
|
|
925
|
|
926 /* Clear ADDR flag */
|
|
927 __HAL_I2C_CLEAR_FLAG(hi2c,I2C_FLAG_ADDR);
|
|
928 }
|
|
929
|
|
930 /* Wait until DIR flag is set Transmitter mode */
|
|
931 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_DIR, RESET, Timeout, tickstart) != HAL_OK)
|
|
932 {
|
|
933 /* Disable Address Acknowledge */
|
|
934 hi2c->Instance->CR2 |= I2C_CR2_NACK;
|
|
935 return HAL_TIMEOUT;
|
|
936 }
|
|
937
|
|
938 while(hi2c->XferCount > 0U)
|
|
939 {
|
|
940 /* Wait until TXIS flag is set */
|
|
941 if(I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
|
|
942 {
|
|
943 /* Disable Address Acknowledge */
|
|
944 hi2c->Instance->CR2 |= I2C_CR2_NACK;
|
|
945
|
|
946 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
947 {
|
|
948 return HAL_ERROR;
|
|
949 }
|
|
950 else
|
|
951 {
|
|
952 return HAL_TIMEOUT;
|
|
953 }
|
|
954 }
|
|
955
|
|
956 /* Write data to TXDR */
|
|
957 hi2c->Instance->TXDR = (*hi2c->pBuffPtr++);
|
|
958 hi2c->XferCount--;
|
|
959 }
|
|
960
|
|
961 /* Wait until STOP flag is set */
|
|
962 if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
|
|
963 {
|
|
964 /* Disable Address Acknowledge */
|
|
965 hi2c->Instance->CR2 |= I2C_CR2_NACK;
|
|
966
|
|
967 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
968 {
|
|
969 /* Normal use case for Transmitter mode */
|
|
970 /* A NACK is generated to confirm the end of transfer */
|
|
971 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
972 }
|
|
973 else
|
|
974 {
|
|
975 return HAL_TIMEOUT;
|
|
976 }
|
|
977 }
|
|
978
|
|
979 /* Clear STOP flag */
|
|
980 __HAL_I2C_CLEAR_FLAG(hi2c,I2C_FLAG_STOPF);
|
|
981
|
|
982 /* Wait until BUSY flag is reset */
|
|
983 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout, tickstart) != HAL_OK)
|
|
984 {
|
|
985 /* Disable Address Acknowledge */
|
|
986 hi2c->Instance->CR2 |= I2C_CR2_NACK;
|
|
987 return HAL_TIMEOUT;
|
|
988 }
|
|
989
|
|
990 /* Disable Address Acknowledge */
|
|
991 hi2c->Instance->CR2 |= I2C_CR2_NACK;
|
|
992
|
|
993 hi2c->State = HAL_I2C_STATE_READY;
|
|
994 hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
995
|
|
996 /* Process Unlocked */
|
|
997 __HAL_UNLOCK(hi2c);
|
|
998
|
|
999 return HAL_OK;
|
|
1000 }
|
|
1001 else
|
|
1002 {
|
|
1003 return HAL_BUSY;
|
|
1004 }
|
|
1005 }
|
|
1006
|
|
1007 /**
|
|
1008 * @brief Receive in slave mode an amount of data in blocking mode
|
|
1009 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
1010 * the configuration information for the specified I2C.
|
|
1011 * @param pData Pointer to data buffer
|
|
1012 * @param Size Amount of data to be sent
|
|
1013 * @param Timeout Timeout duration
|
|
1014 * @retval HAL status
|
|
1015 */
|
|
1016 HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout)
|
|
1017 {
|
|
1018 uint32_t tickstart = 0U;
|
|
1019
|
|
1020 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
1021 {
|
|
1022 if((pData == NULL) || (Size == 0U))
|
|
1023 {
|
|
1024 return HAL_ERROR;
|
|
1025 }
|
|
1026 /* Process Locked */
|
|
1027 __HAL_LOCK(hi2c);
|
|
1028
|
|
1029 /* Init tickstart for timeout management*/
|
|
1030 tickstart = HAL_GetTick();
|
|
1031
|
|
1032 hi2c->State = HAL_I2C_STATE_BUSY_RX;
|
|
1033 hi2c->Mode = HAL_I2C_MODE_SLAVE;
|
|
1034 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
1035
|
|
1036 /* Prepare transfer parameters */
|
|
1037 hi2c->pBuffPtr = pData;
|
|
1038 hi2c->XferCount = Size;
|
|
1039 hi2c->XferISR = NULL;
|
|
1040
|
|
1041 /* Enable Address Acknowledge */
|
|
1042 hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
|
|
1043
|
|
1044 /* Wait until ADDR flag is set */
|
|
1045 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK)
|
|
1046 {
|
|
1047 /* Disable Address Acknowledge */
|
|
1048 hi2c->Instance->CR2 |= I2C_CR2_NACK;
|
|
1049 return HAL_TIMEOUT;
|
|
1050 }
|
|
1051
|
|
1052 /* Clear ADDR flag */
|
|
1053 __HAL_I2C_CLEAR_FLAG(hi2c,I2C_FLAG_ADDR);
|
|
1054
|
|
1055 /* Wait until DIR flag is reset Receiver mode */
|
|
1056 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_DIR, SET, Timeout, tickstart) != HAL_OK)
|
|
1057 {
|
|
1058 /* Disable Address Acknowledge */
|
|
1059 hi2c->Instance->CR2 |= I2C_CR2_NACK;
|
|
1060 return HAL_TIMEOUT;
|
|
1061 }
|
|
1062
|
|
1063 while(hi2c->XferCount > 0U)
|
|
1064 {
|
|
1065 /* Wait until RXNE flag is set */
|
|
1066 if(I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
|
|
1067 {
|
|
1068 /* Disable Address Acknowledge */
|
|
1069 hi2c->Instance->CR2 |= I2C_CR2_NACK;
|
|
1070
|
|
1071 /* Store Last receive data if any */
|
|
1072 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET)
|
|
1073 {
|
|
1074 /* Read data from RXDR */
|
|
1075 (*hi2c->pBuffPtr++) = hi2c->Instance->RXDR;
|
|
1076 hi2c->XferCount--;
|
|
1077 }
|
|
1078
|
|
1079 if(hi2c->ErrorCode == HAL_I2C_ERROR_TIMEOUT)
|
|
1080 {
|
|
1081 return HAL_TIMEOUT;
|
|
1082 }
|
|
1083 else
|
|
1084 {
|
|
1085 return HAL_ERROR;
|
|
1086 }
|
|
1087 }
|
|
1088
|
|
1089 /* Read data from RXDR */
|
|
1090 (*hi2c->pBuffPtr++) = hi2c->Instance->RXDR;
|
|
1091 hi2c->XferCount--;
|
|
1092 }
|
|
1093
|
|
1094 /* Wait until STOP flag is set */
|
|
1095 if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
|
|
1096 {
|
|
1097 /* Disable Address Acknowledge */
|
|
1098 hi2c->Instance->CR2 |= I2C_CR2_NACK;
|
|
1099
|
|
1100 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
1101 {
|
|
1102 return HAL_ERROR;
|
|
1103 }
|
|
1104 else
|
|
1105 {
|
|
1106 return HAL_TIMEOUT;
|
|
1107 }
|
|
1108 }
|
|
1109
|
|
1110 /* Clear STOP flag */
|
|
1111 __HAL_I2C_CLEAR_FLAG(hi2c,I2C_FLAG_STOPF);
|
|
1112
|
|
1113 /* Wait until BUSY flag is reset */
|
|
1114 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout, tickstart) != HAL_OK)
|
|
1115 {
|
|
1116 /* Disable Address Acknowledge */
|
|
1117 hi2c->Instance->CR2 |= I2C_CR2_NACK;
|
|
1118 return HAL_TIMEOUT;
|
|
1119 }
|
|
1120
|
|
1121 /* Disable Address Acknowledge */
|
|
1122 hi2c->Instance->CR2 |= I2C_CR2_NACK;
|
|
1123
|
|
1124 hi2c->State = HAL_I2C_STATE_READY;
|
|
1125 hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
1126
|
|
1127 /* Process Unlocked */
|
|
1128 __HAL_UNLOCK(hi2c);
|
|
1129
|
|
1130 return HAL_OK;
|
|
1131 }
|
|
1132 else
|
|
1133 {
|
|
1134 return HAL_BUSY;
|
|
1135 }
|
|
1136 }
|
|
1137
|
|
1138 /**
|
|
1139 * @brief Transmit in master mode an amount of data in non-blocking mode with Interrupt
|
|
1140 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
1141 * the configuration information for the specified I2C.
|
|
1142 * @param DevAddress Target device address: The device 7 bits address value
|
|
1143 * in datasheet must be shift at right before call interface
|
|
1144 * @param pData Pointer to data buffer
|
|
1145 * @param Size Amount of data to be sent
|
|
1146 * @retval HAL status
|
|
1147 */
|
|
1148 HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
|
|
1149 {
|
|
1150 uint32_t xfermode = 0U;
|
|
1151
|
|
1152 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
1153 {
|
|
1154 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
1155 {
|
|
1156 return HAL_BUSY;
|
|
1157 }
|
|
1158
|
|
1159 /* Process Locked */
|
|
1160 __HAL_LOCK(hi2c);
|
|
1161
|
|
1162 hi2c->State = HAL_I2C_STATE_BUSY_TX;
|
|
1163 hi2c->Mode = HAL_I2C_MODE_MASTER;
|
|
1164 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
1165
|
|
1166 /* Prepare transfer parameters */
|
|
1167 hi2c->pBuffPtr = pData;
|
|
1168 hi2c->XferCount = Size;
|
|
1169 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
|
|
1170 hi2c->XferISR = I2C_Master_ISR_IT;
|
|
1171
|
|
1172 if(hi2c->XferCount > MAX_NBYTE_SIZE)
|
|
1173 {
|
|
1174 hi2c->XferSize = MAX_NBYTE_SIZE;
|
|
1175 xfermode = I2C_RELOAD_MODE;
|
|
1176 }
|
|
1177 else
|
|
1178 {
|
|
1179 hi2c->XferSize = hi2c->XferCount;
|
|
1180 xfermode = I2C_AUTOEND_MODE;
|
|
1181 }
|
|
1182
|
|
1183 /* Send Slave Address */
|
|
1184 /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE */
|
|
1185 I2C_TransferConfig(hi2c, DevAddress, hi2c->XferSize, xfermode, I2C_GENERATE_START_WRITE);
|
|
1186
|
|
1187 /* Process Unlocked */
|
|
1188 __HAL_UNLOCK(hi2c);
|
|
1189
|
|
1190 /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
1191 to avoid the risk of I2C interrupt handle execution before current
|
|
1192 process unlock */
|
|
1193
|
|
1194 /* Enable ERR, TC, STOP, NACK, TXI interrupt */
|
|
1195 /* possible to enable all of these */
|
|
1196 /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */
|
|
1197 I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);
|
|
1198
|
|
1199 return HAL_OK;
|
|
1200 }
|
|
1201 else
|
|
1202 {
|
|
1203 return HAL_BUSY;
|
|
1204 }
|
|
1205 }
|
|
1206
|
|
1207 /**
|
|
1208 * @brief Receive in master mode an amount of data in non-blocking mode with Interrupt
|
|
1209 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
1210 * the configuration information for the specified I2C.
|
|
1211 * @param DevAddress Target device address: The device 7 bits address value
|
|
1212 * in datasheet must be shift at right before call interface
|
|
1213 * @param pData Pointer to data buffer
|
|
1214 * @param Size Amount of data to be sent
|
|
1215 * @retval HAL status
|
|
1216 */
|
|
1217 HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
|
|
1218 {
|
|
1219 uint32_t xfermode = 0U;
|
|
1220
|
|
1221 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
1222 {
|
|
1223 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
1224 {
|
|
1225 return HAL_BUSY;
|
|
1226 }
|
|
1227
|
|
1228 /* Process Locked */
|
|
1229 __HAL_LOCK(hi2c);
|
|
1230
|
|
1231 hi2c->State = HAL_I2C_STATE_BUSY_RX;
|
|
1232 hi2c->Mode = HAL_I2C_MODE_MASTER;
|
|
1233 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
1234
|
|
1235 /* Prepare transfer parameters */
|
|
1236 hi2c->pBuffPtr = pData;
|
|
1237 hi2c->XferCount = Size;
|
|
1238 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
|
|
1239 hi2c->XferISR = I2C_Master_ISR_IT;
|
|
1240
|
|
1241 if(hi2c->XferCount > MAX_NBYTE_SIZE)
|
|
1242 {
|
|
1243 hi2c->XferSize = MAX_NBYTE_SIZE;
|
|
1244 xfermode = I2C_RELOAD_MODE;
|
|
1245 }
|
|
1246 else
|
|
1247 {
|
|
1248 hi2c->XferSize = hi2c->XferCount;
|
|
1249 xfermode = I2C_AUTOEND_MODE;
|
|
1250 }
|
|
1251
|
|
1252 /* Send Slave Address */
|
|
1253 /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE */
|
|
1254 I2C_TransferConfig(hi2c, DevAddress, hi2c->XferSize, xfermode, I2C_GENERATE_START_READ);
|
|
1255
|
|
1256 /* Process Unlocked */
|
|
1257 __HAL_UNLOCK(hi2c);
|
|
1258
|
|
1259 /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
1260 to avoid the risk of I2C interrupt handle execution before current
|
|
1261 process unlock */
|
|
1262
|
|
1263 /* Enable ERR, TC, STOP, NACK, RXI interrupt */
|
|
1264 /* possible to enable all of these */
|
|
1265 /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */
|
|
1266 I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT);
|
|
1267
|
|
1268 return HAL_OK;
|
|
1269 }
|
|
1270 else
|
|
1271 {
|
|
1272 return HAL_BUSY;
|
|
1273 }
|
|
1274 }
|
|
1275
|
|
1276 /**
|
|
1277 * @brief Transmit in slave mode an amount of data in non-blocking mode with Interrupt
|
|
1278 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
1279 * the configuration information for the specified I2C.
|
|
1280 * @param pData Pointer to data buffer
|
|
1281 * @param Size Amount of data to be sent
|
|
1282 * @retval HAL status
|
|
1283 */
|
|
1284 HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
|
|
1285 {
|
|
1286 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
1287 {
|
|
1288 /* Process Locked */
|
|
1289 __HAL_LOCK(hi2c);
|
|
1290
|
|
1291 hi2c->State = HAL_I2C_STATE_BUSY_TX;
|
|
1292 hi2c->Mode = HAL_I2C_MODE_SLAVE;
|
|
1293 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
1294
|
|
1295 /* Enable Address Acknowledge */
|
|
1296 hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
|
|
1297
|
|
1298 /* Prepare transfer parameters */
|
|
1299 hi2c->pBuffPtr = pData;
|
|
1300 hi2c->XferCount = Size;
|
|
1301 hi2c->XferSize = hi2c->XferCount;
|
|
1302 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
|
|
1303 hi2c->XferISR = I2C_Slave_ISR_IT;
|
|
1304
|
|
1305 /* Process Unlocked */
|
|
1306 __HAL_UNLOCK(hi2c);
|
|
1307
|
|
1308 /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
1309 to avoid the risk of I2C interrupt handle execution before current
|
|
1310 process unlock */
|
|
1311
|
|
1312 /* Enable ERR, TC, STOP, NACK, TXI interrupt */
|
|
1313 /* possible to enable all of these */
|
|
1314 /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */
|
|
1315 I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT | I2C_XFER_LISTEN_IT);
|
|
1316
|
|
1317 return HAL_OK;
|
|
1318 }
|
|
1319 else
|
|
1320 {
|
|
1321 return HAL_BUSY;
|
|
1322 }
|
|
1323 }
|
|
1324
|
|
1325 /**
|
|
1326 * @brief Receive in slave mode an amount of data in non-blocking mode with Interrupt
|
|
1327 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
1328 * the configuration information for the specified I2C.
|
|
1329 * @param pData Pointer to data buffer
|
|
1330 * @param Size Amount of data to be sent
|
|
1331 * @retval HAL status
|
|
1332 */
|
|
1333 HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
|
|
1334 {
|
|
1335 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
1336 {
|
|
1337 /* Process Locked */
|
|
1338 __HAL_LOCK(hi2c);
|
|
1339
|
|
1340 hi2c->State = HAL_I2C_STATE_BUSY_RX;
|
|
1341 hi2c->Mode = HAL_I2C_MODE_SLAVE;
|
|
1342 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
1343
|
|
1344 /* Enable Address Acknowledge */
|
|
1345 hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
|
|
1346
|
|
1347 /* Prepare transfer parameters */
|
|
1348 hi2c->pBuffPtr = pData;
|
|
1349 hi2c->XferCount = Size;
|
|
1350 hi2c->XferSize = hi2c->XferCount;
|
|
1351 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
|
|
1352 hi2c->XferISR = I2C_Slave_ISR_IT;
|
|
1353
|
|
1354 /* Process Unlocked */
|
|
1355 __HAL_UNLOCK(hi2c);
|
|
1356
|
|
1357 /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
1358 to avoid the risk of I2C interrupt handle execution before current
|
|
1359 process unlock */
|
|
1360
|
|
1361 /* Enable ERR, TC, STOP, NACK, RXI interrupt */
|
|
1362 /* possible to enable all of these */
|
|
1363 /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */
|
|
1364 I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT | I2C_XFER_LISTEN_IT);
|
|
1365
|
|
1366 return HAL_OK;
|
|
1367 }
|
|
1368 else
|
|
1369 {
|
|
1370 return HAL_BUSY;
|
|
1371 }
|
|
1372 }
|
|
1373
|
|
1374 /**
|
|
1375 * @brief Transmit in master mode an amount of data in non-blocking mode with DMA
|
|
1376 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
1377 * the configuration information for the specified I2C.
|
|
1378 * @param DevAddress Target device address: The device 7 bits address value
|
|
1379 * in datasheet must be shift at right before call interface
|
|
1380 * @param pData Pointer to data buffer
|
|
1381 * @param Size Amount of data to be sent
|
|
1382 * @retval HAL status
|
|
1383 */
|
|
1384 HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
|
|
1385 {
|
|
1386 uint32_t xfermode = 0U;
|
|
1387
|
|
1388 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
1389 {
|
|
1390 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
1391 {
|
|
1392 return HAL_BUSY;
|
|
1393 }
|
|
1394
|
|
1395 /* Process Locked */
|
|
1396 __HAL_LOCK(hi2c);
|
|
1397
|
|
1398 hi2c->State = HAL_I2C_STATE_BUSY_TX;
|
|
1399 hi2c->Mode = HAL_I2C_MODE_MASTER;
|
|
1400 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
1401
|
|
1402 /* Prepare transfer parameters */
|
|
1403 hi2c->pBuffPtr = pData;
|
|
1404 hi2c->XferCount = Size;
|
|
1405 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
|
|
1406 hi2c->XferISR = I2C_Master_ISR_DMA;
|
|
1407
|
|
1408 if(hi2c->XferCount > MAX_NBYTE_SIZE)
|
|
1409 {
|
|
1410 hi2c->XferSize = MAX_NBYTE_SIZE;
|
|
1411 xfermode = I2C_RELOAD_MODE;
|
|
1412 }
|
|
1413 else
|
|
1414 {
|
|
1415 hi2c->XferSize = hi2c->XferCount;
|
|
1416 xfermode = I2C_AUTOEND_MODE;
|
|
1417 }
|
|
1418
|
|
1419 if(hi2c->XferSize > 0U)
|
|
1420 {
|
|
1421 /* Set the I2C DMA transfer complete callback */
|
|
1422 hi2c->hdmatx->XferCpltCallback = I2C_DMAMasterTransmitCplt;
|
|
1423
|
|
1424 /* Set the DMA error callback */
|
|
1425 hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
|
|
1426
|
|
1427 /* Set the unused DMA callbacks to NULL */
|
|
1428 hi2c->hdmatx->XferHalfCpltCallback = NULL;
|
|
1429 hi2c->hdmatx->XferAbortCallback = NULL;
|
|
1430
|
|
1431 /* Enable the DMA channel */
|
|
1432 HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->TXDR, hi2c->XferSize);
|
|
1433
|
|
1434 /* Send Slave Address */
|
|
1435 /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */
|
|
1436 I2C_TransferConfig(hi2c, DevAddress, hi2c->XferSize, xfermode, I2C_GENERATE_START_WRITE);
|
|
1437
|
|
1438 /* Update XferCount value */
|
|
1439 hi2c->XferCount -= hi2c->XferSize;
|
|
1440
|
|
1441 /* Process Unlocked */
|
|
1442 __HAL_UNLOCK(hi2c);
|
|
1443
|
|
1444 /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
1445 to avoid the risk of I2C interrupt handle execution before current
|
|
1446 process unlock */
|
|
1447 /* Enable ERR and NACK interrupts */
|
|
1448 I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT);
|
|
1449
|
|
1450 /* Enable DMA Request */
|
|
1451 hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;
|
|
1452 }
|
|
1453 else
|
|
1454 {
|
|
1455 /* Update Transfer ISR function pointer */
|
|
1456 hi2c->XferISR = I2C_Master_ISR_IT;
|
|
1457
|
|
1458 /* Send Slave Address */
|
|
1459 /* Set NBYTES to write and generate START condition */
|
|
1460 I2C_TransferConfig(hi2c, DevAddress, hi2c->XferSize, I2C_AUTOEND_MODE, I2C_GENERATE_START_WRITE);
|
|
1461
|
|
1462 /* Process Unlocked */
|
|
1463 __HAL_UNLOCK(hi2c);
|
|
1464
|
|
1465 /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
1466 to avoid the risk of I2C interrupt handle execution before current
|
|
1467 process unlock */
|
|
1468 /* Enable ERR, TC, STOP, NACK, TXI interrupt */
|
|
1469 /* possible to enable all of these */
|
|
1470 /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */
|
|
1471 I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);
|
|
1472 }
|
|
1473
|
|
1474 return HAL_OK;
|
|
1475 }
|
|
1476 else
|
|
1477 {
|
|
1478 return HAL_BUSY;
|
|
1479 }
|
|
1480 }
|
|
1481
|
|
1482 /**
|
|
1483 * @brief Receive in master mode an amount of data in non-blocking mode with DMA
|
|
1484 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
1485 * the configuration information for the specified I2C.
|
|
1486 * @param DevAddress Target device address: The device 7 bits address value
|
|
1487 * in datasheet must be shift at right before call interface
|
|
1488 * @param pData Pointer to data buffer
|
|
1489 * @param Size Amount of data to be sent
|
|
1490 * @retval HAL status
|
|
1491 */
|
|
1492 HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
|
|
1493 {
|
|
1494 uint32_t xfermode = 0U;
|
|
1495
|
|
1496 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
1497 {
|
|
1498 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
1499 {
|
|
1500 return HAL_BUSY;
|
|
1501 }
|
|
1502
|
|
1503 /* Process Locked */
|
|
1504 __HAL_LOCK(hi2c);
|
|
1505
|
|
1506 hi2c->State = HAL_I2C_STATE_BUSY_RX;
|
|
1507 hi2c->Mode = HAL_I2C_MODE_MASTER;
|
|
1508 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
1509
|
|
1510 /* Prepare transfer parameters */
|
|
1511 hi2c->pBuffPtr = pData;
|
|
1512 hi2c->XferCount = Size;
|
|
1513 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
|
|
1514 hi2c->XferISR = I2C_Master_ISR_DMA;
|
|
1515
|
|
1516 if(hi2c->XferCount > MAX_NBYTE_SIZE)
|
|
1517 {
|
|
1518 hi2c->XferSize = MAX_NBYTE_SIZE;
|
|
1519 xfermode = I2C_RELOAD_MODE;
|
|
1520 }
|
|
1521 else
|
|
1522 {
|
|
1523 hi2c->XferSize = hi2c->XferCount;
|
|
1524 xfermode = I2C_AUTOEND_MODE;
|
|
1525 }
|
|
1526
|
|
1527 if(hi2c->XferSize > 0U)
|
|
1528 {
|
|
1529 /* Set the I2C DMA transfer complete callback */
|
|
1530 hi2c->hdmarx->XferCpltCallback = I2C_DMAMasterReceiveCplt;
|
|
1531
|
|
1532 /* Set the DMA error callback */
|
|
1533 hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
|
|
1534
|
|
1535 /* Set the unused DMA callbacks to NULL */
|
|
1536 hi2c->hdmarx->XferHalfCpltCallback = NULL;
|
|
1537 hi2c->hdmarx->XferAbortCallback = NULL;
|
|
1538
|
|
1539 /* Enable the DMA channel */
|
|
1540 HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)pData, hi2c->XferSize);
|
|
1541
|
|
1542 /* Send Slave Address */
|
|
1543 /* Set NBYTES to read and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */
|
|
1544 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferSize, xfermode, I2C_GENERATE_START_READ);
|
|
1545
|
|
1546 /* Update XferCount value */
|
|
1547 hi2c->XferCount -= hi2c->XferSize;
|
|
1548
|
|
1549 /* Process Unlocked */
|
|
1550 __HAL_UNLOCK(hi2c);
|
|
1551
|
|
1552 /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
1553 to avoid the risk of I2C interrupt handle execution before current
|
|
1554 process unlock */
|
|
1555 /* Enable ERR and NACK interrupts */
|
|
1556 I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT);
|
|
1557
|
|
1558 /* Enable DMA Request */
|
|
1559 hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN;
|
|
1560 }
|
|
1561 else
|
|
1562 {
|
|
1563 /* Update Transfer ISR function pointer */
|
|
1564 hi2c->XferISR = I2C_Master_ISR_IT;
|
|
1565
|
|
1566 /* Send Slave Address */
|
|
1567 /* Set NBYTES to read and generate START condition */
|
|
1568 I2C_TransferConfig(hi2c, DevAddress, hi2c->XferSize, I2C_AUTOEND_MODE, I2C_GENERATE_START_READ);
|
|
1569
|
|
1570 /* Process Unlocked */
|
|
1571 __HAL_UNLOCK(hi2c);
|
|
1572
|
|
1573 /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
1574 to avoid the risk of I2C interrupt handle execution before current
|
|
1575 process unlock */
|
|
1576 /* Enable ERR, TC, STOP, NACK, TXI interrupt */
|
|
1577 /* possible to enable all of these */
|
|
1578 /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */
|
|
1579 I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);
|
|
1580 }
|
|
1581 return HAL_OK;
|
|
1582 }
|
|
1583 else
|
|
1584 {
|
|
1585 return HAL_BUSY;
|
|
1586 }
|
|
1587 }
|
|
1588
|
|
1589 /**
|
|
1590 * @brief Transmit in slave mode an amount of data in non-blocking mode with DMA
|
|
1591 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
1592 * the configuration information for the specified I2C.
|
|
1593 * @param pData Pointer to data buffer
|
|
1594 * @param Size Amount of data to be sent
|
|
1595 * @retval HAL status
|
|
1596 */
|
|
1597 HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
|
|
1598 {
|
|
1599 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
1600 {
|
|
1601 if((pData == NULL) || (Size == 0U))
|
|
1602 {
|
|
1603 return HAL_ERROR;
|
|
1604 }
|
|
1605 /* Process Locked */
|
|
1606 __HAL_LOCK(hi2c);
|
|
1607
|
|
1608 hi2c->State = HAL_I2C_STATE_BUSY_TX;
|
|
1609 hi2c->Mode = HAL_I2C_MODE_SLAVE;
|
|
1610 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
1611
|
|
1612 /* Prepare transfer parameters */
|
|
1613 hi2c->pBuffPtr = pData;
|
|
1614 hi2c->XferCount = Size;
|
|
1615 hi2c->XferSize = hi2c->XferCount;
|
|
1616 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
|
|
1617 hi2c->XferISR = I2C_Slave_ISR_DMA;
|
|
1618
|
|
1619 /* Set the I2C DMA transfer complete callback */
|
|
1620 hi2c->hdmatx->XferCpltCallback = I2C_DMASlaveTransmitCplt;
|
|
1621
|
|
1622 /* Set the DMA error callback */
|
|
1623 hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
|
|
1624
|
|
1625 /* Set the unused DMA callbacks to NULL */
|
|
1626 hi2c->hdmatx->XferHalfCpltCallback = NULL;
|
|
1627 hi2c->hdmatx->XferAbortCallback = NULL;
|
|
1628
|
|
1629 /* Enable the DMA channel */
|
|
1630 HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->TXDR, hi2c->XferSize);
|
|
1631
|
|
1632 /* Enable Address Acknowledge */
|
|
1633 hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
|
|
1634
|
|
1635 /* Process Unlocked */
|
|
1636 __HAL_UNLOCK(hi2c);
|
|
1637
|
|
1638 /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
1639 to avoid the risk of I2C interrupt handle execution before current
|
|
1640 process unlock */
|
|
1641 /* Enable ERR, STOP, NACK, ADDR interrupts */
|
|
1642 I2C_Enable_IRQ(hi2c, I2C_XFER_LISTEN_IT);
|
|
1643
|
|
1644 /* Enable DMA Request */
|
|
1645 hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;
|
|
1646
|
|
1647 return HAL_OK;
|
|
1648 }
|
|
1649 else
|
|
1650 {
|
|
1651 return HAL_BUSY;
|
|
1652 }
|
|
1653 }
|
|
1654
|
|
1655 /**
|
|
1656 * @brief Receive in slave mode an amount of data in non-blocking mode with DMA
|
|
1657 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
1658 * the configuration information for the specified I2C.
|
|
1659 * @param pData Pointer to data buffer
|
|
1660 * @param Size Amount of data to be sent
|
|
1661 * @retval HAL status
|
|
1662 */
|
|
1663 HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
|
|
1664 {
|
|
1665 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
1666 {
|
|
1667 if((pData == NULL) || (Size == 0U))
|
|
1668 {
|
|
1669 return HAL_ERROR;
|
|
1670 }
|
|
1671 /* Process Locked */
|
|
1672 __HAL_LOCK(hi2c);
|
|
1673
|
|
1674 hi2c->State = HAL_I2C_STATE_BUSY_RX;
|
|
1675 hi2c->Mode = HAL_I2C_MODE_SLAVE;
|
|
1676 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
1677
|
|
1678 /* Prepare transfer parameters */
|
|
1679 hi2c->pBuffPtr = pData;
|
|
1680 hi2c->XferCount = Size;
|
|
1681 hi2c->XferSize = hi2c->XferCount;
|
|
1682 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
|
|
1683 hi2c->XferISR = I2C_Slave_ISR_DMA;
|
|
1684
|
|
1685 /* Set the I2C DMA transfer complete callback */
|
|
1686 hi2c->hdmarx->XferCpltCallback = I2C_DMASlaveReceiveCplt;
|
|
1687
|
|
1688 /* Set the DMA error callback */
|
|
1689 hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
|
|
1690
|
|
1691 /* Set the unused DMA callbacks to NULL */
|
|
1692 hi2c->hdmarx->XferHalfCpltCallback = NULL;
|
|
1693 hi2c->hdmarx->XferAbortCallback = NULL;
|
|
1694
|
|
1695 /* Enable the DMA channel */
|
|
1696 HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)pData, hi2c->XferSize);
|
|
1697
|
|
1698 /* Enable Address Acknowledge */
|
|
1699 hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
|
|
1700
|
|
1701 /* Process Unlocked */
|
|
1702 __HAL_UNLOCK(hi2c);
|
|
1703
|
|
1704 /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
1705 to avoid the risk of I2C interrupt handle execution before current
|
|
1706 process unlock */
|
|
1707 /* Enable ERR, STOP, NACK, ADDR interrupts */
|
|
1708 I2C_Enable_IRQ(hi2c, I2C_XFER_LISTEN_IT);
|
|
1709
|
|
1710 /* Enable DMA Request */
|
|
1711 hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN;
|
|
1712
|
|
1713 return HAL_OK;
|
|
1714 }
|
|
1715 else
|
|
1716 {
|
|
1717 return HAL_BUSY;
|
|
1718 }
|
|
1719 }
|
|
1720 /**
|
|
1721 * @brief Write an amount of data in blocking mode to a specific memory address
|
|
1722 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
1723 * the configuration information for the specified I2C.
|
|
1724 * @param DevAddress Target device address: The device 7 bits address value
|
|
1725 * in datasheet must be shift at right before call interface
|
|
1726 * @param MemAddress Internal memory address
|
|
1727 * @param MemAddSize Size of internal memory address
|
|
1728 * @param pData Pointer to data buffer
|
|
1729 * @param Size Amount of data to be sent
|
|
1730 * @param Timeout Timeout duration
|
|
1731 * @retval HAL status
|
|
1732 */
|
|
1733 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)
|
|
1734 {
|
|
1735 uint32_t tickstart = 0U;
|
|
1736
|
|
1737 /* Check the parameters */
|
|
1738 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
|
|
1739
|
|
1740 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
1741 {
|
|
1742 if((pData == NULL) || (Size == 0U))
|
|
1743 {
|
|
1744 return HAL_ERROR;
|
|
1745 }
|
|
1746
|
|
1747 /* Process Locked */
|
|
1748 __HAL_LOCK(hi2c);
|
|
1749
|
|
1750 /* Init tickstart for timeout management*/
|
|
1751 tickstart = HAL_GetTick();
|
|
1752
|
|
1753 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK)
|
|
1754 {
|
|
1755 return HAL_TIMEOUT;
|
|
1756 }
|
|
1757
|
|
1758 hi2c->State = HAL_I2C_STATE_BUSY_TX;
|
|
1759 hi2c->Mode = HAL_I2C_MODE_MEM;
|
|
1760 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
1761
|
|
1762 /* Prepare transfer parameters */
|
|
1763 hi2c->pBuffPtr = pData;
|
|
1764 hi2c->XferCount = Size;
|
|
1765 hi2c->XferISR = NULL;
|
|
1766
|
|
1767 /* Send Slave Address and Memory Address */
|
|
1768 if(I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK)
|
|
1769 {
|
|
1770 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
1771 {
|
|
1772 /* Process Unlocked */
|
|
1773 __HAL_UNLOCK(hi2c);
|
|
1774 return HAL_ERROR;
|
|
1775 }
|
|
1776 else
|
|
1777 {
|
|
1778 /* Process Unlocked */
|
|
1779 __HAL_UNLOCK(hi2c);
|
|
1780 return HAL_TIMEOUT;
|
|
1781 }
|
|
1782 }
|
|
1783
|
|
1784 /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE */
|
|
1785 if(hi2c->XferCount > MAX_NBYTE_SIZE)
|
|
1786 {
|
|
1787 hi2c->XferSize = MAX_NBYTE_SIZE;
|
|
1788 I2C_TransferConfig(hi2c, DevAddress, hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
|
|
1789 }
|
|
1790 else
|
|
1791 {
|
|
1792 hi2c->XferSize = hi2c->XferCount;
|
|
1793 I2C_TransferConfig(hi2c, DevAddress, hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
|
|
1794 }
|
|
1795
|
|
1796 do
|
|
1797 {
|
|
1798 /* Wait until TXIS flag is set */
|
|
1799 if(I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
|
|
1800 {
|
|
1801 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
1802 {
|
|
1803 return HAL_ERROR;
|
|
1804 }
|
|
1805 else
|
|
1806 {
|
|
1807 return HAL_TIMEOUT;
|
|
1808 }
|
|
1809 }
|
|
1810
|
|
1811 /* Write data to TXDR */
|
|
1812 hi2c->Instance->TXDR = (*hi2c->pBuffPtr++);
|
|
1813 hi2c->XferCount--;
|
|
1814 hi2c->XferSize--;
|
|
1815
|
|
1816 if((hi2c->XferSize == 0U) && (hi2c->XferCount!=0U))
|
|
1817 {
|
|
1818 /* Wait until TCR flag is set */
|
|
1819 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK)
|
|
1820 {
|
|
1821 return HAL_TIMEOUT;
|
|
1822 }
|
|
1823
|
|
1824 if(hi2c->XferCount > MAX_NBYTE_SIZE)
|
|
1825 {
|
|
1826 hi2c->XferSize = MAX_NBYTE_SIZE;
|
|
1827 I2C_TransferConfig(hi2c, DevAddress, hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
|
|
1828 }
|
|
1829 else
|
|
1830 {
|
|
1831 hi2c->XferSize = hi2c->XferCount;
|
|
1832 I2C_TransferConfig(hi2c, DevAddress, hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
|
|
1833 }
|
|
1834 }
|
|
1835
|
|
1836 }while(hi2c->XferCount > 0U);
|
|
1837
|
|
1838 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
|
|
1839 /* Wait until STOPF flag is reset */
|
|
1840 if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
|
|
1841 {
|
|
1842 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
1843 {
|
|
1844 return HAL_ERROR;
|
|
1845 }
|
|
1846 else
|
|
1847 {
|
|
1848 return HAL_TIMEOUT;
|
|
1849 }
|
|
1850 }
|
|
1851
|
|
1852 /* Clear STOP Flag */
|
|
1853 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
|
|
1854
|
|
1855 /* Clear Configuration Register 2 */
|
|
1856 I2C_RESET_CR2(hi2c);
|
|
1857
|
|
1858 hi2c->State = HAL_I2C_STATE_READY;
|
|
1859 hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
1860
|
|
1861 /* Process Unlocked */
|
|
1862 __HAL_UNLOCK(hi2c);
|
|
1863
|
|
1864 return HAL_OK;
|
|
1865 }
|
|
1866 else
|
|
1867 {
|
|
1868 return HAL_BUSY;
|
|
1869 }
|
|
1870 }
|
|
1871
|
|
1872 /**
|
|
1873 * @brief Read an amount of data in blocking mode from a specific memory address
|
|
1874 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
1875 * the configuration information for the specified I2C.
|
|
1876 * @param DevAddress Target device address: The device 7 bits address value
|
|
1877 * in datasheet must be shift at right before call interface
|
|
1878 * @param MemAddress Internal memory address
|
|
1879 * @param MemAddSize Size of internal memory address
|
|
1880 * @param pData Pointer to data buffer
|
|
1881 * @param Size Amount of data to be sent
|
|
1882 * @param Timeout Timeout duration
|
|
1883 * @retval HAL status
|
|
1884 */
|
|
1885 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)
|
|
1886 {
|
|
1887 uint32_t tickstart = 0U;
|
|
1888
|
|
1889 /* Check the parameters */
|
|
1890 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
|
|
1891
|
|
1892 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
1893 {
|
|
1894 if((pData == NULL) || (Size == 0U))
|
|
1895 {
|
|
1896 return HAL_ERROR;
|
|
1897 }
|
|
1898
|
|
1899 /* Process Locked */
|
|
1900 __HAL_LOCK(hi2c);
|
|
1901
|
|
1902 /* Init tickstart for timeout management*/
|
|
1903 tickstart = HAL_GetTick();
|
|
1904
|
|
1905 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK)
|
|
1906 {
|
|
1907 return HAL_TIMEOUT;
|
|
1908 }
|
|
1909
|
|
1910 hi2c->State = HAL_I2C_STATE_BUSY_RX;
|
|
1911 hi2c->Mode = HAL_I2C_MODE_MEM;
|
|
1912 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
1913
|
|
1914 /* Prepare transfer parameters */
|
|
1915 hi2c->pBuffPtr = pData;
|
|
1916 hi2c->XferCount = Size;
|
|
1917 hi2c->XferISR = NULL;
|
|
1918
|
|
1919 /* Send Slave Address and Memory Address */
|
|
1920 if(I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK)
|
|
1921 {
|
|
1922 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
1923 {
|
|
1924 /* Process Unlocked */
|
|
1925 __HAL_UNLOCK(hi2c);
|
|
1926 return HAL_ERROR;
|
|
1927 }
|
|
1928 else
|
|
1929 {
|
|
1930 /* Process Unlocked */
|
|
1931 __HAL_UNLOCK(hi2c);
|
|
1932 return HAL_TIMEOUT;
|
|
1933 }
|
|
1934 }
|
|
1935
|
|
1936 /* Send Slave Address */
|
|
1937 /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */
|
|
1938 if(hi2c->XferCount > MAX_NBYTE_SIZE)
|
|
1939 {
|
|
1940 hi2c->XferSize = MAX_NBYTE_SIZE;
|
|
1941 I2C_TransferConfig(hi2c, DevAddress, hi2c->XferSize, I2C_RELOAD_MODE, I2C_GENERATE_START_READ);
|
|
1942 }
|
|
1943 else
|
|
1944 {
|
|
1945 hi2c->XferSize = hi2c->XferCount;
|
|
1946 I2C_TransferConfig(hi2c, DevAddress, hi2c->XferSize, I2C_AUTOEND_MODE, I2C_GENERATE_START_READ);
|
|
1947 }
|
|
1948
|
|
1949 do
|
|
1950 {
|
|
1951 /* Wait until RXNE flag is set */
|
|
1952 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, Timeout, tickstart) != HAL_OK)
|
|
1953 {
|
|
1954 return HAL_TIMEOUT;
|
|
1955 }
|
|
1956
|
|
1957 /* Read data from RXDR */
|
|
1958 (*hi2c->pBuffPtr++) = hi2c->Instance->RXDR;
|
|
1959 hi2c->XferSize--;
|
|
1960 hi2c->XferCount--;
|
|
1961
|
|
1962 if((hi2c->XferSize == 0U) && (hi2c->XferCount != 0U))
|
|
1963 {
|
|
1964 /* Wait until TCR flag is set */
|
|
1965 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK)
|
|
1966 {
|
|
1967 return HAL_TIMEOUT;
|
|
1968 }
|
|
1969
|
|
1970 if(hi2c->XferCount > MAX_NBYTE_SIZE)
|
|
1971 {
|
|
1972 hi2c->XferSize = MAX_NBYTE_SIZE;
|
|
1973 I2C_TransferConfig(hi2c, DevAddress, hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
|
|
1974 }
|
|
1975 else
|
|
1976 {
|
|
1977 hi2c->XferSize = hi2c->XferCount;
|
|
1978 I2C_TransferConfig(hi2c, DevAddress, hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
|
|
1979 }
|
|
1980 }
|
|
1981 }while(hi2c->XferCount > 0U);
|
|
1982
|
|
1983 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
|
|
1984 /* Wait until STOPF flag is reset */
|
|
1985 if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
|
|
1986 {
|
|
1987 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
1988 {
|
|
1989 return HAL_ERROR;
|
|
1990 }
|
|
1991 else
|
|
1992 {
|
|
1993 return HAL_TIMEOUT;
|
|
1994 }
|
|
1995 }
|
|
1996
|
|
1997 /* Clear STOP Flag */
|
|
1998 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
|
|
1999
|
|
2000 /* Clear Configuration Register 2 */
|
|
2001 I2C_RESET_CR2(hi2c);
|
|
2002
|
|
2003 hi2c->State = HAL_I2C_STATE_READY;
|
|
2004 hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
2005
|
|
2006 /* Process Unlocked */
|
|
2007 __HAL_UNLOCK(hi2c);
|
|
2008
|
|
2009 return HAL_OK;
|
|
2010 }
|
|
2011 else
|
|
2012 {
|
|
2013 return HAL_BUSY;
|
|
2014 }
|
|
2015 }
|
|
2016 /**
|
|
2017 * @brief Write an amount of data in non-blocking mode with Interrupt to a specific memory address
|
|
2018 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
2019 * the configuration information for the specified I2C.
|
|
2020 * @param DevAddress Target device address: The device 7 bits address value
|
|
2021 * in datasheet must be shift at right before call interface
|
|
2022 * @param MemAddress Internal memory address
|
|
2023 * @param MemAddSize Size of internal memory address
|
|
2024 * @param pData Pointer to data buffer
|
|
2025 * @param Size Amount of data to be sent
|
|
2026 * @retval HAL status
|
|
2027 */
|
|
2028 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)
|
|
2029 {
|
|
2030 uint32_t tickstart = 0U;
|
|
2031 uint32_t xfermode = 0U;
|
|
2032
|
|
2033 /* Check the parameters */
|
|
2034 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
|
|
2035
|
|
2036 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
2037 {
|
|
2038 if((pData == NULL) || (Size == 0U))
|
|
2039 {
|
|
2040 return HAL_ERROR;
|
|
2041 }
|
|
2042
|
|
2043 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
2044 {
|
|
2045 return HAL_BUSY;
|
|
2046 }
|
|
2047
|
|
2048 /* Process Locked */
|
|
2049 __HAL_LOCK(hi2c);
|
|
2050
|
|
2051 /* Init tickstart for timeout management*/
|
|
2052 tickstart = HAL_GetTick();
|
|
2053
|
|
2054 hi2c->State = HAL_I2C_STATE_BUSY_TX;
|
|
2055 hi2c->Mode = HAL_I2C_MODE_MEM;
|
|
2056 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
2057
|
|
2058 /* Prepare transfer parameters */
|
|
2059 hi2c->pBuffPtr = pData;
|
|
2060 hi2c->XferCount = Size;
|
|
2061 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
|
|
2062 hi2c->XferISR = I2C_Master_ISR_IT;
|
|
2063
|
|
2064 if(hi2c->XferCount > MAX_NBYTE_SIZE)
|
|
2065 {
|
|
2066 hi2c->XferSize = MAX_NBYTE_SIZE;
|
|
2067 xfermode = I2C_RELOAD_MODE;
|
|
2068 }
|
|
2069 else
|
|
2070 {
|
|
2071 hi2c->XferSize = hi2c->XferCount;
|
|
2072 xfermode = I2C_AUTOEND_MODE;
|
|
2073 }
|
|
2074
|
|
2075 /* Send Slave Address and Memory Address */
|
|
2076 if(I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK)
|
|
2077 {
|
|
2078 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
2079 {
|
|
2080 /* Process Unlocked */
|
|
2081 __HAL_UNLOCK(hi2c);
|
|
2082 return HAL_ERROR;
|
|
2083 }
|
|
2084 else
|
|
2085 {
|
|
2086 /* Process Unlocked */
|
|
2087 __HAL_UNLOCK(hi2c);
|
|
2088 return HAL_TIMEOUT;
|
|
2089 }
|
|
2090 }
|
|
2091
|
|
2092 /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */
|
|
2093 I2C_TransferConfig(hi2c,DevAddress, hi2c->XferSize, xfermode, I2C_NO_STARTSTOP);
|
|
2094
|
|
2095 /* Process Unlocked */
|
|
2096 __HAL_UNLOCK(hi2c);
|
|
2097
|
|
2098 /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
2099 to avoid the risk of I2C interrupt handle execution before current
|
|
2100 process unlock */
|
|
2101
|
|
2102 /* Enable ERR, TC, STOP, NACK, TXI interrupt */
|
|
2103 /* possible to enable all of these */
|
|
2104 /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */
|
|
2105 I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);
|
|
2106
|
|
2107 return HAL_OK;
|
|
2108 }
|
|
2109 else
|
|
2110 {
|
|
2111 return HAL_BUSY;
|
|
2112 }
|
|
2113 }
|
|
2114
|
|
2115 /**
|
|
2116 * @brief Read an amount of data in non-blocking mode with Interrupt from a specific memory address
|
|
2117 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
2118 * the configuration information for the specified I2C.
|
|
2119 * @param DevAddress Target device address: The device 7 bits address value
|
|
2120 * in datasheet must be shift at right before call interface
|
|
2121 * @param MemAddress Internal memory address
|
|
2122 * @param MemAddSize Size of internal memory address
|
|
2123 * @param pData Pointer to data buffer
|
|
2124 * @param Size Amount of data to be sent
|
|
2125 * @retval HAL status
|
|
2126 */
|
|
2127 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)
|
|
2128 {
|
|
2129 uint32_t tickstart = 0U;
|
|
2130 uint32_t xfermode = 0U;
|
|
2131
|
|
2132 /* Check the parameters */
|
|
2133 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
|
|
2134
|
|
2135 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
2136 {
|
|
2137 if((pData == NULL) || (Size == 0U))
|
|
2138 {
|
|
2139 return HAL_ERROR;
|
|
2140 }
|
|
2141
|
|
2142 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
2143 {
|
|
2144 return HAL_BUSY;
|
|
2145 }
|
|
2146
|
|
2147 /* Process Locked */
|
|
2148 __HAL_LOCK(hi2c);
|
|
2149
|
|
2150 /* Init tickstart for timeout management*/
|
|
2151 tickstart = HAL_GetTick();
|
|
2152
|
|
2153 hi2c->State = HAL_I2C_STATE_BUSY_RX;
|
|
2154 hi2c->Mode = HAL_I2C_MODE_MEM;
|
|
2155 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
2156
|
|
2157 /* Prepare transfer parameters */
|
|
2158 hi2c->pBuffPtr = pData;
|
|
2159 hi2c->XferCount = Size;
|
|
2160 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
|
|
2161 hi2c->XferISR = I2C_Master_ISR_IT;
|
|
2162
|
|
2163 if(hi2c->XferCount > MAX_NBYTE_SIZE)
|
|
2164 {
|
|
2165 hi2c->XferSize = MAX_NBYTE_SIZE;
|
|
2166 xfermode = I2C_RELOAD_MODE;
|
|
2167 }
|
|
2168 else
|
|
2169 {
|
|
2170 hi2c->XferSize = hi2c->XferCount;
|
|
2171 xfermode = I2C_AUTOEND_MODE;
|
|
2172 }
|
|
2173
|
|
2174 /* Send Slave Address and Memory Address */
|
|
2175 if(I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK)
|
|
2176 {
|
|
2177 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
2178 {
|
|
2179 /* Process Unlocked */
|
|
2180 __HAL_UNLOCK(hi2c);
|
|
2181 return HAL_ERROR;
|
|
2182 }
|
|
2183 else
|
|
2184 {
|
|
2185 /* Process Unlocked */
|
|
2186 __HAL_UNLOCK(hi2c);
|
|
2187 return HAL_TIMEOUT;
|
|
2188 }
|
|
2189 }
|
|
2190
|
|
2191 /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */
|
|
2192 I2C_TransferConfig(hi2c,DevAddress,hi2c->XferSize, xfermode, I2C_GENERATE_START_READ);
|
|
2193
|
|
2194 /* Process Unlocked */
|
|
2195 __HAL_UNLOCK(hi2c);
|
|
2196
|
|
2197 /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
2198 to avoid the risk of I2C interrupt handle execution before current
|
|
2199 process unlock */
|
|
2200
|
|
2201 /* Enable ERR, TC, STOP, NACK, RXI interrupt */
|
|
2202 /* possible to enable all of these */
|
|
2203 /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */
|
|
2204 I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT);
|
|
2205
|
|
2206 return HAL_OK;
|
|
2207 }
|
|
2208 else
|
|
2209 {
|
|
2210 return HAL_BUSY;
|
|
2211 }
|
|
2212 }
|
|
2213 /**
|
|
2214 * @brief Write an amount of data in non-blocking mode with DMA to a specific memory address
|
|
2215 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
2216 * the configuration information for the specified I2C.
|
|
2217 * @param DevAddress Target device address: The device 7 bits address value
|
|
2218 * in datasheet must be shift at right before call interface
|
|
2219 * @param MemAddress Internal memory address
|
|
2220 * @param MemAddSize Size of internal memory address
|
|
2221 * @param pData Pointer to data buffer
|
|
2222 * @param Size Amount of data to be sent
|
|
2223 * @retval HAL status
|
|
2224 */
|
|
2225 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)
|
|
2226 {
|
|
2227 uint32_t tickstart = 0U;
|
|
2228 uint32_t xfermode = 0U;
|
|
2229
|
|
2230 /* Check the parameters */
|
|
2231 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
|
|
2232
|
|
2233 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
2234 {
|
|
2235 if((pData == NULL) || (Size == 0U))
|
|
2236 {
|
|
2237 return HAL_ERROR;
|
|
2238 }
|
|
2239
|
|
2240 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
2241 {
|
|
2242 return HAL_BUSY;
|
|
2243 }
|
|
2244
|
|
2245 /* Process Locked */
|
|
2246 __HAL_LOCK(hi2c);
|
|
2247
|
|
2248 /* Init tickstart for timeout management*/
|
|
2249 tickstart = HAL_GetTick();
|
|
2250
|
|
2251 hi2c->State = HAL_I2C_STATE_BUSY_TX;
|
|
2252 hi2c->Mode = HAL_I2C_MODE_MEM;
|
|
2253 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
2254
|
|
2255 /* Prepare transfer parameters */
|
|
2256 hi2c->pBuffPtr = pData;
|
|
2257 hi2c->XferCount = Size;
|
|
2258 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
|
|
2259 hi2c->XferISR = I2C_Master_ISR_DMA;
|
|
2260
|
|
2261 if(hi2c->XferCount > MAX_NBYTE_SIZE)
|
|
2262 {
|
|
2263 hi2c->XferSize = MAX_NBYTE_SIZE;
|
|
2264 xfermode = I2C_RELOAD_MODE;
|
|
2265 }
|
|
2266 else
|
|
2267 {
|
|
2268 hi2c->XferSize = hi2c->XferCount;
|
|
2269 xfermode = I2C_AUTOEND_MODE;
|
|
2270 }
|
|
2271
|
|
2272 /* Send Slave Address and Memory Address */
|
|
2273 if(I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK)
|
|
2274 {
|
|
2275 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
2276 {
|
|
2277 /* Process Unlocked */
|
|
2278 __HAL_UNLOCK(hi2c);
|
|
2279 return HAL_ERROR;
|
|
2280 }
|
|
2281 else
|
|
2282 {
|
|
2283 /* Process Unlocked */
|
|
2284 __HAL_UNLOCK(hi2c);
|
|
2285 return HAL_TIMEOUT;
|
|
2286 }
|
|
2287 }
|
|
2288
|
|
2289 /* Set the I2C DMA transfer complete callback */
|
|
2290 hi2c->hdmatx->XferCpltCallback = I2C_DMAMasterTransmitCplt;
|
|
2291
|
|
2292 /* Set the DMA error callback */
|
|
2293 hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
|
|
2294
|
|
2295 /* Set the unused DMA callbacks to NULL */
|
|
2296 hi2c->hdmatx->XferHalfCpltCallback = NULL;
|
|
2297 hi2c->hdmatx->XferAbortCallback = NULL;
|
|
2298
|
|
2299 /* Enable the DMA channel */
|
|
2300 HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->TXDR, hi2c->XferSize);
|
|
2301
|
|
2302 /* Send Slave Address */
|
|
2303 /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */
|
|
2304 I2C_TransferConfig(hi2c, DevAddress, hi2c->XferSize, xfermode, I2C_NO_STARTSTOP);
|
|
2305
|
|
2306 /* Update XferCount value */
|
|
2307 hi2c->XferCount -= hi2c->XferSize;
|
|
2308
|
|
2309 /* Process Unlocked */
|
|
2310 __HAL_UNLOCK(hi2c);
|
|
2311
|
|
2312 /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
2313 to avoid the risk of I2C interrupt handle execution before current
|
|
2314 process unlock */
|
|
2315 /* Enable ERR and NACK interrupts */
|
|
2316 I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT);
|
|
2317
|
|
2318 /* Enable DMA Request */
|
|
2319 hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;
|
|
2320
|
|
2321 return HAL_OK;
|
|
2322 }
|
|
2323 else
|
|
2324 {
|
|
2325 return HAL_BUSY;
|
|
2326 }
|
|
2327 }
|
|
2328
|
|
2329 /**
|
|
2330 * @brief Reads an amount of data in non-blocking mode with DMA from a specific memory address.
|
|
2331 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
2332 * the configuration information for the specified I2C.
|
|
2333 * @param DevAddress Target device address: The device 7 bits address value
|
|
2334 * in datasheet must be shift at right before call interface
|
|
2335 * @param MemAddress Internal memory address
|
|
2336 * @param MemAddSize Size of internal memory address
|
|
2337 * @param pData Pointer to data buffer
|
|
2338 * @param Size Amount of data to be read
|
|
2339 * @retval HAL status
|
|
2340 */
|
|
2341 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)
|
|
2342 {
|
|
2343 uint32_t tickstart = 0U;
|
|
2344 uint32_t xfermode = 0U;
|
|
2345
|
|
2346 /* Check the parameters */
|
|
2347 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
|
|
2348
|
|
2349 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
2350 {
|
|
2351 if((pData == NULL) || (Size == 0U))
|
|
2352 {
|
|
2353 return HAL_ERROR;
|
|
2354 }
|
|
2355
|
|
2356 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
2357 {
|
|
2358 return HAL_BUSY;
|
|
2359 }
|
|
2360
|
|
2361 /* Process Locked */
|
|
2362 __HAL_LOCK(hi2c);
|
|
2363
|
|
2364 /* Init tickstart for timeout management*/
|
|
2365 tickstart = HAL_GetTick();
|
|
2366
|
|
2367 hi2c->State = HAL_I2C_STATE_BUSY_RX;
|
|
2368 hi2c->Mode = HAL_I2C_MODE_MEM;
|
|
2369 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
2370
|
|
2371 /* Prepare transfer parameters */
|
|
2372 hi2c->pBuffPtr = pData;
|
|
2373 hi2c->XferCount = Size;
|
|
2374 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
|
|
2375 hi2c->XferISR = I2C_Master_ISR_DMA;
|
|
2376
|
|
2377 if(hi2c->XferCount > MAX_NBYTE_SIZE)
|
|
2378 {
|
|
2379 hi2c->XferSize = MAX_NBYTE_SIZE;
|
|
2380 xfermode = I2C_RELOAD_MODE;
|
|
2381 }
|
|
2382 else
|
|
2383 {
|
|
2384 hi2c->XferSize = hi2c->XferCount;
|
|
2385 xfermode = I2C_AUTOEND_MODE;
|
|
2386 }
|
|
2387
|
|
2388 /* Send Slave Address and Memory Address */
|
|
2389 if(I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK)
|
|
2390 {
|
|
2391 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
2392 {
|
|
2393 /* Process Unlocked */
|
|
2394 __HAL_UNLOCK(hi2c);
|
|
2395 return HAL_ERROR;
|
|
2396 }
|
|
2397 else
|
|
2398 {
|
|
2399 /* Process Unlocked */
|
|
2400 __HAL_UNLOCK(hi2c);
|
|
2401 return HAL_TIMEOUT;
|
|
2402 }
|
|
2403 }
|
|
2404
|
|
2405 /* Set the I2C DMA transfer complete callback */
|
|
2406 hi2c->hdmarx->XferCpltCallback = I2C_DMAMasterReceiveCplt;
|
|
2407
|
|
2408 /* Set the DMA error callback */
|
|
2409 hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
|
|
2410
|
|
2411 /* Set the unused DMA callbacks to NULL */
|
|
2412 hi2c->hdmarx->XferHalfCpltCallback = NULL;
|
|
2413 hi2c->hdmarx->XferAbortCallback = NULL;
|
|
2414
|
|
2415 /* Enable the DMA channel */
|
|
2416 HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)pData, hi2c->XferSize);
|
|
2417
|
|
2418 /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */
|
|
2419 I2C_TransferConfig(hi2c,DevAddress, hi2c->XferSize, xfermode, I2C_GENERATE_START_READ);
|
|
2420
|
|
2421 /* Update XferCount value */
|
|
2422 hi2c->XferCount -= hi2c->XferSize;
|
|
2423
|
|
2424 /* Process Unlocked */
|
|
2425 __HAL_UNLOCK(hi2c);
|
|
2426
|
|
2427 /* Enable DMA Request */
|
|
2428 hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN;
|
|
2429
|
|
2430 /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
2431 to avoid the risk of I2C interrupt handle execution before current
|
|
2432 process unlock */
|
|
2433 /* Enable ERR and NACK interrupts */
|
|
2434 I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT);
|
|
2435
|
|
2436 return HAL_OK;
|
|
2437 }
|
|
2438 else
|
|
2439 {
|
|
2440 return HAL_BUSY;
|
|
2441 }
|
|
2442 }
|
|
2443
|
|
2444 /**
|
|
2445 * @brief Checks if target device is ready for communication.
|
|
2446 * @note This function is used with Memory devices
|
|
2447 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
2448 * the configuration information for the specified I2C.
|
|
2449 * @param DevAddress Target device address: The device 7 bits address value
|
|
2450 * in datasheet must be shift at right before call interface
|
|
2451 * @param Trials Number of trials
|
|
2452 * @param Timeout Timeout duration
|
|
2453 * @retval HAL status
|
|
2454 */
|
|
2455 HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout)
|
|
2456 {
|
|
2457 uint32_t tickstart = 0U;
|
|
2458
|
|
2459 __IO uint32_t I2C_Trials = 0U;
|
|
2460
|
|
2461 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
2462 {
|
|
2463 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
|
|
2464 {
|
|
2465 return HAL_BUSY;
|
|
2466 }
|
|
2467
|
|
2468 /* Process Locked */
|
|
2469 __HAL_LOCK(hi2c);
|
|
2470
|
|
2471 hi2c->State = HAL_I2C_STATE_BUSY;
|
|
2472 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
2473
|
|
2474 do
|
|
2475 {
|
|
2476 /* Generate Start */
|
|
2477 hi2c->Instance->CR2 = I2C_GENERATE_START(hi2c->Init.AddressingMode,DevAddress);
|
|
2478
|
|
2479 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
|
|
2480 /* Wait until STOPF flag is set or a NACK flag is set*/
|
|
2481 tickstart = HAL_GetTick();
|
|
2482 while((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET) && (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == RESET) && (hi2c->State != HAL_I2C_STATE_TIMEOUT))
|
|
2483 {
|
|
2484 if(Timeout != HAL_MAX_DELAY)
|
|
2485 {
|
|
2486 if((Timeout == 0U) || ((HAL_GetTick() - tickstart) > Timeout))
|
|
2487 {
|
|
2488 /* Device is ready */
|
|
2489 hi2c->State = HAL_I2C_STATE_READY;
|
|
2490 /* Process Unlocked */
|
|
2491 __HAL_UNLOCK(hi2c);
|
|
2492 return HAL_TIMEOUT;
|
|
2493 }
|
|
2494 }
|
|
2495 }
|
|
2496
|
|
2497 /* Check if the NACKF flag has not been set */
|
|
2498 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == RESET)
|
|
2499 {
|
|
2500 /* Wait until STOPF flag is reset */
|
|
2501 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_STOPF, RESET, Timeout, tickstart) != HAL_OK)
|
|
2502 {
|
|
2503 return HAL_TIMEOUT;
|
|
2504 }
|
|
2505
|
|
2506 /* Clear STOP Flag */
|
|
2507 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
|
|
2508
|
|
2509 /* Device is ready */
|
|
2510 hi2c->State = HAL_I2C_STATE_READY;
|
|
2511
|
|
2512 /* Process Unlocked */
|
|
2513 __HAL_UNLOCK(hi2c);
|
|
2514
|
|
2515 return HAL_OK;
|
|
2516 }
|
|
2517 else
|
|
2518 {
|
|
2519 /* Wait until STOPF flag is reset */
|
|
2520 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_STOPF, RESET, Timeout, tickstart) != HAL_OK)
|
|
2521 {
|
|
2522 return HAL_TIMEOUT;
|
|
2523 }
|
|
2524
|
|
2525 /* Clear NACK Flag */
|
|
2526 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
|
|
2527
|
|
2528 /* Clear STOP Flag, auto generated with autoend*/
|
|
2529 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
|
|
2530 }
|
|
2531
|
|
2532 /* Check if the maximum allowed number of trials has been reached */
|
|
2533 if (I2C_Trials++ == Trials)
|
|
2534 {
|
|
2535 /* Generate Stop */
|
|
2536 hi2c->Instance->CR2 |= I2C_CR2_STOP;
|
|
2537
|
|
2538 /* Wait until STOPF flag is reset */
|
|
2539 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_STOPF, RESET, Timeout, tickstart) != HAL_OK)
|
|
2540 {
|
|
2541 return HAL_TIMEOUT;
|
|
2542 }
|
|
2543
|
|
2544 /* Clear STOP Flag */
|
|
2545 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
|
|
2546 }
|
|
2547 }while(I2C_Trials < Trials);
|
|
2548
|
|
2549 hi2c->State = HAL_I2C_STATE_READY;
|
|
2550
|
|
2551 /* Process Unlocked */
|
|
2552 __HAL_UNLOCK(hi2c);
|
|
2553
|
|
2554 return HAL_TIMEOUT;
|
|
2555 }
|
|
2556 else
|
|
2557 {
|
|
2558 return HAL_BUSY;
|
|
2559 }
|
|
2560 }
|
|
2561
|
|
2562 /**
|
|
2563 * @brief Sequential transmit in master I2C mode an amount of data in non-blocking mode with Interrupt.
|
|
2564 * @note This interface allow to manage repeated start condition when a direction change during transfer
|
|
2565 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
2566 * the configuration information for the specified I2C.
|
|
2567 * @param DevAddress Target device address: The device 7 bits address value
|
|
2568 * in datasheet must be shift at right before call interface
|
|
2569 * @param pData Pointer to data buffer
|
|
2570 * @param Size Amount of data to be sent
|
|
2571 * @param XferOptions Options of Transfer, value of @ref I2C_XFEROPTIONS
|
|
2572 * @retval HAL status
|
|
2573 */
|
|
2574 HAL_StatusTypeDef HAL_I2C_Master_Sequential_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
|
|
2575 {
|
|
2576 uint32_t xfermode = 0U;
|
|
2577 uint32_t xferrequest = I2C_GENERATE_START_WRITE;
|
|
2578
|
|
2579 /* Check the parameters */
|
|
2580 assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
|
|
2581
|
|
2582 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
2583 {
|
|
2584 /* Process Locked */
|
|
2585 __HAL_LOCK(hi2c);
|
|
2586
|
|
2587 hi2c->State = HAL_I2C_STATE_BUSY_TX;
|
|
2588 hi2c->Mode = HAL_I2C_MODE_MASTER;
|
|
2589 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
2590
|
|
2591 /* Prepare transfer parameters */
|
|
2592 hi2c->pBuffPtr = pData;
|
|
2593 hi2c->XferCount = Size;
|
|
2594 hi2c->XferOptions = XferOptions;
|
|
2595 hi2c->XferISR = I2C_Master_ISR_IT;
|
|
2596
|
|
2597 /* If size > MAX_NBYTE_SIZE, use reload mode */
|
|
2598 if(hi2c->XferCount > MAX_NBYTE_SIZE)
|
|
2599 {
|
|
2600 hi2c->XferSize = MAX_NBYTE_SIZE;
|
|
2601 xfermode = I2C_RELOAD_MODE;
|
|
2602 }
|
|
2603 else
|
|
2604 {
|
|
2605 hi2c->XferSize = hi2c->XferCount;
|
|
2606 xfermode = hi2c->XferOptions;
|
|
2607 }
|
|
2608
|
|
2609 /* If transfer direction not change, do not generate Restart Condition */
|
|
2610 /* Mean Previous state is same as current state */
|
|
2611 if(hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX)
|
|
2612 {
|
|
2613 xferrequest = I2C_NO_STARTSTOP;
|
|
2614 }
|
|
2615
|
|
2616 /* Send Slave Address and set NBYTES to write */
|
|
2617 I2C_TransferConfig(hi2c, DevAddress, hi2c->XferSize, xfermode, xferrequest);
|
|
2618
|
|
2619 /* Process Unlocked */
|
|
2620 __HAL_UNLOCK(hi2c);
|
|
2621
|
|
2622 /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
2623 to avoid the risk of I2C interrupt handle execution before current
|
|
2624 process unlock */
|
|
2625 I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);
|
|
2626
|
|
2627 return HAL_OK;
|
|
2628 }
|
|
2629 else
|
|
2630 {
|
|
2631 return HAL_BUSY;
|
|
2632 }
|
|
2633 }
|
|
2634
|
|
2635 /**
|
|
2636 * @brief Sequential receive in master I2C mode an amount of data in non-blocking mode with Interrupt
|
|
2637 * @note This interface allow to manage repeated start condition when a direction change during transfer
|
|
2638 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
2639 * the configuration information for the specified I2C.
|
|
2640 * @param DevAddress Target device address: The device 7 bits address value
|
|
2641 * in datasheet must be shift at right before call interface
|
|
2642 * @param pData Pointer to data buffer
|
|
2643 * @param Size Amount of data to be sent
|
|
2644 * @param XferOptions Options of Transfer, value of @ref I2C_XFEROPTIONS
|
|
2645 * @retval HAL status
|
|
2646 */
|
|
2647 HAL_StatusTypeDef HAL_I2C_Master_Sequential_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
|
|
2648 {
|
|
2649 uint32_t xfermode = 0U;
|
|
2650 uint32_t xferrequest = I2C_GENERATE_START_READ;
|
|
2651
|
|
2652 /* Check the parameters */
|
|
2653 assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
|
|
2654
|
|
2655 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
2656 {
|
|
2657 /* Process Locked */
|
|
2658 __HAL_LOCK(hi2c);
|
|
2659
|
|
2660 hi2c->State = HAL_I2C_STATE_BUSY_RX;
|
|
2661 hi2c->Mode = HAL_I2C_MODE_MASTER;
|
|
2662 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
2663
|
|
2664 /* Prepare transfer parameters */
|
|
2665 hi2c->pBuffPtr = pData;
|
|
2666 hi2c->XferCount = Size;
|
|
2667 hi2c->XferOptions = XferOptions;
|
|
2668 hi2c->XferISR = I2C_Master_ISR_IT;
|
|
2669
|
|
2670 /* If hi2c->XferCount > MAX_NBYTE_SIZE, use reload mode */
|
|
2671 if(hi2c->XferCount > MAX_NBYTE_SIZE)
|
|
2672 {
|
|
2673 hi2c->XferSize = MAX_NBYTE_SIZE;
|
|
2674 xfermode = I2C_RELOAD_MODE;
|
|
2675 }
|
|
2676 else
|
|
2677 {
|
|
2678 hi2c->XferSize = hi2c->XferCount;
|
|
2679 xfermode = hi2c->XferOptions;
|
|
2680 }
|
|
2681
|
|
2682 /* If transfer direction not change, do not generate Restart Condition */
|
|
2683 /* Mean Previous state is same as current state */
|
|
2684 if(hi2c->PreviousState == I2C_STATE_MASTER_BUSY_RX)
|
|
2685 {
|
|
2686 xferrequest = I2C_NO_STARTSTOP;
|
|
2687 }
|
|
2688
|
|
2689 /* Send Slave Address and set NBYTES to read */
|
|
2690 I2C_TransferConfig(hi2c,DevAddress, hi2c->XferSize, xfermode, xferrequest);
|
|
2691
|
|
2692 /* Process Unlocked */
|
|
2693 __HAL_UNLOCK(hi2c);
|
|
2694
|
|
2695 /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
2696 to avoid the risk of I2C interrupt handle execution before current
|
|
2697 process unlock */
|
|
2698 I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT);
|
|
2699
|
|
2700 return HAL_OK;
|
|
2701 }
|
|
2702 else
|
|
2703 {
|
|
2704 return HAL_BUSY;
|
|
2705 }
|
|
2706 }
|
|
2707
|
|
2708 /**
|
|
2709 * @brief Sequential transmit in slave/device I2C mode an amount of data in non-blocking mode with Interrupt
|
|
2710 * @note This interface allow to manage repeated start condition when a direction change during transfer
|
|
2711 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
2712 * the configuration information for the specified I2C.
|
|
2713 * @param pData Pointer to data buffer
|
|
2714 * @param Size Amount of data to be sent
|
|
2715 * @param XferOptions Options of Transfer, value of @ref I2C_XFEROPTIONS
|
|
2716 * @retval HAL status
|
|
2717 */
|
|
2718 HAL_StatusTypeDef HAL_I2C_Slave_Sequential_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
|
|
2719 {
|
|
2720 /* Check the parameters */
|
|
2721 assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
|
|
2722
|
|
2723 if((hi2c->State & HAL_I2C_STATE_LISTEN) == HAL_I2C_STATE_LISTEN)
|
|
2724 {
|
|
2725 if((pData == NULL) || (Size == 0U))
|
|
2726 {
|
|
2727 return HAL_ERROR;
|
|
2728 }
|
|
2729
|
|
2730 /* Disable Interrupts, to prevent preemption during treatment in case of multicall */
|
|
2731 I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_TX_IT);
|
|
2732
|
|
2733 /* Process Locked */
|
|
2734 __HAL_LOCK(hi2c);
|
|
2735
|
|
2736 /* I2C cannot manage full duplex exchange so disable previous IT enabled if any */
|
|
2737 /* and then toggle the HAL slave RX state to TX state */
|
|
2738 if(hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN)
|
|
2739 {
|
|
2740 /* Disable associated Interrupts */
|
|
2741 I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT);
|
|
2742 }
|
|
2743
|
|
2744 hi2c->State = HAL_I2C_STATE_BUSY_TX_LISTEN;
|
|
2745 hi2c->Mode = HAL_I2C_MODE_SLAVE;
|
|
2746 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
2747
|
|
2748 /* Enable Address Acknowledge */
|
|
2749 hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
|
|
2750
|
|
2751 /* Prepare transfer parameters */
|
|
2752 hi2c->pBuffPtr = pData;
|
|
2753 hi2c->XferCount = Size;
|
|
2754 hi2c->XferSize = hi2c->XferCount;
|
|
2755 hi2c->XferOptions = XferOptions;
|
|
2756 hi2c->XferISR = I2C_Slave_ISR_IT;
|
|
2757
|
|
2758 if(I2C_GET_DIR(hi2c) == I2C_DIRECTION_RECEIVE)
|
|
2759 {
|
|
2760 /* Clear ADDR flag after prepare the transfer parameters */
|
|
2761 /* This action will generate an acknowledge to the Master */
|
|
2762 __HAL_I2C_CLEAR_FLAG(hi2c,I2C_FLAG_ADDR);
|
|
2763 }
|
|
2764
|
|
2765 /* Process Unlocked */
|
|
2766 __HAL_UNLOCK(hi2c);
|
|
2767
|
|
2768 /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
2769 to avoid the risk of I2C interrupt handle execution before current
|
|
2770 process unlock */
|
|
2771 /* REnable ADDR interrupt */
|
|
2772 I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT | I2C_XFER_LISTEN_IT);
|
|
2773
|
|
2774 return HAL_OK;
|
|
2775 }
|
|
2776 else
|
|
2777 {
|
|
2778 return HAL_ERROR;
|
|
2779 }
|
|
2780 }
|
|
2781
|
|
2782 /**
|
|
2783 * @brief Sequential receive in slave/device I2C mode an amount of data in non-blocking mode with Interrupt
|
|
2784 * @note This interface allow to manage repeated start condition when a direction change during transfer
|
|
2785 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
2786 * the configuration information for the specified I2C.
|
|
2787 * @param pData Pointer to data buffer
|
|
2788 * @param Size Amount of data to be sent
|
|
2789 * @param XferOptions Options of Transfer, value of @ref I2C_XFEROPTIONS
|
|
2790 * @retval HAL status
|
|
2791 */
|
|
2792 HAL_StatusTypeDef HAL_I2C_Slave_Sequential_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
|
|
2793 {
|
|
2794 /* Check the parameters */
|
|
2795 assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
|
|
2796
|
|
2797 if((hi2c->State & HAL_I2C_STATE_LISTEN) == HAL_I2C_STATE_LISTEN)
|
|
2798 {
|
|
2799 if((pData == NULL) || (Size == 0U))
|
|
2800 {
|
|
2801 return HAL_ERROR;
|
|
2802 }
|
|
2803
|
|
2804 /* Disable Interrupts, to prevent preemption during treatment in case of multicall */
|
|
2805 I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_RX_IT);
|
|
2806
|
|
2807 /* Process Locked */
|
|
2808 __HAL_LOCK(hi2c);
|
|
2809
|
|
2810 /* I2C cannot manage full duplex exchange so disable previous IT enabled if any */
|
|
2811 /* and then toggle the HAL slave TX state to RX state */
|
|
2812 if(hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN)
|
|
2813 {
|
|
2814 /* Disable associated Interrupts */
|
|
2815 I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT);
|
|
2816 }
|
|
2817
|
|
2818 hi2c->State = HAL_I2C_STATE_BUSY_RX_LISTEN;
|
|
2819 hi2c->Mode = HAL_I2C_MODE_SLAVE;
|
|
2820 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
2821
|
|
2822 /* Enable Address Acknowledge */
|
|
2823 hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
|
|
2824
|
|
2825 /* Prepare transfer parameters */
|
|
2826 hi2c->pBuffPtr = pData;
|
|
2827 hi2c->XferCount = Size;
|
|
2828 hi2c->XferSize = hi2c->XferCount;
|
|
2829 hi2c->XferOptions = XferOptions;
|
|
2830 hi2c->XferISR = I2C_Slave_ISR_IT;
|
|
2831
|
|
2832 if(I2C_GET_DIR(hi2c) == I2C_DIRECTION_TRANSMIT)
|
|
2833 {
|
|
2834 /* Clear ADDR flag after prepare the transfer parameters */
|
|
2835 /* This action will generate an acknowledge to the Master */
|
|
2836 __HAL_I2C_CLEAR_FLAG(hi2c,I2C_FLAG_ADDR);
|
|
2837 }
|
|
2838
|
|
2839 /* Process Unlocked */
|
|
2840 __HAL_UNLOCK(hi2c);
|
|
2841
|
|
2842 /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
2843 to avoid the risk of I2C interrupt handle execution before current
|
|
2844 process unlock */
|
|
2845 /* REnable ADDR interrupt */
|
|
2846 I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT | I2C_XFER_LISTEN_IT);
|
|
2847
|
|
2848 return HAL_OK;
|
|
2849 }
|
|
2850 else
|
|
2851 {
|
|
2852 return HAL_ERROR;
|
|
2853 }
|
|
2854 }
|
|
2855
|
|
2856 /**
|
|
2857 * @brief Enable the Address listen mode with Interrupt.
|
|
2858 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
2859 * the configuration information for the specified I2C.
|
|
2860 * @retval HAL status
|
|
2861 */
|
|
2862 HAL_StatusTypeDef HAL_I2C_EnableListen_IT(I2C_HandleTypeDef *hi2c)
|
|
2863 {
|
|
2864 if(hi2c->State == HAL_I2C_STATE_READY)
|
|
2865 {
|
|
2866 hi2c->State = HAL_I2C_STATE_LISTEN;
|
|
2867 hi2c->XferISR = I2C_Slave_ISR_IT;
|
|
2868
|
|
2869 /* Enable the Address Match interrupt */
|
|
2870 I2C_Enable_IRQ(hi2c, I2C_XFER_LISTEN_IT);
|
|
2871
|
|
2872 return HAL_OK;
|
|
2873 }
|
|
2874 else
|
|
2875 {
|
|
2876 return HAL_BUSY;
|
|
2877 }
|
|
2878 }
|
|
2879
|
|
2880 /**
|
|
2881 * @brief Disable the Address listen mode with Interrupt.
|
|
2882 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
2883 * the configuration information for the specified I2C
|
|
2884 * @retval HAL status
|
|
2885 */
|
|
2886 HAL_StatusTypeDef HAL_I2C_DisableListen_IT(I2C_HandleTypeDef *hi2c)
|
|
2887 {
|
|
2888 /* Declaration of tmp to prevent undefined behavior of volatile usage */
|
|
2889 uint32_t tmp;
|
|
2890
|
|
2891 /* Disable Address listen mode only if a transfer is not ongoing */
|
|
2892 if(hi2c->State == HAL_I2C_STATE_LISTEN)
|
|
2893 {
|
|
2894 tmp = (uint32_t)(hi2c->State) & I2C_STATE_MSK;
|
|
2895 hi2c->PreviousState = tmp | (uint32_t)(hi2c->Mode);
|
|
2896 hi2c->State = HAL_I2C_STATE_READY;
|
|
2897 hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
2898 hi2c->XferISR = NULL;
|
|
2899
|
|
2900 /* Disable the Address Match interrupt */
|
|
2901 I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT);
|
|
2902
|
|
2903 return HAL_OK;
|
|
2904 }
|
|
2905 else
|
|
2906 {
|
|
2907 return HAL_BUSY;
|
|
2908 }
|
|
2909 }
|
|
2910
|
|
2911 /**
|
|
2912 * @brief Abort a master I2C IT or DMA process communication with Interrupt.
|
|
2913 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
2914 * the configuration information for the specified I2C.
|
|
2915 * @param DevAddress Target device address: The device 7 bits address value
|
|
2916 * in datasheet must be shift at right before call interface
|
|
2917 * @retval HAL status
|
|
2918 */
|
|
2919 HAL_StatusTypeDef HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress)
|
|
2920 {
|
|
2921 if(hi2c->Mode == HAL_I2C_MODE_MASTER)
|
|
2922 {
|
|
2923 /* Process Locked */
|
|
2924 __HAL_LOCK(hi2c);
|
|
2925
|
|
2926 /* Disable Interrupts */
|
|
2927 I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT);
|
|
2928 I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT);
|
|
2929
|
|
2930 /* Set State at HAL_I2C_STATE_ABORT */
|
|
2931 hi2c->State = HAL_I2C_STATE_ABORT;
|
|
2932
|
|
2933 /* Set NBYTES to 1 to generate a dummy read on I2C peripheral */
|
|
2934 /* Set AUTOEND mode, this will generate a NACK then STOP condition to abort the current transfer */
|
|
2935 I2C_TransferConfig(hi2c, DevAddress, 1, I2C_AUTOEND_MODE, I2C_GENERATE_STOP);
|
|
2936
|
|
2937 /* Process Unlocked */
|
|
2938 __HAL_UNLOCK(hi2c);
|
|
2939
|
|
2940 /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
2941 to avoid the risk of I2C interrupt handle execution before current
|
|
2942 process unlock */
|
|
2943 I2C_Enable_IRQ(hi2c, I2C_XFER_CPLT_IT);
|
|
2944
|
|
2945 return HAL_OK;
|
|
2946 }
|
|
2947 else
|
|
2948 {
|
|
2949 /* Wrong usage of abort function */
|
|
2950 /* This function should be used only in case of abort monitored by master device */
|
|
2951 return HAL_ERROR;
|
|
2952 }
|
|
2953 }
|
|
2954
|
|
2955 /**
|
|
2956 * @}
|
|
2957 */
|
|
2958
|
|
2959 /** @defgroup I2C_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks
|
|
2960 * @{
|
|
2961 */
|
|
2962
|
|
2963 /**
|
|
2964 * @brief This function handles I2C event interrupt request.
|
|
2965 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
2966 * the configuration information for the specified I2C.
|
|
2967 * @retval None
|
|
2968 */
|
|
2969 void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c)
|
|
2970 {
|
|
2971 /* Get current IT Flags and IT sources value */
|
|
2972 uint32_t itflags = READ_REG(hi2c->Instance->ISR);
|
|
2973 uint32_t itsources = READ_REG(hi2c->Instance->CR1);
|
|
2974
|
|
2975 /* I2C events treatment -------------------------------------*/
|
|
2976 if(hi2c->XferISR != NULL)
|
|
2977 {
|
|
2978 hi2c->XferISR(hi2c, itflags, itsources);
|
|
2979 }
|
|
2980 }
|
|
2981
|
|
2982 /**
|
|
2983 * @brief This function handles I2C error interrupt request.
|
|
2984 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
2985 * the configuration information for the specified I2C.
|
|
2986 * @retval None
|
|
2987 */
|
|
2988 void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c)
|
|
2989 {
|
|
2990 uint32_t itflags = READ_REG(hi2c->Instance->ISR);
|
|
2991 uint32_t itsources = READ_REG(hi2c->Instance->CR1);
|
|
2992
|
|
2993 /* I2C Bus error interrupt occurred ------------------------------------*/
|
|
2994 if(((itflags & I2C_FLAG_BERR) != RESET) && ((itsources & I2C_IT_ERRI) != RESET))
|
|
2995 {
|
|
2996 hi2c->ErrorCode |= HAL_I2C_ERROR_BERR;
|
|
2997
|
|
2998 /* Clear BERR flag */
|
|
2999 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_BERR);
|
|
3000 }
|
|
3001
|
|
3002 /* I2C Over-Run/Under-Run interrupt occurred ----------------------------------------*/
|
|
3003 if(((itflags & I2C_FLAG_OVR) != RESET) && ((itsources & I2C_IT_ERRI) != RESET))
|
|
3004 {
|
|
3005 hi2c->ErrorCode |= HAL_I2C_ERROR_OVR;
|
|
3006
|
|
3007 /* Clear OVR flag */
|
|
3008 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_OVR);
|
|
3009 }
|
|
3010
|
|
3011 /* I2C Arbitration Loss error interrupt occurred -------------------------------------*/
|
|
3012 if(((itflags & I2C_FLAG_ARLO) != RESET) && ((itsources & I2C_IT_ERRI) != RESET))
|
|
3013 {
|
|
3014 hi2c->ErrorCode |= HAL_I2C_ERROR_ARLO;
|
|
3015
|
|
3016 /* Clear ARLO flag */
|
|
3017 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ARLO);
|
|
3018 }
|
|
3019
|
|
3020 /* Call the Error Callback in case of Error detected */
|
|
3021 if((hi2c->ErrorCode & (HAL_I2C_ERROR_BERR | HAL_I2C_ERROR_OVR | HAL_I2C_ERROR_ARLO)) != HAL_I2C_ERROR_NONE)
|
|
3022 {
|
|
3023 I2C_ITError(hi2c, hi2c->ErrorCode);
|
|
3024 }
|
|
3025 }
|
|
3026
|
|
3027 /**
|
|
3028 * @brief Master Tx Transfer completed callback.
|
|
3029 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
3030 * the configuration information for the specified I2C.
|
|
3031 * @retval None
|
|
3032 */
|
|
3033 __weak void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c)
|
|
3034 {
|
|
3035 /* Prevent unused argument(s) compilation warning */
|
|
3036 UNUSED(hi2c);
|
|
3037
|
|
3038 /* NOTE : This function should not be modified, when the callback is needed,
|
|
3039 the HAL_I2C_MasterTxCpltCallback could be implemented in the user file
|
|
3040 */
|
|
3041 }
|
|
3042
|
|
3043 /**
|
|
3044 * @brief Master Rx Transfer completed callback.
|
|
3045 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
3046 * the configuration information for the specified I2C.
|
|
3047 * @retval None
|
|
3048 */
|
|
3049 __weak void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)
|
|
3050 {
|
|
3051 /* Prevent unused argument(s) compilation warning */
|
|
3052 UNUSED(hi2c);
|
|
3053
|
|
3054 /* NOTE : This function should not be modified, when the callback is needed,
|
|
3055 the HAL_I2C_MasterRxCpltCallback could be implemented in the user file
|
|
3056 */
|
|
3057 }
|
|
3058
|
|
3059 /** @brief Slave Tx Transfer completed callback.
|
|
3060 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
3061 * the configuration information for the specified I2C.
|
|
3062 * @retval None
|
|
3063 */
|
|
3064 __weak void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c)
|
|
3065 {
|
|
3066 /* Prevent unused argument(s) compilation warning */
|
|
3067 UNUSED(hi2c);
|
|
3068
|
|
3069 /* NOTE : This function should not be modified, when the callback is needed,
|
|
3070 the HAL_I2C_SlaveTxCpltCallback could be implemented in the user file
|
|
3071 */
|
|
3072 }
|
|
3073
|
|
3074 /**
|
|
3075 * @brief Slave Rx Transfer completed callback.
|
|
3076 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
3077 * the configuration information for the specified I2C.
|
|
3078 * @retval None
|
|
3079 */
|
|
3080 __weak void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c)
|
|
3081 {
|
|
3082 /* Prevent unused argument(s) compilation warning */
|
|
3083 UNUSED(hi2c);
|
|
3084
|
|
3085 /* NOTE : This function should not be modified, when the callback is needed,
|
|
3086 the HAL_I2C_SlaveRxCpltCallback could be implemented in the user file
|
|
3087 */
|
|
3088 }
|
|
3089
|
|
3090 /**
|
|
3091 * @brief Slave Address Match callback.
|
|
3092 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
3093 * the configuration information for the specified I2C.
|
|
3094 * @param TransferDirection: Master request Transfer Direction (Write/Read), value of @ref I2C_XFERDIRECTION
|
|
3095 * @param AddrMatchCode: Address Match Code
|
|
3096 * @retval None
|
|
3097 */
|
|
3098 __weak void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode)
|
|
3099 {
|
|
3100 /* Prevent unused argument(s) compilation warning */
|
|
3101 UNUSED(hi2c);
|
|
3102 UNUSED(TransferDirection);
|
|
3103 UNUSED(AddrMatchCode);
|
|
3104
|
|
3105 /* NOTE : This function should not be modified, when the callback is needed,
|
|
3106 the HAL_I2C_AddrCallback() could be implemented in the user file
|
|
3107 */
|
|
3108 }
|
|
3109
|
|
3110 /**
|
|
3111 * @brief Listen Complete callback.
|
|
3112 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
3113 * the configuration information for the specified I2C.
|
|
3114 * @retval None
|
|
3115 */
|
|
3116 __weak void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c)
|
|
3117 {
|
|
3118 /* Prevent unused argument(s) compilation warning */
|
|
3119 UNUSED(hi2c);
|
|
3120
|
|
3121 /* NOTE : This function should not be modified, when the callback is needed,
|
|
3122 the HAL_I2C_ListenCpltCallback() could be implemented in the user file
|
|
3123 */
|
|
3124 }
|
|
3125
|
|
3126 /**
|
|
3127 * @brief Memory Tx Transfer completed callback.
|
|
3128 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
3129 * the configuration information for the specified I2C.
|
|
3130 * @retval None
|
|
3131 */
|
|
3132 __weak void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c)
|
|
3133 {
|
|
3134 /* Prevent unused argument(s) compilation warning */
|
|
3135 UNUSED(hi2c);
|
|
3136
|
|
3137 /* NOTE : This function should not be modified, when the callback is needed,
|
|
3138 the HAL_I2C_MemTxCpltCallback could be implemented in the user file
|
|
3139 */
|
|
3140 }
|
|
3141
|
|
3142 /**
|
|
3143 * @brief Memory Rx Transfer completed callback.
|
|
3144 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
3145 * the configuration information for the specified I2C.
|
|
3146 * @retval None
|
|
3147 */
|
|
3148 __weak void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c)
|
|
3149 {
|
|
3150 /* Prevent unused argument(s) compilation warning */
|
|
3151 UNUSED(hi2c);
|
|
3152
|
|
3153 /* NOTE : This function should not be modified, when the callback is needed,
|
|
3154 the HAL_I2C_MemRxCpltCallback could be implemented in the user file
|
|
3155 */
|
|
3156 }
|
|
3157
|
|
3158 /**
|
|
3159 * @brief I2C error callback.
|
|
3160 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
3161 * the configuration information for the specified I2C.
|
|
3162 * @retval None
|
|
3163 */
|
|
3164 __weak void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c)
|
|
3165 {
|
|
3166 /* Prevent unused argument(s) compilation warning */
|
|
3167 UNUSED(hi2c);
|
|
3168
|
|
3169 /* NOTE : This function should not be modified, when the callback is needed,
|
|
3170 the HAL_I2C_ErrorCallback could be implemented in the user file
|
|
3171 */
|
|
3172 }
|
|
3173
|
|
3174 /**
|
|
3175 * @brief I2C abort callback.
|
|
3176 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
3177 * the configuration information for the specified I2C.
|
|
3178 * @retval None
|
|
3179 */
|
|
3180 __weak void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c)
|
|
3181 {
|
|
3182 /* Prevent unused argument(s) compilation warning */
|
|
3183 UNUSED(hi2c);
|
|
3184
|
|
3185 /* NOTE : This function should not be modified, when the callback is needed,
|
|
3186 the HAL_I2C_AbortCpltCallback could be implemented in the user file
|
|
3187 */
|
|
3188 }
|
|
3189
|
|
3190 /**
|
|
3191 * @}
|
|
3192 */
|
|
3193
|
|
3194 /** @defgroup I2C_Exported_Functions_Group3 Peripheral State, Mode and Error functions
|
|
3195 * @brief Peripheral State, Mode and Error functions
|
|
3196 *
|
|
3197 @verbatim
|
|
3198 ===============================================================================
|
|
3199 ##### Peripheral State, Mode and Error functions #####
|
|
3200 ===============================================================================
|
|
3201 [..]
|
|
3202 This subsection permit to get in run-time the status of the peripheral
|
|
3203 and the data flow.
|
|
3204
|
|
3205 @endverbatim
|
|
3206 * @{
|
|
3207 */
|
|
3208
|
|
3209 /**
|
|
3210 * @brief Return the I2C handle state.
|
|
3211 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
3212 * the configuration information for the specified I2C.
|
|
3213 * @retval HAL state
|
|
3214 */
|
|
3215 HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c)
|
|
3216 {
|
|
3217 /* Return I2C handle state */
|
|
3218 return hi2c->State;
|
|
3219 }
|
|
3220
|
|
3221 /**
|
|
3222 * @brief Returns the I2C Master, Slave, Memory or no mode.
|
|
3223 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
3224 * the configuration information for I2C module
|
|
3225 * @retval HAL mode
|
|
3226 */
|
|
3227 HAL_I2C_ModeTypeDef HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c)
|
|
3228 {
|
|
3229 return hi2c->Mode;
|
|
3230 }
|
|
3231
|
|
3232 /**
|
|
3233 * @brief Return the I2C error code.
|
|
3234 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
3235 * the configuration information for the specified I2C.
|
|
3236 * @retval I2C Error Code
|
|
3237 */
|
|
3238 uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c)
|
|
3239 {
|
|
3240 return hi2c->ErrorCode;
|
|
3241 }
|
|
3242
|
|
3243 /**
|
|
3244 * @}
|
|
3245 */
|
|
3246
|
|
3247 /**
|
|
3248 * @}
|
|
3249 */
|
|
3250
|
|
3251 /** @addtogroup I2C_Private_Functions
|
|
3252 * @{
|
|
3253 */
|
|
3254
|
|
3255 /**
|
|
3256 * @brief Interrupt Sub-Routine which handle the Interrupt Flags Master Mode with Interrupt.
|
|
3257 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
3258 * the configuration information for the specified I2C.
|
|
3259 * @param ITFlags Interrupt flags to handle.
|
|
3260 * @param ITSources Interrupt sources enabled.
|
|
3261 * @retval HAL status
|
|
3262 */
|
|
3263 static HAL_StatusTypeDef I2C_Master_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
|
|
3264 {
|
|
3265 uint16_t devaddress = 0U;
|
|
3266
|
|
3267 /* Process Locked */
|
|
3268 __HAL_LOCK(hi2c);
|
|
3269
|
|
3270 if(((ITFlags & I2C_FLAG_AF) != RESET) && ((ITSources & I2C_IT_NACKI) != RESET))
|
|
3271 {
|
|
3272 /* Clear NACK Flag */
|
|
3273 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
|
|
3274
|
|
3275 /* Set corresponding Error Code */
|
|
3276 /* No need to generate STOP, it is automatically done */
|
|
3277 /* Error callback will be send during stop flag treatment */
|
|
3278 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
|
|
3279
|
|
3280 /* Flush TX register */
|
|
3281 I2C_Flush_TXDR(hi2c);
|
|
3282 }
|
|
3283 else if(((ITFlags & I2C_FLAG_RXNE) != RESET) && ((ITSources & I2C_IT_RXI) != RESET))
|
|
3284 {
|
|
3285 /* Read data from RXDR */
|
|
3286 (*hi2c->pBuffPtr++) = hi2c->Instance->RXDR;
|
|
3287 hi2c->XferSize--;
|
|
3288 hi2c->XferCount--;
|
|
3289 }
|
|
3290 else if(((ITFlags & I2C_FLAG_TXIS) != RESET) && ((ITSources & I2C_IT_TXI) != RESET))
|
|
3291 {
|
|
3292 /* Write data to TXDR */
|
|
3293 hi2c->Instance->TXDR = (*hi2c->pBuffPtr++);
|
|
3294 hi2c->XferSize--;
|
|
3295 hi2c->XferCount--;
|
|
3296 }
|
|
3297 else if(((ITFlags & I2C_FLAG_TCR) != RESET) && ((ITSources & I2C_IT_TCI) != RESET))
|
|
3298 {
|
|
3299 if((hi2c->XferSize == 0U) && (hi2c->XferCount != 0U))
|
|
3300 {
|
|
3301 devaddress = (hi2c->Instance->CR2 & I2C_CR2_SADD);
|
|
3302
|
|
3303 if(hi2c->XferCount > MAX_NBYTE_SIZE)
|
|
3304 {
|
|
3305 hi2c->XferSize = MAX_NBYTE_SIZE;
|
|
3306 I2C_TransferConfig(hi2c, devaddress, hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
|
|
3307 }
|
|
3308 else
|
|
3309 {
|
|
3310 hi2c->XferSize = hi2c->XferCount;
|
|
3311 if(hi2c->XferOptions != I2C_NO_OPTION_FRAME)
|
|
3312 {
|
|
3313 I2C_TransferConfig(hi2c, devaddress, hi2c->XferSize, hi2c->XferOptions, I2C_NO_STARTSTOP);
|
|
3314 }
|
|
3315 else
|
|
3316 {
|
|
3317 I2C_TransferConfig(hi2c, devaddress, hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
|
|
3318 }
|
|
3319 }
|
|
3320 }
|
|
3321 else
|
|
3322 {
|
|
3323 /* Call TxCpltCallback() if no stop mode is set */
|
|
3324 if(I2C_GET_STOP_MODE(hi2c) != I2C_AUTOEND_MODE)
|
|
3325 {
|
|
3326 /* Call I2C Master Sequential complete process */
|
|
3327 I2C_ITMasterSequentialCplt(hi2c);
|
|
3328 }
|
|
3329 else
|
|
3330 {
|
|
3331 /* Wrong size Status regarding TCR flag event */
|
|
3332 /* Call the corresponding callback to inform upper layer of End of Transfer */
|
|
3333 I2C_ITError(hi2c, HAL_I2C_ERROR_SIZE);
|
|
3334 }
|
|
3335 }
|
|
3336 }
|
|
3337 else if(((ITFlags & I2C_FLAG_TC) != RESET) && ((ITSources & I2C_IT_TCI) != RESET))
|
|
3338 {
|
|
3339 if(hi2c->XferCount == 0U)
|
|
3340 {
|
|
3341 if(I2C_GET_STOP_MODE(hi2c) != I2C_AUTOEND_MODE)
|
|
3342 {
|
|
3343 /* Generate a stop condition in case of no transfer option */
|
|
3344 if(hi2c->XferOptions == I2C_NO_OPTION_FRAME)
|
|
3345 {
|
|
3346 /* Generate Stop */
|
|
3347 hi2c->Instance->CR2 |= I2C_CR2_STOP;
|
|
3348 }
|
|
3349 else
|
|
3350 {
|
|
3351 /* Call I2C Master Sequential complete process */
|
|
3352 I2C_ITMasterSequentialCplt(hi2c);
|
|
3353 }
|
|
3354 }
|
|
3355 }
|
|
3356 else
|
|
3357 {
|
|
3358 /* Wrong size Status regarding TC flag event */
|
|
3359 /* Call the corresponding callback to inform upper layer of End of Transfer */
|
|
3360 I2C_ITError(hi2c, HAL_I2C_ERROR_SIZE);
|
|
3361 }
|
|
3362 }
|
|
3363
|
|
3364 if(((ITFlags & I2C_FLAG_STOPF) != RESET) && ((ITSources & I2C_IT_STOPI) != RESET))
|
|
3365 {
|
|
3366 /* Call I2C Master complete process */
|
|
3367 I2C_ITMasterCplt(hi2c, ITFlags);
|
|
3368 }
|
|
3369
|
|
3370 /* Process Unlocked */
|
|
3371 __HAL_UNLOCK(hi2c);
|
|
3372
|
|
3373 return HAL_OK;
|
|
3374 }
|
|
3375
|
|
3376 /**
|
|
3377 * @brief Interrupt Sub-Routine which handle the Interrupt Flags Slave Mode with Interrupt.
|
|
3378 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
3379 * the configuration information for the specified I2C.
|
|
3380 * @param ITFlags Interrupt flags to handle.
|
|
3381 * @param ITSources Interrupt sources enabled.
|
|
3382 * @retval HAL status
|
|
3383 */
|
|
3384 static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
|
|
3385 {
|
|
3386 /* Process locked */
|
|
3387 __HAL_LOCK(hi2c);
|
|
3388
|
|
3389 if(((ITFlags & I2C_FLAG_AF) != RESET) && ((ITSources & I2C_IT_NACKI) != RESET))
|
|
3390 {
|
|
3391 /* Check that I2C transfer finished */
|
|
3392 /* if yes, normal use case, a NACK is sent by the MASTER when Transfer is finished */
|
|
3393 /* Mean XferCount == 0*/
|
|
3394 /* So clear Flag NACKF only */
|
|
3395 if(hi2c->XferCount == 0U)
|
|
3396 {
|
|
3397 if(((hi2c->XferOptions == I2C_FIRST_AND_LAST_FRAME) || (hi2c->XferOptions == I2C_LAST_FRAME)) && \
|
|
3398 (hi2c->State == HAL_I2C_STATE_LISTEN))
|
|
3399 {
|
|
3400 /* Call I2C Listen complete process */
|
|
3401 I2C_ITListenCplt(hi2c, ITFlags);
|
|
3402 }
|
|
3403 else if((hi2c->XferOptions != I2C_NO_OPTION_FRAME) && (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN))
|
|
3404 {
|
|
3405 /* Clear NACK Flag */
|
|
3406 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
|
|
3407
|
|
3408 /* Flush TX register */
|
|
3409 I2C_Flush_TXDR(hi2c);
|
|
3410
|
|
3411 /* Last Byte is Transmitted */
|
|
3412 /* Call I2C Slave Sequential complete process */
|
|
3413 I2C_ITSlaveSequentialCplt(hi2c);
|
|
3414 }
|
|
3415 else
|
|
3416 {
|
|
3417 /* Clear NACK Flag */
|
|
3418 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
|
|
3419 }
|
|
3420 }
|
|
3421 else
|
|
3422 {
|
|
3423 /* if no, error use case, a Non-Acknowledge of last Data is generated by the MASTER*/
|
|
3424 /* Clear NACK Flag */
|
|
3425 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
|
|
3426
|
|
3427 /* Set ErrorCode corresponding to a Non-Acknowledge */
|
|
3428 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
|
|
3429 }
|
|
3430 }
|
|
3431 else if(((ITFlags & I2C_FLAG_RXNE) != RESET) && ((ITSources & I2C_IT_RXI) != RESET))
|
|
3432 {
|
|
3433 if(hi2c->XferCount > 0U)
|
|
3434 {
|
|
3435 /* Read data from RXDR */
|
|
3436 (*hi2c->pBuffPtr++) = hi2c->Instance->RXDR;
|
|
3437 hi2c->XferSize--;
|
|
3438 hi2c->XferCount--;
|
|
3439 }
|
|
3440
|
|
3441 if((hi2c->XferCount == 0U) && \
|
|
3442 (hi2c->XferOptions != I2C_NO_OPTION_FRAME))
|
|
3443 {
|
|
3444 /* Call I2C Slave Sequential complete process */
|
|
3445 I2C_ITSlaveSequentialCplt(hi2c);
|
|
3446 }
|
|
3447 }
|
|
3448 else if(((ITFlags & I2C_FLAG_ADDR) != RESET) && ((ITSources & I2C_IT_ADDRI) != RESET))
|
|
3449 {
|
|
3450 I2C_ITAddrCplt(hi2c, ITFlags);
|
|
3451 }
|
|
3452 else if(((ITFlags & I2C_FLAG_TXIS) != RESET) && ((ITSources & I2C_IT_TXI) != RESET))
|
|
3453 {
|
|
3454 /* Write data to TXDR only if XferCount not reach "0" */
|
|
3455 /* A TXIS flag can be set, during STOP treatment */
|
|
3456 /* Check if all Datas have already been sent */
|
|
3457 /* If it is the case, this last write in TXDR is not sent, correspond to a dummy TXIS event */
|
|
3458 if(hi2c->XferCount > 0U)
|
|
3459 {
|
|
3460 /* Write data to TXDR */
|
|
3461 hi2c->Instance->TXDR = (*hi2c->pBuffPtr++);
|
|
3462 hi2c->XferCount--;
|
|
3463 hi2c->XferSize--;
|
|
3464 }
|
|
3465 else
|
|
3466 {
|
|
3467 if((hi2c->XferOptions == I2C_NEXT_FRAME) || (hi2c->XferOptions == I2C_FIRST_FRAME))
|
|
3468 {
|
|
3469 /* Last Byte is Transmitted */
|
|
3470 /* Call I2C Slave Sequential complete process */
|
|
3471 I2C_ITSlaveSequentialCplt(hi2c);
|
|
3472 }
|
|
3473 }
|
|
3474 }
|
|
3475
|
|
3476 /* Check if STOPF is set */
|
|
3477 if(((ITFlags & I2C_FLAG_STOPF) != RESET) && ((ITSources & I2C_IT_STOPI) != RESET))
|
|
3478 {
|
|
3479 /* Call I2C Slave complete process */
|
|
3480 I2C_ITSlaveCplt(hi2c, ITFlags);
|
|
3481 }
|
|
3482
|
|
3483 /* Process Unlocked */
|
|
3484 __HAL_UNLOCK(hi2c);
|
|
3485
|
|
3486 return HAL_OK;
|
|
3487 }
|
|
3488
|
|
3489 /**
|
|
3490 * @brief Interrupt Sub-Routine which handle the Interrupt Flags Master Mode with DMA.
|
|
3491 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
3492 * the configuration information for the specified I2C.
|
|
3493 * @param ITFlags Interrupt flags to handle.
|
|
3494 * @param ITSources Interrupt sources enabled.
|
|
3495 * @retval HAL status
|
|
3496 */
|
|
3497 static HAL_StatusTypeDef I2C_Master_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
|
|
3498 {
|
|
3499 uint16_t devaddress = 0U;
|
|
3500 uint32_t xfermode = 0U;
|
|
3501
|
|
3502 /* Process Locked */
|
|
3503 __HAL_LOCK(hi2c);
|
|
3504
|
|
3505 if(((ITFlags & I2C_FLAG_AF) != RESET) && ((ITSources & I2C_IT_NACKI) != RESET))
|
|
3506 {
|
|
3507 /* Clear NACK Flag */
|
|
3508 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
|
|
3509
|
|
3510 /* Set corresponding Error Code */
|
|
3511 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
|
|
3512
|
|
3513 /* No need to generate STOP, it is automatically done */
|
|
3514 /* But enable STOP interrupt, to treat it */
|
|
3515 /* Error callback will be send during stop flag treatment */
|
|
3516 I2C_Enable_IRQ(hi2c, I2C_XFER_CPLT_IT);
|
|
3517
|
|
3518 /* Flush TX register */
|
|
3519 I2C_Flush_TXDR(hi2c);
|
|
3520 }
|
|
3521 else if(((ITFlags & I2C_FLAG_TCR) != RESET) && ((ITSources & I2C_IT_TCI) != RESET))
|
|
3522 {
|
|
3523 /* Disable TC interrupt */
|
|
3524 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_TCI);
|
|
3525
|
|
3526 if(hi2c->XferCount != 0U)
|
|
3527 {
|
|
3528 /* Recover Slave address */
|
|
3529 devaddress = (hi2c->Instance->CR2 & I2C_CR2_SADD);
|
|
3530
|
|
3531 /* Prepare the new XferSize to transfer */
|
|
3532 if(hi2c->XferCount > MAX_NBYTE_SIZE)
|
|
3533 {
|
|
3534 hi2c->XferSize = MAX_NBYTE_SIZE;
|
|
3535 xfermode = I2C_RELOAD_MODE;
|
|
3536 }
|
|
3537 else
|
|
3538 {
|
|
3539 hi2c->XferSize = hi2c->XferCount;
|
|
3540 xfermode = I2C_AUTOEND_MODE;
|
|
3541 }
|
|
3542
|
|
3543 /* Set the new XferSize in Nbytes register */
|
|
3544 I2C_TransferConfig(hi2c, devaddress, hi2c->XferSize, xfermode, I2C_NO_STARTSTOP);
|
|
3545
|
|
3546 /* Update XferCount value */
|
|
3547 hi2c->XferCount -= hi2c->XferSize;
|
|
3548
|
|
3549 /* Enable DMA Request */
|
|
3550 if(hi2c->State == HAL_I2C_STATE_BUSY_RX)
|
|
3551 {
|
|
3552 hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN;
|
|
3553 }
|
|
3554 else
|
|
3555 {
|
|
3556 hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;
|
|
3557 }
|
|
3558 }
|
|
3559 else
|
|
3560 {
|
|
3561 /* Wrong size Status regarding TCR flag event */
|
|
3562 /* Call the corresponding callback to inform upper layer of End of Transfer */
|
|
3563 I2C_ITError(hi2c, HAL_I2C_ERROR_SIZE);
|
|
3564 }
|
|
3565 }
|
|
3566 else if(((ITFlags & I2C_FLAG_STOPF) != RESET) && ((ITSources & I2C_IT_STOPI) != RESET))
|
|
3567 {
|
|
3568 /* Call I2C Master complete process */
|
|
3569 I2C_ITMasterCplt(hi2c, ITFlags);
|
|
3570 }
|
|
3571
|
|
3572 /* Process Unlocked */
|
|
3573 __HAL_UNLOCK(hi2c);
|
|
3574
|
|
3575 return HAL_OK;
|
|
3576 }
|
|
3577
|
|
3578 /**
|
|
3579 * @brief Interrupt Sub-Routine which handle the Interrupt Flags Slave Mode with DMA.
|
|
3580 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
3581 * the configuration information for the specified I2C.
|
|
3582 * @param ITFlags Interrupt flags to handle.
|
|
3583 * @param ITSources Interrupt sources enabled.
|
|
3584 * @retval HAL status
|
|
3585 */
|
|
3586 static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
|
|
3587 {
|
|
3588 /* Process locked */
|
|
3589 __HAL_LOCK(hi2c);
|
|
3590
|
|
3591 if(((ITFlags & I2C_FLAG_AF) != RESET) && ((ITSources & I2C_IT_NACKI) != RESET))
|
|
3592 {
|
|
3593 /* Check that I2C transfer finished */
|
|
3594 /* if yes, normal use case, a NACK is sent by the MASTER when Transfer is finished */
|
|
3595 /* Mean XferCount == 0 */
|
|
3596 /* So clear Flag NACKF only */
|
|
3597 if(I2C_GET_DMA_REMAIN_DATA(hi2c) == 0U)
|
|
3598 {
|
|
3599 /* Clear NACK Flag */
|
|
3600 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
|
|
3601 }
|
|
3602 else
|
|
3603 {
|
|
3604 /* if no, error use case, a Non-Acknowledge of last Data is generated by the MASTER*/
|
|
3605 /* Clear NACK Flag */
|
|
3606 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
|
|
3607
|
|
3608 /* Set ErrorCode corresponding to a Non-Acknowledge */
|
|
3609 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
|
|
3610 }
|
|
3611 }
|
|
3612 else if(((ITFlags & I2C_FLAG_ADDR) != RESET) && ((ITSources & I2C_IT_ADDRI) != RESET))
|
|
3613 {
|
|
3614 /* Clear ADDR flag */
|
|
3615 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);
|
|
3616 }
|
|
3617 else if(((ITFlags & I2C_FLAG_STOPF) != RESET) && ((ITSources & I2C_IT_STOPI) != RESET))
|
|
3618 {
|
|
3619 /* Call I2C Slave complete process */
|
|
3620 I2C_ITSlaveCplt(hi2c, ITFlags);
|
|
3621 }
|
|
3622
|
|
3623 /* Process Unlocked */
|
|
3624 __HAL_UNLOCK(hi2c);
|
|
3625
|
|
3626 return HAL_OK;
|
|
3627 }
|
|
3628
|
|
3629 /**
|
|
3630 * @brief Master sends target device address followed by internal memory address for write request.
|
|
3631 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
3632 * the configuration information for the specified I2C.
|
|
3633 * @param DevAddress Target device address: The device 7 bits address value
|
|
3634 * in datasheet must be shift at right before call interface
|
|
3635 * @param MemAddress Internal memory address
|
|
3636 * @param MemAddSize Size of internal memory address
|
|
3637 * @param Timeout Timeout duration
|
|
3638 * @param Tickstart Tick start value
|
|
3639 * @retval HAL status
|
|
3640 */
|
|
3641 static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart)
|
|
3642 {
|
|
3643 I2C_TransferConfig(hi2c,DevAddress,MemAddSize, I2C_RELOAD_MODE, I2C_GENERATE_START_WRITE);
|
|
3644
|
|
3645 /* Wait until TXIS flag is set */
|
|
3646 if(I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
|
|
3647 {
|
|
3648 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
3649 {
|
|
3650 return HAL_ERROR;
|
|
3651 }
|
|
3652 else
|
|
3653 {
|
|
3654 return HAL_TIMEOUT;
|
|
3655 }
|
|
3656 }
|
|
3657
|
|
3658 /* If Memory address size is 8Bit */
|
|
3659 if(MemAddSize == I2C_MEMADD_SIZE_8BIT)
|
|
3660 {
|
|
3661 /* Send Memory Address */
|
|
3662 hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress);
|
|
3663 }
|
|
3664 /* If Memory address size is 16Bit */
|
|
3665 else
|
|
3666 {
|
|
3667 /* Send MSB of Memory Address */
|
|
3668 hi2c->Instance->TXDR = I2C_MEM_ADD_MSB(MemAddress);
|
|
3669
|
|
3670 /* Wait until TXIS flag is set */
|
|
3671 if(I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
|
|
3672 {
|
|
3673 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
3674 {
|
|
3675 return HAL_ERROR;
|
|
3676 }
|
|
3677 else
|
|
3678 {
|
|
3679 return HAL_TIMEOUT;
|
|
3680 }
|
|
3681 }
|
|
3682
|
|
3683 /* Send LSB of Memory Address */
|
|
3684 hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress);
|
|
3685 }
|
|
3686
|
|
3687 /* Wait until TCR flag is set */
|
|
3688 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, Tickstart) != HAL_OK)
|
|
3689 {
|
|
3690 return HAL_TIMEOUT;
|
|
3691 }
|
|
3692
|
|
3693 return HAL_OK;
|
|
3694 }
|
|
3695
|
|
3696 /**
|
|
3697 * @brief Master sends target device address followed by internal memory address for read request.
|
|
3698 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
3699 * the configuration information for the specified I2C.
|
|
3700 * @param DevAddress Target device address: The device 7 bits address value
|
|
3701 * in datasheet must be shift at right before call interface
|
|
3702 * @param MemAddress Internal memory address
|
|
3703 * @param MemAddSize Size of internal memory address
|
|
3704 * @param Timeout Timeout duration
|
|
3705 * @param Tickstart Tick start value
|
|
3706 * @retval HAL status
|
|
3707 */
|
|
3708 static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart)
|
|
3709 {
|
|
3710 I2C_TransferConfig(hi2c,DevAddress,MemAddSize, I2C_SOFTEND_MODE, I2C_GENERATE_START_WRITE);
|
|
3711
|
|
3712 /* Wait until TXIS flag is set */
|
|
3713 if(I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
|
|
3714 {
|
|
3715 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
3716 {
|
|
3717 return HAL_ERROR;
|
|
3718 }
|
|
3719 else
|
|
3720 {
|
|
3721 return HAL_TIMEOUT;
|
|
3722 }
|
|
3723 }
|
|
3724
|
|
3725 /* If Memory address size is 8Bit */
|
|
3726 if(MemAddSize == I2C_MEMADD_SIZE_8BIT)
|
|
3727 {
|
|
3728 /* Send Memory Address */
|
|
3729 hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress);
|
|
3730 }
|
|
3731 /* If Memory address size is 16Bit */
|
|
3732 else
|
|
3733 {
|
|
3734 /* Send MSB of Memory Address */
|
|
3735 hi2c->Instance->TXDR = I2C_MEM_ADD_MSB(MemAddress);
|
|
3736
|
|
3737 /* Wait until TXIS flag is set */
|
|
3738 if(I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
|
|
3739 {
|
|
3740 if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
|
|
3741 {
|
|
3742 return HAL_ERROR;
|
|
3743 }
|
|
3744 else
|
|
3745 {
|
|
3746 return HAL_TIMEOUT;
|
|
3747 }
|
|
3748 }
|
|
3749
|
|
3750 /* Send LSB of Memory Address */
|
|
3751 hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress);
|
|
3752 }
|
|
3753
|
|
3754 /* Wait until TC flag is set */
|
|
3755 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TC, RESET, Timeout, Tickstart) != HAL_OK)
|
|
3756 {
|
|
3757 return HAL_TIMEOUT;
|
|
3758 }
|
|
3759
|
|
3760 return HAL_OK;
|
|
3761 }
|
|
3762
|
|
3763 /**
|
|
3764 * @brief I2C Address complete process callback.
|
|
3765 * @param hi2c I2C handle.
|
|
3766 * @param ITFlags Interrupt flags to handle.
|
|
3767 * @retval None
|
|
3768 */
|
|
3769 static void I2C_ITAddrCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags)
|
|
3770 {
|
|
3771 uint8_t transferdirection = 0U;
|
|
3772 uint16_t slaveaddrcode = 0U;
|
|
3773 uint16_t ownadd1code = 0U;
|
|
3774 uint16_t ownadd2code = 0U;
|
|
3775
|
|
3776 /* Prevent unused argument(s) compilation warning */
|
|
3777 UNUSED(ITFlags);
|
|
3778
|
|
3779 /* In case of Listen state, need to inform upper layer of address match code event */
|
|
3780 if((hi2c->State & HAL_I2C_STATE_LISTEN) == HAL_I2C_STATE_LISTEN)
|
|
3781 {
|
|
3782 transferdirection = I2C_GET_DIR(hi2c);
|
|
3783 slaveaddrcode = I2C_GET_ADDR_MATCH(hi2c);
|
|
3784 ownadd1code = I2C_GET_OWN_ADDRESS1(hi2c);
|
|
3785 ownadd2code = I2C_GET_OWN_ADDRESS2(hi2c);
|
|
3786
|
|
3787 /* If 10bits addressing mode is selected */
|
|
3788 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT)
|
|
3789 {
|
|
3790 if((slaveaddrcode & SlaveAddr_MSK) == ((ownadd1code >> SlaveAddr_SHIFT) & SlaveAddr_MSK))
|
|
3791 {
|
|
3792 slaveaddrcode = ownadd1code;
|
|
3793 hi2c->AddrEventCount++;
|
|
3794 if(hi2c->AddrEventCount == 2U)
|
|
3795 {
|
|
3796 /* Reset Address Event counter */
|
|
3797 hi2c->AddrEventCount = 0U;
|
|
3798
|
|
3799 /* Clear ADDR flag */
|
|
3800 __HAL_I2C_CLEAR_FLAG(hi2c,I2C_FLAG_ADDR);
|
|
3801
|
|
3802 /* Process Unlocked */
|
|
3803 __HAL_UNLOCK(hi2c);
|
|
3804
|
|
3805 /* Call Slave Addr callback */
|
|
3806 HAL_I2C_AddrCallback(hi2c, transferdirection, slaveaddrcode);
|
|
3807 }
|
|
3808 }
|
|
3809 else
|
|
3810 {
|
|
3811 slaveaddrcode = ownadd2code;
|
|
3812
|
|
3813 /* Disable ADDR Interrupts */
|
|
3814 I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT);
|
|
3815
|
|
3816 /* Process Unlocked */
|
|
3817 __HAL_UNLOCK(hi2c);
|
|
3818
|
|
3819 /* Call Slave Addr callback */
|
|
3820 HAL_I2C_AddrCallback(hi2c, transferdirection, slaveaddrcode);
|
|
3821 }
|
|
3822 }
|
|
3823 /* else 7 bits addressing mode is selected */
|
|
3824 else
|
|
3825 {
|
|
3826 /* Disable ADDR Interrupts */
|
|
3827 I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT);
|
|
3828
|
|
3829 /* Process Unlocked */
|
|
3830 __HAL_UNLOCK(hi2c);
|
|
3831
|
|
3832 /* Call Slave Addr callback */
|
|
3833 HAL_I2C_AddrCallback(hi2c, transferdirection, slaveaddrcode);
|
|
3834 }
|
|
3835 }
|
|
3836 /* Else clear address flag only */
|
|
3837 else
|
|
3838 {
|
|
3839 /* Clear ADDR flag */
|
|
3840 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);
|
|
3841
|
|
3842 /* Process Unlocked */
|
|
3843 __HAL_UNLOCK(hi2c);
|
|
3844 }
|
|
3845 }
|
|
3846
|
|
3847 /**
|
|
3848 * @brief I2C Master sequential complete process.
|
|
3849 * @param hi2c I2C handle.
|
|
3850 * @retval None
|
|
3851 */
|
|
3852 static void I2C_ITMasterSequentialCplt(I2C_HandleTypeDef *hi2c)
|
|
3853 {
|
|
3854 /* Reset I2C handle mode */
|
|
3855 hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
3856
|
|
3857 /* No Generate Stop, to permit restart mode */
|
|
3858 /* The stop will be done at the end of transfer, when I2C_AUTOEND_MODE enable */
|
|
3859 if (hi2c->State == HAL_I2C_STATE_BUSY_TX)
|
|
3860 {
|
|
3861 hi2c->State = HAL_I2C_STATE_READY;
|
|
3862 hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX;
|
|
3863 hi2c->XferISR = NULL;
|
|
3864
|
|
3865 /* Disable Interrupts */
|
|
3866 I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT);
|
|
3867
|
|
3868 /* Process Unlocked */
|
|
3869 __HAL_UNLOCK(hi2c);
|
|
3870
|
|
3871 /* Call the corresponding callback to inform upper layer of End of Transfer */
|
|
3872 HAL_I2C_MasterTxCpltCallback(hi2c);
|
|
3873 }
|
|
3874 /* hi2c->State == HAL_I2C_STATE_BUSY_RX */
|
|
3875 else
|
|
3876 {
|
|
3877 hi2c->State = HAL_I2C_STATE_READY;
|
|
3878 hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX;
|
|
3879 hi2c->XferISR = NULL;
|
|
3880
|
|
3881 /* Disable Interrupts */
|
|
3882 I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT);
|
|
3883
|
|
3884 /* Process Unlocked */
|
|
3885 __HAL_UNLOCK(hi2c);
|
|
3886
|
|
3887 /* Call the corresponding callback to inform upper layer of End of Transfer */
|
|
3888 HAL_I2C_MasterRxCpltCallback(hi2c);
|
|
3889 }
|
|
3890 }
|
|
3891
|
|
3892 /**
|
|
3893 * @brief I2C Slave sequential complete process.
|
|
3894 * @param hi2c I2C handle.
|
|
3895 * @retval None
|
|
3896 */
|
|
3897 static void I2C_ITSlaveSequentialCplt(I2C_HandleTypeDef *hi2c)
|
|
3898 {
|
|
3899 /* Reset I2C handle mode */
|
|
3900 hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
3901
|
|
3902 if(hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN)
|
|
3903 {
|
|
3904 /* Remove HAL_I2C_STATE_SLAVE_BUSY_TX, keep only HAL_I2C_STATE_LISTEN */
|
|
3905 hi2c->State = HAL_I2C_STATE_LISTEN;
|
|
3906 hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX;
|
|
3907
|
|
3908 /* Disable Interrupts */
|
|
3909 I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT);
|
|
3910
|
|
3911 /* Process Unlocked */
|
|
3912 __HAL_UNLOCK(hi2c);
|
|
3913
|
|
3914 /* Call the Tx complete callback to inform upper layer of the end of transmit process */
|
|
3915 HAL_I2C_SlaveTxCpltCallback(hi2c);
|
|
3916 }
|
|
3917
|
|
3918 else if(hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN)
|
|
3919 {
|
|
3920 /* Remove HAL_I2C_STATE_SLAVE_BUSY_RX, keep only HAL_I2C_STATE_LISTEN */
|
|
3921 hi2c->State = HAL_I2C_STATE_LISTEN;
|
|
3922 hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX;
|
|
3923
|
|
3924 /* Disable Interrupts */
|
|
3925 I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT);
|
|
3926
|
|
3927 /* Process Unlocked */
|
|
3928 __HAL_UNLOCK(hi2c);
|
|
3929
|
|
3930 /* Call the Rx complete callback to inform upper layer of the end of receive process */
|
|
3931 HAL_I2C_SlaveRxCpltCallback(hi2c);
|
|
3932 }
|
|
3933 }
|
|
3934
|
|
3935 /**
|
|
3936 * @brief I2C Master complete process.
|
|
3937 * @param hi2c I2C handle.
|
|
3938 * @param ITFlags Interrupt flags to handle.
|
|
3939 * @retval None
|
|
3940 */
|
|
3941 static void I2C_ITMasterCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags)
|
|
3942 {
|
|
3943 /* Clear STOP Flag */
|
|
3944 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
|
|
3945
|
|
3946 /* Clear Configuration Register 2 */
|
|
3947 I2C_RESET_CR2(hi2c);
|
|
3948
|
|
3949 /* Reset handle parameters */
|
|
3950 hi2c->PreviousState = I2C_STATE_NONE;
|
|
3951 hi2c->XferISR = NULL;
|
|
3952 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
|
|
3953
|
|
3954 if((ITFlags & I2C_FLAG_AF) != RESET)
|
|
3955 {
|
|
3956 /* Clear NACK Flag */
|
|
3957 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
|
|
3958
|
|
3959 /* Set acknowledge error code */
|
|
3960 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
|
|
3961 }
|
|
3962
|
|
3963 /* Flush TX register */
|
|
3964 I2C_Flush_TXDR(hi2c);
|
|
3965
|
|
3966 /* Disable Interrupts */
|
|
3967 I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT| I2C_XFER_RX_IT);
|
|
3968
|
|
3969 /* Call the corresponding callback to inform upper layer of End of Transfer */
|
|
3970 if((hi2c->ErrorCode != HAL_I2C_ERROR_NONE) || (hi2c->State == HAL_I2C_STATE_ABORT))
|
|
3971 {
|
|
3972 /* Call the corresponding callback to inform upper layer of End of Transfer */
|
|
3973 I2C_ITError(hi2c, hi2c->ErrorCode);
|
|
3974 }
|
|
3975 /* hi2c->State == HAL_I2C_STATE_BUSY_TX */
|
|
3976 else if(hi2c->State == HAL_I2C_STATE_BUSY_TX)
|
|
3977 {
|
|
3978 hi2c->State = HAL_I2C_STATE_READY;
|
|
3979
|
|
3980 if (hi2c->Mode == HAL_I2C_MODE_MEM)
|
|
3981 {
|
|
3982 hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
3983
|
|
3984 /* Process Unlocked */
|
|
3985 __HAL_UNLOCK(hi2c);
|
|
3986
|
|
3987 /* Call the corresponding callback to inform upper layer of End of Transfer */
|
|
3988 HAL_I2C_MemTxCpltCallback(hi2c);
|
|
3989 }
|
|
3990 else
|
|
3991 {
|
|
3992 hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
3993
|
|
3994 /* Process Unlocked */
|
|
3995 __HAL_UNLOCK(hi2c);
|
|
3996
|
|
3997 /* Call the corresponding callback to inform upper layer of End of Transfer */
|
|
3998 HAL_I2C_MasterTxCpltCallback(hi2c);
|
|
3999 }
|
|
4000 }
|
|
4001 /* hi2c->State == HAL_I2C_STATE_BUSY_RX */
|
|
4002 else if(hi2c->State == HAL_I2C_STATE_BUSY_RX)
|
|
4003 {
|
|
4004 hi2c->State = HAL_I2C_STATE_READY;
|
|
4005
|
|
4006 if (hi2c->Mode == HAL_I2C_MODE_MEM)
|
|
4007 {
|
|
4008 hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
4009
|
|
4010 /* Process Unlocked */
|
|
4011 __HAL_UNLOCK(hi2c);
|
|
4012
|
|
4013 HAL_I2C_MemRxCpltCallback(hi2c);
|
|
4014 }
|
|
4015 else
|
|
4016 {
|
|
4017 hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
4018
|
|
4019 /* Process Unlocked */
|
|
4020 __HAL_UNLOCK(hi2c);
|
|
4021
|
|
4022 HAL_I2C_MasterRxCpltCallback(hi2c);
|
|
4023 }
|
|
4024 }
|
|
4025 }
|
|
4026
|
|
4027 /**
|
|
4028 * @brief I2C Slave complete process.
|
|
4029 * @param hi2c I2C handle.
|
|
4030 * @param ITFlags Interrupt flags to handle.
|
|
4031 * @retval None
|
|
4032 */
|
|
4033 static void I2C_ITSlaveCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags)
|
|
4034 {
|
|
4035 /* Clear STOP Flag */
|
|
4036 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
|
|
4037
|
|
4038 /* Clear ADDR flag */
|
|
4039 __HAL_I2C_CLEAR_FLAG(hi2c,I2C_FLAG_ADDR);
|
|
4040
|
|
4041 /* Disable all interrupts */
|
|
4042 I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_TX_IT | I2C_XFER_RX_IT);
|
|
4043
|
|
4044 /* Disable Address Acknowledge */
|
|
4045 hi2c->Instance->CR2 |= I2C_CR2_NACK;
|
|
4046
|
|
4047 /* Clear Configuration Register 2 */
|
|
4048 I2C_RESET_CR2(hi2c);
|
|
4049
|
|
4050 /* Flush TX register */
|
|
4051 I2C_Flush_TXDR(hi2c);
|
|
4052
|
|
4053 /* If a DMA is ongoing, Update handle size context */
|
|
4054 if(((hi2c->Instance->CR1 & I2C_CR1_TXDMAEN) == I2C_CR1_TXDMAEN) ||
|
|
4055 ((hi2c->Instance->CR1 & I2C_CR1_RXDMAEN) == I2C_CR1_RXDMAEN))
|
|
4056 {
|
|
4057 hi2c->XferCount = I2C_GET_DMA_REMAIN_DATA(hi2c);
|
|
4058 }
|
|
4059
|
|
4060 /* All data are not transferred, so set error code accordingly */
|
|
4061 if(hi2c->XferCount != 0U)
|
|
4062 {
|
|
4063 /* Set ErrorCode corresponding to a Non-Acknowledge */
|
|
4064 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
|
|
4065 }
|
|
4066
|
|
4067 /* Store Last receive data if any */
|
|
4068 if(((ITFlags & I2C_FLAG_RXNE) != RESET))
|
|
4069 {
|
|
4070 /* Read data from RXDR */
|
|
4071 (*hi2c->pBuffPtr++) = hi2c->Instance->RXDR;
|
|
4072
|
|
4073 if((hi2c->XferSize > 0U))
|
|
4074 {
|
|
4075 hi2c->XferSize--;
|
|
4076 hi2c->XferCount--;
|
|
4077
|
|
4078 /* Set ErrorCode corresponding to a Non-Acknowledge */
|
|
4079 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
|
|
4080 }
|
|
4081 }
|
|
4082
|
|
4083 hi2c->PreviousState = I2C_STATE_NONE;
|
|
4084 hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
4085 hi2c->XferISR = NULL;
|
|
4086
|
|
4087 if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
|
|
4088 {
|
|
4089 /* Call the corresponding callback to inform upper layer of End of Transfer */
|
|
4090 I2C_ITError(hi2c, hi2c->ErrorCode);
|
|
4091
|
|
4092 /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */
|
|
4093 if(hi2c->State == HAL_I2C_STATE_LISTEN)
|
|
4094 {
|
|
4095 /* Call I2C Listen complete process */
|
|
4096 I2C_ITListenCplt(hi2c, ITFlags);
|
|
4097 }
|
|
4098 }
|
|
4099 else if(hi2c->XferOptions != I2C_NO_OPTION_FRAME)
|
|
4100 {
|
|
4101 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
|
|
4102 hi2c->State = HAL_I2C_STATE_READY;
|
|
4103
|
|
4104 /* Process Unlocked */
|
|
4105 __HAL_UNLOCK(hi2c);
|
|
4106
|
|
4107 /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */
|
|
4108 HAL_I2C_ListenCpltCallback(hi2c);
|
|
4109 }
|
|
4110 /* Call the corresponding callback to inform upper layer of End of Transfer */
|
|
4111 else if(hi2c->State == HAL_I2C_STATE_BUSY_RX)
|
|
4112 {
|
|
4113 hi2c->State = HAL_I2C_STATE_READY;
|
|
4114
|
|
4115 /* Process Unlocked */
|
|
4116 __HAL_UNLOCK(hi2c);
|
|
4117
|
|
4118 /* Call the Slave Rx Complete callback */
|
|
4119 HAL_I2C_SlaveRxCpltCallback(hi2c);
|
|
4120 }
|
|
4121 else
|
|
4122 {
|
|
4123 hi2c->State = HAL_I2C_STATE_READY;
|
|
4124
|
|
4125 /* Process Unlocked */
|
|
4126 __HAL_UNLOCK(hi2c);
|
|
4127
|
|
4128 /* Call the Slave Tx Complete callback */
|
|
4129 HAL_I2C_SlaveTxCpltCallback(hi2c);
|
|
4130 }
|
|
4131 }
|
|
4132
|
|
4133 /**
|
|
4134 * @brief I2C Listen complete process.
|
|
4135 * @param hi2c I2C handle.
|
|
4136 * @param ITFlags Interrupt flags to handle.
|
|
4137 * @retval None
|
|
4138 */
|
|
4139 static void I2C_ITListenCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags)
|
|
4140 {
|
|
4141 /* Reset handle parameters */
|
|
4142 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
|
|
4143 hi2c->PreviousState = I2C_STATE_NONE;
|
|
4144 hi2c->State = HAL_I2C_STATE_READY;
|
|
4145 hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
4146 hi2c->XferISR = NULL;
|
|
4147
|
|
4148 /* Store Last receive data if any */
|
|
4149 if(((ITFlags & I2C_FLAG_RXNE) != RESET))
|
|
4150 {
|
|
4151 /* Read data from RXDR */
|
|
4152 (*hi2c->pBuffPtr++) = hi2c->Instance->RXDR;
|
|
4153
|
|
4154 if((hi2c->XferSize > 0U))
|
|
4155 {
|
|
4156 hi2c->XferSize--;
|
|
4157 hi2c->XferCount--;
|
|
4158
|
|
4159 /* Set ErrorCode corresponding to a Non-Acknowledge */
|
|
4160 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
|
|
4161 }
|
|
4162 }
|
|
4163
|
|
4164 /* Disable all Interrupts*/
|
|
4165 I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_RX_IT | I2C_XFER_TX_IT);
|
|
4166
|
|
4167 /* Clear NACK Flag */
|
|
4168 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
|
|
4169
|
|
4170 /* Process Unlocked */
|
|
4171 __HAL_UNLOCK(hi2c);
|
|
4172
|
|
4173 /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */
|
|
4174 HAL_I2C_ListenCpltCallback(hi2c);
|
|
4175 }
|
|
4176
|
|
4177 /**
|
|
4178 * @brief I2C interrupts error process.
|
|
4179 * @param hi2c I2C handle.
|
|
4180 * @param ErrorCode Error code to handle.
|
|
4181 * @retval None
|
|
4182 */
|
|
4183 static void I2C_ITError(I2C_HandleTypeDef *hi2c, uint32_t ErrorCode)
|
|
4184 {
|
|
4185 /* Reset handle parameters */
|
|
4186 hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
4187 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
|
|
4188 hi2c->XferCount = 0U;
|
|
4189
|
|
4190 /* Set new error code */
|
|
4191 hi2c->ErrorCode |= ErrorCode;
|
|
4192
|
|
4193 /* Disable Interrupts */
|
|
4194 if((hi2c->State == HAL_I2C_STATE_LISTEN) ||
|
|
4195 (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN) ||
|
|
4196 (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN))
|
|
4197 {
|
|
4198 /* Disable all interrupts, except interrupts related to LISTEN state */
|
|
4199 I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT | I2C_XFER_TX_IT);
|
|
4200
|
|
4201 /* keep HAL_I2C_STATE_LISTEN if set */
|
|
4202 hi2c->State = HAL_I2C_STATE_LISTEN;
|
|
4203 hi2c->PreviousState = I2C_STATE_NONE;
|
|
4204 hi2c->XferISR = I2C_Slave_ISR_IT;
|
|
4205 }
|
|
4206 else
|
|
4207 {
|
|
4208 /* Disable all interrupts */
|
|
4209 I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_RX_IT | I2C_XFER_TX_IT);
|
|
4210
|
|
4211 /* If state is an abort treatment on goind, don't change state */
|
|
4212 /* This change will be do later */
|
|
4213 if(hi2c->State != HAL_I2C_STATE_ABORT)
|
|
4214 {
|
|
4215 /* Set HAL_I2C_STATE_READY */
|
|
4216 hi2c->State = HAL_I2C_STATE_READY;
|
|
4217 }
|
|
4218 hi2c->PreviousState = I2C_STATE_NONE;
|
|
4219 hi2c->XferISR = NULL;
|
|
4220 }
|
|
4221
|
|
4222 /* Abort DMA TX transfer if any */
|
|
4223 if((hi2c->Instance->CR1 & I2C_CR1_TXDMAEN) == I2C_CR1_TXDMAEN)
|
|
4224 {
|
|
4225 hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN;
|
|
4226
|
|
4227 /* Set the I2C DMA Abort callback :
|
|
4228 will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */
|
|
4229 hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort;
|
|
4230
|
|
4231 /* Process Unlocked */
|
|
4232 __HAL_UNLOCK(hi2c);
|
|
4233
|
|
4234 /* Abort DMA TX */
|
|
4235 if(HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK)
|
|
4236 {
|
|
4237 /* Call Directly XferAbortCallback function in case of error */
|
|
4238 hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx);
|
|
4239 }
|
|
4240 }
|
|
4241 /* Abort DMA RX transfer if any */
|
|
4242 else if((hi2c->Instance->CR1 & I2C_CR1_RXDMAEN) == I2C_CR1_RXDMAEN)
|
|
4243 {
|
|
4244 hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN;
|
|
4245
|
|
4246 /* Set the I2C DMA Abort callback :
|
|
4247 will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */
|
|
4248 hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort;
|
|
4249
|
|
4250 /* Process Unlocked */
|
|
4251 __HAL_UNLOCK(hi2c);
|
|
4252
|
|
4253 /* Abort DMA RX */
|
|
4254 if(HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK)
|
|
4255 {
|
|
4256 /* Call Directly hi2c->hdmarx->XferAbortCallback function in case of error */
|
|
4257 hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx);
|
|
4258 }
|
|
4259 }
|
|
4260 else if(hi2c->State == HAL_I2C_STATE_ABORT)
|
|
4261 {
|
|
4262 hi2c->State = HAL_I2C_STATE_READY;
|
|
4263
|
|
4264 /* Process Unlocked */
|
|
4265 __HAL_UNLOCK(hi2c);
|
|
4266
|
|
4267 /* Call the corresponding callback to inform upper layer of End of Transfer */
|
|
4268 HAL_I2C_AbortCpltCallback(hi2c);
|
|
4269 }
|
|
4270 else
|
|
4271 {
|
|
4272 /* Process Unlocked */
|
|
4273 __HAL_UNLOCK(hi2c);
|
|
4274
|
|
4275 /* Call the corresponding callback to inform upper layer of End of Transfer */
|
|
4276 HAL_I2C_ErrorCallback(hi2c);
|
|
4277 }
|
|
4278 }
|
|
4279
|
|
4280 /**
|
|
4281 * @brief I2C Tx data register flush process.
|
|
4282 * @param hi2c I2C handle.
|
|
4283 * @retval None
|
|
4284 */
|
|
4285 static void I2C_Flush_TXDR(I2C_HandleTypeDef *hi2c)
|
|
4286 {
|
|
4287 /* If a pending TXIS flag is set */
|
|
4288 /* Write a dummy data in TXDR to clear it */
|
|
4289 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXIS) != RESET)
|
|
4290 {
|
|
4291 hi2c->Instance->TXDR = 0x00U;
|
|
4292 }
|
|
4293
|
|
4294 /* Flush TX register if not empty */
|
|
4295 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE) == RESET)
|
|
4296 {
|
|
4297 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_TXE);
|
|
4298 }
|
|
4299 }
|
|
4300
|
|
4301 /**
|
|
4302 * @brief DMA I2C master transmit process complete callback.
|
|
4303 * @param hdma DMA handle
|
|
4304 * @retval None
|
|
4305 */
|
|
4306 static void I2C_DMAMasterTransmitCplt(DMA_HandleTypeDef *hdma)
|
|
4307 {
|
|
4308 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
|
|
4309
|
|
4310 /* Disable DMA Request */
|
|
4311 hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN;
|
|
4312
|
|
4313 /* If last transfer, enable STOP interrupt */
|
|
4314 if(hi2c->XferCount == 0U)
|
|
4315 {
|
|
4316 /* Enable STOP interrupt */
|
|
4317 I2C_Enable_IRQ(hi2c, I2C_XFER_CPLT_IT);
|
|
4318 }
|
|
4319 /* else prepare a new DMA transfer and enable TCReload interrupt */
|
|
4320 else
|
|
4321 {
|
|
4322 /* Update Buffer pointer */
|
|
4323 hi2c->pBuffPtr += hi2c->XferSize;
|
|
4324
|
|
4325 /* Set the XferSize to transfer */
|
|
4326 if(hi2c->XferCount > MAX_NBYTE_SIZE)
|
|
4327 {
|
|
4328 hi2c->XferSize = MAX_NBYTE_SIZE;
|
|
4329 }
|
|
4330 else
|
|
4331 {
|
|
4332 hi2c->XferSize = hi2c->XferCount;
|
|
4333 }
|
|
4334
|
|
4335 /* Enable the DMA channel */
|
|
4336 HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->TXDR, hi2c->XferSize);
|
|
4337
|
|
4338 /* Enable TC interrupts */
|
|
4339 I2C_Enable_IRQ(hi2c, I2C_XFER_RELOAD_IT);
|
|
4340 }
|
|
4341 }
|
|
4342
|
|
4343 /**
|
|
4344 * @brief DMA I2C slave transmit process complete callback.
|
|
4345 * @param hdma DMA handle
|
|
4346 * @retval None
|
|
4347 */
|
|
4348 static void I2C_DMASlaveTransmitCplt(DMA_HandleTypeDef *hdma)
|
|
4349 {
|
|
4350 /* Prevent unused argument(s) compilation warning */
|
|
4351 UNUSED(hdma);
|
|
4352
|
|
4353 /* No specific action, Master fully manage the generation of STOP condition */
|
|
4354 /* Mean that this generation can arrive at any time, at the end or during DMA process */
|
|
4355 /* So STOP condition should be manage through Interrupt treatment */
|
|
4356 }
|
|
4357
|
|
4358 /**
|
|
4359 * @brief DMA I2C master receive process complete callback.
|
|
4360 * @param hdma DMA handle
|
|
4361 * @retval None
|
|
4362 */
|
|
4363 static void I2C_DMAMasterReceiveCplt(DMA_HandleTypeDef *hdma)
|
|
4364 {
|
|
4365 I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
|
|
4366
|
|
4367 /* Disable DMA Request */
|
|
4368 hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN;
|
|
4369
|
|
4370 /* If last transfer, enable STOP interrupt */
|
|
4371 if(hi2c->XferCount == 0U)
|
|
4372 {
|
|
4373 /* Enable STOP interrupt */
|
|
4374 I2C_Enable_IRQ(hi2c, I2C_XFER_CPLT_IT);
|
|
4375 }
|
|
4376 /* else prepare a new DMA transfer and enable TCReload interrupt */
|
|
4377 else
|
|
4378 {
|
|
4379 /* Update Buffer pointer */
|
|
4380 hi2c->pBuffPtr += hi2c->XferSize;
|
|
4381
|
|
4382 /* Set the XferSize to transfer */
|
|
4383 if(hi2c->XferCount > MAX_NBYTE_SIZE)
|
|
4384 {
|
|
4385 hi2c->XferSize = MAX_NBYTE_SIZE;
|
|
4386 }
|
|
4387 else
|
|
4388 {
|
|
4389 hi2c->XferSize = hi2c->XferCount;
|
|
4390 }
|
|
4391
|
|
4392 /* Enable the DMA channel */
|
|
4393 HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize);
|
|
4394
|
|
4395 /* Enable TC interrupts */
|
|
4396 I2C_Enable_IRQ(hi2c, I2C_XFER_RELOAD_IT);
|
|
4397 }
|
|
4398 }
|
|
4399
|
|
4400 /**
|
|
4401 * @brief DMA I2C slave receive process complete callback.
|
|
4402 * @param hdma DMA handle
|
|
4403 * @retval None
|
|
4404 */
|
|
4405 static void I2C_DMASlaveReceiveCplt(DMA_HandleTypeDef *hdma)
|
|
4406 {
|
|
4407 /* Prevent unused argument(s) compilation warning */
|
|
4408 UNUSED(hdma);
|
|
4409
|
|
4410 /* No specific action, Master fully manage the generation of STOP condition */
|
|
4411 /* Mean that this generation can arrive at any time, at the end or during DMA process */
|
|
4412 /* So STOP condition should be manage through Interrupt treatment */
|
|
4413 }
|
|
4414
|
|
4415 /**
|
|
4416 * @brief DMA I2C communication error callback.
|
|
4417 * @param hdma DMA handle
|
|
4418 * @retval None
|
|
4419 */
|
|
4420 static void I2C_DMAError(DMA_HandleTypeDef *hdma)
|
|
4421 {
|
|
4422 I2C_HandleTypeDef* hi2c = ( I2C_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
|
|
4423
|
|
4424 /* Disable Acknowledge */
|
|
4425 hi2c->Instance->CR2 |= I2C_CR2_NACK;
|
|
4426
|
|
4427 /* Call the corresponding callback to inform upper layer of End of Transfer */
|
|
4428 I2C_ITError(hi2c, HAL_I2C_ERROR_DMA);
|
|
4429 }
|
|
4430
|
|
4431 /**
|
|
4432 * @brief DMA I2C communication abort callback
|
|
4433 * (To be called at end of DMA Abort procedure).
|
|
4434 * @param hdma: DMA handle.
|
|
4435 * @retval None
|
|
4436 */
|
|
4437 static void I2C_DMAAbort(DMA_HandleTypeDef *hdma)
|
|
4438 {
|
|
4439 I2C_HandleTypeDef* hi2c = ( I2C_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
|
|
4440
|
|
4441 /* Disable Acknowledge */
|
|
4442 hi2c->Instance->CR2 |= I2C_CR2_NACK;
|
|
4443
|
|
4444 /* Reset AbortCpltCallback */
|
|
4445 hi2c->hdmatx->XferAbortCallback = NULL;
|
|
4446 hi2c->hdmarx->XferAbortCallback = NULL;
|
|
4447
|
|
4448 /* Check if come from abort from user */
|
|
4449 if(hi2c->State == HAL_I2C_STATE_ABORT)
|
|
4450 {
|
|
4451 hi2c->State = HAL_I2C_STATE_READY;
|
|
4452
|
|
4453 /* Call the corresponding callback to inform upper layer of End of Transfer */
|
|
4454 HAL_I2C_AbortCpltCallback(hi2c);
|
|
4455 }
|
|
4456 else
|
|
4457 {
|
|
4458 /* Call the corresponding callback to inform upper layer of End of Transfer */
|
|
4459 HAL_I2C_ErrorCallback(hi2c);
|
|
4460 }
|
|
4461 }
|
|
4462
|
|
4463 /**
|
|
4464 * @brief This function handles I2C Communication Timeout.
|
|
4465 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
4466 * the configuration information for the specified I2C.
|
|
4467 * @param Flag Specifies the I2C flag to check.
|
|
4468 * @param Status The new Flag status (SET or RESET).
|
|
4469 * @param Timeout Timeout duration
|
|
4470 * @param Tickstart Tick start value
|
|
4471 * @retval HAL status
|
|
4472 */
|
|
4473 static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart)
|
|
4474 {
|
|
4475 while(__HAL_I2C_GET_FLAG(hi2c, Flag) == Status)
|
|
4476 {
|
|
4477 /* Check for the Timeout */
|
|
4478 if(Timeout != HAL_MAX_DELAY)
|
|
4479 {
|
|
4480 if((Timeout == 0U)||((HAL_GetTick() - Tickstart ) > Timeout))
|
|
4481 {
|
|
4482 hi2c->State= HAL_I2C_STATE_READY;
|
|
4483 hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
4484
|
|
4485 /* Process Unlocked */
|
|
4486 __HAL_UNLOCK(hi2c);
|
|
4487 return HAL_TIMEOUT;
|
|
4488 }
|
|
4489 }
|
|
4490 }
|
|
4491 return HAL_OK;
|
|
4492 }
|
|
4493
|
|
4494 /**
|
|
4495 * @brief This function handles I2C Communication Timeout for specific usage of TXIS flag.
|
|
4496 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
4497 * the configuration information for the specified I2C.
|
|
4498 * @param Timeout Timeout duration
|
|
4499 * @param Tickstart Tick start value
|
|
4500 * @retval HAL status
|
|
4501 */
|
|
4502 static HAL_StatusTypeDef I2C_WaitOnTXISFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
|
|
4503 {
|
|
4504 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXIS) == RESET)
|
|
4505 {
|
|
4506 /* Check if a NACK is detected */
|
|
4507 if(I2C_IsAcknowledgeFailed(hi2c, Timeout, Tickstart) != HAL_OK)
|
|
4508 {
|
|
4509 return HAL_ERROR;
|
|
4510 }
|
|
4511
|
|
4512 /* Check for the Timeout */
|
|
4513 if(Timeout != HAL_MAX_DELAY)
|
|
4514 {
|
|
4515 if((Timeout == 0U)||((HAL_GetTick() - Tickstart) > Timeout))
|
|
4516 {
|
|
4517 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
|
|
4518 hi2c->State= HAL_I2C_STATE_READY;
|
|
4519 hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
4520
|
|
4521 /* Process Unlocked */
|
|
4522 __HAL_UNLOCK(hi2c);
|
|
4523
|
|
4524 return HAL_TIMEOUT;
|
|
4525 }
|
|
4526 }
|
|
4527 }
|
|
4528 return HAL_OK;
|
|
4529 }
|
|
4530
|
|
4531 /**
|
|
4532 * @brief This function handles I2C Communication Timeout for specific usage of STOP flag.
|
|
4533 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
4534 * the configuration information for the specified I2C.
|
|
4535 * @param Timeout Timeout duration
|
|
4536 * @param Tickstart Tick start value
|
|
4537 * @retval HAL status
|
|
4538 */
|
|
4539 static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
|
|
4540 {
|
|
4541 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET)
|
|
4542 {
|
|
4543 /* Check if a NACK is detected */
|
|
4544 if(I2C_IsAcknowledgeFailed(hi2c, Timeout, Tickstart) != HAL_OK)
|
|
4545 {
|
|
4546 return HAL_ERROR;
|
|
4547 }
|
|
4548
|
|
4549 /* Check for the Timeout */
|
|
4550 if((Timeout == 0U)||((HAL_GetTick() - Tickstart) > Timeout))
|
|
4551 {
|
|
4552 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
|
|
4553 hi2c->State= HAL_I2C_STATE_READY;
|
|
4554 hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
4555
|
|
4556 /* Process Unlocked */
|
|
4557 __HAL_UNLOCK(hi2c);
|
|
4558
|
|
4559 return HAL_TIMEOUT;
|
|
4560 }
|
|
4561 }
|
|
4562 return HAL_OK;
|
|
4563 }
|
|
4564
|
|
4565 /**
|
|
4566 * @brief This function handles I2C Communication Timeout for specific usage of RXNE flag.
|
|
4567 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
4568 * the configuration information for the specified I2C.
|
|
4569 * @param Timeout Timeout duration
|
|
4570 * @param Tickstart Tick start value
|
|
4571 * @retval HAL status
|
|
4572 */
|
|
4573 static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
|
|
4574 {
|
|
4575 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == RESET)
|
|
4576 {
|
|
4577 /* Check if a NACK is detected */
|
|
4578 if(I2C_IsAcknowledgeFailed(hi2c, Timeout, Tickstart) != HAL_OK)
|
|
4579 {
|
|
4580 return HAL_ERROR;
|
|
4581 }
|
|
4582
|
|
4583 /* Check if a STOPF is detected */
|
|
4584 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == SET)
|
|
4585 {
|
|
4586 /* Clear STOP Flag */
|
|
4587 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
|
|
4588
|
|
4589 /* Clear Configuration Register 2 */
|
|
4590 I2C_RESET_CR2(hi2c);
|
|
4591
|
|
4592 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
|
|
4593 hi2c->State= HAL_I2C_STATE_READY;
|
|
4594 hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
4595
|
|
4596 /* Process Unlocked */
|
|
4597 __HAL_UNLOCK(hi2c);
|
|
4598
|
|
4599 return HAL_ERROR;
|
|
4600 }
|
|
4601
|
|
4602 /* Check for the Timeout */
|
|
4603 if((Timeout == 0U)||((HAL_GetTick() - Tickstart) > Timeout))
|
|
4604 {
|
|
4605 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
|
|
4606 hi2c->State= HAL_I2C_STATE_READY;
|
|
4607
|
|
4608 /* Process Unlocked */
|
|
4609 __HAL_UNLOCK(hi2c);
|
|
4610
|
|
4611 return HAL_TIMEOUT;
|
|
4612 }
|
|
4613 }
|
|
4614 return HAL_OK;
|
|
4615 }
|
|
4616
|
|
4617 /**
|
|
4618 * @brief This function handles Acknowledge failed detection during an I2C Communication.
|
|
4619 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
4620 * the configuration information for the specified I2C.
|
|
4621 * @param Timeout Timeout duration
|
|
4622 * @param Tickstart Tick start value
|
|
4623 * @retval HAL status
|
|
4624 */
|
|
4625 static HAL_StatusTypeDef I2C_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
|
|
4626 {
|
|
4627 if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET)
|
|
4628 {
|
|
4629 /* Wait until STOP Flag is reset */
|
|
4630 /* AutoEnd should be initiate after AF */
|
|
4631 while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET)
|
|
4632 {
|
|
4633 /* Check for the Timeout */
|
|
4634 if(Timeout != HAL_MAX_DELAY)
|
|
4635 {
|
|
4636 if((Timeout == 0U)||((HAL_GetTick() - Tickstart) > Timeout))
|
|
4637 {
|
|
4638 hi2c->State= HAL_I2C_STATE_READY;
|
|
4639 hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
4640
|
|
4641 /* Process Unlocked */
|
|
4642 __HAL_UNLOCK(hi2c);
|
|
4643 return HAL_TIMEOUT;
|
|
4644 }
|
|
4645 }
|
|
4646 }
|
|
4647
|
|
4648 /* Clear NACKF Flag */
|
|
4649 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
|
|
4650
|
|
4651 /* Clear STOP Flag */
|
|
4652 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
|
|
4653
|
|
4654 /* Flush TX register */
|
|
4655 I2C_Flush_TXDR(hi2c);
|
|
4656
|
|
4657 /* Clear Configuration Register 2 */
|
|
4658 I2C_RESET_CR2(hi2c);
|
|
4659
|
|
4660 hi2c->ErrorCode = HAL_I2C_ERROR_AF;
|
|
4661 hi2c->State= HAL_I2C_STATE_READY;
|
|
4662 hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
4663
|
|
4664 /* Process Unlocked */
|
|
4665 __HAL_UNLOCK(hi2c);
|
|
4666
|
|
4667 return HAL_ERROR;
|
|
4668 }
|
|
4669 return HAL_OK;
|
|
4670 }
|
|
4671
|
|
4672 /**
|
|
4673 * @brief Handles I2Cx communication when starting transfer or during transfer (TC or TCR flag are set).
|
|
4674 * @param hi2c I2C handle.
|
|
4675 * @param DevAddress Specifies the slave address to be programmed.
|
|
4676 * @param Size Specifies the number of bytes to be programmed.
|
|
4677 * This parameter must be a value between 0 and 255.
|
|
4678 * @param Mode New state of the I2C START condition generation.
|
|
4679 * This parameter can be one of the following values:
|
|
4680 * @arg @ref I2C_RELOAD_MODE Enable Reload mode .
|
|
4681 * @arg @ref I2C_AUTOEND_MODE Enable Automatic end mode.
|
|
4682 * @arg @ref I2C_SOFTEND_MODE Enable Software end mode.
|
|
4683 * @param Request New state of the I2C START condition generation.
|
|
4684 * This parameter can be one of the following values:
|
|
4685 * @arg @ref I2C_NO_STARTSTOP Don't Generate stop and start condition.
|
|
4686 * @arg @ref I2C_GENERATE_STOP Generate stop condition (Size should be set to 0).
|
|
4687 * @arg @ref I2C_GENERATE_START_READ Generate Restart for read request.
|
|
4688 * @arg @ref I2C_GENERATE_START_WRITE Generate Restart for write request.
|
|
4689 * @retval None
|
|
4690 */
|
|
4691 static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request)
|
|
4692 {
|
|
4693 uint32_t tmpreg = 0U;
|
|
4694
|
|
4695 /* Check the parameters */
|
|
4696 assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance));
|
|
4697 assert_param(IS_TRANSFER_MODE(Mode));
|
|
4698 assert_param(IS_TRANSFER_REQUEST(Request));
|
|
4699
|
|
4700 /* Get the CR2 register value */
|
|
4701 tmpreg = hi2c->Instance->CR2;
|
|
4702
|
|
4703 /* clear tmpreg specific bits */
|
|
4704 tmpreg &= (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START | I2C_CR2_STOP));
|
|
4705
|
|
4706 /* update tmpreg */
|
|
4707 tmpreg |= (uint32_t)(((uint32_t)DevAddress & I2C_CR2_SADD) | (((uint32_t)Size << 16 ) & I2C_CR2_NBYTES) | \
|
|
4708 (uint32_t)Mode | (uint32_t)Request);
|
|
4709
|
|
4710 /* update CR2 register */
|
|
4711 hi2c->Instance->CR2 = tmpreg;
|
|
4712 }
|
|
4713
|
|
4714 /**
|
|
4715 * @brief Manage the enabling of Interrupts.
|
|
4716 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
4717 * the configuration information for the specified I2C.
|
|
4718 * @param InterruptRequest Value of @ref I2C_Interrupt_configuration_definition.
|
|
4719 * @retval HAL status
|
|
4720 */
|
|
4721 static HAL_StatusTypeDef I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
|
|
4722 {
|
|
4723 uint32_t tmpisr = 0U;
|
|
4724
|
|
4725 if((hi2c->XferISR == I2C_Master_ISR_DMA) || \
|
|
4726 (hi2c->XferISR == I2C_Slave_ISR_DMA))
|
|
4727 {
|
|
4728 if((InterruptRequest & I2C_XFER_LISTEN_IT) == I2C_XFER_LISTEN_IT)
|
|
4729 {
|
|
4730 /* Enable ERR, STOP, NACK and ADDR interrupts */
|
|
4731 tmpisr |= I2C_IT_ADDRI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ERRI;
|
|
4732 }
|
|
4733
|
|
4734 if((InterruptRequest & I2C_XFER_ERROR_IT) == I2C_XFER_ERROR_IT)
|
|
4735 {
|
|
4736 /* Enable ERR and NACK interrupts */
|
|
4737 tmpisr |= I2C_IT_ERRI | I2C_IT_NACKI;
|
|
4738 }
|
|
4739
|
|
4740 if((InterruptRequest & I2C_XFER_CPLT_IT) == I2C_XFER_CPLT_IT)
|
|
4741 {
|
|
4742 /* Enable STOP interrupts */
|
|
4743 tmpisr |= I2C_IT_STOPI;
|
|
4744 }
|
|
4745
|
|
4746 if((InterruptRequest & I2C_XFER_RELOAD_IT) == I2C_XFER_RELOAD_IT)
|
|
4747 {
|
|
4748 /* Enable TC interrupts */
|
|
4749 tmpisr |= I2C_IT_TCI;
|
|
4750 }
|
|
4751 }
|
|
4752 else
|
|
4753 {
|
|
4754 if((InterruptRequest & I2C_XFER_LISTEN_IT) == I2C_XFER_LISTEN_IT)
|
|
4755 {
|
|
4756 /* Enable ERR, STOP, NACK, and ADDR interrupts */
|
|
4757 tmpisr |= I2C_IT_ADDRI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ERRI;
|
|
4758 }
|
|
4759
|
|
4760 if((InterruptRequest & I2C_XFER_TX_IT) == I2C_XFER_TX_IT)
|
|
4761 {
|
|
4762 /* Enable ERR, TC, STOP, NACK and RXI interrupts */
|
|
4763 tmpisr |= I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_TXI;
|
|
4764 }
|
|
4765
|
|
4766 if((InterruptRequest & I2C_XFER_RX_IT) == I2C_XFER_RX_IT)
|
|
4767 {
|
|
4768 /* Enable ERR, TC, STOP, NACK and TXI interrupts */
|
|
4769 tmpisr |= I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_RXI;
|
|
4770 }
|
|
4771
|
|
4772 if((InterruptRequest & I2C_XFER_CPLT_IT) == I2C_XFER_CPLT_IT)
|
|
4773 {
|
|
4774 /* Enable STOP interrupts */
|
|
4775 tmpisr |= I2C_IT_STOPI;
|
|
4776 }
|
|
4777 }
|
|
4778
|
|
4779 /* Enable interrupts only at the end */
|
|
4780 /* to avoid the risk of I2C interrupt handle execution before */
|
|
4781 /* all interrupts requested done */
|
|
4782 __HAL_I2C_ENABLE_IT(hi2c, tmpisr);
|
|
4783
|
|
4784 return HAL_OK;
|
|
4785 }
|
|
4786
|
|
4787 /**
|
|
4788 * @brief Manage the disabling of Interrupts.
|
|
4789 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
4790 * the configuration information for the specified I2C.
|
|
4791 * @param InterruptRequest Value of @ref I2C_Interrupt_configuration_definition.
|
|
4792 * @retval HAL status
|
|
4793 */
|
|
4794 static HAL_StatusTypeDef I2C_Disable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
|
|
4795 {
|
|
4796 uint32_t tmpisr = 0U;
|
|
4797
|
|
4798 if((InterruptRequest & I2C_XFER_TX_IT) == I2C_XFER_TX_IT)
|
|
4799 {
|
|
4800 /* Disable TC and TXI interrupts */
|
|
4801 tmpisr |= I2C_IT_TCI | I2C_IT_TXI;
|
|
4802
|
|
4803 if((hi2c->State & HAL_I2C_STATE_LISTEN) != HAL_I2C_STATE_LISTEN)
|
|
4804 {
|
|
4805 /* Disable NACK and STOP interrupts */
|
|
4806 tmpisr |= I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ERRI;
|
|
4807 }
|
|
4808 }
|
|
4809
|
|
4810 if((InterruptRequest & I2C_XFER_RX_IT) == I2C_XFER_RX_IT)
|
|
4811 {
|
|
4812 /* Disable TC and RXI interrupts */
|
|
4813 tmpisr |= I2C_IT_TCI | I2C_IT_RXI;
|
|
4814
|
|
4815 if((hi2c->State & HAL_I2C_STATE_LISTEN) != HAL_I2C_STATE_LISTEN)
|
|
4816 {
|
|
4817 /* Disable NACK and STOP interrupts */
|
|
4818 tmpisr |= I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ERRI;
|
|
4819 }
|
|
4820 }
|
|
4821
|
|
4822 if((InterruptRequest & I2C_XFER_LISTEN_IT) == I2C_XFER_LISTEN_IT)
|
|
4823 {
|
|
4824 /* Disable ADDR, NACK and STOP interrupts */
|
|
4825 tmpisr |= I2C_IT_ADDRI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ERRI;
|
|
4826 }
|
|
4827
|
|
4828 if((InterruptRequest & I2C_XFER_ERROR_IT) == I2C_XFER_ERROR_IT)
|
|
4829 {
|
|
4830 /* Enable ERR and NACK interrupts */
|
|
4831 tmpisr |= I2C_IT_ERRI | I2C_IT_NACKI;
|
|
4832 }
|
|
4833
|
|
4834 if((InterruptRequest & I2C_XFER_CPLT_IT) == I2C_XFER_CPLT_IT)
|
|
4835 {
|
|
4836 /* Enable STOP interrupts */
|
|
4837 tmpisr |= I2C_IT_STOPI;
|
|
4838 }
|
|
4839
|
|
4840 if((InterruptRequest & I2C_XFER_RELOAD_IT) == I2C_XFER_RELOAD_IT)
|
|
4841 {
|
|
4842 /* Enable TC interrupts */
|
|
4843 tmpisr |= I2C_IT_TCI;
|
|
4844 }
|
|
4845
|
|
4846 /* Disable interrupts only at the end */
|
|
4847 /* to avoid a breaking situation like at "t" time */
|
|
4848 /* all disable interrupts request are not done */
|
|
4849 __HAL_I2C_DISABLE_IT(hi2c, tmpisr);
|
|
4850
|
|
4851 return HAL_OK;
|
|
4852 }
|
|
4853
|
|
4854 /**
|
|
4855 * @}
|
|
4856 */
|
|
4857
|
|
4858 #endif /* HAL_I2C_MODULE_ENABLED */
|
|
4859 /**
|
|
4860 * @}
|
|
4861 */
|
|
4862
|
|
4863 /**
|
|
4864 * @}
|
|
4865 */
|
|
4866
|
|
4867 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|