1 /*
2  * Copyright (c) 2016, Freescale Semiconductor, Inc.
3  * Copyright 2016-2020 NXP
4  * All rights reserved.
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  */
8 #ifndef _FSL_I2C_H_
9 #define _FSL_I2C_H_
10 
11 #include "fsl_common.h"
12 
13 /*!
14  * @addtogroup i2c_driver
15  * @{
16  */
17 
18 /*******************************************************************************
19  * Definitions
20  ******************************************************************************/
21 
22 /*! @name Driver version */
23 /*@{*/
24 /*! @brief I2C driver version 2.0.6. */
25 #define FSL_I2C_DRIVER_VERSION (MAKE_VERSION(2, 0, 6))
26 /*@}*/
27 
28 /*! @brief Retry times for waiting flag. */
29 #ifndef I2C_RETRY_TIMES
30 #define I2C_RETRY_TIMES 0U /* Define to zero means keep waiting until the flag is assert/deassert. */
31 #endif
32 
33 /*! @brief  I2C status return codes. */
34 enum
35 {
36     kStatus_I2C_Busy            = MAKE_STATUS(kStatusGroup_I2C, 0), /*!< I2C is busy with current transfer. */
37     kStatus_I2C_Idle            = MAKE_STATUS(kStatusGroup_I2C, 1), /*!< Bus is Idle. */
38     kStatus_I2C_Nak             = MAKE_STATUS(kStatusGroup_I2C, 2), /*!< NAK received during transfer. */
39     kStatus_I2C_ArbitrationLost = MAKE_STATUS(kStatusGroup_I2C, 3), /*!< Arbitration lost during transfer. */
40     kStatus_I2C_Timeout         = MAKE_STATUS(kStatusGroup_I2C, 4), /*!< Timeout polling status flags. */
41     kStatus_I2C_Addr_Nak        = MAKE_STATUS(kStatusGroup_I2C, 5), /*!< NAK received during the address probe. */
42 };
43 
44 /*!
45  * @brief I2C peripheral flags
46  *
47  * The following status register flags can be cleared:
48  * - #kI2C_ArbitrationLostFlag
49  * - #kI2C_IntPendingFlag
50  *
51  * @note These enumerations are meant to be OR'd together to form a bit mask.
52  *
53  */
54 enum _i2c_flags
55 {
56     kI2C_ReceiveNakFlag        = I2C_I2SR_RXAK_MASK, /*!< I2C receive NAK flag. */
57     kI2C_IntPendingFlag        = I2C_I2SR_IIF_MASK,  /*!< I2C interrupt pending flag. */
58     kI2C_TransferDirectionFlag = I2C_I2SR_SRW_MASK,  /*!< I2C transfer direction flag. */
59     kI2C_ArbitrationLostFlag   = I2C_I2SR_IAL_MASK,  /*!< I2C arbitration lost flag. */
60     kI2C_BusBusyFlag           = I2C_I2SR_IBB_MASK,  /*!< I2C bus busy flag. */
61     kI2C_AddressMatchFlag      = I2C_I2SR_IAAS_MASK, /*!< I2C address match flag. */
62     kI2C_TransferCompleteFlag  = I2C_I2SR_ICF_MASK,
63     /*!< I2C transfer complete flag. */
64 };
65 
66 /*! @brief I2C feature interrupt source. */
67 enum _i2c_interrupt_enable
68 {
69     kI2C_GlobalInterruptEnable = I2C_I2CR_IIEN_MASK, /*!< I2C global interrupt. */
70 };
71 
72 /*! @brief The direction of master and slave transfers. */
73 typedef enum _i2c_direction
74 {
75     kI2C_Write = 0x0U, /*!< Master transmits to the slave. */
76     kI2C_Read  = 0x1U, /*!< Master receives from the slave. */
77 } i2c_direction_t;
78 
79 /*! @brief I2C transfer control flag. */
80 enum _i2c_master_transfer_flags
81 {
82     kI2C_TransferDefaultFlag = 0x0U,       /*!< A transfer starts with a start signal, stops with a stop signal. */
83     kI2C_TransferNoStartFlag = 0x1U,       /*!< A transfer starts without a start signal, only support write only or
84                                         write+read with no start flag, do not support read only with no start flag. */
85     kI2C_TransferRepeatedStartFlag = 0x2U, /*!< A transfer starts with a repeated start signal. */
86     kI2C_TransferNoStopFlag        = 0x4U, /*!< A transfer ends without a stop signal. */
87 };
88 
89 /*! @brief I2C master user configuration. */
90 typedef struct _i2c_master_config
91 {
92     bool enableMaster;     /*!< Enables the I2C peripheral at initialization time. */
93     uint32_t baudRate_Bps; /*!< Baud rate configuration of I2C peripheral. */
94 } i2c_master_config_t;
95 
96 /*! @brief I2C master handle typedef. */
97 typedef struct _i2c_master_handle i2c_master_handle_t;
98 
99 /*! @brief I2C master transfer callback typedef. */
100 typedef void (*i2c_master_transfer_callback_t)(I2C_Type *base,
101                                                i2c_master_handle_t *handle,
102                                                status_t status,
103                                                void *userData);
104 
105 /*! @brief I2C master transfer structure. */
106 typedef struct _i2c_master_transfer
107 {
108     uint32_t flags;            /*!< A transfer flag which controls the transfer. */
109     uint8_t slaveAddress;      /*!< 7-bit slave address. */
110     i2c_direction_t direction; /*!< A transfer direction, read or write. */
111     uint32_t subaddress;       /*!< A sub address. Transferred MSB first. */
112     uint8_t subaddressSize;    /*!< A size of the command buffer. */
113     uint8_t *volatile data;    /*!< A transfer buffer. */
114     volatile size_t dataSize;  /*!< A transfer size. */
115 } i2c_master_transfer_t;
116 
117 /*! @brief I2C master handle structure. */
118 struct _i2c_master_handle
119 {
120     i2c_master_transfer_t transfer;                    /*!< I2C master transfer copy. */
121     size_t transferSize;                               /*!< Total bytes to be transferred. */
122     uint8_t state;                                     /*!< A transfer state maintained during transfer. */
123     i2c_master_transfer_callback_t completionCallback; /*!< A callback function called when the transfer is finished. */
124     void *userData;                                    /*!< A callback parameter passed to the callback function. */
125 };
126 
127 /*!
128  * @brief Set of events sent to the callback for nonblocking slave transfers.
129  *
130  * These event enumerations are used for two related purposes. First, a bit mask created by OR'ing together
131  * events is passed to I2C_SlaveTransferNonBlocking() to specify which events to enable.
132  * Then, when the slave callback is invoked, it is passed the current event through its @a transfer
133  * parameter.
134  *
135  * @note These enumerations are meant to be OR'd together to form a bit mask of events.
136  */
137 typedef enum _i2c_slave_transfer_event
138 {
139     kI2C_SlaveAddressMatchEvent = 0x01U, /*!< Received the slave address after a start or repeated start. */
140     kI2C_SlaveTransmitEvent     = 0x02U, /*!< A callback is requested to provide data to transmit
141                                                 (slave-transmitter role). */
142     kI2C_SlaveReceiveEvent = 0x04U,      /*!< A callback is requested to provide a buffer in which to place received
143                                                  data (slave-receiver role). */
144     kI2C_SlaveTransmitAckEvent = 0x08U,  /*!< A callback needs to either transmit an ACK or NACK. */
145     kI2C_SlaveCompletionEvent  = 0x20U,  /*!< A stop was detected or finished transfer, completing the transfer. */
146     /*! A bit mask of all available events. */
147     kI2C_SlaveAllEvents =
148         kI2C_SlaveAddressMatchEvent | kI2C_SlaveTransmitEvent | kI2C_SlaveReceiveEvent | kI2C_SlaveCompletionEvent,
149 } i2c_slave_transfer_event_t;
150 
151 /*! @brief I2C slave handle typedef. */
152 typedef struct _i2c_slave_handle i2c_slave_handle_t;
153 
154 /*! @brief I2C slave user configuration. */
155 typedef struct _i2c_slave_config
156 {
157     bool enableSlave;      /*!< Enables the I2C peripheral at initialization time. */
158     uint16_t slaveAddress; /*!< A slave address configuration. */
159 } i2c_slave_config_t;
160 
161 /*! @brief I2C slave transfer structure. */
162 typedef struct _i2c_slave_transfer
163 {
164     i2c_slave_transfer_event_t event; /*!< A reason that the callback is invoked. */
165     uint8_t *volatile data;           /*!< A transfer buffer. */
166     volatile size_t dataSize;         /*!< A transfer size. */
167     status_t completionStatus;        /*!< Success or error code describing how the transfer completed. Only applies for
168                                          #kI2C_SlaveCompletionEvent. */
169     size_t transferredCount; /*!< A number of bytes actually transferred since the start or since the last repeated
170                                 start. */
171 } i2c_slave_transfer_t;
172 
173 /*! @brief I2C slave transfer callback typedef. */
174 typedef void (*i2c_slave_transfer_callback_t)(I2C_Type *base, i2c_slave_transfer_t *xfer, void *userData);
175 
176 /*! @brief I2C slave handle structure. */
177 struct _i2c_slave_handle
178 {
179     volatile uint8_t state;                 /*!< A transfer state maintained during transfer. */
180     i2c_slave_transfer_t transfer;          /*!< I2C slave transfer copy. */
181     uint32_t eventMask;                     /*!< A mask of enabled events. */
182     i2c_slave_transfer_callback_t callback; /*!< A callback function called at the transfer event. */
183     void *userData;                         /*!< A callback parameter passed to the callback. */
184 };
185 
186 /*******************************************************************************
187  * API
188  ******************************************************************************/
189 
190 #if defined(__cplusplus)
191 extern "C" {
192 #endif /*_cplusplus. */
193 
194 /*!
195  * @name Initialization and deinitialization
196  * @{
197  */
198 
199 /*!
200  * @brief Initializes the I2C peripheral. Call this API to ungate the I2C clock
201  * and configure the I2C with master configuration.
202  *
203  * @note This API should be called at the beginning of the application.
204  * Otherwise, any operation to the I2C module can cause a hard fault
205  * because the clock is not enabled. The configuration structure can be custom filled
206  * or it can be set with default values by using the I2C_MasterGetDefaultConfig().
207  * After calling this API, the master is ready to transfer.
208  * This is an example.
209  * @code
210  * i2c_master_config_t config = {
211  * .enableMaster = true,
212  * .baudRate_Bps = 100000
213  * };
214  * I2C_MasterInit(I2C0, &config, 12000000U);
215  * @endcode
216  *
217  * @param base I2C base pointer
218  * @param masterConfig A pointer to the master configuration structure
219  * @param srcClock_Hz I2C peripheral clock frequency in Hz
220  */
221 void I2C_MasterInit(I2C_Type *base, const i2c_master_config_t *masterConfig, uint32_t srcClock_Hz);
222 
223 /*!
224  * @brief De-initializes the I2C master peripheral. Call this API to gate the I2C clock.
225  * The I2C master module can't work unless the I2C_MasterInit is called.
226  * @param base I2C base pointer
227  */
228 void I2C_MasterDeinit(I2C_Type *base);
229 
230 /*!
231  * @brief  Sets the I2C master configuration structure to default values.
232  *
233  * The purpose of this API is to get the configuration structure initialized for use in the I2C_MasterInit().
234  * Use the initialized structure unchanged in the I2C_MasterInit() or modify
235  * the structure before calling the I2C_MasterInit().
236  * This is an example.
237  * @code
238  * i2c_master_config_t config;
239  * I2C_MasterGetDefaultConfig(&config);
240  * @endcode
241  * @param masterConfig A pointer to the master configuration structure.
242  */
243 void I2C_MasterGetDefaultConfig(i2c_master_config_t *masterConfig);
244 
245 /*!
246  * @brief Initializes the I2C peripheral. Call this API to ungate the I2C clock
247  * and initialize the I2C with the slave configuration.
248  *
249  * @note This API should be called at the beginning of the application.
250  * Otherwise, any operation to the I2C module can cause a hard fault
251  * because the clock is not enabled. The configuration structure can partly be set
252  * with default values by I2C_SlaveGetDefaultConfig() or it can be custom filled by the user.
253  * This is an example.
254  * @code
255  * i2c_slave_config_t config = {
256  * .enableSlave = true,
257  * .slaveAddress = 0x1DU,
258  * };
259  * I2C_SlaveInit(I2C0, &config);
260  * @endcode
261  *
262  * @param base I2C base pointer
263  * @param slaveConfig A pointer to the slave configuration structure
264  */
265 void I2C_SlaveInit(I2C_Type *base, const i2c_slave_config_t *slaveConfig);
266 
267 /*!
268  * @brief De-initializes the I2C slave peripheral. Calling this API gates the I2C clock.
269  * The I2C slave module can't work unless the I2C_SlaveInit is called to enable the clock.
270  * @param base I2C base pointer
271  */
272 void I2C_SlaveDeinit(I2C_Type *base);
273 
274 /*!
275  * @brief  Sets the I2C slave configuration structure to default values.
276  *
277  * The purpose of this API is to get the configuration structure initialized for use in the I2C_SlaveInit().
278  * Modify fields of the structure before calling the I2C_SlaveInit().
279  * This is an example.
280  * @code
281  * i2c_slave_config_t config;
282  * I2C_SlaveGetDefaultConfig(&config);
283  * @endcode
284  * @param slaveConfig A pointer to the slave configuration structure.
285  */
286 void I2C_SlaveGetDefaultConfig(i2c_slave_config_t *slaveConfig);
287 
288 /*!
289  * @brief Enables or disables the I2C peripheral operation.
290  *
291  * @param base I2C base pointer
292  * @param enable Pass true to enable and false to disable the module.
293  */
I2C_Enable(I2C_Type * base,bool enable)294 static inline void I2C_Enable(I2C_Type *base, bool enable)
295 {
296     if (enable)
297     {
298         base->I2CR |= I2C_I2CR_IEN_MASK;
299     }
300     else
301     {
302         base->I2CR &= ~(uint16_t)I2C_I2CR_IEN_MASK;
303     }
304 }
305 
306 /* @} */
307 
308 /*!
309  * @name Status
310  * @{
311  */
312 
313 /*!
314  * @brief Gets the I2C status flags.
315  *
316  * @param base I2C base pointer
317  * @return status flag, use status flag to AND #_i2c_flags to get the related status.
318  */
I2C_MasterGetStatusFlags(I2C_Type * base)319 static inline uint32_t I2C_MasterGetStatusFlags(I2C_Type *base)
320 {
321     return base->I2SR;
322 }
323 
324 /*!
325  * @brief Clears the I2C status flag state.
326  *
327  * The following status register flags can be cleared kI2C_ArbitrationLostFlag and kI2C_IntPendingFlag.
328  *
329  * @param base I2C base pointer
330  * @param statusMask The status flag mask, defined in type i2c_status_flag_t.
331  *      The parameter can be any combination of the following values:
332  *          @arg kI2C_ArbitrationLostFlag
333  *          @arg kI2C_IntPendingFlag
334  */
I2C_MasterClearStatusFlags(I2C_Type * base,uint32_t statusMask)335 static inline void I2C_MasterClearStatusFlags(I2C_Type *base, uint32_t statusMask)
336 {
337     base->I2SR &= (~(uint16_t)statusMask);
338 }
339 
340 /*!
341  * @brief Gets the I2C status flags.
342  *
343  * @param base I2C base pointer
344  * @return status flag, use status flag to AND #_i2c_flags to get the related status.
345  */
I2C_SlaveGetStatusFlags(I2C_Type * base)346 static inline uint32_t I2C_SlaveGetStatusFlags(I2C_Type *base)
347 {
348     return I2C_MasterGetStatusFlags(base);
349 }
350 
351 /*!
352  * @brief Clears the I2C status flag state.
353  *
354  * The following status register flags can be cleared kI2C_ArbitrationLostFlag and kI2C_IntPendingFlag
355  *
356  * @param base I2C base pointer
357  * @param statusMask The status flag mask, defined in type i2c_status_flag_t.
358  *      The parameter can be any combination of the following values:
359  *          @arg kI2C_IntPendingFlagFlag
360  */
I2C_SlaveClearStatusFlags(I2C_Type * base,uint32_t statusMask)361 static inline void I2C_SlaveClearStatusFlags(I2C_Type *base, uint32_t statusMask)
362 {
363     I2C_MasterClearStatusFlags(base, statusMask);
364 }
365 
366 /* @} */
367 
368 /*!
369  * @name Interrupts
370  * @{
371  */
372 
373 /*!
374  * @brief Enables I2C interrupt requests.
375  *
376  * @param base I2C base pointer
377  * @param mask interrupt source
378  *     The parameter can be combination of the following source if defined:
379  *     @arg kI2C_GlobalInterruptEnable
380  *     @arg kI2C_StopDetectInterruptEnable/kI2C_StartDetectInterruptEnable
381  *     @arg kI2C_SdaTimeoutInterruptEnable
382  */
383 void I2C_EnableInterrupts(I2C_Type *base, uint32_t mask);
384 
385 /*!
386  * @brief Disables I2C interrupt requests.
387  *
388  * @param base I2C base pointer
389  * @param mask interrupt source
390  *     The parameter can be combination of the following source if defined:
391  *     @arg kI2C_GlobalInterruptEnable
392  *     @arg kI2C_StopDetectInterruptEnable/kI2C_StartDetectInterruptEnable
393  *     @arg kI2C_SdaTimeoutInterruptEnable
394  */
395 void I2C_DisableInterrupts(I2C_Type *base, uint32_t mask);
396 
397 /* @} */
398 /*!
399  * @name Bus Operations
400  * @{
401  */
402 
403 /*!
404  * @brief Sets the I2C master transfer baud rate.
405  *
406  * @param base I2C base pointer
407  * @param baudRate_Bps the baud rate value in bps
408  * @param srcClock_Hz Source clock
409  */
410 void I2C_MasterSetBaudRate(I2C_Type *base, uint32_t baudRate_Bps, uint32_t srcClock_Hz);
411 
412 /*!
413  * @brief Sends a START on the I2C bus.
414  *
415  * This function is used to initiate a new master mode transfer by sending the START signal.
416  * The slave address is sent following the I2C START signal.
417  *
418  * @param base I2C peripheral base pointer
419  * @param address 7-bit slave device address.
420  * @param direction Master transfer directions(transmit/receive).
421  * @retval kStatus_Success Successfully send the start signal.
422  * @retval kStatus_I2C_Busy Current bus is busy.
423  */
424 status_t I2C_MasterStart(I2C_Type *base, uint8_t address, i2c_direction_t direction);
425 
426 /*!
427  * @brief Sends a STOP signal on the I2C bus.
428  *
429  * @retval kStatus_Success Successfully send the stop signal.
430  * @retval kStatus_I2C_Timeout Send stop signal failed, timeout.
431  */
432 status_t I2C_MasterStop(I2C_Type *base);
433 
434 /*!
435  * @brief Sends a REPEATED START on the I2C bus.
436  *
437  * @param base I2C peripheral base pointer
438  * @param address 7-bit slave device address.
439  * @param direction Master transfer directions(transmit/receive).
440  * @retval kStatus_Success Successfully send the start signal.
441  * @retval kStatus_I2C_Busy Current bus is busy but not occupied by current I2C master.
442  */
443 status_t I2C_MasterRepeatedStart(I2C_Type *base, uint8_t address, i2c_direction_t direction);
444 
445 /*!
446  * @brief Performs a polling send transaction on the I2C bus.
447  *
448  * @param base  The I2C peripheral base pointer.
449  * @param txBuff The pointer to the data to be transferred.
450  * @param txSize The length in bytes of the data to be transferred.
451  * @param flags Transfer control flag to decide whether need to send a stop, use kI2C_TransferDefaultFlag
452  *  to issue a stop and kI2C_TransferNoStop to not send a stop.
453  * @retval kStatus_Success Successfully complete the data transmission.
454  * @retval kStatus_I2C_ArbitrationLost Transfer error, arbitration lost.
455  * @retval kStataus_I2C_Nak Transfer error, receive NAK during transfer.
456  */
457 status_t I2C_MasterWriteBlocking(I2C_Type *base, const uint8_t *txBuff, size_t txSize, uint32_t flags);
458 
459 /*!
460  * @brief Performs a polling receive transaction on the I2C bus.
461  *
462  * @note The I2C_MasterReadBlocking function stops the bus before reading the final byte.
463  * Without stopping the bus prior for the final read, the bus issues another read, resulting
464  * in garbage data being read into the data register.
465  *
466  * @param base I2C peripheral base pointer.
467  * @param rxBuff The pointer to the data to store the received data.
468  * @param rxSize The length in bytes of the data to be received.
469  * @param flags Transfer control flag to decide whether need to send a stop, use kI2C_TransferDefaultFlag
470  *  to issue a stop and kI2C_TransferNoStop to not send a stop.
471  * @retval kStatus_Success Successfully complete the data transmission.
472  * @retval kStatus_I2C_Timeout Send stop signal failed, timeout.
473  */
474 status_t I2C_MasterReadBlocking(I2C_Type *base, uint8_t *rxBuff, size_t rxSize, uint32_t flags);
475 
476 /*!
477  * @brief Performs a polling send transaction on the I2C bus.
478  *
479  * @param base  The I2C peripheral base pointer.
480  * @param txBuff The pointer to the data to be transferred.
481  * @param txSize The length in bytes of the data to be transferred.
482  * @retval kStatus_Success Successfully complete the data transmission.
483  * @retval kStatus_I2C_ArbitrationLost Transfer error, arbitration lost.
484  * @retval kStataus_I2C_Nak Transfer error, receive NAK during transfer.
485  */
486 status_t I2C_SlaveWriteBlocking(I2C_Type *base, const uint8_t *txBuff, size_t txSize);
487 
488 /*!
489  * @brief Performs a polling receive transaction on the I2C bus.
490  *
491  * @param base I2C peripheral base pointer.
492  * @param rxBuff The pointer to the data to store the received data.
493  * @param rxSize The length in bytes of the data to be received.
494  */
495 status_t I2C_SlaveReadBlocking(I2C_Type *base, uint8_t *rxBuff, size_t rxSize);
496 
497 /*!
498  * @brief Performs a master polling transfer on the I2C bus.
499  *
500  * @note The API does not return until the transfer succeeds or fails due
501  * to arbitration lost or receiving a NAK.
502  *
503  * @param base I2C peripheral base address.
504  * @param xfer Pointer to the transfer structure.
505  * @retval kStatus_Success Successfully complete the data transmission.
506  * @retval kStatus_I2C_Busy Previous transmission still not finished.
507  * @retval kStatus_I2C_Timeout Transfer error, wait signal timeout.
508  * @retval kStatus_I2C_ArbitrationLost Transfer error, arbitration lost.
509  * @retval kStataus_I2C_Nak Transfer error, receive NAK during transfer.
510  */
511 status_t I2C_MasterTransferBlocking(I2C_Type *base, i2c_master_transfer_t *xfer);
512 
513 /* @} */
514 
515 /*!
516  * @name Transactional
517  * @{
518  */
519 
520 /*!
521  * @brief Initializes the I2C handle which is used in transactional functions.
522  *
523  * @param base I2C base pointer.
524  * @param handle pointer to i2c_master_handle_t structure to store the transfer state.
525  * @param callback pointer to user callback function.
526  * @param userData user parameter passed to the callback function.
527  */
528 void I2C_MasterTransferCreateHandle(I2C_Type *base,
529                                     i2c_master_handle_t *handle,
530                                     i2c_master_transfer_callback_t callback,
531                                     void *userData);
532 
533 /*!
534  * @brief Performs a master interrupt non-blocking transfer on the I2C bus.
535  *
536  * @note Calling the API returns immediately after transfer initiates. The user needs
537  * to call I2C_MasterGetTransferCount to poll the transfer status to check whether
538  * the transfer is finished. If the return status is not kStatus_I2C_Busy, the transfer
539  * is finished.
540  *
541  * @param base I2C base pointer.
542  * @param handle pointer to i2c_master_handle_t structure which stores the transfer state.
543  * @param xfer pointer to i2c_master_transfer_t structure.
544  * @retval kStatus_Success Successfully start the data transmission.
545  * @retval kStatus_I2C_Busy Previous transmission still not finished.
546  * @retval kStatus_I2C_Timeout Transfer error, wait signal timeout.
547  */
548 status_t I2C_MasterTransferNonBlocking(I2C_Type *base, i2c_master_handle_t *handle, i2c_master_transfer_t *xfer);
549 
550 /*!
551  * @brief Gets the master transfer status during a interrupt non-blocking transfer.
552  *
553  * @param base I2C base pointer.
554  * @param handle pointer to i2c_master_handle_t structure which stores the transfer state.
555  * @param count Number of bytes transferred so far by the non-blocking transaction.
556  * @retval kStatus_InvalidArgument count is Invalid.
557  * @retval kStatus_Success Successfully return the count.
558  */
559 status_t I2C_MasterTransferGetCount(I2C_Type *base, i2c_master_handle_t *handle, size_t *count);
560 
561 /*!
562  * @brief Aborts an interrupt non-blocking transfer early.
563  *
564  * @note This API can be called at any time when an interrupt non-blocking transfer initiates
565  * to abort the transfer early.
566  *
567  * @param base I2C base pointer.
568  * @param handle pointer to i2c_master_handle_t structure which stores the transfer state
569  * @retval kStatus_I2C_Timeout Timeout during polling flag.
570  * @retval kStatus_Success Successfully abort the transfer.
571  */
572 status_t I2C_MasterTransferAbort(I2C_Type *base, i2c_master_handle_t *handle);
573 
574 /*!
575  * @brief Master interrupt handler.
576  *
577  * @param base I2C base pointer.
578  * @param i2cHandle pointer to i2c_master_handle_t structure.
579  */
580 void I2C_MasterTransferHandleIRQ(I2C_Type *base, void *i2cHandle);
581 
582 /*!
583  * @brief Initializes the I2C handle which is used in transactional functions.
584  *
585  * @param base I2C base pointer.
586  * @param handle pointer to i2c_slave_handle_t structure to store the transfer state.
587  * @param callback pointer to user callback function.
588  * @param userData user parameter passed to the callback function.
589  */
590 void I2C_SlaveTransferCreateHandle(I2C_Type *base,
591                                    i2c_slave_handle_t *handle,
592                                    i2c_slave_transfer_callback_t callback,
593                                    void *userData);
594 
595 /*!
596  * @brief Starts accepting slave transfers.
597  *
598  * Call this API after calling the I2C_SlaveInit() and I2C_SlaveTransferCreateHandle() to start processing
599  * transactions driven by an I2C master. The slave monitors the I2C bus and passes events to the
600  * callback that was passed into the call to I2C_SlaveTransferCreateHandle(). The callback is always invoked
601  * from the interrupt context.
602  *
603  * The set of events received by the callback is customizable. To do so, set the @a eventMask parameter to
604  * the OR'd combination of #i2c_slave_transfer_event_t enumerators for the events you wish to receive.
605  * The #kI2C_SlaveTransmitEvent and kLPI2C_SlaveReceiveEvent events are always enabled and do not need
606  * to be included in the mask. Alternatively, pass 0 to get a default set of only the transmit and
607  * receive events that are always enabled. In addition, the #kI2C_SlaveAllEvents constant is provided as
608  * a convenient way to enable all events.
609  *
610  * @param base The I2C peripheral base address.
611  * @param handle Pointer to i2c_slave_handle_t structure which stores the transfer state.
612  * @param eventMask Bit mask formed by OR'ing together #i2c_slave_transfer_event_t enumerators to specify
613  *      which events to send to the callback. Other accepted values are 0 to get a default set of
614  *      only the transmit and receive events, and #kI2C_SlaveAllEvents to enable all events.
615  *
616  * @retval kStatus_Success Slave transfers were successfully started.
617  * @retval #kStatus_I2C_Busy Slave transfers have already been started on this handle.
618  */
619 status_t I2C_SlaveTransferNonBlocking(I2C_Type *base, i2c_slave_handle_t *handle, uint32_t eventMask);
620 
621 /*!
622  * @brief Aborts the slave transfer.
623  *
624  * @note This API can be called at any time to stop slave for handling the bus events.
625  *
626  * @param base I2C base pointer.
627  * @param handle pointer to i2c_slave_handle_t structure which stores the transfer state.
628  */
629 void I2C_SlaveTransferAbort(I2C_Type *base, i2c_slave_handle_t *handle);
630 
631 /*!
632  * @brief Gets the slave transfer remaining bytes during a interrupt non-blocking transfer.
633  *
634  * @param base I2C base pointer.
635  * @param handle pointer to i2c_slave_handle_t structure.
636  * @param count Number of bytes transferred so far by the non-blocking transaction.
637  * @retval kStatus_InvalidArgument count is Invalid.
638  * @retval kStatus_Success Successfully return the count.
639  */
640 status_t I2C_SlaveTransferGetCount(I2C_Type *base, i2c_slave_handle_t *handle, size_t *count);
641 
642 /*!
643  * @brief Slave interrupt handler.
644  *
645  * @param base I2C base pointer.
646  * @param i2cHandle pointer to i2c_slave_handle_t structure which stores the transfer state
647  */
648 void I2C_SlaveTransferHandleIRQ(I2C_Type *base, void *i2cHandle);
649 
650 /* @} */
651 #if defined(__cplusplus)
652 }
653 #endif /*_cplusplus. */
654 /*@}*/
655 
656 #endif /* _FSL_I2C_H_*/
657