The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.
Dependents: hello SerialTestv11 SerialTestv12 Sierpinski ... more
mbed 2
This is the mbed 2 library. If you'd like to learn about Mbed OS please see the mbed-os docs.
TARGET_LPC546XX/TOOLCHAIN_IAR/fsl_i2c.h@171:3a7713b1edbc, 2018-11-08 (annotated)
- Committer:
- AnnaBridge
- Date:
- Thu Nov 08 11:45:42 2018 +0000
- Revision:
- 171:3a7713b1edbc
mbed library. Release version 164
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AnnaBridge | 171:3a7713b1edbc | 1 | /* |
AnnaBridge | 171:3a7713b1edbc | 2 | * The Clear BSD License |
AnnaBridge | 171:3a7713b1edbc | 3 | * Copyright (c) 2016, Freescale Semiconductor, Inc. |
AnnaBridge | 171:3a7713b1edbc | 4 | * Copyright 2016-2017 NXP |
AnnaBridge | 171:3a7713b1edbc | 5 | * All rights reserved. |
AnnaBridge | 171:3a7713b1edbc | 6 | * |
AnnaBridge | 171:3a7713b1edbc | 7 | * Redistribution and use in source and binary forms, with or without modification, |
AnnaBridge | 171:3a7713b1edbc | 8 | * are permitted (subject to the limitations in the disclaimer below) provided |
AnnaBridge | 171:3a7713b1edbc | 9 | * that the following conditions are met: |
AnnaBridge | 171:3a7713b1edbc | 10 | * |
AnnaBridge | 171:3a7713b1edbc | 11 | * o Redistributions of source code must retain the above copyright notice, this list |
AnnaBridge | 171:3a7713b1edbc | 12 | * of conditions and the following disclaimer. |
AnnaBridge | 171:3a7713b1edbc | 13 | * |
AnnaBridge | 171:3a7713b1edbc | 14 | * o Redistributions in binary form must reproduce the above copyright notice, this |
AnnaBridge | 171:3a7713b1edbc | 15 | * list of conditions and the following disclaimer in the documentation and/or |
AnnaBridge | 171:3a7713b1edbc | 16 | * other materials provided with the distribution. |
AnnaBridge | 171:3a7713b1edbc | 17 | * |
AnnaBridge | 171:3a7713b1edbc | 18 | * o Neither the name of the copyright holder nor the names of its |
AnnaBridge | 171:3a7713b1edbc | 19 | * contributors may be used to endorse or promote products derived from this |
AnnaBridge | 171:3a7713b1edbc | 20 | * software without specific prior written permission. |
AnnaBridge | 171:3a7713b1edbc | 21 | * |
AnnaBridge | 171:3a7713b1edbc | 22 | * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS LICENSE. |
AnnaBridge | 171:3a7713b1edbc | 23 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
AnnaBridge | 171:3a7713b1edbc | 24 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
AnnaBridge | 171:3a7713b1edbc | 25 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
AnnaBridge | 171:3a7713b1edbc | 26 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR |
AnnaBridge | 171:3a7713b1edbc | 27 | * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
AnnaBridge | 171:3a7713b1edbc | 28 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
AnnaBridge | 171:3a7713b1edbc | 29 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON |
AnnaBridge | 171:3a7713b1edbc | 30 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
AnnaBridge | 171:3a7713b1edbc | 31 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
AnnaBridge | 171:3a7713b1edbc | 32 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
AnnaBridge | 171:3a7713b1edbc | 33 | */ |
AnnaBridge | 171:3a7713b1edbc | 34 | #ifndef _FSL_I2C_H_ |
AnnaBridge | 171:3a7713b1edbc | 35 | #define _FSL_I2C_H_ |
AnnaBridge | 171:3a7713b1edbc | 36 | |
AnnaBridge | 171:3a7713b1edbc | 37 | #include <stddef.h> |
AnnaBridge | 171:3a7713b1edbc | 38 | #include "fsl_device_registers.h" |
AnnaBridge | 171:3a7713b1edbc | 39 | #include "fsl_common.h" |
AnnaBridge | 171:3a7713b1edbc | 40 | |
AnnaBridge | 171:3a7713b1edbc | 41 | /******************************************************************************* |
AnnaBridge | 171:3a7713b1edbc | 42 | * Definitions |
AnnaBridge | 171:3a7713b1edbc | 43 | ******************************************************************************/ |
AnnaBridge | 171:3a7713b1edbc | 44 | |
AnnaBridge | 171:3a7713b1edbc | 45 | #define I2C_CFG_MASK 0x1f |
AnnaBridge | 171:3a7713b1edbc | 46 | |
AnnaBridge | 171:3a7713b1edbc | 47 | /*! |
AnnaBridge | 171:3a7713b1edbc | 48 | * @addtogroup i2c_driver |
AnnaBridge | 171:3a7713b1edbc | 49 | * @{ |
AnnaBridge | 171:3a7713b1edbc | 50 | */ |
AnnaBridge | 171:3a7713b1edbc | 51 | |
AnnaBridge | 171:3a7713b1edbc | 52 | /*! @file */ |
AnnaBridge | 171:3a7713b1edbc | 53 | |
AnnaBridge | 171:3a7713b1edbc | 54 | /*! @name Driver version */ |
AnnaBridge | 171:3a7713b1edbc | 55 | /*@{*/ |
AnnaBridge | 171:3a7713b1edbc | 56 | /*! @brief I2C driver version 2.0.1. */ |
AnnaBridge | 171:3a7713b1edbc | 57 | #define FSL_I2C_DRIVER_VERSION (MAKE_VERSION(2, 0, 1)) |
AnnaBridge | 171:3a7713b1edbc | 58 | /*@}*/ |
AnnaBridge | 171:3a7713b1edbc | 59 | |
AnnaBridge | 171:3a7713b1edbc | 60 | /*! @brief Timeout times for waiting flag. */ |
AnnaBridge | 171:3a7713b1edbc | 61 | #ifndef I2C_WAIT_TIMEOUT |
AnnaBridge | 171:3a7713b1edbc | 62 | #define I2C_WAIT_TIMEOUT 0U /* Define to zero means keep waiting until the flag is assert/deassert. */ |
AnnaBridge | 171:3a7713b1edbc | 63 | #endif |
AnnaBridge | 171:3a7713b1edbc | 64 | |
AnnaBridge | 171:3a7713b1edbc | 65 | /* definitions for MSTCODE bits in I2C Status register STAT */ |
AnnaBridge | 171:3a7713b1edbc | 66 | #define I2C_STAT_MSTCODE_IDLE (0) /*!< Master Idle State Code */ |
AnnaBridge | 171:3a7713b1edbc | 67 | #define I2C_STAT_MSTCODE_RXREADY (1) /*!< Master Receive Ready State Code */ |
AnnaBridge | 171:3a7713b1edbc | 68 | #define I2C_STAT_MSTCODE_TXREADY (2) /*!< Master Transmit Ready State Code */ |
AnnaBridge | 171:3a7713b1edbc | 69 | #define I2C_STAT_MSTCODE_NACKADR (3) /*!< Master NACK by slave on address State Code */ |
AnnaBridge | 171:3a7713b1edbc | 70 | #define I2C_STAT_MSTCODE_NACKDAT (4) /*!< Master NACK by slave on data State Code */ |
AnnaBridge | 171:3a7713b1edbc | 71 | |
AnnaBridge | 171:3a7713b1edbc | 72 | /* definitions for SLVSTATE bits in I2C Status register STAT */ |
AnnaBridge | 171:3a7713b1edbc | 73 | #define I2C_STAT_SLVST_ADDR (0) |
AnnaBridge | 171:3a7713b1edbc | 74 | #define I2C_STAT_SLVST_RX (1) |
AnnaBridge | 171:3a7713b1edbc | 75 | #define I2C_STAT_SLVST_TX (2) |
AnnaBridge | 171:3a7713b1edbc | 76 | |
AnnaBridge | 171:3a7713b1edbc | 77 | /*! @brief I2C status return codes. */ |
AnnaBridge | 171:3a7713b1edbc | 78 | enum _i2c_status |
AnnaBridge | 171:3a7713b1edbc | 79 | { |
AnnaBridge | 171:3a7713b1edbc | 80 | kStatus_I2C_Busy = MAKE_STATUS(kStatusGroup_FLEXCOMM_I2C, 0), /*!< The master is already performing a transfer. */ |
AnnaBridge | 171:3a7713b1edbc | 81 | kStatus_I2C_Idle = MAKE_STATUS(kStatusGroup_FLEXCOMM_I2C, 1), /*!< The slave driver is idle. */ |
AnnaBridge | 171:3a7713b1edbc | 82 | kStatus_I2C_Nak = |
AnnaBridge | 171:3a7713b1edbc | 83 | MAKE_STATUS(kStatusGroup_FLEXCOMM_I2C, 2), /*!< The slave device sent a NAK in response to a byte. */ |
AnnaBridge | 171:3a7713b1edbc | 84 | kStatus_I2C_InvalidParameter = |
AnnaBridge | 171:3a7713b1edbc | 85 | MAKE_STATUS(kStatusGroup_FLEXCOMM_I2C, 3), /*!< Unable to proceed due to invalid parameter. */ |
AnnaBridge | 171:3a7713b1edbc | 86 | kStatus_I2C_BitError = MAKE_STATUS(kStatusGroup_FLEXCOMM_I2C, 4), /*!< Transferred bit was not seen on the bus. */ |
AnnaBridge | 171:3a7713b1edbc | 87 | kStatus_I2C_ArbitrationLost = MAKE_STATUS(kStatusGroup_FLEXCOMM_I2C, 5), /*!< Arbitration lost error. */ |
AnnaBridge | 171:3a7713b1edbc | 88 | kStatus_I2C_NoTransferInProgress = |
AnnaBridge | 171:3a7713b1edbc | 89 | MAKE_STATUS(kStatusGroup_FLEXCOMM_I2C, 6), /*!< Attempt to abort a transfer when one is not in progress. */ |
AnnaBridge | 171:3a7713b1edbc | 90 | kStatus_I2C_DmaRequestFail = MAKE_STATUS(kStatusGroup_FLEXCOMM_I2C, 7), /*!< DMA request failed. */ |
AnnaBridge | 171:3a7713b1edbc | 91 | kStatus_I2C_StartStopError = MAKE_STATUS(kStatusGroup_FLEXCOMM_I2C, 8), |
AnnaBridge | 171:3a7713b1edbc | 92 | kStatus_I2C_UnexpectedState = MAKE_STATUS(kStatusGroup_FLEXCOMM_I2C, 9), |
AnnaBridge | 171:3a7713b1edbc | 93 | kStatus_I2C_Timeout = MAKE_STATUS(kStatusGroup_FLEXCOMM_I2C, 10), /*!< Timeout poling status flags. */ |
AnnaBridge | 171:3a7713b1edbc | 94 | }; |
AnnaBridge | 171:3a7713b1edbc | 95 | |
AnnaBridge | 171:3a7713b1edbc | 96 | /*! @} */ |
AnnaBridge | 171:3a7713b1edbc | 97 | |
AnnaBridge | 171:3a7713b1edbc | 98 | /*! |
AnnaBridge | 171:3a7713b1edbc | 99 | * @addtogroup i2c_master_driver |
AnnaBridge | 171:3a7713b1edbc | 100 | * @{ |
AnnaBridge | 171:3a7713b1edbc | 101 | */ |
AnnaBridge | 171:3a7713b1edbc | 102 | |
AnnaBridge | 171:3a7713b1edbc | 103 | /*! |
AnnaBridge | 171:3a7713b1edbc | 104 | * @brief I2C master peripheral flags. |
AnnaBridge | 171:3a7713b1edbc | 105 | * |
AnnaBridge | 171:3a7713b1edbc | 106 | * @note These enums are meant to be OR'd together to form a bit mask. |
AnnaBridge | 171:3a7713b1edbc | 107 | */ |
AnnaBridge | 171:3a7713b1edbc | 108 | enum _i2c_master_flags |
AnnaBridge | 171:3a7713b1edbc | 109 | { |
AnnaBridge | 171:3a7713b1edbc | 110 | kI2C_MasterPendingFlag = I2C_STAT_MSTPENDING_MASK, /*!< The I2C module is waiting for software interaction. */ |
AnnaBridge | 171:3a7713b1edbc | 111 | kI2C_MasterArbitrationLostFlag = |
AnnaBridge | 171:3a7713b1edbc | 112 | I2C_STAT_MSTARBLOSS_MASK, /*!< The arbitration of the bus was lost. There was collision on the bus */ |
AnnaBridge | 171:3a7713b1edbc | 113 | kI2C_MasterStartStopErrorFlag = |
AnnaBridge | 171:3a7713b1edbc | 114 | I2C_STAT_MSTSTSTPERR_MASK /*!< There was an error during start or stop phase of the transaction. */ |
AnnaBridge | 171:3a7713b1edbc | 115 | }; |
AnnaBridge | 171:3a7713b1edbc | 116 | |
AnnaBridge | 171:3a7713b1edbc | 117 | /*! @brief Direction of master and slave transfers. */ |
AnnaBridge | 171:3a7713b1edbc | 118 | typedef enum _i2c_direction |
AnnaBridge | 171:3a7713b1edbc | 119 | { |
AnnaBridge | 171:3a7713b1edbc | 120 | kI2C_Write = 0U, /*!< Master transmit. */ |
AnnaBridge | 171:3a7713b1edbc | 121 | kI2C_Read = 1U /*!< Master receive. */ |
AnnaBridge | 171:3a7713b1edbc | 122 | } i2c_direction_t; |
AnnaBridge | 171:3a7713b1edbc | 123 | |
AnnaBridge | 171:3a7713b1edbc | 124 | /*! |
AnnaBridge | 171:3a7713b1edbc | 125 | * @brief Structure with settings to initialize the I2C master module. |
AnnaBridge | 171:3a7713b1edbc | 126 | * |
AnnaBridge | 171:3a7713b1edbc | 127 | * This structure holds configuration settings for the I2C peripheral. To initialize this |
AnnaBridge | 171:3a7713b1edbc | 128 | * structure to reasonable defaults, call the I2C_MasterGetDefaultConfig() function and |
AnnaBridge | 171:3a7713b1edbc | 129 | * pass a pointer to your configuration structure instance. |
AnnaBridge | 171:3a7713b1edbc | 130 | * |
AnnaBridge | 171:3a7713b1edbc | 131 | * The configuration structure can be made constant so it resides in flash. |
AnnaBridge | 171:3a7713b1edbc | 132 | */ |
AnnaBridge | 171:3a7713b1edbc | 133 | typedef struct _i2c_master_config |
AnnaBridge | 171:3a7713b1edbc | 134 | { |
AnnaBridge | 171:3a7713b1edbc | 135 | bool enableMaster; /*!< Whether to enable master mode. */ |
AnnaBridge | 171:3a7713b1edbc | 136 | uint32_t baudRate_Bps; /*!< Desired baud rate in bits per second. */ |
AnnaBridge | 171:3a7713b1edbc | 137 | bool enableTimeout; /*!< Enable internal timeout function. */ |
AnnaBridge | 171:3a7713b1edbc | 138 | } i2c_master_config_t; |
AnnaBridge | 171:3a7713b1edbc | 139 | |
AnnaBridge | 171:3a7713b1edbc | 140 | /* Forward declaration of the transfer descriptor and handle typedefs. */ |
AnnaBridge | 171:3a7713b1edbc | 141 | /*! @brief I2C master transfer typedef */ |
AnnaBridge | 171:3a7713b1edbc | 142 | typedef struct _i2c_master_transfer i2c_master_transfer_t; |
AnnaBridge | 171:3a7713b1edbc | 143 | |
AnnaBridge | 171:3a7713b1edbc | 144 | /*! @brief I2C master handle typedef */ |
AnnaBridge | 171:3a7713b1edbc | 145 | typedef struct _i2c_master_handle i2c_master_handle_t; |
AnnaBridge | 171:3a7713b1edbc | 146 | |
AnnaBridge | 171:3a7713b1edbc | 147 | /*! |
AnnaBridge | 171:3a7713b1edbc | 148 | * @brief Master completion callback function pointer type. |
AnnaBridge | 171:3a7713b1edbc | 149 | * |
AnnaBridge | 171:3a7713b1edbc | 150 | * This callback is used only for the non-blocking master transfer API. Specify the callback you wish to use |
AnnaBridge | 171:3a7713b1edbc | 151 | * in the call to I2C_MasterTransferCreateHandle(). |
AnnaBridge | 171:3a7713b1edbc | 152 | * |
AnnaBridge | 171:3a7713b1edbc | 153 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 154 | * @param completionStatus Either kStatus_Success or an error code describing how the transfer completed. |
AnnaBridge | 171:3a7713b1edbc | 155 | * @param userData Arbitrary pointer-sized value passed from the application. |
AnnaBridge | 171:3a7713b1edbc | 156 | */ |
AnnaBridge | 171:3a7713b1edbc | 157 | typedef void (*i2c_master_transfer_callback_t)(I2C_Type *base, |
AnnaBridge | 171:3a7713b1edbc | 158 | i2c_master_handle_t *handle, |
AnnaBridge | 171:3a7713b1edbc | 159 | status_t completionStatus, |
AnnaBridge | 171:3a7713b1edbc | 160 | void *userData); |
AnnaBridge | 171:3a7713b1edbc | 161 | |
AnnaBridge | 171:3a7713b1edbc | 162 | /*! |
AnnaBridge | 171:3a7713b1edbc | 163 | * @brief Transfer option flags. |
AnnaBridge | 171:3a7713b1edbc | 164 | * |
AnnaBridge | 171:3a7713b1edbc | 165 | * @note These enumerations are intended to be OR'd together to form a bit mask of options for |
AnnaBridge | 171:3a7713b1edbc | 166 | * the #_i2c_master_transfer::flags field. |
AnnaBridge | 171:3a7713b1edbc | 167 | */ |
AnnaBridge | 171:3a7713b1edbc | 168 | enum _i2c_master_transfer_flags |
AnnaBridge | 171:3a7713b1edbc | 169 | { |
AnnaBridge | 171:3a7713b1edbc | 170 | kI2C_TransferDefaultFlag = 0x00U, /*!< Transfer starts with a start signal, stops with a stop signal. */ |
AnnaBridge | 171:3a7713b1edbc | 171 | kI2C_TransferNoStartFlag = 0x01U, /*!< Don't send a start condition, address, and sub address */ |
AnnaBridge | 171:3a7713b1edbc | 172 | kI2C_TransferRepeatedStartFlag = 0x02U, /*!< Send a repeated start condition */ |
AnnaBridge | 171:3a7713b1edbc | 173 | kI2C_TransferNoStopFlag = 0x04U, /*!< Don't send a stop condition. */ |
AnnaBridge | 171:3a7713b1edbc | 174 | }; |
AnnaBridge | 171:3a7713b1edbc | 175 | |
AnnaBridge | 171:3a7713b1edbc | 176 | /*! @brief States for the state machine used by transactional APIs. */ |
AnnaBridge | 171:3a7713b1edbc | 177 | enum _i2c_transfer_states |
AnnaBridge | 171:3a7713b1edbc | 178 | { |
AnnaBridge | 171:3a7713b1edbc | 179 | kIdleState = 0, |
AnnaBridge | 171:3a7713b1edbc | 180 | kTransmitSubaddrState, |
AnnaBridge | 171:3a7713b1edbc | 181 | kTransmitDataState, |
AnnaBridge | 171:3a7713b1edbc | 182 | kReceiveDataState, |
AnnaBridge | 171:3a7713b1edbc | 183 | kReceiveLastDataState, |
AnnaBridge | 171:3a7713b1edbc | 184 | kStartState, |
AnnaBridge | 171:3a7713b1edbc | 185 | kStopState, |
AnnaBridge | 171:3a7713b1edbc | 186 | kWaitForCompletionState |
AnnaBridge | 171:3a7713b1edbc | 187 | }; |
AnnaBridge | 171:3a7713b1edbc | 188 | |
AnnaBridge | 171:3a7713b1edbc | 189 | /*! |
AnnaBridge | 171:3a7713b1edbc | 190 | * @brief Non-blocking transfer descriptor structure. |
AnnaBridge | 171:3a7713b1edbc | 191 | * |
AnnaBridge | 171:3a7713b1edbc | 192 | * This structure is used to pass transaction parameters to the I2C_MasterTransferNonBlocking() API. |
AnnaBridge | 171:3a7713b1edbc | 193 | */ |
AnnaBridge | 171:3a7713b1edbc | 194 | struct _i2c_master_transfer |
AnnaBridge | 171:3a7713b1edbc | 195 | { |
AnnaBridge | 171:3a7713b1edbc | 196 | uint32_t flags; /*!< Bit mask of options for the transfer. See enumeration #_i2c_master_transfer_flags for available |
AnnaBridge | 171:3a7713b1edbc | 197 | options. Set to 0 or #kI2C_TransferDefaultFlag for normal transfers. */ |
AnnaBridge | 171:3a7713b1edbc | 198 | uint16_t slaveAddress; /*!< The 7-bit slave address. */ |
AnnaBridge | 171:3a7713b1edbc | 199 | i2c_direction_t direction; /*!< Either #kI2C_Read or #kI2C_Write. */ |
AnnaBridge | 171:3a7713b1edbc | 200 | uint32_t subaddress; /*!< Sub address. Transferred MSB first. */ |
AnnaBridge | 171:3a7713b1edbc | 201 | size_t subaddressSize; /*!< Length of sub address to send in bytes. Maximum size is 4 bytes. */ |
AnnaBridge | 171:3a7713b1edbc | 202 | void *data; /*!< Pointer to data to transfer. */ |
AnnaBridge | 171:3a7713b1edbc | 203 | size_t dataSize; /*!< Number of bytes to transfer. */ |
AnnaBridge | 171:3a7713b1edbc | 204 | }; |
AnnaBridge | 171:3a7713b1edbc | 205 | |
AnnaBridge | 171:3a7713b1edbc | 206 | /*! |
AnnaBridge | 171:3a7713b1edbc | 207 | * @brief Driver handle for master non-blocking APIs. |
AnnaBridge | 171:3a7713b1edbc | 208 | * @note The contents of this structure are private and subject to change. |
AnnaBridge | 171:3a7713b1edbc | 209 | */ |
AnnaBridge | 171:3a7713b1edbc | 210 | struct _i2c_master_handle |
AnnaBridge | 171:3a7713b1edbc | 211 | { |
AnnaBridge | 171:3a7713b1edbc | 212 | uint8_t state; /*!< Transfer state machine current state. */ |
AnnaBridge | 171:3a7713b1edbc | 213 | uint32_t transferCount; /*!< Indicates progress of the transfer */ |
AnnaBridge | 171:3a7713b1edbc | 214 | uint32_t remainingBytes; /*!< Remaining byte count in current state. */ |
AnnaBridge | 171:3a7713b1edbc | 215 | uint8_t *buf; /*!< Buffer pointer for current state. */ |
AnnaBridge | 171:3a7713b1edbc | 216 | uint32_t remainingSubaddr; |
AnnaBridge | 171:3a7713b1edbc | 217 | uint8_t subaddrBuf[4]; |
AnnaBridge | 171:3a7713b1edbc | 218 | i2c_master_transfer_t transfer; /*!< Copy of the current transfer info. */ |
AnnaBridge | 171:3a7713b1edbc | 219 | i2c_master_transfer_callback_t completionCallback; /*!< Callback function pointer. */ |
AnnaBridge | 171:3a7713b1edbc | 220 | void *userData; /*!< Application data passed to callback. */ |
AnnaBridge | 171:3a7713b1edbc | 221 | }; |
AnnaBridge | 171:3a7713b1edbc | 222 | |
AnnaBridge | 171:3a7713b1edbc | 223 | /*! @} */ |
AnnaBridge | 171:3a7713b1edbc | 224 | |
AnnaBridge | 171:3a7713b1edbc | 225 | /*! |
AnnaBridge | 171:3a7713b1edbc | 226 | * @addtogroup i2c_slave_driver |
AnnaBridge | 171:3a7713b1edbc | 227 | * @{ |
AnnaBridge | 171:3a7713b1edbc | 228 | */ |
AnnaBridge | 171:3a7713b1edbc | 229 | |
AnnaBridge | 171:3a7713b1edbc | 230 | /*! |
AnnaBridge | 171:3a7713b1edbc | 231 | * @brief I2C slave peripheral flags. |
AnnaBridge | 171:3a7713b1edbc | 232 | * |
AnnaBridge | 171:3a7713b1edbc | 233 | * @note These enums are meant to be OR'd together to form a bit mask. |
AnnaBridge | 171:3a7713b1edbc | 234 | */ |
AnnaBridge | 171:3a7713b1edbc | 235 | enum _i2c_slave_flags |
AnnaBridge | 171:3a7713b1edbc | 236 | { |
AnnaBridge | 171:3a7713b1edbc | 237 | kI2C_SlavePendingFlag = I2C_STAT_SLVPENDING_MASK, /*!< The I2C module is waiting for software interaction. */ |
AnnaBridge | 171:3a7713b1edbc | 238 | kI2C_SlaveNotStretching = |
AnnaBridge | 171:3a7713b1edbc | 239 | I2C_STAT_SLVNOTSTR_MASK, /*!< Indicates whether the slave is currently stretching clock (0 = yes, 1 = no). */ |
AnnaBridge | 171:3a7713b1edbc | 240 | kI2C_SlaveSelected = I2C_STAT_SLVSEL_MASK, /*!< Indicates whether the slave is selected by an address match. */ |
AnnaBridge | 171:3a7713b1edbc | 241 | kI2C_SaveDeselected = |
AnnaBridge | 171:3a7713b1edbc | 242 | I2C_STAT_SLVDESEL_MASK /*!< Indicates that slave was previously deselected (deselect event took place, w1c). */ |
AnnaBridge | 171:3a7713b1edbc | 243 | }; |
AnnaBridge | 171:3a7713b1edbc | 244 | |
AnnaBridge | 171:3a7713b1edbc | 245 | /*! @brief I2C slave address register. */ |
AnnaBridge | 171:3a7713b1edbc | 246 | typedef enum _i2c_slave_address_register |
AnnaBridge | 171:3a7713b1edbc | 247 | { |
AnnaBridge | 171:3a7713b1edbc | 248 | kI2C_SlaveAddressRegister0 = 0U, /*!< Slave Address 0 register. */ |
AnnaBridge | 171:3a7713b1edbc | 249 | kI2C_SlaveAddressRegister1 = 1U, /*!< Slave Address 1 register. */ |
AnnaBridge | 171:3a7713b1edbc | 250 | kI2C_SlaveAddressRegister2 = 2U, /*!< Slave Address 2 register. */ |
AnnaBridge | 171:3a7713b1edbc | 251 | kI2C_SlaveAddressRegister3 = 3U, /*!< Slave Address 3 register. */ |
AnnaBridge | 171:3a7713b1edbc | 252 | } i2c_slave_address_register_t; |
AnnaBridge | 171:3a7713b1edbc | 253 | |
AnnaBridge | 171:3a7713b1edbc | 254 | /*! @brief Data structure with 7-bit Slave address and Slave address disable. */ |
AnnaBridge | 171:3a7713b1edbc | 255 | typedef struct _i2c_slave_address |
AnnaBridge | 171:3a7713b1edbc | 256 | { |
AnnaBridge | 171:3a7713b1edbc | 257 | uint8_t address; /*!< 7-bit Slave address SLVADR. */ |
AnnaBridge | 171:3a7713b1edbc | 258 | bool addressDisable; /*!< Slave address disable SADISABLE. */ |
AnnaBridge | 171:3a7713b1edbc | 259 | } i2c_slave_address_t; |
AnnaBridge | 171:3a7713b1edbc | 260 | |
AnnaBridge | 171:3a7713b1edbc | 261 | /*! @brief I2C slave address match options. */ |
AnnaBridge | 171:3a7713b1edbc | 262 | typedef enum _i2c_slave_address_qual_mode |
AnnaBridge | 171:3a7713b1edbc | 263 | { |
AnnaBridge | 171:3a7713b1edbc | 264 | kI2C_QualModeMask = 0U, /*!< The SLVQUAL0 field (qualAddress) is used as a logical mask for matching address0. */ |
AnnaBridge | 171:3a7713b1edbc | 265 | kI2C_QualModeExtend = |
AnnaBridge | 171:3a7713b1edbc | 266 | 1U, /*!< The SLVQUAL0 (qualAddress) field is used to extend address 0 matching in a range of addresses. */ |
AnnaBridge | 171:3a7713b1edbc | 267 | } i2c_slave_address_qual_mode_t; |
AnnaBridge | 171:3a7713b1edbc | 268 | |
AnnaBridge | 171:3a7713b1edbc | 269 | /*! @brief I2C slave bus speed options. */ |
AnnaBridge | 171:3a7713b1edbc | 270 | typedef enum _i2c_slave_bus_speed |
AnnaBridge | 171:3a7713b1edbc | 271 | { |
AnnaBridge | 171:3a7713b1edbc | 272 | kI2C_SlaveStandardMode = 0U, |
AnnaBridge | 171:3a7713b1edbc | 273 | kI2C_SlaveFastMode = 1U, |
AnnaBridge | 171:3a7713b1edbc | 274 | kI2C_SlaveFastModePlus = 2U, |
AnnaBridge | 171:3a7713b1edbc | 275 | kI2C_SlaveHsMode = 3U, |
AnnaBridge | 171:3a7713b1edbc | 276 | } i2c_slave_bus_speed_t; |
AnnaBridge | 171:3a7713b1edbc | 277 | |
AnnaBridge | 171:3a7713b1edbc | 278 | /*! |
AnnaBridge | 171:3a7713b1edbc | 279 | * @brief Structure with settings to initialize the I2C slave module. |
AnnaBridge | 171:3a7713b1edbc | 280 | * |
AnnaBridge | 171:3a7713b1edbc | 281 | * This structure holds configuration settings for the I2C slave peripheral. To initialize this |
AnnaBridge | 171:3a7713b1edbc | 282 | * structure to reasonable defaults, call the I2C_SlaveGetDefaultConfig() function and |
AnnaBridge | 171:3a7713b1edbc | 283 | * pass a pointer to your configuration structure instance. |
AnnaBridge | 171:3a7713b1edbc | 284 | * |
AnnaBridge | 171:3a7713b1edbc | 285 | * The configuration structure can be made constant so it resides in flash. |
AnnaBridge | 171:3a7713b1edbc | 286 | */ |
AnnaBridge | 171:3a7713b1edbc | 287 | typedef struct _i2c_slave_config |
AnnaBridge | 171:3a7713b1edbc | 288 | { |
AnnaBridge | 171:3a7713b1edbc | 289 | i2c_slave_address_t address0; /*!< Slave's 7-bit address and disable. */ |
AnnaBridge | 171:3a7713b1edbc | 290 | i2c_slave_address_t address1; /*!< Alternate slave 7-bit address and disable. */ |
AnnaBridge | 171:3a7713b1edbc | 291 | i2c_slave_address_t address2; /*!< Alternate slave 7-bit address and disable. */ |
AnnaBridge | 171:3a7713b1edbc | 292 | i2c_slave_address_t address3; /*!< Alternate slave 7-bit address and disable. */ |
AnnaBridge | 171:3a7713b1edbc | 293 | i2c_slave_address_qual_mode_t qualMode; /*!< Qualify mode for slave address 0. */ |
AnnaBridge | 171:3a7713b1edbc | 294 | uint8_t qualAddress; /*!< Slave address qualifier for address 0. */ |
AnnaBridge | 171:3a7713b1edbc | 295 | i2c_slave_bus_speed_t |
AnnaBridge | 171:3a7713b1edbc | 296 | busSpeed; /*!< Slave bus speed mode. If the slave function stretches SCL to allow for software response, it must |
AnnaBridge | 171:3a7713b1edbc | 297 | provide sufficient data setup time to the master before releasing the stretched clock. |
AnnaBridge | 171:3a7713b1edbc | 298 | This is accomplished by inserting one clock time of CLKDIV at that point. |
AnnaBridge | 171:3a7713b1edbc | 299 | The #busSpeed value is used to configure CLKDIV |
AnnaBridge | 171:3a7713b1edbc | 300 | such that one clock time is greater than the tSU;DAT value noted |
AnnaBridge | 171:3a7713b1edbc | 301 | in the I2C bus specification for the I2C mode that is being used. |
AnnaBridge | 171:3a7713b1edbc | 302 | If the #busSpeed mode is unknown at compile time, use the longest data setup time |
AnnaBridge | 171:3a7713b1edbc | 303 | kI2C_SlaveStandardMode (250 ns) */ |
AnnaBridge | 171:3a7713b1edbc | 304 | bool enableSlave; /*!< Enable slave mode. */ |
AnnaBridge | 171:3a7713b1edbc | 305 | } i2c_slave_config_t; |
AnnaBridge | 171:3a7713b1edbc | 306 | |
AnnaBridge | 171:3a7713b1edbc | 307 | /*! |
AnnaBridge | 171:3a7713b1edbc | 308 | * @brief Set of events sent to the callback for non blocking slave transfers. |
AnnaBridge | 171:3a7713b1edbc | 309 | * |
AnnaBridge | 171:3a7713b1edbc | 310 | * These event enumerations are used for two related purposes. First, a bit mask created by OR'ing together |
AnnaBridge | 171:3a7713b1edbc | 311 | * events is passed to I2C_SlaveTransferNonBlocking() in order to specify which events to enable. |
AnnaBridge | 171:3a7713b1edbc | 312 | * Then, when the slave callback is invoked, it is passed the current event through its @a transfer |
AnnaBridge | 171:3a7713b1edbc | 313 | * parameter. |
AnnaBridge | 171:3a7713b1edbc | 314 | * |
AnnaBridge | 171:3a7713b1edbc | 315 | * @note These enumerations are meant to be OR'd together to form a bit mask of events. |
AnnaBridge | 171:3a7713b1edbc | 316 | */ |
AnnaBridge | 171:3a7713b1edbc | 317 | typedef enum _i2c_slave_transfer_event |
AnnaBridge | 171:3a7713b1edbc | 318 | { |
AnnaBridge | 171:3a7713b1edbc | 319 | kI2C_SlaveAddressMatchEvent = 0x01U, /*!< Received the slave address after a start or repeated start. */ |
AnnaBridge | 171:3a7713b1edbc | 320 | kI2C_SlaveTransmitEvent = 0x02U, /*!< Callback is requested to provide data to transmit |
AnnaBridge | 171:3a7713b1edbc | 321 | (slave-transmitter role). */ |
AnnaBridge | 171:3a7713b1edbc | 322 | kI2C_SlaveReceiveEvent = 0x04U, /*!< Callback is requested to provide a buffer in which to place received |
AnnaBridge | 171:3a7713b1edbc | 323 | data (slave-receiver role). */ |
AnnaBridge | 171:3a7713b1edbc | 324 | kI2C_SlaveCompletionEvent = 0x20U, /*!< All data in the active transfer have been consumed. */ |
AnnaBridge | 171:3a7713b1edbc | 325 | kI2C_SlaveDeselectedEvent = |
AnnaBridge | 171:3a7713b1edbc | 326 | 0x40U, /*!< The slave function has become deselected (SLVSEL flag changing from 1 to 0. */ |
AnnaBridge | 171:3a7713b1edbc | 327 | |
AnnaBridge | 171:3a7713b1edbc | 328 | /*! Bit mask of all available events. */ |
AnnaBridge | 171:3a7713b1edbc | 329 | kI2C_SlaveAllEvents = kI2C_SlaveAddressMatchEvent | kI2C_SlaveTransmitEvent | kI2C_SlaveReceiveEvent | |
AnnaBridge | 171:3a7713b1edbc | 330 | kI2C_SlaveCompletionEvent | kI2C_SlaveDeselectedEvent, |
AnnaBridge | 171:3a7713b1edbc | 331 | } i2c_slave_transfer_event_t; |
AnnaBridge | 171:3a7713b1edbc | 332 | |
AnnaBridge | 171:3a7713b1edbc | 333 | /*! @brief I2C slave handle typedef. */ |
AnnaBridge | 171:3a7713b1edbc | 334 | typedef struct _i2c_slave_handle i2c_slave_handle_t; |
AnnaBridge | 171:3a7713b1edbc | 335 | |
AnnaBridge | 171:3a7713b1edbc | 336 | /*! @brief I2C slave transfer structure */ |
AnnaBridge | 171:3a7713b1edbc | 337 | typedef struct _i2c_slave_transfer |
AnnaBridge | 171:3a7713b1edbc | 338 | { |
AnnaBridge | 171:3a7713b1edbc | 339 | i2c_slave_handle_t *handle; /*!< Pointer to handle that contains this transfer. */ |
AnnaBridge | 171:3a7713b1edbc | 340 | i2c_slave_transfer_event_t event; /*!< Reason the callback is being invoked. */ |
AnnaBridge | 171:3a7713b1edbc | 341 | uint8_t receivedAddress; /*!< Matching address send by master. 7-bits plus R/nW bit0 */ |
AnnaBridge | 171:3a7713b1edbc | 342 | uint32_t eventMask; /*!< Mask of enabled events. */ |
AnnaBridge | 171:3a7713b1edbc | 343 | uint8_t *rxData; /*!< Transfer buffer for receive data */ |
AnnaBridge | 171:3a7713b1edbc | 344 | const uint8_t *txData; /*!< Transfer buffer for transmit data */ |
AnnaBridge | 171:3a7713b1edbc | 345 | size_t txSize; /*!< Transfer size */ |
AnnaBridge | 171:3a7713b1edbc | 346 | size_t rxSize; /*!< Transfer size */ |
AnnaBridge | 171:3a7713b1edbc | 347 | size_t transferredCount; /*!< Number of bytes transferred during this transfer. */ |
AnnaBridge | 171:3a7713b1edbc | 348 | status_t completionStatus; /*!< Success or error code describing how the transfer completed. Only applies for |
AnnaBridge | 171:3a7713b1edbc | 349 | #kI2C_SlaveCompletionEvent. */ |
AnnaBridge | 171:3a7713b1edbc | 350 | } i2c_slave_transfer_t; |
AnnaBridge | 171:3a7713b1edbc | 351 | |
AnnaBridge | 171:3a7713b1edbc | 352 | /*! |
AnnaBridge | 171:3a7713b1edbc | 353 | * @brief Slave event callback function pointer type. |
AnnaBridge | 171:3a7713b1edbc | 354 | * |
AnnaBridge | 171:3a7713b1edbc | 355 | * This callback is used only for the slave non-blocking transfer API. To install a callback, |
AnnaBridge | 171:3a7713b1edbc | 356 | * use the I2C_SlaveSetCallback() function after you have created a handle. |
AnnaBridge | 171:3a7713b1edbc | 357 | * |
AnnaBridge | 171:3a7713b1edbc | 358 | * @param base Base address for the I2C instance on which the event occurred. |
AnnaBridge | 171:3a7713b1edbc | 359 | * @param transfer Pointer to transfer descriptor containing values passed to and/or from the callback. |
AnnaBridge | 171:3a7713b1edbc | 360 | * @param userData Arbitrary pointer-sized value passed from the application. |
AnnaBridge | 171:3a7713b1edbc | 361 | */ |
AnnaBridge | 171:3a7713b1edbc | 362 | typedef void (*i2c_slave_transfer_callback_t)(I2C_Type *base, volatile i2c_slave_transfer_t *transfer, void *userData); |
AnnaBridge | 171:3a7713b1edbc | 363 | |
AnnaBridge | 171:3a7713b1edbc | 364 | /*! |
AnnaBridge | 171:3a7713b1edbc | 365 | * @brief I2C slave software finite state machine states. |
AnnaBridge | 171:3a7713b1edbc | 366 | */ |
AnnaBridge | 171:3a7713b1edbc | 367 | typedef enum _i2c_slave_fsm |
AnnaBridge | 171:3a7713b1edbc | 368 | { |
AnnaBridge | 171:3a7713b1edbc | 369 | kI2C_SlaveFsmAddressMatch = 0u, |
AnnaBridge | 171:3a7713b1edbc | 370 | kI2C_SlaveFsmReceive = 2u, |
AnnaBridge | 171:3a7713b1edbc | 371 | kI2C_SlaveFsmTransmit = 3u, |
AnnaBridge | 171:3a7713b1edbc | 372 | } i2c_slave_fsm_t; |
AnnaBridge | 171:3a7713b1edbc | 373 | |
AnnaBridge | 171:3a7713b1edbc | 374 | /*! |
AnnaBridge | 171:3a7713b1edbc | 375 | * @brief I2C slave handle structure. |
AnnaBridge | 171:3a7713b1edbc | 376 | * @note The contents of this structure are private and subject to change. |
AnnaBridge | 171:3a7713b1edbc | 377 | */ |
AnnaBridge | 171:3a7713b1edbc | 378 | struct _i2c_slave_handle |
AnnaBridge | 171:3a7713b1edbc | 379 | { |
AnnaBridge | 171:3a7713b1edbc | 380 | volatile i2c_slave_transfer_t transfer; /*!< I2C slave transfer. */ |
AnnaBridge | 171:3a7713b1edbc | 381 | volatile bool isBusy; /*!< Whether transfer is busy. */ |
AnnaBridge | 171:3a7713b1edbc | 382 | volatile i2c_slave_fsm_t slaveFsm; /*!< slave transfer state machine. */ |
AnnaBridge | 171:3a7713b1edbc | 383 | i2c_slave_transfer_callback_t callback; /*!< Callback function called at transfer event. */ |
AnnaBridge | 171:3a7713b1edbc | 384 | void *userData; /*!< Callback parameter passed to callback. */ |
AnnaBridge | 171:3a7713b1edbc | 385 | }; |
AnnaBridge | 171:3a7713b1edbc | 386 | |
AnnaBridge | 171:3a7713b1edbc | 387 | /*! @} */ |
AnnaBridge | 171:3a7713b1edbc | 388 | |
AnnaBridge | 171:3a7713b1edbc | 389 | /******************************************************************************* |
AnnaBridge | 171:3a7713b1edbc | 390 | * API |
AnnaBridge | 171:3a7713b1edbc | 391 | ******************************************************************************/ |
AnnaBridge | 171:3a7713b1edbc | 392 | |
AnnaBridge | 171:3a7713b1edbc | 393 | #if defined(__cplusplus) |
AnnaBridge | 171:3a7713b1edbc | 394 | extern "C" { |
AnnaBridge | 171:3a7713b1edbc | 395 | #endif |
AnnaBridge | 171:3a7713b1edbc | 396 | |
AnnaBridge | 171:3a7713b1edbc | 397 | /*! |
AnnaBridge | 171:3a7713b1edbc | 398 | * @addtogroup i2c_master_driver |
AnnaBridge | 171:3a7713b1edbc | 399 | * @{ |
AnnaBridge | 171:3a7713b1edbc | 400 | */ |
AnnaBridge | 171:3a7713b1edbc | 401 | |
AnnaBridge | 171:3a7713b1edbc | 402 | /*! @name Initialization and deinitialization */ |
AnnaBridge | 171:3a7713b1edbc | 403 | /*@{*/ |
AnnaBridge | 171:3a7713b1edbc | 404 | |
AnnaBridge | 171:3a7713b1edbc | 405 | /*! |
AnnaBridge | 171:3a7713b1edbc | 406 | * @brief Provides a default configuration for the I2C master peripheral. |
AnnaBridge | 171:3a7713b1edbc | 407 | * |
AnnaBridge | 171:3a7713b1edbc | 408 | * This function provides the following default configuration for the I2C master peripheral: |
AnnaBridge | 171:3a7713b1edbc | 409 | * @code |
AnnaBridge | 171:3a7713b1edbc | 410 | * masterConfig->enableMaster = true; |
AnnaBridge | 171:3a7713b1edbc | 411 | * masterConfig->baudRate_Bps = 100000U; |
AnnaBridge | 171:3a7713b1edbc | 412 | * masterConfig->enableTimeout = false; |
AnnaBridge | 171:3a7713b1edbc | 413 | * @endcode |
AnnaBridge | 171:3a7713b1edbc | 414 | * |
AnnaBridge | 171:3a7713b1edbc | 415 | * After calling this function, you can override any settings in order to customize the configuration, |
AnnaBridge | 171:3a7713b1edbc | 416 | * prior to initializing the master driver with I2C_MasterInit(). |
AnnaBridge | 171:3a7713b1edbc | 417 | * |
AnnaBridge | 171:3a7713b1edbc | 418 | * @param[out] masterConfig User provided configuration structure for default values. Refer to #i2c_master_config_t. |
AnnaBridge | 171:3a7713b1edbc | 419 | */ |
AnnaBridge | 171:3a7713b1edbc | 420 | void I2C_MasterGetDefaultConfig(i2c_master_config_t *masterConfig); |
AnnaBridge | 171:3a7713b1edbc | 421 | |
AnnaBridge | 171:3a7713b1edbc | 422 | /*! |
AnnaBridge | 171:3a7713b1edbc | 423 | * @brief Initializes the I2C master peripheral. |
AnnaBridge | 171:3a7713b1edbc | 424 | * |
AnnaBridge | 171:3a7713b1edbc | 425 | * This function enables the peripheral clock and initializes the I2C master peripheral as described by the user |
AnnaBridge | 171:3a7713b1edbc | 426 | * provided configuration. A software reset is performed prior to configuration. |
AnnaBridge | 171:3a7713b1edbc | 427 | * |
AnnaBridge | 171:3a7713b1edbc | 428 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 429 | * @param masterConfig User provided peripheral configuration. Use I2C_MasterGetDefaultConfig() to get a set of |
AnnaBridge | 171:3a7713b1edbc | 430 | * defaults |
AnnaBridge | 171:3a7713b1edbc | 431 | * that you can override. |
AnnaBridge | 171:3a7713b1edbc | 432 | * @param srcClock_Hz Frequency in Hertz of the I2C functional clock. Used to calculate the baud rate divisors, |
AnnaBridge | 171:3a7713b1edbc | 433 | * filter widths, and timeout periods. |
AnnaBridge | 171:3a7713b1edbc | 434 | */ |
AnnaBridge | 171:3a7713b1edbc | 435 | void I2C_MasterInit(I2C_Type *base, const i2c_master_config_t *masterConfig, uint32_t srcClock_Hz); |
AnnaBridge | 171:3a7713b1edbc | 436 | |
AnnaBridge | 171:3a7713b1edbc | 437 | /*! |
AnnaBridge | 171:3a7713b1edbc | 438 | * @brief Deinitializes the I2C master peripheral. |
AnnaBridge | 171:3a7713b1edbc | 439 | * |
AnnaBridge | 171:3a7713b1edbc | 440 | * This function disables the I2C master peripheral and gates the clock. It also performs a software |
AnnaBridge | 171:3a7713b1edbc | 441 | * reset to restore the peripheral to reset conditions. |
AnnaBridge | 171:3a7713b1edbc | 442 | * |
AnnaBridge | 171:3a7713b1edbc | 443 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 444 | */ |
AnnaBridge | 171:3a7713b1edbc | 445 | void I2C_MasterDeinit(I2C_Type *base); |
AnnaBridge | 171:3a7713b1edbc | 446 | |
AnnaBridge | 171:3a7713b1edbc | 447 | /*! |
AnnaBridge | 171:3a7713b1edbc | 448 | * @brief Performs a software reset. |
AnnaBridge | 171:3a7713b1edbc | 449 | * |
AnnaBridge | 171:3a7713b1edbc | 450 | * Restores the I2C master peripheral to reset conditions. |
AnnaBridge | 171:3a7713b1edbc | 451 | * |
AnnaBridge | 171:3a7713b1edbc | 452 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 453 | */ |
AnnaBridge | 171:3a7713b1edbc | 454 | static inline void I2C_MasterReset(I2C_Type *base) |
AnnaBridge | 171:3a7713b1edbc | 455 | { |
AnnaBridge | 171:3a7713b1edbc | 456 | } |
AnnaBridge | 171:3a7713b1edbc | 457 | |
AnnaBridge | 171:3a7713b1edbc | 458 | /*! |
AnnaBridge | 171:3a7713b1edbc | 459 | * @brief Enables or disables the I2C module as master. |
AnnaBridge | 171:3a7713b1edbc | 460 | * |
AnnaBridge | 171:3a7713b1edbc | 461 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 462 | * @param enable Pass true to enable or false to disable the specified I2C as master. |
AnnaBridge | 171:3a7713b1edbc | 463 | */ |
AnnaBridge | 171:3a7713b1edbc | 464 | static inline void I2C_MasterEnable(I2C_Type *base, bool enable) |
AnnaBridge | 171:3a7713b1edbc | 465 | { |
AnnaBridge | 171:3a7713b1edbc | 466 | if (enable) |
AnnaBridge | 171:3a7713b1edbc | 467 | { |
AnnaBridge | 171:3a7713b1edbc | 468 | base->CFG = (base->CFG & I2C_CFG_MASK) | I2C_CFG_MSTEN_MASK; |
AnnaBridge | 171:3a7713b1edbc | 469 | } |
AnnaBridge | 171:3a7713b1edbc | 470 | else |
AnnaBridge | 171:3a7713b1edbc | 471 | { |
AnnaBridge | 171:3a7713b1edbc | 472 | base->CFG = (base->CFG & I2C_CFG_MASK) & ~I2C_CFG_MSTEN_MASK; |
AnnaBridge | 171:3a7713b1edbc | 473 | } |
AnnaBridge | 171:3a7713b1edbc | 474 | } |
AnnaBridge | 171:3a7713b1edbc | 475 | |
AnnaBridge | 171:3a7713b1edbc | 476 | /*@}*/ |
AnnaBridge | 171:3a7713b1edbc | 477 | |
AnnaBridge | 171:3a7713b1edbc | 478 | /*! @name Status */ |
AnnaBridge | 171:3a7713b1edbc | 479 | /*@{*/ |
AnnaBridge | 171:3a7713b1edbc | 480 | |
AnnaBridge | 171:3a7713b1edbc | 481 | /*! |
AnnaBridge | 171:3a7713b1edbc | 482 | * @brief Gets the I2C status flags. |
AnnaBridge | 171:3a7713b1edbc | 483 | * |
AnnaBridge | 171:3a7713b1edbc | 484 | * A bit mask with the state of all I2C status flags is returned. For each flag, the corresponding bit |
AnnaBridge | 171:3a7713b1edbc | 485 | * in the return value is set if the flag is asserted. |
AnnaBridge | 171:3a7713b1edbc | 486 | * |
AnnaBridge | 171:3a7713b1edbc | 487 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 488 | * @return State of the status flags: |
AnnaBridge | 171:3a7713b1edbc | 489 | * - 1: related status flag is set. |
AnnaBridge | 171:3a7713b1edbc | 490 | * - 0: related status flag is not set. |
AnnaBridge | 171:3a7713b1edbc | 491 | * @see _i2c_master_flags |
AnnaBridge | 171:3a7713b1edbc | 492 | */ |
AnnaBridge | 171:3a7713b1edbc | 493 | static inline uint32_t I2C_GetStatusFlags(I2C_Type *base) |
AnnaBridge | 171:3a7713b1edbc | 494 | { |
AnnaBridge | 171:3a7713b1edbc | 495 | return base->STAT; |
AnnaBridge | 171:3a7713b1edbc | 496 | } |
AnnaBridge | 171:3a7713b1edbc | 497 | |
AnnaBridge | 171:3a7713b1edbc | 498 | /*! |
AnnaBridge | 171:3a7713b1edbc | 499 | * @brief Clears the I2C master status flag state. |
AnnaBridge | 171:3a7713b1edbc | 500 | * |
AnnaBridge | 171:3a7713b1edbc | 501 | * The following status register flags can be cleared: |
AnnaBridge | 171:3a7713b1edbc | 502 | * - #kI2C_MasterArbitrationLostFlag |
AnnaBridge | 171:3a7713b1edbc | 503 | * - #kI2C_MasterStartStopErrorFlag |
AnnaBridge | 171:3a7713b1edbc | 504 | * |
AnnaBridge | 171:3a7713b1edbc | 505 | * Attempts to clear other flags has no effect. |
AnnaBridge | 171:3a7713b1edbc | 506 | * |
AnnaBridge | 171:3a7713b1edbc | 507 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 508 | * @param statusMask A bitmask of status flags that are to be cleared. The mask is composed of |
AnnaBridge | 171:3a7713b1edbc | 509 | * #_i2c_master_flags enumerators OR'd together. You may pass the result of a previous call to |
AnnaBridge | 171:3a7713b1edbc | 510 | * I2C_GetStatusFlags(). |
AnnaBridge | 171:3a7713b1edbc | 511 | * @see _i2c_master_flags. |
AnnaBridge | 171:3a7713b1edbc | 512 | */ |
AnnaBridge | 171:3a7713b1edbc | 513 | static inline void I2C_MasterClearStatusFlags(I2C_Type *base, uint32_t statusMask) |
AnnaBridge | 171:3a7713b1edbc | 514 | { |
AnnaBridge | 171:3a7713b1edbc | 515 | /* Allow clearing just master status flags */ |
AnnaBridge | 171:3a7713b1edbc | 516 | base->STAT = statusMask & (I2C_STAT_MSTARBLOSS_MASK | I2C_STAT_MSTSTSTPERR_MASK); |
AnnaBridge | 171:3a7713b1edbc | 517 | } |
AnnaBridge | 171:3a7713b1edbc | 518 | |
AnnaBridge | 171:3a7713b1edbc | 519 | /*@}*/ |
AnnaBridge | 171:3a7713b1edbc | 520 | |
AnnaBridge | 171:3a7713b1edbc | 521 | /*! @name Interrupts */ |
AnnaBridge | 171:3a7713b1edbc | 522 | /*@{*/ |
AnnaBridge | 171:3a7713b1edbc | 523 | |
AnnaBridge | 171:3a7713b1edbc | 524 | /*! |
AnnaBridge | 171:3a7713b1edbc | 525 | * @brief Enables the I2C master interrupt requests. |
AnnaBridge | 171:3a7713b1edbc | 526 | * |
AnnaBridge | 171:3a7713b1edbc | 527 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 528 | * @param interruptMask Bit mask of interrupts to enable. See #_i2c_master_flags for the set |
AnnaBridge | 171:3a7713b1edbc | 529 | * of constants that should be OR'd together to form the bit mask. |
AnnaBridge | 171:3a7713b1edbc | 530 | */ |
AnnaBridge | 171:3a7713b1edbc | 531 | static inline void I2C_EnableInterrupts(I2C_Type *base, uint32_t interruptMask) |
AnnaBridge | 171:3a7713b1edbc | 532 | { |
AnnaBridge | 171:3a7713b1edbc | 533 | base->INTENSET = interruptMask; |
AnnaBridge | 171:3a7713b1edbc | 534 | } |
AnnaBridge | 171:3a7713b1edbc | 535 | |
AnnaBridge | 171:3a7713b1edbc | 536 | /*! |
AnnaBridge | 171:3a7713b1edbc | 537 | * @brief Disables the I2C master interrupt requests. |
AnnaBridge | 171:3a7713b1edbc | 538 | * |
AnnaBridge | 171:3a7713b1edbc | 539 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 540 | * @param interruptMask Bit mask of interrupts to disable. See #_i2c_master_flags for the set |
AnnaBridge | 171:3a7713b1edbc | 541 | * of constants that should be OR'd together to form the bit mask. |
AnnaBridge | 171:3a7713b1edbc | 542 | */ |
AnnaBridge | 171:3a7713b1edbc | 543 | static inline void I2C_DisableInterrupts(I2C_Type *base, uint32_t interruptMask) |
AnnaBridge | 171:3a7713b1edbc | 544 | { |
AnnaBridge | 171:3a7713b1edbc | 545 | base->INTENCLR = interruptMask; |
AnnaBridge | 171:3a7713b1edbc | 546 | } |
AnnaBridge | 171:3a7713b1edbc | 547 | |
AnnaBridge | 171:3a7713b1edbc | 548 | /*! |
AnnaBridge | 171:3a7713b1edbc | 549 | * @brief Returns the set of currently enabled I2C master interrupt requests. |
AnnaBridge | 171:3a7713b1edbc | 550 | * |
AnnaBridge | 171:3a7713b1edbc | 551 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 552 | * @return A bitmask composed of #_i2c_master_flags enumerators OR'd together to indicate the |
AnnaBridge | 171:3a7713b1edbc | 553 | * set of enabled interrupts. |
AnnaBridge | 171:3a7713b1edbc | 554 | */ |
AnnaBridge | 171:3a7713b1edbc | 555 | static inline uint32_t I2C_GetEnabledInterrupts(I2C_Type *base) |
AnnaBridge | 171:3a7713b1edbc | 556 | { |
AnnaBridge | 171:3a7713b1edbc | 557 | return base->INTSTAT; |
AnnaBridge | 171:3a7713b1edbc | 558 | } |
AnnaBridge | 171:3a7713b1edbc | 559 | |
AnnaBridge | 171:3a7713b1edbc | 560 | /*@}*/ |
AnnaBridge | 171:3a7713b1edbc | 561 | |
AnnaBridge | 171:3a7713b1edbc | 562 | /*! @name Bus operations */ |
AnnaBridge | 171:3a7713b1edbc | 563 | /*@{*/ |
AnnaBridge | 171:3a7713b1edbc | 564 | |
AnnaBridge | 171:3a7713b1edbc | 565 | /*! |
AnnaBridge | 171:3a7713b1edbc | 566 | * @brief Sets the I2C bus frequency for master transactions. |
AnnaBridge | 171:3a7713b1edbc | 567 | * |
AnnaBridge | 171:3a7713b1edbc | 568 | * The I2C master is automatically disabled and re-enabled as necessary to configure the baud |
AnnaBridge | 171:3a7713b1edbc | 569 | * rate. Do not call this function during a transfer, or the transfer is aborted. |
AnnaBridge | 171:3a7713b1edbc | 570 | * |
AnnaBridge | 171:3a7713b1edbc | 571 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 572 | * @param srcClock_Hz I2C functional clock frequency in Hertz. |
AnnaBridge | 171:3a7713b1edbc | 573 | * @param baudRate_Bps Requested bus frequency in bits per second. |
AnnaBridge | 171:3a7713b1edbc | 574 | */ |
AnnaBridge | 171:3a7713b1edbc | 575 | void I2C_MasterSetBaudRate(I2C_Type *base, uint32_t baudRate_Bps, uint32_t srcClock_Hz); |
AnnaBridge | 171:3a7713b1edbc | 576 | |
AnnaBridge | 171:3a7713b1edbc | 577 | /*! |
AnnaBridge | 171:3a7713b1edbc | 578 | * @brief Returns whether the bus is idle. |
AnnaBridge | 171:3a7713b1edbc | 579 | * |
AnnaBridge | 171:3a7713b1edbc | 580 | * Requires the master mode to be enabled. |
AnnaBridge | 171:3a7713b1edbc | 581 | * |
AnnaBridge | 171:3a7713b1edbc | 582 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 583 | * @retval true Bus is busy. |
AnnaBridge | 171:3a7713b1edbc | 584 | * @retval false Bus is idle. |
AnnaBridge | 171:3a7713b1edbc | 585 | */ |
AnnaBridge | 171:3a7713b1edbc | 586 | static inline bool I2C_MasterGetBusIdleState(I2C_Type *base) |
AnnaBridge | 171:3a7713b1edbc | 587 | { |
AnnaBridge | 171:3a7713b1edbc | 588 | /* True if MSTPENDING flag is set and MSTSTATE is zero == idle */ |
AnnaBridge | 171:3a7713b1edbc | 589 | return ((base->STAT & (I2C_STAT_MSTPENDING_MASK | I2C_STAT_MSTSTATE_MASK)) == I2C_STAT_MSTPENDING_MASK); |
AnnaBridge | 171:3a7713b1edbc | 590 | } |
AnnaBridge | 171:3a7713b1edbc | 591 | |
AnnaBridge | 171:3a7713b1edbc | 592 | /*! |
AnnaBridge | 171:3a7713b1edbc | 593 | * @brief Sends a START on the I2C bus. |
AnnaBridge | 171:3a7713b1edbc | 594 | * |
AnnaBridge | 171:3a7713b1edbc | 595 | * This function is used to initiate a new master mode transfer by sending the START signal. |
AnnaBridge | 171:3a7713b1edbc | 596 | * The slave address is sent following the I2C START signal. |
AnnaBridge | 171:3a7713b1edbc | 597 | * |
AnnaBridge | 171:3a7713b1edbc | 598 | * @param base I2C peripheral base pointer |
AnnaBridge | 171:3a7713b1edbc | 599 | * @param address 7-bit slave device address. |
AnnaBridge | 171:3a7713b1edbc | 600 | * @param direction Master transfer directions(transmit/receive). |
AnnaBridge | 171:3a7713b1edbc | 601 | * @retval kStatus_Success Successfully send the start signal. |
AnnaBridge | 171:3a7713b1edbc | 602 | * @retval kStatus_I2C_Busy Current bus is busy. |
AnnaBridge | 171:3a7713b1edbc | 603 | */ |
AnnaBridge | 171:3a7713b1edbc | 604 | status_t I2C_MasterStart(I2C_Type *base, uint8_t address, i2c_direction_t direction); |
AnnaBridge | 171:3a7713b1edbc | 605 | |
AnnaBridge | 171:3a7713b1edbc | 606 | /*! |
AnnaBridge | 171:3a7713b1edbc | 607 | * @brief Sends a STOP signal on the I2C bus. |
AnnaBridge | 171:3a7713b1edbc | 608 | * |
AnnaBridge | 171:3a7713b1edbc | 609 | * @retval kStatus_Success Successfully send the stop signal. |
AnnaBridge | 171:3a7713b1edbc | 610 | * @retval kStatus_I2C_Timeout Send stop signal failed, timeout. |
AnnaBridge | 171:3a7713b1edbc | 611 | */ |
AnnaBridge | 171:3a7713b1edbc | 612 | status_t I2C_MasterStop(I2C_Type *base); |
AnnaBridge | 171:3a7713b1edbc | 613 | |
AnnaBridge | 171:3a7713b1edbc | 614 | /*! |
AnnaBridge | 171:3a7713b1edbc | 615 | * @brief Sends a REPEATED START on the I2C bus. |
AnnaBridge | 171:3a7713b1edbc | 616 | * |
AnnaBridge | 171:3a7713b1edbc | 617 | * @param base I2C peripheral base pointer |
AnnaBridge | 171:3a7713b1edbc | 618 | * @param address 7-bit slave device address. |
AnnaBridge | 171:3a7713b1edbc | 619 | * @param direction Master transfer directions(transmit/receive). |
AnnaBridge | 171:3a7713b1edbc | 620 | * @retval kStatus_Success Successfully send the start signal. |
AnnaBridge | 171:3a7713b1edbc | 621 | * @retval kStatus_I2C_Busy Current bus is busy but not occupied by current I2C master. |
AnnaBridge | 171:3a7713b1edbc | 622 | */ |
AnnaBridge | 171:3a7713b1edbc | 623 | static inline status_t I2C_MasterRepeatedStart(I2C_Type *base, uint8_t address, i2c_direction_t direction) |
AnnaBridge | 171:3a7713b1edbc | 624 | { |
AnnaBridge | 171:3a7713b1edbc | 625 | return I2C_MasterStart(base, address, direction); |
AnnaBridge | 171:3a7713b1edbc | 626 | } |
AnnaBridge | 171:3a7713b1edbc | 627 | |
AnnaBridge | 171:3a7713b1edbc | 628 | /*! |
AnnaBridge | 171:3a7713b1edbc | 629 | * @brief Performs a polling send transfer on the I2C bus. |
AnnaBridge | 171:3a7713b1edbc | 630 | * |
AnnaBridge | 171:3a7713b1edbc | 631 | * Sends up to @a txSize number of bytes to the previously addressed slave device. The slave may |
AnnaBridge | 171:3a7713b1edbc | 632 | * reply with a NAK to any byte in order to terminate the transfer early. If this happens, this |
AnnaBridge | 171:3a7713b1edbc | 633 | * function returns #kStatus_I2C_Nak. |
AnnaBridge | 171:3a7713b1edbc | 634 | * |
AnnaBridge | 171:3a7713b1edbc | 635 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 636 | * @param txBuff The pointer to the data to be transferred. |
AnnaBridge | 171:3a7713b1edbc | 637 | * @param txSize The length in bytes of the data to be transferred. |
AnnaBridge | 171:3a7713b1edbc | 638 | * @param flags Transfer control flag to control special behavior like suppressing start or stop, for normal transfers |
AnnaBridge | 171:3a7713b1edbc | 639 | * use kI2C_TransferDefaultFlag |
AnnaBridge | 171:3a7713b1edbc | 640 | * @retval kStatus_Success Data was sent successfully. |
AnnaBridge | 171:3a7713b1edbc | 641 | * @retval #kStatus_I2C_Busy Another master is currently utilizing the bus. |
AnnaBridge | 171:3a7713b1edbc | 642 | * @retval #kStatus_I2C_Nak The slave device sent a NAK in response to a byte. |
AnnaBridge | 171:3a7713b1edbc | 643 | * @retval #kStatus_I2C_ArbitrationLost Arbitration lost error. |
AnnaBridge | 171:3a7713b1edbc | 644 | */ |
AnnaBridge | 171:3a7713b1edbc | 645 | status_t I2C_MasterWriteBlocking(I2C_Type *base, const void *txBuff, size_t txSize, uint32_t flags); |
AnnaBridge | 171:3a7713b1edbc | 646 | |
AnnaBridge | 171:3a7713b1edbc | 647 | /*! |
AnnaBridge | 171:3a7713b1edbc | 648 | * @brief Performs a polling receive transfer on the I2C bus. |
AnnaBridge | 171:3a7713b1edbc | 649 | * |
AnnaBridge | 171:3a7713b1edbc | 650 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 651 | * @param rxBuff The pointer to the data to be transferred. |
AnnaBridge | 171:3a7713b1edbc | 652 | * @param rxSize The length in bytes of the data to be transferred. |
AnnaBridge | 171:3a7713b1edbc | 653 | * @param flags Transfer control flag to control special behavior like suppressing start or stop, for normal transfers |
AnnaBridge | 171:3a7713b1edbc | 654 | * use kI2C_TransferDefaultFlag |
AnnaBridge | 171:3a7713b1edbc | 655 | * @retval kStatus_Success Data was received successfully. |
AnnaBridge | 171:3a7713b1edbc | 656 | * @retval #kStatus_I2C_Busy Another master is currently utilizing the bus. |
AnnaBridge | 171:3a7713b1edbc | 657 | * @retval #kStatus_I2C_Nak The slave device sent a NAK in response to a byte. |
AnnaBridge | 171:3a7713b1edbc | 658 | * @retval #kStatus_I2C_ArbitrationLost Arbitration lost error. |
AnnaBridge | 171:3a7713b1edbc | 659 | */ |
AnnaBridge | 171:3a7713b1edbc | 660 | status_t I2C_MasterReadBlocking(I2C_Type *base, void *rxBuff, size_t rxSize, uint32_t flags); |
AnnaBridge | 171:3a7713b1edbc | 661 | |
AnnaBridge | 171:3a7713b1edbc | 662 | /*! |
AnnaBridge | 171:3a7713b1edbc | 663 | * @brief Performs a master polling transfer on the I2C bus. |
AnnaBridge | 171:3a7713b1edbc | 664 | * |
AnnaBridge | 171:3a7713b1edbc | 665 | * @note The API does not return until the transfer succeeds or fails due |
AnnaBridge | 171:3a7713b1edbc | 666 | * to arbitration lost or receiving a NAK. |
AnnaBridge | 171:3a7713b1edbc | 667 | * |
AnnaBridge | 171:3a7713b1edbc | 668 | * @param base I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 669 | * @param xfer Pointer to the transfer structure. |
AnnaBridge | 171:3a7713b1edbc | 670 | * @retval kStatus_Success Successfully complete the data transmission. |
AnnaBridge | 171:3a7713b1edbc | 671 | * @retval kStatus_I2C_Busy Previous transmission still not finished. |
AnnaBridge | 171:3a7713b1edbc | 672 | * @retval kStatus_I2C_Timeout Transfer error, wait signal timeout. |
AnnaBridge | 171:3a7713b1edbc | 673 | * @retval kStatus_I2C_ArbitrationLost Transfer error, arbitration lost. |
AnnaBridge | 171:3a7713b1edbc | 674 | * @retval kStataus_I2C_Nak Transfer error, receive NAK during transfer. |
AnnaBridge | 171:3a7713b1edbc | 675 | */ |
AnnaBridge | 171:3a7713b1edbc | 676 | status_t I2C_MasterTransferBlocking(I2C_Type *base, i2c_master_transfer_t *xfer); |
AnnaBridge | 171:3a7713b1edbc | 677 | |
AnnaBridge | 171:3a7713b1edbc | 678 | /*@}*/ |
AnnaBridge | 171:3a7713b1edbc | 679 | |
AnnaBridge | 171:3a7713b1edbc | 680 | /*! @name Non-blocking */ |
AnnaBridge | 171:3a7713b1edbc | 681 | /*@{*/ |
AnnaBridge | 171:3a7713b1edbc | 682 | |
AnnaBridge | 171:3a7713b1edbc | 683 | /*! |
AnnaBridge | 171:3a7713b1edbc | 684 | * @brief Creates a new handle for the I2C master non-blocking APIs. |
AnnaBridge | 171:3a7713b1edbc | 685 | * |
AnnaBridge | 171:3a7713b1edbc | 686 | * The creation of a handle is for use with the non-blocking APIs. Once a handle |
AnnaBridge | 171:3a7713b1edbc | 687 | * is created, there is not a corresponding destroy handle. If the user wants to |
AnnaBridge | 171:3a7713b1edbc | 688 | * terminate a transfer, the I2C_MasterTransferAbort() API shall be called. |
AnnaBridge | 171:3a7713b1edbc | 689 | * |
AnnaBridge | 171:3a7713b1edbc | 690 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 691 | * @param[out] handle Pointer to the I2C master driver handle. |
AnnaBridge | 171:3a7713b1edbc | 692 | * @param callback User provided pointer to the asynchronous callback function. |
AnnaBridge | 171:3a7713b1edbc | 693 | * @param userData User provided pointer to the application callback data. |
AnnaBridge | 171:3a7713b1edbc | 694 | */ |
AnnaBridge | 171:3a7713b1edbc | 695 | void I2C_MasterTransferCreateHandle(I2C_Type *base, |
AnnaBridge | 171:3a7713b1edbc | 696 | i2c_master_handle_t *handle, |
AnnaBridge | 171:3a7713b1edbc | 697 | i2c_master_transfer_callback_t callback, |
AnnaBridge | 171:3a7713b1edbc | 698 | void *userData); |
AnnaBridge | 171:3a7713b1edbc | 699 | |
AnnaBridge | 171:3a7713b1edbc | 700 | /*! |
AnnaBridge | 171:3a7713b1edbc | 701 | * @brief Performs a non-blocking transaction on the I2C bus. |
AnnaBridge | 171:3a7713b1edbc | 702 | * |
AnnaBridge | 171:3a7713b1edbc | 703 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 704 | * @param handle Pointer to the I2C master driver handle. |
AnnaBridge | 171:3a7713b1edbc | 705 | * @param xfer The pointer to the transfer descriptor. |
AnnaBridge | 171:3a7713b1edbc | 706 | * @retval kStatus_Success The transaction was started successfully. |
AnnaBridge | 171:3a7713b1edbc | 707 | * @retval #kStatus_I2C_Busy Either another master is currently utilizing the bus, or a non-blocking |
AnnaBridge | 171:3a7713b1edbc | 708 | * transaction is already in progress. |
AnnaBridge | 171:3a7713b1edbc | 709 | */ |
AnnaBridge | 171:3a7713b1edbc | 710 | status_t I2C_MasterTransferNonBlocking(I2C_Type *base, i2c_master_handle_t *handle, i2c_master_transfer_t *xfer); |
AnnaBridge | 171:3a7713b1edbc | 711 | |
AnnaBridge | 171:3a7713b1edbc | 712 | /*! |
AnnaBridge | 171:3a7713b1edbc | 713 | * @brief Returns number of bytes transferred so far. |
AnnaBridge | 171:3a7713b1edbc | 714 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 715 | * @param handle Pointer to the I2C master driver handle. |
AnnaBridge | 171:3a7713b1edbc | 716 | * @param[out] count Number of bytes transferred so far by the non-blocking transaction. |
AnnaBridge | 171:3a7713b1edbc | 717 | * @retval kStatus_Success |
AnnaBridge | 171:3a7713b1edbc | 718 | * @retval #kStatus_I2C_Busy |
AnnaBridge | 171:3a7713b1edbc | 719 | */ |
AnnaBridge | 171:3a7713b1edbc | 720 | status_t I2C_MasterTransferGetCount(I2C_Type *base, i2c_master_handle_t *handle, size_t *count); |
AnnaBridge | 171:3a7713b1edbc | 721 | |
AnnaBridge | 171:3a7713b1edbc | 722 | /*! |
AnnaBridge | 171:3a7713b1edbc | 723 | * @brief Terminates a non-blocking I2C master transmission early. |
AnnaBridge | 171:3a7713b1edbc | 724 | * |
AnnaBridge | 171:3a7713b1edbc | 725 | * @note It is not safe to call this function from an IRQ handler that has a higher priority than the |
AnnaBridge | 171:3a7713b1edbc | 726 | * I2C peripheral's IRQ priority. |
AnnaBridge | 171:3a7713b1edbc | 727 | * |
AnnaBridge | 171:3a7713b1edbc | 728 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 729 | * @param handle Pointer to the I2C master driver handle. |
AnnaBridge | 171:3a7713b1edbc | 730 | * @retval kStatus_Success A transaction was successfully aborted. |
AnnaBridge | 171:3a7713b1edbc | 731 | * @retval #kStatus_I2C_Timeout Timeout during polling for flags. |
AnnaBridge | 171:3a7713b1edbc | 732 | */ |
AnnaBridge | 171:3a7713b1edbc | 733 | status_t I2C_MasterTransferAbort(I2C_Type *base, i2c_master_handle_t *handle); |
AnnaBridge | 171:3a7713b1edbc | 734 | |
AnnaBridge | 171:3a7713b1edbc | 735 | /*@}*/ |
AnnaBridge | 171:3a7713b1edbc | 736 | |
AnnaBridge | 171:3a7713b1edbc | 737 | /*! @name IRQ handler */ |
AnnaBridge | 171:3a7713b1edbc | 738 | /*@{*/ |
AnnaBridge | 171:3a7713b1edbc | 739 | |
AnnaBridge | 171:3a7713b1edbc | 740 | /*! |
AnnaBridge | 171:3a7713b1edbc | 741 | * @brief Reusable routine to handle master interrupts. |
AnnaBridge | 171:3a7713b1edbc | 742 | * @note This function does not need to be called unless you are reimplementing the |
AnnaBridge | 171:3a7713b1edbc | 743 | * nonblocking API's interrupt handler routines to add special functionality. |
AnnaBridge | 171:3a7713b1edbc | 744 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 745 | * @param handle Pointer to the I2C master driver handle. |
AnnaBridge | 171:3a7713b1edbc | 746 | */ |
AnnaBridge | 171:3a7713b1edbc | 747 | void I2C_MasterTransferHandleIRQ(I2C_Type *base, i2c_master_handle_t *handle); |
AnnaBridge | 171:3a7713b1edbc | 748 | |
AnnaBridge | 171:3a7713b1edbc | 749 | /*@}*/ |
AnnaBridge | 171:3a7713b1edbc | 750 | |
AnnaBridge | 171:3a7713b1edbc | 751 | /*! @} */ /* end of i2c_master_driver */ |
AnnaBridge | 171:3a7713b1edbc | 752 | |
AnnaBridge | 171:3a7713b1edbc | 753 | /*! |
AnnaBridge | 171:3a7713b1edbc | 754 | * @addtogroup i2c_slave_driver |
AnnaBridge | 171:3a7713b1edbc | 755 | * @{ |
AnnaBridge | 171:3a7713b1edbc | 756 | */ |
AnnaBridge | 171:3a7713b1edbc | 757 | |
AnnaBridge | 171:3a7713b1edbc | 758 | /*! @name Slave initialization and deinitialization */ |
AnnaBridge | 171:3a7713b1edbc | 759 | /*@{*/ |
AnnaBridge | 171:3a7713b1edbc | 760 | |
AnnaBridge | 171:3a7713b1edbc | 761 | /*! |
AnnaBridge | 171:3a7713b1edbc | 762 | * @brief Provides a default configuration for the I2C slave peripheral. |
AnnaBridge | 171:3a7713b1edbc | 763 | * |
AnnaBridge | 171:3a7713b1edbc | 764 | * This function provides the following default configuration for the I2C slave peripheral: |
AnnaBridge | 171:3a7713b1edbc | 765 | * @code |
AnnaBridge | 171:3a7713b1edbc | 766 | * slaveConfig->enableSlave = true; |
AnnaBridge | 171:3a7713b1edbc | 767 | * slaveConfig->address0.disable = false; |
AnnaBridge | 171:3a7713b1edbc | 768 | * slaveConfig->address0.address = 0u; |
AnnaBridge | 171:3a7713b1edbc | 769 | * slaveConfig->address1.disable = true; |
AnnaBridge | 171:3a7713b1edbc | 770 | * slaveConfig->address2.disable = true; |
AnnaBridge | 171:3a7713b1edbc | 771 | * slaveConfig->address3.disable = true; |
AnnaBridge | 171:3a7713b1edbc | 772 | * slaveConfig->busSpeed = kI2C_SlaveStandardMode; |
AnnaBridge | 171:3a7713b1edbc | 773 | * @endcode |
AnnaBridge | 171:3a7713b1edbc | 774 | * |
AnnaBridge | 171:3a7713b1edbc | 775 | * After calling this function, override any settings to customize the configuration, |
AnnaBridge | 171:3a7713b1edbc | 776 | * prior to initializing the master driver with I2C_SlaveInit(). Be sure to override at least the @a |
AnnaBridge | 171:3a7713b1edbc | 777 | * address0.address member of the configuration structure with the desired slave address. |
AnnaBridge | 171:3a7713b1edbc | 778 | * |
AnnaBridge | 171:3a7713b1edbc | 779 | * @param[out] slaveConfig User provided configuration structure that is set to default values. Refer to |
AnnaBridge | 171:3a7713b1edbc | 780 | * #i2c_slave_config_t. |
AnnaBridge | 171:3a7713b1edbc | 781 | */ |
AnnaBridge | 171:3a7713b1edbc | 782 | void I2C_SlaveGetDefaultConfig(i2c_slave_config_t *slaveConfig); |
AnnaBridge | 171:3a7713b1edbc | 783 | |
AnnaBridge | 171:3a7713b1edbc | 784 | /*! |
AnnaBridge | 171:3a7713b1edbc | 785 | * @brief Initializes the I2C slave peripheral. |
AnnaBridge | 171:3a7713b1edbc | 786 | * |
AnnaBridge | 171:3a7713b1edbc | 787 | * This function enables the peripheral clock and initializes the I2C slave peripheral as described by the user |
AnnaBridge | 171:3a7713b1edbc | 788 | * provided configuration. |
AnnaBridge | 171:3a7713b1edbc | 789 | * |
AnnaBridge | 171:3a7713b1edbc | 790 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 791 | * @param slaveConfig User provided peripheral configuration. Use I2C_SlaveGetDefaultConfig() to get a set of defaults |
AnnaBridge | 171:3a7713b1edbc | 792 | * that you can override. |
AnnaBridge | 171:3a7713b1edbc | 793 | * @param srcClock_Hz Frequency in Hertz of the I2C functional clock. Used to calculate CLKDIV value to provide |
AnnaBridge | 171:3a7713b1edbc | 794 | * enough |
AnnaBridge | 171:3a7713b1edbc | 795 | * data setup time for master when slave stretches the clock. |
AnnaBridge | 171:3a7713b1edbc | 796 | */ |
AnnaBridge | 171:3a7713b1edbc | 797 | status_t I2C_SlaveInit(I2C_Type *base, const i2c_slave_config_t *slaveConfig, uint32_t srcClock_Hz); |
AnnaBridge | 171:3a7713b1edbc | 798 | |
AnnaBridge | 171:3a7713b1edbc | 799 | /*! |
AnnaBridge | 171:3a7713b1edbc | 800 | * @brief Configures Slave Address n register. |
AnnaBridge | 171:3a7713b1edbc | 801 | * |
AnnaBridge | 171:3a7713b1edbc | 802 | * This function writes new value to Slave Address register. |
AnnaBridge | 171:3a7713b1edbc | 803 | * |
AnnaBridge | 171:3a7713b1edbc | 804 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 805 | * @param addressRegister The module supports multiple address registers. The parameter determines which one shall be |
AnnaBridge | 171:3a7713b1edbc | 806 | * changed. |
AnnaBridge | 171:3a7713b1edbc | 807 | * @param address The slave address to be stored to the address register for matching. |
AnnaBridge | 171:3a7713b1edbc | 808 | * @param addressDisable Disable matching of the specified address register. |
AnnaBridge | 171:3a7713b1edbc | 809 | */ |
AnnaBridge | 171:3a7713b1edbc | 810 | void I2C_SlaveSetAddress(I2C_Type *base, |
AnnaBridge | 171:3a7713b1edbc | 811 | i2c_slave_address_register_t addressRegister, |
AnnaBridge | 171:3a7713b1edbc | 812 | uint8_t address, |
AnnaBridge | 171:3a7713b1edbc | 813 | bool addressDisable); |
AnnaBridge | 171:3a7713b1edbc | 814 | |
AnnaBridge | 171:3a7713b1edbc | 815 | /*! |
AnnaBridge | 171:3a7713b1edbc | 816 | * @brief Deinitializes the I2C slave peripheral. |
AnnaBridge | 171:3a7713b1edbc | 817 | * |
AnnaBridge | 171:3a7713b1edbc | 818 | * This function disables the I2C slave peripheral and gates the clock. It also performs a software |
AnnaBridge | 171:3a7713b1edbc | 819 | * reset to restore the peripheral to reset conditions. |
AnnaBridge | 171:3a7713b1edbc | 820 | * |
AnnaBridge | 171:3a7713b1edbc | 821 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 822 | */ |
AnnaBridge | 171:3a7713b1edbc | 823 | void I2C_SlaveDeinit(I2C_Type *base); |
AnnaBridge | 171:3a7713b1edbc | 824 | |
AnnaBridge | 171:3a7713b1edbc | 825 | /*! |
AnnaBridge | 171:3a7713b1edbc | 826 | * @brief Enables or disables the I2C module as slave. |
AnnaBridge | 171:3a7713b1edbc | 827 | * |
AnnaBridge | 171:3a7713b1edbc | 828 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 829 | * @param enable True to enable or flase to disable. |
AnnaBridge | 171:3a7713b1edbc | 830 | */ |
AnnaBridge | 171:3a7713b1edbc | 831 | static inline void I2C_SlaveEnable(I2C_Type *base, bool enable) |
AnnaBridge | 171:3a7713b1edbc | 832 | { |
AnnaBridge | 171:3a7713b1edbc | 833 | /* Set or clear the SLVEN bit in the CFG register. */ |
AnnaBridge | 171:3a7713b1edbc | 834 | base->CFG = I2C_CFG_SLVEN(enable); |
AnnaBridge | 171:3a7713b1edbc | 835 | } |
AnnaBridge | 171:3a7713b1edbc | 836 | |
AnnaBridge | 171:3a7713b1edbc | 837 | /*@}*/ /* end of Slave initialization and deinitialization */ |
AnnaBridge | 171:3a7713b1edbc | 838 | |
AnnaBridge | 171:3a7713b1edbc | 839 | /*! @name Slave status */ |
AnnaBridge | 171:3a7713b1edbc | 840 | /*@{*/ |
AnnaBridge | 171:3a7713b1edbc | 841 | |
AnnaBridge | 171:3a7713b1edbc | 842 | /*! |
AnnaBridge | 171:3a7713b1edbc | 843 | * @brief Clears the I2C status flag state. |
AnnaBridge | 171:3a7713b1edbc | 844 | * |
AnnaBridge | 171:3a7713b1edbc | 845 | * The following status register flags can be cleared: |
AnnaBridge | 171:3a7713b1edbc | 846 | * - slave deselected flag |
AnnaBridge | 171:3a7713b1edbc | 847 | * |
AnnaBridge | 171:3a7713b1edbc | 848 | * Attempts to clear other flags has no effect. |
AnnaBridge | 171:3a7713b1edbc | 849 | * |
AnnaBridge | 171:3a7713b1edbc | 850 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 851 | * @param statusMask A bitmask of status flags that are to be cleared. The mask is composed of |
AnnaBridge | 171:3a7713b1edbc | 852 | * #_i2c_slave_flags enumerators OR'd together. You may pass the result of a previous call to |
AnnaBridge | 171:3a7713b1edbc | 853 | * I2C_SlaveGetStatusFlags(). |
AnnaBridge | 171:3a7713b1edbc | 854 | * @see _i2c_slave_flags. |
AnnaBridge | 171:3a7713b1edbc | 855 | */ |
AnnaBridge | 171:3a7713b1edbc | 856 | static inline void I2C_SlaveClearStatusFlags(I2C_Type *base, uint32_t statusMask) |
AnnaBridge | 171:3a7713b1edbc | 857 | { |
AnnaBridge | 171:3a7713b1edbc | 858 | /* Allow clearing just slave status flags */ |
AnnaBridge | 171:3a7713b1edbc | 859 | base->STAT = statusMask & I2C_STAT_SLVDESEL_MASK; |
AnnaBridge | 171:3a7713b1edbc | 860 | } |
AnnaBridge | 171:3a7713b1edbc | 861 | |
AnnaBridge | 171:3a7713b1edbc | 862 | /*@}*/ /* end of Slave status */ |
AnnaBridge | 171:3a7713b1edbc | 863 | |
AnnaBridge | 171:3a7713b1edbc | 864 | /*! @name Slave bus operations */ |
AnnaBridge | 171:3a7713b1edbc | 865 | /*@{*/ |
AnnaBridge | 171:3a7713b1edbc | 866 | |
AnnaBridge | 171:3a7713b1edbc | 867 | /*! |
AnnaBridge | 171:3a7713b1edbc | 868 | * @brief Performs a polling send transfer on the I2C bus. |
AnnaBridge | 171:3a7713b1edbc | 869 | * |
AnnaBridge | 171:3a7713b1edbc | 870 | * The function executes blocking address phase and blocking data phase. |
AnnaBridge | 171:3a7713b1edbc | 871 | * |
AnnaBridge | 171:3a7713b1edbc | 872 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 873 | * @param txBuff The pointer to the data to be transferred. |
AnnaBridge | 171:3a7713b1edbc | 874 | * @param txSize The length in bytes of the data to be transferred. |
AnnaBridge | 171:3a7713b1edbc | 875 | * @return kStatus_Success Data has been sent. |
AnnaBridge | 171:3a7713b1edbc | 876 | * @return kStatus_Fail Unexpected slave state (master data write while master read from slave is expected). |
AnnaBridge | 171:3a7713b1edbc | 877 | */ |
AnnaBridge | 171:3a7713b1edbc | 878 | status_t I2C_SlaveWriteBlocking(I2C_Type *base, const uint8_t *txBuff, size_t txSize); |
AnnaBridge | 171:3a7713b1edbc | 879 | |
AnnaBridge | 171:3a7713b1edbc | 880 | /*! |
AnnaBridge | 171:3a7713b1edbc | 881 | * @brief Performs a polling receive transfer on the I2C bus. |
AnnaBridge | 171:3a7713b1edbc | 882 | * |
AnnaBridge | 171:3a7713b1edbc | 883 | * The function executes blocking address phase and blocking data phase. |
AnnaBridge | 171:3a7713b1edbc | 884 | * |
AnnaBridge | 171:3a7713b1edbc | 885 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 886 | * @param rxBuff The pointer to the data to be transferred. |
AnnaBridge | 171:3a7713b1edbc | 887 | * @param rxSize The length in bytes of the data to be transferred. |
AnnaBridge | 171:3a7713b1edbc | 888 | * @return kStatus_Success Data has been received. |
AnnaBridge | 171:3a7713b1edbc | 889 | * @return kStatus_Fail Unexpected slave state (master data read while master write to slave is expected). |
AnnaBridge | 171:3a7713b1edbc | 890 | */ |
AnnaBridge | 171:3a7713b1edbc | 891 | status_t I2C_SlaveReadBlocking(I2C_Type *base, uint8_t *rxBuff, size_t rxSize); |
AnnaBridge | 171:3a7713b1edbc | 892 | |
AnnaBridge | 171:3a7713b1edbc | 893 | /*@}*/ /* end of Slave bus operations */ |
AnnaBridge | 171:3a7713b1edbc | 894 | |
AnnaBridge | 171:3a7713b1edbc | 895 | /*! @name Slave non-blocking */ |
AnnaBridge | 171:3a7713b1edbc | 896 | /*@{*/ |
AnnaBridge | 171:3a7713b1edbc | 897 | |
AnnaBridge | 171:3a7713b1edbc | 898 | /*! |
AnnaBridge | 171:3a7713b1edbc | 899 | * @brief Creates a new handle for the I2C slave non-blocking APIs. |
AnnaBridge | 171:3a7713b1edbc | 900 | * |
AnnaBridge | 171:3a7713b1edbc | 901 | * The creation of a handle is for use with the non-blocking APIs. Once a handle |
AnnaBridge | 171:3a7713b1edbc | 902 | * is created, there is not a corresponding destroy handle. If the user wants to |
AnnaBridge | 171:3a7713b1edbc | 903 | * terminate a transfer, the I2C_SlaveTransferAbort() API shall be called. |
AnnaBridge | 171:3a7713b1edbc | 904 | * |
AnnaBridge | 171:3a7713b1edbc | 905 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 906 | * @param[out] handle Pointer to the I2C slave driver handle. |
AnnaBridge | 171:3a7713b1edbc | 907 | * @param callback User provided pointer to the asynchronous callback function. |
AnnaBridge | 171:3a7713b1edbc | 908 | * @param userData User provided pointer to the application callback data. |
AnnaBridge | 171:3a7713b1edbc | 909 | */ |
AnnaBridge | 171:3a7713b1edbc | 910 | void I2C_SlaveTransferCreateHandle(I2C_Type *base, |
AnnaBridge | 171:3a7713b1edbc | 911 | i2c_slave_handle_t *handle, |
AnnaBridge | 171:3a7713b1edbc | 912 | i2c_slave_transfer_callback_t callback, |
AnnaBridge | 171:3a7713b1edbc | 913 | void *userData); |
AnnaBridge | 171:3a7713b1edbc | 914 | |
AnnaBridge | 171:3a7713b1edbc | 915 | /*! |
AnnaBridge | 171:3a7713b1edbc | 916 | * @brief Starts accepting slave transfers. |
AnnaBridge | 171:3a7713b1edbc | 917 | * |
AnnaBridge | 171:3a7713b1edbc | 918 | * Call this API after calling I2C_SlaveInit() and I2C_SlaveTransferCreateHandle() to start processing |
AnnaBridge | 171:3a7713b1edbc | 919 | * transactions driven by an I2C master. The slave monitors the I2C bus and pass events to the |
AnnaBridge | 171:3a7713b1edbc | 920 | * callback that was passed into the call to I2C_SlaveTransferCreateHandle(). The callback is always invoked |
AnnaBridge | 171:3a7713b1edbc | 921 | * from the interrupt context. |
AnnaBridge | 171:3a7713b1edbc | 922 | * |
AnnaBridge | 171:3a7713b1edbc | 923 | * If no slave Tx transfer is busy, a master read from slave request invokes #kI2C_SlaveTransmitEvent callback. |
AnnaBridge | 171:3a7713b1edbc | 924 | * If no slave Rx transfer is busy, a master write to slave request invokes #kI2C_SlaveReceiveEvent callback. |
AnnaBridge | 171:3a7713b1edbc | 925 | * |
AnnaBridge | 171:3a7713b1edbc | 926 | * The set of events received by the callback is customizable. To do so, set the @a eventMask parameter to |
AnnaBridge | 171:3a7713b1edbc | 927 | * the OR'd combination of #i2c_slave_transfer_event_t enumerators for the events you wish to receive. |
AnnaBridge | 171:3a7713b1edbc | 928 | * The #kI2C_SlaveTransmitEvent and #kI2C_SlaveReceiveEvent events are always enabled and do not need |
AnnaBridge | 171:3a7713b1edbc | 929 | * to be included in the mask. Alternatively, you can pass 0 to get a default set of only the transmit and |
AnnaBridge | 171:3a7713b1edbc | 930 | * receive events that are always enabled. In addition, the #kI2C_SlaveAllEvents constant is provided as |
AnnaBridge | 171:3a7713b1edbc | 931 | * a convenient way to enable all events. |
AnnaBridge | 171:3a7713b1edbc | 932 | * |
AnnaBridge | 171:3a7713b1edbc | 933 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 934 | * @param handle Pointer to i2c_slave_handle_t structure which stores the transfer state. |
AnnaBridge | 171:3a7713b1edbc | 935 | * @param eventMask Bit mask formed by OR'ing together #i2c_slave_transfer_event_t enumerators to specify |
AnnaBridge | 171:3a7713b1edbc | 936 | * which events to send to the callback. Other accepted values are 0 to get a default set of |
AnnaBridge | 171:3a7713b1edbc | 937 | * only the transmit and receive events, and #kI2C_SlaveAllEvents to enable all events. |
AnnaBridge | 171:3a7713b1edbc | 938 | * |
AnnaBridge | 171:3a7713b1edbc | 939 | * @retval kStatus_Success Slave transfers were successfully started. |
AnnaBridge | 171:3a7713b1edbc | 940 | * @retval #kStatus_I2C_Busy Slave transfers have already been started on this handle. |
AnnaBridge | 171:3a7713b1edbc | 941 | */ |
AnnaBridge | 171:3a7713b1edbc | 942 | status_t I2C_SlaveTransferNonBlocking(I2C_Type *base, i2c_slave_handle_t *handle, uint32_t eventMask); |
AnnaBridge | 171:3a7713b1edbc | 943 | |
AnnaBridge | 171:3a7713b1edbc | 944 | /*! |
AnnaBridge | 171:3a7713b1edbc | 945 | * @brief Starts accepting master read from slave requests. |
AnnaBridge | 171:3a7713b1edbc | 946 | * |
AnnaBridge | 171:3a7713b1edbc | 947 | * The function can be called in response to #kI2C_SlaveTransmitEvent callback to start a new slave Tx transfer |
AnnaBridge | 171:3a7713b1edbc | 948 | * from within the transfer callback. |
AnnaBridge | 171:3a7713b1edbc | 949 | * |
AnnaBridge | 171:3a7713b1edbc | 950 | * The set of events received by the callback is customizable. To do so, set the @a eventMask parameter to |
AnnaBridge | 171:3a7713b1edbc | 951 | * the OR'd combination of #i2c_slave_transfer_event_t enumerators for the events you wish to receive. |
AnnaBridge | 171:3a7713b1edbc | 952 | * The #kI2C_SlaveTransmitEvent and #kI2C_SlaveReceiveEvent events are always enabled and do not need |
AnnaBridge | 171:3a7713b1edbc | 953 | * to be included in the mask. Alternatively, you can pass 0 to get a default set of only the transmit and |
AnnaBridge | 171:3a7713b1edbc | 954 | * receive events that are always enabled. In addition, the #kI2C_SlaveAllEvents constant is provided as |
AnnaBridge | 171:3a7713b1edbc | 955 | * a convenient way to enable all events. |
AnnaBridge | 171:3a7713b1edbc | 956 | * |
AnnaBridge | 171:3a7713b1edbc | 957 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 958 | * @param transfer Pointer to #i2c_slave_transfer_t structure. |
AnnaBridge | 171:3a7713b1edbc | 959 | * @param txData Pointer to data to send to master. |
AnnaBridge | 171:3a7713b1edbc | 960 | * @param txSize Size of txData in bytes. |
AnnaBridge | 171:3a7713b1edbc | 961 | * @param eventMask Bit mask formed by OR'ing together #i2c_slave_transfer_event_t enumerators to specify |
AnnaBridge | 171:3a7713b1edbc | 962 | * which events to send to the callback. Other accepted values are 0 to get a default set of |
AnnaBridge | 171:3a7713b1edbc | 963 | * only the transmit and receive events, and #kI2C_SlaveAllEvents to enable all events. |
AnnaBridge | 171:3a7713b1edbc | 964 | * |
AnnaBridge | 171:3a7713b1edbc | 965 | * @retval kStatus_Success Slave transfers were successfully started. |
AnnaBridge | 171:3a7713b1edbc | 966 | * @retval #kStatus_I2C_Busy Slave transfers have already been started on this handle. |
AnnaBridge | 171:3a7713b1edbc | 967 | */ |
AnnaBridge | 171:3a7713b1edbc | 968 | status_t I2C_SlaveSetSendBuffer( |
AnnaBridge | 171:3a7713b1edbc | 969 | I2C_Type *base, volatile i2c_slave_transfer_t *transfer, const void *txData, size_t txSize, uint32_t eventMask); |
AnnaBridge | 171:3a7713b1edbc | 970 | |
AnnaBridge | 171:3a7713b1edbc | 971 | /*! |
AnnaBridge | 171:3a7713b1edbc | 972 | * @brief Starts accepting master write to slave requests. |
AnnaBridge | 171:3a7713b1edbc | 973 | * |
AnnaBridge | 171:3a7713b1edbc | 974 | * The function can be called in response to #kI2C_SlaveReceiveEvent callback to start a new slave Rx transfer |
AnnaBridge | 171:3a7713b1edbc | 975 | * from within the transfer callback. |
AnnaBridge | 171:3a7713b1edbc | 976 | * |
AnnaBridge | 171:3a7713b1edbc | 977 | * The set of events received by the callback is customizable. To do so, set the @a eventMask parameter to |
AnnaBridge | 171:3a7713b1edbc | 978 | * the OR'd combination of #i2c_slave_transfer_event_t enumerators for the events you wish to receive. |
AnnaBridge | 171:3a7713b1edbc | 979 | * The #kI2C_SlaveTransmitEvent and #kI2C_SlaveReceiveEvent events are always enabled and do not need |
AnnaBridge | 171:3a7713b1edbc | 980 | * to be included in the mask. Alternatively, you can pass 0 to get a default set of only the transmit and |
AnnaBridge | 171:3a7713b1edbc | 981 | * receive events that are always enabled. In addition, the #kI2C_SlaveAllEvents constant is provided as |
AnnaBridge | 171:3a7713b1edbc | 982 | * a convenient way to enable all events. |
AnnaBridge | 171:3a7713b1edbc | 983 | * |
AnnaBridge | 171:3a7713b1edbc | 984 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 985 | * @param transfer Pointer to #i2c_slave_transfer_t structure. |
AnnaBridge | 171:3a7713b1edbc | 986 | * @param rxData Pointer to data to store data from master. |
AnnaBridge | 171:3a7713b1edbc | 987 | * @param rxSize Size of rxData in bytes. |
AnnaBridge | 171:3a7713b1edbc | 988 | * @param eventMask Bit mask formed by OR'ing together #i2c_slave_transfer_event_t enumerators to specify |
AnnaBridge | 171:3a7713b1edbc | 989 | * which events to send to the callback. Other accepted values are 0 to get a default set of |
AnnaBridge | 171:3a7713b1edbc | 990 | * only the transmit and receive events, and #kI2C_SlaveAllEvents to enable all events. |
AnnaBridge | 171:3a7713b1edbc | 991 | * |
AnnaBridge | 171:3a7713b1edbc | 992 | * @retval kStatus_Success Slave transfers were successfully started. |
AnnaBridge | 171:3a7713b1edbc | 993 | * @retval #kStatus_I2C_Busy Slave transfers have already been started on this handle. |
AnnaBridge | 171:3a7713b1edbc | 994 | */ |
AnnaBridge | 171:3a7713b1edbc | 995 | status_t I2C_SlaveSetReceiveBuffer( |
AnnaBridge | 171:3a7713b1edbc | 996 | I2C_Type *base, volatile i2c_slave_transfer_t *transfer, void *rxData, size_t rxSize, uint32_t eventMask); |
AnnaBridge | 171:3a7713b1edbc | 997 | |
AnnaBridge | 171:3a7713b1edbc | 998 | /*! |
AnnaBridge | 171:3a7713b1edbc | 999 | * @brief Returns the slave address sent by the I2C master. |
AnnaBridge | 171:3a7713b1edbc | 1000 | * |
AnnaBridge | 171:3a7713b1edbc | 1001 | * This function should only be called from the address match event callback #kI2C_SlaveAddressMatchEvent. |
AnnaBridge | 171:3a7713b1edbc | 1002 | * |
AnnaBridge | 171:3a7713b1edbc | 1003 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 1004 | * @param transfer The I2C slave transfer. |
AnnaBridge | 171:3a7713b1edbc | 1005 | * @return The 8-bit address matched by the I2C slave. Bit 0 contains the R/w direction bit, and |
AnnaBridge | 171:3a7713b1edbc | 1006 | * the 7-bit slave address is in the upper 7 bits. |
AnnaBridge | 171:3a7713b1edbc | 1007 | */ |
AnnaBridge | 171:3a7713b1edbc | 1008 | static inline uint32_t I2C_SlaveGetReceivedAddress(I2C_Type *base, volatile i2c_slave_transfer_t *transfer) |
AnnaBridge | 171:3a7713b1edbc | 1009 | { |
AnnaBridge | 171:3a7713b1edbc | 1010 | return transfer->receivedAddress; |
AnnaBridge | 171:3a7713b1edbc | 1011 | } |
AnnaBridge | 171:3a7713b1edbc | 1012 | |
AnnaBridge | 171:3a7713b1edbc | 1013 | /*! |
AnnaBridge | 171:3a7713b1edbc | 1014 | * @brief Aborts the slave non-blocking transfers. |
AnnaBridge | 171:3a7713b1edbc | 1015 | * @note This API could be called at any time to stop slave for handling the bus events. |
AnnaBridge | 171:3a7713b1edbc | 1016 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 1017 | * @param handle Pointer to i2c_slave_handle_t structure which stores the transfer state. |
AnnaBridge | 171:3a7713b1edbc | 1018 | * @retval kStatus_Success |
AnnaBridge | 171:3a7713b1edbc | 1019 | * @retval #kStatus_I2C_Idle |
AnnaBridge | 171:3a7713b1edbc | 1020 | */ |
AnnaBridge | 171:3a7713b1edbc | 1021 | void I2C_SlaveTransferAbort(I2C_Type *base, i2c_slave_handle_t *handle); |
AnnaBridge | 171:3a7713b1edbc | 1022 | |
AnnaBridge | 171:3a7713b1edbc | 1023 | /*! |
AnnaBridge | 171:3a7713b1edbc | 1024 | * @brief Gets the slave transfer remaining bytes during a interrupt non-blocking transfer. |
AnnaBridge | 171:3a7713b1edbc | 1025 | * |
AnnaBridge | 171:3a7713b1edbc | 1026 | * @param base I2C base pointer. |
AnnaBridge | 171:3a7713b1edbc | 1027 | * @param handle pointer to i2c_slave_handle_t structure. |
AnnaBridge | 171:3a7713b1edbc | 1028 | * @param count Number of bytes transferred so far by the non-blocking transaction. |
AnnaBridge | 171:3a7713b1edbc | 1029 | * @retval kStatus_InvalidArgument count is Invalid. |
AnnaBridge | 171:3a7713b1edbc | 1030 | * @retval kStatus_Success Successfully return the count. |
AnnaBridge | 171:3a7713b1edbc | 1031 | */ |
AnnaBridge | 171:3a7713b1edbc | 1032 | status_t I2C_SlaveTransferGetCount(I2C_Type *base, i2c_slave_handle_t *handle, size_t *count); |
AnnaBridge | 171:3a7713b1edbc | 1033 | |
AnnaBridge | 171:3a7713b1edbc | 1034 | /*@}*/ /* end of Slave non-blocking */ |
AnnaBridge | 171:3a7713b1edbc | 1035 | |
AnnaBridge | 171:3a7713b1edbc | 1036 | /*! @name Slave IRQ handler */ |
AnnaBridge | 171:3a7713b1edbc | 1037 | /*@{*/ |
AnnaBridge | 171:3a7713b1edbc | 1038 | |
AnnaBridge | 171:3a7713b1edbc | 1039 | /*! |
AnnaBridge | 171:3a7713b1edbc | 1040 | * @brief Reusable routine to handle slave interrupts. |
AnnaBridge | 171:3a7713b1edbc | 1041 | * @note This function does not need to be called unless you are reimplementing the |
AnnaBridge | 171:3a7713b1edbc | 1042 | * non blocking API's interrupt handler routines to add special functionality. |
AnnaBridge | 171:3a7713b1edbc | 1043 | * @param base The I2C peripheral base address. |
AnnaBridge | 171:3a7713b1edbc | 1044 | * @param handle Pointer to i2c_slave_handle_t structure which stores the transfer state. |
AnnaBridge | 171:3a7713b1edbc | 1045 | */ |
AnnaBridge | 171:3a7713b1edbc | 1046 | void I2C_SlaveTransferHandleIRQ(I2C_Type *base, i2c_slave_handle_t *handle); |
AnnaBridge | 171:3a7713b1edbc | 1047 | |
AnnaBridge | 171:3a7713b1edbc | 1048 | /*@}*/ /* end of Slave IRQ handler */ |
AnnaBridge | 171:3a7713b1edbc | 1049 | |
AnnaBridge | 171:3a7713b1edbc | 1050 | /*! @} */ /* end of i2c_slave_driver */ |
AnnaBridge | 171:3a7713b1edbc | 1051 | |
AnnaBridge | 171:3a7713b1edbc | 1052 | #if defined(__cplusplus) |
AnnaBridge | 171:3a7713b1edbc | 1053 | } |
AnnaBridge | 171:3a7713b1edbc | 1054 | #endif |
AnnaBridge | 171:3a7713b1edbc | 1055 | |
AnnaBridge | 171:3a7713b1edbc | 1056 | #endif /* _FSL_I2C_H_ */ |