mirror of
https://github.com/Dev-KATECH/ADM.git
synced 2026-05-17 01:43:59 +09:00
1553 lines
56 KiB
C
1553 lines
56 KiB
C
/*==================================================================================================
|
|
* Project : RTD AUTOSAR 4.4
|
|
* Platform : CORTEXM
|
|
* Peripheral : LPI2C
|
|
* Dependencies : none
|
|
*
|
|
* Autosar Version : 4.4.0
|
|
* Autosar Revision : ASR_REL_4_4_REV_0000
|
|
* Autosar Conf.Variant :
|
|
* SW Version : 0.9.0
|
|
* Build Version : S32K3_RTD_0_9_0__ASR_REL_4_4_REV_0000_20210326
|
|
*
|
|
* (c) Copyright 2020 - 2021 NXP Semiconductors
|
|
* All Rights Reserved.
|
|
*
|
|
* NXP Confidential. This software is owned or controlled by NXP and may only be
|
|
* used strictly in accordance with the applicable license terms. By expressly
|
|
* accepting such terms or by downloading, installing, activating and/or otherwise
|
|
* using the software, you are agreeing that you have read, and that you agree to
|
|
* comply with and are bound by, such license terms. If you do not agree to be
|
|
* bound by the applicable license terms, then you may not retain, install,
|
|
* activate or otherwise use the software.
|
|
==================================================================================================*/
|
|
|
|
/**
|
|
* @file
|
|
*
|
|
* @addtogroup LPI2C_DRIVER Lpi2c Driver
|
|
* @{
|
|
*/
|
|
|
|
#if !defined(LPI2C_IP_HWACCESS_H)
|
|
#define LPI2C_IP_HWACCESS_H
|
|
|
|
/*==================================================================================================
|
|
* INCLUDE FILES
|
|
* 1) system and project includes
|
|
* 2) needed interfaces from external units
|
|
* 3) internal and external interfaces from this unit
|
|
==================================================================================================*/
|
|
#include "Lpi2c_Ip.h"
|
|
|
|
/*==================================================================================================
|
|
* SOURCE FILE VERSION INFORMATION
|
|
==================================================================================================*/
|
|
#define LPI2C_IP_HWACCESS_VENDOR_ID 43
|
|
#define LPI2C_IP_HWACCESS_AR_RELEASE_MAJOR_VERSION 4
|
|
#define LPI2C_IP_HWACCESS_AR_RELEASE_MINOR_VERSION 4
|
|
#define LPI2C_IP_HWACCESS_AR_RELEASE_REVISION_VERSION 0
|
|
#define LPI2C_IP_HWACCESS_SW_MAJOR_VERSION 0
|
|
#define LPI2C_IP_HWACCESS_SW_MINOR_VERSION 9
|
|
#define LPI2C_IP_HWACCESS_SW_PATCH_VERSION 0
|
|
|
|
|
|
/*******************************************************************************
|
|
* Definitions
|
|
******************************************************************************/
|
|
|
|
|
|
/**
|
|
* LPI2C master interrupts
|
|
*/
|
|
|
|
#define LPI2C_MASTER_DATA_MATCH_INT 0x4000U /**< Data Match Interrupt */
|
|
#define LPI2C_MASTER_PIN_LOW_TIMEOUT_INT 0x2000U /**< Pin Low Timeout Interrupt */
|
|
#define LPI2C_MASTER_FIFO_ERROR_INT 0x1000U /**< FIFO Error Interrupt */
|
|
#define LPI2C_MASTER_ARBITRATION_LOST_INT 0x800U /**< Arbitration Lost Interrupt */
|
|
#define LPI2C_MASTER_NACK_DETECT_INT 0x400U /**< NACK Detect Interrupt */
|
|
#define LPI2C_MASTER_STOP_DETECT_INT 0x200U /**< STOP Detect Interrupt */
|
|
#define LPI2C_MASTER_END_PACKET_INT 0x100U /**< End Packet Interrupt */
|
|
#define LPI2C_MASTER_RECEIVE_DATA_INT 0x2U /**< Receive Data Interrupt */
|
|
#define LPI2C_MASTER_TRANSMIT_DATA_INT 0x1U /**< Transmit Data Interrupt */
|
|
|
|
/**
|
|
* LPI2C slave interrupts
|
|
*/
|
|
#define LPI2C_SLAVE_SMBUS_ALERT_RESPONSE_INT 0x8000U /**< SMBus Alert Response Interrupt */
|
|
#define LPI2C_SLAVE_GENERAL_CALL_INT 0x4000U /**< General Call Interrupt */
|
|
#define LPI2C_SLAVE_ADDRESS_MATCH_1_INT 0x2000U /**< Address Match 1 Interrupt */
|
|
#define LPI2C_SLAVE_ADDRESS_MATCH_0_INT 0x1000U /**< Address Match 0 Interrupt */
|
|
#define LPI2C_SLAVE_FIFO_ERROR_INT 0x800U /**< FIFO Error Interrupt */
|
|
#define LPI2C_SLAVE_BIT_ERROR_INT 0x400U /**< Bit Error Interrupt */
|
|
#define LPI2C_SLAVE_STOP_DETECT_INT 0x200U /**< STOP Detect Interrupt */
|
|
#define LPI2C_SLAVE_REPEATED_START_INT 0x100U /**< Repeated Start Interrupt */
|
|
#define LPI2C_SLAVE_TRANSMIT_ACK_INT 0x8U /**< Transmit ACK Interrupt */
|
|
#define LPI2C_SLAVE_ADDRESS_VALID_INT 0x4U /**< Address Valid Interrupt */
|
|
#define LPI2C_SLAVE_RECEIVE_DATA_INT 0x2U /**< Receive Data Interrupt */
|
|
#define LPI2C_SLAVE_TRANSMIT_DATA_INT 0x1U /**< Transmit Data Interrupt */
|
|
|
|
#define ENABLE_BIT(x) ((uint32)((x == TRUE)?1U:0U))
|
|
|
|
/** @brief Pin configuration selection
|
|
*/
|
|
typedef enum
|
|
{
|
|
LPI2C_CFG_2PIN_OPEN_DRAIN = 0U, /**< 2-pin open drain mode */
|
|
LPI2C_CFG_2PIN_OUTPUT_ONLY = 1U, /**< 2-pin output only mode (ultra-fast mode) */
|
|
LPI2C_CFG_2PIN_PUSH_PULL = 2U, /**< 2-pin push-pull mode */
|
|
LPI2C_CFG_4PIN_PUSH_PULL = 3U, /**< 4-pin push-pull mode */
|
|
LPI2C_CFG_2PIN_OPEN_DRAIN_SLAVE = 4U, /**< 2-pin open drain mode with separate LPI2C slave */
|
|
LPI2C_CFG_2PIN_OUTPUT_ONLY_SLAVE = 5U, /**< 2-pin output only mode (ultra-fast mode) with separate LPI2C slave */
|
|
LPI2C_CFG_2PIN_PUSH_PULL_SLAVE = 6U, /**< 2-pin push-pull mode with separate LPI2C slave */
|
|
LPI2C_CFG_4PIN_PUSH_PULL_INVERTED = 7U, /**< 4-pin push-pull mode (inverted outputs) */
|
|
} Lpi2c_Ip_PinConfigType;
|
|
|
|
/** @brief Master NACK reaction configuration
|
|
*/
|
|
typedef enum
|
|
{
|
|
LPI2C_NACK_RECEIVE = 0U, /**< Receive ACK and NACK normally */
|
|
LPI2C_NACK_IGNORE = 1U, /**< Treat a received NACK as if it was an ACK */
|
|
} Lpi2c_Ip_NackConfigType;
|
|
|
|
/** @brief Slave address configuration
|
|
*/
|
|
typedef enum
|
|
{
|
|
LPI2C_SLAVE_ADDR_MATCH_0_7BIT = 0U, /**< Address match 0 (7-bit) */
|
|
LPI2C_SLAVE_ADDR_MATCH_0_10BIT = 1U, /**< Address match 0 (10-bit) */
|
|
LPI2C_SLAVE_ADDR_MATCH_0_7BIT_OR_1_7BIT = 2U, /**< Address match 0 (7-bit) or Address match 1 (7-bit) */
|
|
LPI2C_SLAVE_ADDR_MATCH_0_10BIT_OR_1_10BIT = 3U, /**< Address match 0 (10-bit) or Address match 1 (10-bit) */
|
|
LPI2C_SLAVE_ADDR_MATCH_0_7BIT_OR_1_10BIT = 4U, /**< Address match 0 (7-bit) or Address match 1 (10-bit) */
|
|
LPI2C_SLAVE_ADDR_MATCH_0_10BIT_OR_1_7BIT = 5U, /**< Address match 0 (10-bit) or Address match 1 (7-bit) */
|
|
LPI2C_SLAVE_ADDR_MATCH_RANGE_7BIT = 6U, /**< From Address match 0 (7-bit) to Address match 1 (7-bit) */
|
|
LPI2C_SLAVE_ADDR_MATCH_RANGE_10BIT = 7U, /**< From Address match 0 (10-bit) to Address match 1 (10-bit) */
|
|
} Lpi2c_Ip_SlaveAddressConfigType;
|
|
|
|
/** @brief Slave NACK reaction configuration
|
|
*/
|
|
typedef enum
|
|
{
|
|
LPI2C_SLAVE_NACK_END_TRANSFER = 0U, /**< Slave will end transfer when NACK detected */
|
|
LPI2C_SLAVE_NACK_CONTINUE_TRANSFER = 1U, /**< Slave will not end transfer when NACK detected */
|
|
} Lpi2c_Ip_SlaveNackConfigType;
|
|
|
|
/** @brief Slave ACK transmission options
|
|
*/
|
|
typedef enum
|
|
{
|
|
LPI2C_SLAVE_TRANSMIT_ACK = 0U, /**< Transmit ACK for received word */
|
|
LPI2C_SLAVE_TRANSMIT_NACK = 1U, /**< Transmit NACK for received word */
|
|
} Lpi2c_Ip_SlaveNackTransmitType;
|
|
|
|
#define I2C_START_SEC_CODE
|
|
#include "I2c_MemMap.h"
|
|
/*******************************************************************************
|
|
* API
|
|
******************************************************************************/
|
|
|
|
#if defined(__cplusplus)
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* @name Configuration
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @brief Get the size of the Master Receive FIFO
|
|
*
|
|
* @details This function returns the size of the Master Receive FIFO, always a power of 2.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @return Master Receive FIFO Size
|
|
*/
|
|
static inline uint16 LPI2C_Get_MasterRxFIFOSize(const LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 tmp = baseAddr->PARAM;
|
|
tmp = (tmp & LPI2C_PARAM_MRXFIFO_MASK) >> LPI2C_PARAM_MRXFIFO_SHIFT;
|
|
tmp = 1UL << tmp; /* RX FIFO size = 2^MRXFIFO */
|
|
return (uint16)tmp;
|
|
}
|
|
|
|
|
|
/**
|
|
* @brief Get the size of the Master Transmit FIFO
|
|
*
|
|
* @details This function returns the size of the Master Transmit FIFO, always a power of 2.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @return Master Transmit FIFO Size
|
|
*/
|
|
static inline uint16 LPI2C_Get_MasterTxFIFOSize(const LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 tmp = baseAddr->PARAM;
|
|
tmp = (tmp & LPI2C_PARAM_MTXFIFO_MASK) >> LPI2C_PARAM_MTXFIFO_SHIFT;
|
|
tmp = 1UL << tmp; /* TX FIFO size = 2^MTXFIFO */
|
|
return (uint16)tmp;
|
|
}
|
|
|
|
|
|
/**
|
|
* @brief Reset the master receive FIFO
|
|
*
|
|
* @details This function empties the receive FIFO of the LPI2C master.
|
|
*
|
|
* @param baseAddr[in] base address of the LPI2C module
|
|
*/
|
|
static inline void LPI2C_Reset_MasterRxFIFOCmd(LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->MCR;
|
|
regValue &= (uint32)(~(LPI2C_MCR_RRF_MASK));
|
|
regValue |= LPI2C_MCR_RRF(1u);
|
|
baseAddr->MCR = (uint32)regValue;
|
|
}
|
|
|
|
|
|
/**
|
|
* @brief Reset the master transmit FIFO
|
|
*
|
|
* @details This function empties the transmit FIFO of the LPI2C master.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
*/
|
|
static inline void LPI2C_Reset_MasterTxFIFOCmd(LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->MCR;
|
|
regValue &= (uint32)(~(LPI2C_MCR_RTF_MASK));
|
|
regValue |= LPI2C_MCR_RTF(1u);
|
|
baseAddr->MCR = (uint32)regValue;
|
|
}
|
|
|
|
/**
|
|
* @brief Set/clear the master reset command
|
|
*
|
|
* @details Calling this function with enable parameter set to true resets all internal
|
|
* master logic and registers, except the Master Control Register. The reset state
|
|
* persists until this function is called with enable parameter set to false.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] enable specifies the reset state of the LPI2C master logic
|
|
*/
|
|
static inline void LPI2C_Set_MasterSoftwareReset(LPI2C_Type *baseAddr, boolean enable)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->MCR;
|
|
regValue &= (uint32)(~(LPI2C_MCR_RST_MASK));
|
|
regValue |= LPI2C_MCR_RST(ENABLE_BIT(enable));
|
|
baseAddr->MCR = (uint32)regValue;
|
|
}
|
|
|
|
/**
|
|
* @brief Enable or disable the LPI2C master
|
|
*
|
|
* @details This function enables or disables the LPI2C module in master mode. If the module
|
|
* is enabled, the transmit FIFO is not empty and the I2C bus is idle, then
|
|
* the LPI2C master will immediately initiate a transfer on the I2C bus.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] enable specifies whether to enable or disable the LPI2C master
|
|
*/
|
|
static inline void LPI2C_Set_MasterEnable(LPI2C_Type *baseAddr, boolean enable)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->MCR;
|
|
regValue &= (uint32)(~(LPI2C_MCR_MEN_MASK));
|
|
regValue |= LPI2C_MCR_MEN(ENABLE_BIT(enable));
|
|
baseAddr->MCR = (uint32)regValue;
|
|
}
|
|
|
|
/**
|
|
* @brief Indicate the availability of receive data
|
|
*
|
|
* @details This function returns true when the number of words in the receive FIFO is greater
|
|
* than the receive FIFO watermark. See function LPI2C_MasterSetRxFIFOWatermark()
|
|
* for configuring the receive FIFO watermark.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @return receive data ready/not ready
|
|
*/
|
|
static inline boolean LPI2C_Get_MasterReceiveDataReadyEvent(const LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->MSR;
|
|
regValue = (regValue & LPI2C_MSR_RDF_MASK) >> LPI2C_MSR_RDF_SHIFT;
|
|
return (boolean)regValue;
|
|
}
|
|
|
|
/**
|
|
* @brief Indicate if the LPI2C master requests more data
|
|
*
|
|
* @details This function returns true when the number of words in the transmit FIFO is equal
|
|
* or less than the transmit FIFO watermark. See function LPI2C_Set_MasterTxFIFOWatermark()
|
|
* for configuring the transmit FIFO watermark.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @return transmit data requested/not requested
|
|
*/
|
|
static inline boolean LPI2C_Get_MasterTransmitDataRequestEvent(const LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->MSR;
|
|
regValue = (regValue & LPI2C_MSR_TDF_MASK) >> LPI2C_MSR_TDF_SHIFT;
|
|
return (boolean)regValue;
|
|
}
|
|
|
|
/**
|
|
* @brief Check the occurrence of a FIFO error event
|
|
*
|
|
* @details This function returns true if the LPI2C master detects an attempt to send or
|
|
* receive data without first generating a (repeated) START condition. This can
|
|
* occur if the transmit FIFO underflows when the AUTOSTOP bit is set. When this
|
|
* flag is set, the LPI2C master will send a STOP condition (if busy) and will
|
|
* not initiate a new START condition until this flag has been cleared.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @return indication of a FIFO error event
|
|
*/
|
|
static inline boolean LPI2C_Get_MasterFIFOErrorEvent(const LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->MSR;
|
|
regValue = (regValue & LPI2C_MSR_FEF_MASK) >> LPI2C_MSR_FEF_SHIFT;
|
|
return (boolean)regValue;
|
|
}
|
|
|
|
/**
|
|
* @brief Check the occurrence of an arbitration lost event
|
|
*
|
|
* @details This function returns true if the LPI2C master detects an arbitration lost
|
|
* condition, as defined by the I2C standard. When this flag sets, the LPI2C
|
|
* master will release the bus (go idle) and will not initiate a new START
|
|
* condition until this flag has been cleared.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @return indication of an arbitration lost event
|
|
*/
|
|
static inline boolean LPI2C_Get_MasterArbitrationLostEvent(const LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->MSR;
|
|
regValue = (regValue & LPI2C_MSR_ALF_MASK) >> LPI2C_MSR_ALF_SHIFT;
|
|
return (boolean)regValue;
|
|
}
|
|
|
|
/**
|
|
* @brief Check the occurrence of an unexpected NACK event
|
|
*
|
|
* @details This function returns true if the LPI2C master detects a NACK when
|
|
* transmitting an address or data. If a NACK is expected for a given address
|
|
* (as configured by the command word) then the flag will set if a NACK is not
|
|
* generated. When set, the master will transmit a STOP condition and will not
|
|
* initiate a new START condition until this flag has been cleared.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @return indication of an unexpected NACK event
|
|
*/
|
|
static inline boolean LPI2C_Get_MasterNACKDetectEvent(const LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->MSR;
|
|
regValue = (regValue & LPI2C_MSR_NDF_MASK) >> LPI2C_MSR_NDF_SHIFT;
|
|
return (boolean)regValue;
|
|
}
|
|
|
|
/**
|
|
* @brief Check the occurrence of an pin low timeout event
|
|
*
|
|
* @details This function returns true if the LPI2C master detects a
|
|
* pin low timeout event. The Pin Low Timeout Flag will set
|
|
* when SCL and/or SDA input is low for more than PINLOW cycles.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @return indication of an pin low timeout event
|
|
*/
|
|
static inline boolean LPI2C_Get_MasterPinLowTimeoutEvent(const LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->MSR;
|
|
regValue = (regValue & LPI2C_MSR_PLTF_MASK) >> LPI2C_MSR_PLTF_SHIFT;
|
|
return (boolean)regValue;
|
|
}
|
|
|
|
/**
|
|
* @brief Clear the FIFO error event flag
|
|
*
|
|
* @details This function clears the FIFO error event. This event must be cleared before
|
|
* the LPI2C master can initiate a START condition.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
*/
|
|
static inline void LPI2C_Clear_MasterFIFOErrorEvent(LPI2C_Type *baseAddr)
|
|
{
|
|
baseAddr->MSR = ((uint32)1U << LPI2C_MSR_FEF_SHIFT);
|
|
}
|
|
|
|
/**
|
|
* @brief Clear the arbitration lost event flag
|
|
*
|
|
* @details This function clears the arbitration lost event. This event must be cleared
|
|
* before the LPI2C master can initiate a START condition.
|
|
*
|
|
* @param baseAddr base address of the LPI2C module
|
|
*/
|
|
static inline void LPI2C_Clear_MasterArbitrationLostEvent(LPI2C_Type *baseAddr)
|
|
{
|
|
baseAddr->MSR = ((uint32)1U << LPI2C_MSR_ALF_SHIFT);
|
|
}
|
|
|
|
/**
|
|
* @brief Clear the unexpected NACK event flag
|
|
*
|
|
* @details This function clears the unexpected NACK event. This event must be cleared
|
|
* before the LPI2C master can initiate a START condition.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
*/
|
|
static inline void LPI2C_Clear_MasterNACKDetectEvent(LPI2C_Type *baseAddr)
|
|
{
|
|
baseAddr->MSR = ((uint32)1U << LPI2C_MSR_NDF_SHIFT);
|
|
}
|
|
|
|
|
|
/**
|
|
* @brief Clear the pin low timeout event flag
|
|
*
|
|
* @details This function clears the pin low timeout event. This event must be cleared
|
|
* before the LPI2C master can initiate a START condition.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
*/
|
|
static inline void LPI2C_Clear_MasterPinLowTimeoutEvent(LPI2C_Type *baseAddr)
|
|
{
|
|
baseAddr->MSR = ((uint32)1U << LPI2C_MSR_PLTF_SHIFT);
|
|
}
|
|
|
|
|
|
/**
|
|
* @brief Enable/disable receive data DMA requests
|
|
*
|
|
* @details This function enables or disables generation of Rx DMA requests when data
|
|
* can be read from the receive FIFO, as configured by the receive FIFO watermark.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] enable specifies whether to enable or disable DMA requests
|
|
*/
|
|
static inline void LPI2C_Set_MasterRxDMA(LPI2C_Type *baseAddr, boolean enable)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->MDER;
|
|
regValue &= (uint32)(~(LPI2C_MDER_RDDE_MASK));
|
|
regValue |= LPI2C_MDER_RDDE(ENABLE_BIT(enable));
|
|
baseAddr->MDER = (uint32)regValue;
|
|
}
|
|
|
|
/**
|
|
* @brief Enable/disable transmit data DMA requests
|
|
*
|
|
* @details This function enables or disables generation of Tx DMA requests when data
|
|
* can be written to the transmit FIFO, as configured by the transmit FIFO watermark.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] enable specifies whether to enable or disable DMA requests
|
|
*/
|
|
static inline void LPI2C_Set_MasterTxDMA(LPI2C_Type *baseAddr, boolean enable)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->MDER;
|
|
regValue &= (uint32)(~(LPI2C_MDER_TDDE_MASK));
|
|
regValue |= LPI2C_MDER_TDDE(ENABLE_BIT(enable));
|
|
baseAddr->MDER = (uint32)regValue;
|
|
}
|
|
|
|
/**
|
|
* @brief Enable or disable specified LPI2C master interrupts
|
|
*
|
|
* @details This function can enable or disable one or more master interrupt sources
|
|
* specified by the interrupts parameter.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] interrupts interrupts to be enabled or disabled;
|
|
* must be a bitwise or between one or more of the following constants:
|
|
* - LPI2C_MASTER_DATA_MATCH_INT - Data Match Interrupt
|
|
* - LPI2C_MASTER_PIN_LOW_TIMEOUT_INT - Pin Low Timeout Interrupt
|
|
* - LPI2C_MASTER_FIFO_ERROR_INT - FIFO Error Interrupt
|
|
* - LPI2C_MASTER_ARBITRATION_LOST_INT - Arbitration Lost Interrupt
|
|
* - LPI2C_MASTER_NACK_DETECT_INT - NACK Detect Interrupt
|
|
* - LPI2C_MASTER_STOP_DETECT_INT - STOP Detect Interrupt
|
|
* - LPI2C_MASTER_END_PACKET_INT - End Packet Interrupt
|
|
* - LPI2C_MASTER_RECEIVE_DATA_INT - Receive Data Interrupt
|
|
* - LPI2C_MASTER_TRANSMIT_DATA_INT - Transmit Data Interrupt
|
|
* @param enable specifies whether to enable or disable specified interrupts
|
|
*/
|
|
static inline void LPI2C_Set_MasterInt(LPI2C_Type *baseAddr, uint32 interrupts, boolean enable)
|
|
{
|
|
uint32 tmp = baseAddr->MIER;
|
|
|
|
if (enable == TRUE)
|
|
{
|
|
tmp |= interrupts;
|
|
}
|
|
else
|
|
{
|
|
tmp &= ~interrupts;
|
|
}
|
|
baseAddr->MIER = tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Set the pin mode of the module
|
|
*
|
|
* @details This function sets the pin mode of the module. See type Lpi2c_Ip_PinConfigType for
|
|
* a description of available modes.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] configuration pin mode of the module
|
|
*/
|
|
static inline void LPI2C_Set_MasterPinConfig(LPI2C_Type *baseAddr, Lpi2c_Ip_PinConfigType configuration)
|
|
{
|
|
uint32 tmp = baseAddr->MCFGR1;
|
|
tmp &= ~(LPI2C_MCFGR1_PINCFG_MASK);
|
|
tmp |= LPI2C_MCFGR1_PINCFG(configuration);
|
|
baseAddr->MCFGR1 = (uint32)tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Set the master glitch filter for SDA
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] configuration pin mode of the module
|
|
*/
|
|
static inline void LPI2C_Set_MasterGlitchFilterSDA(LPI2C_Type *baseAddr, uint32 cycles)
|
|
{
|
|
uint32 tmp = baseAddr->MCFGR2;
|
|
tmp &= ~(LPI2C_MCFGR2_FILTSDA_MASK);
|
|
tmp |= LPI2C_MCFGR2_FILTSDA(cycles);
|
|
baseAddr->MCFGR2 = (uint32)tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Set the master glitch filter for SCL
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] configuration pin mode of the module
|
|
*/
|
|
static inline void LPI2C_Set_MasterGlitchFilterSCL(LPI2C_Type *baseAddr, uint32 cycles)
|
|
{
|
|
uint32 tmp = baseAddr->MCFGR2;
|
|
tmp &= ~(LPI2C_MCFGR2_FILTSCL_MASK);
|
|
tmp |= LPI2C_MCFGR2_FILTSCL(cycles);
|
|
baseAddr->MCFGR2 = (uint32)tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Set the slave glitch filter for SDA
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] configuration pin mode of the module
|
|
*/
|
|
static inline void LPI2C_Set_SlaveGlitchFilterSDA(LPI2C_Type *baseAddr, uint32 cycles)
|
|
{
|
|
uint32 tmp = baseAddr->SCFGR2;
|
|
tmp &= ~(LPI2C_SCFGR2_FILTSDA_MASK);
|
|
tmp |= LPI2C_SCFGR2_FILTSDA(cycles);
|
|
baseAddr->SCFGR2 = (uint32)tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Set the slave glitch filter for SCL
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] configuration pin mode of the module
|
|
*/
|
|
static inline void LPI2C_Set_SlaveGlitchFilterSCL(LPI2C_Type *baseAddr, uint32 cycles)
|
|
{
|
|
uint32 tmp = baseAddr->SCFGR2;
|
|
tmp &= ~(LPI2C_SCFGR2_FILTSCL_MASK);
|
|
tmp |= LPI2C_SCFGR2_FILTSCL(cycles);
|
|
baseAddr->SCFGR2 = (uint32)tmp;
|
|
}
|
|
|
|
|
|
/**
|
|
* @brief Set the pin low timeout
|
|
*
|
|
* @details This function configures the pin low timeout
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] u32Timeout timeout period in clock cycles
|
|
*/
|
|
static inline void LPI2C_Set_MasterPinLowTimeout(LPI2C_Type *baseAddr, uint32 u32Timeout)
|
|
{
|
|
uint32 tmp = baseAddr->MCFGR3;
|
|
tmp &= ~(LPI2C_MCFGR3_PINLOW_MASK);
|
|
tmp |= LPI2C_MCFGR3_PINLOW(u32Timeout);
|
|
baseAddr->MCFGR3 = (uint32)tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Set pin low timeout for SDA or SCL
|
|
*
|
|
* @details This function configures the pin low timeout only for SCL or, for SCL or SDA.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] configuration "0" - Pin Low Timeout Flag will set only for SCL, "1" - Pin Low Timeout Flag
|
|
will set if either SCL or SDA is low longer than the configured timeout.
|
|
*/
|
|
static inline void LPI2C_Set_MasterPinLowTimeoutConfiguration(LPI2C_Type *baseAddr, boolean configuration)
|
|
{
|
|
uint32 tmp = baseAddr->MCFGR1;
|
|
tmp &= ~(LPI2C_MCFGR1_TIMECFG_MASK);
|
|
tmp |= LPI2C_MCFGR1_TIMECFG(ENABLE_BIT(configuration));
|
|
baseAddr->MCFGR1 = (uint32)tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Set the bus idle timeout
|
|
*
|
|
* @details This function configures the bus idle timeout
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] u32Timeout timeout period in clock cycles
|
|
*/
|
|
static inline void LPI2C_Set_MasterBusIdleTimeout(LPI2C_Type *baseAddr, uint32 u32Timeout)
|
|
{
|
|
uint32 tmp = baseAddr->MCFGR2;
|
|
tmp &= ~(LPI2C_MCFGR2_BUSIDLE_MASK);
|
|
tmp |= LPI2C_MCFGR2_BUSIDLE(u32Timeout);
|
|
baseAddr->MCFGR2 = tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Configure the reaction of the module on NACK reception
|
|
*
|
|
* @details This function configures how the LPI2C master reacts when receiving a NACK. NACK responses can
|
|
* be treated normally or ignored. In Ultra-Fast mode it is necessary to configure the module to
|
|
* ignore NACK responses.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] configuration set reaction of the module on NACK reception
|
|
*/
|
|
static inline void LPI2C_Set_MasterNACKConfig(LPI2C_Type *baseAddr, Lpi2c_Ip_NackConfigType configuration)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->MCFGR1;
|
|
regValue &= (uint32)(~(LPI2C_MCFGR1_IGNACK_MASK));
|
|
regValue |= LPI2C_MCFGR1_IGNACK(configuration);
|
|
baseAddr->MCFGR1 = (uint32)regValue;
|
|
}
|
|
|
|
/**
|
|
* @brief Configure the LPI2C master prescaler
|
|
*
|
|
* @details This function configures the clock prescaler used for all LPI2C master logic,
|
|
* except the digital glitch filters.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] prescaler LPI2C master prescaler
|
|
*/
|
|
static inline void LPI2C_Set_MasterPrescaler(LPI2C_Type *baseAddr, Lpi2c_Ip_MasterPrescalerType prescaler)
|
|
{
|
|
uint32 tmp = baseAddr->MCFGR1;
|
|
tmp &= ~(LPI2C_MCFGR1_PRESCALE_MASK);
|
|
tmp |= LPI2C_MCFGR1_PRESCALE(prescaler);
|
|
baseAddr->MCFGR1 = tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Return the LPI2C master prescaler
|
|
*
|
|
* @details This function returns the currently configured clock prescaler.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @return LPI2C master prescaler
|
|
*/
|
|
static inline Lpi2c_Ip_MasterPrescalerType LPI2C_Get_MasterPrescaler(const LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 tmp = baseAddr->MCFGR1;
|
|
tmp = (tmp & LPI2C_MCFGR1_PRESCALE_MASK) >> LPI2C_MCFGR1_PRESCALE_SHIFT;
|
|
return (Lpi2c_Ip_MasterPrescalerType)tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Return the configured minimum clock high period
|
|
*
|
|
* @details This function returns the currently configured value for clock high period.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @return minimum clock high period
|
|
*/
|
|
static inline uint8 LPI2C_Get_MasterClockHighPeriod(const LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 tmp = baseAddr->MCCR0;
|
|
tmp = (tmp & LPI2C_MCCR0_CLKHI_MASK) >> LPI2C_MCCR0_CLKHI_SHIFT;
|
|
return (uint8)tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Set the minimum clock high period
|
|
*
|
|
* @details This function configures the minimum number of cycles (minus one) that the
|
|
* SCL clock is driven high by the master. The SCL high time is extended by the
|
|
* time it takes to detect a rising edge on the external SCL pin. Ignoring any
|
|
* additional board delay due to external loading, this is equal to
|
|
* (2 + FILTSCL) / 2^PRESCALE cycles.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param value minimum clock high period
|
|
*/
|
|
static inline void LPI2C_Set_MasterClockHighPeriod(LPI2C_Type *baseAddr, uint8 value)
|
|
{
|
|
uint32 tmp = baseAddr->MCCR0;
|
|
tmp &= ~(LPI2C_MCCR0_CLKHI_MASK);
|
|
tmp |= LPI2C_MCCR0_CLKHI(value);
|
|
baseAddr->MCCR0 = tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Set the data hold time for SDA
|
|
*
|
|
* @details This function sets the minimum number of cycles (minus one) that is used as the
|
|
* data hold time for SDA. Must be configured less than the minimum SCL low period.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] value value of the data hold time for SDA
|
|
*/
|
|
static inline void LPI2C_Set_MasterDataValidDelay(LPI2C_Type *baseAddr, uint8 value)
|
|
{
|
|
uint32 tmp = baseAddr->MCCR0;
|
|
tmp &= ~(LPI2C_MCCR0_DATAVD_MASK);
|
|
tmp |= LPI2C_MCCR0_DATAVD(value);
|
|
baseAddr->MCCR0 = tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Set the setup and hold delay for a START / STOP condition
|
|
*
|
|
* @details This function configures the Minimum number of cycles (minus one) that is used
|
|
* by the master as the setup and hold time for a (repeated) START condition and setup
|
|
* time for a STOP condition. The setup time is extended by the time it takes to detect
|
|
* a rising edge on the external SCL pin. Ignoring any additional board delay due to
|
|
* external loading, this is equal to (2 + FILTSCL) / 2^PRESCALE cycles.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] value setup and hold time for a START / STOP condition
|
|
*/
|
|
static inline void LPI2C_Set_MasterSetupHoldDelay(LPI2C_Type *baseAddr, uint8 value)
|
|
{
|
|
uint32 tmp = baseAddr->MCCR0;
|
|
tmp &= ~(LPI2C_MCCR0_SETHOLD_MASK);
|
|
tmp |= LPI2C_MCCR0_SETHOLD(value);
|
|
baseAddr->MCCR0 = tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Set the minimum clock low period
|
|
*
|
|
* @details This function configures the minimum number of cycles (minus one) that the
|
|
* SCL clock is driven low by the master. This value is also used for the
|
|
* minimum bus free time between a STOP and a START condition.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] value minimum clock low period
|
|
*/
|
|
static inline void LPI2C_Set_MasterClockLowPeriod(LPI2C_Type *baseAddr, uint8 value)
|
|
{
|
|
uint32 tmp = baseAddr->MCCR0;
|
|
tmp &= ~(LPI2C_MCCR0_CLKLO_MASK);
|
|
tmp |= LPI2C_MCCR0_CLKLO(value);
|
|
baseAddr->MCCR0 = tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Return the configured minimum clock low period
|
|
*
|
|
* @details This function returns the currently configured value for clock low period.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @return minimum clock low period
|
|
*/
|
|
static inline uint8 LPI2C_Get_MasterClockLowPeriod(const LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 tmp = baseAddr->MCCR0;
|
|
tmp = (tmp & LPI2C_MCCR0_CLKLO_MASK) >> LPI2C_MCCR0_CLKLO_SHIFT;
|
|
return (uint8)tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Set the data hold time for SDA in high-speed mode
|
|
*
|
|
* @details This function sets the minimum number of cycles (minus one) that is used as the
|
|
* data hold time for SDA in High-Speed mode. Must be configured less than the
|
|
* minimum SCL low period.
|
|
* This setting only has effect during High-Speed mode transfers.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] value value of the data hold time for SDA
|
|
*/
|
|
static inline void LPI2C_Set_MasterDataValidDelayHS(LPI2C_Type *baseAddr, uint8 value)
|
|
{
|
|
uint32 tmp = baseAddr->MCCR1;
|
|
tmp &= ~(LPI2C_MCCR1_DATAVD_MASK);
|
|
tmp |= LPI2C_MCCR1_DATAVD(value);
|
|
baseAddr->MCCR1 = tmp;
|
|
}
|
|
|
|
|
|
/**
|
|
* @brief Set the setup and hold time for a START / STOP condition in high-speed mode
|
|
*
|
|
* @details This function configures the Minimum number of cycles (minus one) that is used
|
|
* by the master as the setup and hold time for a (repeated) START condition and setup
|
|
* time for a STOP condition. The setup time is extended by the time it takes to detect
|
|
* a rising edge on the external SCL pin. Ignoring any additional board delay due to
|
|
* external loading, this is equal to (2 + FILTSCL) / 2^PRESCALE cycles.
|
|
* This setting only has effect during High-Speed mode transfers.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] value setup and hold time for a START / STOP condition
|
|
*/
|
|
static inline void LPI2C_Set_MasterSetupHoldDelayHS(LPI2C_Type *baseAddr, uint8 value)
|
|
{
|
|
uint32 tmp = baseAddr->MCCR1;
|
|
tmp &= ~(LPI2C_MCCR1_SETHOLD_MASK);
|
|
tmp |= LPI2C_MCCR1_SETHOLD(value);
|
|
baseAddr->MCCR1 = tmp;
|
|
}
|
|
|
|
|
|
/**
|
|
* @brief Set the minimum clock high period in high-speed mode
|
|
*
|
|
* @details This function configures the minimum number of cycles (minus one) that the
|
|
* SCL clock is driven high by the master. The SCL high time is extended by the
|
|
* time it takes to detect a rising edge on the external SCL pin. Ignoring any
|
|
* additional board delay due to external loading, this is equal to
|
|
* (2 + FILTSCL) / 2^PRESCALE cycles.
|
|
* This setting only has effect during High-Speed mode transfers.
|
|
*
|
|
* @param baseAddr base address of the LPI2C module
|
|
* @param value minimum clock high period
|
|
*/
|
|
static inline void LPI2C_Set_MasterClockHighPeriodHS(LPI2C_Type *baseAddr, uint8 value)
|
|
{
|
|
uint32 tmp = baseAddr->MCCR1;
|
|
tmp &= ~(LPI2C_MCCR1_CLKHI_MASK);
|
|
tmp |= LPI2C_MCCR1_CLKHI(value);
|
|
baseAddr->MCCR1 = tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Return the configured minimum clock high period in high-speed mode
|
|
*
|
|
* @details This function returns the currently configured value for clock high period
|
|
* in high-speed mode.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @return minimum clock high period
|
|
*/
|
|
static inline uint8 LPI2C_Get_MasterClockHighPeriodHS(const LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 tmp = baseAddr->MCCR1;
|
|
tmp = (tmp & LPI2C_MCCR1_CLKHI_MASK) >> LPI2C_MCCR1_CLKHI_SHIFT;
|
|
return (uint8)tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Set the minimum clock low period in high-speed mode
|
|
*
|
|
* @details This function configures the minimum number of cycles (minus one) that the
|
|
* SCL clock is driven low by the master. This value is also used for the
|
|
* minimum bus free time between a STOP and a START condition.
|
|
* This setting only has effect during High-Speed mode transfers.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] value minimum clock low period
|
|
*/
|
|
static inline void LPI2C_Set_MasterClockLowPeriodHS(LPI2C_Type *baseAddr, uint8 value)
|
|
{
|
|
uint32 tmp = baseAddr->MCCR1;
|
|
tmp &= ~(LPI2C_MCCR1_CLKLO_MASK);
|
|
tmp |= LPI2C_MCCR1_CLKLO(value);
|
|
baseAddr->MCCR1 = tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Return the configured minimum clock low period in high-speed mode
|
|
*
|
|
* @details This function returns the currently configured value for clock low period
|
|
* in high-speed mode.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @return minimum clock low period
|
|
*/
|
|
static inline uint8 LPI2C_Get_MasterClockLowPeriodHS(const LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 tmp = baseAddr->MCCR1;
|
|
tmp = (tmp & LPI2C_MCCR1_CLKLO_MASK) >> LPI2C_MCCR1_CLKLO_SHIFT;
|
|
return (uint8)tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Set the receive FIFO watermark
|
|
*
|
|
* @details This function configures the receive FIFO watermark. Whenever the number of words in the receive
|
|
* FIFO is greater than the receive FIFO watermark, a receive data ready event is generated.
|
|
* Writing a value equal or greater than the FIFO size will be truncated.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] value number of words in the receive FIFO that will cause the receive data flag to be set
|
|
*/
|
|
static inline void LPI2C_Set_MasterRxFIFOWatermark(LPI2C_Type *baseAddr, uint16 value)
|
|
{
|
|
uint32 tmp = baseAddr->MFCR;
|
|
tmp &= ~(LPI2C_MFCR_RXWATER_MASK);
|
|
tmp |= LPI2C_MFCR_RXWATER(value);
|
|
baseAddr->MFCR = tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Return the configured receive FIFO watermark
|
|
*
|
|
* @details This function returns the currently configured value for receive FIFO watermark
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @return number of words in the receive FIFO that will cause the receive data flag to be set
|
|
*/
|
|
static inline uint16 LPI2C_Get_MasterRxFIFOWatermark(const LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 tmp = baseAddr->MFCR;
|
|
tmp = (tmp & LPI2C_MFCR_RXWATER_MASK) >> LPI2C_MFCR_RXWATER_SHIFT;
|
|
return (uint16)tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Set the transmit FIFO watermark
|
|
*
|
|
* @details This function configures the transmit FIFO watermark. Whenever the number of words in the transmit
|
|
* FIFO is greater than the transmit FIFO watermark, a transmit data request event is generated.
|
|
* Writing a value equal or greater than the FIFO size will be truncated.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] value number of words in the transmit FIFO that will cause the transmit data flag to be set
|
|
*/
|
|
static inline void LPI2C_Set_MasterTxFIFOWatermark(LPI2C_Type *baseAddr, uint16 value)
|
|
{
|
|
uint32 tmp = baseAddr->MFCR;
|
|
tmp &= ~(LPI2C_MFCR_TXWATER_MASK);
|
|
tmp |= LPI2C_MFCR_TXWATER(value);
|
|
baseAddr->MFCR = tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Return the number of words in the receive FIFO
|
|
*
|
|
* @details This function returns the number of words currently available in the receive FIFO.
|
|
*
|
|
* @param baseAddr base address of the LPI2C module
|
|
* @return the number of words in the receive FIFO
|
|
*/
|
|
static inline uint16 LPI2C_Get_MasterRxFIFOCount(const LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 tmp = baseAddr->MFSR;
|
|
tmp = (tmp & LPI2C_MFSR_RXCOUNT_MASK) >> LPI2C_MFSR_RXCOUNT_SHIFT;
|
|
return (uint16)tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Return the number of words in the transmit FIFO
|
|
*
|
|
* @details This function returns the number of words currently available in the transmit FIFO.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @return the number of words in the transmit FIFO
|
|
*/
|
|
static inline uint16 LPI2C_Get_MasterTxFIFOCount(const LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 tmp = baseAddr->MFSR;
|
|
tmp = (tmp & LPI2C_MFSR_TXCOUNT_MASK) >> LPI2C_MFSR_TXCOUNT_SHIFT;
|
|
return (uint16)tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Provide commands and data for the LPI2C master
|
|
*
|
|
* @details This function stores commands and data in the transmit FIFO and increments the FIFO
|
|
* write pointer.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] cmd command for the LPI2C master
|
|
* @param[in] data data for the LPI2C master
|
|
*/
|
|
static inline void LPI2C_Cmd_MasterTransmit(LPI2C_Type *baseAddr, Lpi2c_Ip_MasterCommandType cmd, uint8 data)
|
|
{
|
|
baseAddr->MTDR = ((uint32)cmd << 8U) + (uint32)data;
|
|
}
|
|
|
|
/**
|
|
* @brief Return the received data
|
|
*
|
|
* @details This function returns data received by the I2C master that has not been discarded
|
|
* due to data match settings or active command, and increments the FIFO read pointer.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @return data received by the LPI2C master
|
|
*/
|
|
static inline uint8 LPI2C_Get_MasterRxData(const LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 tmp = baseAddr->MRDR;
|
|
tmp = (tmp & LPI2C_MRDR_DATA_MASK) >> LPI2C_MRDR_DATA_SHIFT;
|
|
return (uint8)tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Enable or disable the LPI2C slave
|
|
*
|
|
* @details This function enables or disables the LPI2C module in slave mode.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] enable specifies whether to enable or disable the LPI2C slave
|
|
*/
|
|
static inline void LPI2C_Set_SlaveEnable(LPI2C_Type *baseAddr, boolean enable)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->SCR;
|
|
regValue &= (uint32)(~(LPI2C_SCR_SEN_MASK));
|
|
regValue |= LPI2C_SCR_SEN(enable);
|
|
baseAddr->SCR = (uint32)regValue;
|
|
}
|
|
|
|
/**
|
|
* @brief Set/clear the slave reset command
|
|
*
|
|
* @details Calling this function with enable parameter set to true will perform a software
|
|
* reset of the LPI2C slave.
|
|
*
|
|
* @param baseAddr base address of the LPI2C module
|
|
* @param enable specifies the reset state of the LPI2C slave logic
|
|
*/
|
|
static inline void LPI2C_Set_SlaveSoftwareReset(LPI2C_Type *baseAddr, boolean enable)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->SCR;
|
|
regValue &= (uint32)(~(LPI2C_SCR_RST_MASK));
|
|
regValue |= LPI2C_SCR_RST(ENABLE_BIT(enable));
|
|
baseAddr->SCR = (uint32)regValue;
|
|
}
|
|
|
|
#if(LPI2C_HAS_ULTRA_FAST_MODE)
|
|
/**
|
|
* @brief Check the detection of a FIFO overflow or underflow
|
|
*
|
|
* @details This function checks for the occurrence of a slave FIFO overflow or underflow.
|
|
* This event can only occur if clock stretching is disabled.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @return indication of a FIFO overflow or underflow
|
|
*/
|
|
static inline boolean LPI2C_Get_SlaveFIFOErrorEvent(const LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->SSR;
|
|
regValue = (regValue & LPI2C_SSR_FEF_MASK) >> LPI2C_SSR_FEF_SHIFT;
|
|
return (boolean)regValue;
|
|
}
|
|
#endif
|
|
|
|
/**
|
|
* @brief Check the detection of a bit error
|
|
*
|
|
* @details This function checks for the occurrence of a bit error event. This event occurs
|
|
* if the LPI2C slave transmits a logic one and detects a logic zero on the I2C bus. The
|
|
* slave will ignore the rest of the transfer until the next (repeated) START condition.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @return indication of a bit error
|
|
*/
|
|
static inline boolean LPI2C_Get_SlaveBitErrorEvent(const LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->SSR;
|
|
regValue = (regValue & LPI2C_SSR_BEF_MASK) >> LPI2C_SSR_BEF_SHIFT;
|
|
return (boolean)regValue;
|
|
}
|
|
|
|
/**
|
|
* @brief Check the detection of a STOP condition
|
|
*
|
|
* @details This function checks for the detection of a STOP condition, after the LPI2C slave
|
|
* matched the last address byte.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @return indication of a STOP condition
|
|
*/
|
|
static inline boolean LPI2C_Get_SlaveSTOPDetectEvent(const LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->SSR;
|
|
regValue = (regValue & LPI2C_SSR_SDF_MASK) >> LPI2C_SSR_SDF_SHIFT;
|
|
return (boolean)regValue;
|
|
}
|
|
|
|
/**
|
|
* @brief Check the detection of a repeated START condition
|
|
*
|
|
* @details This function checks for the detection of a repeated START condition, after
|
|
* the LPI2C slave matched the last address byte. This event does not occur
|
|
* when the slave first detects a START condition.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @return indication of a repeated START condition
|
|
*/
|
|
static inline boolean LPI2C_Get_SlaveRepeatedStartEvent(const LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->SSR;
|
|
regValue = (regValue & LPI2C_SSR_RSF_MASK) >> LPI2C_SSR_RSF_SHIFT;
|
|
return (boolean)regValue;
|
|
}
|
|
|
|
/**
|
|
* @brief Check the validity of the Address Status Register
|
|
*
|
|
* @details This function checks for the detection of a valid address. The event is
|
|
* cleared by reading the address - see function LPI2C_Get_SlaveReceivedAddr().
|
|
* It can also be cleared by reading the data register, when data register has
|
|
* been configured to allow address reads.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @return indication of the validity of the Address Status Register
|
|
*/
|
|
static inline boolean LPI2C_Get_SlaveAddressValidEvent(const LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->SSR;
|
|
regValue = (regValue & LPI2C_SSR_AVF_MASK) >> LPI2C_SSR_AVF_SHIFT;
|
|
return (boolean)regValue;
|
|
}
|
|
|
|
/**
|
|
* @brief Check the availability of receive data
|
|
*
|
|
* @details This function checks for the availability of data received by the I2C slave.
|
|
* The event is cleared by reading the received data - see function
|
|
* LPI2C_Get_SlaveData(). The event is not cleared by calling
|
|
* LPI2C_Get_SlaveData() if the data register is configured to allow address
|
|
* reads and an address valid event is active.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @return indication of receive data availability
|
|
*/
|
|
static inline boolean LPI2C_Get_SlaveReceiveDataEvent(const LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->SSR;
|
|
regValue = (regValue & LPI2C_SSR_RDF_MASK) >> LPI2C_SSR_RDF_SHIFT;
|
|
return (boolean)regValue;
|
|
}
|
|
|
|
/**
|
|
* @brief Check if transmit data is requested
|
|
*
|
|
* @details This function checks if the LPI2C slave requests data to transmit. The
|
|
* event is cleared by providing transmit data - see function
|
|
* LPI2C_Transmit_SlaveData(). The event can also be automatically cleared
|
|
* if the LPI2C module detects a NACK or a repeated START or STOP condition
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @return indication of a transmit data request
|
|
*/
|
|
static inline boolean LPI2C_Get_SlaveTransmitDataEvent(const LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->SSR;
|
|
regValue = (regValue & LPI2C_SSR_TDF_MASK) >> LPI2C_SSR_TDF_SHIFT;
|
|
return (boolean)regValue;
|
|
}
|
|
|
|
#if(LPI2C_HAS_ULTRA_FAST_MODE)
|
|
/**
|
|
* @brief Clear the FIFO overflow or underflow flag
|
|
*
|
|
* @details This function clears the FIFO overflow or underflow event.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
*/
|
|
static inline void LPI2C_Clear_SlaveFIFOErrorEvent(LPI2C_Type *baseAddr)
|
|
{
|
|
baseAddr->SSR = ((uint32)1U << LPI2C_SSR_FEF_SHIFT);
|
|
}
|
|
#endif
|
|
|
|
/**
|
|
* @brief Clear bit error flag
|
|
*
|
|
* @details This function clears the bit error event.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
*/
|
|
static inline void LPI2C_Clear_SlaveBitErrorEvent(LPI2C_Type *baseAddr)
|
|
{
|
|
baseAddr->SSR = ((uint32)1U << LPI2C_SSR_BEF_SHIFT);
|
|
}
|
|
|
|
/**
|
|
* @brief Clear the STOP detect flag
|
|
*
|
|
* @details This function clears the STOP detect event.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
*/
|
|
static inline void LPI2C_Clear_SlaveSTOPDetectEvent(LPI2C_Type *baseAddr)
|
|
{
|
|
baseAddr->SSR = ((uint32)1U << LPI2C_SSR_SDF_SHIFT);
|
|
}
|
|
|
|
/**
|
|
* @brief Clear the repeated START detect flag
|
|
*
|
|
* @details This function clears the repeated START detect event.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
*/
|
|
static inline void LPI2C_Clear_SlaveRepeatedStartEvent(LPI2C_Type *baseAddr)
|
|
{
|
|
baseAddr->SSR = ((uint32)1U << LPI2C_SSR_RSF_SHIFT);
|
|
}
|
|
|
|
/**
|
|
* @brief Enable or disable specified LPI2C slave interrupts
|
|
*
|
|
* @details This function can enable or disable one or more slave interrupt sources
|
|
* specified by the interrupts parameter.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] interrupts interrupts to be enabled or disabled;
|
|
* must be a bitwise or between one or more of the following constants:
|
|
* - LPI2C_SLAVE_SMBUS_ALERT_RESPONSE - SMBus Alert Response Interrupt
|
|
* - LPI2C_SLAVE_GENERAL_CALL - General Call Interrupt
|
|
* - LPI2C_SLAVE_ADDRESS_MATCH_1 - Address Match 1 Interrupt
|
|
* - LPI2C_SLAVE_ADDRESS_MATCH_0 - Address Match 0 Interrupt
|
|
* - LPI2C_SLAVE_FIFO_ERROR - FIFO Error Interrupt
|
|
* - LPI2C_SLAVE_BIT_ERROR - Bit Error Interrupt
|
|
* - LPI2C_SLAVE_STOP_DETECT - STOP Detect Interrupt
|
|
* - LPI2C_SLAVE_REPEATED_START - Repeated Start Interrupt
|
|
* - LPI2C_SLAVE_TRANSMIT_ACK - Transmit ACK Interrupt
|
|
* - LPI2C_SLAVE_ADDRESS_VALID - Address Valid Interrupt
|
|
* - LPI2C_SLAVE_RECEIVE_DATA - Receive Data Interrupt
|
|
* - LPI2C_SLAVE_TRANSMIT_DATA - Transmit Data Interrupt
|
|
* @param[in] enable specifies whether to enable or disable specified interrupts
|
|
*/
|
|
static inline void LPI2C_Set_SlaveInt(LPI2C_Type *baseAddr, uint32 interrupts, boolean enable)
|
|
{
|
|
uint32 tmp = baseAddr->SIER;
|
|
|
|
if (enable == TRUE)
|
|
{
|
|
tmp |= interrupts;
|
|
}
|
|
else
|
|
{
|
|
tmp &= ~interrupts;
|
|
}
|
|
baseAddr->SIER = tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Return the state of the specified LPI2C slave interrupt
|
|
*
|
|
* @details This function returns the enabled/disabled state of the slave interrupt
|
|
* source specified by the interrupt parameter.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] interrupts interrupt for which the check is made;
|
|
* must be one of the following constants:
|
|
* - LPI2C_SLAVE_SMBUS_ALERT_RESPONSE - SMBus Alert Response Interrupt
|
|
* - LPI2C_SLAVE_GENERAL_CALL - General Call Interrupt
|
|
* - LPI2C_SLAVE_ADDRESS_MATCH_1 - Address Match 1 Interrupt
|
|
* - LPI2C_SLAVE_ADDRESS_MATCH_0 - Address Match 0 Interrupt
|
|
* - LPI2C_SLAVE_FIFO_ERROR - FIFO Error Interrupt
|
|
* - LPI2C_SLAVE_BIT_ERROR - Bit Error Interrupt
|
|
* - LPI2C_SLAVE_STOP_DETECT - STOP Detect Interrupt
|
|
* - LPI2C_SLAVE_REPEATED_START - Repeated Start Interrupt
|
|
* - LPI2C_SLAVE_TRANSMIT_ACK - Transmit ACK Interrupt
|
|
* - LPI2C_SLAVE_ADDRESS_VALID - Address Valid Interrupt
|
|
* - LPI2C_SLAVE_RECEIVE_DATA - Receive Data Interrupt
|
|
* - LPI2C_SLAVE_TRANSMIT_DATA - Transmit Data Interrupt
|
|
* @return enable/disable state of specified interrupt
|
|
*/
|
|
static inline boolean LPI2C_Get_SlaveInt(const LPI2C_Type *baseAddr, uint32 interrupts)
|
|
{
|
|
uint32 tmp = baseAddr->SIER;
|
|
boolean hasInterrupts;
|
|
|
|
if ((tmp & interrupts) != (uint32)0U)
|
|
{
|
|
hasInterrupts = TRUE;
|
|
}
|
|
else
|
|
{
|
|
hasInterrupts = FALSE;
|
|
}
|
|
|
|
return hasInterrupts;
|
|
}
|
|
|
|
/**
|
|
* @brief Enable/disable slave receive data DMA requests
|
|
*
|
|
* @details This function enables or disables generation of Rx DMA requests when received
|
|
* data is available.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] enable specifies whether to enable or disable receive data DMA requests
|
|
*/
|
|
static inline void LPI2C_Set_SlaveRxDMA(LPI2C_Type *baseAddr, boolean enable)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->SDER;
|
|
regValue &= (uint32)(~(LPI2C_SDER_RDDE_MASK));
|
|
regValue |= LPI2C_SDER_RDDE(ENABLE_BIT(enable));
|
|
baseAddr->SDER = (uint32)regValue;
|
|
}
|
|
|
|
/**
|
|
* @brief Enable/disable slave transmit data DMA requests
|
|
*
|
|
* @details This function enables or disables generation of Tx DMA requests when the module
|
|
* requires more data to transmit.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] enable specifies whether to enable or disable transmit data DMA requests
|
|
*/
|
|
static inline void LPI2C_Set_SlaveTxDMA(LPI2C_Type *baseAddr, boolean enable)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->SDER;
|
|
regValue &= (uint32)(~(LPI2C_SDER_TDDE_MASK));
|
|
regValue |= LPI2C_SDER_TDDE(ENABLE_BIT(enable));
|
|
baseAddr->SDER = (uint32)regValue;
|
|
}
|
|
|
|
/**
|
|
* @brief Control address match configuration
|
|
*
|
|
* @details This function configures the condition that will cause an address match to
|
|
* occur. See type Lpi2c_Ip_SlaveAddressConfigType for a description of available options.
|
|
*
|
|
* @param baseAddr base address of the LPI2C module
|
|
* @param configuration configures the condition that will cause an address to match
|
|
*/
|
|
static inline void LPI2C_Set_SlaveAddrConfig(LPI2C_Type *baseAddr, Lpi2c_Ip_SlaveAddressConfigType configuration)
|
|
{
|
|
uint32 tmp = baseAddr->SCFGR1;
|
|
tmp &= ~(LPI2C_SCFGR1_ADDRCFG_MASK);
|
|
tmp |= LPI2C_SCFGR1_ADDRCFG(configuration);
|
|
baseAddr->SCFGR1 = tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Control detection of the High-speed Mode master code
|
|
*
|
|
* @details This function enables or disables the detection of the High-speed Mode
|
|
* master code of slave address 0000_1XX, but does not cause an address match
|
|
* on this code. When set and any Hs-mode master code is detected, the slave
|
|
* filter and ACK stalls are disabled until the next STOP condition is detected.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] enable enable/disable the detection of the High-speed Mode master code
|
|
*/
|
|
static inline void LPI2C_Set_SlaveHighSpeedModeDetect(LPI2C_Type *baseAddr, boolean enable)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->SCFGR1;
|
|
regValue &= (uint32)(~(LPI2C_SCFGR1_HSMEN_MASK));
|
|
regValue |= LPI2C_SCFGR1_HSMEN(ENABLE_BIT(enable));
|
|
baseAddr->SCFGR1 = (uint32)regValue;
|
|
}
|
|
|
|
/**
|
|
* @brief Control slave behaviour when NACK is detected
|
|
*
|
|
* @details This function controls the option to ignore received NACKs. When enabled, the
|
|
* LPI2C slave will continue transfers after a NACK is detected. This option is needed
|
|
* for Ultra-Fast mode.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] nack_config slave behaviour when NACK is detected
|
|
*/
|
|
static inline void LPI2C_Set_SlaveIgnoreNACK(LPI2C_Type *baseAddr, Lpi2c_Ip_SlaveNackConfigType nack_config)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->SCFGR1;
|
|
regValue &= (uint32)(~(LPI2C_SCFGR1_IGNACK_MASK));
|
|
regValue |= LPI2C_SCFGR1_IGNACK(nack_config);
|
|
baseAddr->SCFGR1 = (uint32)regValue;
|
|
}
|
|
|
|
/**
|
|
* @brief Enable or disable clock stretching for the sending of the ACK bit
|
|
*
|
|
* @details This function enables or disables SCL clock stretching during slave-transmit address
|
|
* byte(s) and slave-receiver address and data byte(s) to allow software to write the
|
|
* Transmit ACK Register before the ACK or NACK is transmitted. Clock stretching occurs
|
|
* when transmitting the 9th bit and is therefore not compatible with high speed mode.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] enable enable or disable clock stretching
|
|
*/
|
|
static inline void LPI2C_Set_SlaveACKStall(LPI2C_Type *baseAddr, boolean enable)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->SCFGR1;
|
|
regValue &= (uint32)(~(LPI2C_SCFGR1_ACKSTALL_MASK));
|
|
regValue |= LPI2C_SCFGR1_ACKSTALL(ENABLE_BIT(enable));
|
|
baseAddr->SCFGR1 = (uint32)regValue;
|
|
}
|
|
|
|
/**
|
|
* @brief Enable or disable clock stretching for data transmission
|
|
*
|
|
* @details This function enables or disables SCL clock stretching when the transmit data
|
|
* flag is set during a slave-transmit transfer. Clock stretching occurs following
|
|
* the 9th bit and is therefore compatible with high speed mode.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] enable enable or disable clock stretching
|
|
*/
|
|
static inline void LPI2C_Set_SlaveTXDStall(LPI2C_Type *baseAddr, boolean enable)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->SCFGR1;
|
|
regValue &= (uint32)(~(LPI2C_SCFGR1_TXDSTALL_MASK));
|
|
regValue |= LPI2C_SCFGR1_TXDSTALL(ENABLE_BIT(enable));
|
|
baseAddr->SCFGR1 = (uint32)regValue;
|
|
}
|
|
|
|
/**
|
|
* @brief Enable or disable clock stretching for data reception
|
|
*
|
|
* @details This function enables or disables SCL clock stretching when receive data flag
|
|
* is set during a slave-receive transfer. Clock stretching occurs following the 9th
|
|
* bit and is therefore compatible with high speed mode.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] enable enable or disable clock stretching
|
|
*/
|
|
static inline void LPI2C_Set_SlaveRXStall(LPI2C_Type *baseAddr, boolean enable)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->SCFGR1;
|
|
regValue &= (uint32)(~(LPI2C_SCFGR1_RXSTALL_MASK));
|
|
regValue |= LPI2C_SCFGR1_RXSTALL(ENABLE_BIT(enable));
|
|
baseAddr->SCFGR1 = (uint32)regValue;
|
|
}
|
|
|
|
/**
|
|
* @brief Enable or disable clock stretching for valid address reception
|
|
*
|
|
* @details This function enables or disables SCL clock stretching when the address valid
|
|
* flag is asserted. Clock stretching only occurs following the 9th bit and is
|
|
* therefore compatible with high speed mode.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] enable enable or disable clock stretching
|
|
*/
|
|
static inline void LPI2C_Set_SlaveAddrStall(LPI2C_Type *baseAddr, boolean enable)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->SCFGR1;
|
|
regValue &= (uint32)(~(LPI2C_SCFGR1_ADRSTALL_MASK));
|
|
regValue |= LPI2C_SCFGR1_ADRSTALL(ENABLE_BIT(enable));
|
|
baseAddr->SCFGR1 = (uint32)regValue;
|
|
}
|
|
|
|
/**
|
|
* @brief Configure the ADDR0 address for slave address match
|
|
*
|
|
* @details This function configures the ADDR0 value which is used to validate the received
|
|
* slave address. In 10-bit mode, the first address byte is compared to
|
|
* { 11110, ADDR0[10:9] } and the second address byte is compared to ADDR0[8:1].
|
|
* In 7-bit mode, the address is compared to ADDR0[7:1]
|
|
* The formula used for address validation is configured with function
|
|
* LPI2C_Set_SlaveAddrConfig().
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] addr ADDR0 address for slave address match
|
|
*/
|
|
static inline void LPI2C_Set_SlaveAddr0(LPI2C_Type *baseAddr, uint16 addr)
|
|
{
|
|
uint32 tmp = baseAddr->SAMR;
|
|
tmp &= ~(LPI2C_SAMR_ADDR0_MASK);
|
|
tmp |= LPI2C_SAMR_ADDR0(addr);
|
|
baseAddr->SAMR = tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Return the received slave address
|
|
*
|
|
* @details This function returns the received slave address. Reading the address clears
|
|
* the address valid event. The address can be 7-bit or 10-bit (10-bit addresses
|
|
* are prefixed by 11110) and includes the R/W bit in the least significant position.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @return received address
|
|
*/
|
|
static inline uint16 LPI2C_Get_SlaveReceivedAddr(const LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 tmp = baseAddr->SASR;
|
|
tmp = (tmp & LPI2C_SASR_RADDR_MASK) >> LPI2C_SASR_RADDR_SHIFT;
|
|
return (uint16)tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Configure the ACK/NACK transmission after a received byte
|
|
*
|
|
* @details This function can be used to instruct the LPI2C slave whether to send an ACK or
|
|
* a NACK after receiving a byte. When ACK stall is enabled this function must be
|
|
* called after each matching address and after each received data byte. It can also
|
|
* be called when LPI2C Slave is disabled or idle to configure the default ACK/NACK.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] nack specifies whether to transmit ACK or NACK
|
|
*/
|
|
static inline void LPI2C_Set_SlaveTransmitNACK(LPI2C_Type *baseAddr, Lpi2c_Ip_SlaveNackTransmitType nack)
|
|
{
|
|
uint32 regValue = (uint32)baseAddr->STAR;
|
|
regValue &= (uint32)(~(LPI2C_STAR_TXNACK_MASK));
|
|
regValue |= LPI2C_STAR_TXNACK(nack);
|
|
baseAddr->STAR = (uint32)regValue;
|
|
}
|
|
|
|
/**
|
|
* @brief Provide data for the LPI2C slave transmitter
|
|
*
|
|
* @details This function provides one byte of data for the LPI2C slave to transmit.
|
|
* Calling this function clears the transmit data event.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @param[in] data data for the LPI2C slave transmitter
|
|
*/
|
|
static inline void LPI2C_Transmit_SlaveData(LPI2C_Type *baseAddr, uint8 data)
|
|
{
|
|
baseAddr->STDR = (uint32)data;
|
|
}
|
|
|
|
/**
|
|
* @brief Return the data received by the LPI2C slave receiver
|
|
*
|
|
* @details This function returns the data received by the I2C slave.
|
|
* Calling this function clears the receive data event.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
* @return data received by the LPI2C slave receiver
|
|
*/
|
|
static inline uint8 LPI2C_Get_SlaveData(const LPI2C_Type *baseAddr)
|
|
{
|
|
uint32 tmp = baseAddr->SRDR;
|
|
tmp = (tmp & LPI2C_SRDR_DATA_MASK) >> LPI2C_SRDR_DATA_SHIFT;
|
|
return (uint8)tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Initializes the LPI2C module to a known state.
|
|
*
|
|
* @details This function initializes all the registers of the LPI2C module to
|
|
* their reset value.
|
|
*
|
|
* @param[in] baseAddr base address of the LPI2C module
|
|
*/
|
|
void LPI2C_Init(LPI2C_Type *baseAddr);
|
|
|
|
#define I2C_STOP_SEC_CODE
|
|
#include "I2c_MemMap.h"
|
|
|
|
/** @}*/
|
|
|
|
#if defined(__cplusplus)
|
|
}
|
|
#endif
|
|
|
|
#endif /* __LPI2C_HW_ACCESS_H__*/
|
|
|
|
/** @}*/
|
|
|
|
/*******************************************************************************
|
|
* EOF
|
|
******************************************************************************/
|
|
|