Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: hello SerialTestv11 SerialTestv12 Sierpinski ... more
TARGET_MIMXRT1050_EVK/TOOLCHAIN_IAR/fsl_lpi2c.h@172:65be27845400, 2019-02-20 (annotated)
- Committer:
- AnnaBridge
- Date:
- Wed Feb 20 20:53:29 2019 +0000
- Revision:
- 172:65be27845400
- Parent:
- 171:3a7713b1edbc
mbed library release version 165
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| AnnaBridge | 161:aa5281ff4a02 | 1 | /* |
| AnnaBridge | 170:e95d10626187 | 2 | * The Clear BSD License |
| AnnaBridge | 161:aa5281ff4a02 | 3 | * Copyright (c) 2015, Freescale Semiconductor, Inc. |
| AnnaBridge | 161:aa5281ff4a02 | 4 | * Copyright 2016-2017 NXP |
| AnnaBridge | 170:e95d10626187 | 5 | * All rights reserved. |
| AnnaBridge | 161:aa5281ff4a02 | 6 | * |
| AnnaBridge | 161:aa5281ff4a02 | 7 | * Redistribution and use in source and binary forms, with or without modification, |
| AnnaBridge | 170:e95d10626187 | 8 | * are permitted (subject to the limitations in the disclaimer below) provided |
| AnnaBridge | 170:e95d10626187 | 9 | * that the following conditions are met: |
| AnnaBridge | 161:aa5281ff4a02 | 10 | * |
| AnnaBridge | 161:aa5281ff4a02 | 11 | * o Redistributions of source code must retain the above copyright notice, this list |
| AnnaBridge | 161:aa5281ff4a02 | 12 | * of conditions and the following disclaimer. |
| AnnaBridge | 161:aa5281ff4a02 | 13 | * |
| AnnaBridge | 161:aa5281ff4a02 | 14 | * o Redistributions in binary form must reproduce the above copyright notice, this |
| AnnaBridge | 161:aa5281ff4a02 | 15 | * list of conditions and the following disclaimer in the documentation and/or |
| AnnaBridge | 161:aa5281ff4a02 | 16 | * other materials provided with the distribution. |
| AnnaBridge | 161:aa5281ff4a02 | 17 | * |
| AnnaBridge | 161:aa5281ff4a02 | 18 | * o Neither the name of the copyright holder nor the names of its |
| AnnaBridge | 161:aa5281ff4a02 | 19 | * contributors may be used to endorse or promote products derived from this |
| AnnaBridge | 161:aa5281ff4a02 | 20 | * software without specific prior written permission. |
| AnnaBridge | 161:aa5281ff4a02 | 21 | * |
| AnnaBridge | 170:e95d10626187 | 22 | * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS LICENSE. |
| AnnaBridge | 161:aa5281ff4a02 | 23 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
| AnnaBridge | 161:aa5281ff4a02 | 24 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| AnnaBridge | 161:aa5281ff4a02 | 25 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| AnnaBridge | 161:aa5281ff4a02 | 26 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR |
| AnnaBridge | 161:aa5281ff4a02 | 27 | * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
| AnnaBridge | 161:aa5281ff4a02 | 28 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| AnnaBridge | 161:aa5281ff4a02 | 29 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON |
| AnnaBridge | 161:aa5281ff4a02 | 30 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| AnnaBridge | 161:aa5281ff4a02 | 31 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| AnnaBridge | 161:aa5281ff4a02 | 32 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| AnnaBridge | 161:aa5281ff4a02 | 33 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 34 | #ifndef _FSL_LPI2C_H_ |
| AnnaBridge | 161:aa5281ff4a02 | 35 | #define _FSL_LPI2C_H_ |
| AnnaBridge | 161:aa5281ff4a02 | 36 | |
| AnnaBridge | 161:aa5281ff4a02 | 37 | #include <stddef.h> |
| AnnaBridge | 161:aa5281ff4a02 | 38 | #include "fsl_device_registers.h" |
| AnnaBridge | 161:aa5281ff4a02 | 39 | #include "fsl_common.h" |
| AnnaBridge | 161:aa5281ff4a02 | 40 | |
| AnnaBridge | 161:aa5281ff4a02 | 41 | /******************************************************************************* |
| AnnaBridge | 161:aa5281ff4a02 | 42 | * Definitions |
| AnnaBridge | 161:aa5281ff4a02 | 43 | ******************************************************************************/ |
| AnnaBridge | 161:aa5281ff4a02 | 44 | |
| AnnaBridge | 161:aa5281ff4a02 | 45 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 46 | * @addtogroup lpi2c |
| AnnaBridge | 161:aa5281ff4a02 | 47 | * @{ |
| AnnaBridge | 161:aa5281ff4a02 | 48 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 49 | |
| AnnaBridge | 161:aa5281ff4a02 | 50 | /*! @name Driver version */ |
| AnnaBridge | 161:aa5281ff4a02 | 51 | /*@{*/ |
| AnnaBridge | 170:e95d10626187 | 52 | /*! @brief LPI2C driver version 2.1.5. */ |
| AnnaBridge | 170:e95d10626187 | 53 | #define FSL_LPI2C_DRIVER_VERSION (MAKE_VERSION(2, 1, 5)) |
| AnnaBridge | 161:aa5281ff4a02 | 54 | /*@}*/ |
| AnnaBridge | 161:aa5281ff4a02 | 55 | |
| AnnaBridge | 161:aa5281ff4a02 | 56 | /*! @brief Timeout times for waiting flag. */ |
| AnnaBridge | 161:aa5281ff4a02 | 57 | #ifndef LPI2C_WAIT_TIMEOUT |
| AnnaBridge | 161:aa5281ff4a02 | 58 | #define LPI2C_WAIT_TIMEOUT 0U /* Define to zero means keep waiting until the flag is assert/deassert. */ |
| AnnaBridge | 161:aa5281ff4a02 | 59 | #endif |
| AnnaBridge | 161:aa5281ff4a02 | 60 | |
| AnnaBridge | 161:aa5281ff4a02 | 61 | /*! @brief LPI2C status return codes. */ |
| AnnaBridge | 161:aa5281ff4a02 | 62 | enum _lpi2c_status |
| AnnaBridge | 161:aa5281ff4a02 | 63 | { |
| AnnaBridge | 161:aa5281ff4a02 | 64 | kStatus_LPI2C_Busy = MAKE_STATUS(kStatusGroup_LPI2C, 0), /*!< The master is already performing a transfer. */ |
| AnnaBridge | 161:aa5281ff4a02 | 65 | kStatus_LPI2C_Idle = MAKE_STATUS(kStatusGroup_LPI2C, 1), /*!< The slave driver is idle. */ |
| AnnaBridge | 161:aa5281ff4a02 | 66 | kStatus_LPI2C_Nak = MAKE_STATUS(kStatusGroup_LPI2C, 2), /*!< The slave device sent a NAK in response to a byte. */ |
| AnnaBridge | 161:aa5281ff4a02 | 67 | kStatus_LPI2C_FifoError = MAKE_STATUS(kStatusGroup_LPI2C, 3), /*!< FIFO under run or overrun. */ |
| AnnaBridge | 161:aa5281ff4a02 | 68 | kStatus_LPI2C_BitError = MAKE_STATUS(kStatusGroup_LPI2C, 4), /*!< Transferred bit was not seen on the bus. */ |
| AnnaBridge | 161:aa5281ff4a02 | 69 | kStatus_LPI2C_ArbitrationLost = MAKE_STATUS(kStatusGroup_LPI2C, 5), /*!< Arbitration lost error. */ |
| AnnaBridge | 161:aa5281ff4a02 | 70 | kStatus_LPI2C_PinLowTimeout = |
| AnnaBridge | 161:aa5281ff4a02 | 71 | MAKE_STATUS(kStatusGroup_LPI2C, 6), /*!< SCL or SDA were held low longer than the timeout. */ |
| AnnaBridge | 161:aa5281ff4a02 | 72 | kStatus_LPI2C_NoTransferInProgress = |
| AnnaBridge | 161:aa5281ff4a02 | 73 | MAKE_STATUS(kStatusGroup_LPI2C, 7), /*!< Attempt to abort a transfer when one is not in progress. */ |
| AnnaBridge | 161:aa5281ff4a02 | 74 | kStatus_LPI2C_DmaRequestFail = MAKE_STATUS(kStatusGroup_LPI2C, 8), /*!< DMA request failed. */ |
| AnnaBridge | 161:aa5281ff4a02 | 75 | kStatus_LPI2C_Timeout = MAKE_STATUS(kStatusGroup_LPI2C, 9), /*!< Timeout poling status flags. */ |
| AnnaBridge | 161:aa5281ff4a02 | 76 | }; |
| AnnaBridge | 161:aa5281ff4a02 | 77 | |
| AnnaBridge | 161:aa5281ff4a02 | 78 | /*! @} */ |
| AnnaBridge | 161:aa5281ff4a02 | 79 | |
| AnnaBridge | 161:aa5281ff4a02 | 80 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 81 | * @addtogroup lpi2c_master_driver |
| AnnaBridge | 161:aa5281ff4a02 | 82 | * @{ |
| AnnaBridge | 161:aa5281ff4a02 | 83 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 84 | |
| AnnaBridge | 161:aa5281ff4a02 | 85 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 86 | * @brief LPI2C master peripheral flags. |
| AnnaBridge | 161:aa5281ff4a02 | 87 | * |
| AnnaBridge | 161:aa5281ff4a02 | 88 | * The following status register flags can be cleared: |
| AnnaBridge | 161:aa5281ff4a02 | 89 | * - #kLPI2C_MasterEndOfPacketFlag |
| AnnaBridge | 161:aa5281ff4a02 | 90 | * - #kLPI2C_MasterStopDetectFlag |
| AnnaBridge | 161:aa5281ff4a02 | 91 | * - #kLPI2C_MasterNackDetectFlag |
| AnnaBridge | 161:aa5281ff4a02 | 92 | * - #kLPI2C_MasterArbitrationLostFlag |
| AnnaBridge | 161:aa5281ff4a02 | 93 | * - #kLPI2C_MasterFifoErrFlag |
| AnnaBridge | 161:aa5281ff4a02 | 94 | * - #kLPI2C_MasterPinLowTimeoutFlag |
| AnnaBridge | 161:aa5281ff4a02 | 95 | * - #kLPI2C_MasterDataMatchFlag |
| AnnaBridge | 161:aa5281ff4a02 | 96 | * |
| AnnaBridge | 161:aa5281ff4a02 | 97 | * All flags except #kLPI2C_MasterBusyFlag and #kLPI2C_MasterBusBusyFlag can be enabled as |
| AnnaBridge | 161:aa5281ff4a02 | 98 | * interrupts. |
| AnnaBridge | 161:aa5281ff4a02 | 99 | * |
| AnnaBridge | 161:aa5281ff4a02 | 100 | * @note These enums are meant to be OR'd together to form a bit mask. |
| AnnaBridge | 161:aa5281ff4a02 | 101 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 102 | enum _lpi2c_master_flags |
| AnnaBridge | 161:aa5281ff4a02 | 103 | { |
| AnnaBridge | 161:aa5281ff4a02 | 104 | kLPI2C_MasterTxReadyFlag = LPI2C_MSR_TDF_MASK, /*!< Transmit data flag */ |
| AnnaBridge | 161:aa5281ff4a02 | 105 | kLPI2C_MasterRxReadyFlag = LPI2C_MSR_RDF_MASK, /*!< Receive data flag */ |
| AnnaBridge | 161:aa5281ff4a02 | 106 | kLPI2C_MasterEndOfPacketFlag = LPI2C_MSR_EPF_MASK, /*!< End Packet flag */ |
| AnnaBridge | 161:aa5281ff4a02 | 107 | kLPI2C_MasterStopDetectFlag = LPI2C_MSR_SDF_MASK, /*!< Stop detect flag */ |
| AnnaBridge | 161:aa5281ff4a02 | 108 | kLPI2C_MasterNackDetectFlag = LPI2C_MSR_NDF_MASK, /*!< NACK detect flag */ |
| AnnaBridge | 161:aa5281ff4a02 | 109 | kLPI2C_MasterArbitrationLostFlag = LPI2C_MSR_ALF_MASK, /*!< Arbitration lost flag */ |
| AnnaBridge | 161:aa5281ff4a02 | 110 | kLPI2C_MasterFifoErrFlag = LPI2C_MSR_FEF_MASK, /*!< FIFO error flag */ |
| AnnaBridge | 161:aa5281ff4a02 | 111 | kLPI2C_MasterPinLowTimeoutFlag = LPI2C_MSR_PLTF_MASK, /*!< Pin low timeout flag */ |
| AnnaBridge | 161:aa5281ff4a02 | 112 | kLPI2C_MasterDataMatchFlag = LPI2C_MSR_DMF_MASK, /*!< Data match flag */ |
| AnnaBridge | 161:aa5281ff4a02 | 113 | kLPI2C_MasterBusyFlag = LPI2C_MSR_MBF_MASK, /*!< Master busy flag */ |
| AnnaBridge | 161:aa5281ff4a02 | 114 | kLPI2C_MasterBusBusyFlag = LPI2C_MSR_BBF_MASK /*!< Bus busy flag */ |
| AnnaBridge | 161:aa5281ff4a02 | 115 | }; |
| AnnaBridge | 161:aa5281ff4a02 | 116 | |
| AnnaBridge | 161:aa5281ff4a02 | 117 | /*! @brief Direction of master and slave transfers. */ |
| AnnaBridge | 161:aa5281ff4a02 | 118 | typedef enum _lpi2c_direction |
| AnnaBridge | 161:aa5281ff4a02 | 119 | { |
| AnnaBridge | 161:aa5281ff4a02 | 120 | kLPI2C_Write = 0U, /*!< Master transmit. */ |
| AnnaBridge | 161:aa5281ff4a02 | 121 | kLPI2C_Read = 1U /*!< Master receive. */ |
| AnnaBridge | 161:aa5281ff4a02 | 122 | } lpi2c_direction_t; |
| AnnaBridge | 161:aa5281ff4a02 | 123 | |
| AnnaBridge | 161:aa5281ff4a02 | 124 | /*! @brief LPI2C pin configuration. */ |
| AnnaBridge | 161:aa5281ff4a02 | 125 | typedef enum _lpi2c_master_pin_config |
| AnnaBridge | 161:aa5281ff4a02 | 126 | { |
| AnnaBridge | 161:aa5281ff4a02 | 127 | kLPI2C_2PinOpenDrain = 0x0U, /*!< LPI2C Configured for 2-pin open drain mode */ |
| AnnaBridge | 161:aa5281ff4a02 | 128 | kLPI2C_2PinOutputOnly = 0x1U, /*!< LPI2C Configured for 2-pin output only mode (ultra-fast mode) */ |
| AnnaBridge | 161:aa5281ff4a02 | 129 | kLPI2C_2PinPushPull = 0x2U, /*!< LPI2C Configured for 2-pin push-pull mode */ |
| AnnaBridge | 161:aa5281ff4a02 | 130 | kLPI2C_4PinPushPull = 0x3U, /*!< LPI2C Configured for 4-pin push-pull mode */ |
| AnnaBridge | 161:aa5281ff4a02 | 131 | kLPI2C_2PinOpenDrainWithSeparateSlave = |
| AnnaBridge | 161:aa5281ff4a02 | 132 | 0x4U, /*!< LPI2C Configured for 2-pin open drain mode with separate LPI2C slave */ |
| AnnaBridge | 161:aa5281ff4a02 | 133 | kLPI2C_2PinOutputOnlyWithSeparateSlave = |
| AnnaBridge | 161:aa5281ff4a02 | 134 | 0x5U, /*!< LPI2C Configured for 2-pin output only mode(ultra-fast mode) with separate LPI2C slave */ |
| AnnaBridge | 161:aa5281ff4a02 | 135 | kLPI2C_2PinPushPullWithSeparateSlave = |
| AnnaBridge | 161:aa5281ff4a02 | 136 | 0x6U, /*!< LPI2C Configured for 2-pin push-pull mode with separate LPI2C slave */ |
| AnnaBridge | 161:aa5281ff4a02 | 137 | kLPI2C_4PinPushPullWithInvertedOutput = 0x7U /*!< LPI2C Configured for 4-pin push-pull mode(inverted outputs) */ |
| AnnaBridge | 161:aa5281ff4a02 | 138 | } lpi2c_master_pin_config_t; |
| AnnaBridge | 161:aa5281ff4a02 | 139 | |
| AnnaBridge | 161:aa5281ff4a02 | 140 | /*! @brief LPI2C master host request selection. */ |
| AnnaBridge | 161:aa5281ff4a02 | 141 | typedef enum _lpi2c_host_request_source |
| AnnaBridge | 161:aa5281ff4a02 | 142 | { |
| AnnaBridge | 161:aa5281ff4a02 | 143 | kLPI2C_HostRequestExternalPin = 0x0U, /*!< Select the LPI2C_HREQ pin as the host request input */ |
| AnnaBridge | 161:aa5281ff4a02 | 144 | kLPI2C_HostRequestInputTrigger = 0x1U, /*!< Select the input trigger as the host request input */ |
| AnnaBridge | 161:aa5281ff4a02 | 145 | } lpi2c_host_request_source_t; |
| AnnaBridge | 161:aa5281ff4a02 | 146 | |
| AnnaBridge | 161:aa5281ff4a02 | 147 | /*! @brief LPI2C master host request pin polarity configuration. */ |
| AnnaBridge | 161:aa5281ff4a02 | 148 | typedef enum _lpi2c_host_request_polarity |
| AnnaBridge | 161:aa5281ff4a02 | 149 | { |
| AnnaBridge | 161:aa5281ff4a02 | 150 | kLPI2C_HostRequestPinActiveLow = 0x0U, /*!< Configure the LPI2C_HREQ pin active low */ |
| AnnaBridge | 161:aa5281ff4a02 | 151 | kLPI2C_HostRequestPinActiveHigh = 0x1U /*!< Configure the LPI2C_HREQ pin active high */ |
| AnnaBridge | 161:aa5281ff4a02 | 152 | } lpi2c_host_request_polarity_t; |
| AnnaBridge | 161:aa5281ff4a02 | 153 | |
| AnnaBridge | 161:aa5281ff4a02 | 154 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 155 | * @brief Structure with settings to initialize the LPI2C master module. |
| AnnaBridge | 161:aa5281ff4a02 | 156 | * |
| AnnaBridge | 161:aa5281ff4a02 | 157 | * This structure holds configuration settings for the LPI2C peripheral. To initialize this |
| AnnaBridge | 161:aa5281ff4a02 | 158 | * structure to reasonable defaults, call the LPI2C_MasterGetDefaultConfig() function and |
| AnnaBridge | 161:aa5281ff4a02 | 159 | * pass a pointer to your configuration structure instance. |
| AnnaBridge | 161:aa5281ff4a02 | 160 | * |
| AnnaBridge | 161:aa5281ff4a02 | 161 | * The configuration structure can be made constant so it resides in flash. |
| AnnaBridge | 161:aa5281ff4a02 | 162 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 163 | typedef struct _lpi2c_master_config |
| AnnaBridge | 161:aa5281ff4a02 | 164 | { |
| AnnaBridge | 161:aa5281ff4a02 | 165 | bool enableMaster; /*!< Whether to enable master mode. */ |
| AnnaBridge | 161:aa5281ff4a02 | 166 | bool enableDoze; /*!< Whether master is enabled in doze mode. */ |
| AnnaBridge | 161:aa5281ff4a02 | 167 | bool debugEnable; /*!< Enable transfers to continue when halted in debug mode. */ |
| AnnaBridge | 161:aa5281ff4a02 | 168 | bool ignoreAck; /*!< Whether to ignore ACK/NACK. */ |
| AnnaBridge | 161:aa5281ff4a02 | 169 | lpi2c_master_pin_config_t pinConfig; /*!< The pin configuration option. */ |
| AnnaBridge | 161:aa5281ff4a02 | 170 | uint32_t baudRate_Hz; /*!< Desired baud rate in Hertz. */ |
| AnnaBridge | 161:aa5281ff4a02 | 171 | uint32_t busIdleTimeout_ns; /*!< Bus idle timeout in nanoseconds. Set to 0 to disable. */ |
| AnnaBridge | 161:aa5281ff4a02 | 172 | uint32_t pinLowTimeout_ns; /*!< Pin low timeout in nanoseconds. Set to 0 to disable. */ |
| AnnaBridge | 161:aa5281ff4a02 | 173 | uint8_t sdaGlitchFilterWidth_ns; /*!< Width in nanoseconds of glitch filter on SDA pin. Set to 0 to disable. */ |
| AnnaBridge | 161:aa5281ff4a02 | 174 | uint8_t sclGlitchFilterWidth_ns; /*!< Width in nanoseconds of glitch filter on SCL pin. Set to 0 to disable. */ |
| AnnaBridge | 161:aa5281ff4a02 | 175 | struct |
| AnnaBridge | 161:aa5281ff4a02 | 176 | { |
| AnnaBridge | 161:aa5281ff4a02 | 177 | bool enable; /*!< Enable host request. */ |
| AnnaBridge | 161:aa5281ff4a02 | 178 | lpi2c_host_request_source_t source; /*!< Host request source. */ |
| AnnaBridge | 161:aa5281ff4a02 | 179 | lpi2c_host_request_polarity_t polarity; /*!< Host request pin polarity. */ |
| AnnaBridge | 161:aa5281ff4a02 | 180 | } hostRequest; /*!< Host request options. */ |
| AnnaBridge | 161:aa5281ff4a02 | 181 | } lpi2c_master_config_t; |
| AnnaBridge | 161:aa5281ff4a02 | 182 | |
| AnnaBridge | 161:aa5281ff4a02 | 183 | /*! @brief LPI2C master data match configuration modes. */ |
| AnnaBridge | 161:aa5281ff4a02 | 184 | typedef enum _lpi2c_data_match_config_mode |
| AnnaBridge | 161:aa5281ff4a02 | 185 | { |
| AnnaBridge | 161:aa5281ff4a02 | 186 | kLPI2C_MatchDisabled = 0x0U, /*!< LPI2C Match Disabled */ |
| AnnaBridge | 161:aa5281ff4a02 | 187 | kLPI2C_1stWordEqualsM0OrM1 = 0x2U, /*!< LPI2C Match Enabled and 1st data word equals MATCH0 OR MATCH1 */ |
| AnnaBridge | 161:aa5281ff4a02 | 188 | kLPI2C_AnyWordEqualsM0OrM1 = 0x3U, /*!< LPI2C Match Enabled and any data word equals MATCH0 OR MATCH1 */ |
| AnnaBridge | 161:aa5281ff4a02 | 189 | kLPI2C_1stWordEqualsM0And2ndWordEqualsM1 = |
| AnnaBridge | 161:aa5281ff4a02 | 190 | 0x4U, /*!< LPI2C Match Enabled and 1st data word equals MATCH0, 2nd data equals MATCH1 */ |
| AnnaBridge | 161:aa5281ff4a02 | 191 | kLPI2C_AnyWordEqualsM0AndNextWordEqualsM1 = |
| AnnaBridge | 161:aa5281ff4a02 | 192 | 0x5U, /*!< LPI2C Match Enabled and any data word equals MATCH0, next data equals MATCH1 */ |
| AnnaBridge | 161:aa5281ff4a02 | 193 | kLPI2C_1stWordAndM1EqualsM0AndM1 = |
| AnnaBridge | 161:aa5281ff4a02 | 194 | 0x6U, /*!< LPI2C Match Enabled and 1st data word and MATCH0 equals MATCH0 and MATCH1 */ |
| AnnaBridge | 161:aa5281ff4a02 | 195 | kLPI2C_AnyWordAndM1EqualsM0AndM1 = |
| AnnaBridge | 161:aa5281ff4a02 | 196 | 0x7U /*!< LPI2C Match Enabled and any data word and MATCH0 equals MATCH0 and MATCH1 */ |
| AnnaBridge | 161:aa5281ff4a02 | 197 | } lpi2c_data_match_config_mode_t; |
| AnnaBridge | 161:aa5281ff4a02 | 198 | |
| AnnaBridge | 161:aa5281ff4a02 | 199 | /*! @brief LPI2C master data match configuration structure. */ |
| AnnaBridge | 161:aa5281ff4a02 | 200 | typedef struct _lpi2c_match_config |
| AnnaBridge | 161:aa5281ff4a02 | 201 | { |
| AnnaBridge | 161:aa5281ff4a02 | 202 | lpi2c_data_match_config_mode_t matchMode; /*!< Data match configuration setting. */ |
| AnnaBridge | 161:aa5281ff4a02 | 203 | bool rxDataMatchOnly; /*!< When set to true, received data is ignored until a successful match. */ |
| AnnaBridge | 161:aa5281ff4a02 | 204 | uint32_t match0; /*!< Match value 0. */ |
| AnnaBridge | 161:aa5281ff4a02 | 205 | uint32_t match1; /*!< Match value 1. */ |
| AnnaBridge | 161:aa5281ff4a02 | 206 | } lpi2c_data_match_config_t; |
| AnnaBridge | 161:aa5281ff4a02 | 207 | |
| AnnaBridge | 161:aa5281ff4a02 | 208 | /* Forward declaration of the transfer descriptor and handle typedefs. */ |
| AnnaBridge | 161:aa5281ff4a02 | 209 | typedef struct _lpi2c_master_transfer lpi2c_master_transfer_t; |
| AnnaBridge | 161:aa5281ff4a02 | 210 | typedef struct _lpi2c_master_handle lpi2c_master_handle_t; |
| AnnaBridge | 161:aa5281ff4a02 | 211 | |
| AnnaBridge | 161:aa5281ff4a02 | 212 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 213 | * @brief Master completion callback function pointer type. |
| AnnaBridge | 161:aa5281ff4a02 | 214 | * |
| AnnaBridge | 161:aa5281ff4a02 | 215 | * This callback is used only for the non-blocking master transfer API. Specify the callback you wish to use |
| AnnaBridge | 161:aa5281ff4a02 | 216 | * in the call to LPI2C_MasterTransferCreateHandle(). |
| AnnaBridge | 161:aa5281ff4a02 | 217 | * |
| AnnaBridge | 161:aa5281ff4a02 | 218 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 219 | * @param completionStatus Either #kStatus_Success or an error code describing how the transfer completed. |
| AnnaBridge | 161:aa5281ff4a02 | 220 | * @param userData Arbitrary pointer-sized value passed from the application. |
| AnnaBridge | 161:aa5281ff4a02 | 221 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 222 | typedef void (*lpi2c_master_transfer_callback_t)(LPI2C_Type *base, |
| AnnaBridge | 161:aa5281ff4a02 | 223 | lpi2c_master_handle_t *handle, |
| AnnaBridge | 161:aa5281ff4a02 | 224 | status_t completionStatus, |
| AnnaBridge | 161:aa5281ff4a02 | 225 | void *userData); |
| AnnaBridge | 161:aa5281ff4a02 | 226 | |
| AnnaBridge | 161:aa5281ff4a02 | 227 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 228 | * @brief Transfer option flags. |
| AnnaBridge | 161:aa5281ff4a02 | 229 | * |
| AnnaBridge | 161:aa5281ff4a02 | 230 | * @note These enumerations are intended to be OR'd together to form a bit mask of options for |
| AnnaBridge | 161:aa5281ff4a02 | 231 | * the #_lpi2c_master_transfer::flags field. |
| AnnaBridge | 161:aa5281ff4a02 | 232 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 233 | enum _lpi2c_master_transfer_flags |
| AnnaBridge | 161:aa5281ff4a02 | 234 | { |
| AnnaBridge | 161:aa5281ff4a02 | 235 | kLPI2C_TransferDefaultFlag = 0x00U, /*!< Transfer starts with a start signal, stops with a stop signal. */ |
| AnnaBridge | 161:aa5281ff4a02 | 236 | kLPI2C_TransferNoStartFlag = 0x01U, /*!< Don't send a start condition, address, and sub address */ |
| AnnaBridge | 161:aa5281ff4a02 | 237 | kLPI2C_TransferRepeatedStartFlag = 0x02U, /*!< Send a repeated start condition */ |
| AnnaBridge | 161:aa5281ff4a02 | 238 | kLPI2C_TransferNoStopFlag = 0x04U, /*!< Don't send a stop condition. */ |
| AnnaBridge | 161:aa5281ff4a02 | 239 | }; |
| AnnaBridge | 161:aa5281ff4a02 | 240 | |
| AnnaBridge | 161:aa5281ff4a02 | 241 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 242 | * @brief Non-blocking transfer descriptor structure. |
| AnnaBridge | 161:aa5281ff4a02 | 243 | * |
| AnnaBridge | 161:aa5281ff4a02 | 244 | * This structure is used to pass transaction parameters to the LPI2C_MasterTransferNonBlocking() API. |
| AnnaBridge | 161:aa5281ff4a02 | 245 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 246 | struct _lpi2c_master_transfer |
| AnnaBridge | 161:aa5281ff4a02 | 247 | { |
| AnnaBridge | 161:aa5281ff4a02 | 248 | uint32_t |
| AnnaBridge | 161:aa5281ff4a02 | 249 | flags; /*!< Bit mask of options for the transfer. See enumeration #_lpi2c_master_transfer_flags for available |
| AnnaBridge | 161:aa5281ff4a02 | 250 | options. Set to 0 or #kLPI2C_TransferDefaultFlag for normal transfers. */ |
| AnnaBridge | 161:aa5281ff4a02 | 251 | uint16_t slaveAddress; /*!< The 7-bit slave address. */ |
| AnnaBridge | 161:aa5281ff4a02 | 252 | lpi2c_direction_t direction; /*!< Either #kLPI2C_Read or #kLPI2C_Write. */ |
| AnnaBridge | 161:aa5281ff4a02 | 253 | uint32_t subaddress; /*!< Sub address. Transferred MSB first. */ |
| AnnaBridge | 161:aa5281ff4a02 | 254 | size_t subaddressSize; /*!< Length of sub address to send in bytes. Maximum size is 4 bytes. */ |
| AnnaBridge | 161:aa5281ff4a02 | 255 | void *data; /*!< Pointer to data to transfer. */ |
| AnnaBridge | 161:aa5281ff4a02 | 256 | size_t dataSize; /*!< Number of bytes to transfer. */ |
| AnnaBridge | 161:aa5281ff4a02 | 257 | }; |
| AnnaBridge | 161:aa5281ff4a02 | 258 | |
| AnnaBridge | 161:aa5281ff4a02 | 259 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 260 | * @brief Driver handle for master non-blocking APIs. |
| AnnaBridge | 161:aa5281ff4a02 | 261 | * @note The contents of this structure are private and subject to change. |
| AnnaBridge | 161:aa5281ff4a02 | 262 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 263 | struct _lpi2c_master_handle |
| AnnaBridge | 161:aa5281ff4a02 | 264 | { |
| AnnaBridge | 161:aa5281ff4a02 | 265 | uint8_t state; /*!< Transfer state machine current state. */ |
| AnnaBridge | 161:aa5281ff4a02 | 266 | uint16_t remainingBytes; /*!< Remaining byte count in current state. */ |
| AnnaBridge | 161:aa5281ff4a02 | 267 | uint8_t *buf; /*!< Buffer pointer for current state. */ |
| AnnaBridge | 161:aa5281ff4a02 | 268 | uint16_t commandBuffer[7]; /*!< LPI2C command sequence. */ |
| AnnaBridge | 161:aa5281ff4a02 | 269 | lpi2c_master_transfer_t transfer; /*!< Copy of the current transfer info. */ |
| AnnaBridge | 161:aa5281ff4a02 | 270 | lpi2c_master_transfer_callback_t completionCallback; /*!< Callback function pointer. */ |
| AnnaBridge | 161:aa5281ff4a02 | 271 | void *userData; /*!< Application data passed to callback. */ |
| AnnaBridge | 161:aa5281ff4a02 | 272 | }; |
| AnnaBridge | 161:aa5281ff4a02 | 273 | |
| AnnaBridge | 161:aa5281ff4a02 | 274 | /*! @} */ |
| AnnaBridge | 161:aa5281ff4a02 | 275 | |
| AnnaBridge | 161:aa5281ff4a02 | 276 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 277 | * @addtogroup lpi2c_slave_driver |
| AnnaBridge | 161:aa5281ff4a02 | 278 | * @{ |
| AnnaBridge | 161:aa5281ff4a02 | 279 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 280 | |
| AnnaBridge | 161:aa5281ff4a02 | 281 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 282 | * @brief LPI2C slave peripheral flags. |
| AnnaBridge | 161:aa5281ff4a02 | 283 | * |
| AnnaBridge | 161:aa5281ff4a02 | 284 | * The following status register flags can be cleared: |
| AnnaBridge | 161:aa5281ff4a02 | 285 | * - #kLPI2C_SlaveRepeatedStartDetectFlag |
| AnnaBridge | 161:aa5281ff4a02 | 286 | * - #kLPI2C_SlaveStopDetectFlag |
| AnnaBridge | 161:aa5281ff4a02 | 287 | * - #kLPI2C_SlaveBitErrFlag |
| AnnaBridge | 161:aa5281ff4a02 | 288 | * - #kLPI2C_SlaveFifoErrFlag |
| AnnaBridge | 161:aa5281ff4a02 | 289 | * |
| AnnaBridge | 161:aa5281ff4a02 | 290 | * All flags except #kLPI2C_SlaveBusyFlag and #kLPI2C_SlaveBusBusyFlag can be enabled as |
| AnnaBridge | 161:aa5281ff4a02 | 291 | * interrupts. |
| AnnaBridge | 161:aa5281ff4a02 | 292 | * |
| AnnaBridge | 161:aa5281ff4a02 | 293 | * @note These enumerations are meant to be OR'd together to form a bit mask. |
| AnnaBridge | 161:aa5281ff4a02 | 294 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 295 | enum _lpi2c_slave_flags |
| AnnaBridge | 161:aa5281ff4a02 | 296 | { |
| AnnaBridge | 161:aa5281ff4a02 | 297 | kLPI2C_SlaveTxReadyFlag = LPI2C_SSR_TDF_MASK, /*!< Transmit data flag */ |
| AnnaBridge | 161:aa5281ff4a02 | 298 | kLPI2C_SlaveRxReadyFlag = LPI2C_SSR_RDF_MASK, /*!< Receive data flag */ |
| AnnaBridge | 161:aa5281ff4a02 | 299 | kLPI2C_SlaveAddressValidFlag = LPI2C_SSR_AVF_MASK, /*!< Address valid flag */ |
| AnnaBridge | 161:aa5281ff4a02 | 300 | kLPI2C_SlaveTransmitAckFlag = LPI2C_SSR_TAF_MASK, /*!< Transmit ACK flag */ |
| AnnaBridge | 161:aa5281ff4a02 | 301 | kLPI2C_SlaveRepeatedStartDetectFlag = LPI2C_SSR_RSF_MASK, /*!< Repeated start detect flag */ |
| AnnaBridge | 161:aa5281ff4a02 | 302 | kLPI2C_SlaveStopDetectFlag = LPI2C_SSR_SDF_MASK, /*!< Stop detect flag */ |
| AnnaBridge | 161:aa5281ff4a02 | 303 | kLPI2C_SlaveBitErrFlag = LPI2C_SSR_BEF_MASK, /*!< Bit error flag */ |
| AnnaBridge | 161:aa5281ff4a02 | 304 | kLPI2C_SlaveFifoErrFlag = LPI2C_SSR_FEF_MASK, /*!< FIFO error flag */ |
| AnnaBridge | 161:aa5281ff4a02 | 305 | kLPI2C_SlaveAddressMatch0Flag = LPI2C_SSR_AM0F_MASK, /*!< Address match 0 flag */ |
| AnnaBridge | 161:aa5281ff4a02 | 306 | kLPI2C_SlaveAddressMatch1Flag = LPI2C_SSR_AM1F_MASK, /*!< Address match 1 flag */ |
| AnnaBridge | 161:aa5281ff4a02 | 307 | kLPI2C_SlaveGeneralCallFlag = LPI2C_SSR_GCF_MASK, /*!< General call flag */ |
| AnnaBridge | 161:aa5281ff4a02 | 308 | kLPI2C_SlaveBusyFlag = LPI2C_SSR_SBF_MASK, /*!< Master busy flag */ |
| AnnaBridge | 161:aa5281ff4a02 | 309 | kLPI2C_SlaveBusBusyFlag = LPI2C_SSR_BBF_MASK, /*!< Bus busy flag */ |
| AnnaBridge | 161:aa5281ff4a02 | 310 | }; |
| AnnaBridge | 161:aa5281ff4a02 | 311 | |
| AnnaBridge | 161:aa5281ff4a02 | 312 | /*! @brief LPI2C slave address match options. */ |
| AnnaBridge | 161:aa5281ff4a02 | 313 | typedef enum _lpi2c_slave_address_match |
| AnnaBridge | 161:aa5281ff4a02 | 314 | { |
| AnnaBridge | 161:aa5281ff4a02 | 315 | kLPI2C_MatchAddress0 = 0U, /*!< Match only address 0. */ |
| AnnaBridge | 161:aa5281ff4a02 | 316 | kLPI2C_MatchAddress0OrAddress1 = 2U, /*!< Match either address 0 or address 1. */ |
| AnnaBridge | 161:aa5281ff4a02 | 317 | kLPI2C_MatchAddress0ThroughAddress1 = 6U, /*!< Match a range of slave addresses from address 0 through address 1. */ |
| AnnaBridge | 161:aa5281ff4a02 | 318 | } lpi2c_slave_address_match_t; |
| AnnaBridge | 161:aa5281ff4a02 | 319 | |
| AnnaBridge | 161:aa5281ff4a02 | 320 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 321 | * @brief Structure with settings to initialize the LPI2C slave module. |
| AnnaBridge | 161:aa5281ff4a02 | 322 | * |
| AnnaBridge | 161:aa5281ff4a02 | 323 | * This structure holds configuration settings for the LPI2C slave peripheral. To initialize this |
| AnnaBridge | 161:aa5281ff4a02 | 324 | * structure to reasonable defaults, call the LPI2C_SlaveGetDefaultConfig() function and |
| AnnaBridge | 161:aa5281ff4a02 | 325 | * pass a pointer to your configuration structure instance. |
| AnnaBridge | 161:aa5281ff4a02 | 326 | * |
| AnnaBridge | 161:aa5281ff4a02 | 327 | * The configuration structure can be made constant so it resides in flash. |
| AnnaBridge | 161:aa5281ff4a02 | 328 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 329 | typedef struct _lpi2c_slave_config |
| AnnaBridge | 161:aa5281ff4a02 | 330 | { |
| AnnaBridge | 161:aa5281ff4a02 | 331 | bool enableSlave; /*!< Enable slave mode. */ |
| AnnaBridge | 161:aa5281ff4a02 | 332 | uint8_t address0; /*!< Slave's 7-bit address. */ |
| AnnaBridge | 161:aa5281ff4a02 | 333 | uint8_t address1; /*!< Alternate slave 7-bit address. */ |
| AnnaBridge | 161:aa5281ff4a02 | 334 | lpi2c_slave_address_match_t addressMatchMode; /*!< Address matching options. */ |
| AnnaBridge | 161:aa5281ff4a02 | 335 | bool filterDozeEnable; /*!< Enable digital glitch filter in doze mode. */ |
| AnnaBridge | 161:aa5281ff4a02 | 336 | bool filterEnable; /*!< Enable digital glitch filter. */ |
| AnnaBridge | 161:aa5281ff4a02 | 337 | bool enableGeneralCall; /*!< Enable general call address matching. */ |
| AnnaBridge | 161:aa5281ff4a02 | 338 | struct |
| AnnaBridge | 161:aa5281ff4a02 | 339 | { |
| AnnaBridge | 161:aa5281ff4a02 | 340 | bool enableAck; /*!< Enables SCL clock stretching during slave-transmit address byte(s) |
| AnnaBridge | 161:aa5281ff4a02 | 341 | and slave-receiver address and data byte(s) to allow software to |
| AnnaBridge | 161:aa5281ff4a02 | 342 | write the Transmit ACK Register before the ACK or NACK is transmitted. |
| AnnaBridge | 161:aa5281ff4a02 | 343 | Clock stretching occurs when transmitting the 9th bit. When |
| AnnaBridge | 161:aa5281ff4a02 | 344 | enableAckSCLStall is enabled, there is no need to set either |
| AnnaBridge | 161:aa5281ff4a02 | 345 | enableRxDataSCLStall or enableAddressSCLStall. */ |
| AnnaBridge | 161:aa5281ff4a02 | 346 | bool enableTx; /*!< Enables SCL clock stretching when the transmit data flag is set |
| AnnaBridge | 161:aa5281ff4a02 | 347 | during a slave-transmit transfer. */ |
| AnnaBridge | 161:aa5281ff4a02 | 348 | bool enableRx; /*!< Enables SCL clock stretching when receive data flag is set during |
| AnnaBridge | 161:aa5281ff4a02 | 349 | a slave-receive transfer. */ |
| AnnaBridge | 161:aa5281ff4a02 | 350 | bool enableAddress; /*!< Enables SCL clock stretching when the address valid flag is asserted. */ |
| AnnaBridge | 161:aa5281ff4a02 | 351 | } sclStall; |
| AnnaBridge | 161:aa5281ff4a02 | 352 | bool ignoreAck; /*!< Continue transfers after a NACK is detected. */ |
| AnnaBridge | 161:aa5281ff4a02 | 353 | bool enableReceivedAddressRead; /*!< Enable reading the address received address as the first byte of data. */ |
| AnnaBridge | 161:aa5281ff4a02 | 354 | uint32_t sdaGlitchFilterWidth_ns; /*!< Width in nanoseconds of the digital filter on the SDA signal. */ |
| AnnaBridge | 161:aa5281ff4a02 | 355 | uint32_t sclGlitchFilterWidth_ns; /*!< Width in nanoseconds of the digital filter on the SCL signal. */ |
| AnnaBridge | 161:aa5281ff4a02 | 356 | uint32_t dataValidDelay_ns; /*!< Width in nanoseconds of the data valid delay. */ |
| AnnaBridge | 161:aa5281ff4a02 | 357 | uint32_t clockHoldTime_ns; /*!< Width in nanoseconds of the clock hold time. */ |
| AnnaBridge | 161:aa5281ff4a02 | 358 | } lpi2c_slave_config_t; |
| AnnaBridge | 161:aa5281ff4a02 | 359 | |
| AnnaBridge | 161:aa5281ff4a02 | 360 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 361 | * @brief Set of events sent to the callback for non blocking slave transfers. |
| AnnaBridge | 161:aa5281ff4a02 | 362 | * |
| AnnaBridge | 161:aa5281ff4a02 | 363 | * These event enumerations are used for two related purposes. First, a bit mask created by OR'ing together |
| AnnaBridge | 161:aa5281ff4a02 | 364 | * events is passed to LPI2C_SlaveTransferNonBlocking() in order to specify which events to enable. |
| AnnaBridge | 161:aa5281ff4a02 | 365 | * Then, when the slave callback is invoked, it is passed the current event through its @a transfer |
| AnnaBridge | 161:aa5281ff4a02 | 366 | * parameter. |
| AnnaBridge | 161:aa5281ff4a02 | 367 | * |
| AnnaBridge | 161:aa5281ff4a02 | 368 | * @note These enumerations are meant to be OR'd together to form a bit mask of events. |
| AnnaBridge | 161:aa5281ff4a02 | 369 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 370 | typedef enum _lpi2c_slave_transfer_event |
| AnnaBridge | 161:aa5281ff4a02 | 371 | { |
| AnnaBridge | 161:aa5281ff4a02 | 372 | kLPI2C_SlaveAddressMatchEvent = 0x01U, /*!< Received the slave address after a start or repeated start. */ |
| AnnaBridge | 161:aa5281ff4a02 | 373 | kLPI2C_SlaveTransmitEvent = 0x02U, /*!< Callback is requested to provide data to transmit |
| AnnaBridge | 161:aa5281ff4a02 | 374 | (slave-transmitter role). */ |
| AnnaBridge | 161:aa5281ff4a02 | 375 | kLPI2C_SlaveReceiveEvent = 0x04U, /*!< Callback is requested to provide a buffer in which to place received |
| AnnaBridge | 161:aa5281ff4a02 | 376 | data (slave-receiver role). */ |
| AnnaBridge | 161:aa5281ff4a02 | 377 | kLPI2C_SlaveTransmitAckEvent = 0x08U, /*!< Callback needs to either transmit an ACK or NACK. */ |
| AnnaBridge | 161:aa5281ff4a02 | 378 | kLPI2C_SlaveRepeatedStartEvent = 0x10U, /*!< A repeated start was detected. */ |
| AnnaBridge | 161:aa5281ff4a02 | 379 | kLPI2C_SlaveCompletionEvent = 0x20U, /*!< A stop was detected, completing the transfer. */ |
| AnnaBridge | 161:aa5281ff4a02 | 380 | |
| AnnaBridge | 161:aa5281ff4a02 | 381 | /*! Bit mask of all available events. */ |
| AnnaBridge | 161:aa5281ff4a02 | 382 | kLPI2C_SlaveAllEvents = kLPI2C_SlaveAddressMatchEvent | kLPI2C_SlaveTransmitEvent | kLPI2C_SlaveReceiveEvent | |
| AnnaBridge | 161:aa5281ff4a02 | 383 | kLPI2C_SlaveTransmitAckEvent | kLPI2C_SlaveRepeatedStartEvent | kLPI2C_SlaveCompletionEvent, |
| AnnaBridge | 161:aa5281ff4a02 | 384 | } lpi2c_slave_transfer_event_t; |
| AnnaBridge | 161:aa5281ff4a02 | 385 | |
| AnnaBridge | 161:aa5281ff4a02 | 386 | /*! @brief LPI2C slave transfer structure */ |
| AnnaBridge | 161:aa5281ff4a02 | 387 | typedef struct _lpi2c_slave_transfer |
| AnnaBridge | 161:aa5281ff4a02 | 388 | { |
| AnnaBridge | 161:aa5281ff4a02 | 389 | lpi2c_slave_transfer_event_t event; /*!< Reason the callback is being invoked. */ |
| AnnaBridge | 161:aa5281ff4a02 | 390 | uint8_t receivedAddress; /*!< Matching address send by master. */ |
| AnnaBridge | 161:aa5281ff4a02 | 391 | uint8_t *data; /*!< Transfer buffer */ |
| AnnaBridge | 161:aa5281ff4a02 | 392 | size_t dataSize; /*!< Transfer size */ |
| AnnaBridge | 161:aa5281ff4a02 | 393 | status_t completionStatus; /*!< Success or error code describing how the transfer completed. Only applies for |
| AnnaBridge | 161:aa5281ff4a02 | 394 | #kLPI2C_SlaveCompletionEvent. */ |
| AnnaBridge | 161:aa5281ff4a02 | 395 | size_t transferredCount; /*!< Number of bytes actually transferred since start or last repeated start. */ |
| AnnaBridge | 161:aa5281ff4a02 | 396 | } lpi2c_slave_transfer_t; |
| AnnaBridge | 161:aa5281ff4a02 | 397 | |
| AnnaBridge | 161:aa5281ff4a02 | 398 | /* Forward declaration. */ |
| AnnaBridge | 161:aa5281ff4a02 | 399 | typedef struct _lpi2c_slave_handle lpi2c_slave_handle_t; |
| AnnaBridge | 161:aa5281ff4a02 | 400 | |
| AnnaBridge | 161:aa5281ff4a02 | 401 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 402 | * @brief Slave event callback function pointer type. |
| AnnaBridge | 161:aa5281ff4a02 | 403 | * |
| AnnaBridge | 161:aa5281ff4a02 | 404 | * This callback is used only for the slave non-blocking transfer API. To install a callback, |
| AnnaBridge | 161:aa5281ff4a02 | 405 | * use the LPI2C_SlaveSetCallback() function after you have created a handle. |
| AnnaBridge | 161:aa5281ff4a02 | 406 | * |
| AnnaBridge | 161:aa5281ff4a02 | 407 | * @param base Base address for the LPI2C instance on which the event occurred. |
| AnnaBridge | 161:aa5281ff4a02 | 408 | * @param transfer Pointer to transfer descriptor containing values passed to and/or from the callback. |
| AnnaBridge | 161:aa5281ff4a02 | 409 | * @param userData Arbitrary pointer-sized value passed from the application. |
| AnnaBridge | 161:aa5281ff4a02 | 410 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 411 | typedef void (*lpi2c_slave_transfer_callback_t)(LPI2C_Type *base, lpi2c_slave_transfer_t *transfer, void *userData); |
| AnnaBridge | 161:aa5281ff4a02 | 412 | |
| AnnaBridge | 161:aa5281ff4a02 | 413 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 414 | * @brief LPI2C slave handle structure. |
| AnnaBridge | 161:aa5281ff4a02 | 415 | * @note The contents of this structure are private and subject to change. |
| AnnaBridge | 161:aa5281ff4a02 | 416 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 417 | struct _lpi2c_slave_handle |
| AnnaBridge | 161:aa5281ff4a02 | 418 | { |
| AnnaBridge | 161:aa5281ff4a02 | 419 | lpi2c_slave_transfer_t transfer; /*!< LPI2C slave transfer copy. */ |
| AnnaBridge | 161:aa5281ff4a02 | 420 | bool isBusy; /*!< Whether transfer is busy. */ |
| AnnaBridge | 161:aa5281ff4a02 | 421 | bool wasTransmit; /*!< Whether the last transfer was a transmit. */ |
| AnnaBridge | 161:aa5281ff4a02 | 422 | uint32_t eventMask; /*!< Mask of enabled events. */ |
| AnnaBridge | 161:aa5281ff4a02 | 423 | uint32_t transferredCount; /*!< Count of bytes transferred. */ |
| AnnaBridge | 161:aa5281ff4a02 | 424 | lpi2c_slave_transfer_callback_t callback; /*!< Callback function called at transfer event. */ |
| AnnaBridge | 161:aa5281ff4a02 | 425 | void *userData; /*!< Callback parameter passed to callback. */ |
| AnnaBridge | 161:aa5281ff4a02 | 426 | }; |
| AnnaBridge | 161:aa5281ff4a02 | 427 | |
| AnnaBridge | 161:aa5281ff4a02 | 428 | /*! @} */ |
| AnnaBridge | 161:aa5281ff4a02 | 429 | |
| AnnaBridge | 161:aa5281ff4a02 | 430 | /******************************************************************************* |
| AnnaBridge | 161:aa5281ff4a02 | 431 | * API |
| AnnaBridge | 161:aa5281ff4a02 | 432 | ******************************************************************************/ |
| AnnaBridge | 161:aa5281ff4a02 | 433 | |
| AnnaBridge | 161:aa5281ff4a02 | 434 | #if defined(__cplusplus) |
| AnnaBridge | 161:aa5281ff4a02 | 435 | extern "C" { |
| AnnaBridge | 161:aa5281ff4a02 | 436 | #endif |
| AnnaBridge | 161:aa5281ff4a02 | 437 | |
| AnnaBridge | 161:aa5281ff4a02 | 438 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 439 | * @addtogroup lpi2c_master_driver |
| AnnaBridge | 161:aa5281ff4a02 | 440 | * @{ |
| AnnaBridge | 161:aa5281ff4a02 | 441 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 442 | |
| AnnaBridge | 161:aa5281ff4a02 | 443 | /*! @name Initialization and deinitialization */ |
| AnnaBridge | 161:aa5281ff4a02 | 444 | /*@{*/ |
| AnnaBridge | 161:aa5281ff4a02 | 445 | |
| AnnaBridge | 161:aa5281ff4a02 | 446 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 447 | * @brief Provides a default configuration for the LPI2C master peripheral. |
| AnnaBridge | 161:aa5281ff4a02 | 448 | * |
| AnnaBridge | 161:aa5281ff4a02 | 449 | * This function provides the following default configuration for the LPI2C master peripheral: |
| AnnaBridge | 161:aa5281ff4a02 | 450 | * @code |
| AnnaBridge | 161:aa5281ff4a02 | 451 | * masterConfig->enableMaster = true; |
| AnnaBridge | 161:aa5281ff4a02 | 452 | * masterConfig->debugEnable = false; |
| AnnaBridge | 161:aa5281ff4a02 | 453 | * masterConfig->ignoreAck = false; |
| AnnaBridge | 161:aa5281ff4a02 | 454 | * masterConfig->pinConfig = kLPI2C_2PinOpenDrain; |
| AnnaBridge | 161:aa5281ff4a02 | 455 | * masterConfig->baudRate_Hz = 100000U; |
| AnnaBridge | 161:aa5281ff4a02 | 456 | * masterConfig->busIdleTimeout_ns = 0; |
| AnnaBridge | 161:aa5281ff4a02 | 457 | * masterConfig->pinLowTimeout_ns = 0; |
| AnnaBridge | 161:aa5281ff4a02 | 458 | * masterConfig->sdaGlitchFilterWidth_ns = 0; |
| AnnaBridge | 161:aa5281ff4a02 | 459 | * masterConfig->sclGlitchFilterWidth_ns = 0; |
| AnnaBridge | 161:aa5281ff4a02 | 460 | * masterConfig->hostRequest.enable = false; |
| AnnaBridge | 161:aa5281ff4a02 | 461 | * masterConfig->hostRequest.source = kLPI2C_HostRequestExternalPin; |
| AnnaBridge | 161:aa5281ff4a02 | 462 | * masterConfig->hostRequest.polarity = kLPI2C_HostRequestPinActiveHigh; |
| AnnaBridge | 161:aa5281ff4a02 | 463 | * @endcode |
| AnnaBridge | 161:aa5281ff4a02 | 464 | * |
| AnnaBridge | 161:aa5281ff4a02 | 465 | * After calling this function, you can override any settings in order to customize the configuration, |
| AnnaBridge | 161:aa5281ff4a02 | 466 | * prior to initializing the master driver with LPI2C_MasterInit(). |
| AnnaBridge | 161:aa5281ff4a02 | 467 | * |
| AnnaBridge | 161:aa5281ff4a02 | 468 | * @param[out] masterConfig User provided configuration structure for default values. Refer to #lpi2c_master_config_t. |
| AnnaBridge | 161:aa5281ff4a02 | 469 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 470 | void LPI2C_MasterGetDefaultConfig(lpi2c_master_config_t *masterConfig); |
| AnnaBridge | 161:aa5281ff4a02 | 471 | |
| AnnaBridge | 161:aa5281ff4a02 | 472 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 473 | * @brief Initializes the LPI2C master peripheral. |
| AnnaBridge | 161:aa5281ff4a02 | 474 | * |
| AnnaBridge | 161:aa5281ff4a02 | 475 | * This function enables the peripheral clock and initializes the LPI2C master peripheral as described by the user |
| AnnaBridge | 161:aa5281ff4a02 | 476 | * provided configuration. A software reset is performed prior to configuration. |
| AnnaBridge | 161:aa5281ff4a02 | 477 | * |
| AnnaBridge | 161:aa5281ff4a02 | 478 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 479 | * @param masterConfig User provided peripheral configuration. Use LPI2C_MasterGetDefaultConfig() to get a set of |
| AnnaBridge | 161:aa5281ff4a02 | 480 | * defaults |
| AnnaBridge | 161:aa5281ff4a02 | 481 | * that you can override. |
| AnnaBridge | 161:aa5281ff4a02 | 482 | * @param sourceClock_Hz Frequency in Hertz of the LPI2C functional clock. Used to calculate the baud rate divisors, |
| AnnaBridge | 161:aa5281ff4a02 | 483 | * filter widths, and timeout periods. |
| AnnaBridge | 161:aa5281ff4a02 | 484 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 485 | void LPI2C_MasterInit(LPI2C_Type *base, const lpi2c_master_config_t *masterConfig, uint32_t sourceClock_Hz); |
| AnnaBridge | 161:aa5281ff4a02 | 486 | |
| AnnaBridge | 161:aa5281ff4a02 | 487 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 488 | * @brief Deinitializes the LPI2C master peripheral. |
| AnnaBridge | 161:aa5281ff4a02 | 489 | * |
| AnnaBridge | 161:aa5281ff4a02 | 490 | * This function disables the LPI2C master peripheral and gates the clock. It also performs a software |
| AnnaBridge | 161:aa5281ff4a02 | 491 | * reset to restore the peripheral to reset conditions. |
| AnnaBridge | 161:aa5281ff4a02 | 492 | * |
| AnnaBridge | 161:aa5281ff4a02 | 493 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 494 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 495 | void LPI2C_MasterDeinit(LPI2C_Type *base); |
| AnnaBridge | 161:aa5281ff4a02 | 496 | |
| AnnaBridge | 161:aa5281ff4a02 | 497 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 498 | * @brief Configures LPI2C master data match feature. |
| AnnaBridge | 161:aa5281ff4a02 | 499 | * |
| AnnaBridge | 161:aa5281ff4a02 | 500 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 501 | * @param config Settings for the data match feature. |
| AnnaBridge | 161:aa5281ff4a02 | 502 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 503 | void LPI2C_MasterConfigureDataMatch(LPI2C_Type *base, const lpi2c_data_match_config_t *config); |
| AnnaBridge | 161:aa5281ff4a02 | 504 | |
| AnnaBridge | 170:e95d10626187 | 505 | /* Not static so it can be used from fsl_lpi2c_edma.c. */ |
| AnnaBridge | 170:e95d10626187 | 506 | status_t LPI2C_MasterCheckAndClearError(LPI2C_Type *base, uint32_t status); |
| AnnaBridge | 170:e95d10626187 | 507 | |
| AnnaBridge | 170:e95d10626187 | 508 | /* Not static so it can be used from fsl_lpi2c_edma.c. */ |
| AnnaBridge | 170:e95d10626187 | 509 | status_t LPI2C_CheckForBusyBus(LPI2C_Type *base); |
| AnnaBridge | 170:e95d10626187 | 510 | |
| AnnaBridge | 161:aa5281ff4a02 | 511 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 512 | * @brief Performs a software reset. |
| AnnaBridge | 161:aa5281ff4a02 | 513 | * |
| AnnaBridge | 161:aa5281ff4a02 | 514 | * Restores the LPI2C master peripheral to reset conditions. |
| AnnaBridge | 161:aa5281ff4a02 | 515 | * |
| AnnaBridge | 161:aa5281ff4a02 | 516 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 517 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 518 | static inline void LPI2C_MasterReset(LPI2C_Type *base) |
| AnnaBridge | 161:aa5281ff4a02 | 519 | { |
| AnnaBridge | 161:aa5281ff4a02 | 520 | base->MCR = LPI2C_MCR_RST_MASK; |
| AnnaBridge | 161:aa5281ff4a02 | 521 | base->MCR = 0; |
| AnnaBridge | 161:aa5281ff4a02 | 522 | } |
| AnnaBridge | 161:aa5281ff4a02 | 523 | |
| AnnaBridge | 161:aa5281ff4a02 | 524 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 525 | * @brief Enables or disables the LPI2C module as master. |
| AnnaBridge | 161:aa5281ff4a02 | 526 | * |
| AnnaBridge | 161:aa5281ff4a02 | 527 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 528 | * @param enable Pass true to enable or false to disable the specified LPI2C as master. |
| AnnaBridge | 161:aa5281ff4a02 | 529 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 530 | static inline void LPI2C_MasterEnable(LPI2C_Type *base, bool enable) |
| AnnaBridge | 161:aa5281ff4a02 | 531 | { |
| AnnaBridge | 161:aa5281ff4a02 | 532 | base->MCR = (base->MCR & ~LPI2C_MCR_MEN_MASK) | LPI2C_MCR_MEN(enable); |
| AnnaBridge | 161:aa5281ff4a02 | 533 | } |
| AnnaBridge | 161:aa5281ff4a02 | 534 | |
| AnnaBridge | 161:aa5281ff4a02 | 535 | /*@}*/ |
| AnnaBridge | 161:aa5281ff4a02 | 536 | |
| AnnaBridge | 161:aa5281ff4a02 | 537 | /*! @name Status */ |
| AnnaBridge | 161:aa5281ff4a02 | 538 | /*@{*/ |
| AnnaBridge | 161:aa5281ff4a02 | 539 | |
| AnnaBridge | 161:aa5281ff4a02 | 540 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 541 | * @brief Gets the LPI2C master status flags. |
| AnnaBridge | 161:aa5281ff4a02 | 542 | * |
| AnnaBridge | 161:aa5281ff4a02 | 543 | * A bit mask with the state of all LPI2C master status flags is returned. For each flag, the corresponding bit |
| AnnaBridge | 161:aa5281ff4a02 | 544 | * in the return value is set if the flag is asserted. |
| AnnaBridge | 161:aa5281ff4a02 | 545 | * |
| AnnaBridge | 161:aa5281ff4a02 | 546 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 547 | * @return State of the status flags: |
| AnnaBridge | 161:aa5281ff4a02 | 548 | * - 1: related status flag is set. |
| AnnaBridge | 161:aa5281ff4a02 | 549 | * - 0: related status flag is not set. |
| AnnaBridge | 161:aa5281ff4a02 | 550 | * @see _lpi2c_master_flags |
| AnnaBridge | 161:aa5281ff4a02 | 551 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 552 | static inline uint32_t LPI2C_MasterGetStatusFlags(LPI2C_Type *base) |
| AnnaBridge | 161:aa5281ff4a02 | 553 | { |
| AnnaBridge | 161:aa5281ff4a02 | 554 | return base->MSR; |
| AnnaBridge | 161:aa5281ff4a02 | 555 | } |
| AnnaBridge | 161:aa5281ff4a02 | 556 | |
| AnnaBridge | 161:aa5281ff4a02 | 557 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 558 | * @brief Clears the LPI2C master status flag state. |
| AnnaBridge | 161:aa5281ff4a02 | 559 | * |
| AnnaBridge | 161:aa5281ff4a02 | 560 | * The following status register flags can be cleared: |
| AnnaBridge | 161:aa5281ff4a02 | 561 | * - #kLPI2C_MasterEndOfPacketFlag |
| AnnaBridge | 161:aa5281ff4a02 | 562 | * - #kLPI2C_MasterStopDetectFlag |
| AnnaBridge | 161:aa5281ff4a02 | 563 | * - #kLPI2C_MasterNackDetectFlag |
| AnnaBridge | 161:aa5281ff4a02 | 564 | * - #kLPI2C_MasterArbitrationLostFlag |
| AnnaBridge | 161:aa5281ff4a02 | 565 | * - #kLPI2C_MasterFifoErrFlag |
| AnnaBridge | 161:aa5281ff4a02 | 566 | * - #kLPI2C_MasterPinLowTimeoutFlag |
| AnnaBridge | 161:aa5281ff4a02 | 567 | * - #kLPI2C_MasterDataMatchFlag |
| AnnaBridge | 161:aa5281ff4a02 | 568 | * |
| AnnaBridge | 161:aa5281ff4a02 | 569 | * Attempts to clear other flags has no effect. |
| AnnaBridge | 161:aa5281ff4a02 | 570 | * |
| AnnaBridge | 161:aa5281ff4a02 | 571 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 572 | * @param statusMask A bitmask of status flags that are to be cleared. The mask is composed of |
| AnnaBridge | 161:aa5281ff4a02 | 573 | * #_lpi2c_master_flags enumerators OR'd together. You may pass the result of a previous call to |
| AnnaBridge | 161:aa5281ff4a02 | 574 | * LPI2C_MasterGetStatusFlags(). |
| AnnaBridge | 161:aa5281ff4a02 | 575 | * @see _lpi2c_master_flags. |
| AnnaBridge | 161:aa5281ff4a02 | 576 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 577 | static inline void LPI2C_MasterClearStatusFlags(LPI2C_Type *base, uint32_t statusMask) |
| AnnaBridge | 161:aa5281ff4a02 | 578 | { |
| AnnaBridge | 161:aa5281ff4a02 | 579 | base->MSR = statusMask; |
| AnnaBridge | 161:aa5281ff4a02 | 580 | } |
| AnnaBridge | 161:aa5281ff4a02 | 581 | |
| AnnaBridge | 161:aa5281ff4a02 | 582 | /*@}*/ |
| AnnaBridge | 161:aa5281ff4a02 | 583 | |
| AnnaBridge | 161:aa5281ff4a02 | 584 | /*! @name Interrupts */ |
| AnnaBridge | 161:aa5281ff4a02 | 585 | /*@{*/ |
| AnnaBridge | 161:aa5281ff4a02 | 586 | |
| AnnaBridge | 161:aa5281ff4a02 | 587 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 588 | * @brief Enables the LPI2C master interrupt requests. |
| AnnaBridge | 161:aa5281ff4a02 | 589 | * |
| AnnaBridge | 161:aa5281ff4a02 | 590 | * All flags except #kLPI2C_MasterBusyFlag and #kLPI2C_MasterBusBusyFlag can be enabled as |
| AnnaBridge | 161:aa5281ff4a02 | 591 | * interrupts. |
| AnnaBridge | 161:aa5281ff4a02 | 592 | * |
| AnnaBridge | 161:aa5281ff4a02 | 593 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 594 | * @param interruptMask Bit mask of interrupts to enable. See #_lpi2c_master_flags for the set |
| AnnaBridge | 161:aa5281ff4a02 | 595 | * of constants that should be OR'd together to form the bit mask. |
| AnnaBridge | 161:aa5281ff4a02 | 596 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 597 | static inline void LPI2C_MasterEnableInterrupts(LPI2C_Type *base, uint32_t interruptMask) |
| AnnaBridge | 161:aa5281ff4a02 | 598 | { |
| AnnaBridge | 161:aa5281ff4a02 | 599 | base->MIER |= interruptMask; |
| AnnaBridge | 161:aa5281ff4a02 | 600 | } |
| AnnaBridge | 161:aa5281ff4a02 | 601 | |
| AnnaBridge | 161:aa5281ff4a02 | 602 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 603 | * @brief Disables the LPI2C master interrupt requests. |
| AnnaBridge | 161:aa5281ff4a02 | 604 | * |
| AnnaBridge | 161:aa5281ff4a02 | 605 | * All flags except #kLPI2C_MasterBusyFlag and #kLPI2C_MasterBusBusyFlag can be enabled as |
| AnnaBridge | 161:aa5281ff4a02 | 606 | * interrupts. |
| AnnaBridge | 161:aa5281ff4a02 | 607 | * |
| AnnaBridge | 161:aa5281ff4a02 | 608 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 609 | * @param interruptMask Bit mask of interrupts to disable. See #_lpi2c_master_flags for the set |
| AnnaBridge | 161:aa5281ff4a02 | 610 | * of constants that should be OR'd together to form the bit mask. |
| AnnaBridge | 161:aa5281ff4a02 | 611 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 612 | static inline void LPI2C_MasterDisableInterrupts(LPI2C_Type *base, uint32_t interruptMask) |
| AnnaBridge | 161:aa5281ff4a02 | 613 | { |
| AnnaBridge | 161:aa5281ff4a02 | 614 | base->MIER &= ~interruptMask; |
| AnnaBridge | 161:aa5281ff4a02 | 615 | } |
| AnnaBridge | 161:aa5281ff4a02 | 616 | |
| AnnaBridge | 161:aa5281ff4a02 | 617 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 618 | * @brief Returns the set of currently enabled LPI2C master interrupt requests. |
| AnnaBridge | 161:aa5281ff4a02 | 619 | * |
| AnnaBridge | 161:aa5281ff4a02 | 620 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 621 | * @return A bitmask composed of #_lpi2c_master_flags enumerators OR'd together to indicate the |
| AnnaBridge | 161:aa5281ff4a02 | 622 | * set of enabled interrupts. |
| AnnaBridge | 161:aa5281ff4a02 | 623 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 624 | static inline uint32_t LPI2C_MasterGetEnabledInterrupts(LPI2C_Type *base) |
| AnnaBridge | 161:aa5281ff4a02 | 625 | { |
| AnnaBridge | 161:aa5281ff4a02 | 626 | return base->MIER; |
| AnnaBridge | 161:aa5281ff4a02 | 627 | } |
| AnnaBridge | 161:aa5281ff4a02 | 628 | |
| AnnaBridge | 161:aa5281ff4a02 | 629 | /*@}*/ |
| AnnaBridge | 161:aa5281ff4a02 | 630 | |
| AnnaBridge | 161:aa5281ff4a02 | 631 | /*! @name DMA control */ |
| AnnaBridge | 161:aa5281ff4a02 | 632 | /*@{*/ |
| AnnaBridge | 161:aa5281ff4a02 | 633 | |
| AnnaBridge | 161:aa5281ff4a02 | 634 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 635 | * @brief Enables or disables LPI2C master DMA requests. |
| AnnaBridge | 161:aa5281ff4a02 | 636 | * |
| AnnaBridge | 161:aa5281ff4a02 | 637 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 638 | * @param enableTx Enable flag for transmit DMA request. Pass true for enable, false for disable. |
| AnnaBridge | 161:aa5281ff4a02 | 639 | * @param enableRx Enable flag for receive DMA request. Pass true for enable, false for disable. |
| AnnaBridge | 161:aa5281ff4a02 | 640 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 641 | static inline void LPI2C_MasterEnableDMA(LPI2C_Type *base, bool enableTx, bool enableRx) |
| AnnaBridge | 161:aa5281ff4a02 | 642 | { |
| AnnaBridge | 161:aa5281ff4a02 | 643 | base->MDER = LPI2C_MDER_TDDE(enableTx) | LPI2C_MDER_RDDE(enableRx); |
| AnnaBridge | 161:aa5281ff4a02 | 644 | } |
| AnnaBridge | 161:aa5281ff4a02 | 645 | |
| AnnaBridge | 161:aa5281ff4a02 | 646 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 647 | * @brief Gets LPI2C master transmit data register address for DMA transfer. |
| AnnaBridge | 161:aa5281ff4a02 | 648 | * |
| AnnaBridge | 161:aa5281ff4a02 | 649 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 650 | * @return The LPI2C Master Transmit Data Register address. |
| AnnaBridge | 161:aa5281ff4a02 | 651 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 652 | static inline uint32_t LPI2C_MasterGetTxFifoAddress(LPI2C_Type *base) |
| AnnaBridge | 161:aa5281ff4a02 | 653 | { |
| AnnaBridge | 161:aa5281ff4a02 | 654 | return (uint32_t)&base->MTDR; |
| AnnaBridge | 161:aa5281ff4a02 | 655 | } |
| AnnaBridge | 161:aa5281ff4a02 | 656 | |
| AnnaBridge | 161:aa5281ff4a02 | 657 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 658 | * @brief Gets LPI2C master receive data register address for DMA transfer. |
| AnnaBridge | 161:aa5281ff4a02 | 659 | * |
| AnnaBridge | 161:aa5281ff4a02 | 660 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 661 | * @return The LPI2C Master Receive Data Register address. |
| AnnaBridge | 161:aa5281ff4a02 | 662 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 663 | static inline uint32_t LPI2C_MasterGetRxFifoAddress(LPI2C_Type *base) |
| AnnaBridge | 161:aa5281ff4a02 | 664 | { |
| AnnaBridge | 161:aa5281ff4a02 | 665 | return (uint32_t)&base->MRDR; |
| AnnaBridge | 161:aa5281ff4a02 | 666 | } |
| AnnaBridge | 161:aa5281ff4a02 | 667 | |
| AnnaBridge | 161:aa5281ff4a02 | 668 | /*@}*/ |
| AnnaBridge | 161:aa5281ff4a02 | 669 | |
| AnnaBridge | 161:aa5281ff4a02 | 670 | /*! @name FIFO control */ |
| AnnaBridge | 161:aa5281ff4a02 | 671 | /*@{*/ |
| AnnaBridge | 161:aa5281ff4a02 | 672 | |
| AnnaBridge | 161:aa5281ff4a02 | 673 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 674 | * @brief Sets the watermarks for LPI2C master FIFOs. |
| AnnaBridge | 161:aa5281ff4a02 | 675 | * |
| AnnaBridge | 161:aa5281ff4a02 | 676 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 677 | * @param txWords Transmit FIFO watermark value in words. The #kLPI2C_MasterTxReadyFlag flag is set whenever |
| AnnaBridge | 161:aa5281ff4a02 | 678 | * the number of words in the transmit FIFO is equal or less than @a txWords. Writing a value equal or |
| AnnaBridge | 161:aa5281ff4a02 | 679 | * greater than the FIFO size is truncated. |
| AnnaBridge | 161:aa5281ff4a02 | 680 | * @param rxWords Receive FIFO watermark value in words. The #kLPI2C_MasterRxReadyFlag flag is set whenever |
| AnnaBridge | 161:aa5281ff4a02 | 681 | * the number of words in the receive FIFO is greater than @a rxWords. Writing a value equal or greater |
| AnnaBridge | 161:aa5281ff4a02 | 682 | * than the FIFO size is truncated. |
| AnnaBridge | 161:aa5281ff4a02 | 683 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 684 | static inline void LPI2C_MasterSetWatermarks(LPI2C_Type *base, size_t txWords, size_t rxWords) |
| AnnaBridge | 161:aa5281ff4a02 | 685 | { |
| AnnaBridge | 161:aa5281ff4a02 | 686 | base->MFCR = LPI2C_MFCR_TXWATER(txWords) | LPI2C_MFCR_RXWATER(rxWords); |
| AnnaBridge | 161:aa5281ff4a02 | 687 | } |
| AnnaBridge | 161:aa5281ff4a02 | 688 | |
| AnnaBridge | 161:aa5281ff4a02 | 689 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 690 | * @brief Gets the current number of words in the LPI2C master FIFOs. |
| AnnaBridge | 161:aa5281ff4a02 | 691 | * |
| AnnaBridge | 161:aa5281ff4a02 | 692 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 693 | * @param[out] txCount Pointer through which the current number of words in the transmit FIFO is returned. |
| AnnaBridge | 161:aa5281ff4a02 | 694 | * Pass NULL if this value is not required. |
| AnnaBridge | 161:aa5281ff4a02 | 695 | * @param[out] rxCount Pointer through which the current number of words in the receive FIFO is returned. |
| AnnaBridge | 161:aa5281ff4a02 | 696 | * Pass NULL if this value is not required. |
| AnnaBridge | 161:aa5281ff4a02 | 697 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 698 | static inline void LPI2C_MasterGetFifoCounts(LPI2C_Type *base, size_t *rxCount, size_t *txCount) |
| AnnaBridge | 161:aa5281ff4a02 | 699 | { |
| AnnaBridge | 161:aa5281ff4a02 | 700 | if (txCount) |
| AnnaBridge | 161:aa5281ff4a02 | 701 | { |
| AnnaBridge | 161:aa5281ff4a02 | 702 | *txCount = (base->MFSR & LPI2C_MFSR_TXCOUNT_MASK) >> LPI2C_MFSR_TXCOUNT_SHIFT; |
| AnnaBridge | 161:aa5281ff4a02 | 703 | } |
| AnnaBridge | 161:aa5281ff4a02 | 704 | if (rxCount) |
| AnnaBridge | 161:aa5281ff4a02 | 705 | { |
| AnnaBridge | 161:aa5281ff4a02 | 706 | *rxCount = (base->MFSR & LPI2C_MFSR_RXCOUNT_MASK) >> LPI2C_MFSR_RXCOUNT_SHIFT; |
| AnnaBridge | 161:aa5281ff4a02 | 707 | } |
| AnnaBridge | 161:aa5281ff4a02 | 708 | } |
| AnnaBridge | 161:aa5281ff4a02 | 709 | |
| AnnaBridge | 161:aa5281ff4a02 | 710 | /*@}*/ |
| AnnaBridge | 161:aa5281ff4a02 | 711 | |
| AnnaBridge | 161:aa5281ff4a02 | 712 | /*! @name Bus operations */ |
| AnnaBridge | 161:aa5281ff4a02 | 713 | /*@{*/ |
| AnnaBridge | 161:aa5281ff4a02 | 714 | |
| AnnaBridge | 161:aa5281ff4a02 | 715 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 716 | * @brief Sets the I2C bus frequency for master transactions. |
| AnnaBridge | 161:aa5281ff4a02 | 717 | * |
| AnnaBridge | 161:aa5281ff4a02 | 718 | * The LPI2C master is automatically disabled and re-enabled as necessary to configure the baud |
| AnnaBridge | 161:aa5281ff4a02 | 719 | * rate. Do not call this function during a transfer, or the transfer is aborted. |
| AnnaBridge | 161:aa5281ff4a02 | 720 | * |
| AnnaBridge | 170:e95d10626187 | 721 | * @note Please note that the second parameter is the clock frequency of LPI2C module, the third |
| AnnaBridge | 170:e95d10626187 | 722 | * parameter means user configured bus baudrate, this implementation is different from other I2C drivers |
| AnnaBridge | 170:e95d10626187 | 723 | * which use baudrate configuration as second parameter and source clock frequency as third parameter. |
| AnnaBridge | 170:e95d10626187 | 724 | * |
| AnnaBridge | 161:aa5281ff4a02 | 725 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 726 | * @param sourceClock_Hz LPI2C functional clock frequency in Hertz. |
| AnnaBridge | 161:aa5281ff4a02 | 727 | * @param baudRate_Hz Requested bus frequency in Hertz. |
| AnnaBridge | 161:aa5281ff4a02 | 728 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 729 | void LPI2C_MasterSetBaudRate(LPI2C_Type *base, uint32_t sourceClock_Hz, uint32_t baudRate_Hz); |
| AnnaBridge | 161:aa5281ff4a02 | 730 | |
| AnnaBridge | 161:aa5281ff4a02 | 731 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 732 | * @brief Returns whether the bus is idle. |
| AnnaBridge | 161:aa5281ff4a02 | 733 | * |
| AnnaBridge | 161:aa5281ff4a02 | 734 | * Requires the master mode to be enabled. |
| AnnaBridge | 161:aa5281ff4a02 | 735 | * |
| AnnaBridge | 161:aa5281ff4a02 | 736 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 737 | * @retval true Bus is busy. |
| AnnaBridge | 161:aa5281ff4a02 | 738 | * @retval false Bus is idle. |
| AnnaBridge | 161:aa5281ff4a02 | 739 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 740 | static inline bool LPI2C_MasterGetBusIdleState(LPI2C_Type *base) |
| AnnaBridge | 161:aa5281ff4a02 | 741 | { |
| AnnaBridge | 161:aa5281ff4a02 | 742 | return (base->MSR & LPI2C_MSR_BBF_MASK) >> LPI2C_MSR_BBF_SHIFT; |
| AnnaBridge | 161:aa5281ff4a02 | 743 | } |
| AnnaBridge | 161:aa5281ff4a02 | 744 | |
| AnnaBridge | 161:aa5281ff4a02 | 745 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 746 | * @brief Sends a START signal and slave address on the I2C bus. |
| AnnaBridge | 161:aa5281ff4a02 | 747 | * |
| AnnaBridge | 161:aa5281ff4a02 | 748 | * This function is used to initiate a new master mode transfer. First, the bus state is checked to ensure |
| AnnaBridge | 161:aa5281ff4a02 | 749 | * that another master is not occupying the bus. Then a START signal is transmitted, followed by the |
| AnnaBridge | 161:aa5281ff4a02 | 750 | * 7-bit address specified in the @a address parameter. Note that this function does not actually wait |
| AnnaBridge | 161:aa5281ff4a02 | 751 | * until the START and address are successfully sent on the bus before returning. |
| AnnaBridge | 161:aa5281ff4a02 | 752 | * |
| AnnaBridge | 161:aa5281ff4a02 | 753 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 754 | * @param address 7-bit slave device address, in bits [6:0]. |
| AnnaBridge | 161:aa5281ff4a02 | 755 | * @param dir Master transfer direction, either #kLPI2C_Read or #kLPI2C_Write. This parameter is used to set |
| AnnaBridge | 161:aa5281ff4a02 | 756 | * the R/w bit (bit 0) in the transmitted slave address. |
| AnnaBridge | 161:aa5281ff4a02 | 757 | * @retval #kStatus_Success START signal and address were successfully enqueued in the transmit FIFO. |
| AnnaBridge | 161:aa5281ff4a02 | 758 | * @retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. |
| AnnaBridge | 161:aa5281ff4a02 | 759 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 760 | status_t LPI2C_MasterStart(LPI2C_Type *base, uint8_t address, lpi2c_direction_t dir); |
| AnnaBridge | 161:aa5281ff4a02 | 761 | |
| AnnaBridge | 161:aa5281ff4a02 | 762 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 763 | * @brief Sends a repeated START signal and slave address on the I2C bus. |
| AnnaBridge | 161:aa5281ff4a02 | 764 | * |
| AnnaBridge | 161:aa5281ff4a02 | 765 | * This function is used to send a Repeated START signal when a transfer is already in progress. Like |
| AnnaBridge | 161:aa5281ff4a02 | 766 | * LPI2C_MasterStart(), it also sends the specified 7-bit address. |
| AnnaBridge | 161:aa5281ff4a02 | 767 | * |
| AnnaBridge | 161:aa5281ff4a02 | 768 | * @note This function exists primarily to maintain compatible APIs between LPI2C and I2C drivers, |
| AnnaBridge | 161:aa5281ff4a02 | 769 | * as well as to better document the intent of code that uses these APIs. |
| AnnaBridge | 161:aa5281ff4a02 | 770 | * |
| AnnaBridge | 161:aa5281ff4a02 | 771 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 772 | * @param address 7-bit slave device address, in bits [6:0]. |
| AnnaBridge | 161:aa5281ff4a02 | 773 | * @param dir Master transfer direction, either #kLPI2C_Read or #kLPI2C_Write. This parameter is used to set |
| AnnaBridge | 161:aa5281ff4a02 | 774 | * the R/w bit (bit 0) in the transmitted slave address. |
| AnnaBridge | 161:aa5281ff4a02 | 775 | * @retval #kStatus_Success Repeated START signal and address were successfully enqueued in the transmit FIFO. |
| AnnaBridge | 161:aa5281ff4a02 | 776 | * @retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. |
| AnnaBridge | 161:aa5281ff4a02 | 777 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 778 | static inline status_t LPI2C_MasterRepeatedStart(LPI2C_Type *base, uint8_t address, lpi2c_direction_t dir) |
| AnnaBridge | 161:aa5281ff4a02 | 779 | { |
| AnnaBridge | 161:aa5281ff4a02 | 780 | return LPI2C_MasterStart(base, address, dir); |
| AnnaBridge | 161:aa5281ff4a02 | 781 | } |
| AnnaBridge | 161:aa5281ff4a02 | 782 | |
| AnnaBridge | 161:aa5281ff4a02 | 783 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 784 | * @brief Performs a polling send transfer on the I2C bus. |
| AnnaBridge | 161:aa5281ff4a02 | 785 | * |
| AnnaBridge | 161:aa5281ff4a02 | 786 | * Sends up to @a txSize number of bytes to the previously addressed slave device. The slave may |
| AnnaBridge | 161:aa5281ff4a02 | 787 | * reply with a NAK to any byte in order to terminate the transfer early. If this happens, this |
| AnnaBridge | 161:aa5281ff4a02 | 788 | * function returns #kStatus_LPI2C_Nak. |
| AnnaBridge | 161:aa5281ff4a02 | 789 | * |
| AnnaBridge | 161:aa5281ff4a02 | 790 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 791 | * @param txBuff The pointer to the data to be transferred. |
| AnnaBridge | 161:aa5281ff4a02 | 792 | * @param txSize The length in bytes of the data to be transferred. |
| AnnaBridge | 161:aa5281ff4a02 | 793 | * @retval #kStatus_Success Data was sent successfully. |
| AnnaBridge | 161:aa5281ff4a02 | 794 | * @retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. |
| AnnaBridge | 161:aa5281ff4a02 | 795 | * @retval #kStatus_LPI2C_Nak The slave device sent a NAK in response to a byte. |
| AnnaBridge | 161:aa5281ff4a02 | 796 | * @retval #kStatus_LPI2C_FifoError FIFO under run or over run. |
| AnnaBridge | 161:aa5281ff4a02 | 797 | * @retval #kStatus_LPI2C_ArbitrationLost Arbitration lost error. |
| AnnaBridge | 161:aa5281ff4a02 | 798 | * @retval #kStatus_LPI2C_PinLowTimeout SCL or SDA were held low longer than the timeout. |
| AnnaBridge | 161:aa5281ff4a02 | 799 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 800 | status_t LPI2C_MasterSend(LPI2C_Type *base, const void *txBuff, size_t txSize); |
| AnnaBridge | 161:aa5281ff4a02 | 801 | |
| AnnaBridge | 161:aa5281ff4a02 | 802 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 803 | * @brief Performs a polling receive transfer on the I2C bus. |
| AnnaBridge | 161:aa5281ff4a02 | 804 | * |
| AnnaBridge | 161:aa5281ff4a02 | 805 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 806 | * @param rxBuff The pointer to the data to be transferred. |
| AnnaBridge | 161:aa5281ff4a02 | 807 | * @param rxSize The length in bytes of the data to be transferred. |
| AnnaBridge | 161:aa5281ff4a02 | 808 | * @retval #kStatus_Success Data was received successfully. |
| AnnaBridge | 161:aa5281ff4a02 | 809 | * @retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. |
| AnnaBridge | 161:aa5281ff4a02 | 810 | * @retval #kStatus_LPI2C_Nak The slave device sent a NAK in response to a byte. |
| AnnaBridge | 161:aa5281ff4a02 | 811 | * @retval #kStatus_LPI2C_FifoError FIFO under run or overrun. |
| AnnaBridge | 161:aa5281ff4a02 | 812 | * @retval #kStatus_LPI2C_ArbitrationLost Arbitration lost error. |
| AnnaBridge | 161:aa5281ff4a02 | 813 | * @retval #kStatus_LPI2C_PinLowTimeout SCL or SDA were held low longer than the timeout. |
| AnnaBridge | 161:aa5281ff4a02 | 814 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 815 | status_t LPI2C_MasterReceive(LPI2C_Type *base, void *rxBuff, size_t rxSize); |
| AnnaBridge | 161:aa5281ff4a02 | 816 | |
| AnnaBridge | 161:aa5281ff4a02 | 817 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 818 | * @brief Sends a STOP signal on the I2C bus. |
| AnnaBridge | 161:aa5281ff4a02 | 819 | * |
| AnnaBridge | 161:aa5281ff4a02 | 820 | * This function does not return until the STOP signal is seen on the bus, or an error occurs. |
| AnnaBridge | 161:aa5281ff4a02 | 821 | * |
| AnnaBridge | 161:aa5281ff4a02 | 822 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 823 | * @retval #kStatus_Success The STOP signal was successfully sent on the bus and the transaction terminated. |
| AnnaBridge | 161:aa5281ff4a02 | 824 | * @retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. |
| AnnaBridge | 161:aa5281ff4a02 | 825 | * @retval #kStatus_LPI2C_Nak The slave device sent a NAK in response to a byte. |
| AnnaBridge | 161:aa5281ff4a02 | 826 | * @retval #kStatus_LPI2C_FifoError FIFO under run or overrun. |
| AnnaBridge | 161:aa5281ff4a02 | 827 | * @retval #kStatus_LPI2C_ArbitrationLost Arbitration lost error. |
| AnnaBridge | 161:aa5281ff4a02 | 828 | * @retval #kStatus_LPI2C_PinLowTimeout SCL or SDA were held low longer than the timeout. |
| AnnaBridge | 161:aa5281ff4a02 | 829 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 830 | status_t LPI2C_MasterStop(LPI2C_Type *base); |
| AnnaBridge | 161:aa5281ff4a02 | 831 | |
| AnnaBridge | 161:aa5281ff4a02 | 832 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 833 | * @brief Performs a master polling transfer on the I2C bus. |
| AnnaBridge | 161:aa5281ff4a02 | 834 | * |
| AnnaBridge | 161:aa5281ff4a02 | 835 | * @note The API does not return until the transfer succeeds or fails due |
| AnnaBridge | 161:aa5281ff4a02 | 836 | * to error happens during transfer. |
| AnnaBridge | 161:aa5281ff4a02 | 837 | * |
| AnnaBridge | 161:aa5281ff4a02 | 838 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 839 | * @param transfer Pointer to the transfer structure. |
| AnnaBridge | 161:aa5281ff4a02 | 840 | * @retval #kStatus_Success Data was received successfully. |
| AnnaBridge | 161:aa5281ff4a02 | 841 | * @retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. |
| AnnaBridge | 161:aa5281ff4a02 | 842 | * @retval #kStatus_LPI2C_Nak The slave device sent a NAK in response to a byte. |
| AnnaBridge | 161:aa5281ff4a02 | 843 | * @retval #kStatus_LPI2C_FifoError FIFO under run or overrun. |
| AnnaBridge | 161:aa5281ff4a02 | 844 | * @retval #kStatus_LPI2C_ArbitrationLost Arbitration lost error. |
| AnnaBridge | 161:aa5281ff4a02 | 845 | * @retval #kStatus_LPI2C_PinLowTimeout SCL or SDA were held low longer than the timeout. |
| AnnaBridge | 161:aa5281ff4a02 | 846 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 847 | status_t LPI2C_MasterTransferBlocking(LPI2C_Type *base, lpi2c_master_transfer_t *transfer); |
| AnnaBridge | 161:aa5281ff4a02 | 848 | |
| AnnaBridge | 161:aa5281ff4a02 | 849 | /*@}*/ |
| AnnaBridge | 161:aa5281ff4a02 | 850 | |
| AnnaBridge | 161:aa5281ff4a02 | 851 | /*! @name Non-blocking */ |
| AnnaBridge | 161:aa5281ff4a02 | 852 | /*@{*/ |
| AnnaBridge | 161:aa5281ff4a02 | 853 | |
| AnnaBridge | 161:aa5281ff4a02 | 854 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 855 | * @brief Creates a new handle for the LPI2C master non-blocking APIs. |
| AnnaBridge | 161:aa5281ff4a02 | 856 | * |
| AnnaBridge | 161:aa5281ff4a02 | 857 | * The creation of a handle is for use with the non-blocking APIs. Once a handle |
| AnnaBridge | 161:aa5281ff4a02 | 858 | * is created, there is not a corresponding destroy handle. If the user wants to |
| AnnaBridge | 161:aa5281ff4a02 | 859 | * terminate a transfer, the LPI2C_MasterTransferAbort() API shall be called. |
| AnnaBridge | 161:aa5281ff4a02 | 860 | * |
| AnnaBridge | 170:e95d10626187 | 861 | * |
| AnnaBridge | 170:e95d10626187 | 862 | * @note The function also enables the NVIC IRQ for the input LPI2C. Need to notice |
| AnnaBridge | 170:e95d10626187 | 863 | * that on some SoCs the LPI2C IRQ is connected to INTMUX, in this case user needs to |
| AnnaBridge | 170:e95d10626187 | 864 | * enable the associated INTMUX IRQ in application. |
| AnnaBridge | 170:e95d10626187 | 865 | * |
| AnnaBridge | 161:aa5281ff4a02 | 866 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 867 | * @param[out] handle Pointer to the LPI2C master driver handle. |
| AnnaBridge | 161:aa5281ff4a02 | 868 | * @param callback User provided pointer to the asynchronous callback function. |
| AnnaBridge | 161:aa5281ff4a02 | 869 | * @param userData User provided pointer to the application callback data. |
| AnnaBridge | 161:aa5281ff4a02 | 870 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 871 | void LPI2C_MasterTransferCreateHandle(LPI2C_Type *base, |
| AnnaBridge | 161:aa5281ff4a02 | 872 | lpi2c_master_handle_t *handle, |
| AnnaBridge | 161:aa5281ff4a02 | 873 | lpi2c_master_transfer_callback_t callback, |
| AnnaBridge | 161:aa5281ff4a02 | 874 | void *userData); |
| AnnaBridge | 161:aa5281ff4a02 | 875 | |
| AnnaBridge | 161:aa5281ff4a02 | 876 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 877 | * @brief Performs a non-blocking transaction on the I2C bus. |
| AnnaBridge | 161:aa5281ff4a02 | 878 | * |
| AnnaBridge | 161:aa5281ff4a02 | 879 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 880 | * @param handle Pointer to the LPI2C master driver handle. |
| AnnaBridge | 161:aa5281ff4a02 | 881 | * @param transfer The pointer to the transfer descriptor. |
| AnnaBridge | 161:aa5281ff4a02 | 882 | * @retval #kStatus_Success The transaction was started successfully. |
| AnnaBridge | 161:aa5281ff4a02 | 883 | * @retval #kStatus_LPI2C_Busy Either another master is currently utilizing the bus, or a non-blocking |
| AnnaBridge | 161:aa5281ff4a02 | 884 | * transaction is already in progress. |
| AnnaBridge | 161:aa5281ff4a02 | 885 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 886 | status_t LPI2C_MasterTransferNonBlocking(LPI2C_Type *base, |
| AnnaBridge | 161:aa5281ff4a02 | 887 | lpi2c_master_handle_t *handle, |
| AnnaBridge | 161:aa5281ff4a02 | 888 | lpi2c_master_transfer_t *transfer); |
| AnnaBridge | 161:aa5281ff4a02 | 889 | |
| AnnaBridge | 161:aa5281ff4a02 | 890 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 891 | * @brief Returns number of bytes transferred so far. |
| AnnaBridge | 161:aa5281ff4a02 | 892 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 893 | * @param handle Pointer to the LPI2C master driver handle. |
| AnnaBridge | 161:aa5281ff4a02 | 894 | * @param[out] count Number of bytes transferred so far by the non-blocking transaction. |
| AnnaBridge | 161:aa5281ff4a02 | 895 | * @retval #kStatus_Success |
| AnnaBridge | 161:aa5281ff4a02 | 896 | * @retval #kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. |
| AnnaBridge | 161:aa5281ff4a02 | 897 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 898 | status_t LPI2C_MasterTransferGetCount(LPI2C_Type *base, lpi2c_master_handle_t *handle, size_t *count); |
| AnnaBridge | 161:aa5281ff4a02 | 899 | |
| AnnaBridge | 161:aa5281ff4a02 | 900 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 901 | * @brief Terminates a non-blocking LPI2C master transmission early. |
| AnnaBridge | 161:aa5281ff4a02 | 902 | * |
| AnnaBridge | 161:aa5281ff4a02 | 903 | * @note It is not safe to call this function from an IRQ handler that has a higher priority than the |
| AnnaBridge | 161:aa5281ff4a02 | 904 | * LPI2C peripheral's IRQ priority. |
| AnnaBridge | 161:aa5281ff4a02 | 905 | * |
| AnnaBridge | 161:aa5281ff4a02 | 906 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 907 | * @param handle Pointer to the LPI2C master driver handle. |
| AnnaBridge | 161:aa5281ff4a02 | 908 | * @retval #kStatus_Success A transaction was successfully aborted. |
| AnnaBridge | 161:aa5281ff4a02 | 909 | * @retval #kStatus_LPI2C_Idle There is not a non-blocking transaction currently in progress. |
| AnnaBridge | 161:aa5281ff4a02 | 910 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 911 | void LPI2C_MasterTransferAbort(LPI2C_Type *base, lpi2c_master_handle_t *handle); |
| AnnaBridge | 161:aa5281ff4a02 | 912 | |
| AnnaBridge | 161:aa5281ff4a02 | 913 | /*@}*/ |
| AnnaBridge | 161:aa5281ff4a02 | 914 | |
| AnnaBridge | 161:aa5281ff4a02 | 915 | /*! @name IRQ handler */ |
| AnnaBridge | 161:aa5281ff4a02 | 916 | /*@{*/ |
| AnnaBridge | 161:aa5281ff4a02 | 917 | |
| AnnaBridge | 161:aa5281ff4a02 | 918 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 919 | * @brief Reusable routine to handle master interrupts. |
| AnnaBridge | 161:aa5281ff4a02 | 920 | * @note This function does not need to be called unless you are reimplementing the |
| AnnaBridge | 161:aa5281ff4a02 | 921 | * nonblocking API's interrupt handler routines to add special functionality. |
| AnnaBridge | 161:aa5281ff4a02 | 922 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 923 | * @param handle Pointer to the LPI2C master driver handle. |
| AnnaBridge | 161:aa5281ff4a02 | 924 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 925 | void LPI2C_MasterTransferHandleIRQ(LPI2C_Type *base, lpi2c_master_handle_t *handle); |
| AnnaBridge | 161:aa5281ff4a02 | 926 | |
| AnnaBridge | 161:aa5281ff4a02 | 927 | /*@}*/ |
| AnnaBridge | 161:aa5281ff4a02 | 928 | |
| AnnaBridge | 161:aa5281ff4a02 | 929 | /*! @} */ |
| AnnaBridge | 161:aa5281ff4a02 | 930 | |
| AnnaBridge | 161:aa5281ff4a02 | 931 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 932 | * @addtogroup lpi2c_slave_driver |
| AnnaBridge | 161:aa5281ff4a02 | 933 | * @{ |
| AnnaBridge | 161:aa5281ff4a02 | 934 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 935 | |
| AnnaBridge | 161:aa5281ff4a02 | 936 | /*! @name Slave initialization and deinitialization */ |
| AnnaBridge | 161:aa5281ff4a02 | 937 | /*@{*/ |
| AnnaBridge | 161:aa5281ff4a02 | 938 | |
| AnnaBridge | 161:aa5281ff4a02 | 939 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 940 | * @brief Provides a default configuration for the LPI2C slave peripheral. |
| AnnaBridge | 161:aa5281ff4a02 | 941 | * |
| AnnaBridge | 161:aa5281ff4a02 | 942 | * This function provides the following default configuration for the LPI2C slave peripheral: |
| AnnaBridge | 161:aa5281ff4a02 | 943 | * @code |
| AnnaBridge | 161:aa5281ff4a02 | 944 | * slaveConfig->enableSlave = true; |
| AnnaBridge | 161:aa5281ff4a02 | 945 | * slaveConfig->address0 = 0U; |
| AnnaBridge | 161:aa5281ff4a02 | 946 | * slaveConfig->address1 = 0U; |
| AnnaBridge | 161:aa5281ff4a02 | 947 | * slaveConfig->addressMatchMode = kLPI2C_MatchAddress0; |
| AnnaBridge | 161:aa5281ff4a02 | 948 | * slaveConfig->filterDozeEnable = true; |
| AnnaBridge | 161:aa5281ff4a02 | 949 | * slaveConfig->filterEnable = true; |
| AnnaBridge | 161:aa5281ff4a02 | 950 | * slaveConfig->enableGeneralCall = false; |
| AnnaBridge | 161:aa5281ff4a02 | 951 | * slaveConfig->sclStall.enableAck = false; |
| AnnaBridge | 161:aa5281ff4a02 | 952 | * slaveConfig->sclStall.enableTx = true; |
| AnnaBridge | 161:aa5281ff4a02 | 953 | * slaveConfig->sclStall.enableRx = true; |
| AnnaBridge | 161:aa5281ff4a02 | 954 | * slaveConfig->sclStall.enableAddress = true; |
| AnnaBridge | 161:aa5281ff4a02 | 955 | * slaveConfig->ignoreAck = false; |
| AnnaBridge | 161:aa5281ff4a02 | 956 | * slaveConfig->enableReceivedAddressRead = false; |
| AnnaBridge | 170:e95d10626187 | 957 | * slaveConfig->sdaGlitchFilterWidth_ns = 0; |
| AnnaBridge | 161:aa5281ff4a02 | 958 | * slaveConfig->sclGlitchFilterWidth_ns = 0; |
| AnnaBridge | 161:aa5281ff4a02 | 959 | * slaveConfig->dataValidDelay_ns = 0; |
| AnnaBridge | 161:aa5281ff4a02 | 960 | * slaveConfig->clockHoldTime_ns = 0; |
| AnnaBridge | 161:aa5281ff4a02 | 961 | * @endcode |
| AnnaBridge | 161:aa5281ff4a02 | 962 | * |
| AnnaBridge | 161:aa5281ff4a02 | 963 | * After calling this function, override any settings to customize the configuration, |
| AnnaBridge | 161:aa5281ff4a02 | 964 | * prior to initializing the master driver with LPI2C_SlaveInit(). Be sure to override at least the @a |
| AnnaBridge | 161:aa5281ff4a02 | 965 | * address0 member of the configuration structure with the desired slave address. |
| AnnaBridge | 161:aa5281ff4a02 | 966 | * |
| AnnaBridge | 161:aa5281ff4a02 | 967 | * @param[out] slaveConfig User provided configuration structure that is set to default values. Refer to |
| AnnaBridge | 161:aa5281ff4a02 | 968 | * #lpi2c_slave_config_t. |
| AnnaBridge | 161:aa5281ff4a02 | 969 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 970 | void LPI2C_SlaveGetDefaultConfig(lpi2c_slave_config_t *slaveConfig); |
| AnnaBridge | 161:aa5281ff4a02 | 971 | |
| AnnaBridge | 161:aa5281ff4a02 | 972 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 973 | * @brief Initializes the LPI2C slave peripheral. |
| AnnaBridge | 161:aa5281ff4a02 | 974 | * |
| AnnaBridge | 161:aa5281ff4a02 | 975 | * This function enables the peripheral clock and initializes the LPI2C slave peripheral as described by the user |
| AnnaBridge | 161:aa5281ff4a02 | 976 | * provided configuration. |
| AnnaBridge | 161:aa5281ff4a02 | 977 | * |
| AnnaBridge | 161:aa5281ff4a02 | 978 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 979 | * @param slaveConfig User provided peripheral configuration. Use LPI2C_SlaveGetDefaultConfig() to get a set of defaults |
| AnnaBridge | 161:aa5281ff4a02 | 980 | * that you can override. |
| AnnaBridge | 161:aa5281ff4a02 | 981 | * @param sourceClock_Hz Frequency in Hertz of the LPI2C functional clock. Used to calculate the filter widths, |
| AnnaBridge | 161:aa5281ff4a02 | 982 | * data valid delay, and clock hold time. |
| AnnaBridge | 161:aa5281ff4a02 | 983 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 984 | void LPI2C_SlaveInit(LPI2C_Type *base, const lpi2c_slave_config_t *slaveConfig, uint32_t sourceClock_Hz); |
| AnnaBridge | 161:aa5281ff4a02 | 985 | |
| AnnaBridge | 161:aa5281ff4a02 | 986 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 987 | * @brief Deinitializes the LPI2C slave peripheral. |
| AnnaBridge | 161:aa5281ff4a02 | 988 | * |
| AnnaBridge | 161:aa5281ff4a02 | 989 | * This function disables the LPI2C slave peripheral and gates the clock. It also performs a software |
| AnnaBridge | 161:aa5281ff4a02 | 990 | * reset to restore the peripheral to reset conditions. |
| AnnaBridge | 161:aa5281ff4a02 | 991 | * |
| AnnaBridge | 161:aa5281ff4a02 | 992 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 993 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 994 | void LPI2C_SlaveDeinit(LPI2C_Type *base); |
| AnnaBridge | 161:aa5281ff4a02 | 995 | |
| AnnaBridge | 161:aa5281ff4a02 | 996 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 997 | * @brief Performs a software reset of the LPI2C slave peripheral. |
| AnnaBridge | 161:aa5281ff4a02 | 998 | * |
| AnnaBridge | 161:aa5281ff4a02 | 999 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 1000 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 1001 | static inline void LPI2C_SlaveReset(LPI2C_Type *base) |
| AnnaBridge | 161:aa5281ff4a02 | 1002 | { |
| AnnaBridge | 161:aa5281ff4a02 | 1003 | base->SCR = LPI2C_SCR_RST_MASK; |
| AnnaBridge | 161:aa5281ff4a02 | 1004 | base->SCR = 0; |
| AnnaBridge | 161:aa5281ff4a02 | 1005 | } |
| AnnaBridge | 161:aa5281ff4a02 | 1006 | |
| AnnaBridge | 161:aa5281ff4a02 | 1007 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 1008 | * @brief Enables or disables the LPI2C module as slave. |
| AnnaBridge | 161:aa5281ff4a02 | 1009 | * |
| AnnaBridge | 161:aa5281ff4a02 | 1010 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 1011 | * @param enable Pass true to enable or false to disable the specified LPI2C as slave. |
| AnnaBridge | 161:aa5281ff4a02 | 1012 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 1013 | static inline void LPI2C_SlaveEnable(LPI2C_Type *base, bool enable) |
| AnnaBridge | 161:aa5281ff4a02 | 1014 | { |
| AnnaBridge | 161:aa5281ff4a02 | 1015 | base->SCR = (base->SCR & ~LPI2C_SCR_SEN_MASK) | LPI2C_SCR_SEN(enable); |
| AnnaBridge | 161:aa5281ff4a02 | 1016 | } |
| AnnaBridge | 161:aa5281ff4a02 | 1017 | |
| AnnaBridge | 161:aa5281ff4a02 | 1018 | /*@}*/ |
| AnnaBridge | 161:aa5281ff4a02 | 1019 | |
| AnnaBridge | 161:aa5281ff4a02 | 1020 | /*! @name Slave status */ |
| AnnaBridge | 161:aa5281ff4a02 | 1021 | /*@{*/ |
| AnnaBridge | 161:aa5281ff4a02 | 1022 | |
| AnnaBridge | 161:aa5281ff4a02 | 1023 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 1024 | * @brief Gets the LPI2C slave status flags. |
| AnnaBridge | 161:aa5281ff4a02 | 1025 | * |
| AnnaBridge | 161:aa5281ff4a02 | 1026 | * A bit mask with the state of all LPI2C slave status flags is returned. For each flag, the corresponding bit |
| AnnaBridge | 161:aa5281ff4a02 | 1027 | * in the return value is set if the flag is asserted. |
| AnnaBridge | 161:aa5281ff4a02 | 1028 | * |
| AnnaBridge | 161:aa5281ff4a02 | 1029 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 1030 | * @return State of the status flags: |
| AnnaBridge | 161:aa5281ff4a02 | 1031 | * - 1: related status flag is set. |
| AnnaBridge | 161:aa5281ff4a02 | 1032 | * - 0: related status flag is not set. |
| AnnaBridge | 161:aa5281ff4a02 | 1033 | * @see _lpi2c_slave_flags |
| AnnaBridge | 161:aa5281ff4a02 | 1034 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 1035 | static inline uint32_t LPI2C_SlaveGetStatusFlags(LPI2C_Type *base) |
| AnnaBridge | 161:aa5281ff4a02 | 1036 | { |
| AnnaBridge | 161:aa5281ff4a02 | 1037 | return base->SSR; |
| AnnaBridge | 161:aa5281ff4a02 | 1038 | } |
| AnnaBridge | 161:aa5281ff4a02 | 1039 | |
| AnnaBridge | 161:aa5281ff4a02 | 1040 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 1041 | * @brief Clears the LPI2C status flag state. |
| AnnaBridge | 161:aa5281ff4a02 | 1042 | * |
| AnnaBridge | 161:aa5281ff4a02 | 1043 | * The following status register flags can be cleared: |
| AnnaBridge | 161:aa5281ff4a02 | 1044 | * - #kLPI2C_SlaveRepeatedStartDetectFlag |
| AnnaBridge | 161:aa5281ff4a02 | 1045 | * - #kLPI2C_SlaveStopDetectFlag |
| AnnaBridge | 161:aa5281ff4a02 | 1046 | * - #kLPI2C_SlaveBitErrFlag |
| AnnaBridge | 161:aa5281ff4a02 | 1047 | * - #kLPI2C_SlaveFifoErrFlag |
| AnnaBridge | 161:aa5281ff4a02 | 1048 | * |
| AnnaBridge | 161:aa5281ff4a02 | 1049 | * Attempts to clear other flags has no effect. |
| AnnaBridge | 161:aa5281ff4a02 | 1050 | * |
| AnnaBridge | 161:aa5281ff4a02 | 1051 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 1052 | * @param statusMask A bitmask of status flags that are to be cleared. The mask is composed of |
| AnnaBridge | 161:aa5281ff4a02 | 1053 | * #_lpi2c_slave_flags enumerators OR'd together. You may pass the result of a previous call to |
| AnnaBridge | 161:aa5281ff4a02 | 1054 | * LPI2C_SlaveGetStatusFlags(). |
| AnnaBridge | 161:aa5281ff4a02 | 1055 | * @see _lpi2c_slave_flags. |
| AnnaBridge | 161:aa5281ff4a02 | 1056 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 1057 | static inline void LPI2C_SlaveClearStatusFlags(LPI2C_Type *base, uint32_t statusMask) |
| AnnaBridge | 161:aa5281ff4a02 | 1058 | { |
| AnnaBridge | 161:aa5281ff4a02 | 1059 | base->SSR = statusMask; |
| AnnaBridge | 161:aa5281ff4a02 | 1060 | } |
| AnnaBridge | 161:aa5281ff4a02 | 1061 | |
| AnnaBridge | 161:aa5281ff4a02 | 1062 | /*@}*/ |
| AnnaBridge | 161:aa5281ff4a02 | 1063 | |
| AnnaBridge | 161:aa5281ff4a02 | 1064 | /*! @name Slave interrupts */ |
| AnnaBridge | 161:aa5281ff4a02 | 1065 | /*@{*/ |
| AnnaBridge | 161:aa5281ff4a02 | 1066 | |
| AnnaBridge | 161:aa5281ff4a02 | 1067 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 1068 | * @brief Enables the LPI2C slave interrupt requests. |
| AnnaBridge | 161:aa5281ff4a02 | 1069 | * |
| AnnaBridge | 161:aa5281ff4a02 | 1070 | * All flags except #kLPI2C_SlaveBusyFlag and #kLPI2C_SlaveBusBusyFlag can be enabled as |
| AnnaBridge | 161:aa5281ff4a02 | 1071 | * interrupts. |
| AnnaBridge | 161:aa5281ff4a02 | 1072 | * |
| AnnaBridge | 161:aa5281ff4a02 | 1073 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 1074 | * @param interruptMask Bit mask of interrupts to enable. See #_lpi2c_slave_flags for the set |
| AnnaBridge | 161:aa5281ff4a02 | 1075 | * of constants that should be OR'd together to form the bit mask. |
| AnnaBridge | 161:aa5281ff4a02 | 1076 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 1077 | static inline void LPI2C_SlaveEnableInterrupts(LPI2C_Type *base, uint32_t interruptMask) |
| AnnaBridge | 161:aa5281ff4a02 | 1078 | { |
| AnnaBridge | 161:aa5281ff4a02 | 1079 | base->SIER |= interruptMask; |
| AnnaBridge | 161:aa5281ff4a02 | 1080 | } |
| AnnaBridge | 161:aa5281ff4a02 | 1081 | |
| AnnaBridge | 161:aa5281ff4a02 | 1082 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 1083 | * @brief Disables the LPI2C slave interrupt requests. |
| AnnaBridge | 161:aa5281ff4a02 | 1084 | * |
| AnnaBridge | 161:aa5281ff4a02 | 1085 | * All flags except #kLPI2C_SlaveBusyFlag and #kLPI2C_SlaveBusBusyFlag can be enabled as |
| AnnaBridge | 161:aa5281ff4a02 | 1086 | * interrupts. |
| AnnaBridge | 161:aa5281ff4a02 | 1087 | * |
| AnnaBridge | 161:aa5281ff4a02 | 1088 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 1089 | * @param interruptMask Bit mask of interrupts to disable. See #_lpi2c_slave_flags for the set |
| AnnaBridge | 161:aa5281ff4a02 | 1090 | * of constants that should be OR'd together to form the bit mask. |
| AnnaBridge | 161:aa5281ff4a02 | 1091 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 1092 | static inline void LPI2C_SlaveDisableInterrupts(LPI2C_Type *base, uint32_t interruptMask) |
| AnnaBridge | 161:aa5281ff4a02 | 1093 | { |
| AnnaBridge | 161:aa5281ff4a02 | 1094 | base->SIER &= ~interruptMask; |
| AnnaBridge | 161:aa5281ff4a02 | 1095 | } |
| AnnaBridge | 161:aa5281ff4a02 | 1096 | |
| AnnaBridge | 161:aa5281ff4a02 | 1097 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 1098 | * @brief Returns the set of currently enabled LPI2C slave interrupt requests. |
| AnnaBridge | 161:aa5281ff4a02 | 1099 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 1100 | * @return A bitmask composed of #_lpi2c_slave_flags enumerators OR'd together to indicate the |
| AnnaBridge | 161:aa5281ff4a02 | 1101 | * set of enabled interrupts. |
| AnnaBridge | 161:aa5281ff4a02 | 1102 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 1103 | static inline uint32_t LPI2C_SlaveGetEnabledInterrupts(LPI2C_Type *base) |
| AnnaBridge | 161:aa5281ff4a02 | 1104 | { |
| AnnaBridge | 161:aa5281ff4a02 | 1105 | return base->SIER; |
| AnnaBridge | 161:aa5281ff4a02 | 1106 | } |
| AnnaBridge | 161:aa5281ff4a02 | 1107 | |
| AnnaBridge | 161:aa5281ff4a02 | 1108 | /*@}*/ |
| AnnaBridge | 161:aa5281ff4a02 | 1109 | |
| AnnaBridge | 161:aa5281ff4a02 | 1110 | /*! @name Slave DMA control */ |
| AnnaBridge | 161:aa5281ff4a02 | 1111 | /*@{*/ |
| AnnaBridge | 161:aa5281ff4a02 | 1112 | |
| AnnaBridge | 161:aa5281ff4a02 | 1113 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 1114 | * @brief Enables or disables the LPI2C slave peripheral DMA requests. |
| AnnaBridge | 161:aa5281ff4a02 | 1115 | * |
| AnnaBridge | 161:aa5281ff4a02 | 1116 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 1117 | * @param enableAddressValid Enable flag for the address valid DMA request. Pass true for enable, false for disable. |
| AnnaBridge | 161:aa5281ff4a02 | 1118 | * The address valid DMA request is shared with the receive data DMA request. |
| AnnaBridge | 161:aa5281ff4a02 | 1119 | * @param enableRx Enable flag for the receive data DMA request. Pass true for enable, false for disable. |
| AnnaBridge | 161:aa5281ff4a02 | 1120 | * @param enableTx Enable flag for the transmit data DMA request. Pass true for enable, false for disable. |
| AnnaBridge | 161:aa5281ff4a02 | 1121 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 1122 | static inline void LPI2C_SlaveEnableDMA(LPI2C_Type *base, bool enableAddressValid, bool enableRx, bool enableTx) |
| AnnaBridge | 161:aa5281ff4a02 | 1123 | { |
| AnnaBridge | 161:aa5281ff4a02 | 1124 | base->SDER = (base->SDER & ~(LPI2C_SDER_AVDE_MASK | LPI2C_SDER_RDDE_MASK | LPI2C_SDER_TDDE_MASK)) | |
| AnnaBridge | 161:aa5281ff4a02 | 1125 | LPI2C_SDER_AVDE(enableAddressValid) | LPI2C_SDER_RDDE(enableRx) | LPI2C_SDER_TDDE(enableTx); |
| AnnaBridge | 161:aa5281ff4a02 | 1126 | } |
| AnnaBridge | 161:aa5281ff4a02 | 1127 | |
| AnnaBridge | 161:aa5281ff4a02 | 1128 | /*@}*/ |
| AnnaBridge | 161:aa5281ff4a02 | 1129 | |
| AnnaBridge | 161:aa5281ff4a02 | 1130 | /*! @name Slave bus operations */ |
| AnnaBridge | 161:aa5281ff4a02 | 1131 | /*@{*/ |
| AnnaBridge | 161:aa5281ff4a02 | 1132 | |
| AnnaBridge | 161:aa5281ff4a02 | 1133 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 1134 | * @brief Returns whether the bus is idle. |
| AnnaBridge | 161:aa5281ff4a02 | 1135 | * |
| AnnaBridge | 161:aa5281ff4a02 | 1136 | * Requires the slave mode to be enabled. |
| AnnaBridge | 161:aa5281ff4a02 | 1137 | * |
| AnnaBridge | 161:aa5281ff4a02 | 1138 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 1139 | * @retval true Bus is busy. |
| AnnaBridge | 161:aa5281ff4a02 | 1140 | * @retval false Bus is idle. |
| AnnaBridge | 161:aa5281ff4a02 | 1141 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 1142 | static inline bool LPI2C_SlaveGetBusIdleState(LPI2C_Type *base) |
| AnnaBridge | 161:aa5281ff4a02 | 1143 | { |
| AnnaBridge | 161:aa5281ff4a02 | 1144 | return (base->SSR & LPI2C_SSR_BBF_MASK) >> LPI2C_SSR_BBF_SHIFT; |
| AnnaBridge | 161:aa5281ff4a02 | 1145 | } |
| AnnaBridge | 161:aa5281ff4a02 | 1146 | |
| AnnaBridge | 161:aa5281ff4a02 | 1147 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 1148 | * @brief Transmits either an ACK or NAK on the I2C bus in response to a byte from the master. |
| AnnaBridge | 161:aa5281ff4a02 | 1149 | * |
| AnnaBridge | 161:aa5281ff4a02 | 1150 | * Use this function to send an ACK or NAK when the #kLPI2C_SlaveTransmitAckFlag is asserted. This |
| AnnaBridge | 161:aa5281ff4a02 | 1151 | * only happens if you enable the sclStall.enableAck field of the ::lpi2c_slave_config_t configuration |
| AnnaBridge | 161:aa5281ff4a02 | 1152 | * structure used to initialize the slave peripheral. |
| AnnaBridge | 161:aa5281ff4a02 | 1153 | * |
| AnnaBridge | 161:aa5281ff4a02 | 1154 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 1155 | * @param ackOrNack Pass true for an ACK or false for a NAK. |
| AnnaBridge | 161:aa5281ff4a02 | 1156 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 1157 | static inline void LPI2C_SlaveTransmitAck(LPI2C_Type *base, bool ackOrNack) |
| AnnaBridge | 161:aa5281ff4a02 | 1158 | { |
| AnnaBridge | 161:aa5281ff4a02 | 1159 | base->STAR = LPI2C_STAR_TXNACK(!ackOrNack); |
| AnnaBridge | 161:aa5281ff4a02 | 1160 | } |
| AnnaBridge | 161:aa5281ff4a02 | 1161 | |
| AnnaBridge | 161:aa5281ff4a02 | 1162 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 1163 | * @brief Returns the slave address sent by the I2C master. |
| AnnaBridge | 161:aa5281ff4a02 | 1164 | * |
| AnnaBridge | 161:aa5281ff4a02 | 1165 | * This function should only be called if the #kLPI2C_SlaveAddressValidFlag is asserted. |
| AnnaBridge | 161:aa5281ff4a02 | 1166 | * |
| AnnaBridge | 161:aa5281ff4a02 | 1167 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 1168 | * @return The 8-bit address matched by the LPI2C slave. Bit 0 contains the R/w direction bit, and |
| AnnaBridge | 161:aa5281ff4a02 | 1169 | * the 7-bit slave address is in the upper 7 bits. |
| AnnaBridge | 161:aa5281ff4a02 | 1170 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 1171 | static inline uint32_t LPI2C_SlaveGetReceivedAddress(LPI2C_Type *base) |
| AnnaBridge | 161:aa5281ff4a02 | 1172 | { |
| AnnaBridge | 161:aa5281ff4a02 | 1173 | return base->SASR & LPI2C_SASR_RADDR_MASK; |
| AnnaBridge | 161:aa5281ff4a02 | 1174 | } |
| AnnaBridge | 161:aa5281ff4a02 | 1175 | |
| AnnaBridge | 161:aa5281ff4a02 | 1176 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 1177 | * @brief Performs a polling send transfer on the I2C bus. |
| AnnaBridge | 161:aa5281ff4a02 | 1178 | * |
| AnnaBridge | 161:aa5281ff4a02 | 1179 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 1180 | * @param txBuff The pointer to the data to be transferred. |
| AnnaBridge | 161:aa5281ff4a02 | 1181 | * @param txSize The length in bytes of the data to be transferred. |
| AnnaBridge | 161:aa5281ff4a02 | 1182 | * @param[out] actualTxSize |
| AnnaBridge | 161:aa5281ff4a02 | 1183 | * @return Error or success status returned by API. |
| AnnaBridge | 161:aa5281ff4a02 | 1184 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 1185 | status_t LPI2C_SlaveSend(LPI2C_Type *base, const void *txBuff, size_t txSize, size_t *actualTxSize); |
| AnnaBridge | 161:aa5281ff4a02 | 1186 | |
| AnnaBridge | 161:aa5281ff4a02 | 1187 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 1188 | * @brief Performs a polling receive transfer on the I2C bus. |
| AnnaBridge | 161:aa5281ff4a02 | 1189 | * |
| AnnaBridge | 161:aa5281ff4a02 | 1190 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 1191 | * @param rxBuff The pointer to the data to be transferred. |
| AnnaBridge | 161:aa5281ff4a02 | 1192 | * @param rxSize The length in bytes of the data to be transferred. |
| AnnaBridge | 161:aa5281ff4a02 | 1193 | * @param[out] actualRxSize |
| AnnaBridge | 161:aa5281ff4a02 | 1194 | * @return Error or success status returned by API. |
| AnnaBridge | 161:aa5281ff4a02 | 1195 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 1196 | status_t LPI2C_SlaveReceive(LPI2C_Type *base, void *rxBuff, size_t rxSize, size_t *actualRxSize); |
| AnnaBridge | 161:aa5281ff4a02 | 1197 | |
| AnnaBridge | 161:aa5281ff4a02 | 1198 | /*@}*/ |
| AnnaBridge | 161:aa5281ff4a02 | 1199 | |
| AnnaBridge | 161:aa5281ff4a02 | 1200 | /*! @name Slave non-blocking */ |
| AnnaBridge | 161:aa5281ff4a02 | 1201 | /*@{*/ |
| AnnaBridge | 161:aa5281ff4a02 | 1202 | |
| AnnaBridge | 161:aa5281ff4a02 | 1203 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 1204 | * @brief Creates a new handle for the LPI2C slave non-blocking APIs. |
| AnnaBridge | 161:aa5281ff4a02 | 1205 | * |
| AnnaBridge | 161:aa5281ff4a02 | 1206 | * The creation of a handle is for use with the non-blocking APIs. Once a handle |
| AnnaBridge | 161:aa5281ff4a02 | 1207 | * is created, there is not a corresponding destroy handle. If the user wants to |
| AnnaBridge | 161:aa5281ff4a02 | 1208 | * terminate a transfer, the LPI2C_SlaveTransferAbort() API shall be called. |
| AnnaBridge | 161:aa5281ff4a02 | 1209 | * |
| AnnaBridge | 170:e95d10626187 | 1210 | * @note The function also enables the NVIC IRQ for the input LPI2C. Need to notice |
| AnnaBridge | 170:e95d10626187 | 1211 | * that on some SoCs the LPI2C IRQ is connected to INTMUX, in this case user needs to |
| AnnaBridge | 170:e95d10626187 | 1212 | * enable the associated INTMUX IRQ in application. |
| AnnaBridge | 170:e95d10626187 | 1213 | |
| AnnaBridge | 161:aa5281ff4a02 | 1214 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 1215 | * @param[out] handle Pointer to the LPI2C slave driver handle. |
| AnnaBridge | 161:aa5281ff4a02 | 1216 | * @param callback User provided pointer to the asynchronous callback function. |
| AnnaBridge | 161:aa5281ff4a02 | 1217 | * @param userData User provided pointer to the application callback data. |
| AnnaBridge | 161:aa5281ff4a02 | 1218 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 1219 | void LPI2C_SlaveTransferCreateHandle(LPI2C_Type *base, |
| AnnaBridge | 161:aa5281ff4a02 | 1220 | lpi2c_slave_handle_t *handle, |
| AnnaBridge | 161:aa5281ff4a02 | 1221 | lpi2c_slave_transfer_callback_t callback, |
| AnnaBridge | 161:aa5281ff4a02 | 1222 | void *userData); |
| AnnaBridge | 161:aa5281ff4a02 | 1223 | |
| AnnaBridge | 161:aa5281ff4a02 | 1224 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 1225 | * @brief Starts accepting slave transfers. |
| AnnaBridge | 161:aa5281ff4a02 | 1226 | * |
| AnnaBridge | 161:aa5281ff4a02 | 1227 | * Call this API after calling I2C_SlaveInit() and LPI2C_SlaveTransferCreateHandle() to start processing |
| AnnaBridge | 161:aa5281ff4a02 | 1228 | * transactions driven by an I2C master. The slave monitors the I2C bus and pass events to the |
| AnnaBridge | 161:aa5281ff4a02 | 1229 | * callback that was passed into the call to LPI2C_SlaveTransferCreateHandle(). The callback is always invoked |
| AnnaBridge | 161:aa5281ff4a02 | 1230 | * from the interrupt context. |
| AnnaBridge | 161:aa5281ff4a02 | 1231 | * |
| AnnaBridge | 161:aa5281ff4a02 | 1232 | * The set of events received by the callback is customizable. To do so, set the @a eventMask parameter to |
| AnnaBridge | 161:aa5281ff4a02 | 1233 | * the OR'd combination of #lpi2c_slave_transfer_event_t enumerators for the events you wish to receive. |
| AnnaBridge | 161:aa5281ff4a02 | 1234 | * The #kLPI2C_SlaveTransmitEvent and #kLPI2C_SlaveReceiveEvent events are always enabled and do not need |
| AnnaBridge | 161:aa5281ff4a02 | 1235 | * to be included in the mask. Alternatively, you can pass 0 to get a default set of only the transmit and |
| AnnaBridge | 161:aa5281ff4a02 | 1236 | * receive events that are always enabled. In addition, the #kLPI2C_SlaveAllEvents constant is provided as |
| AnnaBridge | 161:aa5281ff4a02 | 1237 | * a convenient way to enable all events. |
| AnnaBridge | 161:aa5281ff4a02 | 1238 | * |
| AnnaBridge | 161:aa5281ff4a02 | 1239 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 1240 | * @param handle Pointer to #lpi2c_slave_handle_t structure which stores the transfer state. |
| AnnaBridge | 161:aa5281ff4a02 | 1241 | * @param eventMask Bit mask formed by OR'ing together #lpi2c_slave_transfer_event_t enumerators to specify |
| AnnaBridge | 161:aa5281ff4a02 | 1242 | * which events to send to the callback. Other accepted values are 0 to get a default set of |
| AnnaBridge | 161:aa5281ff4a02 | 1243 | * only the transmit and receive events, and #kLPI2C_SlaveAllEvents to enable all events. |
| AnnaBridge | 161:aa5281ff4a02 | 1244 | * |
| AnnaBridge | 161:aa5281ff4a02 | 1245 | * @retval #kStatus_Success Slave transfers were successfully started. |
| AnnaBridge | 161:aa5281ff4a02 | 1246 | * @retval #kStatus_LPI2C_Busy Slave transfers have already been started on this handle. |
| AnnaBridge | 161:aa5281ff4a02 | 1247 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 1248 | status_t LPI2C_SlaveTransferNonBlocking(LPI2C_Type *base, lpi2c_slave_handle_t *handle, uint32_t eventMask); |
| AnnaBridge | 161:aa5281ff4a02 | 1249 | |
| AnnaBridge | 161:aa5281ff4a02 | 1250 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 1251 | * @brief Gets the slave transfer status during a non-blocking transfer. |
| AnnaBridge | 161:aa5281ff4a02 | 1252 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 1253 | * @param handle Pointer to i2c_slave_handle_t structure. |
| AnnaBridge | 161:aa5281ff4a02 | 1254 | * @param[out] count Pointer to a value to hold the number of bytes transferred. May be NULL if the count is not |
| AnnaBridge | 161:aa5281ff4a02 | 1255 | * required. |
| AnnaBridge | 161:aa5281ff4a02 | 1256 | * @retval #kStatus_Success |
| AnnaBridge | 161:aa5281ff4a02 | 1257 | * @retval #kStatus_NoTransferInProgress |
| AnnaBridge | 161:aa5281ff4a02 | 1258 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 1259 | status_t LPI2C_SlaveTransferGetCount(LPI2C_Type *base, lpi2c_slave_handle_t *handle, size_t *count); |
| AnnaBridge | 161:aa5281ff4a02 | 1260 | |
| AnnaBridge | 161:aa5281ff4a02 | 1261 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 1262 | * @brief Aborts the slave non-blocking transfers. |
| AnnaBridge | 161:aa5281ff4a02 | 1263 | * @note This API could be called at any time to stop slave for handling the bus events. |
| AnnaBridge | 161:aa5281ff4a02 | 1264 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 1265 | * @param handle Pointer to #lpi2c_slave_handle_t structure which stores the transfer state. |
| AnnaBridge | 161:aa5281ff4a02 | 1266 | * @retval #kStatus_Success |
| AnnaBridge | 161:aa5281ff4a02 | 1267 | * @retval #kStatus_LPI2C_Idle |
| AnnaBridge | 161:aa5281ff4a02 | 1268 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 1269 | void LPI2C_SlaveTransferAbort(LPI2C_Type *base, lpi2c_slave_handle_t *handle); |
| AnnaBridge | 161:aa5281ff4a02 | 1270 | |
| AnnaBridge | 161:aa5281ff4a02 | 1271 | /*@}*/ |
| AnnaBridge | 161:aa5281ff4a02 | 1272 | |
| AnnaBridge | 161:aa5281ff4a02 | 1273 | /*! @name Slave IRQ handler */ |
| AnnaBridge | 161:aa5281ff4a02 | 1274 | /*@{*/ |
| AnnaBridge | 161:aa5281ff4a02 | 1275 | |
| AnnaBridge | 161:aa5281ff4a02 | 1276 | /*! |
| AnnaBridge | 161:aa5281ff4a02 | 1277 | * @brief Reusable routine to handle slave interrupts. |
| AnnaBridge | 161:aa5281ff4a02 | 1278 | * @note This function does not need to be called unless you are reimplementing the |
| AnnaBridge | 161:aa5281ff4a02 | 1279 | * non blocking API's interrupt handler routines to add special functionality. |
| AnnaBridge | 161:aa5281ff4a02 | 1280 | * @param base The LPI2C peripheral base address. |
| AnnaBridge | 161:aa5281ff4a02 | 1281 | * @param handle Pointer to #lpi2c_slave_handle_t structure which stores the transfer state. |
| AnnaBridge | 161:aa5281ff4a02 | 1282 | */ |
| AnnaBridge | 161:aa5281ff4a02 | 1283 | void LPI2C_SlaveTransferHandleIRQ(LPI2C_Type *base, lpi2c_slave_handle_t *handle); |
| AnnaBridge | 161:aa5281ff4a02 | 1284 | |
| AnnaBridge | 161:aa5281ff4a02 | 1285 | /*@}*/ |
| AnnaBridge | 161:aa5281ff4a02 | 1286 | |
| AnnaBridge | 161:aa5281ff4a02 | 1287 | /*! @} */ |
| AnnaBridge | 161:aa5281ff4a02 | 1288 | |
| AnnaBridge | 161:aa5281ff4a02 | 1289 | #if defined(__cplusplus) |
| AnnaBridge | 161:aa5281ff4a02 | 1290 | } |
| AnnaBridge | 161:aa5281ff4a02 | 1291 | #endif |
| AnnaBridge | 161:aa5281ff4a02 | 1292 | |
| AnnaBridge | 161:aa5281ff4a02 | 1293 | #endif /* _FSL_LPI2C_H_ */ |


