/** * @file xmc_i2c.h * @date 2016-05-20 * * @cond ********************************************************************************************************************* * XMClib v2.1.16 - XMC Peripheral Driver Library * * Copyright (c) 2015-2017, Infineon Technologies AG * 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 the copyright holders 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 HOLDER 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. * * To improve the quality of the software, users are encouraged to share modifications, enhancements or bug fixes with * Infineon Technologies AG dave@infineon.com). ********************************************************************************************************************* * * Change History * -------------- * * 2015-02-20: * - Initial
* * 2015-05-20: * - Description updated
* - Added XMC_I2C_CH_TriggerServiceRequest() and XMC_I2C_CH_SelectInterruptNodePointer()
* * 2015-06-20: * - Removed version macros and declaration of GetDriverVersion API
* * 2015-08-27: * - Added APIs for external input for BRG configuration:XMC_I2C_CH_ConfigExternalInputSignalToBRG()
* * 2015-09-01: * - Added APIs for enabling or disabling the ACK response to a 0x00 slave address: XMC_I2C_CH_EnableSlaveAcknowledgeTo00() and * XMC_I2C_CH_DisableSlaveAcknowledgeTo00().
* - Modified XMC_I2C_CH_SetInputSource() API for avoiding complete DXCR register overwriting.
* - Modified XMC_I2C_CH_EVENT_t enum for supporting XMC_I2C_CH_EnableEvent() and XMC_I2C_CH_DisableEvent() * for supporting multiple events configuration
* * 2015-10-02: * - Fix 10bit addressing * * 2015-10-07: * - Fix register access in XMC_I2C_CH_EnableSlaveAcknowledgeTo00() and XMC_I2C_CH_DisableSlaveAcknowledgeTo00() APIs. * - Naming of APIs modified: from XMC_I2C_CH_EnableSlaveAcknowledgeTo00() to XMC_I2C_CH_EnableAcknowledgeAddress0() * and from XMC_I2C_CH_DisableSlaveAcknowledgeTo00() to XMC_I2C_CH_DisableAcknowledgeAddress0(). * * 2016-05-20: * - Added XMC_I2C_CH_EnableDataTransmission() and XMC_I2C_CH_DisableDataTransmission() * * 2016-08-17: * - Improved documentation of slave address passing * * @endcond * */ #ifndef XMC_I2C_H #define XMC_I2C_H /******************************************************************************* * HEADER FILES *******************************************************************************/ #include "xmc_usic.h" /** * @addtogroup XMClib XMC Peripheral Library * @{ */ /** * @addtogroup I2C * @brief Inter Integrated Circuit(IIC) driver for the XMC microcontroller family. * * USIC IIC Features:
* * Two-wire interface, with one line for shift clock transfer and synchronization (shift clock SCL), the other one for the data transfer (shift data SDA)
* * Communication in standard mode (100 kBit/s) or in fast mode (up to 400 kBit/s)
* * Support of 7-bit addressing, as well as 10-bit addressing
* * Master mode operation, where the IIC controls the bus transactions and provides the clock signal.
* * Slave mode operation, where an external master controls the bus transactions and provides the clock signal.
* * Multi-master mode operation, where several masters can be connected to the bus and bus arbitration can take place, i.e. the IIC module can be master or slave.
The master/slave operation of an IIC bus participant can change from frame to frame.
* * Efficient frame handling (low software effort), also allowing DMA transfers
* * Powerful interrupt handling due to multitude of indication flags
* @{ */ /******************************************************************************* * MACROS *******************************************************************************/ #if defined(USIC0) #define XMC_I2C0_CH0 XMC_USIC0_CH0 /**< USIC0 channel 0 base address */ #define XMC_I2C0_CH1 XMC_USIC0_CH1 /**< USIC0 channel 1 base address */ #endif #if defined(USIC1) #define XMC_I2C1_CH0 XMC_USIC1_CH0 /**< USIC1 channel 0 base address */ #define XMC_I2C1_CH1 XMC_USIC1_CH1 /**< USIC1 channel 1 base address */ #endif #if defined(USIC2) #define XMC_I2C2_CH0 XMC_USIC2_CH0 /**< USIC2 channel 0 base address */ #define XMC_I2C2_CH1 XMC_USIC2_CH1 /**< USIC2 channel 1 base address */ #endif #define XMC_I2C_10BIT_ADDR_GROUP (0x7800U) /**< Value to verify the address is 10-bit or not */ /******************************************************************************* * ENUMS *******************************************************************************/ /** * @brief I2C Status */ typedef enum XMC_I2C_CH_STATUS { XMC_I2C_CH_STATUS_OK, /**< Status OK */ XMC_I2C_CH_STATUS_ERROR, /**< Status ERROR */ XMC_I2C_CH_STATUS_BUSY /**< Status BUSY */ } XMC_I2C_CH_STATUS_t; /** * @brief I2C status */ typedef enum XMC_I2C_CH_STATUS_FLAG { XMC_I2C_CH_STATUS_FLAG_SLAVE_SELECT = USIC_CH_PSR_IICMode_SLSEL_Msk, /**< Slave select status */ XMC_I2C_CH_STATUS_FLAG_WRONG_TDF_CODE_FOUND = USIC_CH_PSR_IICMode_WTDF_Msk, /**< Wrong TDF status */ XMC_I2C_CH_STATUS_FLAG_START_CONDITION_RECEIVED = USIC_CH_PSR_IICMode_SCR_Msk, /**< Start condition received status */ XMC_I2C_CH_STATUS_FLAG_REPEATED_START_CONDITION_RECEIVED = USIC_CH_PSR_IICMode_RSCR_Msk, /**< Repeated start condition received status */ XMC_I2C_CH_STATUS_FLAG_STOP_CONDITION_RECEIVED = USIC_CH_PSR_IICMode_PCR_Msk, /**< Stop condition received status */ XMC_I2C_CH_STATUS_FLAG_NACK_RECEIVED = USIC_CH_PSR_IICMode_NACK_Msk, /**< NACK received status */ XMC_I2C_CH_STATUS_FLAG_ARBITRATION_LOST = USIC_CH_PSR_IICMode_ARL_Msk, /**< Arbitration lost status */ XMC_I2C_CH_STATUS_FLAG_SLAVE_READ_REQUESTED = USIC_CH_PSR_IICMode_SRR_Msk, /**< Slave read requested status */ XMC_I2C_CH_STATUS_FLAG_ERROR = USIC_CH_PSR_IICMode_ERR_Msk, /**< Error status */ XMC_I2C_CH_STATUS_FLAG_ACK_RECEIVED = USIC_CH_PSR_IICMode_ACK_Msk, /**< ACK received status */ XMC_I2C_CH_STATUS_FLAG_RECEIVER_START_INDICATION = USIC_CH_PSR_IICMode_RSIF_Msk, /**< Receive start indication status */ XMC_I2C_CH_STATUS_FLAG_DATA_LOST_INDICATION = USIC_CH_PSR_IICMode_DLIF_Msk, /**< Data lost indication status */ XMC_I2C_CH_STATUS_FLAG_TRANSMIT_SHIFT_INDICATION = USIC_CH_PSR_IICMode_TSIF_Msk, /**< Transmit shift indication status */ XMC_I2C_CH_STATUS_FLAG_TRANSMIT_BUFFER_INDICATION = USIC_CH_PSR_IICMode_TBIF_Msk, /**< Transmit buffer indication status */ XMC_I2C_CH_STATUS_FLAG_RECEIVE_INDICATION = USIC_CH_PSR_IICMode_RIF_Msk, /**< Receive indication status */ XMC_I2C_CH_STATUS_FLAG_ALTERNATIVE_RECEIVE_INDICATION = USIC_CH_PSR_IICMode_AIF_Msk, /**< Alternate receive indication status */ XMC_I2C_CH_STATUS_FLAG_BAUD_RATE_GENERATOR_INDICATION = USIC_CH_PSR_IICMode_BRGIF_Msk /**< Baud rate generator indication status */ } XMC_I2C_CH_STATUS_FLAG_t; /** * @brief I2C receiver status. The received data byte is available at the bit * positions RBUF[7:0], whereas the additional information is monitored at the bit positions * RBUF[12:8]. */ typedef enum XMC_I2C_CH_RECEIVER_STATUS_FLAG { XMC_I2C_CH_RECEIVER_STATUS_FLAG_ACK = 0x1U, /**< Bit 8: Value of Received Acknowledgement bit */ XMC_I2C_CH_RECEIVER_STATUS_FLAG_FIN = 0x2U, /**< Bit 9: A 1 at this bit position indicates that after a (repeated) start condition followed by the address reception the first data byte of a new frame has been received. A 0 at this bit position indicates further data bytes */ XMC_I2C_CH_RECEIVER_STATUS_FLAG_MODE = 0x4U, /**< Bit 10: A 0 at this bit position indicates that the data byte has been received when the device has been in slave mode, whereas a 1 indicates a reception in master mode */ XMC_I2C_CH_RECEIVER_STATUS_FLAG_ERR = 0x8U, /**< Bit 11: A 1 at this bit position indicates an incomplete/erroneous data byte in the receive buffer */ XMC_I2C_CH_RECEIVER_STATUS_FLAG_ADR = 0x10 /**< Bit 12: A 0 at this bit position indicates that the programmed address has been received. A 1 indicates a general call address. */ } XMC_I2C_CH_RECEIVER_STATUS_FLAG_t; /** * @brief I2C commands */ typedef enum XMC_I2C_CH_CMD { XMC_I2C_CH_CMD_WRITE, /**< I2C Command Write */ XMC_I2C_CH_CMD_READ /**< I2C Command Read */ } XMC_I2C_CH_CMD_t; /** * @brief I2C events */ typedef enum XMC_I2C_CH_EVENT { XMC_I2C_CH_EVENT_RECEIVE_START = USIC_CH_CCR_RSIEN_Msk, /**< Receive start event */ XMC_I2C_CH_EVENT_DATA_LOST = USIC_CH_CCR_DLIEN_Msk, /**< Data lost event */ XMC_I2C_CH_EVENT_TRANSMIT_SHIFT = USIC_CH_CCR_TSIEN_Msk, /**< Transmit shift event */ XMC_I2C_CH_EVENT_TRANSMIT_BUFFER = USIC_CH_CCR_TBIEN_Msk, /**< Transmit buffer event */ XMC_I2C_CH_EVENT_STANDARD_RECEIVE = USIC_CH_CCR_RIEN_Msk, /**< Receive event */ XMC_I2C_CH_EVENT_ALTERNATIVE_RECEIVE = USIC_CH_CCR_AIEN_Msk, /**< Alternate receive event */ XMC_I2C_CH_EVENT_BAUD_RATE_GENERATOR = USIC_CH_CCR_BRGIEN_Msk, /**< Baudrate generator event */ XMC_I2C_CH_EVENT_START_CONDITION_RECEIVED = USIC_CH_PCR_IICMode_SCRIEN_Msk, /**< Start condition received event */ XMC_I2C_CH_EVENT_REPEATED_START_CONDITION_RECEIVED = USIC_CH_PCR_IICMode_RSCRIEN_Msk, /**< Repeated start condition received event */ XMC_I2C_CH_EVENT_STOP_CONDITION_RECEIVED = USIC_CH_PCR_IICMode_PCRIEN_Msk, /**< Stop condition received event */ XMC_I2C_CH_EVENT_NACK = USIC_CH_PCR_IICMode_NACKIEN_Msk, /**< NACK received event */ XMC_I2C_CH_EVENT_ARBITRATION_LOST = USIC_CH_PCR_IICMode_ARLIEN_Msk, /**< Arbitration lost event */ XMC_I2C_CH_EVENT_SLAVE_READ_REQUEST = USIC_CH_PCR_IICMode_SRRIEN_Msk, /**< Slave read request event */ XMC_I2C_CH_EVENT_ERROR = USIC_CH_PCR_IICMode_ERRIEN_Msk, /**< Error condition event */ XMC_I2C_CH_EVENT_ACK = USIC_CH_PCR_IICMode_ACKIEN_Msk /**< ACK received event */ } XMC_I2C_CH_EVENT_t; /** * @brief I2C input stage selection */ typedef enum XMC_I2C_CH_INPUT { XMC_I2C_CH_INPUT_SDA = 0U, /**< selection of sda input stage */ #if UC_FAMILY == XMC1 XMC_I2C_CH_INPUT_SDA1 = 3U, XMC_I2C_CH_INPUT_SDA2 = 5U, #endif XMC_I2C_CH_INPUT_SCL = 1U, /**< selection of scl input stage */ #if UC_FAMILY == XMC1 XMC_I2C_CH_INPUT_SCL1 = 4U #endif } XMC_I2C_CH_INPUT_t; /** * I2C channel interrupt node pointers */ typedef enum XMC_I2C_CH_INTERRUPT_NODE_POINTER { XMC_I2C_CH_INTERRUPT_NODE_POINTER_TRANSMIT_SHIFT = XMC_USIC_CH_INTERRUPT_NODE_POINTER_TRANSMIT_SHIFT, /**< Node pointer for transmit shift interrupt */ XMC_I2C_CH_INTERRUPT_NODE_POINTER_TRANSMIT_BUFFER = XMC_USIC_CH_INTERRUPT_NODE_POINTER_TRANSMIT_BUFFER, /**< Node pointer for transmit buffer interrupt */ XMC_I2C_CH_INTERRUPT_NODE_POINTER_RECEIVE = XMC_USIC_CH_INTERRUPT_NODE_POINTER_RECEIVE, /**< Node pointer for receive interrupt */ XMC_I2C_CH_INTERRUPT_NODE_POINTER_ALTERNATE_RECEIVE = XMC_USIC_CH_INTERRUPT_NODE_POINTER_ALTERNATE_RECEIVE, /**< Node pointer for alternate receive interrupt */ XMC_I2C_CH_INTERRUPT_NODE_POINTER_PROTOCOL = XMC_USIC_CH_INTERRUPT_NODE_POINTER_PROTOCOL /**< Node pointer for protocol related interrupts */ } XMC_I2C_CH_INTERRUPT_NODE_POINTER_t; /******************************************************************************* * DATA STRUCTURES *******************************************************************************/ /** * @brief I2C_CH configuration structure */ typedef struct XMC_I2C_CH_CONFIG { uint32_t baudrate; /**< baud rate configuration upto max of 400KHz */ uint16_t address; /**< slave address A 7-bit address needs to be left shifted it by 1. A 10-bit address needs to be ORed with XMC_I2C_10BIT_ADDR_GROUP. */ } XMC_I2C_CH_CONFIG_t; /******************************************************************************* * API PROTOTYPES *******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /** * @param channel Constant pointer to USIC channel structure of type @ref XMC_USIC_CH_t * @param config Constant pointer to I2C channel config structure of type @ref XMC_I2C_CH_CONFIG_t * * @return None
* * \parDescription:
* Initializes the I2C \a channel.
* * \par * Configures the data format in SCTR register. Sets the slave address, baud rate. Enables transmit data valid, clears status flags * and disables parity generation.
* * \parRelated APIs:
* XMC_USIC_CH_Enable()\n\n */ void XMC_I2C_CH_Init(XMC_USIC_CH_t *const channel, const XMC_I2C_CH_CONFIG_t *const config); /** * @param channel Constant pointer to USIC channel structure of type @ref XMC_USIC_CH_t * @param rate baud rate of I2C channel * * @return None
* * \parDescription:
* Sets the rate of I2C \a channel. * * \parNote:
* Standard over sampling is considered if rate <= 100KHz and fast over sampling is considered if rate > 100KHz.
* * \parRelated APIs:
* XMC_USIC_CH_SetBaudrate()\n\n */ XMC_I2C_CH_STATUS_t XMC_I2C_CH_SetBaudrate(XMC_USIC_CH_t *const channel, const uint32_t rate); /** * @param channel Constant pointer to USIC channel structure of type @ref XMC_USIC_CH_t * * @return None
* * \parDescription:
* Starts the I2C \a channel. * * \par * Sets the USIC input operation mode to I2C mode using CCR register. * * \parRelated APIs:
* XMC_USIC_CH_SetMode()\n\n */ __STATIC_INLINE void XMC_I2C_CH_Start(XMC_USIC_CH_t *const channel) { XMC_USIC_CH_SetMode(channel, XMC_USIC_CH_OPERATING_MODE_I2C); } /** * @param channel Constant pointer to USIC channel structure of type @ref XMC_USIC_CH_t * * @return @ref XMC_I2C_CH_STATUS_t
* * \parDescription:
* Stops the I2C \a channel.
* * \par * Sets the USIC input operation to IDLE mode using CCR register. * * \parRelated APIs:
* XMC_USIC_CH_SetMode()\n\n */ XMC_I2C_CH_STATUS_t XMC_I2C_CH_Stop(XMC_USIC_CH_t *const channel); /** * @param channel Constant pointer to USIC channel structure of type @ref XMC_USIC_CH_t * @param service_request Service request number in the range of 0-5 * @return None
* * \parDescription:
* Sets the interrupt node for protocol interrupt.
* * \par * To generate interrupt for an event, node pointer should be configured with service request number(SR0, SR1..SR5). * The NVIC node gets linked to the interrupt event by doing so.
* * \parNote:
* NVIC node should be separately enabled to generate the interrupt. After setting the node pointer, desired event must be enabled. * * \parRelated APIs:
* XMC_I2C_CH_EnableEvent(), NVIC_SetPriority(), NVIC_EnableIRQ(), XMC_I2C_CH_SetInputSource()
*/ __STATIC_INLINE void XMC_I2C_CH_SetInterruptNodePointer(XMC_USIC_CH_t *const channel, const uint8_t service_request) { XMC_USIC_CH_SetInterruptNodePointer(channel, XMC_USIC_CH_INTERRUPT_NODE_POINTER_PROTOCOL, service_request); } /** * @param channel Pointer to USIC channel handler of type @ref XMC_USIC_CH_t \n * \b Range: @ref XMC_I2C0_CH0, @ref XMC_I2C0_CH1,@ref XMC_I2C1_CH0,@ref XMC_I2C1_CH1,@ref XMC_I2C2_CH0,@ref XMC_I2C2_CH1 @note Availability of I2C1 and I2C2 depends on device selection * @param interrupt_node Interrupt node pointer to be configured. \n * \b Range: @ref XMC_I2C_CH_INTERRUPT_NODE_POINTER_TRANSMIT_SHIFT, * @ref XMC_I2C_CH_INTERRUPT_NODE_POINTER_TRANSMIT_BUFFER etc. * @param service_request Service request number.\n * \b Range: 0 to 5. * @return None * * \parDescription
* Sets the interrupt node for USIC channel events. \n\n * For an event to generate interrupt, node pointer should be configured with service request(SR0, SR1..SR5). * The NVIC node gets linked to the interrupt event by doing so.
* Note: NVIC node should be separately enabled to generate the interrupt. * * \parRelated APIs:
* XMC_I2C_CH_EnableEvent() \n\n\n */ __STATIC_INLINE void XMC_I2C_CH_SelectInterruptNodePointer(XMC_USIC_CH_t *const channel, const XMC_I2C_CH_INTERRUPT_NODE_POINTER_t interrupt_node, const uint32_t service_request) { XMC_USIC_CH_SetInterruptNodePointer(channel, (XMC_USIC_CH_INTERRUPT_NODE_POINTER_t)interrupt_node, (uint32_t)service_request); } /** * @param channel Pointer to USIC channel handler of type @ref XMC_USIC_CH_t \n * \b Range: @ref XMC_I2C0_CH0, @ref XMC_I2C0_CH1,@ref XMC_I2C1_CH0,@ref XMC_I2C1_CH1,@ref XMC_I2C2_CH0,@ref XMC_I2C2_CH1 @note Availability of I2C1 and I2C2 depends on device selection * @param service_request_line service request number of the event to be triggered. \n * \b Range: 0 to 5. * @return None * * \parDescription
* Trigger a I2C interrupt service request.\n\n * When the I2C service request is triggered, the NVIC interrupt associated with it will be * generated if enabled. * * \parRelated APIs:
* XMC_I2C_CH_SelectInterruptNodePointer() \n\n\n */ __STATIC_INLINE void XMC_I2C_CH_TriggerServiceRequest(XMC_USIC_CH_t *const channel, const uint32_t service_request_line) { XMC_USIC_CH_TriggerServiceRequest(channel, (uint32_t)service_request_line); } /** * @param channel Constant pointer to USIC channel structure of type @ref XMC_USIC_CH_t * @param input I2C channel input stage of type @ref XMC_I2C_CH_INPUT_t * @param source Input source select for the input stage(0->DX0A, 1->DX1A, .. 7->DX7G) * @return None
* * \parDescription:
* Sets the input source for I2C \a channel.
* Defines the input stage for the corresponding input line. * * @note After configuring the input source for corresponding channel, interrupt node pointer is set. * * \parRelated APIs:
* XMC_USIC_CH_SetInptSource(), XMC_USIC_CH_SetInterruptNodePointer() * */ __STATIC_INLINE void XMC_I2C_CH_SetInputSource(XMC_USIC_CH_t *const channel, const XMC_I2C_CH_INPUT_t input, const uint8_t source) { channel->DXCR[input] = (uint32_t)(channel->DXCR[input] & (~USIC_CH_DX0CR_INSW_Msk)) | USIC_CH_DX0CR_DSEN_Msk; XMC_USIC_CH_SetInputSource(channel, (XMC_USIC_CH_INPUT_t)input, source); } /** * @param channel Constant pointer to USIC channel structure of type @ref XMC_USIC_CH_t * @param address I2C slave address * @return None
* * \parDescription:
* Sets the I2C \a channel slave address.
* * \par * Address is set in PCR_IICMode register by checking if it is in 10-bit address group or 7-bit address group. * (If first five bits of address are assigned with 0xF0, then address mode is 10-bit mode otherwise it is 7-bit mode)\n * @note A 7-bit address should include an additional bit at the LSB for read/write indication. For example, address 0x05 should * be provided as 0x0a. A 10-bit address should be provided with the identifier 0b11110xx at the most significant bits. For example, * address 0x305 should be provided as 0x7b05(bitwise OR with 0x7800). * * \parRelated APIs:
* XMC_I2C_CH_GetSlaveAddress()\n\n */ void XMC_I2C_CH_SetSlaveAddress(XMC_USIC_CH_t *const channel, const uint16_t address); /** * @param channel Constant pointer to USIC channel handler of type @ref XMC_USIC_CH_t * @return uint16_t Slave address
* * \parDescription:
* Gets the I2C \a channel slave address.
* * \par * Returns the address using PCR_IICMode register by checking if it is in 10-bit address group or 7-bit address group.
* (If first five bits of address are assigned with 0xF0, then address mode is considered as 10-bit mode otherwise it is 7-bit mode)\n * @note A 7-bit address will include an additional bit at the LSB. For example, address 0x05 will be returned as 0x0a. * 10-bit address will not include the 10-bit address identifier 0b11110xx at the most signifcant bits. * * \parRelated APIs:
* XMC_I2C_CH_SetSlaveAddress()\n\n */ uint16_t XMC_I2C_CH_GetSlaveAddress(const XMC_USIC_CH_t *const channel); /** * @param channel Constant pointer to USIC channel structure of type @ref XMC_USIC_CH_t * @param addr I2C master address * @param command read/write command * @return None
* * \parDescription:
* Starts the I2C master \a channel.
* * \par * Sends the Start condition with read/write command by updating IN/TBUF register based on FIFO/non-FIFO modes.\n * @note Address(addr) should reserve an additional bit at the LSB for read/write indication. For example, address 0x05 should * be provided as 0x0a. If the address is 10-bit, only most significant bits with the 10-bit identifier should be sent using this function. * For example, if the 10-bit address is 0x305, the address should be provided as 0xf6(prepend with 0b11110, upper two bits of address 0b11, * followed by 1-bit field for read/write). * * \parRelated APIs:
* XMC_I2C_CH_MasterTransmit(), XMC_USIC_CH_GetTransmitBufferStatus()\n\n */ void XMC_I2C_CH_MasterStart(XMC_USIC_CH_t *const channel, const uint16_t addr, const XMC_I2C_CH_CMD_t command); /** * @param channel Constant pointer to USIC channel structure of type @ref XMC_USIC_CH_t * @param addr I2C master address * @param command read/write command * @return None
* * \parDescription:
* Sends the repeated start condition from I2C master \a channel.
* * \par * Sends the repeated start condition with read/write command by updating IN/TBUF register based on FIFO/non-FIFO modes.\n * @note Address(addr) should reserve an additional bit at the LSB for read/write indication. For example, address 0x05 should * be provided as 0x0a. If the address is 10-bit, only most significant bits with the 10-bit identifier should be sent using this function. * For example, if the 10-bit address is 0x305, the address should be provided as 0xf6(prepend with 0b11110, upper two bits of address 0b11, * followed by 1-bit field for read/write). * * \parRelated APIs:
* XMC_I2C_CH_MasterTransmit(), XMC_USIC_CH_GetTransmitBufferStatus()\n\n */ void XMC_I2C_CH_MasterRepeatedStart(XMC_USIC_CH_t *const channel, const uint16_t addr, const XMC_I2C_CH_CMD_t command); /** * @param channel Constant pointer to USIC channel structure of type @ref XMC_USIC_CH_t * @return None
* * \parDescription:
* Stops the I2C master \a channel.
* * \par * Reads the transmit buffer status is busy or not and thereby updates IN/TBUF register based on FIFO/non-FIFO modes using Stop command. * * \parRelated APIs:
* XMC_I2C_CH_MasterTransmit(), XMC_USIC_CH_GetTransmitBufferStatus()\n\n */ void XMC_I2C_CH_MasterStop(XMC_USIC_CH_t *const channel); /** * @param channel Constant pointer to USIC channel structure of type @ref XMC_USIC_CH_t * @param data data to transmit from I2C \a channel * @return None
* * \parDescription:
* Transmit the data from the I2C master \a channel.
* * \par * Reads the transmit buffer status is busy or not and thereby updates IN/TBUF register based on FIFO/non-FIFO modes using Master Send command. * * \parRelated APIs:
* XMC_USIC_CH_GetTransmitBufferStatus()\n\n */ void XMC_I2C_CH_MasterTransmit(XMC_USIC_CH_t *const channel, const uint8_t data); /** * @param channel Constant pointer to USIC channel structure of type @ref XMC_USIC_CH_t * @param data data to transmit from I2C \a channel * @return None
* * \parDescription:
* Transmit the data from the I2C slave \a channel.
* * \par * Reads the transmit buffer status is busy or not and thereby updates IN/TBUF register based on FIFO/non-FIFO modes using Slave Send command. * * \parRelated APIs:
* XMC_USIC_CH_GetTransmitBufferStatus(),XMC_I2C_CH_ClearStatusFlag()\n\n */ void XMC_I2C_CH_SlaveTransmit(XMC_USIC_CH_t *const channel, const uint8_t data); /** * @param channel Constant pointer to USIC channel structure of type @ref XMC_USIC_CH_t * @return None
* * \parDescription:
* Sends the Ack request from I2C master \a channel.
* * \par * Reads the transmit buffer status is busy or not and thereby updates IN/TBUF register based on FIFO/non-FIFO modes using Master Receive Ack command. * * \parRelated APIs:
* XMC_I2C_CH_MasterTransmit()\n\n */ void XMC_I2C_CH_MasterReceiveAck(XMC_USIC_CH_t *const channel); /** * @param channel Constant pointer to USIC channel structure of type @ref XMC_USIC_CH_t * @return None
* * \parDescription:
* Sends the Nack request from I2C master \a channel.
* * \par * Reads the transmit buffer status is busy or not and thereby updates IN/TBUF register based on FIFO/non-FIFO modes using Master Receive Nack command. * * \parRelated APIs:
* XMC_I2C_CH_MasterTransmit()\n\n */ void XMC_I2C_CH_MasterReceiveNack(XMC_USIC_CH_t *const channel); /** * @param channel Constant pointer to USIC channel structure of type @ref XMC_USIC_CH_t * @return uint8_t OUTR/RBUF register data
* * \parDescription:
* Reads the data from I2C \a channel.
* * \par * Data is read by using OUTR/RBUF register based on FIFO/non-FIFO modes. * * \parRelated APIs:
* XMC_I2C_CH_MasterTransmit()\n\n */ uint8_t XMC_I2C_CH_GetReceivedData(const XMC_USIC_CH_t *const channel); /** * @param channel Constant pointer to USIC channel structure of type @ref XMC_USIC_CH_t * @return uint8_t Receiver status flag
* * \parDescription:
* Gets the receiver status of I2C \a channel using RBUF register of bits 8-12 which gives information about receiver status. * * \parRelated APIs:
* XMC_I2C_CH_MasterTransmit()\n\n */ __STATIC_INLINE uint8_t XMC_I2C_CH_GetReceiverStatusFlag(XMC_USIC_CH_t *const channel) { return((uint8_t)((channel->RBUF) >> 8U)); } /** * @param channel Constant pointer to USIC channel structure of type @ref XMC_USIC_CH_t * @param event ORed values of @ref XMC_I2C_CH_EVENT_t enum * @return None
* * \parDescription:
* Enables the input parameter @ref XMC_I2C_CH_EVENT_t event using PCR_IICMode register. * * \parRelated APIs:
* XMC_I2C_CH_DisableEvent()\n\n */ void XMC_I2C_CH_EnableEvent(XMC_USIC_CH_t *const channel, uint32_t event); /** * @param channel Constant pointer to USIC channel structure of type @ref XMC_USIC_CH_t * @param event ORed values of @ref XMC_I2C_CH_EVENT_t enum * @return None
* * \parDescription:
* Disables the input parameter @ref XMC_I2C_CH_EVENT_t event using PCR_IICMode register. * * \parRelated APIs:
* XMC_I2C_CH_EnableEvent()\n\n */ void XMC_I2C_CH_DisableEvent(XMC_USIC_CH_t *const channel, uint32_t event); /** * @param channel Constant pointer to USIC channel structure of type @ref XMC_USIC_CH_t * @return uint32_t Status byte
* * \parDescription:
* Retrieves the status byte of I2C \a channel using PSR_IICMode register.\n * * \parRelated APIs:
* XMC_I2C_CH_ClearStatusFlag()\n\n */ __STATIC_INLINE uint32_t XMC_I2C_CH_GetStatusFlag(XMC_USIC_CH_t *const channel) { return (channel->PSR_IICMode); } /** * @param channel Constant pointer to USIC channel structure of type @ref XMC_USIC_CH_t * @param flag Status flag * @return None
* * \parDescription:
* Clears the status flag of I2C \a channel by setting the input parameter \a flag in PSCR register. * * \parRelated APIs:
* XMC_I2C_CH_GetStatusFlag()\n\n */ __STATIC_INLINE void XMC_I2C_CH_ClearStatusFlag(XMC_USIC_CH_t *const channel, uint32_t flag) { channel->PSCR |= flag; } /** * @param channel Pointer to USIC channel handler of type @ref XMC_USIC_CH_t \n * \b Range: @ref XMC_I2C0_CH0, @ref XMC_I2C0_CH1,@ref XMC_I2C1_CH0,@ref XMC_I2C1_CH1,@ref XMC_I2C2_CH0,@ref XMC_I2C2_CH1 @note Availability of I2C1 and I2C2 depends on device selection * @param pdiv Desired divider for the external frequency input. \b Range: minimum value = 1, maximum value = 1024 \n * @param oversampling Required oversampling. The value indicates the number of time quanta for one symbol of data. \n * This can be related to the number of samples for each logic state of the data signal. \n * \b Range: 1 to 32. Value should be chosen based on the protocol used. * @param combination_mode USIC channel input combination mode \n * * @return None * * \parDescription
* Enables the external frequency input for the Baudrate Generator and configures the divider, oversampling and * the combination mode of the USIC channel. \n\n * * \parRelated APIs:
* XMC_USIC_CH_SetBRGInputClockSource(), XMC_USIC_CH_SetInputTriggerCombinationMode() \n\n\n */ __STATIC_INLINE void XMC_I2C_CH_ConfigExternalInputSignalToBRG(XMC_USIC_CH_t *const channel, const uint16_t pdiv, const uint32_t oversampling, const XMC_USIC_CH_INPUT_COMBINATION_MODE_t combination_mode) { XMC_USIC_CH_ConfigExternalInputSignalToBRG(channel,pdiv,oversampling,combination_mode); } /** * @param channel Constant pointer to USIC channel structure of type @ref XMC_USIC_CH_t * @return None * * \parDescription:
* Retrieves the status byte of I2C \a channel using PSR_IICMode register.\n * * \parRelated APIs:
* XMC_I2C_CH_DisableAcknowledgeAddress0()\n\n */ __STATIC_INLINE void XMC_I2C_CH_EnableAcknowledgeAddress0(XMC_USIC_CH_t *const channel) { channel->PCR_IICMode |= USIC_CH_PCR_IICMode_ACK00_Msk; } /** * @param channel Constant pointer to USIC channel structure of type @ref XMC_USIC_CH_t * @return None * * \parDescription:
* This bit defines that slave device should not be sensitive to the slave address 00H.\n * * \parRelated APIs:
* XMC_I2C_CH_EnableAcknowledgeAddress0()\n\n */ __STATIC_INLINE void XMC_I2C_CH_DisableAcknowledgeAddress0(XMC_USIC_CH_t *const channel) { channel->PCR_IICMode &= ~USIC_CH_PCR_IICMode_ACK00_Msk; } /** * @param channel Constant pointer to USIC channel handle of type @ref XMC_USIC_CH_t \n * \b Range: @ref XMC_I2C0_CH0, @ref XMC_I2C0_CH1,@ref XMC_I2C1_CH0,@ref XMC_I2C1_CH1,@ref XMC_I2C2_CH0,@ref XMC_I2C2_CH1 @note Availability of I2C1 and I2C2 depends on device selection * @return None * * \parDescription
* Enable data transmission.\n\n * Use this function in combination with XMC_I2C_CH_DisableDataTransmission() to fill the FIFO and send the FIFO content without gaps in the transmission. * FIFO is filled using XMC_USIC_CH_TXFIFO_PutData(). * @note If you need more control over the start of transmission use XMC_USIC_CH_SetStartTransmisionMode() * * \parRelated APIs:
* XMC_I2C_CH_DisableDataTransmission()\n\n\n */ __STATIC_INLINE void XMC_I2C_CH_EnableDataTransmission(XMC_USIC_CH_t *const channel) { XMC_USIC_CH_SetStartTransmisionMode(channel, XMC_USIC_CH_START_TRANSMISION_ON_TDV); } /** * @param channel Constant pointer to USIC channel handle of type @ref XMC_USIC_CH_t \n * \b Range: @ref XMC_I2C0_CH0, @ref XMC_I2C0_CH1,@ref XMC_I2C1_CH0,@ref XMC_I2C1_CH1,@ref XMC_I2C2_CH0,@ref XMC_I2C2_CH1 @note Availability of I2C1 and I2C2 depends on device selection * @return None * * \parDescription
* Disable data transmission.\n\n * Use this function in combination with XMC_I2C_CH_EnableDataTransmission() to fill the FIFO and send the FIFO content without gaps in the transmission. * FIFO is filled using XMC_USIC_CH_TXFIFO_PutData(). * * \parRelated APIs:
* XMC_I2C_CH_EnableDataTransmission()\n\n\n */ __STATIC_INLINE void XMC_I2C_CH_DisableDataTransmission(XMC_USIC_CH_t *const channel) { XMC_USIC_CH_SetStartTransmisionMode(channel, XMC_USIC_CH_START_TRANSMISION_DISABLED); } #ifdef __cplusplus } #endif /** * @} */ /** * @} */ #endif