/*
* Copyright (c) 2020, Texas Instruments Incorporated
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*!****************************************************************************
* @file dl_i2c.h
* @brief Inter-Integrated Circuit (I2C) Driver Library
* @defgroup I2C Inter-Integrated Circuit (I2C)
*
* @anchor ti_dl_dl_i2c_Overview
* # Overview
*
* The I2C Library allows full configuration of the MSPM0 I2C module.
* The I2C module provides a standardized serial interface to transfer data
* between MSP devices and other external I2C devices (such as a sensors,
* memory, or DACs).
*
*
******************************************************************************
*/
/** @addtogroup I2C
* @{
*/
#ifndef ti_dl_dl_i2c__include
#define ti_dl_dl_i2c__include
#include
#include
#include
#include
#ifdef __MSPM0_HAS_I2C__
#ifdef __cplusplus
extern "C" {
#endif
/* clang-format off */
/*!
* @brief I2C number of bytes which could be put into the TX FIFO
*
* This variable is device specific and is calculated using the system parameter
* I2C_SYS_FENTRIES defined in each devices header file.
*/
#define DL_I2C_TX_FIFO_COUNT_MAXIMUM ((uint32_t)I2C_SYS_FENTRIES << 8)
/*!
* @brief I2C number of bytes which could be put into the RX FIFO
*
* This variable is device specific and is calculated using the system parameter
* I2C_SYS_FENTRIES defined in each devices header file.
*/
#define DL_I2C_RX_FIFO_COUNT_MAXIMUM ((uint32_t)I2C_SYS_FENTRIES)
/** @addtogroup DL_I2C_CONTROLLER_STATUS
* @{
*/
/*!
* @brief I2C is busy
*
* The BUSY bit is set during an ongoing transaction, so is set during the
* transmit/receive of the amount of data set in WBLEN including START, RESTART,
* Address and STOP signal generation when required for the current transaction
*/
#define DL_I2C_CONTROLLER_STATUS_BUSY (I2C_MSR_BUSY_MASK)
/*!
* @brief I2C error detected
*
* The error can be from the target address not being acknowledged or the
* transmit data not being acknowledged
*/
#define DL_I2C_CONTROLLER_STATUS_ERROR (I2C_MSR_ERR_MASK)
/*!
* @brief I2C address acknowledged
*/
#define DL_I2C_CONTROLLER_STATUS_ADDR_ACK (I2C_MSR_ADRACK_MASK)
/*!
* @brief I2C data acknowledged
*/
#define DL_I2C_CONTROLLER_STATUS_DATA_ACK (I2C_MSR_DATACK_MASK)
/*!
* @brief I2C arbitration lost
*/
#define DL_I2C_CONTROLLER_STATUS_ARBITRATION_LOST (I2C_MSR_ARBLST_MASK)
/*!
* @brief I2C idle
*/
#define DL_I2C_CONTROLLER_STATUS_IDLE (I2C_MSR_IDLE_MASK)
/*!
* @brief I2C bus busy
*
* The bit changes based on the START and STOP conditions
*/
#define DL_I2C_CONTROLLER_STATUS_BUSY_BUS (I2C_MSR_BUSBSY_MASK)
/** @}*/
/** @addtogroup DL_I2C_TARGET_STATUS
* @{
*/
/*!
* @brief Indicates the address for which target address match happened
*/
#define DL_I2C_TARGET_STATUS_ADDRESS_MATCH (I2C_SSR_ADDRMATCH_MASK)
/*!
* @brief I2C Target Stale TX FIFO
*
* Set = The target TX FIFO data is stale. This occurs when the TX FIFO was not
* emptied during the previous I2C transaction
* Clear = The target TX FIFO data is not stale
*/
#define DL_I2C_TARGET_STATUS_STALE_TX_FIFO (I2C_SSR_STALE_TXFIFO_MASK)
/*!
* @brief I2C Target TX Mode
*
* Set = Target is in the TX_DATA, TX_ACK, TX_WAIT, or ADDR_ACK state with the
* bus direction set to read
* Clear = Target is not in the TX_DATA, TX_ACK, TX_WAIT, or ADDR_ACK state
* with the bus direction set to read
*/
#define DL_I2C_TARGET_STATUS_TX_MODE (I2C_SSR_TXMODE_MASK)
/*!
* @brief I2C Target Bus Busy
*
* Set = The I2C bus is busy. This is cleared on a timeout
* Clear = The I2C bus is not busy. This bit is cleared when a STOP condition is
* detected on the bus.
*/
#define DL_I2C_TARGET_STATUS_BUS_BUSY (I2C_SSR_BUSBSY_MASK)
/*!
* @brief I2C Target RX Mode
*
* Set = Target is in the RX_DATA, RX_ACK, RX_WAIT, RX_ACK_WAIT or ADDR_ACK
* state with the bus direction set to write
* Clear = Target is not in the RX_DATA, RX_ACK, RX_WAIT, RX_ACK_WAIT or ADDR_ACK
* state with the bus direction set to write
*/
#define DL_I2C_TARGET_STATUS_RX_MODE (I2C_SSR_RXMODE_MASK)
/*!
* @brief Direction of I2C Quick Command
* Only valid when QCMDST is set. @sa DL_I2C_TARGET_STATUS_QUICK_COMMAND_STATUS.
* Set = Quick command was a read
* Clear = Quick command was a write
*/
#define DL_I2C_TARGET_STATUS_QUICK_COMMAND_READ_WRITE (I2C_SSR_QCMDRW_MASK)
/*!
* @brief Status of I2C Quick Command
* @sa DL_I2C_TARGET_STATUS_QUICK_COMMAND_READ_WRITE.
* Set = Last transaction was a Quick Comand transaction
* Clear = Last transaction was normal or has not occurred
*/
#define DL_I2C_TARGET_STATUS_QUICK_COMMAND_STATUS (I2C_SSR_QCMDST_MASK)
/*!
* @brief I2C Target Own Address Alternate Matched
*/
#define DL_I2C_TARGET_STATUS_OWN_ADDR_ALTERNATE_MATCHED (I2C_SSR_OAR2SEL_MASK)
/*!
* @brief I2C Target Transmit Request
*/
#define DL_I2C_TARGET_STATUS_TRANSMIT_REQUEST (I2C_SSR_TREQ_MASK)
/*!
* @brief I2C Target Receive Request
*/
#define DL_I2C_TARGET_STATUS_RECEIVE_REQUEST (I2C_SSR_RREQ_MASK)
/** @}*/
/** @addtogroup DL_I2C_INTERRUPT
* @{
*/
/*!
* @brief Controller Receive Transaction completed Interrupt
*/
#define DL_I2C_INTERRUPT_CONTROLLER_RX_DONE (I2C_CPU_INT_IMASK_MRXDONE_SET)
/*!
* @brief Controller Transmit Transaction completed Interrupt
*/
#define DL_I2C_INTERRUPT_CONTROLLER_TX_DONE (I2C_CPU_INT_IMASK_MTXDONE_SET)
/*!
* @brief Controller Receive FIFO Trigger when >= defined bytes
*/
#define DL_I2C_INTERRUPT_CONTROLLER_RXFIFO_TRIGGER \
(I2C_CPU_INT_IMASK_MRXFIFOTRG_SET)
/*!
* @brief Controller Transmit FIFO Trigger when <= defined bytes
*/
#define DL_I2C_INTERRUPT_CONTROLLER_TXFIFO_TRIGGER \
(I2C_CPU_INT_IMASK_MTXFIFOTRG_SET)
/*!
* @brief Controller Receive FIFO is full
*/
#define DL_I2C_INTERRUPT_CONTROLLER_RXFIFO_FULL \
(I2C_CPU_INT_IMASK_MRXFIFOFULL_SET)
/*!
* @brief Controller Transmit FIFO is empty
*/
#define DL_I2C_INTERRUPT_CONTROLLER_TXFIFO_EMPTY \
(I2C_CPU_INT_IMASK_MTXEMPTY_SET)
/*!
* @brief Address/Data NACK Interrupt
*/
#define DL_I2C_INTERRUPT_CONTROLLER_NACK (I2C_CPU_INT_IMASK_MNACK_SET)
/*!
* @brief START Detection Interrupt
*/
#define DL_I2C_INTERRUPT_CONTROLLER_START (I2C_CPU_INT_IMASK_MSTART_SET)
/*!
* @brief STOP Detection Interrupt
*/
#define DL_I2C_INTERRUPT_CONTROLLER_STOP (I2C_CPU_INT_IMASK_MSTOP_SET)
/*!
* @brief Arbitration Lost Interrupt
*/
#define DL_I2C_INTERRUPT_CONTROLLER_ARBITRATION_LOST \
(I2C_CPU_INT_IMASK_MARBLOST_SET)
/*!
* @brief Controller DMA Done on Event 1 publisher
*/
#define DL_I2C_INTERRUPT_CONTROLLER_EVENT1_DMA_DONE \
(I2C_CPU_INT_IMASK_MDMA_DONE_TX_SET)
/*!
* @brief Controller DMA Done on Event 2 publisher
*/
#define DL_I2C_INTERRUPT_CONTROLLER_EVENT2_DMA_DONE \
(I2C_CPU_INT_IMASK_MDMA_DONE_RX_SET)
/*!
* @brief Controller SMBus/PMBus PEC Receive Error Interrupt
*/
#define DL_I2C_INTERRUPT_CONTROLLER_PEC_RX_ERROR \
(I2C_CPU_INT_IMASK_MPEC_RX_ERR_SET)
/*!
* @brief Target Receive Data Interrupt (byte has been received)
*/
#define DL_I2C_INTERRUPT_TARGET_RX_DONE (I2C_CPU_INT_IMASK_SRXDONE_SET)
/*!
* @brief Target Transmit Transaction completed Interrupt
*/
#define DL_I2C_INTERRUPT_TARGET_TX_DONE (I2C_CPU_INT_IMASK_STXDONE_SET)
/*!
* @brief Target Receive FIFO Trigger
*/
#define DL_I2C_INTERRUPT_TARGET_RXFIFO_TRIGGER \
(I2C_CPU_INT_IMASK_SRXFIFOTRG_SET)
/*!
* @brief Target Transmit FIFO Trigger
*/
#define DL_I2C_INTERRUPT_TARGET_TXFIFO_TRIGGER \
(I2C_CPU_INT_IMASK_STXFIFOTRG_SET)
/*!
* @brief Target RX FIFO full
*/
#define DL_I2C_INTERRUPT_TARGET_RXFIFO_FULL \
(I2C_CPU_INT_IMASK_SRXFIFOFULL_SET)
/*!
* @brief Target TX FIFO empty. All data in Transmit FIFO shifted out and
* transmit goes into idle mode.
*/
#define DL_I2C_INTERRUPT_TARGET_TXFIFO_EMPTY \
(I2C_CPU_INT_IMASK_STXEMPTY_SET)
/*!
* @brief Target Start Condition detected
*/
#define DL_I2C_INTERRUPT_TARGET_START \
(I2C_CPU_INT_IMASK_SSTART_SET)
/*!
* @brief Target Stop Condition detected
*/
#define DL_I2C_INTERRUPT_TARGET_STOP (I2C_CPU_INT_IMASK_SSTOP_SET)
/*!
* @brief General Call Interrupt
*/
#define DL_I2C_INTERRUPT_TARGET_GENERAL_CALL \
(I2C_CPU_INT_IMASK_SGENCALL_SET)
/*!
* @brief Target DMA Done on Event 1 Publisher
*/
#define DL_I2C_INTERRUPT_TARGET_EVENT1_DMA_DONE \
(I2C_CPU_INT_IMASK_SDMA_DONE_TX_SET)
/*!
* @brief Target DMA Done on Event 2 Publisher
*/
#define DL_I2C_INTERRUPT_TARGET_EVENT2_DMA_DONE \
(I2C_CPU_INT_IMASK_SDMA_DONE_RX_SET)
/*!
* @brief Target SMBus/PMBus PEC Receive Error Interrupt
*/
#define DL_I2C_INTERRUPT_TARGET_PEC_RX_ERROR \
(I2C_CPU_INT_IMASK_SPEC_RX_ERR_SET)
/*!
* @brief Target TX FIFO Underflow Interrupt
*/
#define DL_I2C_INTERRUPT_TARGET_TXFIFO_UNDERFLOW \
(I2C_CPU_INT_IMASK_STX_UNFL_SET)
/*!
* @brief Target RX FIFO Overflow Interrupt
*/
#define DL_I2C_INTERRUPT_TARGET_RXFIFO_OVERFLOW \
(I2C_CPU_INT_IMASK_SRX_OVFL_SET)
/*!
* @brief Target Arbitration Lost Interrupt
*/
#define DL_I2C_INTERRUPT_TARGET_ARBITRATION_LOST \
(I2C_CPU_INT_IMASK_SARBLOST_SET)
/*!
* @brief Interrupt Overflow Interrupt. Occurs when Target START or STOP
* interrupts overflow (i.e. occurs twice without being serviced)
*/
#define DL_I2C_TARGET_INTERRUPT_OVERFLOW (I2C_CPU_INT_IMASK_INTR_OVFL_SET)
/*!
* @brief Timeout A Interrupt
*/
#define DL_I2C_INTERRUPT_TIMEOUT_A (I2C_CPU_INT_IMASK_TIMEOUTA_SET)
/*!
* @brief Timeout B Interrupt
*/
#define DL_I2C_INTERRUPT_TIMEOUT_B (I2C_CPU_INT_IMASK_TIMEOUTB_SET)
/** @}*/
/** @addtogroup DL_I2C_DMA_INTERRUPT
* @{
*/
/*!
* @brief Peripheral Transmit FIFO Trigger interrupt for DMA trigger
*/
#define DL_I2C_DMA_INTERRUPT_TARGET_TXFIFO_TRIGGER \
(I2C_DMA_TRIG1_IMASK_STXFIFOTRG_SET)
/*!
* @brief Peripheral Receive FIFO Trigger interrupt for DMA trigger
*/
#define DL_I2C_DMA_INTERRUPT_TARGET_RXFIFO_TRIGGER \
(I2C_DMA_TRIG1_IMASK_SRXFIFOTRG_SET)
/*!
* @brief Controller Transmit FIFO Trigger when <= defined bytes for DMA trigger
*/
#define DL_I2C_DMA_INTERRUPT_CONTROLLER_TXFIFO_TRIGGER \
(I2C_DMA_TRIG1_IMASK_MTXFIFOTRG_SET)
/*!
* @brief Controller Receive FIFO Trigger when >= defined bytes for DMA trigger
*/
#define DL_I2C_DMA_INTERRUPT_CONTROLLER_RXFIFO_TRIGGER \
(I2C_DMA_TRIG1_IMASK_MRXFIFOTRG_SET)
/** @}*/
/* clang-format on */
/*! @enum DL_I2C_DMA_IIDX */
typedef enum {
/*! I2C interrupt index for enabling I2C Target Transmit FIFO Trigger as DMA trigger */
DL_I2C_DMA_IIDX_TARGET_TXFIFO_TRIGGER = I2C_DMA_TRIG1_IIDX_STAT_MTXFIFOTRG,
/*! I2C interrupt index for enabling I2C Target Receive FIFO Trigger as DMA trigger */
DL_I2C_DMA_IIDX_TARGET_RXFIFO_TRIGGER = I2C_DMA_TRIG1_IIDX_STAT_MRXFIFOTRG,
/*! I2C interrupt index for enabling I2C Controller Transmit FIFO Trigger as DMA trigger */
DL_I2C_DMA_IIDX_CONTROLLER_TXFIFO_TRIGGER =
I2C_DMA_TRIG1_IIDX_STAT_STXFIFOTRG,
/*! I2C interrupt index for enabling I2C Controller Receive FIFO Trigger as DMA trigger */
DL_I2C_DMA_IIDX_CONTROLLER_RXFIFO_TRIGGER =
I2C_DMA_TRIG1_IIDX_STAT_SRXFIFOTRG
} DL_I2C_DMA_IIDX;
/** @enum DL_I2C_EVENT_ROUTE */
typedef enum {
/*! I2C event route 1 */
DL_I2C_EVENT_ROUTE_1 = 0,
/*! I2C event route 2 */
DL_I2C_EVENT_ROUTE_2 = 12
} DL_I2C_EVENT_ROUTE;
/** @enum DL_I2C_CLOCK */
typedef enum {
/*! BUSCLK enabled as I2C clock source */
DL_I2C_CLOCK_BUSCLK = I2C_CLKSEL_BUSCLK_SEL_ENABLE,
/*! MFCLK enabled as I2C clock source */
DL_I2C_CLOCK_MFCLK = I2C_CLKSEL_MFCLK_SEL_ENABLE,
} DL_I2C_CLOCK;
/** @enum DL_I2C_CLOCK_DIVIDE */
typedef enum {
/*! I2C Clock Divided by 1 */
DL_I2C_CLOCK_DIVIDE_1 = I2C_CLKDIV_RATIO_DIV_BY_1,
/*! I2C Clock Divided by 2 */
DL_I2C_CLOCK_DIVIDE_2 = I2C_CLKDIV_RATIO_DIV_BY_2,
/*! I2C Clock Divided by 3 */
DL_I2C_CLOCK_DIVIDE_3 = I2C_CLKDIV_RATIO_DIV_BY_3,
/*! I2C Clock Divided by 4 */
DL_I2C_CLOCK_DIVIDE_4 = I2C_CLKDIV_RATIO_DIV_BY_4,
/*! I2C Clock Divided by 5 */
DL_I2C_CLOCK_DIVIDE_5 = I2C_CLKDIV_RATIO_DIV_BY_5,
/*! I2C Clock Divided by 6 */
DL_I2C_CLOCK_DIVIDE_6 = I2C_CLKDIV_RATIO_DIV_BY_6,
/*! I2C Clock Divided by 7 */
DL_I2C_CLOCK_DIVIDE_7 = I2C_CLKDIV_RATIO_DIV_BY_7,
/*! I2C Clock Divided by 8 */
DL_I2C_CLOCK_DIVIDE_8 = I2C_CLKDIV_RATIO_DIV_BY_8,
} DL_I2C_CLOCK_DIVIDE;
/** @enum DL_I2C_TARGET_ADDRESSING_MODE */
typedef enum {
/*! Enable Target in 7-bit addressing mode */
DL_I2C_TARGET_ADDRESSING_MODE_7_BIT = I2C_SOAR_SMODE_MODE7,
/*! Enable Target in 10-bit addressing mode */
DL_I2C_TARGET_ADDRESSING_MODE_10_BIT = I2C_SOAR_SMODE_MODE10,
} DL_I2C_TARGET_ADDRESSING_MODE;
/** @enum DL_I2C_TARGET_PEC_STATUS */
typedef enum {
/*! I2C Target SMBus/PMBus PEC was checked in the transaction that occurred
* before the last Stop */
DL_I2C_TARGET_PEC_STATUS_CHECKED = I2C_TARGET_PECSR_PECSTS_CHECK_SET,
/*! I2C Target SMBus/PMBus PEC was not checked in the transaction that
* occurred before the last Stop */
DL_I2C_TARGET_PEC_STATUS_NOT_CHECKED =
I2C_TARGET_PECSR_PECSTS_CHECK_CLEARED,
} DL_I2C_TARGET_PEC_STATUS;
/** @enum DL_I2C_TARGET_PEC_CHECK_ERROR */
typedef enum {
/*! Indicates PEC check error did not occurr in the transaction that
* occurred before the last Stop */
DL_I2C_TARGET_PEC_CHECK_ERROR_CLEARED =
I2C_TARGET_PECSR_PECSTS_ERROR_CLEARED,
/*! Indicates PEC check error occurred in the transaction that
* occurred before the last Stop */
DL_I2C_TARGET_PEC_CHECK_ERROR_SET = I2C_TARGET_PECSR_PECSTS_ERROR_SET,
} DL_I2C_TARGET_PEC_CHECK_ERROR;
/** @enum DL_I2C_ANALOG_GLITCH_FILTER_WIDTH */
typedef enum {
/*! Pulses shorter than 5ns in length are filtered. */
DL_I2C_ANALOG_GLITCH_FILTER_WIDTH_5NS = I2C_GFCTL_AGFSEL_AGLIT_5,
/*! Pulses shorter than 10ns in length are filtered. */
DL_I2C_ANALOG_GLITCH_FILTER_WIDTH_10NS = I2C_GFCTL_AGFSEL_AGLIT_10,
/*! Pulses shorter than 25ns in length are filtered. */
DL_I2C_ANALOG_GLITCH_FILTER_WIDTH_25NS = I2C_GFCTL_AGFSEL_AGLIT_25,
/*! Pulses shorter than 50ns in length are filtered. */
DL_I2C_ANALOG_GLITCH_FILTER_WIDTH_50NS = I2C_GFCTL_AGFSEL_AGLIT_50,
} DL_I2C_ANALOG_GLITCH_FILTER_WIDTH;
/** @enum DL_I2C_DIGITAL_GLITCH_FILTER_WIDTH */
typedef enum {
/*! Pulses filtering disabled. */
DL_I2C_DIGITAL_GLITCH_FILTER_WIDTH_DISABLED = I2C_GFCTL_DGFSEL_DISABLED,
/*! Pulses shorter than 1 functional clock tick in length are filtered. */
DL_I2C_DIGITAL_GLITCH_FILTER_WIDTH_CLOCKS_1 = I2C_GFCTL_DGFSEL_CLK_1,
/*! Pulses shorter than 2 functional clock ticks in length are filtered. */
DL_I2C_DIGITAL_GLITCH_FILTER_WIDTH_CLOCKS_2 = I2C_GFCTL_DGFSEL_CLK_2,
/*! Pulses shorter than 3 functional clock ticks in length are filtered. */
DL_I2C_DIGITAL_GLITCH_FILTER_WIDTH_CLOCKS_3 = I2C_GFCTL_DGFSEL_CLK_3,
/*! Pulses shorter than 4 functional clock ticks in length are filtered. */
DL_I2C_DIGITAL_GLITCH_FILTER_WIDTH_CLOCKS_4 = I2C_GFCTL_DGFSEL_CLK_4,
/*! Pulses shorter than 8 functional clock ticks in length are filtered. */
DL_I2C_DIGITAL_GLITCH_FILTER_WIDTH_CLOCKS_8 = I2C_GFCTL_DGFSEL_CLK_8,
/*! Pulses shorter than 16 functional clock ticks in length are filtered. */
DL_I2C_DIGITAL_GLITCH_FILTER_WIDTH_CLOCKS_16 = I2C_GFCTL_DGFSEL_CLK_16,
/*! Pulses shorter than 31 functional clock ticks in length are filtered. */
DL_I2C_DIGITAL_GLITCH_FILTER_WIDTH_CLOCKS_31 = I2C_GFCTL_DGFSEL_CLK_31,
} DL_I2C_DIGITAL_GLITCH_FILTER_WIDTH;
/** @enum DL_I2C_CONTROLLER_DIRECTION */
typedef enum {
/*! Set direction to controller transmitting to target */
DL_I2C_CONTROLLER_DIRECTION_TX = I2C_MSA_DIR_TRANSMIT,
/*! Set direction to controller receiving from target */
DL_I2C_CONTROLLER_DIRECTION_RX = I2C_MSA_DIR_RECEIVE,
} DL_I2C_CONTROLLER_DIRECTION;
/** @enum DL_I2C_CONTROLLER_ADDRESSING_MODE */
typedef enum {
/*! Enable Controller in 7-bit addressing mode */
DL_I2C_CONTROLLER_ADDRESSING_MODE_7_BIT = I2C_MSA_MMODE_MODE7,
/*! Enable Controller in 10-bit addressing mode */
DL_I2C_CONTROLLER_ADDRESSING_MODE_10_BIT = I2C_MSA_MMODE_MODE10,
} DL_I2C_CONTROLLER_ADDRESSING_MODE;
/** @enum DL_I2C_CONTROLLER_PEC_STATUS */
typedef enum {
/*! I2C Controller SMBus/PMBus PEC was checked in the transaction that
* occurred before the last Stop */
DL_I2C_CONTROLLER_PEC_STATUS_CHECKED =
I2C_CONTROLLER_PECSR_PECSTS_CHECK_SET,
/*! I2C Controller SMBus/PMBus PEC was not checked in the transaction that
* occurred the last Stop */
DL_I2C_CONTROLLER_PEC_STATUS_NOT_CHECKED =
I2C_CONTROLLER_PECSR_PECSTS_CHECK_CLEARED,
} DL_I2C_CONTROLLER_PEC_STATUS;
/** @enum DL_I2C_CONTROLLER_PEC_CHECK_ERROR */
typedef enum {
/*! I2C Controller SMBus/PMBus PEC check error occurred in the transaction
* before the last stop */
DL_I2C_CONTROLLER_PEC_CHECK_ERROR_SET =
I2C_CONTROLLER_PECSR_PECSTS_ERROR_SET,
/*! I2C Controller SMBus/PMBus PEC check error did not occur in the
* transaction before the last stop */
DL_I2C_CONTROLLER_PEC_CHECK_ERROR_CLEARED =
I2C_CONTROLLER_PECSR_PECSTS_ERROR_CLEARED,
} DL_I2C_CONTROLLER_PEC_CHECK_ERROR;
/** @enum DL_I2C_CONTROLLER_SCL */
typedef enum {
/*! I2C SCL signal high */
DL_I2C_CONTROLLER_SCL_HIGH = I2C_MBMON_SCL_SET,
/*! I2C SCL signal low */
DL_I2C_CONTROLLER_SCL_LOW = I2C_MBMON_SCL_CLEARED,
} DL_I2C_CONTROLLER_SCL;
/** @enum DL_I2C_CONTROLLER_SDA */
typedef enum {
/*! I2C SDA signal high */
DL_I2C_CONTROLLER_SDA_HIGH = I2C_MBMON_SDA_SET,
/*! I2C SDA signal low */
DL_I2C_CONTROLLER_SDA_LOW = I2C_MBMON_SDA_CLEARED,
} DL_I2C_CONTROLLER_SDA;
/** @enum DL_I2C_CONTROLLER_START */
typedef enum {
/*! Controller generates START condition */
DL_I2C_CONTROLLER_START_ENABLE = I2C_MCTR_START_ENABLE,
/*! Controller doesn't generate START condition */
DL_I2C_CONTROLLER_START_DISABLE = I2C_MCTR_START_DISABLE,
} DL_I2C_CONTROLLER_START;
/** @enum DL_I2C_CONTROLLER_STOP */
typedef enum {
/*! Controller generates STOP condition */
DL_I2C_CONTROLLER_STOP_ENABLE = I2C_MCTR_STOP_ENABLE,
/*! Controller doesn't generate STOP condition */
DL_I2C_CONTROLLER_STOP_DISABLE = I2C_MCTR_STOP_DISABLE,
} DL_I2C_CONTROLLER_STOP;
/** @enum DL_I2C_CONTROLLER_ACK */
typedef enum {
/*! Last received data byte of a transaction is not ACKed automatically */
DL_I2C_CONTROLLER_ACK_ENABLE = I2C_MCTR_ACK_ENABLE,
/*! Last received data byte of a transaction is ACKed automatically */
DL_I2C_CONTROLLER_ACK_DISABLE = I2C_MCTR_ACK_DISABLE,
} DL_I2C_CONTROLLER_ACK;
/** @enum DL_I2C_TX_FIFO_LEVEL */
typedef enum {
/*! Trigger when the TX FIFO is empty */
DL_I2C_TX_FIFO_LEVEL_EMPTY = I2C_MFIFOCTL_TXTRIG_EMPTY,
/*! Trigger when TX FIFO contains 1 byte */
DL_I2C_TX_FIFO_LEVEL_BYTES_1 = I2C_MFIFOCTL_TXTRIG_LEVEL_1,
/*! Trigger when TX FIFO contains 2 bytes */
DL_I2C_TX_FIFO_LEVEL_BYTES_2 = I2C_MFIFOCTL_TXTRIG_LEVEL_2,
/*! Trigger when TX FIFO contains 3 bytes */
DL_I2C_TX_FIFO_LEVEL_BYTES_3 = I2C_MFIFOCTL_TXTRIG_LEVEL_3,
/*! Trigger when TX FIFO contains 4 bytes */
DL_I2C_TX_FIFO_LEVEL_BYTES_4 = I2C_MFIFOCTL_TXTRIG_LEVEL_4,
/*! Trigger when TX FIFO contains 5 bytes */
DL_I2C_TX_FIFO_LEVEL_BYTES_5 = I2C_MFIFOCTL_TXTRIG_LEVEL_5,
/*! Trigger when TX FIFO contains 6 bytes */
DL_I2C_TX_FIFO_LEVEL_BYTES_6 = I2C_MFIFOCTL_TXTRIG_LEVEL_6,
/*! Trigger when TX FIFO contains 7 bytes */
DL_I2C_TX_FIFO_LEVEL_BYTES_7 = I2C_MFIFOCTL_TXTRIG_LEVEL_7,
} DL_I2C_TX_FIFO_LEVEL;
/** @enum DL_I2C_RX_FIFO_LEVEL */
typedef enum {
/*! Trigger when RX FIFO contains at least 1 byte */
DL_I2C_RX_FIFO_LEVEL_BYTES_1 = I2C_MFIFOCTL_RXTRIG_LEVEL_1,
/*! Trigger when RX FIFO contains at least 2 bytes */
DL_I2C_RX_FIFO_LEVEL_BYTES_2 = I2C_MFIFOCTL_RXTRIG_LEVEL_2,
/*! Trigger when RX FIFO contains at least 3 bytes */
DL_I2C_RX_FIFO_LEVEL_BYTES_3 = I2C_MFIFOCTL_RXTRIG_LEVEL_3,
/*! Trigger when RX FIFO contains at least 4 bytes */
DL_I2C_RX_FIFO_LEVEL_BYTES_4 = I2C_MFIFOCTL_RXTRIG_LEVEL_4,
/*! Trigger when RX FIFO contains at least 5 bytes */
DL_I2C_RX_FIFO_LEVEL_BYTES_5 = I2C_MFIFOCTL_RXTRIG_LEVEL_5,
/*! Trigger when RX FIFO contains at least 6 bytes */
DL_I2C_RX_FIFO_LEVEL_BYTES_6 = I2C_MFIFOCTL_RXTRIG_LEVEL_6,
/*! Trigger when RX FIFO contains at least 7 bytes */
DL_I2C_RX_FIFO_LEVEL_BYTES_7 = I2C_MFIFOCTL_RXTRIG_LEVEL_7,
/*! Trigger when RX FIFO contains at least 8 bytes */
DL_I2C_RX_FIFO_LEVEL_BYTES_8 = I2C_MFIFOCTL_RXTRIG_LEVEL_8,
} DL_I2C_RX_FIFO_LEVEL;
/** @enum DL_I2C_TARGET_RESPONSE_OVERRIDE_VALUE */
typedef enum {
/*! Target manual ACK for valid data or command. */
DL_I2C_TARGET_RESPONSE_OVERRIDE_VALUE_ACK = I2C_SACKCTL_ACKOVAL_DISABLE,
/*! Target manual NACK for invalid data or command. */
DL_I2C_TARGET_RESPONSE_OVERRIDE_VALUE_NACK = I2C_SACKCTL_ACKOVAL_ENABLE,
} DL_I2C_TARGET_RESPONSE_OVERRIDE_VALUE;
/*! @enum DL_I2C_IIDX */
typedef enum {
/*! Interrupt index for I2C if no interrupt is pending */
DL_I2C_IIDX_NO_INT = I2C_CPU_INT_IIDX_STAT_NO_INTR,
/*! Interrupt index for I2C Controller Receive Transaction completed */
DL_I2C_IIDX_CONTROLLER_RX_DONE = I2C_CPU_INT_IIDX_STAT_MRXDONEFG,
/*! Interrupt index for Controller Transmit Transaction completed */
DL_I2C_IIDX_CONTROLLER_TX_DONE = I2C_CPU_INT_IIDX_STAT_MTXDONEFG,
/*! Interrupt index for I2C Controller Receive FIFO Trigger */
DL_I2C_IIDX_CONTROLLER_RXFIFO_TRIGGER = I2C_CPU_INT_IIDX_STAT_MRXFIFOTRG,
/*! Interrupt index for I2C Controller Transmit FIFO Trigger */
DL_I2C_IIDX_CONTROLLER_TXFIFO_TRIGGER = I2C_CPU_INT_IIDX_STAT_MTXFIFOTRG,
/*! Interrupt index for I2C Controller Receive when FIFO is full */
DL_I2C_IIDX_CONTROLLER_RXFIFO_FULL = I2C_CPU_INT_IIDX_STAT_MRXFIFOFULL,
/*! Interrupt index for I2C Controller when Transmit FIFO is empty */
DL_I2C_IIDX_CONTROLLER_TXFIFO_EMPTY = I2C_CPU_INT_IIDX_STAT_MTX_EMPTY,
/*! Interrupt index for Address/Data NACK */
DL_I2C_IIDX_CONTROLLER_NACK = I2C_CPU_INT_IIDX_STAT_MNACKFG,
/*! Interrupt index for I2C controller START Detection */
DL_I2C_IIDX_CONTROLLER_START = I2C_CPU_INT_IIDX_STAT_MSTARTFG,
/*! Interrupt index for I2C controller STOP Detection */
DL_I2C_IIDX_CONTROLLER_STOP = I2C_CPU_INT_IIDX_STAT_MSTOPFG,
/*! Interrupt index for I2C controller Arbitration Lost */
DL_I2C_IIDX_CONTROLLER_ARBITRATION_LOST = I2C_CPU_INT_IIDX_STAT_MARBLOSTFG,
/*! Interrupt index for I2C controller Event 1 DMA Done */
DL_I2C_IIDX_CONTROLLER_EVENT1_DMA_DONE =
I2C_CPU_INT_IIDX_STAT_MDMA_DONE_TX,
/*! Interrupt index for I2C controller Event 2 DMA Done */
DL_I2C_IIDX_CONTROLLER_EVENT2_DMA_DONE =
I2C_CPU_INT_IIDX_STAT_MDMA_DONE_RX,
/*! Interrupt index for I2C controller SMBus/PMBus PEC Receive Error Event */
DL_I2C_IIDX_CONTROLLER_PEC_RX_ERROR = I2C_CPU_INT_IIDX_STAT_MPEC_RX_ERR,
/*! Interrupt index for I2C Timeout A Event */
DL_I2C_IIDX_TIMEOUT_A = I2C_CPU_INT_IIDX_STAT_TIMEOUTA,
/*! Interrupt index for I2C Timeout B Event */
DL_I2C_IIDX_TIMEOUT_B = I2C_CPU_INT_IIDX_STAT_TIMEOUTB,
/*! Interrupt index for I2C Target Receive Data */
DL_I2C_IIDX_TARGET_RX_DONE = I2C_CPU_INT_IIDX_STAT_SRXDONEFG,
/*! Interrupt index for I2C Target Transmit Transaction completed */
DL_I2C_IIDX_TARGET_TX_DONE = I2C_CPU_INT_IIDX_STAT_STXDONEFG,
/*! Interrupt index for I2C Target Receive FIFO Trigger */
DL_I2C_IIDX_TARGET_RXFIFO_TRIGGER = I2C_CPU_INT_IIDX_STAT_SRXFIFOTRG,
/*! Interrupt index for I2C Target Transmit FIFO Trigger */
DL_I2C_IIDX_TARGET_TXFIFO_TRIGGER = I2C_CPU_INT_IIDX_STAT_STXFIFOTRG,
/*! Interrupt index for I2C Target RX FIFO full */
DL_I2C_IIDX_TARGET_RXFIFO_FULL = I2C_CPU_INT_IIDX_STAT_SRXFIFOFULL,
/*! Interrupt index for I2C Target TX FIFO empty.
* All data in Transmit FIFO shifted out and transmit goes into idle mode. */
DL_I2C_IIDX_TARGET_TXFIFO_EMPTY = I2C_CPU_INT_IIDX_STAT_STXEMPTY,
/*! Interrupt index for I2C Target Start Condition detected */
DL_I2C_IIDX_TARGET_START = I2C_CPU_INT_IIDX_STAT_SSTARTFG,
/*! Interrupt index for I2C Target Stop Condition detected */
DL_I2C_IIDX_TARGET_STOP = I2C_CPU_INT_IIDX_STAT_SSTOPFG,
/*! Interrupt index for I2C General Call */
DL_I2C_IIDX_TARGET_GENERAL_CALL = I2C_CPU_INT_IIDX_STAT_SGENCALL,
/*! Interrupt index for I2C Target Event 1 DMA Done */
DL_I2C_IIDX_TARGET_EVENT1_DMA_DONE = I2C_CPU_INT_IIDX_STAT_SDMA_DONE_TX,
/*! Interrupt index for I2C Target Event 2 DMA Done */
DL_I2C_IIDX_TARGET_EVENT2_DMA_DONE = I2C_CPU_INT_IIDX_STAT_SDMA_DONE_RX,
/*! Interrupt index for I2C Target SMBus/PMBus PEC Receive Error Event */
DL_I2C_IIDX_TARGET_PEC_RX_ERROR = I2C_CPU_INT_IIDX_STAT_SPEC_RX_ERR,
/*! Interrupt index for I2C Target TX FIFO underflow event */
DL_I2C_IIDX_TARGET_TXFIFO_UNDERFLOW = I2C_CPU_INT_IIDX_STAT_STX_UNFL,
/*! Interrupt index for I2C Target RX FIFO overflow event */
DL_I2C_IIDX_TARGET_RXFIFO_OVERFLOW = I2C_CPU_INT_IIDX_STAT_SRX_OVFL,
/*! Interrupt index for I2C Target arbitration lost event */
DL_I2C_IIDX_TARGET_ARBITRATION_LOST = I2C_CPU_INT_IIDX_STAT_SARBLOST,
/*! Interrupt index for I2C interrupt overflow event */
DL_I2C_IIDX_INTERRUPT_OVERFLOW = I2C_CPU_INT_IIDX_STAT_INTR_OVFL,
} DL_I2C_IIDX;
/**
* @brief Configuration struct for @ref DL_I2C_setClockConfig.
*/
typedef struct {
/*! I2C module clock source. One of @ref DL_I2C_CLOCK */
DL_I2C_CLOCK clockSel;
/*! I2C clock divider selection. One of @ref DL_I2C_CLOCK_DIVIDE */
DL_I2C_CLOCK_DIVIDE divideRatio;
} DL_I2C_ClockConfig;
/**
* @brief Configure I2C source clock
*
* @param[in] i2c Pointer to the register overlay for the
* peripheral
* @param[in] config Pointer to the clock configuration struct
* @ref DL_I2C_ClockConfig.
*/
void DL_I2C_setClockConfig(I2C_Regs *i2c, const DL_I2C_ClockConfig *config);
/**
* @brief Get I2C source clock configuration
*
* @param[in] i2c Pointer to the register overlay for the
* peripheral
* @param[in] config Pointer to the clock configuration struct
* @ref DL_I2C_ClockConfig.
*/
void DL_I2C_getClockConfig(const I2C_Regs *i2c, DL_I2C_ClockConfig *config);
/**
* @brief Fills the controller TX FIFO with data
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] buffer Pointer to buffer of bytes
* @param[in] count Number of bytes to fill controller TX FIFO from buffer
*
* @return Number of bytes that were successfully written
*/
uint16_t DL_I2C_fillControllerTXFIFO(
I2C_Regs *i2c, const uint8_t *buffer, uint16_t count);
/**
* @brief Flushes/removes all elements in the controller TX FIFO
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
void DL_I2C_flushControllerTXFIFO(I2C_Regs *i2c);
/**
* @brief Flushes/removes all elements in the controller RX FIFO
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
void DL_I2C_flushControllerRXFIFO(I2C_Regs *i2c);
/**
* @brief Checks if controller TX FIFO is full
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If controller TX FIFO is full
*
* @retval true if controller TX FIFO is full
* @retval false if controller TX FIFO is not full
*/
__STATIC_INLINE bool DL_I2C_isControllerTXFIFOFull(const I2C_Regs *i2c)
{
return ((i2c->MASTER.MFIFOSR & I2C_MFIFOSR_TXFIFOCNT_MASK) ==
I2C_MFIFOSR_TXFIFOCNT_MINIMUM);
}
/**
* @brief Checks if controller TX FIFO is empty
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If controller TX FIFO is empty
*
* @retval true if controller TX FIFO is empty
* @retval false if controller TX FIFO is not empty
*/
__STATIC_INLINE bool DL_I2C_isControllerTXFIFOEmpty(const I2C_Regs *i2c)
{
return ((i2c->MASTER.MFIFOSR & I2C_MFIFOSR_TXFIFOCNT_MASK) ==
DL_I2C_TX_FIFO_COUNT_MAXIMUM);
}
/**
* @brief Checks if controller RX FIFO is empty
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If controller RX FIFO is empty
*
* @retval true if controller RX FIFO is empty
* @retval false if controller RX FIFO is not empty
*/
__STATIC_INLINE bool DL_I2C_isControllerRXFIFOEmpty(const I2C_Regs *i2c)
{
return ((i2c->MASTER.MFIFOSR & I2C_MFIFOSR_RXFIFOCNT_MASK) ==
I2C_MFIFOSR_RXFIFOCNT_MINIMUM);
}
/**
* @brief Reset transfers from from I2C controller
*
* Resets transfer register to initialize I2C
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_resetControllerTransfer(I2C_Regs *i2c)
{
// Resets all Controller functionality
i2c->MASTER.MCTR = 0x00;
}
/**
* @brief Sets up a transfer from I2C controller
*
* Set target address, transfer direction, burst length, START+STOP generation.
* @note Reading/writing data must be done separately.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] targetAddr Target address [0x00, 0x3FF]
* @param[in] direction One of @ref DL_I2C_CONTROLLER_DIRECTION
* @param[in] length Intended burst length in number of bytes
*/
__STATIC_INLINE void DL_I2C_startControllerTransfer(I2C_Regs *i2c,
uint32_t targetAddr, DL_I2C_CONTROLLER_DIRECTION direction,
uint16_t length)
{
// Specify target address and read/write mode
DL_Common_updateReg(&i2c->MASTER.MSA,
((targetAddr << I2C_MSA_SADDR_OFS) | (uint32_t) direction),
(I2C_MSA_SADDR_MASK | I2C_MSA_DIR_MASK));
// STOP bit is generated after burst length number of bytes transferred
DL_Common_updateReg(&i2c->MASTER.MCTR,
(((uint32_t) length << I2C_MCTR_MBLEN_OFS) | I2C_MCTR_BURSTRUN_ENABLE |
I2C_MCTR_START_ENABLE | I2C_MCTR_STOP_ENABLE),
(I2C_MCTR_MBLEN_MASK | I2C_MCTR_BURSTRUN_MASK | I2C_MCTR_START_MASK |
I2C_MCTR_STOP_MASK));
}
/**
* @brief Sets up a transfer from I2C controller with control of START,
* STOP and ACK
*
* @note Reading/writing data must be done separately.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] targetAddr 7-bit target address [0x00, 0x7f]
* @param[in] direction One of @ref DL_I2C_CONTROLLER_DIRECTION
* @param[in] length Intended burst length in number of bytes
* @param[in] start One of @ref DL_I2C_CONTROLLER_START
* @param[in] stop One of @ref DL_I2C_CONTROLLER_STOP
* @param[in] ack One of @ref DL_I2C_CONTROLLER_ACK
*/
__STATIC_INLINE void DL_I2C_startControllerTransferAdvanced(I2C_Regs *i2c,
uint32_t targetAddr, DL_I2C_CONTROLLER_DIRECTION direction,
uint16_t length, DL_I2C_CONTROLLER_START start,
DL_I2C_CONTROLLER_STOP stop, DL_I2C_CONTROLLER_ACK ack)
{
// Specify target address and read/write mode
DL_Common_updateReg(&i2c->MASTER.MSA,
((targetAddr << I2C_MSA_SADDR_OFS) | (uint32_t) direction),
(I2C_MSA_SADDR_MASK | I2C_MSA_DIR_MASK));
DL_Common_updateReg(&i2c->MASTER.MCTR,
(((uint32_t) length << I2C_MCTR_MBLEN_OFS) | I2C_MCTR_BURSTRUN_ENABLE |
(uint32_t) start | (uint32_t) stop | (uint32_t) ack),
(I2C_MCTR_MBLEN_MASK | I2C_MCTR_BURSTRUN_MASK | I2C_MCTR_START_MASK |
I2C_MCTR_STOP_MASK | I2C_MCTR_ACK_MASK));
}
/**
* @brief Checks if target TX FIFO is full
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If target TX FIFO is full
*
* @retval true if target TX FIFO is full
* @retval false if target TX FIFO is not full
*/
__STATIC_INLINE bool DL_I2C_isTargetTXFIFOFull(const I2C_Regs *i2c)
{
return ((i2c->SLAVE.SFIFOSR & I2C_SFIFOSR_TXFIFOCNT_MASK) ==
I2C_SFIFOSR_TXFIFOCNT_MINIMUM);
}
/**
* @brief Checks if target TX FIFO is empty
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If target TX FIFO is empty
*
* @retval true if target TX FIFO is empty
* @retval false if target TX FIFO is not empty
*/
__STATIC_INLINE bool DL_I2C_isTargetTXFIFOEmpty(const I2C_Regs *i2c)
{
return ((i2c->SLAVE.SFIFOSR & I2C_SFIFOSR_TXFIFOCNT_MASK) ==
DL_I2C_TX_FIFO_COUNT_MAXIMUM);
}
/**
* @brief Checks if target RX FIFO is empty
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If target RX FIFO is empty
*
* @retval true if target RX FIFO is empty
* @retval false if target RX FIFO is not empty
*/
__STATIC_INLINE bool DL_I2C_isTargetRXFIFOEmpty(const I2C_Regs *i2c)
{
return ((i2c->SLAVE.SFIFOSR & I2C_SFIFOSR_RXFIFOCNT_MASK) ==
I2C_SFIFOSR_RXFIFOCNT_MINIMUM);
}
/**
* @brief Fills the target TX FIFO with data
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] buffer Pointer to buffer of bytes
* @param[in] count Number of bytes to fill target TX FIFO from buffer
*
* @return Number of bytes that were successfully written
*/
uint8_t DL_I2C_fillTargetTXFIFO(
I2C_Regs *i2c, const uint8_t *buffer, uint8_t count);
/**
* @brief Flushes/removes all elements in the target TX FIFO
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
void DL_I2C_flushTargetTXFIFO(I2C_Regs *i2c);
/**
* @brief Flushes/removes all elements in the target RX FIFO
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
void DL_I2C_flushTargetRXFIFO(I2C_Regs *i2c);
/**
* @brief Transmit target data, waiting until transmit request
*
* @note Setting own target addresses and enabling target should be done
* separately.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] data Byte of data to transmit
*/
void DL_I2C_transmitTargetDataBlocking(I2C_Regs *i2c, uint8_t data);
/**
* @brief Transmit target data
*
* @note Setting own target addresses and enabling target should be done
* separately.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] data Byte of data to transmit
*
* @return Whether data could be transmitted or not
* @retval true if data could be transmitted
* @retval false if data could not be transmitted
*/
bool DL_I2C_transmitTargetDataCheck(I2C_Regs *i2c, uint8_t data);
/**
* @brief Receive target data, waiting until receive request
*
* @note Setting own target addresses and enabling target should be done
* separately.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return Data received from target
*/
uint8_t DL_I2C_receiveTargetDataBlocking(const I2C_Regs *i2c);
/**
* @brief Receive target data
*
* @note Setting own target addresses and enabling target should be done
* separately.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] buffer Pointer to where byte of received data should be stored
*
* @return Whether data could be received or not
* @retval true if data could be received
* @retval false if data could not be received
*/
bool DL_I2C_receiveTargetDataCheck(const I2C_Regs *i2c, uint8_t *buffer);
/**
* @brief Enables the Peripheral Write Enable (PWREN) register for the I2C
*
* Before any peripheral registers can be configured by software, the
* peripheral itself must be enabled by writing the ENABLE bit together with
* the appropriate KEY value to the peripheral's PWREN register.
*
* @param i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_enablePower(I2C_Regs *i2c)
{
i2c->GPRCM.PWREN = (I2C_PWREN_KEY_UNLOCK_W | I2C_PWREN_ENABLE_ENABLE);
}
/**
* @brief Disables the Peripheral Write Enable (PWREN) register for the I2C
*
* When the PWREN.ENABLE bit is cleared, the peripheral's registers are not
* accessible for read/write operations.
*
* @note This API does not provide large power savings.
*
* @param i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disablePower(I2C_Regs *i2c)
{
i2c->GPRCM.PWREN = (I2C_PWREN_KEY_UNLOCK_W | I2C_PWREN_ENABLE_DISABLE);
}
/**
* @brief Returns if the Peripheral Write Enable (PWREN) register for the I2C
* is enabled
*
* Before any peripheral registers can be configured by software, the
* peripheral itself must be enabled by writing the ENABLE bit together with
* the appropriate KEY value to the peripheral's PWREN register.
*
* When the PWREN.ENABLE bit is cleared, the peripheral's registers are not
* accessible for read/write operations.
*
* @param i2c Pointer to the register overlay for the peripheral
*
* @return true if peripheral register access is enabled
* @return false if peripheral register access is disabled
*/
__STATIC_INLINE bool DL_I2C_isPowerEnabled(const I2C_Regs *i2c)
{
return (
(i2c->GPRCM.PWREN & I2C_PWREN_ENABLE_MASK) == I2C_PWREN_ENABLE_ENABLE);
}
/**
* @brief Resets i2c peripheral
*
* @param i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_reset(I2C_Regs *i2c)
{
i2c->GPRCM.RSTCTL =
(I2C_RSTCTL_KEY_UNLOCK_W | I2C_RSTCTL_RESETSTKYCLR_CLR |
I2C_RSTCTL_RESETASSERT_ASSERT);
}
/**
* @brief Returns if i2c peripheral was reset
*
* @param i2c Pointer to the register overlay for the peripheral
*
* @return true if peripheral was reset
* @return false if peripheral wasn't reset
*
*/
__STATIC_INLINE bool DL_I2C_isReset(const I2C_Regs *i2c)
{
return ((i2c->GPRCM.STAT & I2C_STAT_RESETSTKY_MASK) ==
I2C_STAT_RESETSTKY_RESET);
}
/**
* @brief Set Clock Source
*
* Clock sources depend on device and clock should be enabled
*
* @param[in] i2c Pointer to the register overlay for the
* peripheral
* @param[in] clockSource One of @ref DL_I2C_CLOCK.
*
*/
__STATIC_INLINE void DL_I2C_selectClockSource(
I2C_Regs *i2c, DL_I2C_CLOCK clockSource)
{
DL_Common_updateReg(&i2c->CLKSEL, (uint32_t) clockSource,
I2C_CLKSEL_BUSCLK_SEL_MASK | I2C_CLKSEL_MFCLK_SEL_MASK);
}
/**
* @brief Set Clock Divider
*
* @param[in] i2c Pointer to the register overlay for the
* peripheral
* @param[in] clockDivider One of @ref DL_I2C_CLOCK_DIVIDE.
*
*/
__STATIC_INLINE void DL_I2C_selectClockDivider(
I2C_Regs *i2c, DL_I2C_CLOCK_DIVIDE clockDivider)
{
DL_Common_updateReg(
&i2c->CLKDIV, (uint32_t) clockDivider, I2C_CLKDIV_RATIO_MASK);
}
/**
* @brief Get Analog Glitch Suppression Pulse Width
*
* Pulse width for the analog glitch suppression on SCL/SDA lines.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return Analog glitch suppression pulse width
*
* @retval One of @ref DL_I2C_ANALOG_GLITCH_FILTER_WIDTH.
*/
__STATIC_INLINE DL_I2C_ANALOG_GLITCH_FILTER_WIDTH
DL_I2C_getAnalogGlitchFilterPulseWidth(const I2C_Regs *i2c)
{
uint32_t filterWidth = i2c->GFCTL & I2C_GFCTL_AGFSEL_MASK;
return (DL_I2C_ANALOG_GLITCH_FILTER_WIDTH)(filterWidth);
}
/**
* @brief Set Analog Glitch Suppression Pulse Width
*
* Pulse width for the analog glitch suppression on SCL/SDA lines.
*
* @param[in] i2c Pointer to the register overlay for the
* peripheral
* @param[in] filterWidth One of @ref DL_I2C_ANALOG_GLITCH_FILTER_WIDTH.
*/
__STATIC_INLINE void DL_I2C_setAnalogGlitchFilterPulseWidth(
I2C_Regs *i2c, DL_I2C_ANALOG_GLITCH_FILTER_WIDTH filterWidth)
{
DL_Common_updateReg(
&i2c->GFCTL, (uint32_t) filterWidth, I2C_GFCTL_AGFSEL_MASK);
}
/**
* @brief Get Digital Glitch Suppression Pulse Width
*
* Pulse width for the digital glitch suppression on SCL/SDA lines.
* Values are in terms of functional clock ticks.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return Digital glitch suppression pulse width
*
* @retval One of @ref DL_I2C_DIGITAL_GLITCH_FILTER_WIDTH.
*/
__STATIC_INLINE DL_I2C_DIGITAL_GLITCH_FILTER_WIDTH
DL_I2C_getDigitalGlitchFilterPulseWidth(const I2C_Regs *i2c)
{
uint32_t filterWidth = i2c->GFCTL & I2C_GFCTL_DGFSEL_MASK;
return (DL_I2C_DIGITAL_GLITCH_FILTER_WIDTH)(filterWidth);
}
/**
* @brief Set Digital Glitch Suppression Pulse Width
*
* Pulse width for the digital glitch suppression on SCL/SDA lines.
* Values are in terms of functional clock ticks.
*
* @param[in] i2c Pointer to the register overlay for the
* peripheral
* @param[in] filterWidth One of @ref DL_I2C_DIGITAL_GLITCH_FILTER_WIDTH.
*/
__STATIC_INLINE void DL_I2C_setDigitalGlitchFilterPulseWidth(
I2C_Regs *i2c, DL_I2C_DIGITAL_GLITCH_FILTER_WIDTH filterWidth)
{
DL_Common_updateReg(
&i2c->GFCTL, (uint32_t) filterWidth, I2C_GFCTL_DGFSEL_MASK);
}
/**
* @brief Disable Analog Glitch Suppression
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableAnalogGlitchFilter(I2C_Regs *i2c)
{
i2c->GFCTL &= ~(I2C_GFCTL_AGFEN_MASK);
}
/**
* @brief Checks if analog glitch suppression is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If analog glitch suppression is enabled
*
* @retval true if analog glitch suppression is enabled
* @retval false if analog glitch suppression is disabled
*/
__STATIC_INLINE bool DL_I2C_isAnalogGlitchFilterEnabled(const I2C_Regs *i2c)
{
return ((i2c->GFCTL & I2C_GFCTL_AGFEN_MASK) == I2C_GFCTL_AGFEN_ENABLE);
}
/**
* @brief Enable Analog Glitch Suppression
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_enableAnalogGlitchFilter(I2C_Regs *i2c)
{
i2c->GFCTL |= I2C_GFCTL_AGFEN_ENABLE;
}
/**
* @brief Get direction of next controller operation
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return Direction of next controller operation
*
* @retval One of @ref DL_I2C_CONTROLLER_DIRECTION
*/
__STATIC_INLINE DL_I2C_CONTROLLER_DIRECTION DL_I2C_getControllerDirection(
const I2C_Regs *i2c)
{
uint32_t direction = i2c->MASTER.MSA & I2C_MSA_DIR_MASK;
return (DL_I2C_CONTROLLER_DIRECTION)(direction);
}
/**
* @brief Set direction of next controller operation
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @param[in] direction Direction of next controller operation.
* One of @ref DL_I2C_CONTROLLER_DIRECTION.
*/
__STATIC_INLINE void DL_I2C_setControllerDirection(
I2C_Regs *i2c, DL_I2C_CONTROLLER_DIRECTION direction)
{
DL_Common_updateReg(
&i2c->MASTER.MSA, (uint32_t) direction, I2C_MSA_DIR_MASK);
}
/**
* @brief Get the address of the target being addressed when configured
* as an I2C controller
*
* Specifies bits A9 through A0 of the target address.
* In 7-bit addressing mode as selected by @ref DL_I2C_setTargetAddressingMode,
* the top 3 bits are don't care.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return The target address
*
* @retval [0x00, 0x07FE]
*
* @sa DL_I2C_setTargetAddressingMode
*/
__STATIC_INLINE uint32_t DL_I2C_getTargetAddress(const I2C_Regs *i2c)
{
return ((i2c->MASTER.MSA & I2C_MSA_SADDR_MASK) >> I2C_MSA_SADDR_OFS);
}
/**
* @brief Set the address of the target being addressed when configured
* as an I2C controller
*
* Specifies bits A9 through A0 of the target address.
* In 7-bit addressing mode as selected by @ref DL_I2C_setTargetAddressingMode,
* the top 3 bits are don't care.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] targetAddress Target address to set [0x00, 0x07FE]
*
* @sa DL_I2C_setTargetAddressingMode
*/
__STATIC_INLINE void DL_I2C_setTargetAddress(
I2C_Regs *i2c, uint32_t targetAddress)
{
DL_Common_updateReg(&i2c->MASTER.MSA, (targetAddress << I2C_MSA_SADDR_OFS),
I2C_MSA_SADDR_MASK);
}
/**
* @brief Get controller addressing mode
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return Addressing mode the controller is set to
*
* @retval One of @ref DL_I2C_CONTROLLER_ADDRESSING_MODE
*
*/
__STATIC_INLINE DL_I2C_CONTROLLER_ADDRESSING_MODE
DL_I2C_getControllerAddressingMode(const I2C_Regs *i2c)
{
uint32_t mode = i2c->MASTER.MSA & I2C_MSA_MMODE_MASK;
return (DL_I2C_CONTROLLER_ADDRESSING_MODE)(mode);
}
/**
* @brief Set controller addressing mode between 7-bit and 10-bit mode
*
* Selects the addressing mode between 7-bit and 10-bit mode to be used when
* device is configured as a controller
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] mode Addressing mode to set the target to.
* One of @ref DL_I2C_CONTROLLER_ADDRESSING_MODE.
*/
__STATIC_INLINE void DL_I2C_setControllerAddressingMode(
I2C_Regs *i2c, DL_I2C_CONTROLLER_ADDRESSING_MODE mode)
{
DL_Common_updateReg(&i2c->MASTER.MSA, (uint32_t) mode, I2C_MSA_MMODE_MASK);
}
/**
* @brief Disable controller ACK override
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableControllerACKOverride(I2C_Regs *i2c)
{
i2c->MASTER.MCTR &= ~(I2C_MCTR_MACKOEN_MASK);
}
/**
* @brief Checks if controller ACK override is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If controller ACK override is enabled
*
* @retval true if controller ACK override is enabled
* @retval false if controller ACK override is disabled
*/
__STATIC_INLINE bool DL_I2C_isControllerACKOverrideEnabled(const I2C_Regs *i2c)
{
return (
(i2c->MASTER.MCTR & I2C_MCTR_MACKOEN_MASK) == I2C_MCTR_MACKOEN_ENABLE);
}
/**
* @brief Enable controller ACK override
*
* When enabled and the controller is receiving data and the number of bytes
* indicated in MCTR.MBLEN have been received, the state machine will generate
* an RXDONE interrupt and wait at the start of the ACK for FW to indicate if
* an ACK or NACK should be sent. The ACK or NACK is selected by writing the
* MCTR register and setting ACK accordingly. The other fields in this register
* can also be written at this time to continue on with the transaction. If a
* NACK is sent the state machine will automatically send a Stop.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @sa DL_I2C_setTransactionLength
*/
__STATIC_INLINE void DL_I2C_enableControllerACKOverride(I2C_Regs *i2c)
{
i2c->MASTER.MCTR |= I2C_MCTR_MACKOEN_ENABLE;
}
/**
* @brief Disable controller read on TX empty
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableControllerReadOnTXEmpty(I2C_Regs *i2c)
{
i2c->MASTER.MCTR &= ~(I2C_MCTR_RD_ON_TXEMPTY_MASK);
}
/**
* @brief Checks if controller read on TX empty is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If controller read on TX empty is enabled
*
* @retval true if controller read on TX empty is enabled
* @retval false if controller read on TX empty is disabled
*/
__STATIC_INLINE bool DL_I2C_isControllerReadOnTXEmptyEnabled(
const I2C_Regs *i2c)
{
return ((i2c->MASTER.MCTR & I2C_MCTR_RD_ON_TXEMPTY_MASK) ==
I2C_MCTR_RD_ON_TXEMPTY_ENABLE);
}
/**
* @brief Enable controller read on TX empty
*
* When enabled, the controller will transmit all bytes from the TX FIFO
* before continuing with the programmed Burst Run Read. If the DIR is not
* set to Read in the MSA then this bit is ignored. The Start must be set in
* the MCTR for proper I2C protocol. The controller will first send the Start
* Condition, I2C Address with R/W bit set to write, before sending the bytes
* in the TX FIFO. When the TX FIFO is empty, the I2C transaction will
* continue as programmed in MTCR and MSA without sending a Stop Condition.
* This is intended to be used to perform simple I2C command based reads
* transition that will complete after initiating them without having to get
* an interrupt to turn the bus around.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
*/
__STATIC_INLINE void DL_I2C_enableControllerReadOnTXEmpty(I2C_Regs *i2c)
{
i2c->MASTER.MCTR |= I2C_MCTR_RD_ON_TXEMPTY_ENABLE;
}
/**
* @brief Get the SMBus/PMBus Packet Error Checking (PEC) count value
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return The value the PEC count is set to
*
* @retval Value between [0x0, 0x01FF]
*/
__STATIC_INLINE uint32_t DL_I2C_getControllerPECCountValue(const I2C_Regs *i2c)
{
return (i2c->MASTER.CONTROLLER_I2CPECCTL &
I2C_CONTROLLER_I2CPECCTL_PECCNT_MASK);
}
/**
* @brief Set the SMBus/PMBus Packet Error Checking (PEC) count value
*
* When this field is non zero, the number of I2C data bytes are counted.
* Refer to the device TRM for more details.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] count The value to set the PEC count to.
* Value between [0x0, 0x01FF]
*/
__STATIC_INLINE void DL_I2C_setControllerPECCountValue(
I2C_Regs *i2c, uint32_t count)
{
DL_Common_updateReg(&i2c->MASTER.CONTROLLER_I2CPECCTL, count,
I2C_CONTROLLER_I2CPECCTL_PECCNT_MASK);
}
/**
* @brief Disable controller SMBus/PMBus Packet Error Checking (PEC)
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableControllerPEC(I2C_Regs *i2c)
{
i2c->MASTER.CONTROLLER_I2CPECCTL &= ~(I2C_CONTROLLER_I2CPECCTL_PECEN_MASK);
}
/**
* @brief Checks if controller SMBus/PMBus Packet Error Checking (PEC)
* is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If controller PEC is enabled
*
* @retval true if controller PEC is enabled
* @retval false if controller PEC is disabled
*/
__STATIC_INLINE bool DL_I2C_isControllerPECEnabled(const I2C_Regs *i2c)
{
return ((i2c->MASTER.CONTROLLER_I2CPECCTL &
I2C_CONTROLLER_I2CPECCTL_PECEN_MASK) ==
I2C_CONTROLLER_I2CPECCTL_PECEN_ENABLE);
}
/**
* @brief Enable controller SMBus/PMBus Packet Error Checking (PEC)
*
* When enabled, the PEC is calculated on all bits accept the Start, Stop, ACK
* and NACK. The PEC LSFR and the Byte Counter is set to 0 when the State
* Machine is in the IDLE state, which occurs following a Stop or when a
* timeout occurs. The Counter is also set to 0 after the PEC byte is sent or
* received. Note that the NACK is automatically sent following a PEC byte
* that results in a PEC error.
* The PEC Polynomial is x^8 + x^2 + x^1 + 1.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
*/
__STATIC_INLINE void DL_I2C_enableControllerPEC(I2C_Regs *i2c)
{
i2c->MASTER.CONTROLLER_I2CPECCTL |= I2C_CONTROLLER_I2CPECCTL_PECEN_ENABLE;
}
/**
* @brief Get the current SMBus/PMBus PEC byte count of the controller
* state machine
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return The current PEC byte count of the controller state machine
*
* @retval Value between [0x0, 0x01FF]
*/
__STATIC_INLINE uint32_t DL_I2C_getControllerCurrentPECCount(
const I2C_Regs *i2c)
{
return (
i2c->MASTER.CONTROLLER_PECSR & I2C_CONTROLLER_PECSR_PECSTS_CHECK_MASK);
}
/**
* @brief If controller SMBus/PMBus PEC was checked in last transaction
*
* The status of if the controller PEC was checked in the transaction that
* occurred before the last Stop. Latched on Stop.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return Status of controller PEC checked in last transaction
*
* @retval One of @ref DL_I2C_CONTROLLER_PEC_STATUS
*/
__STATIC_INLINE DL_I2C_CONTROLLER_PEC_STATUS
DL_I2C_getControllerPECCheckedStatus(const I2C_Regs *i2c)
{
uint32_t status =
i2c->MASTER.CONTROLLER_PECSR & I2C_CONTROLLER_PECSR_PECSTS_CHECK_MASK;
return (DL_I2C_CONTROLLER_PEC_STATUS)(status);
}
/**
* @brief Get the status of the controller SMBus/PMBus PEC Check error
*
* The status of if a PEC check error occurred in the transaction that
* occurred before the last Stop. Latched on Stop.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return Status of controller PEC check error
*
* @retval One of @ref DL_I2C_CONTROLLER_PEC_CHECK_ERROR
*/
__STATIC_INLINE DL_I2C_CONTROLLER_PEC_CHECK_ERROR
DL_I2C_getControllerPECCheckError(const I2C_Regs *i2c)
{
uint32_t error =
i2c->MASTER.CONTROLLER_PECSR & I2C_CONTROLLER_PECSR_PECSTS_ERROR_MASK;
return (DL_I2C_CONTROLLER_PEC_CHECK_ERROR)(error);
}
/**
* @brief Disable I2C controller burst mode
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableControllerBurst(I2C_Regs *i2c)
{
i2c->MASTER.MCTR &= ~(I2C_MCTR_BURSTRUN_MASK);
}
/**
* @brief Checks if I2C controller burst mode is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If I2C controller burst mode is enabled
*
* @retval true if I2C controller burst mode is enabled
* @retval false if I2C controller burst mode is disabled
*/
__STATIC_INLINE bool DL_I2C_isControllerBurstEnabled(const I2C_Regs *i2c)
{
return ((i2c->GFCTL & I2C_MCTR_BURSTRUN_MASK) == I2C_MCTR_BURSTRUN_ENABLE);
}
/**
* @brief Enable I2C controller burst mode
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_enableControllerBurst(I2C_Regs *i2c)
{
i2c->MASTER.MCTR |= I2C_MCTR_BURSTRUN_ENABLE;
}
/**
* @brief Disable I2C START generation
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableStartCondition(I2C_Regs *i2c)
{
i2c->MASTER.MCTR &= ~(I2C_MCTR_START_MASK);
}
/**
* @brief Checks if I2C START generation is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If I2C START generation is enabled
*
* @retval true if I2C START generation is enabled
* @retval false if I2C START generation is disabled
*/
__STATIC_INLINE bool DL_I2C_isStartConditionEnabled(const I2C_Regs *i2c)
{
return ((i2c->MASTER.MCTR & I2C_MCTR_START_MASK) == I2C_MCTR_START_ENABLE);
}
/**
* @brief Enable I2C START generation
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_enableStartCondition(I2C_Regs *i2c)
{
i2c->MASTER.MCTR |= I2C_MCTR_START_ENABLE;
}
/**
* @brief Disable I2C STOP generation
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableStopCondition(I2C_Regs *i2c)
{
i2c->MASTER.MCTR &= ~(I2C_MCTR_STOP_MASK);
}
/**
* @brief Checks if I2C STOP generation is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If I2C STOP generation is enabled
*
* @retval true if I2C STOP generation is enabled
* @retval false if I2C STOP generation is disabled
*/
__STATIC_INLINE bool DL_I2C_isStopConditionEnabled(const I2C_Regs *i2c)
{
return ((i2c->MASTER.MCTR & I2C_MCTR_STOP_MASK) == I2C_MCTR_STOP_ENABLE);
}
/**
* @brief Enable I2C STOP generation
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_enableStopCondition(I2C_Regs *i2c)
{
i2c->MASTER.MCTR |= I2C_MCTR_STOP_ENABLE;
}
/**
* @brief Disable I2C controller data acknowledge (ACK or NACK)
*
* When the I2C module operates in Controller receiver mode, the ACK bit can be
* cleared when no further data needs to be received from the target
* transmitter.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableControllerACK(I2C_Regs *i2c)
{
i2c->MASTER.MCTR &= ~(I2C_MCTR_ACK_MASK);
}
/**
* @brief Checks if I2C controller data acknowledge (ACK or NACK) is
* enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If I2C controller data acknowledge is enabled
*
* @retval true if I2C controller data acknowledge is enabled
* @retval false if I2C controller data acknowledge is disabled
*/
__STATIC_INLINE bool DL_I2C_isControllerACKEnabled(const I2C_Regs *i2c)
{
return ((i2c->MASTER.MCTR & I2C_MCTR_ACK_MASK) == I2C_MCTR_ACK_ENABLE);
}
/**
* @brief Enable I2C controller data acknowledge (ACK or NACK)
*
* When the I2C module operates in Controller receiver mode, the ACK bit is
* normally set causing the I2C bus controller to transmit an acknowledge
* automatically after each byte.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_enableControllerACK(I2C_Regs *i2c)
{
i2c->MASTER.MCTR |= I2C_MCTR_ACK_MASK;
}
/**
* @brief Get transaction length in bytes
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return Length of I2C transaction in bytes
*
* @retval [0x000, 0xfff]
*/
__STATIC_INLINE uint32_t DL_I2C_getTransactionLength(const I2C_Regs *i2c)
{
return ((i2c->MASTER.MCTR & I2C_MCTR_MBLEN_MASK) >> I2C_MCTR_MBLEN_OFS);
}
/**
* @brief Set transaction length in bytes
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @param[in] length Length of I2C transaction in bytes [0x000, 0xfff]
*/
__STATIC_INLINE void DL_I2C_setTransactionLength(
I2C_Regs *i2c, uint32_t length)
{
DL_Common_updateReg(&i2c->MASTER.MCTR, (length << I2C_MCTR_MBLEN_OFS),
I2C_MCTR_MBLEN_MASK);
}
/**
* @brief Get status of I2C bus controller for controller
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return Status of I2C bus controller for controller
*
* @retval Bitwise OR of @ref DL_I2C_CONTROLLER_STATUS
*/
__STATIC_INLINE uint32_t DL_I2C_getControllerStatus(const I2C_Regs *i2c)
{
return (i2c->MASTER.MSR);
}
/**
* @brief Get transaction count in bytes
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return Current 12-bit countdown value of the transaction
*
* @retval [0x000, 0xfff]
*/
__STATIC_INLINE uint16_t DL_I2C_getTransactionCount(const I2C_Regs *i2c)
{
return ((uint16_t)(
(i2c->MASTER.MSR & I2C_MSR_MBCNT_MASK) >> I2C_MSR_MBCNT_OFS));
}
/**
* @brief Get byte of data from I2C controller
*
* If using FIFO, it is first byte from the RX FIFO.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return Last received byte of data
*
* @retval [0x00, 0xff]
*/
__STATIC_INLINE uint8_t DL_I2C_receiveControllerData(const I2C_Regs *i2c)
{
return ((uint8_t)(i2c->MASTER.MRXDATA & I2C_MRXDATA_VALUE_MASK));
}
/**
* @brief Set next byte to be transferred during the next transaction
*
* Does not transmit data until @ref DL_I2C_startControllerTransfer
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] data Data to be transferred during the next transaction.
* [0x00, 0xff]
*/
__STATIC_INLINE void DL_I2C_transmitControllerData(I2C_Regs *i2c, uint8_t data)
{
i2c->MASTER.MTXDATA = data;
}
/**
* @brief Get timer period
* This field is used in the equation to configure SCL_PERIOD:
*
* SCL_PERIOD = (1 + TPR) * (SCL_LP + SCL_HP) * INT_CLK_PRD
*
* where:
* SCL_PRD is the SCL line period (I2C clock)
*
* TPR is the Timer Period register value (range of 1 to 127)
*
* SCL_LP is the SCL Low period (fixed at 6)
* SCL_HP is the SCL High period (fixed at 4)
*
* CLK_PRD is the functional clock period in ns
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @return Timer period
*
* @retval [0x00, 0x7f]
*/
__STATIC_INLINE uint8_t DL_I2C_getTimerPeriod(const I2C_Regs *i2c)
{
return ((uint8_t)(i2c->MASTER.MTPR & I2C_MTPR_TPR_MASK));
}
/**
* @brief Set timer period
* This field is used in the equation to configure SCL_PERIOD:
*
* SCL_PERIOD = (1 + TPR) * (SCL_LP + SCL_HP) * INT_CLK_PRD
*
* where:
* SCL_PRD is the SCL line period (I2C clock)
*
* TPR is the Timer Period register value (range of 1 to 127)
*
* SCL_LP is the SCL Low period (fixed at 6)
* SCL_HP is the SCL High period (fixed at 4)
*
* CLK_PRD is the functional clock period in ns
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] period Timer period [0x00, 0x7f]
*/
__STATIC_INLINE void DL_I2C_setTimerPeriod(I2C_Regs *i2c, uint8_t period)
{
i2c->MASTER.MTPR = period;
}
/**
* @brief Disable loopback mode
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableLoopbackMode(I2C_Regs *i2c)
{
i2c->MASTER.MCR &= ~(I2C_MCR_LPBK_MASK);
}
/**
* @brief Checks if loopback mode is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If loopback mode is enabled
*
* @retval true if loopback mode is enabled
* @retval false if loopback mode is disabled
*/
__STATIC_INLINE bool DL_I2C_isLoopbackModeEnabled(const I2C_Regs *i2c)
{
return ((i2c->MASTER.MCR & I2C_MCR_LPBK_MASK) == I2C_MCR_LPBK_ENABLE);
}
/**
* @brief Enable loopback mode
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_enableLoopbackMode(I2C_Regs *i2c)
{
i2c->MASTER.MCR |= I2C_MCR_LPBK_ENABLE;
}
/**
* @brief Disable multicontroller mode
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableMultiControllerMode(I2C_Regs *i2c)
{
i2c->MASTER.MCR &= ~(I2C_MCR_MMST_MASK);
}
/**
* @brief Checks if multicontroller mode is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If multicontroller mode is enabled
*
* @retval true if multicontroller mode is enabled
* @retval false if multicontroller mode is disabled
*/
__STATIC_INLINE bool DL_I2C_isMultiControllerModeEnabled(const I2C_Regs *i2c)
{
return ((i2c->MASTER.MCR & I2C_MCR_MMST_MASK) == I2C_MCR_MMST_ENABLE);
}
/**
* @brief Enable multicontroller mode
*
* In multicontroller mode, the SCL high time counts once the SCL line has been
* detected high. If this is not enabled, the high time counts as soon as the
* SCL line has been set high by the I2C controller
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_enableMultiControllerMode(I2C_Regs *i2c)
{
i2c->MASTER.MCR |= I2C_MCR_MMST_ENABLE;
}
/**
* @brief Disable controller
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableController(I2C_Regs *i2c)
{
i2c->MASTER.MCR &= ~(I2C_MCR_ACTIVE_MASK);
}
/**
* @brief Checks if controller is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If controller is enabled
*
* @retval true if controller is enabled
* @retval false if controller is disabled
*/
__STATIC_INLINE bool DL_I2C_isControllerEnabled(const I2C_Regs *i2c)
{
return ((i2c->MASTER.MCR & I2C_MCR_ACTIVE_MASK) == I2C_MCR_ACTIVE_ENABLE);
}
/**
* @brief Enable controller
*
* After controller has enabled, it should not be re-enabled unless it has been
* disabled or by a reset, otherwise transfer failures may occur.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_enableController(I2C_Regs *i2c)
{
i2c->MASTER.MCR |= I2C_MCR_ACTIVE_ENABLE;
}
/**
* @brief Disable controller clock stretching
*
* Clock stretching can be disabled if no target on the bus supports clock
* stretching; however, it should be typically enabled to be compliant with
* I2C specification.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableControllerClockStretching(I2C_Regs *i2c)
{
i2c->MASTER.MCR &= ~(I2C_MCR_CLKSTRETCH_MASK);
}
/**
* @brief Checks if controller clock stretching is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If controller clock stretching is enabled
*
* @retval true if controller clock stretching is enabled
* @retval false if controller clock stretching is disabled
*/
__STATIC_INLINE bool DL_I2C_isControllerClockStretchingEnabled(
const I2C_Regs *i2c)
{
return ((i2c->MASTER.MCR & I2C_MCR_CLKSTRETCH_MASK) ==
I2C_MCR_CLKSTRETCH_ENABLE);
}
/**
* @brief Enable controller clock stretching
*
* Clock stretching can be disabled if no target on the bus supports clock
* stretching; however, it should be typically enabled to be compliant with I2C
* specification.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_enableControllerClockStretching(I2C_Regs *i2c)
{
i2c->MASTER.MCR |= I2C_MCR_CLKSTRETCH_ENABLE;
}
/**
* @brief Get SCL signal status
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return Status of SCL signal
*
* @retval One of @ref DL_I2C_CONTROLLER_SCL
*/
__STATIC_INLINE DL_I2C_CONTROLLER_SCL DL_I2C_getSCLStatus(const I2C_Regs *i2c)
{
uint32_t sclStatus = i2c->MASTER.MBMON & I2C_MBMON_SCL_MASK;
return (DL_I2C_CONTROLLER_SCL)(sclStatus);
}
/**
* @brief Get SDA signal status
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return Status of SDA signal
*
* @retval One of @ref DL_I2C_CONTROLLER_SDA
*/
__STATIC_INLINE DL_I2C_CONTROLLER_SDA DL_I2C_getSDAStatus(const I2C_Regs *i2c)
{
uint32_t sdaStatus = i2c->MASTER.MBMON & I2C_MBMON_SDA_MASK;
return (DL_I2C_CONTROLLER_SDA)(sdaStatus);
}
/**
* @brief Get controller TX FIFO threshold level
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @return Indicates at what fill level in the TX FIFO a threshold will be
* generated
*
* @retval One of @ref DL_I2C_TX_FIFO_LEVEL
*/
__STATIC_INLINE DL_I2C_TX_FIFO_LEVEL DL_I2C_getControllerTXFIFOThreshold(
const I2C_Regs *i2c)
{
uint32_t level = i2c->MASTER.MFIFOCTL & I2C_MFIFOCTL_TXTRIG_MASK;
return (DL_I2C_TX_FIFO_LEVEL)(level);
}
/**
* @brief Set controller TX FIFO threshold level
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] level Indicates at what fill level in the TX FIFO a threshold
* will be generated.
* One of @ref DL_I2C_TX_FIFO_LEVEL.
*/
__STATIC_INLINE void DL_I2C_setControllerTXFIFOThreshold(
I2C_Regs *i2c, DL_I2C_TX_FIFO_LEVEL level)
{
DL_Common_updateReg(
&i2c->MASTER.MFIFOCTL, (uint32_t) level, I2C_MFIFOCTL_TXTRIG_MASK);
}
/**
* @brief Stop controller TX FIFO flush
*
* Before stopping the flush, check if @ref DL_I2C_isControllerTXFIFOEmpty,
* indicating flush is complete.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_stopFlushControllerTXFIFO(I2C_Regs *i2c)
{
i2c->MASTER.MFIFOCTL &= ~(I2C_MFIFOCTL_TXFLUSH_MASK);
}
/**
* @brief Start controller TX FIFO flush
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_startFlushControllerTXFIFO(I2C_Regs *i2c)
{
i2c->MASTER.MFIFOCTL |= I2C_MFIFOCTL_TXFLUSH_MASK;
}
/**
* @brief Get controller RX FIFO threshold level
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @return Indicates at what fill level in the RX FIFO a threshold will be
* generated
*
* @retval One of @ref DL_I2C_RX_FIFO_LEVEL
*/
__STATIC_INLINE DL_I2C_RX_FIFO_LEVEL DL_I2C_getControllerRXFIFOThreshold(
const I2C_Regs *i2c)
{
uint32_t level = i2c->MASTER.MFIFOCTL & I2C_MFIFOCTL_RXTRIG_MASK;
return (DL_I2C_RX_FIFO_LEVEL)(level);
}
/**
* @brief Set controller RX FIFO threshold level
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] level Indicates at what fill level in the RX FIFO a threshold
* will be generated.
* One of @ref DL_I2C_RX_FIFO_LEVEL.
*/
__STATIC_INLINE void DL_I2C_setControllerRXFIFOThreshold(
I2C_Regs *i2c, DL_I2C_RX_FIFO_LEVEL level)
{
DL_Common_updateReg(
&i2c->MASTER.MFIFOCTL, (uint32_t) level, I2C_MFIFOCTL_RXTRIG_MASK);
}
/**
* @brief Stop controller RX FIFO flush
*
* Before stopping the flush, check if @ref DL_I2C_isControllerRXFIFOEmpty,
* indicating flush is complete.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_stopFlushControllerRXFIFO(I2C_Regs *i2c)
{
i2c->MASTER.MFIFOCTL &= ~(I2C_MFIFOCTL_RXFLUSH_MASK);
}
/**
* @brief Start controller RX FIFO flush
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_startFlushControllerRXFIFO(I2C_Regs *i2c)
{
i2c->MASTER.MFIFOCTL |= I2C_MFIFOCTL_RXFLUSH_MASK;
}
/**
* @brief Get number of bytes which can be read from RX FIFO
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return Number of bytes which can be read from RX FIFO
*
* @retval [0x0, 0x8]
*/
__STATIC_INLINE uint32_t DL_I2C_getControllerRXFIFOCounter(const I2C_Regs *i2c)
{
return (i2c->MASTER.MFIFOSR & I2C_MFIFOSR_RXFIFOCNT_MASK);
}
/**
* @brief Get number of bytes which can be put into TX FIFO
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return Number of bytes which can be put into TX FIFO
*
* @retval [0x0, 0x8]
*/
__STATIC_INLINE uint32_t DL_I2C_getControllerTXFIFOCounter(const I2C_Regs *i2c)
{
return ((i2c->MASTER.MFIFOSR & I2C_MFIFOSR_TXFIFOCNT_MASK) >>
I2C_MFIFOSR_TXFIFOCNT_OFS);
}
/**
* @brief Checks if controller RX FIFO flush is active
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If controller RX FIFO flush is active
*
* @retval true if controller RX FIFO flush is active
* @retval false if controller RX FIFO flush is not active
*/
__STATIC_INLINE bool DL_I2C_isControllerRXFIFOFlushActive(const I2C_Regs *i2c)
{
return ((i2c->MASTER.MFIFOSR & I2C_MFIFOSR_RXFLUSH_MASK) ==
I2C_MFIFOSR_RXFLUSH_ACTIVE);
}
/**
* @brief Checks if controller TX FIFO flush is active
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If controller TX FIFO flush is active
*
* @retval true if controller TX FIFO flush is active
* @retval false if controller TX FIFO flush is not active
*/
__STATIC_INLINE bool DL_I2C_isControllerTXFIFOFlushActive(const I2C_Regs *i2c)
{
return ((i2c->MASTER.MFIFOSR & I2C_MFIFOSR_TXFLUSH_MASK) ==
I2C_MFIFOSR_TXFLUSH_ACTIVE);
}
/**
* @brief Set target own address
*
* This field specifies bits A9 through A0 of the target own address.
*
* In 7-bit addressing mode as selected by @ref DL_I2C_setTargetAddressingMode,
* the top 3 bits are don't care
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] addr Value of target own address [0x00, 0x3FF]
*/
__STATIC_INLINE void DL_I2C_setTargetOwnAddress(I2C_Regs *i2c, uint32_t addr)
{
DL_Common_updateReg(&i2c->SLAVE.SOAR, addr, I2C_SOAR_OAR_MASK);
}
/**
* @brief Get target own address
*
* Get bits A9 through A0 of the target own address.
*
* In 7-bit addressing mode as selected by @ref DL_I2C_setTargetAddressingMode,
* the top 3 bits are don't care
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @return Target own address
*
* @retval [0x00, 0x3FF]
*/
__STATIC_INLINE uint32_t DL_I2C_getTargetOwnAddress(const I2C_Regs *i2c)
{
return (i2c->SLAVE.SOAR & I2C_SOAR_OAR_MASK);
}
/**
* @brief Enable target own address
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @sa DL_I2C_setTargetOwnAddress
*/
__STATIC_INLINE void DL_I2C_enableTargetOwnAddress(I2C_Regs *i2c)
{
i2c->SLAVE.SOAR |= I2C_SOAR_OAREN_ENABLE;
}
/**
* @brief Disable target own address
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableTargetOwnAddress(I2C_Regs *i2c)
{
i2c->SLAVE.SOAR &= ~(I2C_SOAR_OAREN_MASK);
}
/**
* @brief Checks if target own address is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If target own address is enabled
*
* @retval true if target own address is enabled
* @retval false if target own address is disabled
*/
__STATIC_INLINE bool DL_I2C_isTargetOwnAddressEnabled(const I2C_Regs *i2c)
{
return ((i2c->SLAVE.SOAR & I2C_SOAR_OAREN_MASK) == I2C_SOAR_OAREN_ENABLE);
}
/**
* @brief Set target addressing mode
*
* Selects the addressing mode to be used when device is configured as a
* target
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] mode Addressing mode to set the target to.
* One of @ref DL_I2C_TARGET_ADDRESSING_MODE.
*/
__STATIC_INLINE void DL_I2C_setTargetAddressingMode(
I2C_Regs *i2c, DL_I2C_TARGET_ADDRESSING_MODE mode)
{
DL_Common_updateReg(
&i2c->SLAVE.SOAR, (uint32_t) mode, I2C_SOAR_SMODE_MASK);
}
/**
* @brief Get target addressing mode
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return Addressing mode the target is set to
*
* @retval One of @ref DL_I2C_TARGET_ADDRESSING_MODE
*/
__STATIC_INLINE DL_I2C_TARGET_ADDRESSING_MODE DL_I2C_getTargetAddressingMode(
const I2C_Regs *i2c)
{
uint32_t mode = i2c->SLAVE.SOAR & I2C_SOAR_SMODE_MASK;
return (DL_I2C_TARGET_ADDRESSING_MODE)(mode);
}
/**
* @brief Get target own address alternate
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @return Target own address alternate
*
* @retval [0x00, 0x7f]
*/
__STATIC_INLINE uint32_t I2C_getTargetOwnAddressAlternate(const I2C_Regs *i2c)
{
return (i2c->SLAVE.SOAR2 & I2C_SOAR2_OAR2_MASK);
}
/**
* @brief Set target own address alternate
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] addr Value of target own address alternate [0x00, 0x7f]
*/
__STATIC_INLINE void DL_I2C_setTargetOwnAddressAlternate(
I2C_Regs *i2c, uint32_t addr)
{
DL_Common_updateReg(&i2c->SLAVE.SOAR2, addr, I2C_SOAR2_OAR2_MASK);
}
/**
* @brief Get target own address alternate mask
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return Which bits of the target address are matched
*
* @retval Bit mask with each bit corresponding to bits A6 through A0 of
* the target address. Value between [0x00, 0x7F]
*/
__STATIC_INLINE uint32_t I2C_getTargetOwnAddressAlternateMask(
const I2C_Regs *i2c)
{
return ((i2c->SLAVE.SOAR2 & I2C_SOAR2_OAR2_MASK_MASK) >>
I2C_SOAR2_OAR2_MASK_OFS);
}
/**
* @brief Set target own address alternate mask
*
* This field specifies bits A6 through A0 of the target address. The bits with
* a value of 1 in the SOAR2.OAR2_MASK field will make the corresponding
* incoming address bits to match by default regardless of the value inside
* SOAR2.OAR2 i.e. corresponding SOAR2.OAR2 bit is a don't care.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] addressMask Bit mask of address bits to match.
* Value between [0x00, 0x7F]
*/
__STATIC_INLINE void DL_I2C_setTargetOwnAddressAlternateMask(
I2C_Regs *i2c, uint32_t addressMask)
{
DL_Common_updateReg(&i2c->SLAVE.SOAR2,
addressMask << I2C_SOAR2_OAR2_MASK_OFS, I2C_SOAR2_OAR2_MASK_MASK);
}
/**
* @brief Disable usage of target own address alternate
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableTargetOwnAddressAlternate(I2C_Regs *i2c)
{
i2c->SLAVE.SOAR2 &= ~(I2C_SOAR2_OAR2EN_MASK);
}
/**
* @brief Checks if target own address alternate is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If target own address alternate is enabled
*
* @retval true if target own address alternate is enabled
* @retval false if target own address alternate is disabled
*/
__STATIC_INLINE bool DL_I2C_isTargetOwnAddressAlternateEnabled(
const I2C_Regs *i2c)
{
return (
(i2c->SLAVE.SOAR2 & I2C_SOAR2_OAR2EN_MASK) == I2C_SOAR2_OAR2EN_ENABLE);
}
/**
* @brief Enable usage of target own address alternate
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_enableTargetOwnAddressAlternate(I2C_Regs *i2c)
{
i2c->SLAVE.SOAR2 |= I2C_SOAR2_OAR2EN_ENABLE;
}
/**
* @brief Get the address for which address match happened
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return Matched Target address
*
* @retval Bit mask with each bit corresponding to the target address.
* Value between [0x00, 0x7F] in 7-bit mode, or [0x00, 0x3FF] in 10-bit mode.
*/
__STATIC_INLINE uint32_t DL_I2C_getTargetAddressMatch(const I2C_Regs *i2c)
{
return (
(i2c->SLAVE.SSR & I2C_SSR_ADDRMATCH_MASK) >> I2C_SSR_ADDRMATCH_OFS);
}
/**
* @brief Disable target clock stretching
*
* Clock stretching should be enabled to be compliant with I2C specification
* and the SCL will be stretched when data must be read or written from the
* FIFO. It can optionally be disabled if a controller does not support it or
* to achieve maximum I2C frequency; however the developer should ensure that
* the FIFO is written or read on time.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableTargetClockStretching(I2C_Regs *i2c)
{
i2c->SLAVE.SCTR &= ~(I2C_SCTR_SCLKSTRETCH_MASK);
}
/**
* @brief Checks if target clock stretching is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If target clock stretching is enabled
*
* @retval true if target clock stretching is enabled
* @retval false if target clock stretching is disabled
*/
__STATIC_INLINE bool DL_I2C_isTargetClockStretchingEnabled(const I2C_Regs *i2c)
{
return ((i2c->SLAVE.SCTR & I2C_SCTR_SCLKSTRETCH_MASK) ==
I2C_SCTR_SCLKSTRETCH_ENABLE);
}
/**
* @brief Enable target clock stretching
*
* Clock stretching should be enabled to be compliant with I2C specification
* and the SCL will be stretched when data must be read or written from the
* FIFO. It can optionally be disabled if a controller does not support it or
* to achieve maximum I2C frequency; however the developer should ensure that
* the FIFO is written or read on time.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_enableTargetClockStretching(I2C_Regs *i2c)
{
i2c->SLAVE.SCTR |= I2C_SCTR_SCLKSTRETCH_ENABLE;
}
/**
* @brief Disable target TX empty interrupt on transmit request
*
* When disabled, RIS.STXEMPTY will be set when only the Target TX FIFO is
* empty. This allows the STXEMPTY interrupt to be used to indicate that the
* I2C bus is being clock stretched and that Target TX data is required.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @sa DL_I2C_isTargetClockStretchEnabled
*/
__STATIC_INLINE void DL_I2C_disableTargetTXEmptyOnTXRequest(I2C_Regs *i2c)
{
i2c->SLAVE.SCTR &= ~(I2C_SCTR_TXEMPTY_ON_TREQ_MASK);
}
/**
* @brief Checks if target TX empty interrupt on transmit request is
* enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If TX empty interrupt on transmit request is enabled
*
* @retval true if TX empty interrupt on transmit request is enabled
* @retval false if TX empty interrupt on transmit request disabled
*/
__STATIC_INLINE bool DL_I2C_isTargetTXEmptyOnTXRequestEnabled(
const I2C_Regs *i2c)
{
return ((i2c->SLAVE.SCTR & I2C_SCTR_TXEMPTY_ON_TREQ_MASK) ==
I2C_SCTR_TXEMPTY_ON_TREQ_ENABLE);
}
/**
* @brief Enable target TX empty interrupt on transmit request
*
* When enabled, RIS.STXEMPTY will be set when the Target state machine is in
* the TX_WAIT state which occurs when the TX FIFO is empty AND the I2C
* transaction is clock stretched waiting for the FIFO to receive data.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_enableTargetTXEmptyOnTXRequest(I2C_Regs *i2c)
{
i2c->SLAVE.SCTR |= I2C_SCTR_TXEMPTY_ON_TREQ_ENABLE;
}
/**
* @brief Disable target TX trigger in TX mode
*
* When disabled, RIS.TXFIFOTRG will only be set when the Target TX FIFO is at
* or above the trigger level.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableTargetTXTriggerInTXMode(I2C_Regs *i2c)
{
i2c->SLAVE.SCTR &= ~(I2C_SCTR_TXTRIG_TXMODE_MASK);
}
/**
* @brief Checks if target TX trigger in TX mode is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If target TX trigger in TX mode is enabled
*
* @retval true if target TX trigger in TX mode is enabled
* @retval false if target TX trigger in TX mode is disabled
*/
__STATIC_INLINE bool DL_I2C_isTargetTXTriggerInTXModeEnabled(
const I2C_Regs *i2c)
{
return ((i2c->SLAVE.SCTR & I2C_SCTR_TXTRIG_TXMODE_MASK) ==
I2C_SCTR_TXTRIG_TXMODE_ENABLE);
}
/**
* @brief Enable TX trigger when target is in TX mode
*
* When enabled, RIS.TXFIFOTRG will be set when the Target TX FIFO has reached
* the trigger level AND the Target state machine is in the TXMODE as defined
* in the SSR register. When cleared RIS.TXFIFOTRG will be set when the Target
* TX FIFO is at or above the trigger level. This setting can be used to hold
* off the TX DMA until a transaction starts. This allows the DMA to be
* configured when the I2C is idle but have it wait till the transaction
* starts to load the Target TX FIFO, so it can load from a memory buffer that
* might be changing over time.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @sa DL_I2C_INTERRUPT_CONTROLLER_TXFIFO_TRIGGER
*/
__STATIC_INLINE void DL_I2C_enableTargetTXTriggerInTXMode(I2C_Regs *i2c)
{
i2c->SLAVE.SCTR |= I2C_SCTR_TXTRIG_TXMODE_ENABLE;
}
/**
* @brief Disable target TX transfer waits when stale data in TX FIFO
*
* When disabled, the TX FIFO empty signal to the Target state machine
* indicates that the TX FIFO is empty.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableTargetTXWaitWhenTXFIFOStale(I2C_Regs *i2c)
{
i2c->SLAVE.SCTR &= ~(I2C_SCTR_TXWAIT_STALE_TXFIFO_MASK);
}
/**
* @brief Checks if target TX transfer waits when stale data in TX FIFO
* is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If target TX transfer waits when stale data in TX FIFO is
* enabled
*
* @retval true if target TX transfer waits when stale data in TX FIFO
* is enabled
* @retval false if target TX transfer waits when stale data in TX FIFO
* is disabled
*/
__STATIC_INLINE bool DL_I2C_isTargetTXWaitWhenTXFIFOStaleEnabled(
const I2C_Regs *i2c)
{
return ((i2c->SLAVE.SCTR & I2C_SCTR_TXWAIT_STALE_TXFIFO_MASK) ==
I2C_SCTR_TXWAIT_STALE_TXFIFO_ENABLE);
}
/**
* @brief Enable target TX transfer waits when stale data in TX FIFO
*
* When enabled, the TX FIFO empty signal to the Target state machine will
* indicate that the TX FIFO is empty or that the TX FIFO data is stale. The
* TX FIFO data is determined to be stale when there is data in the TX FIFO
* when the Target state machine leaves the TXMODE as defined in the SSR
* register. This can occur is a Stop or timeout occur when there are bytes
* left in the TX FIFO.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_enableTargetTXWaitWhenTXFIFOStale(I2C_Regs *i2c)
{
i2c->SLAVE.SCTR |= I2C_SCTR_TXWAIT_STALE_TXFIFO_ENABLE;
}
/**
* @brief Disable target RX full interrupt on receive request
*
* When disabled, RIS.SRXFULL will be set when only the Target RX FIFO is
* full. This allows the SRXFULL interrupt to be used to indicate that the
* I2C bus is being clock stretched and that the FW must either read the RX
* FIFO or ACK/NACK the current RX byte.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @sa DL_I2C_isTargetClockStretchEnabled
*/
__STATIC_INLINE void DL_I2C_disableTargetRXFullOnRXRequest(I2C_Regs *i2c)
{
i2c->SLAVE.SCTR &= ~(I2C_SCTR_RXFULL_ON_RREQ_MASK);
}
/**
* @brief Checks if target RX full interrupt on receive request is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If target RX full interrupt on receive request enabled
*
* @retval true if target RX full interrupt on receive request enabled
* @retval false if target RX full interrupt on receive request disabled
*/
__STATIC_INLINE bool DL_I2C_isTargetRXFullOnRXRequestEnabled(
const I2C_Regs *i2c)
{
return ((i2c->SLAVE.SCTR & I2C_SCTR_RXFULL_ON_RREQ_MASK) ==
I2C_SCTR_RXFULL_ON_RREQ_ENABLE);
}
/**
* @brief Enable target RX full interrupt on receive request
*
* When enabled, RIS.SRXFULL will be set when the Target state machine is in
* the RX_WAIT or RX_ACK_WAIT states which occurs when the I2C transaction is
* clock stretched because the RX FIFO is full or the ACKOEN has been set and
* the state machine is waiting for FW to ACK/NACK the current byte.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
*/
__STATIC_INLINE void DL_I2C_enableTargetRXFullOnRXRequest(I2C_Regs *i2c)
{
i2c->SLAVE.SCTR |= I2C_SCTR_RXFULL_ON_RREQ_ENABLE;
}
/**
* @brief Disable SMBus/PMBus default host address of 000 1000b
*
* When disabled, the default host address is not matched.
* NOTE: The host address may still be matched if programmed as an own address.
* The I2C module can still be addressed as a target if enabled and own
* address match is enabled.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableDefaultHostAddress(I2C_Regs *i2c)
{
i2c->SLAVE.SCTR &= ~(I2C_SCTR_EN_DEFHOSTADR_MASK);
}
/**
* @brief Checks if SMBus/PMBus default host address of 000 1000b is
* enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If default host address is enabled
*
* @retval true if default host address is enabled
* @retval false if default host address disabled
*/
__STATIC_INLINE bool DL_I2C_isDefaultHostAddressEnabled(const I2C_Regs *i2c)
{
return ((i2c->SLAVE.SCTR & I2C_SCTR_EN_DEFHOSTADR_MASK) ==
I2C_SCTR_EN_DEFHOSTADR_ENABLE);
}
/**
* @brief Enable SMBus/PMBus default host address of 000 1000b
*
* When enabled, default host address of 0x0001000 is always matched by the
* target address match logic
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_enableDefaultHostAddress(I2C_Regs *i2c)
{
i2c->SLAVE.SCTR |= I2C_SCTR_EN_DEFHOSTADR_ENABLE;
}
/**
* @brief Disable SMBus/PMBus Alert response address (ARA) of 000 1100b
*
* When disabled, the alert response address 0x0001100 is not matched.
* NOTE: The alert response address may still be matched if programmed as an
* own address.
* The I2C module can still be addressed as a target if enabled and own
* address match is enabled.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableAlertResponseAddress(I2C_Regs *i2c)
{
i2c->SLAVE.SCTR &= ~(I2C_SCTR_EN_ALRESPADR_MASK);
}
/**
* @brief Checks if SMBus/PMBus Alert response address (ARA) of 000 1100b
* is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If alert response address is enabled
*
* @retval true if alert response address is enabled
* @retval false if alert response address disabled
*/
__STATIC_INLINE bool DL_I2C_isAlertResponseAddressEnabled(const I2C_Regs *i2c)
{
return ((i2c->SLAVE.SCTR & I2C_SCTR_EN_ALRESPADR_MASK) ==
I2C_SCTR_EN_ALRESPADR_ENABLE);
}
/**
* @brief Enable SMBus/PMBus Alert response address (ARA) of 000 1100b
*
* When enabled, default alert response address of 0x0001100 is always matched
* by the target address match logic
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_enableAlertResponseAddress(I2C_Regs *i2c)
{
i2c->SLAVE.SCTR |= I2C_SCTR_EN_ALRESPADR_ENABLE;
}
/**
* @brief Disable SMBus/PMBus default device address of 110 0001b
*
* Used for Address Resolution Protocol. When disabled, the default device
* address is not matched.
* NOTE: The host address may still be matched if programmed as an own address.
* The I2C module can still be addressed as a target if enabled and own
* address match is enabled.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableDefaultDeviceAddress(I2C_Regs *i2c)
{
i2c->SLAVE.SCTR &= ~(I2C_SCTR_EN_DEFDEVADR_MASK);
}
/**
* @brief Checks SMBus/PMBus default device address of 110 0001b is
* enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If default device address is enabled
*
* @retval true if default device address is enabled
* @retval false if default device address disabled
*/
__STATIC_INLINE bool DL_I2C_isDefaultDeviceAddressEnabled(const I2C_Regs *i2c)
{
return ((i2c->SLAVE.SCTR & I2C_SCTR_EN_DEFDEVADR_MASK) ==
I2C_SCTR_EN_DEFDEVADR_ENABLE);
}
/**
* @brief Enable SMBus/PMBus default device address of 110 0001b
*
* Used for Address Resolution Protocol. When enabled, default device address
* of 110 0001b is always matched by the target address match logic.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_enableDefaultDeviceAddress(I2C_Regs *i2c)
{
i2c->SLAVE.SCTR |= I2C_SCTR_EN_DEFDEVADR_ENABLE;
}
/**
* @brief Disable target wakeup
*
* When disabled, the target is not allowed to clock stretch on START
* detection.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableTargetWakeup(I2C_Regs *i2c)
{
i2c->SLAVE.SCTR &= ~(I2C_SCTR_SWUEN_MASK);
}
/**
* @brief Checks if target wakeup is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If target wakeup is enabled
*
* @retval true if target wakeup is enabled
* @retval false if target wakeup disabled
*/
__STATIC_INLINE bool DL_I2C_isTargetWakeupEnabled(const I2C_Regs *i2c)
{
return ((i2c->SLAVE.SCTR & I2C_SCTR_SWUEN_MASK) == I2C_SCTR_SWUEN_ENABLE);
}
/**
* @brief Enable target wakeup
*
* Enables low-power wake-up, however it is recommended to enable target clock
* stretching to stretch the clock while the module is waking up.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @sa DL_I2C_enableTargetClockStretching
*/
__STATIC_INLINE void DL_I2C_enableTargetWakeup(I2C_Regs *i2c)
{
i2c->SLAVE.SCTR |= I2C_SCTR_SWUEN_ENABLE;
}
/**
* @brief Disable target functionality
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableTarget(I2C_Regs *i2c)
{
i2c->SLAVE.SCTR &= ~(I2C_SCTR_ACTIVE_MASK);
}
/**
* @brief Checks if target functionality is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If target functionality is enabled
*
* @retval true if target functionality is enabled
* @retval false if target functionality is disabled
*/
__STATIC_INLINE bool DL_I2C_isTargetEnabled(const I2C_Regs *i2c)
{
return (
(i2c->SLAVE.SCTR & I2C_SCTR_ACTIVE_MASK) == I2C_SCTR_ACTIVE_ENABLE);
}
/**
* @brief Enable usage of target functionality
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_enableTarget(I2C_Regs *i2c)
{
i2c->SLAVE.SCTR |= I2C_SCTR_ACTIVE_ENABLE;
}
/**
* @brief Disable general call address of 000 0000b
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableGeneralCall(I2C_Regs *i2c)
{
i2c->SLAVE.SCTR &= ~(I2C_SCTR_GENCALL_MASK);
}
/**
* @brief Checks if general call address of 000 0000b is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If general call is enabled
*
* @retval true if general call is enabled
* @retval false if general call is disabled
*/
__STATIC_INLINE bool DL_I2C_isGeneralCallEnabled(const I2C_Regs *i2c)
{
return (
(i2c->SLAVE.SCTR & I2C_SCTR_GENCALL_MASK) == I2C_SCTR_GENCALL_ENABLE);
}
/**
* @brief Enable usage of general call address of 000 0000b
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_enableGeneralCall(I2C_Regs *i2c)
{
i2c->SLAVE.SCTR |= I2C_SCTR_GENCALL_ENABLE;
}
/**
* @brief Get status of I2C bus controller for target
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return Status of I2C bus controller for target
*
* @retval Bitwise OR of @ref DL_I2C_TARGET_STATUS
*/
__STATIC_INLINE uint32_t DL_I2C_getTargetStatus(const I2C_Regs *i2c)
{
return (i2c->SLAVE.SSR);
}
/**
* @brief Get byte of data from I2C target
*
* If using FIFO, it is first byte from the RX FIFO.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return Last received byte of data
*
* @retval [0x00, 0xff]
*/
__STATIC_INLINE uint8_t DL_I2C_receiveTargetData(const I2C_Regs *i2c)
{
return (uint8_t)(i2c->SLAVE.SRXDATA & I2C_SRXDATA_VALUE_MASK);
}
/**
* @brief Set next byte to be transferred during the next transaction
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] data Byte of data to be transferred during the next
* transaction. [0x00, 0xff]
*/
__STATIC_INLINE void DL_I2C_transmitTargetData(I2C_Regs *i2c, uint8_t data)
{
i2c->SLAVE.STXDATA = data;
}
/**
* @brief Disable target ACK override
*
* Disable manual ACK override to automatically ACK all received bytes until
* the RX FIFO is full.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableTargetACKOverride(I2C_Regs *i2c)
{
i2c->SLAVE.SACKCTL &= ~(I2C_SACKCTL_ACKOEN_MASK);
}
/**
* @brief Checks if target ACK override is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If target ACK override is enabled
*
* @retval true if target ACK override is enabled
* @retval false if target ACK override is disabled
*/
__STATIC_INLINE bool DL_I2C_isTargetACKOverrideEnabled(const I2C_Regs *i2c)
{
return ((i2c->SLAVE.SACKCTL & I2C_SACKCTL_ACKOEN_MASK) ==
I2C_SACKCTL_ACKOEN_ENABLE);
}
/**
* @brief Enable target ACK override
*
* When manual ACK override is enabled, the I2C target SCL is pulled low after
* the last data is received until the ACK override value (through
* @ref DL_I2C_setTargetACKOverrideValue) is written.
* Disable manual ACK override to automatically ACK all received bytes until
* the RX FIFO is full.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_enableTargetACKOverride(I2C_Regs *i2c)
{
i2c->SLAVE.SACKCTL |= I2C_SACKCTL_ACKOEN_ENABLE;
}
/**
* @brief Get target acknowledge override value
*
* @note for General Call this bit will be ignored if set to NACK and target
* continues to receive data.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return What type of response will be generated
*
* @retval One of @ref DL_I2C_TARGET_RESPONSE_OVERRIDE_VALUE.
*/
__STATIC_INLINE DL_I2C_TARGET_RESPONSE_OVERRIDE_VALUE
DL_I2C_getTargetACKOverrideValue(const I2C_Regs *i2c)
{
uint32_t value = i2c->SLAVE.SACKCTL & I2C_SACKCTL_ACKOVAL_MASK;
return (DL_I2C_TARGET_RESPONSE_OVERRIDE_VALUE)(value);
}
/**
* @brief Set target acknowledge override value
*
* @note for General Call this bit will be ignored if set to NACK and target
* continues to receive data.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] value Indicates what type of response will be generated.
* One of @ref DL_I2C_TARGET_RESPONSE_OVERRIDE_VALUE.
*
* @sa DL_I2C_enableTargetACKOverride
*/
__STATIC_INLINE void DL_I2C_setTargetACKOverrideValue(
I2C_Regs *i2c, DL_I2C_TARGET_RESPONSE_OVERRIDE_VALUE value)
{
DL_Common_updateReg(
&i2c->SLAVE.SACKCTL, (uint32_t) value, I2C_SACKCTL_ACKOVAL_MASK);
}
/**
* @brief Disable target ACK override on Start Condition
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableACKOverrideOnStart(I2C_Regs *i2c)
{
i2c->SLAVE.SACKCTL &= ~(I2C_SACKCTL_ACKOEN_ON_START_MASK);
}
/**
* @brief Checks if target ACK override on Start condition is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If target ACK override on Start condition is enabled
*
* @retval true if target ACK override on Start condition is enabled
* @retval false if target ACK override on Start condition is disabled
*/
__STATIC_INLINE bool DL_I2C_isACKOverrideOnStartEnabled(const I2C_Regs *i2c)
{
return ((i2c->SLAVE.SACKCTL & I2C_SACKCTL_ACKOEN_ON_START_MASK) ==
I2C_SACKCTL_ACKOEN_ON_START_ENABLE);
}
/**
* @brief Enable target ACK override on Start condition
*
* When enabled, this bit will automatically turn on the Target ACKOEN field
* following a Start condition.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @sa DL_I2C_enableTargetACKOverride
*/
__STATIC_INLINE void DL_I2C_enableACKOverrideOnStart(I2C_Regs *i2c)
{
i2c->SLAVE.SACKCTL |= I2C_SACKCTL_ACKOEN_ON_START_ENABLE;
}
/**
* @brief Disable target ACK override when SMBus/PMBus PEC is next byte
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableACKOverrideOnPECNext(I2C_Regs *i2c)
{
i2c->SLAVE.SACKCTL &= ~(I2C_SACKCTL_ACKOEN_ON_PECNEXT_MASK);
}
/**
* @brief Checks if target ACK override when SMBus/PMBus PEC is next byte
* is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If target ACK override when PEC is next byte is enabled
*
* @retval true if target ACK override when PEC is next byte is enabled
* @retval false if target ACK override when PEC is next byte is disabled
*/
__STATIC_INLINE bool DL_I2C_isACKOverrideOnPECNextEnabled(const I2C_Regs *i2c)
{
return ((i2c->SLAVE.SACKCTL & I2C_SACKCTL_ACKOEN_ON_PECNEXT_MASK) ==
I2C_SACKCTL_ACKOEN_ON_PECNEXT_ENABLE);
}
/**
* @brief Enable target ACK override when SMBus/PMBus PEC is next byte
*
* When enabled, this bit will automatically turn on the Target ACKOEN field
* following the ACK/NACK of the byte received just prior to the PEC byte.
* Note that when ACKOEN is set, the PEC byte will not automatically be
* ACKed/NACKed by the state machine and FW must perform this function by
* writing SLAVE_SACKCTL.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @sa DL_I2C_enableTargetACKOverride
*/
__STATIC_INLINE void DL_I2C_enableACKOverrideOnPECNext(I2C_Regs *i2c)
{
i2c->SLAVE.SACKCTL |= I2C_SACKCTL_ACKOEN_ON_PECNEXT_ENABLE;
}
/**
* @brief Disable target ACK override when SMBus/PMBus PEC is next byte
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableACKOverrideOnPECDone(I2C_Regs *i2c)
{
i2c->SLAVE.SACKCTL &= ~(I2C_SACKCTL_ACKOEN_ON_PECDONE_MASK);
}
/**
* @brief Checks if target ACK override when SMBus/PMBus PEC is next byte
* is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If target ACK override when PEC is next byte is enabled
*
* @retval true if target ACK override when PEC is next byte is enabled
* @retval false if target ACK override when PEC is next byte is disabled
*/
__STATIC_INLINE bool DL_I2C_isACKOverrideOnPECDoneEnabled(const I2C_Regs *i2c)
{
return ((i2c->SLAVE.SACKCTL & I2C_SACKCTL_ACKOEN_ON_PECDONE_MASK) ==
I2C_SACKCTL_ACKOEN_ON_PECDONE_ENABLE);
}
/**
* @brief Enable target ACK override when SMBus/PMBus PEC is done
*
* When enabled, this bit will automatically turn on the Target ACKOEN field
* following the ACK/NACK of the received PEC byte.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @sa DL_I2C_enableTargetACKOverride
*/
__STATIC_INLINE void DL_I2C_enableACKOverrideOnPECDone(I2C_Regs *i2c)
{
i2c->SLAVE.SACKCTL |= I2C_SACKCTL_ACKOEN_ON_PECDONE_ENABLE;
}
/**
* @brief Get the target SMBus/PMBus Packet Error Checking (PEC) count
* value
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return The value the PEC count is set to
*
* @retval Value between [0x0, 0x01FF]
*/
__STATIC_INLINE uint32_t DL_I2C_getTargetPECCountValue(const I2C_Regs *i2c)
{
return (i2c->SLAVE.TARGET_PECCTL & I2C_TARGET_PECCTL_PECCNT_MASK);
}
/**
* @brief Set the target SMBus/PMBus Packet Error Checking (PEC) count
* value
*
* When this field is non zero, the number of I2C data bytes are counted.
* Refer to the device TRM for more details.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] count The value to set the PEC count to.
* Value between [0x0, 0x01FF]
*/
__STATIC_INLINE void DL_I2C_setTargetPECCountValue(
I2C_Regs *i2c, uint32_t count)
{
DL_Common_updateReg(
&i2c->SLAVE.TARGET_PECCTL, count, I2C_TARGET_PECCTL_PECCNT_MASK);
}
/**
* @brief Disable target SMBus/PMBus Packet Error Checking (PEC)
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableTargetPEC(I2C_Regs *i2c)
{
i2c->SLAVE.TARGET_PECCTL &= ~(I2C_TARGET_PECCTL_PECEN_MASK);
}
/**
* @brief Checks if target SMBus/PMBus Packet Error Checking (PEC) is
* enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If target PEC is enabled
*
* @retval true if target PEC is enabled
* @retval false if target PEC is disabled
*/
__STATIC_INLINE bool DL_I2C_isTargetPECEnabled(const I2C_Regs *i2c)
{
return ((i2c->SLAVE.TARGET_PECCTL & I2C_TARGET_PECCTL_PECEN_MASK) ==
I2C_TARGET_PECCTL_PECEN_ENABLE);
}
/**
* @brief Enable target SMBus/PMBus Packet Error Checking (PEC)
*
* When enabled, the PEC is calculated on all bits accept the Start, Stop, ACK
* and NACK. The PEC LSFR and the Byte Counter is set to 0 when the State
* Machine is in the IDLE state, which occurs following a Stop or when a
* timeout occurs. The Counter is also set to 0 after the PEC byte is sent or
* received. Note that the NACK is automatically sent following a PEC byte
* that results in a PEC error.
* The PEC Polynomial is x^8 + x^2 + x^1 + 1.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
*/
__STATIC_INLINE void DL_I2C_enableTargetPEC(I2C_Regs *i2c)
{
i2c->SLAVE.TARGET_PECCTL |= I2C_TARGET_PECCTL_PECEN_ENABLE;
}
/**
* @brief Get the current SMBus/PMBus PEC byte count of the Target state
* machine
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return The current PEC byte count of the target state macione
*
* @retval Value between [0x0, 0x01FF]
*/
__STATIC_INLINE uint32_t DL_I2C_getTargetCurrentPECCount(const I2C_Regs *i2c)
{
return (i2c->SLAVE.TARGET_PECCTL & I2C_TARGET_PECSR_PECBYTECNT_MASK);
}
/**
* @brief Get status if SMBus/PMBus target PEC was checked in last
* transaction
*
* The status indicates if the target PEC was checked in the transaction that
* occurred before the last Stop. Latched on Stop.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return Status of PEC target checked
*
* @retval One of @ref DL_I2C_TARGET_PEC_STATUS
*/
__STATIC_INLINE DL_I2C_TARGET_PEC_STATUS DL_I2C_getTargetPECCheckedStatus(
const I2C_Regs *i2c)
{
uint32_t status =
i2c->SLAVE.TARGET_PECSR & I2C_TARGET_PECSR_PECSTS_CHECK_MASK;
return (DL_I2C_TARGET_PEC_STATUS)(status);
}
/**
* @brief Get status if SMBus/PMBus target PEC had an error
*
* The status indicates if a PEC check error occurred in the transaction that
* occurred before the last Stop. Latched on Stop.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return Status of target PEC error check
*
* @retval One of @ref DL_I2C_TARGET_PEC_CHECK_ERROR
*/
__STATIC_INLINE DL_I2C_TARGET_PEC_CHECK_ERROR DL_I2C_getTargetPECCheckError(
const I2C_Regs *i2c)
{
uint32_t status =
i2c->SLAVE.TARGET_PECSR & I2C_TARGET_PECSR_PECSTS_ERROR_MASK;
return (DL_I2C_TARGET_PEC_CHECK_ERROR)(status);
}
/**
* @brief Get target TX FIFO threshold level
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @return Indicates at what fill level in the TX FIFO a threshold will be
* generated
*
* @retval One of @ref DL_I2C_TX_FIFO_LEVEL
*/
__STATIC_INLINE DL_I2C_TX_FIFO_LEVEL DL_I2C_getTargetTXFIFOThreshold(
const I2C_Regs *i2c)
{
uint32_t level = i2c->SLAVE.SFIFOCTL & I2C_SFIFOCTL_TXTRIG_MASK;
return (DL_I2C_TX_FIFO_LEVEL)(level);
}
/**
* @brief Set target TX FIFO threshold level
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] level Indicates at what fill level in the TX FIFO a threshold
* will be generated.
* One of @ref DL_I2C_TX_FIFO_LEVEL.
*/
__STATIC_INLINE void DL_I2C_setTargetTXFIFOThreshold(
I2C_Regs *i2c, DL_I2C_TX_FIFO_LEVEL level)
{
DL_Common_updateReg(&i2c->SLAVE.SFIFOCTL, (uint32_t) level,
(uint32_t) I2C_SFIFOCTL_TXTRIG_MASK);
}
/**
* @brief Stop target TX FIFO flush
*
* Before stopping the flush, check if @ref DL_I2C_isTargetTXFIFOEmpty,
* indicating flush is complete.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_stopFlushTargetTXFIFO(I2C_Regs *i2c)
{
i2c->SLAVE.SFIFOCTL &= ~(I2C_SFIFOCTL_TXFLUSH_MASK);
}
/**
* @brief Start target TX FIFO flush
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_startFlushTargetTXFIFO(I2C_Regs *i2c)
{
i2c->SLAVE.SFIFOCTL |= I2C_SFIFOCTL_TXFLUSH_MASK;
}
/**
* @brief Stop target RX FIFO flush
*
* Before stopping the flush, check if @ref DL_I2C_isTargetRXFIFOEmpty,
* indicating flush is complete.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_stopFlushTargetRXFIFO(I2C_Regs *i2c)
{
i2c->SLAVE.SFIFOCTL &= ~(I2C_SFIFOCTL_RXFLUSH_MASK);
}
/**
* @brief Start target RX FIFO flush
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_startFlushTargetRXFIFO(I2C_Regs *i2c)
{
i2c->SLAVE.SFIFOCTL |= I2C_SFIFOCTL_RXFLUSH_MASK;
}
/**
* @brief Get target RX FIFO threshold level
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @return Indicates at what fill level in the RX FIFO a threshold will be
* generated
*
* @retval One of @ref DL_I2C_RX_FIFO_LEVEL
*/
__STATIC_INLINE DL_I2C_RX_FIFO_LEVEL DL_I2C_getTargetRXFIFOThreshold(
const I2C_Regs *i2c)
{
uint32_t level = i2c->SLAVE.SFIFOCTL & I2C_SFIFOCTL_RXTRIG_MASK;
return (DL_I2C_RX_FIFO_LEVEL)(level);
}
/**
* @brief Set target RX FIFO threshold level
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] level Indicates at what fill level in the RX FIFO a threshold
* will be generated.
* One of @ref DL_I2C_RX_FIFO_LEVEL.
*/
__STATIC_INLINE void DL_I2C_setTargetRXFIFOThreshold(
I2C_Regs *i2c, DL_I2C_RX_FIFO_LEVEL level)
{
DL_Common_updateReg(
&i2c->SLAVE.SFIFOCTL, (uint32_t) level, I2C_SFIFOCTL_RXTRIG_MASK);
}
/**
* @brief Get number of bytes which can be read from RX FIFO
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return Number of bytes which can be read from RX FIFO
*
* @retval [0x0, 0x8]
*/
__STATIC_INLINE uint32_t DL_I2C_getTargetRXFIFOCounter(const I2C_Regs *i2c)
{
return (i2c->SLAVE.SFIFOSR & I2C_SFIFOSR_RXFIFOCNT_MASK);
}
/**
* @brief Get number of bytes which can be put into TX FIFO
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return Number of bytes which can be put into TX FIFO
*
* @retval [0x0, 0x8]
*/
__STATIC_INLINE uint32_t DL_I2C_getTargetTXFIFOCounter(const I2C_Regs *i2c)
{
return ((i2c->SLAVE.SFIFOSR & I2C_SFIFOSR_TXFIFOCNT_MASK) >>
I2C_SFIFOSR_TXFIFOCNT_OFS);
}
/**
* @brief Checks if target RX FIFO flush is active
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If target RX FIFO flush is active
*
* @retval true if target RX FIFO flush is active
* @retval false if target RX FIFO flush is not active
*/
__STATIC_INLINE bool DL_I2C_isTargetRXFIFOFlushActive(const I2C_Regs *i2c)
{
return ((i2c->SLAVE.SFIFOSR & I2C_SFIFOSR_RXFLUSH_MASK) ==
I2C_SFIFOSR_RXFLUSH_ACTIVE);
}
/**
* @brief Checks if target TX FIFO flush is active
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If target TX FIFO flush is active
*
* @retval true if target TX FIFO flush is active
* @retval false if target TX FIFO flush is not active
*/
__STATIC_INLINE bool DL_I2C_isTargetTXFIFOFlushActive(const I2C_Regs *i2c)
{
return ((i2c->SLAVE.SFIFOSR & I2C_SFIFOSR_TXFLUSH_MASK) ==
I2C_SFIFOSR_TXFLUSH_ACTIVE);
}
/**
* @brief Enable I2C interrupts
*
* @param[in] i2c Pointer to the register overlay for the
* peripheral
* @param[in] interruptMask Bit mask of interrupts to enable. Bitwise OR of
* @ref DL_I2C_INTERRUPT.
*/
__STATIC_INLINE void DL_I2C_enableInterrupt(
I2C_Regs *i2c, uint32_t interruptMask)
{
i2c->CPU_INT.IMASK |= interruptMask;
}
/**
* @brief Disable I2C interrupts
*
* @param[in] i2c Pointer to the register overlay for the
* peripheral
* @param[in] interruptMask Bit mask of interrupts to disable. Bitwise OR of
* @ref DL_I2C_INTERRUPT.
*/
__STATIC_INLINE void DL_I2C_disableInterrupt(
I2C_Regs *i2c, uint32_t interruptMask)
{
i2c->CPU_INT.IMASK &= ~(interruptMask);
}
/**
* @brief Check which I2C interrupts are enabled
*
* @param[in] i2c Pointer to the register overlay for the
* peripheral
* @param[in] interruptMask Bit mask of interrupts to check. Bitwise OR of
* @ref DL_I2C_INTERRUPT.
*
* @return Which of the requested I2C interrupts are enabled
*
* @retval Bitwise OR of @ref DL_I2C_INTERRUPT values
*/
__STATIC_INLINE uint32_t DL_I2C_getEnabledInterrupts(
const I2C_Regs *i2c, uint32_t interruptMask)
{
return (i2c->CPU_INT.IMASK & interruptMask);
}
/**
* @brief Check interrupt flag of enabled I2C interrupts
*
* Checks if any of the I2C interrupts that were previously enabled are
* pending.
*
* @param[in] i2c Pointer to the register overlay for the
* peripheral
* @param[in] interruptMask Bit mask of interrupts to check. Bitwise OR of
* @ref DL_I2C_INTERRUPT.
*
* @return Which of the requested I2C interrupts are pending
*
* @retval Bitwise OR of @ref DL_I2C_INTERRUPT values
*
* @sa DL_I2C_enableInterrupt
*/
__STATIC_INLINE uint32_t DL_I2C_getEnabledInterruptStatus(
const I2C_Regs *i2c, uint32_t interruptMask)
{
return (i2c->CPU_INT.MIS & interruptMask);
}
/**
* @brief Check interrupt flag of any I2C interrupt
*
* Checks if any of the I2C interrupts are pending. Interrupts do not have to
* be previously enabled.
*
* @param[in] i2c Pointer to the register overlay for the
* peripheral
* @param[in] interruptMask Bit mask of interrupts to check. Bitwise OR of
* @ref DL_I2C_INTERRUPT.
*
* @return Which of the requested I2C interrupts are pending
*
* @retval Bitwise OR of @ref DL_I2C_INTERRUPT values
*/
__STATIC_INLINE uint32_t DL_I2C_getRawInterruptStatus(
const I2C_Regs *i2c, uint32_t interruptMask)
{
return (i2c->CPU_INT.RIS & interruptMask);
}
/**
* @brief Get highest priority pending I2C interrupt
*
* Checks if any of the I2C interrupts are pending. Interrupts do not have to
* be previously enabled.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return The highest priority pending I2C interrupt
*
* @retval One of @ref DL_I2C_IIDX
*/
__STATIC_INLINE DL_I2C_IIDX DL_I2C_getPendingInterrupt(const I2C_Regs *i2c)
{
return ((DL_I2C_IIDX) i2c->CPU_INT.IIDX);
}
/**
* @brief Clear pending I2C interrupts
*
* @param[in] i2c Pointer to the register overlay for the
* peripheral
* @param[in] interruptMask Bit mask of interrupts to clear. Bitwise OR of
* @ref DL_I2C_INTERRUPT.
*/
__STATIC_INLINE void DL_I2C_clearInterruptStatus(
I2C_Regs *i2c, uint32_t interruptMask)
{
i2c->CPU_INT.ICLR = interruptMask;
}
/**
* @brief Enables I2C interrupt for triggering DMA events
*
* Enables the I2C interrupt to be used as the condition to generate an
* event to directly trigger the DMA.
*
* Each event publisher @ref DL_I2C_EVENT_ROUTE can set any one of
* @ref DL_I2C_DMA_INTERRUPT.
*
* @note Only one interrupt source should be enabled at a time.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] index Specifies the register event publisher to configure
* @param[in] interrupt Interrupt to enable as the trigger condition for
* the DMA. One of @ref DL_I2C_DMA_INTERRUPT.
*/
__STATIC_INLINE void DL_I2C_enableDMAEvent(
I2C_Regs *i2c, DL_I2C_EVENT_ROUTE index, uint32_t interrupt)
{
switch (index) {
case DL_I2C_EVENT_ROUTE_1:
i2c->DMA_TRIG1.IMASK = interrupt;
break;
case DL_I2C_EVENT_ROUTE_2:
i2c->DMA_TRIG0.IMASK = interrupt;
break;
default:
break;
}
}
/**
* @brief Disables I2C interrupt from triggering DMA events
*
* Disables the I2C interrupt from being used as the condition to generate an
* event to directly trigger the DMA.
*
* Each event publisher @ref DL_I2C_EVENT_ROUTE can set any one of
* @ref DL_I2C_DMA_INTERRUPT.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] index Specifies the register event publisher to configure
* @param[in] interrupt Interrupt to disable as the trigger condition for
* the DMA. One of @ref DL_I2C_DMA_INTERRUPT.
*/
__STATIC_INLINE void DL_I2C_disableDMAEvent(
I2C_Regs *i2c, DL_I2C_EVENT_ROUTE index, uint32_t interrupt)
{
switch (index) {
case DL_I2C_EVENT_ROUTE_1:
i2c->DMA_TRIG1.IMASK &= ~(interrupt);
break;
case DL_I2C_EVENT_ROUTE_2:
i2c->DMA_TRIG0.IMASK &= ~(interrupt);
break;
default:
break;
}
}
/**
* @brief Check which I2C interrupt for DMA receive events is enabled
*
* This API checks the event publisher register as selected by
* @ref DL_I2C_EVENT_ROUTE, which are used for triggering the DMA for
* Controller or Target and receive or transmit events.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] index Specifies the register event publisher to configure
* @param[in] interruptMask Bit mask of interrupts to check. Bitwise OR of
* @ref DL_I2C_DMA_INTERRUPT.
*
* @note Only one interrupt source should be enabled at a time.
*
* @return The requested I2C interrupt status
*
* @retval One of @ref DL_I2C_DMA_INTERRUPT
*/
__STATIC_INLINE uint32_t DL_I2C_getEnabledDMAEvents(
I2C_Regs *i2c, DL_I2C_EVENT_ROUTE index, uint32_t interruptMask)
{
volatile uint32_t *pReg = &i2c->DMA_TRIG1.IMASK;
return ((*(pReg + (uint32_t) index) & interruptMask));
}
/**
* @brief Check interrupt flag of enabled I2C interrupt for DMA event
*
* Checks if any of the I2C interrupts for the DMA receive event that were
* previously enabled are pending.
* This API checks the event publisher register as selected by
* @ref DL_I2C_EVENT_ROUTE, which are used for triggering the DMA for
* Controller or Target and receive or transmit events.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] index Specifies the register event publisher to configure
* @param[in] interruptMask Bit mask of interrupts to check. Bitwise OR of
* @ref DL_I2C_DMA_INTERRUPT.
*
* @note Only one interrupt source should be enabled at a time.
*
* @return The requested I2C interrupt status
*
* @retval One of @ref DL_I2C_DMA_INTERRUPT
*
* @sa DL_I2C_enableDMAEvent
*/
__STATIC_INLINE uint32_t DL_I2C_getEnabledDMAEventStatus(
const I2C_Regs *i2c, DL_I2C_EVENT_ROUTE index, uint32_t interruptMask)
{
const volatile uint32_t *pReg = &i2c->DMA_TRIG1.MIS;
return ((*(pReg + (uint32_t) index) & interruptMask));
}
/**
* @brief Check interrupt flag of any I2C interrupt for DMA event
*
* Checks if any of the I2C interrupts for DMA receive event are pending.
* Interrupts do not have to be previously enabled.
* This API checks the event publisher register as selected by
* @ref DL_I2C_EVENT_ROUTE, which are used for triggering the DMA for
* Controller or Target and receive or transmit events.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] index Specifies the register event publisher to configure
* @param[in] interruptMask Bit mask of interrupts to check. Bitwise OR of
* @ref DL_I2C_DMA_INTERRUPT.
*
* @return Which of the requested I2C interrupts are pending
*
* @retval Bitwise OR of @ref DL_I2C_DMA_INTERRUPT values
*/
__STATIC_INLINE uint32_t DL_I2C_getRawDMAEventStatus(
const I2C_Regs *i2c, DL_I2C_EVENT_ROUTE index, uint32_t interruptMask)
{
const volatile uint32_t *pReg = &i2c->DMA_TRIG1.RIS;
return ((*(pReg + (uint32_t) index) & interruptMask));
}
/**
* @brief Get highest priority pending I2C interrupt for DMA event
*
* Checks if any of the I2C interrupts for DMA receive event are pending.
* Interrupts do not have to be previously enabled.
* This API checks the event publisher register as selected by
* @ref DL_I2C_EVENT_ROUTE, which are used for triggering the DMA for
* Controller or Target and receive or transmit events.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] index Specifies the register event publisher to configure
*
* @return The highest priority pending I2C interrupt
*
* @retval One of @ref DL_I2C_DMA_IIDX
*/
__STATIC_INLINE DL_I2C_DMA_IIDX DL_I2C_getPendingDMAEvent(
const I2C_Regs *i2c, DL_I2C_EVENT_ROUTE index)
{
const volatile uint32_t *pReg = &i2c->DMA_TRIG1.IIDX;
return (DL_I2C_DMA_IIDX)((*(pReg + (uint32_t) index)));
}
/**
* @brief Clear pending SPI interrupts for DMA events
*
* This API checks the event publisher register as selected by
* @ref DL_I2C_EVENT_ROUTE, which are used for triggering the DMA for
* Controller or Target and receive or transmit events.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
* @param[in] index Specifies the register event publisher to configure
* @param[in] interrupt Interrupt to clear. One of @ref DL_I2C_DMA_INTERRUPT
*/
__STATIC_INLINE void DL_I2C_clearDMAEvent(
I2C_Regs *i2c, DL_I2C_EVENT_ROUTE index, uint32_t interrupt)
{
switch (index) {
case DL_I2C_EVENT_ROUTE_1:
i2c->DMA_TRIG1.ICLR |= interrupt;
break;
case DL_I2C_EVENT_ROUTE_2:
i2c->DMA_TRIG0.ICLR |= interrupt;
break;
default:
break;
}
}
/**
* @brief Disable analog and digital glitch filter chaining
*
* Chaining is disabled and only digital filter output is available to IP
* sampling logic.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableGlitchFilterChaining(I2C_Regs *i2c)
{
i2c->GFCTL &= ~(I2C_GFCTL_CHAIN_MASK);
}
/**
* @brief Checks if analog and digital glitch filter chaining is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If glitch filter chaining is enabled
*
* @retval true if glitch filter chaining is enabled
* @retval false if glitch filter chaining is disabled
*/
__STATIC_INLINE bool DL_I2C_isGlitchFilterChainingEnabled(const I2C_Regs *i2c)
{
return ((i2c->GFCTL & I2C_GFCTL_CHAIN_MASK) == I2C_GFCTL_CHAIN_ENABLE);
}
/**
* @brief Enable analog and digitial glitch filter chaining
*
* When enabled, analog and digital glitch filters are chained and the output
* of the combination is made available to IP sampling logic.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_enableGlitchFilterChaining(I2C_Regs *i2c)
{
i2c->GFCTL |= I2C_GFCTL_CHAIN_ENABLE;
}
/**
* @brief Get the Timeout Counter A value
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return The Timeout A counter value
*
* @retval Value between [0x0, 0xFF]
*/
__STATIC_INLINE uint32_t DL_I2C_getTimeoutACount(const I2C_Regs *i2c)
{
return (i2c->TIMEOUT_CTL & I2C_TIMEOUT_CTL_TCNTLA_MASK);
}
/**
* @brief Set the Timeout Counter A value
*
* Timeout A is used for SCL low detection. This field contains the upper 8
* bits of a 12-bit pre-load value for the Timeout A count.
* NOTE: The value of the counter must be greater than 1 to enable the
* timeout. Each count is equal to 520 times the timeout period of the
* functional clock. For example, with 8MHz functional clock and a
* 100KHz operating I2C clock, one timeout period will be equal to
* (1 / 8MHz) * 520 = 65us.
*
* @param[in] i2c Pointer to the register overlay for the
* peripheral
* @param[in] count The value to set the Timeout A counter to.
* Value between [0x0, 0xFF]
*/
__STATIC_INLINE void DL_I2C_setTimeoutACount(I2C_Regs *i2c, uint32_t count)
{
DL_Common_updateReg(&i2c->TIMEOUT_CTL, count, I2C_TIMEOUT_CTL_TCNTLA_MASK);
}
/**
* @brief Disable Timeout Counter A
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableTimeoutA(I2C_Regs *i2c)
{
i2c->TIMEOUT_CTL &= ~(I2C_TIMEOUT_CTL_TCNTAEN_MASK);
}
/**
* @brief Checks if Timeout Counter A is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If Timeout Counter A is enabled
*
* @retval true if Timeout Counter A is enabled
* @retval false if Timeout Counter A is disabled
*/
__STATIC_INLINE bool DL_I2C_isTimeoutAEnabled(const I2C_Regs *i2c)
{
return ((i2c->TIMEOUT_CTL & I2C_TIMEOUT_CTL_TCNTAEN_MASK) ==
I2C_TIMEOUT_CTL_TCNTAEN_ENABLE);
}
/**
* @brief Enable Timeout Counter A
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_enableTimeoutA(I2C_Regs *i2c)
{
i2c->TIMEOUT_CTL |= I2C_TIMEOUT_CTL_TCNTAEN_ENABLE;
}
/**
* @brief Get the current Timer Counter A value
*
* This field contains the upper 8 bits of a 12-bit current counter for
* Timeout Counter A.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return The Timeout A counter value
*
* @retval Value between [0x0, 0xFF]
*/
__STATIC_INLINE uint32_t DL_I2C_getCurrentTimeoutACounter(const I2C_Regs *i2c)
{
return (i2c->TIMEOUT_CNT & I2C_TIMEOUT_CNT_TCNTA_MASK);
}
/**
* @brief Get the Timeout Counter B value
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return The Timeout B counter value
*
* @retval Value between [0x0, 0xFF]
*/
__STATIC_INLINE uint32_t DL_I2C_getTimeoutBCount(const I2C_Regs *i2c)
{
return ((i2c->TIMEOUT_CTL & I2C_TIMEOUT_CTL_TCNTLB_MASK) >>
I2C_TIMEOUT_CTL_TCNTLB_OFS);
}
/**
* @brief Set the Timeout Counter B value
*
* Timeout B is used for SCL high detection. This field contains the upper 8
* bits of a 12-bit pre-load value for the Timeout A count.
* NOTE: The value of the counter must be greater than 1 to enable the
* timeout. Each count is equal to 1* clock period. For example, with 10MHz
* functional clock one timeout period will be equal to 1 * 10ns.
*
* @param[in] i2c Pointer to the register overlay for the
* peripheral
* @param[in] count The value to set the Timeout A counter to.
* Value between [0x0, 0xFF]
*/
__STATIC_INLINE void DL_I2C_setTimeoutBCount(I2C_Regs *i2c, uint32_t count)
{
DL_Common_updateReg(&i2c->TIMEOUT_CTL,
(count << I2C_TIMEOUT_CTL_TCNTLB_OFS), I2C_TIMEOUT_CTL_TCNTLB_MASK);
}
/**
* @brief Disable Timeout Counter B
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_disableTimeoutB(I2C_Regs *i2c)
{
i2c->TIMEOUT_CTL &= ~(I2C_TIMEOUT_CTL_TCNTBEN_MASK);
}
/**
* @brief Checks if Timeout Counter B is enabled
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return If Timeout Counter B is enabled
*
* @retval true if Timeout Counter B is enabled
* @retval false if Timeout Counter B is disabled
*/
__STATIC_INLINE bool DL_I2C_isTimeoutBEnabled(const I2C_Regs *i2c)
{
return ((i2c->TIMEOUT_CTL & I2C_TIMEOUT_CTL_TCNTBEN_MASK) ==
I2C_TIMEOUT_CTL_TCNTBEN_ENABLE);
}
/**
* @brief Enable Timeout Counter B
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_I2C_enableTimeoutB(I2C_Regs *i2c)
{
i2c->TIMEOUT_CTL |= I2C_TIMEOUT_CTL_TCNTBEN_ENABLE;
}
/**
* @brief Get the current Timer Counter B value
*
* This field contains the upper 8 bits of a 12-bit current counter for
* Timeout Counter B.
*
* @param[in] i2c Pointer to the register overlay for the peripheral
*
* @return The Timeout B counter value
*
* @retval Value between [0x0, 0xFF]
*/
__STATIC_INLINE uint32_t DL_I2C_getCurrentTimeoutBCounter(const I2C_Regs *i2c)
{
return (i2c->TIMEOUT_CNT & I2C_TIMEOUT_CNT_TCNTB_MASK);
}
#ifdef __cplusplus
}
#endif
#endif /* __MSPM0_HAS_I2C__ */
#endif /* ti_dl_dl_i2c__include */
/** @}*/