]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Nuvoton_Code/StdDriver/src/usci_i2c.c
Add Cortex M23 GCC and IAR ports. Add demo projects for Nuvoton NuMaker-PFM-2351.
[freertos] / FreeRTOS / Demo / CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC / Nuvoton_Code / StdDriver / src / usci_i2c.c
diff --git a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Nuvoton_Code/StdDriver/src/usci_i2c.c b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Nuvoton_Code/StdDriver/src/usci_i2c.c
new file mode 100644 (file)
index 0000000..d779801
--- /dev/null
@@ -0,0 +1,1660 @@
+/****************************************************************************//**\r
+ * @file     usci_i2c.c\r
+ * @version  V3.00\r
+ * $Revision: 1 $\r
+ * $Date: 16/07/07 7:50p $\r
+ * @brief    M2351 series USCI I2C(UI2C) driver source file\r
+ *\r
+ * @note\r
+ * Copyright (C) 2016 Nuvoton Technology Corp. All rights reserved.\r
+*****************************************************************************/\r
+#include "NuMicro.h"\r
+\r
+/** @addtogroup Standard_Driver Standard Driver\r
+  @{\r
+*/\r
+\r
+/** @addtogroup USCI_I2C_Driver USCI_I2C Driver\r
+  @{\r
+*/\r
+\r
+\r
+/** @addtogroup USCI_I2C_EXPORTED_FUNCTIONS USCI_I2C Exported Functions\r
+  @{\r
+*/\r
+\r
+/**\r
+ *    @brief        This function makes USCI_I2C module be ready and set the wanted bus clock\r
+ *\r
+ *    @param[in]    ui2c            The pointer of the specified USCI_I2C module.\r
+ *    @param[in]    u32BusClock     The target bus speed of USCI_I2C module.\r
+ *\r
+ *    @return       Actual USCI_I2C bus clock frequency.\r
+ *\r
+ *    @details      Enable USCI_I2C module and configure USCI_I2C module(bus clock, data format).\r
+ */\r
+uint32_t UI2C_Open(UI2C_T *ui2c, uint32_t u32BusClock)\r
+{\r
+    uint32_t u32ClkDiv;\r
+    uint32_t u32Pclk;\r
+\r
+    if((ui2c == UI2C1) || (ui2c == UI2C1_NS))\r
+    {\r
+        u32Pclk = CLK_GetPCLK1Freq();\r
+    }\r
+    else\r
+    {\r
+        u32Pclk = CLK_GetPCLK0Freq();\r
+    }\r
+\r
+    u32ClkDiv = (uint32_t)((((((u32Pclk / 2u) * 10u) / (u32BusClock)) + 5u) / 10u) - 1u); /* Compute proper divider for USCI_I2C clock */\r
+\r
+    /* Enable USCI_I2C protocol */\r
+    ui2c->CTL &= ~UI2C_CTL_FUNMODE_Msk;\r
+    ui2c->CTL = 4u << UI2C_CTL_FUNMODE_Pos;\r
+\r
+    /* Data format configuration */\r
+    /* 8 bit data length */\r
+    ui2c->LINECTL &= ~UI2C_LINECTL_DWIDTH_Msk;\r
+    ui2c->LINECTL |= 8u << UI2C_LINECTL_DWIDTH_Pos;\r
+\r
+    /* MSB data format */\r
+    ui2c->LINECTL &= ~UI2C_LINECTL_LSB_Msk;\r
+\r
+    /* Set USCI_I2C bus clock */\r
+    ui2c->BRGEN &= ~UI2C_BRGEN_CLKDIV_Msk;\r
+    ui2c->BRGEN |= (u32ClkDiv << UI2C_BRGEN_CLKDIV_Pos);\r
+    ui2c->PROTCTL |=  UI2C_PROTCTL_PROTEN_Msk;\r
+\r
+    return (u32Pclk / ((u32ClkDiv + 1u) << 1u));\r
+}\r
+\r
+/**\r
+ *    @brief        This function closes the USCI_I2C module\r
+ *\r
+ *    @param[in]    ui2c            The pointer of the specified USCI_I2C module.\r
+ *\r
+ *    @return       None\r
+ *\r
+ *    @details      Close USCI_I2C protocol function.\r
+ */\r
+void UI2C_Close(UI2C_T *ui2c)\r
+{\r
+    /* Disable USCI_I2C function */\r
+    ui2c->CTL &= ~UI2C_CTL_FUNMODE_Msk;\r
+}\r
+\r
+/**\r
+ *    @brief        This function clears the time-out flag\r
+ *\r
+ *    @param[in]    ui2c            The pointer of the specified USCI_I2C module.\r
+ *\r
+ *    @return       None\r
+ *\r
+ *    @details      Clear time-out flag when time-out flag is set.\r
+ */\r
+void UI2C_ClearTimeoutFlag(UI2C_T *ui2c)\r
+{\r
+    ui2c->PROTSTS = UI2C_PROTSTS_TOIF_Msk;\r
+}\r
+\r
+/**\r
+ *    @brief        This function sets the control bit of the USCI_I2C module.\r
+ *\r
+ *    @param[in]    ui2c            The pointer of the specified USCI_I2C module.\r
+ *    @param[in]    u8Start         Set START bit to USCI_I2C module.\r
+ *    @param[in]    u8Stop Set      STOP bit to USCI_I2C module.\r
+ *    @param[in]    u8Ptrg Set      PTRG bit to USCI_I2C module.\r
+ *    @param[in]    u8Ack Set       ACK bit to USCI_I2C module.\r
+ *\r
+ *    @return       None\r
+ *\r
+ *    @details      The function set USCI_I2C control bit of USCI_I2C bus protocol.\r
+ */\r
+void UI2C_Trigger(UI2C_T *ui2c, uint8_t u8Start, uint8_t u8Stop, uint8_t u8Ptrg, uint8_t u8Ack)\r
+{\r
+    uint32_t u32Reg = 0u;\r
+    uint32_t u32Val = ui2c->PROTCTL & ~(UI2C_PROTCTL_STA_Msk | UI2C_PROTCTL_STO_Msk | UI2C_PROTCTL_AA_Msk);\r
+\r
+    if(u8Start)\r
+    {\r
+        u32Reg |= UI2C_PROTCTL_STA_Msk;\r
+    }\r
+    if(u8Stop)\r
+    {\r
+        u32Reg |= UI2C_PROTCTL_STO_Msk;\r
+    }\r
+    if(u8Ptrg)\r
+    {\r
+        u32Reg |= UI2C_PROTCTL_PTRG_Msk;\r
+    }\r
+    if(u8Ack)\r
+    {\r
+        u32Reg |= UI2C_PROTCTL_AA_Msk;\r
+    }\r
+    ui2c->PROTCTL = u32Val | u32Reg;\r
+}\r
+\r
+/**\r
+ *    @brief        This function disables the interrupt of USCI_I2C module\r
+ *\r
+ *    @param[in]    ui2c            The pointer of the specified USCI_I2C module.\r
+ *    @param[in]    u32Mask         The combination of all related interrupt enable bits.\r
+ *                                  Each bit corresponds to an interrupt enable bit.\r
+ *                                  This parameter decides which interrupts will be disabled. It is combination of:\r
+ *                                  - \ref UI2C_TO_INT_MASK\r
+ *                                  - \ref UI2C_STAR_INT_MASK\r
+ *                                  - \ref UI2C_STOR_INT_MASK\r
+ *                                  - \ref UI2C_NACK_INT_MASK\r
+ *                                  - \ref UI2C_ARBLO_INT_MASK\r
+ *                                  - \ref UI2C_ERR_INT_MASK\r
+ *                                  - \ref UI2C_ACK_INT_MASK\r
+ *\r
+ *    @return       None\r
+ *\r
+ *    @details      The function is used to disable USCI_I2C bus interrupt events.\r
+ */\r
+void UI2C_DisableInt(UI2C_T *ui2c, uint32_t u32Mask)\r
+{\r
+    /* Disable time-out interrupt flag */\r
+    if((u32Mask & UI2C_TO_INT_MASK) == UI2C_TO_INT_MASK)\r
+    {\r
+        ui2c->PROTIEN &= ~UI2C_PROTIEN_TOIEN_Msk;\r
+    }\r
+    /* Disable start condition received interrupt flag */\r
+    if((u32Mask & UI2C_STAR_INT_MASK) == UI2C_STAR_INT_MASK)\r
+    {\r
+        ui2c->PROTIEN &= ~UI2C_PROTIEN_STARIEN_Msk;\r
+    }\r
+    /* Disable stop condition received interrupt flag */\r
+    if((u32Mask & UI2C_STOR_INT_MASK) == UI2C_STOR_INT_MASK)\r
+    {\r
+        ui2c->PROTIEN &= ~UI2C_PROTIEN_STORIEN_Msk;\r
+    }\r
+    /* Disable non-acknowledge interrupt flag */\r
+    if((u32Mask & UI2C_NACK_INT_MASK) == UI2C_NACK_INT_MASK)\r
+    {\r
+        ui2c->PROTIEN &= ~UI2C_PROTIEN_NACKIEN_Msk;\r
+    }\r
+    /* Disable arbitration lost interrupt flag */\r
+    if((u32Mask & UI2C_ARBLO_INT_MASK) == UI2C_ARBLO_INT_MASK)\r
+    {\r
+        ui2c->PROTIEN &= ~UI2C_PROTIEN_ARBLOIEN_Msk;\r
+    }\r
+\r
+    /* Disable error interrupt flag */\r
+    if((u32Mask & UI2C_ERR_INT_MASK) == UI2C_ERR_INT_MASK)\r
+    {\r
+        ui2c->PROTIEN &= ~UI2C_PROTIEN_ERRIEN_Msk;\r
+    }\r
+    /* Disable acknowledge interrupt flag */\r
+    if((u32Mask & UI2C_ACK_INT_MASK) == UI2C_ACK_INT_MASK)\r
+    {\r
+        ui2c->PROTIEN &= ~UI2C_PROTIEN_ACKIEN_Msk;\r
+    }\r
+}\r
+\r
+/**\r
+ *    @brief        This function enables the interrupt of USCI_I2C module.\r
+ *    @param[in]    ui2c            The pointer of the specified USCI_I2C module.\r
+ *    @param[in]    u32Mask         The combination of all related interrupt enable bits.\r
+ *                                  Each bit corresponds to a interrupt enable bit.\r
+ *                                  This parameter decides which interrupts will be enabled. It is combination of:\r
+ *                                  - \ref UI2C_TO_INT_MASK\r
+ *                                  - \ref UI2C_STAR_INT_MASK\r
+ *                                  - \ref UI2C_STOR_INT_MASK\r
+ *                                  - \ref UI2C_NACK_INT_MASK\r
+ *                                  - \ref UI2C_ARBLO_INT_MASK\r
+ *                                  - \ref UI2C_ERR_INT_MASK\r
+ *                                  - \ref UI2C_ACK_INT_MASK\r
+ *    @return None\r
+ *\r
+ *    @details      The function is used to enable USCI_I2C bus interrupt events.\r
+ */\r
+void UI2C_EnableInt(UI2C_T *ui2c, uint32_t u32Mask)\r
+{\r
+    /* Enable time-out interrupt flag */\r
+    if((u32Mask & UI2C_TO_INT_MASK) == UI2C_TO_INT_MASK)\r
+    {\r
+        ui2c->PROTIEN |= UI2C_PROTIEN_TOIEN_Msk;\r
+    }\r
+    /* Enable start condition received interrupt flag */\r
+    if((u32Mask & UI2C_STAR_INT_MASK) == UI2C_STAR_INT_MASK)\r
+    {\r
+        ui2c->PROTIEN |= UI2C_PROTIEN_STARIEN_Msk;\r
+    }\r
+    /* Enable stop condition received interrupt flag */\r
+    if((u32Mask & UI2C_STOR_INT_MASK) == UI2C_STOR_INT_MASK)\r
+    {\r
+        ui2c->PROTIEN |= UI2C_PROTIEN_STORIEN_Msk;\r
+    }\r
+    /* Enable non-acknowledge interrupt flag */\r
+    if((u32Mask & UI2C_NACK_INT_MASK) == UI2C_NACK_INT_MASK)\r
+    {\r
+        ui2c->PROTIEN |= UI2C_PROTIEN_NACKIEN_Msk;\r
+    }\r
+    /* Enable arbitration lost interrupt flag */\r
+    if((u32Mask & UI2C_ARBLO_INT_MASK) == UI2C_ARBLO_INT_MASK)\r
+    {\r
+        ui2c->PROTIEN |= UI2C_PROTIEN_ARBLOIEN_Msk;\r
+    }\r
+    /* Enable error interrupt flag */\r
+    if((u32Mask & UI2C_ERR_INT_MASK) == UI2C_ERR_INT_MASK)\r
+    {\r
+        ui2c->PROTIEN |= UI2C_PROTIEN_ERRIEN_Msk;\r
+    }\r
+    /* Enable acknowledge interrupt flag */\r
+    if((u32Mask & UI2C_ACK_INT_MASK) == UI2C_ACK_INT_MASK)\r
+    {\r
+        ui2c->PROTIEN |= UI2C_PROTIEN_ACKIEN_Msk;\r
+    }\r
+}\r
+\r
+/**\r
+ *    @brief        This function returns the real bus clock of USCI_I2C module\r
+ *\r
+ *    @param[in]    ui2c            The pointer of the specified USCI_I2C module.\r
+ *\r
+ *    @return       Actual USCI_I2C bus clock frequency.\r
+ *\r
+ *    @details      The function returns the actual USCI_I2C module bus clock.\r
+ */\r
+uint32_t UI2C_GetBusClockFreq(UI2C_T *ui2c)\r
+{\r
+    uint32_t u32Divider;\r
+    uint32_t u32Pclk;\r
+\r
+    if((ui2c == UI2C1) || (ui2c == UI2C1_NS))\r
+    {\r
+        u32Pclk = CLK_GetPCLK1Freq();\r
+    }\r
+    else\r
+    {\r
+        u32Pclk = CLK_GetPCLK0Freq();\r
+    }\r
+    u32Divider = (ui2c->BRGEN & UI2C_BRGEN_CLKDIV_Msk) >> UI2C_BRGEN_CLKDIV_Pos;\r
+\r
+    return (u32Pclk / ((u32Divider + 1u) << 1u));\r
+}\r
+\r
+/**\r
+ *    @brief        This function sets bus clock frequency of USCI_I2C module\r
+ *\r
+ *    @param[in]    ui2c            The pointer of the specified USCI_I2C module.\r
+ *    @param[in]    u32BusClock     The target bus speed of USCI_I2C module.\r
+ *\r
+ *    @return Actual USCI_I2C bus clock frequency.\r
+ *\r
+ *    @details      Use this function set USCI_I2C bus clock frequency and return actual bus clock.\r
+ */\r
+uint32_t UI2C_SetBusClockFreq(UI2C_T *ui2c, uint32_t u32BusClock)\r
+{\r
+    uint32_t u32ClkDiv;\r
+    uint32_t u32Pclk;\r
+\r
+    if((ui2c == UI2C1) || (ui2c == UI2C1_NS))\r
+    {\r
+        u32Pclk = CLK_GetPCLK1Freq();\r
+    }\r
+    else\r
+    {\r
+        u32Pclk = CLK_GetPCLK0Freq();\r
+    }\r
+    u32ClkDiv = (uint32_t)((((((u32Pclk / 2u) * 10u) / (u32BusClock)) + 5u) / 10u) - 1u); /* Compute proper divider for USCI_I2C clock */\r
+\r
+    /* Set USCI_I2C bus clock */\r
+    ui2c->BRGEN &= ~UI2C_BRGEN_CLKDIV_Msk;\r
+    ui2c->BRGEN |= (u32ClkDiv << UI2C_BRGEN_CLKDIV_Pos);\r
+\r
+    return (u32Pclk / ((u32ClkDiv + 1u) << 1u));\r
+}\r
+\r
+/**\r
+ *    @brief        This function gets the interrupt flag of USCI_I2C module\r
+ *\r
+ *    @param[in]    ui2c            The pointer of the specified USCI_I2C module.\r
+ *    @param[in]    u32Mask         The combination of all related interrupt sources.\r
+ *                                  Each bit corresponds to a interrupt source.\r
+ *                                  This parameter decides which interrupt flags will be read. It is combination of:\r
+ *                                  - \ref UI2C_TO_INT_MASK\r
+ *                                  - \ref UI2C_STAR_INT_MASK\r
+ *                                  - \ref UI2C_STOR_INT_MASK\r
+ *                                  - \ref UI2C_NACK_INT_MASK\r
+ *                                  - \ref UI2C_ARBLO_INT_MASK\r
+ *                                  - \ref UI2C_ERR_INT_MASK\r
+ *                                  - \ref UI2C_ACK_INT_MASK\r
+ *\r
+ *    @return       Interrupt flags of selected sources.\r
+ *\r
+ *    @details      Use this function to get USCI_I2C interrupt flag when module occurs interrupt event.\r
+ */\r
+uint32_t UI2C_GetIntFlag(UI2C_T *ui2c, uint32_t u32Mask)\r
+{\r
+    uint32_t u32IntFlag = 0U;\r
+    uint32_t u32TmpValue;\r
+\r
+    u32TmpValue = ui2c->PROTSTS & UI2C_PROTSTS_TOIF_Msk;\r
+    /* Check Time-out Interrupt Flag */\r
+    if((u32Mask & UI2C_TO_INT_MASK) && (u32TmpValue))\r
+    {\r
+        u32IntFlag |= UI2C_TO_INT_MASK;\r
+    }\r
+\r
+    u32TmpValue = ui2c->PROTSTS & UI2C_PROTSTS_STARIF_Msk;\r
+    /* Check Start Condition Received Interrupt Flag */\r
+    if((u32Mask & UI2C_STAR_INT_MASK) && (u32TmpValue))\r
+    {\r
+        u32IntFlag |= UI2C_STAR_INT_MASK;\r
+    }\r
+\r
+    u32TmpValue = ui2c->PROTSTS & UI2C_PROTSTS_STORIF_Msk;\r
+    /* Check Stop Condition Received Interrupt Flag */\r
+    if((u32Mask & UI2C_STOR_INT_MASK) && (u32TmpValue))\r
+    {\r
+        u32IntFlag |= UI2C_STOR_INT_MASK;\r
+    }\r
+\r
+    u32TmpValue = ui2c->PROTSTS & UI2C_PROTSTS_NACKIF_Msk;\r
+    /* Check Non-Acknowledge Interrupt Flag */\r
+    if((u32Mask & UI2C_NACK_INT_MASK) && (u32TmpValue))\r
+    {\r
+        u32IntFlag |= UI2C_NACK_INT_MASK;\r
+    }\r
+\r
+    u32TmpValue = ui2c->PROTSTS & UI2C_PROTSTS_ARBLOIF_Msk;\r
+    /* Check Arbitration Lost Interrupt Flag */\r
+    if((u32Mask & UI2C_ARBLO_INT_MASK) && (u32TmpValue))\r
+    {\r
+        u32IntFlag |= UI2C_ARBLO_INT_MASK;\r
+    }\r
+\r
+    u32TmpValue = ui2c->PROTSTS & UI2C_PROTSTS_ERRIF_Msk;\r
+    /* Check Error Interrupt Flag */\r
+    if((u32Mask & UI2C_ERR_INT_MASK) && (u32TmpValue))\r
+    {\r
+        u32IntFlag |= UI2C_ERR_INT_MASK;\r
+    }\r
+\r
+    u32TmpValue = ui2c->PROTSTS & UI2C_PROTSTS_ACKIF_Msk;\r
+    /* Check Acknowledge Interrupt Flag */\r
+    if((u32Mask & UI2C_ACK_INT_MASK) && (u32TmpValue))\r
+    {\r
+        u32IntFlag |= UI2C_ACK_INT_MASK;\r
+    }\r
+\r
+    return u32IntFlag;\r
+}\r
+\r
+/**\r
+ *    @brief        This function clears the interrupt flag of USCI_I2C module.\r
+ *    @param[in]    ui2c            The pointer of the specified USCI_I2C module.\r
+ *    @param[in]    u32Mask         The combination of all related interrupt sources.\r
+ *                                  Each bit corresponds to a interrupt source.\r
+ *                                  This parameter decides which interrupt flags will be cleared. It is combination of:\r
+ *                                  - \ref UI2C_TO_INT_MASK\r
+ *                                  - \ref UI2C_STAR_INT_MASK\r
+ *                                  - \ref UI2C_STOR_INT_MASK\r
+ *                                  - \ref UI2C_NACK_INT_MASK\r
+ *                                  - \ref UI2C_ARBLO_INT_MASK\r
+ *                                  - \ref UI2C_ERR_INT_MASK\r
+ *                                  - \ref UI2C_ACK_INT_MASK\r
+ *\r
+ *    @return       None\r
+ *\r
+ *    @details      Use this function to clear USCI_I2C interrupt flag when module occurs interrupt event and set flag.\r
+ */\r
+void UI2C_ClearIntFlag(UI2C_T *ui2c, uint32_t u32Mask)\r
+{\r
+    /* Clear Time-out Interrupt Flag */\r
+    if(u32Mask & UI2C_TO_INT_MASK)\r
+    {\r
+        ui2c->PROTSTS = UI2C_PROTSTS_TOIF_Msk;\r
+    }\r
+    /* Clear Start Condition Received Interrupt Flag */\r
+    if(u32Mask & UI2C_STAR_INT_MASK)\r
+    {\r
+        ui2c->PROTSTS = UI2C_PROTSTS_STARIF_Msk;\r
+    }\r
+    /* Clear Stop Condition Received Interrupt Flag */\r
+    if(u32Mask & UI2C_STOR_INT_MASK)\r
+    {\r
+        ui2c->PROTSTS = UI2C_PROTSTS_STORIF_Msk;\r
+    }\r
+    /* Clear Non-Acknowledge Interrupt Flag */\r
+    if(u32Mask & UI2C_NACK_INT_MASK)\r
+    {\r
+        ui2c->PROTSTS = UI2C_PROTSTS_NACKIF_Msk;\r
+    }\r
+    /* Clear Arbitration Lost Interrupt Flag */\r
+    if(u32Mask & UI2C_ARBLO_INT_MASK)\r
+    {\r
+        ui2c->PROTSTS = UI2C_PROTSTS_ARBLOIF_Msk;\r
+    }\r
+    /* Clear Error Interrupt Flag */\r
+    if(u32Mask & UI2C_ERR_INT_MASK)\r
+    {\r
+        ui2c->PROTSTS = UI2C_PROTSTS_ERRIF_Msk;\r
+    }\r
+    /* Clear Acknowledge Interrupt Flag */\r
+    if(u32Mask & UI2C_ACK_INT_MASK)\r
+    {\r
+        ui2c->PROTSTS = UI2C_PROTSTS_ACKIF_Msk;\r
+    }\r
+}\r
+\r
+/**\r
+ *    @brief        This function returns the data stored in data register of USCI_I2C module.\r
+ *\r
+ *    @param[in]    ui2c            The pointer of the specified USCI_I2C module.\r
+ *\r
+ *    @return       USCI_I2C data.\r
+ *\r
+ *    @details      To read a byte data from USCI_I2C module receive data register.\r
+ */\r
+uint32_t UI2C_GetData(UI2C_T *ui2c)\r
+{\r
+    return (ui2c->RXDAT);\r
+}\r
+\r
+/**\r
+ *    @brief        This function writes a byte data to data register of USCI_I2C module\r
+ *\r
+ *    @param[in]    ui2c            The pointer of the specified USCI_I2C module.\r
+ *    @param[in]    u8Data          The data which will be written to data register of USCI_I2C module.\r
+ *\r
+ *    @return       None\r
+ *\r
+ *    @details      To write a byte data to transmit data register to transmit data.\r
+ */\r
+void UI2C_SetData(UI2C_T *ui2c, uint8_t u8Data)\r
+{\r
+    ui2c->TXDAT = u8Data;\r
+}\r
+\r
+/**\r
+ *    @brief        Configure slave address and enable GC mode\r
+ *\r
+ *    @param[in]    ui2c            The pointer of the specified USCI_I2C module.\r
+ *    @param[in]    u8SlaveNo       Slave channel number [0/1]\r
+ *    @param[in]    u16SlaveAddr    The slave address.\r
+ *    @param[in]    u8GCMode        GC mode enable or not. Valid values are:\r
+ *                                  - \ref UI2C_GCMODE_ENABLE\r
+ *                                  - \ref UI2C_GCMODE_DISABLE\r
+ *\r
+ *    @return None\r
+ *\r
+ *    @details      To configure USCI_I2C module slave address and GC mode.\r
+ */\r
+void UI2C_SetSlaveAddr(UI2C_T *ui2c, uint8_t u8SlaveNo, uint16_t u16SlaveAddr, uint8_t u8GCMode)\r
+{\r
+    if(u8SlaveNo)\r
+    {\r
+        ui2c->DEVADDR1  = u16SlaveAddr;\r
+    }\r
+    else\r
+    {\r
+        ui2c->DEVADDR0  = u16SlaveAddr;\r
+    }\r
+    ui2c->PROTCTL  = (ui2c->PROTCTL & ~UI2C_PROTCTL_GCFUNC_Msk) | u8GCMode;\r
+}\r
+\r
+/**\r
+ *    @brief        Configure the mask bit of slave address.\r
+ *\r
+ *    @param[in]    ui2c             The pointer of the specified USCI_I2C module.\r
+ *    @param[in]    u8SlaveNo        Slave channle number [0/1]\r
+ *    @param[in]    u16SlaveAddrMask The slave address mask.\r
+ *\r
+ *    @return None\r
+ *\r
+ *    @details      To configure USCI_I2C module slave  address mask bit.\r
+ *    @note         The corresponding address bit is "Don't Care".\r
+ */\r
+void UI2C_SetSlaveAddrMask(UI2C_T *ui2c, uint8_t u8SlaveNo, uint16_t u16SlaveAddrMask)\r
+{\r
+    if(u8SlaveNo)\r
+    {\r
+        ui2c->ADDRMSK1  = u16SlaveAddrMask;\r
+    }\r
+    else\r
+    {\r
+        ui2c->ADDRMSK0  = u16SlaveAddrMask;\r
+    }\r
+}\r
+\r
+/**\r
+ *    @brief        This function enables time-out function and configures timeout counter\r
+ *\r
+ *    @param[in]    ui2c            The pointer of the specified USCI_I2C module.\r
+ *    @param[in]    u32TimeoutCnt   Timeout counter. Valid values are between 0~0x3FF.\r
+ *\r
+ *    @return       None\r
+ *\r
+ *    @details      To enable USCI_I2C bus time-out function and set time-out counter.\r
+ */\r
+void UI2C_EnableTimeout(UI2C_T *ui2c, uint32_t u32TimeoutCnt)\r
+{\r
+    ui2c->PROTCTL = (ui2c->PROTCTL & ~UI2C_PROTCTL_TOCNT_Msk) | (u32TimeoutCnt << UI2C_PROTCTL_TOCNT_Pos);\r
+    ui2c->BRGEN = (ui2c->BRGEN & ~UI2C_BRGEN_TMCNTSRC_Msk) | UI2C_BRGEN_TMCNTEN_Msk;\r
+}\r
+\r
+/**\r
+ *    @brief        This function disables time-out function\r
+ *\r
+ *    @param[in]    ui2c            The pointer of the specified USCI_I2C module.\r
+ *\r
+ *    @return       None\r
+ *\r
+ *    @details      To disable USCI_I2C bus time-out function.\r
+ */\r
+void UI2C_DisableTimeout(UI2C_T *ui2c)\r
+{\r
+    ui2c->PROTCTL &= ~UI2C_PROTCTL_TOCNT_Msk;\r
+    ui2c->BRGEN &= ~UI2C_BRGEN_TMCNTEN_Msk;\r
+}\r
+\r
+/**\r
+ *    @brief        This function enables the wakeup function of USCI_I2C module\r
+ *\r
+ *    @param[in]    ui2c            The pointer of the specified USCI_I2C module.\r
+ *    @param[in]    u8WakeupMode    The wake-up mode selection. Valid values are:\r
+ *                                  - \ref UI2C_DATA_TOGGLE_WK\r
+ *                                  - \ref UI2C_ADDR_MATCH_WK\r
+ *\r
+ *    @return       None\r
+ *\r
+ *    @details      To enable USCI_I2C module wake-up function.\r
+ */\r
+void UI2C_EnableWakeup(UI2C_T *ui2c, uint8_t u8WakeupMode)\r
+{\r
+    ui2c->WKCTL = (ui2c->WKCTL & ~UI2C_WKCTL_WKADDREN_Msk) | (u8WakeupMode | UI2C_WKCTL_WKEN_Msk);\r
+}\r
+\r
+/**\r
+ *    @brief        This function disables the wakeup function of USCI_I2C module\r
+ *\r
+ *    @param[in]    ui2c            The pointer of the specified USCI_I2C module.\r
+ *\r
+ *    @return       None\r
+ *\r
+ *    @details      To disable USCI_I2C module wake-up function.\r
+ */\r
+void UI2C_DisableWakeup(UI2C_T *ui2c)\r
+{\r
+    ui2c->WKCTL &= ~UI2C_WKCTL_WKEN_Msk;\r
+}\r
+\r
+/**\r
+  * @brief      Write a byte to Slave\r
+  *\r
+  * @param[in]  *ui2c           The pointer of the specified USCI_I2C module.\r
+  * @param[in]  u8SlaveAddr     Access Slave address(7-bit)\r
+  * @param[in]  data            Write a byte data to Slave\r
+  *\r
+  * @retval     0               Write data success\r
+  * @retval     1               Write data fail, or bus occurs error events\r
+  *\r
+  * @details    The function is used for USCI_I2C Master write a byte data to Slave.\r
+  *\r
+  */\r
+\r
+uint8_t UI2C_WriteByte(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint8_t data)\r
+{\r
+    uint8_t u8Xfering = 1U, u8Err = 0U, u8Ctrl = 0U;\r
+    enum UI2C_MASTER_EVENT eEvent = MASTER_SEND_START;\r
+\r
+    UI2C_START(ui2c);                                                       /* Send START */\r
+\r
+    while(u8Xfering)\r
+    {\r
+        while(!(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U));                      /* Wait UI2C new status occur */\r
+\r
+        switch(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)\r
+        {\r
+            case UI2C_PROTSTS_STARIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STARIF_Msk);     /* Clear START INT Flag */\r
+                UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x00U);             /* Write SLA+W to Register UI2C_TXDAT */\r
+                eEvent = MASTER_SEND_ADDRESS;\r
+                u8Ctrl = UI2C_CTL_PTRG;                                     /* Clear SI */\r
+                break;\r
+\r
+            case UI2C_PROTSTS_ACKIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_ACKIF_Msk);      /* Clear ACK INT Flag */\r
+\r
+                if(eEvent == MASTER_SEND_ADDRESS)\r
+                {\r
+                    UI2C_SET_DATA(ui2c, data);                              /* Write data to UI2C_TXDAT */\r
+                    eEvent = MASTER_SEND_DATA;\r
+                }\r
+                else\r
+                {\r
+                    u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                /* Clear SI and send STOP */\r
+                }\r
+\r
+                break;\r
+\r
+            case UI2C_PROTSTS_NACKIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_NACKIF_Msk);     /* Clear NACK INT Flag */\r
+                u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                    /* Clear SI and send STOP */\r
+                u8Err = 1U;\r
+                break;\r
+\r
+            case UI2C_PROTSTS_STORIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STORIF_Msk);     /* Clear STOP INT Flag */\r
+                u8Ctrl = UI2C_CTL_PTRG;                                     /* Clear SI */\r
+                u8Xfering = 0U;\r
+                break;\r
+\r
+            case UI2C_PROTSTS_ARBLOIF_Msk:                                  /* Arbitration Lost */\r
+            default:                                                        /* Unknow status */\r
+                u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                    /* Clear SI and send STOP */\r
+                u8Err = 1U;\r
+                break;\r
+        }\r
+\r
+        UI2C_SET_CONTROL_REG(ui2c, u8Ctrl);                                 /* Write controlbit to UI2C_PROTCTL register */\r
+    }\r
+\r
+    return (u8Err | u8Xfering);                                             /* return (Success)/(Fail) status */\r
+}\r
+\r
+/**\r
+  * @brief      Write multi bytes to Slave\r
+  *\r
+  * @param[in]  *ui2c           The pointer of the specified USCI_I2C module.\r
+  * @param[in]  u8SlaveAddr     Access Slave address(7-bit)\r
+  * @param[in]  *data           Pointer to array to write data to Slave\r
+  * @param[in]  u32wLen         How many bytes need to write to Slave\r
+  *\r
+  * @return     A length of how many bytes have been transmitted.\r
+  *\r
+  * @details    The function is used for USCI_I2C Master write multi bytes data to Slave.\r
+  *\r
+  */\r
+\r
+uint32_t UI2C_WriteMultiBytes(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint8_t *data, uint32_t u32wLen)\r
+{\r
+    uint8_t u8Xfering = 1U, u8Ctrl = 0U;\r
+    uint32_t u32txLen = 0U;\r
+\r
+    UI2C_START(ui2c);                                                       /* Send START */\r
+\r
+    while(u8Xfering)\r
+    {\r
+        while(!(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U));                      /* Wait UI2C new status occur */\r
+\r
+        switch(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)\r
+        {\r
+            case UI2C_PROTSTS_STARIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STARIF_Msk);     /* Clear START INT Flag */\r
+                UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x00U);             /* Write SLA+W to Register UI2C_TXDAT */\r
+                u8Ctrl = UI2C_CTL_PTRG;                                     /* Clear SI */\r
+                break;\r
+\r
+            case UI2C_PROTSTS_ACKIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_ACKIF_Msk);      /* Clear ACK INT Flag */\r
+\r
+                if(u32txLen < u32wLen)\r
+                    UI2C_SET_DATA(ui2c, data[u32txLen++]);                  /* Write data to UI2C_TXDAT */\r
+                else\r
+                {\r
+                    u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                /* Clear SI and send STOP */\r
+                }\r
+\r
+                break;\r
+\r
+            case UI2C_PROTSTS_NACKIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_NACKIF_Msk);     /* Clear NACK INT Flag */\r
+                u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                    /* Clear SI and send STOP */\r
+                break;\r
+\r
+            case UI2C_PROTSTS_STORIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STORIF_Msk);     /* Clear STOP INT Flag */\r
+                u8Ctrl = UI2C_CTL_PTRG;                                     /* Clear SI */\r
+                u8Xfering = 0U;\r
+                break;\r
+\r
+            case UI2C_PROTSTS_ARBLOIF_Msk:                                  /* Arbitration Lost */\r
+            default:                                                        /* Unknow status */\r
+                u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                    /* Clear SI and send STOP */\r
+                break;\r
+        }\r
+\r
+        UI2C_SET_CONTROL_REG(ui2c, u8Ctrl);                                 /* Write controlbit to UI2C_CTL register */\r
+    }\r
+\r
+    return u32txLen;                                                        /* Return bytes length that have been transmitted */\r
+}\r
+\r
+/**\r
+  * @brief      Specify a byte register address and write a byte to Slave\r
+  *\r
+  * @param[in]  *ui2c           The pointer of the specified USCI_I2C module.\r
+  * @param[in]  u8SlaveAddr     Access Slave address(7-bit)\r
+  * @param[in]  u8DataAddr      Specify a address (1 byte) of data write to\r
+  * @param[in]  data            A byte data to write it to Slave\r
+  *\r
+  * @retval     0               Write data success\r
+  * @retval     1               Write data fail, or bus occurs error events\r
+  *\r
+  * @details    The function is used for USCI_I2C Master specify a address that data write to in Slave.\r
+  *\r
+  */\r
+\r
+uint8_t UI2C_WriteByteOneReg(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr, uint8_t data)\r
+{\r
+    uint8_t u8Xfering = 1U, u8Err = 0U, u8Ctrl = 0U;\r
+    uint32_t u32txLen = 0U;\r
+\r
+    UI2C_START(ui2c);                                                       /* Send START */\r
+\r
+    while(u8Xfering)\r
+    {\r
+        while(!(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U));                      /* Wait UI2C new status occur */\r
+\r
+        switch(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)\r
+        {\r
+            case UI2C_PROTSTS_STARIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STARIF_Msk);     /* Clear START INT Flag */\r
+                UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x00U);             /* Write SLA+W to Register UI2C_TXDAT */\r
+                u8Ctrl = UI2C_CTL_PTRG;                                     /* Clear SI */\r
+                break;\r
+\r
+            case UI2C_PROTSTS_ACKIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_ACKIF_Msk);      /* Clear ACK INT Flag */\r
+\r
+                if(u32txLen == 0U)\r
+                {\r
+                    UI2C_SET_DATA(ui2c, u8DataAddr);                        /* Write data address to UI2C_TXDAT */\r
+                    u32txLen++;\r
+                }\r
+                else if(u32txLen == 1U)\r
+                {\r
+                    UI2C_SET_DATA(ui2c, data);                              /* Write data to UI2C_TXDAT */\r
+                    u32txLen++;\r
+                }\r
+                else\r
+                {\r
+                    u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                /* Clear SI and send STOP */\r
+                }\r
+\r
+                break;\r
+\r
+            case UI2C_PROTSTS_NACKIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_NACKIF_Msk);     /* Clear NACK INT Flag */\r
+                u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                    /* Clear SI and send STOP */\r
+                u8Err = 1U;\r
+                break;\r
+\r
+            case UI2C_PROTSTS_STORIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STORIF_Msk);     /* Clear STOP INT Flag */\r
+                u8Ctrl = UI2C_CTL_PTRG;                                     /* Clear SI */\r
+                u8Xfering = 0U;\r
+                break;\r
+\r
+            case UI2C_PROTSTS_ARBLOIF_Msk:                                  /* Arbitration Lost */\r
+            default:                                                        /* Unknow status */\r
+                u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                    /* Clear SI and send STOP */\r
+                u8Err = 1U;\r
+                break;\r
+        }\r
+\r
+        UI2C_SET_CONTROL_REG(ui2c, u8Ctrl);                                 /* Write controlbit to UI2C_CTL register */\r
+    }\r
+\r
+    return (u8Err | u8Xfering);                                             /* return (Success)/(Fail) status */\r
+}\r
+\r
+\r
+/**\r
+  * @brief      Specify a byte register address and write multi bytes to Slave\r
+  *\r
+  * @param[in]  *ui2c           The pointer of the specified USCI_I2C module.\r
+  * @param[in]  u8SlaveAddr     Access Slave address(7-bit)\r
+  * @param[in]  u8DataAddr      Specify a address (1 byte) of data write to\r
+  * @param[in]  *data           Pointer to array to write data to Slave\r
+  * @param[in]  u32wLen         How many bytes need to write to Slave\r
+  *\r
+  * @return     A length of how many bytes have been transmitted.\r
+  *\r
+  * @details    The function is used for USCI_I2C Master specify a byte address that multi data bytes write to in Slave.\r
+  *\r
+  */\r
+\r
+uint32_t UI2C_WriteMultiBytesOneReg(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr, uint8_t *data, uint32_t u32wLen)\r
+{\r
+    uint8_t u8Xfering = 1U, u8Ctrl = 0U;\r
+    uint32_t u32txLen = 0U;\r
+    enum UI2C_MASTER_EVENT eEvent = MASTER_SEND_START;\r
+\r
+    UI2C_START(ui2c);                                                       /* Send START */\r
+\r
+    while(u8Xfering)\r
+    {\r
+        while(!(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U));                      /* Wait UI2C new status occur */\r
+\r
+        switch(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)\r
+        {\r
+            case UI2C_PROTSTS_STARIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STARIF_Msk);     /* Clear START INT Flag */\r
+                UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x00U);             /* Write SLA+W to Register UI2C_TXDAT */\r
+                eEvent = MASTER_SEND_ADDRESS;\r
+                u8Ctrl = UI2C_CTL_PTRG;                                     /* Clear SI */\r
+                break;\r
+\r
+            case UI2C_PROTSTS_ACKIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_ACKIF_Msk);      /* Clear ACK INT Flag */\r
+\r
+                if(eEvent == MASTER_SEND_ADDRESS)\r
+                {\r
+                    UI2C_SET_DATA(ui2c, u8DataAddr);                        /* Write data address to UI2C_TXDAT */\r
+                    eEvent = MASTER_SEND_DATA;\r
+                }\r
+                else\r
+                {\r
+                    if(u32txLen < u32wLen)\r
+                        UI2C_SET_DATA(ui2c, data[u32txLen++]);              /* Write data to UI2C_TXDAT */\r
+                    else\r
+                    {\r
+                        u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);            /* Clear SI and send STOP */\r
+                    }\r
+                }\r
+\r
+                break;\r
+\r
+            case UI2C_PROTSTS_NACKIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_NACKIF_Msk);     /* Clear NACK INT Flag */\r
+                u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                    /* Clear SI and send STOP */\r
+                break;\r
+\r
+            case UI2C_PROTSTS_STORIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STORIF_Msk);     /* Clear STOP INT Flag */\r
+                u8Ctrl = UI2C_CTL_PTRG;                                     /* Clear SI */\r
+                u8Xfering = 0U;\r
+                break;\r
+\r
+            case UI2C_PROTSTS_ARBLOIF_Msk:                                  /* Arbitration Lost */\r
+            default:                                                        /* Unknow status */\r
+                u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                    /* Clear SI and send STOP */\r
+                break;\r
+        }\r
+\r
+        UI2C_SET_CONTROL_REG(ui2c, u8Ctrl);                                 /* Write controlbit to UI2C_CTL register */\r
+    }\r
+\r
+    return u32txLen;                                                        /* Return bytes length that have been transmitted */\r
+}\r
+\r
+/**\r
+  * @brief      Specify two bytes register address and Write a byte to Slave\r
+  *\r
+  * @param[in]  *ui2c            The pointer of the specified USCI_I2C module.\r
+  * @param[in]  u8SlaveAddr     Access Slave address(7-bit)\r
+  * @param[in]  u16DataAddr     Specify a address (2 byte) of data write to\r
+  * @param[in]  data            Write a byte data to Slave\r
+  *\r
+  * @retval     0               Write data success\r
+  * @retval     1               Write data fail, or bus occurs error events\r
+  *\r
+  * @details    The function is used for USCI_I2C Master specify two bytes address that data write to in Slave.\r
+  *\r
+  */\r
+\r
+uint8_t UI2C_WriteByteTwoRegs(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr, uint8_t data)\r
+{\r
+    uint8_t u8Xfering = 1U, u8Err = 0U, u8Ctrl = 0U;\r
+    uint32_t u32txLen = 0U;\r
+\r
+    UI2C_START(ui2c);                                                           /* Send START */\r
+\r
+    while(u8Xfering)\r
+    {\r
+        while(!(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U));                      /* Wait UI2C new status occur */\r
+\r
+        switch(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)\r
+        {\r
+            case UI2C_PROTSTS_STARIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STARIF_Msk);         /* Clear START INT Flag */\r
+                UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x00U);                 /* Write SLA+W to Register UI2C_TXDAT */\r
+                u8Ctrl = UI2C_CTL_PTRG;                                         /* Clear SI */\r
+                break;\r
+\r
+            case UI2C_PROTSTS_ACKIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_ACKIF_Msk);          /* Clear ACK INT Flag */\r
+\r
+                if(u32txLen == 0U)\r
+                {\r
+                    UI2C_SET_DATA(ui2c, (uint8_t)(u16DataAddr & 0xFF00U) >> 8U);  /* Write Hi byte data address to UI2C_TXDAT */\r
+                    u32txLen++;\r
+                }\r
+                else if(u32txLen == 1U)\r
+                {\r
+                    UI2C_SET_DATA(ui2c, (uint8_t)(u16DataAddr & 0xFFU));         /* Write Lo byte data address to UI2C_TXDAT */\r
+                    u32txLen++;\r
+                }\r
+                else if(u32txLen == 2U)\r
+                {\r
+                    UI2C_SET_DATA(ui2c, data);                                  /* Write data to UI2C_TXDAT */\r
+                    u32txLen++;\r
+                }\r
+                else\r
+                {\r
+                    u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                /* Clear SI and send STOP */\r
+                }\r
+\r
+                break;\r
+\r
+            case UI2C_PROTSTS_NACKIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_NACKIF_Msk);         /* Clear NACK INT Flag */\r
+                u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                        /* Clear SI and send STOP */\r
+                u8Err = 1U;\r
+                break;\r
+\r
+            case UI2C_PROTSTS_STORIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STORIF_Msk);     /* Clear STOP INT Flag */\r
+                u8Ctrl = UI2C_CTL_PTRG;                                     /* Clear SI */\r
+                u8Xfering = 0U;\r
+                break;\r
+\r
+            case UI2C_PROTSTS_ARBLOIF_Msk:                                      /* Arbitration Lost */\r
+            default:                                                            /* Unknow status */\r
+                u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                        /* Clear SI and send STOP */\r
+                u8Err = 1U;\r
+                break;\r
+        }\r
+\r
+        UI2C_SET_CONTROL_REG(ui2c, u8Ctrl);                                     /* Write controlbit to UI2C_CTL register */\r
+    }\r
+\r
+    return (u8Err | u8Xfering);\r
+}\r
+\r
+\r
+/**\r
+  * @brief      Specify two bytes register address and write multi bytes to Slave\r
+  *\r
+  * @param[in]  *ui2c           The pointer of the specified USCI_I2C module.\r
+  * @param[in]  u8SlaveAddr     Access Slave address(7-bit)\r
+  * @param[in]  u16DataAddr     Specify a address (2 bytes) of data write to\r
+  * @param[in]  *data           Pointer to array to write data to Slave\r
+  * @param[in]  u32wLen         How many bytes need to write to Slave\r
+  *\r
+  * @return     A length of how many bytes have been transmitted.\r
+  *\r
+  * @details    The function is used for USCI_I2C Master specify a byte address that multi data write to in Slave.\r
+  *\r
+  */\r
+\r
+uint32_t UI2C_WriteMultiBytesTwoRegs(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr, uint8_t *data, uint32_t u32wLen)\r
+{\r
+    uint8_t u8Xfering = 1U, u8Addr = 1U, u8Ctrl = 0U;\r
+    uint32_t u32txLen = 0U;\r
+    enum UI2C_MASTER_EVENT eEvent = MASTER_SEND_START;\r
+\r
+    UI2C_START(ui2c);                                                           /* Send START */\r
+\r
+    while(u8Xfering)\r
+    {\r
+        while(!(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U));                      /* Wait UI2C new status occur */\r
+\r
+        switch(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)\r
+        {\r
+            case UI2C_PROTSTS_STARIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STARIF_Msk);         /* Clear START INT Flag */\r
+                UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x00U);                 /* Write SLA+W to Register UI2C_TXDAT */\r
+                eEvent = MASTER_SEND_ADDRESS;\r
+                u8Ctrl = UI2C_CTL_PTRG;                                         /* Clear SI */\r
+                break;\r
+\r
+            case UI2C_PROTSTS_ACKIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_ACKIF_Msk);          /* Clear ACK INT Flag */\r
+\r
+                if(eEvent == MASTER_SEND_ADDRESS)\r
+                {\r
+                    UI2C_SET_DATA(ui2c, (uint8_t)(u16DataAddr & 0xFF00U) >> 8U);  /* Write Hi byte data address to UI2C_TXDAT */\r
+                    eEvent = MASTER_SEND_DATA;\r
+                }\r
+                else if(eEvent == MASTER_SEND_DATA)\r
+                {\r
+                    if(u8Addr)\r
+                    {\r
+                        UI2C_SET_DATA(ui2c, (uint8_t)(u16DataAddr & 0xFFU));         /* Write Lo byte data address to UI2C_TXDAT */\r
+                        u8Addr = 0;\r
+                    }\r
+                    else\r
+                    {\r
+                        if(u32txLen < u32wLen)\r
+                        {\r
+                            UI2C_SET_DATA(ui2c, data[u32txLen++]);                  /* Write data to UI2C_TXDAT */\r
+                        }\r
+                        else\r
+                        {\r
+                            u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                /* Clear SI and send STOP */\r
+                        }\r
+                    }\r
+                }\r
+\r
+                break;\r
+\r
+            case UI2C_PROTSTS_NACKIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_NACKIF_Msk);         /* Clear NACK INT Flag */\r
+                u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                        /* Clear SI and send STOP */\r
+                break;\r
+\r
+            case UI2C_PROTSTS_STORIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STORIF_Msk);     /* Clear STOP INT Flag */\r
+                u8Ctrl = UI2C_CTL_PTRG;                                     /* Clear SI */\r
+                u8Xfering = 0U;\r
+                break;\r
+\r
+            case UI2C_PROTSTS_ARBLOIF_Msk:                                      /* Arbitration Lost */\r
+            default:                                                            /* Unknow status */\r
+                u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                        /* Clear SI and send STOP */\r
+                break;\r
+        }\r
+\r
+        UI2C_SET_CONTROL_REG(ui2c, u8Ctrl);                                     /* Write controlbit to UI2C_CTL register */\r
+    }\r
+\r
+    return u32txLen;                                                            /* Return bytes length that have been transmitted */\r
+}\r
+\r
+/**\r
+  * @brief      Read a byte from Slave\r
+  *\r
+  * @param[in]  *ui2c           The pointer of the specified USCI_I2C module.\r
+  * @param[in]  u8SlaveAddr     Access Slave address(7-bit)\r
+  *\r
+  * @return     Read a byte data from Slave\r
+  *\r
+  * @details    The function is used for USCI_I2C Master to read a byte data from Slave.\r
+  *\r
+  */\r
+uint8_t UI2C_ReadByte(UI2C_T *ui2c, uint8_t u8SlaveAddr)\r
+{\r
+    uint8_t u8Xfering = 1U, u8Err = 0U, rdata = 0U, u8Ctrl = 0U;\r
+    enum UI2C_MASTER_EVENT eEvent = MASTER_SEND_START;\r
+\r
+    UI2C_START(ui2c);                                                       /* Send START */\r
+\r
+    while(u8Xfering)\r
+    {\r
+        while(!(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U));                      /* Wait UI2C new status occur */\r
+\r
+        switch(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)\r
+        {\r
+            case UI2C_PROTSTS_STARIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STARIF_Msk);     /* Clear START INT Flag */\r
+                UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x01U);             /* Write SLA+R to Register UI2C_TXDAT */\r
+                eEvent = MASTER_SEND_H_RD_ADDRESS;\r
+                u8Ctrl = UI2C_CTL_PTRG;\r
+                break;\r
+\r
+            case UI2C_PROTSTS_ACKIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_ACKIF_Msk);      /* Clear ACK INT Flag */\r
+                eEvent = MASTER_READ_DATA;\r
+                break;\r
+\r
+            case UI2C_PROTSTS_NACKIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_NACKIF_Msk);     /* Clear NACK INT Flag */\r
+\r
+                if(eEvent == MASTER_SEND_H_RD_ADDRESS)\r
+                {\r
+                    u8Err = 1U;\r
+                }\r
+                else\r
+                {\r
+                    rdata = (unsigned char) UI2C_GET_DATA(ui2c);            /* Receive Data */\r
+                }\r
+\r
+                u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                        /* Clear SI and send STOP */\r
+\r
+                break;\r
+\r
+            case UI2C_PROTSTS_STORIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STORIF_Msk);     /* Clear STOP INT Flag */\r
+                u8Ctrl = UI2C_CTL_PTRG;                                     /* Clear SI */\r
+                u8Xfering = 0U;\r
+                break;\r
+\r
+            case UI2C_PROTSTS_ARBLOIF_Msk:                                  /* Arbitration Lost */\r
+            default:                                                        /* Unknow status */\r
+                u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                    /* Clear SI and send STOP */\r
+                u8Err = 1U;\r
+                break;\r
+        }\r
+\r
+        UI2C_SET_CONTROL_REG(ui2c, u8Ctrl);                                 /* Write controlbit to UI2C_PROTCTL register */\r
+    }\r
+\r
+    if(u8Err)\r
+        rdata = 0U;\r
+\r
+    return rdata;                                                           /* Return read data */\r
+}\r
+\r
+\r
+/**\r
+  * @brief      Read multi bytes from Slave\r
+  *\r
+  * @param[in]  *ui2c           The pointer of the specified USCI_I2C module.\r
+  * @param[in]  u8SlaveAddr     Access Slave address(7-bit)\r
+  * @param[out] *rdata          Point to array to store data from Slave\r
+  * @param[in]  u32rLen         How many bytes need to read from Slave\r
+  *\r
+  * @return     A length of how many bytes have been received\r
+  *\r
+  * @details    The function is used for USCI_I2C Master to read multi data bytes from Slave.\r
+  *\r
+  *\r
+  */\r
+uint32_t UI2C_ReadMultiBytes(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint8_t *rdata, uint32_t u32rLen)\r
+{\r
+    uint8_t u8Xfering = 1U, u8Ctrl = 0U;\r
+    uint32_t u32rxLen = 0U;\r
+    enum UI2C_MASTER_EVENT eEvent = MASTER_SEND_START;\r
+\r
+    UI2C_START(ui2c);                                                       /* Send START */\r
+\r
+    while(u8Xfering)\r
+    {\r
+        while(!(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U));                      /* Wait UI2C new status occur */\r
+\r
+        switch(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)\r
+        {\r
+            case UI2C_PROTSTS_STARIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STARIF_Msk);     /* Clear START INT Flag */\r
+                UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x01U);             /* Write SLA+R to Register UI2C_TXDAT */\r
+                eEvent = MASTER_SEND_H_RD_ADDRESS;\r
+                u8Ctrl = UI2C_CTL_PTRG;\r
+                break;\r
+\r
+            case UI2C_PROTSTS_ACKIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_ACKIF_Msk);      /* Clear ACK INT Flag */\r
+\r
+                if(eEvent == MASTER_SEND_H_RD_ADDRESS)\r
+                {\r
+                    u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_AA);\r
+                    eEvent = MASTER_READ_DATA;\r
+                }\r
+                else\r
+                {\r
+                    rdata[u32rxLen++] = (unsigned char) UI2C_GET_DATA(ui2c);    /* Receive Data */\r
+\r
+                    if(u32rxLen < (u32rLen - 1U))\r
+                        u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_AA);\r
+                    else\r
+                        u8Ctrl = UI2C_CTL_PTRG;\r
+                }\r
+\r
+                break;\r
+\r
+            case UI2C_PROTSTS_NACKIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_NACKIF_Msk);     /* Clear NACK INT Flag */\r
+\r
+                if(eEvent == MASTER_READ_DATA)\r
+                    rdata[u32rxLen++] = (unsigned char) UI2C_GET_DATA(ui2c);    /* Receive Data */\r
+\r
+                u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                        /* Clear SI and send STOP */\r
+\r
+                break;\r
+\r
+            case UI2C_PROTSTS_STORIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STORIF_Msk);     /* Clear STOP INT Flag */\r
+                u8Ctrl = UI2C_CTL_PTRG;                                     /* Clear SI */\r
+                u8Xfering = 0U;\r
+                break;\r
+\r
+            case UI2C_PROTSTS_ARBLOIF_Msk:                                  /* Arbitration Lost */\r
+            default:                                                        /* Unknow status */\r
+                u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                    /* Clear SI and send STOP */\r
+                break;\r
+        }\r
+\r
+        UI2C_SET_CONTROL_REG(ui2c, u8Ctrl);                                 /* Write controlbit to UI2C_PROTCTL register */\r
+    }\r
+\r
+    return u32rxLen;                                                        /* Return bytes length that have been received */\r
+}\r
+\r
+\r
+/**\r
+  * @brief      Specify a byte register address and read a byte from Slave\r
+  *\r
+  * @param[in]  *ui2c            The pointer of the specified USCI_I2C module.\r
+  * @param[in]  u8SlaveAddr     Access Slave address(7-bit)\r
+  * @param[in]  u8DataAddr      Specify a address(1 byte) of data read from\r
+  *\r
+  * @return     Read a byte data from Slave\r
+  *\r
+  * @details    The function is used for USCI_I2C Master specify a byte address that a data byte read from Slave.\r
+  *\r
+  *\r
+  */\r
+uint8_t UI2C_ReadByteOneReg(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr)\r
+{\r
+    uint8_t u8Xfering = 1U, u8Err = 0U, rdata = 0U, u8Ctrl = 0U;\r
+    enum UI2C_MASTER_EVENT eEvent = MASTER_SEND_START;\r
+\r
+    UI2C_START(ui2c);                                                       /* Send START */\r
+\r
+    while(u8Xfering)\r
+    {\r
+        while(!(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U));                      /* Wait UI2C new status occur */\r
+\r
+        switch(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)\r
+        {\r
+            case UI2C_PROTSTS_STARIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STARIF_Msk);     /* Clear START INT Flag */\r
+\r
+                if(eEvent == MASTER_SEND_START)\r
+                {\r
+                    UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x00U);         /* Write SLA+W to Register UI2C_TXDAT */\r
+                    eEvent = MASTER_SEND_ADDRESS;\r
+                }\r
+                else if(eEvent == MASTER_SEND_REPEAT_START)\r
+                {\r
+                    UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x01U);        /* Write SLA+R to Register TXDAT */\r
+                    eEvent = MASTER_SEND_H_RD_ADDRESS;\r
+                }\r
+\r
+                u8Ctrl = UI2C_CTL_PTRG;\r
+                break;\r
+\r
+            case UI2C_PROTSTS_ACKIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_ACKIF_Msk);      /* Clear ACK INT Flag */\r
+\r
+                if(eEvent == MASTER_SEND_ADDRESS)\r
+                {\r
+                    UI2C_SET_DATA(ui2c, u8DataAddr);                        /* Write data address of register */\r
+                    u8Ctrl = UI2C_CTL_PTRG;\r
+                    eEvent = MASTER_SEND_DATA;\r
+                }\r
+                else if(eEvent == MASTER_SEND_DATA)\r
+                {\r
+                    u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STA);                /* Send repeat START signal */\r
+                    eEvent = MASTER_SEND_REPEAT_START;\r
+                }\r
+                else\r
+                {\r
+                    /* SLA+R ACK */\r
+                    u8Ctrl = UI2C_CTL_PTRG;\r
+                    eEvent = MASTER_READ_DATA;\r
+                }\r
+\r
+                break;\r
+\r
+            case UI2C_PROTSTS_NACKIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_NACKIF_Msk);     /* Clear NACK INT Flag */\r
+\r
+                if(eEvent == MASTER_READ_DATA)\r
+                {\r
+                    rdata = (uint8_t) UI2C_GET_DATA(ui2c);                  /* Receive Data */\r
+                }\r
+                else\r
+                {\r
+                    u8Err = 1U;\r
+                }\r
+\r
+                u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                        /* Clear SI and send STOP */\r
+\r
+                break;\r
+\r
+            case UI2C_PROTSTS_STORIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STORIF_Msk);     /* Clear STOP INT Flag */\r
+                u8Ctrl = UI2C_CTL_PTRG;                                     /* Clear SI */\r
+                u8Xfering = 0U;\r
+                break;\r
+\r
+            case UI2C_PROTSTS_ARBLOIF_Msk:                                  /* Arbitration Lost */\r
+            default:                                                        /* Unknow status */\r
+                u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                    /* Clear SI and send STOP */\r
+                u8Err = 1U;\r
+                break;\r
+        }\r
+\r
+        UI2C_SET_CONTROL_REG(ui2c, u8Ctrl);                                 /* Write controlbit to UI2C_PROTCTL register */\r
+    }\r
+\r
+    if(u8Err)\r
+        rdata = 0U;                                                 /* If occurs error, return 0 */\r
+\r
+    return rdata;                                                  /* Return read data */\r
+}\r
+\r
+/**\r
+  * @brief      Specify a byte register address and read multi bytes from Slave\r
+  *\r
+  * @param[in]  *ui2c           The pointer of the specified USCI_I2C module.\r
+  * @param[in]  u8SlaveAddr     Access Slave address(7-bit)\r
+  * @param[in]  u8DataAddr      Specify a address (1 bytes) of data read from\r
+  * @param[out] *rdata          Point to array to store data from Slave\r
+  * @param[in]  u32rLen         How many bytes need to read from Slave\r
+  *\r
+  * @return     A length of how many bytes have been received\r
+  *\r
+  * @details    The function is used for USCI_I2C Master specify a byte address that multi data bytes read from Slave.\r
+  *\r
+  *\r
+  */\r
+uint32_t UI2C_ReadMultiBytesOneReg(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr, uint8_t *rdata, uint32_t u32rLen)\r
+{\r
+    uint8_t u8Xfering = 1U, u8Ctrl = 0U;\r
+    uint32_t u32rxLen = 0U;\r
+    enum UI2C_MASTER_EVENT eEvent = MASTER_SEND_START;\r
+\r
+    UI2C_START(ui2c);                                                       /* Send START */\r
+\r
+    while(u8Xfering)\r
+    {\r
+        while(!(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U));                      /* Wait UI2C new status occur */\r
+\r
+        switch(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)\r
+        {\r
+            case UI2C_PROTSTS_STARIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STARIF_Msk);     /* Clear START INT Flag */\r
+\r
+                if(eEvent == MASTER_SEND_START)\r
+                {\r
+                    UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x00U);         /* Write SLA+W to Register UI2C_TXDAT */\r
+                    eEvent = MASTER_SEND_ADDRESS;\r
+                }\r
+                else if(eEvent == MASTER_SEND_REPEAT_START)\r
+                {\r
+                    UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x01U);        /* Write SLA+R to Register TXDAT */\r
+                    eEvent = MASTER_SEND_H_RD_ADDRESS;\r
+                }\r
+\r
+                u8Ctrl = UI2C_CTL_PTRG;\r
+                break;\r
+\r
+            case UI2C_PROTSTS_ACKIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_ACKIF_Msk);      /* Clear ACK INT Flag */\r
+\r
+                if(eEvent == MASTER_SEND_ADDRESS)\r
+                {\r
+                    UI2C_SET_DATA(ui2c, u8DataAddr);                        /* Write data address of register */\r
+                    u8Ctrl = UI2C_CTL_PTRG;\r
+                    eEvent = MASTER_SEND_DATA;\r
+                }\r
+                else if(eEvent == MASTER_SEND_DATA)\r
+                {\r
+                    u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STA);                /* Send repeat START signal */\r
+                    eEvent = MASTER_SEND_REPEAT_START;\r
+                }\r
+                else if(eEvent == MASTER_SEND_H_RD_ADDRESS)\r
+                {\r
+                    /* SLA+R ACK */\r
+                    u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_AA);\r
+                    eEvent = MASTER_READ_DATA;\r
+                }\r
+                else\r
+                {\r
+                    rdata[u32rxLen++] = (uint8_t) UI2C_GET_DATA(ui2c);      /* Receive Data */\r
+\r
+                    if(u32rxLen < u32rLen - 1U)\r
+                        u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_AA);\r
+                    else\r
+                        u8Ctrl = UI2C_CTL_PTRG;\r
+                }\r
+\r
+                break;\r
+\r
+            case UI2C_PROTSTS_NACKIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_NACKIF_Msk);     /* Clear NACK INT Flag */\r
+\r
+                if(eEvent == MASTER_READ_DATA)\r
+                    rdata[u32rxLen++] = (uint8_t) UI2C_GET_DATA(ui2c);                  /* Receive Data */\r
+\r
+                u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                        /* Clear SI and send STOP */\r
+\r
+                break;\r
+\r
+            case UI2C_PROTSTS_STORIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STORIF_Msk);     /* Clear STOP INT Flag */\r
+                u8Ctrl = UI2C_CTL_PTRG;                                     /* Clear SI */\r
+                u8Xfering = 0U;\r
+                break;\r
+\r
+            case UI2C_PROTSTS_ARBLOIF_Msk:                                  /* Arbitration Lost */\r
+            default:                                                        /* Unknow status */\r
+                u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                    /* Clear SI and send STOP */\r
+                break;\r
+        }\r
+\r
+        UI2C_SET_CONTROL_REG(ui2c, u8Ctrl);                                 /* Write controlbit to UI2C_PROTCTL register */\r
+    }\r
+\r
+    return u32rxLen;                                               /* Return bytes length that have been received */\r
+}\r
+\r
+/**\r
+  * @brief      Specify two bytes register address and read a byte from Slave\r
+  *\r
+  * @param[in]  *ui2c           The pointer of the specified USCI_I2C module.\r
+  * @param[in]  u8SlaveAddr     Access Slave address(7-bit)\r
+  * @param[in]  u16DataAddr     Specify a address(2 byte) of data read from\r
+  *\r
+  * @return     Read a byte data from Slave\r
+  *\r
+  * @details    The function is used for USCI_I2C Master specify two bytes address that a data byte read from Slave.\r
+  *\r
+  *\r
+  */\r
+uint8_t UI2C_ReadByteTwoRegs(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr)\r
+{\r
+    uint8_t u8Xfering = 1U, u8Err = 0U, rdata = 0U, u8Addr = 1U, u8Ctrl = 0U;\r
+    enum UI2C_MASTER_EVENT eEvent = MASTER_SEND_START;\r
+\r
+    UI2C_START(ui2c);                                                       /* Send START */\r
+\r
+    while(u8Xfering)\r
+    {\r
+        while(!(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U));                      /* Wait UI2C new status occur */\r
+\r
+        switch(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)\r
+        {\r
+            case UI2C_PROTSTS_STARIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STARIF_Msk);     /* Clear START INT Flag */\r
+\r
+                if(eEvent == MASTER_SEND_START)\r
+                {\r
+                    UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x00U);        /* Write SLA+W to Register UI2C_TXDAT */\r
+                    eEvent = MASTER_SEND_ADDRESS;\r
+                }\r
+                else if(eEvent == MASTER_SEND_REPEAT_START)\r
+                {\r
+                    UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x01U);        /* Write SLA+R to Register TXDAT */\r
+                    eEvent = MASTER_SEND_H_RD_ADDRESS;\r
+                }\r
+\r
+                u8Ctrl = UI2C_CTL_PTRG;\r
+                break;\r
+\r
+            case UI2C_PROTSTS_ACKIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_ACKIF_Msk);      /* Clear ACK INT Flag */\r
+\r
+                if(eEvent == MASTER_SEND_ADDRESS)\r
+                {\r
+                    UI2C_SET_DATA(ui2c, (uint8_t)(u16DataAddr & 0xFF00U) >> 8U);  /* Write Hi byte address of register */\r
+                    eEvent = MASTER_SEND_DATA;\r
+                }\r
+                else if(eEvent == MASTER_SEND_DATA)\r
+                {\r
+                    if(u8Addr)\r
+                    {\r
+                        UI2C_SET_DATA(ui2c, (uint8_t)(u16DataAddr & 0xFFU));       /* Write Lo byte address of register */\r
+                        u8Addr = 0;\r
+                    }\r
+                    else\r
+                    {\r
+                        u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STA);                /* Send repeat START signal */\r
+                        eEvent = MASTER_SEND_REPEAT_START;\r
+                    }\r
+                }\r
+                else\r
+                {\r
+                    /* SLA+R ACK */\r
+                    u8Ctrl = UI2C_CTL_PTRG;\r
+                    eEvent = MASTER_READ_DATA;\r
+                }\r
+\r
+                break;\r
+\r
+            case UI2C_PROTSTS_NACKIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_NACKIF_Msk);     /* Clear NACK INT Flag */\r
+\r
+                if(eEvent == MASTER_READ_DATA)\r
+                {\r
+                    rdata = (uint8_t) UI2C_GET_DATA(ui2c);                  /* Receive Data */\r
+                }\r
+                else\r
+                {\r
+                    u8Err = 1U;\r
+                }\r
+\r
+                u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                        /* Clear SI and send STOP */\r
+\r
+                break;\r
+\r
+            case UI2C_PROTSTS_STORIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STORIF_Msk);     /* Clear STOP INT Flag */\r
+                u8Ctrl = UI2C_CTL_PTRG;                                     /* Clear SI */\r
+                u8Xfering = 0U;\r
+                break;\r
+\r
+            case UI2C_PROTSTS_ARBLOIF_Msk:                                  /* Arbitration Lost */\r
+            default:                                                        /* Unknow status */\r
+                u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                    /* Clear SI and send STOP */\r
+                u8Err = 1U;\r
+                break;\r
+        }\r
+\r
+        UI2C_SET_CONTROL_REG(ui2c, u8Ctrl);                                 /* Write controlbit to UI2C_PROTCTL register */\r
+    }\r
+\r
+    if(u8Err)\r
+        rdata = 0U;                                                 /* If occurs error, return 0 */\r
+\r
+    return rdata;                                                  /* Return read data */\r
+}\r
+\r
+/**\r
+  * @brief      Specify two bytes register address and read multi bytes from Slave\r
+  *\r
+  * @param[in]  *ui2c            The pointer of the specified USCI_I2C module.\r
+  * @param[in]  u8SlaveAddr     Access Slave address(7-bit)\r
+  * @param[in]  u16DataAddr     Specify a address (2 bytes) of data read from\r
+  * @param[out] *rdata          Point to array to store data from Slave\r
+  * @param[in]  u32rLen         How many bytes need to read from Slave\r
+  *\r
+  * @return     A length of how many bytes have been received\r
+  *\r
+  * @details    The function is used for USCI_I2C Master specify two bytes address that multi data bytes read from Slave.\r
+  *\r
+  *\r
+  */\r
+uint32_t UI2C_ReadMultiBytesTwoRegs(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr, uint8_t *rdata, uint32_t u32rLen)\r
+{\r
+    uint8_t u8Xfering = 1U, u8Addr = 1U, u8Ctrl = 0U;\r
+    uint32_t u32rxLen = 0U;\r
+    enum UI2C_MASTER_EVENT eEvent = MASTER_SEND_START;\r
+\r
+    UI2C_START(ui2c);                                                       /* Send START */\r
+\r
+    while(u8Xfering)\r
+    {\r
+        while(!(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U));                      /* Wait UI2C new status occur */\r
+\r
+        switch(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)\r
+        {\r
+            case UI2C_PROTSTS_STARIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STARIF_Msk);     /* Clear START INT Flag */\r
+\r
+                if(eEvent == MASTER_SEND_START)\r
+                {\r
+                    UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x00U);         /* Write SLA+W to Register UI2C_TXDAT */\r
+                    eEvent = MASTER_SEND_ADDRESS;\r
+                }\r
+                else if(eEvent == MASTER_SEND_REPEAT_START)\r
+                {\r
+                    UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x01U);        /* Write SLA+R to Register TXDAT */\r
+                    eEvent = MASTER_SEND_H_RD_ADDRESS;\r
+                }\r
+\r
+                u8Ctrl = UI2C_CTL_PTRG;\r
+                break;\r
+\r
+            case UI2C_PROTSTS_ACKIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_ACKIF_Msk);      /* Clear ACK INT Flag */\r
+\r
+                if(eEvent == MASTER_SEND_ADDRESS)\r
+                {\r
+                    UI2C_SET_DATA(ui2c, (uint8_t)(u16DataAddr & 0xFF00U) >> 8U);  /* Write Hi byte address of register */\r
+                    eEvent = MASTER_SEND_DATA;\r
+                }\r
+                else if(eEvent == MASTER_SEND_DATA)\r
+                {\r
+                    if(u8Addr)\r
+                    {\r
+                        UI2C_SET_DATA(ui2c, (uint8_t)(u16DataAddr & 0xFFU));       /* Write Lo byte address of register */\r
+                        u8Addr = 0;\r
+                    }\r
+                    else\r
+                    {\r
+                        u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STA);                /* Send repeat START signal */\r
+                        eEvent = MASTER_SEND_REPEAT_START;\r
+                    }\r
+                }\r
+                else if(eEvent == MASTER_SEND_H_RD_ADDRESS)\r
+                {\r
+                    u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_AA);\r
+                    eEvent = MASTER_READ_DATA;\r
+                }\r
+                else\r
+                {\r
+                    rdata[u32rxLen++] = (uint8_t) UI2C_GET_DATA(ui2c);      /* Receive Data */\r
+\r
+                    if(u32rxLen < u32rLen - 1U)\r
+                        u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_AA);\r
+                    else\r
+                        u8Ctrl = UI2C_CTL_PTRG;\r
+                }\r
+\r
+                break;\r
+\r
+            case UI2C_PROTSTS_NACKIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_NACKIF_Msk);     /* Clear NACK INT Flag */\r
+\r
+                if(eEvent == MASTER_READ_DATA)\r
+                    rdata[u32rxLen++] = (uint8_t) UI2C_GET_DATA(ui2c);                  /* Receive Data */\r
+\r
+                u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                        /* Clear SI and send STOP */\r
+\r
+                break;\r
+\r
+            case UI2C_PROTSTS_STORIF_Msk:\r
+                UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STORIF_Msk);     /* Clear STOP INT Flag */\r
+                u8Ctrl = UI2C_CTL_PTRG;                                     /* Clear SI */\r
+                u8Xfering = 0U;\r
+                break;\r
+\r
+            case UI2C_PROTSTS_ARBLOIF_Msk:                                  /* Arbitration Lost */\r
+            default:                                                        /* Unknow status */\r
+                u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO);                    /* Clear SI and send STOP */\r
+                break;\r
+        }\r
+\r
+        UI2C_SET_CONTROL_REG(ui2c, u8Ctrl);                                 /* Write controlbit to UI2C_PROTCTL register */\r
+    }\r
+\r
+    return u32rxLen;                                                        /* Return bytes length that have been received */\r
+}\r
+\r
+/*@}*/ /* end of group USCI_I2C_EXPORTED_FUNCTIONS */\r
+\r
+/*@}*/ /* end of group USCI_I2C_Driver */\r
+\r
+/*@}*/ /* end of group Standard_Driver */\r
+\r
+/*** (C) COPYRIGHT 2016 Nuvoton Technology Corp. ***/\r