1 /**************************************************************************//** 2 * @file USCI_I2C.h 3 * @version V3.0 4 * @brief M460 series USCI I2C(UI2C) driver header file 5 * 6 * @copyright SPDX-License-Identifier: Apache-2.0 7 * @copyright Copyright (C) 2021 Nuvoton Technology Corp. All rights reserved. 8 ******************************************************************************/ 9 #ifndef __USCI_I2C_H__ 10 #define __USCI_I2C_H__ 11 12 #ifdef __cplusplus 13 extern "C" 14 { 15 #endif 16 17 18 /** @addtogroup Standard_Driver Standard Driver 19 @{ 20 */ 21 22 /** @addtogroup USCI_I2C_Driver USCI_I2C Driver 23 @{ 24 */ 25 26 /** @addtogroup USCI_I2C_EXPORTED_CONSTANTS USCI_I2C Exported Constants 27 @{ 28 */ 29 30 /*---------------------------------------------------------------------------------------------------------*/ 31 /* USCI_I2C master event definitions */ 32 /*---------------------------------------------------------------------------------------------------------*/ 33 enum UI2C_MASTER_EVENT 34 { 35 MASTER_SEND_ADDRESS = 10, /*!< Master send address to Slave */ 36 MASTER_SEND_H_WR_ADDRESS, /*!< Master send High address to Slave */ 37 MASTER_SEND_H_RD_ADDRESS, /*!< Master send address to Slave (Read ADDR) */ 38 MASTER_SEND_L_ADDRESS, /*!< Master send Low address to Slave */ 39 MASTER_SEND_DATA, /*!< Master Send Data to Slave */ 40 MASTER_SEND_REPEAT_START, /*!< Master send repeat start to Slave */ 41 MASTER_READ_DATA, /*!< Master Get Data from Slave */ 42 MASTER_STOP, /*!< Master send stop to Slave */ 43 MASTER_SEND_START /*!< Master send start to Slave */ 44 }; 45 46 /*---------------------------------------------------------------------------------------------------------*/ 47 /* USCI_I2C slave event definitions */ 48 /*---------------------------------------------------------------------------------------------------------*/ 49 enum UI2C_SLAVE_EVENT 50 { 51 SLAVE_ADDRESS_ACK = 100, /*!< Slave send address ACK */ 52 SLAVE_H_WR_ADDRESS_ACK, /*!< Slave send High address ACK */ 53 SLAVE_L_WR_ADDRESS_ACK, /*!< Slave send Low address ACK */ 54 SLAVE_GET_DATA, /*!< Slave Get Data from Master (Write CMD) */ 55 SLAVE_SEND_DATA, /*!< Slave Send Data to Master (Read CMD) */ 56 SLAVE_H_RD_ADDRESS_ACK, /*!< Slave send High address ACK */ 57 SLAVE_L_RD_ADDRESS_ACK /*!< Slave send Low address ACK */ 58 }; 59 60 /*---------------------------------------------------------------------------------------------------------*/ 61 /* USCI_CTL constant definitions. */ 62 /*---------------------------------------------------------------------------------------------------------*/ 63 #define UI2C_CTL_PTRG 0x20UL /*!< USCI_CTL setting for I2C control bits. It would set PTRG bit \hideinitializer */ 64 #define UI2C_CTL_STA 0x08UL /*!< USCI_CTL setting for I2C control bits. It would set STA bit \hideinitializer */ 65 #define UI2C_CTL_STO 0x04UL /*!< USCI_CTL setting for I2C control bits. It would set STO bit \hideinitializer */ 66 #define UI2C_CTL_AA 0x02UL /*!< USCI_CTL setting for I2C control bits. It would set AA bit \hideinitializer */ 67 68 /*---------------------------------------------------------------------------------------------------------*/ 69 /* USCI_I2C GCMode constant definitions. */ 70 /*---------------------------------------------------------------------------------------------------------*/ 71 #define UI2C_GCMODE_ENABLE (1U) /*!< Enable USCI_I2C GC Mode \hideinitializer */ 72 #define UI2C_GCMODE_DISABLE (0U) /*!< Disable USCI_I2C GC Mode \hideinitializer */ 73 74 /*---------------------------------------------------------------------------------------------------------*/ 75 /* USCI_I2C Wakeup Mode constant definitions. */ 76 /*---------------------------------------------------------------------------------------------------------*/ 77 #define UI2C_DATA_TOGGLE_WK (0x0U << UI2C_WKCTL_WKADDREN_Pos) /*!< Wakeup according data toggle \hideinitializer */ 78 #define UI2C_ADDR_MATCH_WK (0x1U << UI2C_WKCTL_WKADDREN_Pos) /*!< Wakeup according address match \hideinitializer */ 79 80 /*---------------------------------------------------------------------------------------------------------*/ 81 /* USCI_I2C interrupt mask definitions */ 82 /*---------------------------------------------------------------------------------------------------------*/ 83 #define UI2C_TO_INT_MASK (0x001U) /*!< Time-out interrupt mask \hideinitializer */ 84 #define UI2C_STAR_INT_MASK (0x002U) /*!< Start condition received interrupt mask \hideinitializer */ 85 #define UI2C_STOR_INT_MASK (0x004U) /*!< Stop condition received interrupt mask \hideinitializer */ 86 #define UI2C_NACK_INT_MASK (0x008U) /*!< Non-acknowledge interrupt mask \hideinitializer */ 87 #define UI2C_ARBLO_INT_MASK (0x010U) /*!< Arbitration lost interrupt mask \hideinitializer */ 88 #define UI2C_ERR_INT_MASK (0x020U) /*!< Error interrupt mask \hideinitializer */ 89 #define UI2C_ACK_INT_MASK (0x040U) /*!< Acknowledge interrupt mask \hideinitializer */ 90 91 /*---------------------------------------------------------------------------------------------------------*/ 92 /* USCI_I2C Define Error Code */ 93 /*---------------------------------------------------------------------------------------------------------*/ 94 #define UI2C_TIMEOUT SystemCoreClock /*!< UI2C time-out counter (1 second time-out) \hideinitializer */ 95 #define UI2C_OK ( 0L) /*!< UI2C operation OK \hideinitializer */ 96 #define UI2C_ERR_FAIL (-1L) /*!< UI2C operation failed \hideinitializer */ 97 #define UI2C_ERR_TIMEOUT (-2L) /*!< UI2C operation abort due to timeout error \hideinitializer */ 98 99 /*@}*/ /* end of group USCI_I2C_EXPORTED_CONSTANTS */ 100 101 extern int32_t g_UI2C_i32ErrCode; 102 103 /** @addtogroup USCI_I2C_EXPORTED_FUNCTIONS USCI_I2C Exported Functions 104 @{ 105 */ 106 107 /** 108 * @brief This macro sets the USCI_I2C protocol control register at one time 109 * 110 * @param[in] ui2c The pointer of the specified USCI_I2C module. 111 * @param[in] u8Ctrl Set the register value of USCI_I2C control register. 112 * 113 * @return None 114 * 115 * @details Set UI2C_PROTCTL register to control USCI_I2C bus conditions of START, STOP, SI, ACK. 116 * \hideinitializer 117 */ 118 #define UI2C_SET_CONTROL_REG(ui2c, u8Ctrl) ((ui2c)->PROTCTL = ((ui2c)->PROTCTL & ~0x2EU) | (u8Ctrl)) 119 120 /** 121 * @brief This macro only set START bit to protocol control register of USCI_I2C module. 122 * 123 * @param[in] ui2c The pointer of the specified USCI_I2C module. 124 * 125 * @return None 126 * 127 * @details Set the USCI_I2C bus START condition in UI2C_PROTCTL register. 128 * \hideinitializer 129 */ 130 #define UI2C_START(ui2c) ((ui2c)->PROTCTL = ((ui2c)->PROTCTL & ~UI2C_PROTCTL_PTRG_Msk) | UI2C_PROTCTL_STA_Msk) 131 132 /** 133 * @brief This macro only set STOP bit to the control register of USCI_I2C module 134 * 135 * @param[in] ui2c The pointer of the specified USCI_I2C module. 136 * 137 * @return None 138 * 139 * @details Set the USCI_I2C bus STOP condition in UI2C_PROTCTL register. 140 * \hideinitializer 141 */ 142 #define UI2C_STOP(ui2c) ((ui2c)->PROTCTL = ((ui2c)->PROTCTL & ~0x2E) | (UI2C_PROTCTL_PTRG_Msk | UI2C_PROTCTL_STO_Msk)) 143 144 /** 145 * @brief This macro returns the data stored in data register of USCI_I2C module 146 * 147 * @param[in] ui2c The pointer of the specified USCI_I2C module. 148 * 149 * @return Data 150 * 151 * @details Read a byte data value of UI2C_RXDAT register from USCI_I2C bus 152 * \hideinitializer 153 */ 154 #define UI2C_GET_DATA(ui2c) ((ui2c)->RXDAT) 155 156 /** 157 * @brief This macro writes the data to data register of USCI_I2C module 158 * 159 * @param[in] ui2c The pointer of the specified USCI_I2C module. 160 * @param[in] u8Data The data which will be written to data register of USCI_I2C module. 161 * 162 * @return None 163 * 164 * @details Write a byte data value of UI2C_TXDAT register, then sends address or data to USCI I2C bus 165 * \hideinitializer 166 */ 167 #define UI2C_SET_DATA(ui2c, u8Data) ((ui2c)->TXDAT = (u8Data)) 168 169 /** 170 * @brief This macro returns time-out flag 171 * 172 * @param[in] ui2c The pointer of the specified USCI_I2C module. 173 * 174 * @retval 0 USCI_I2C bus time-out is not happened 175 * @retval 1 USCI_I2C bus time-out is happened 176 * 177 * @details USCI_I2C bus occurs time-out event, the time-out flag will be set. If not occurs time-out event, this bit is cleared. 178 * \hideinitializer 179 */ 180 #define UI2C_GET_TIMEOUT_FLAG(ui2c) (((ui2c)->PROTSTS & UI2C_PROTSTS_TOIF_Msk) == UI2C_PROTSTS_TOIF_Msk ? 1:0) 181 182 /** 183 * @brief This macro returns wake-up flag 184 * 185 * @param[in] ui2c The pointer of the specified USCI_I2C module. 186 * 187 * @retval 0 Chip is not woken-up from power-down mode 188 * @retval 1 Chip is woken-up from power-down mode 189 * 190 * @details USCI_I2C controller wake-up flag will be set when USCI_I2C bus occurs wake-up from deep-sleep. 191 * \hideinitializer 192 */ 193 #define UI2C_GET_WAKEUP_FLAG(ui2c) (((ui2c)->WKSTS & UI2C_WKSTS_WKF_Msk) == UI2C_WKSTS_WKF_Msk ? 1:0) 194 195 /** 196 * @brief This macro is used to clear USCI_I2C wake-up flag 197 * 198 * @param[in] ui2c The pointer of the specified USCI_I2C module. 199 * 200 * @return None 201 * 202 * @details If USCI_I2C wake-up flag is set, use this macro to clear it. 203 * \hideinitializer 204 */ 205 #define UI2C_CLR_WAKEUP_FLAG(ui2c) ((ui2c)->WKSTS = UI2C_WKSTS_WKF_Msk) 206 207 /** 208 * @brief This macro disables the USCI_I2C 10-bit address mode 209 * 210 * @param[in] ui2c The pointer of the specified USCI_I2C module. 211 * 212 * @return None 213 * 214 * @details The UI2C_I2C is 7-bit address mode, when disable USCI_I2C 10-bit address match function. 215 * \hideinitializer 216 */ 217 #define UI2C_DISABLE_10BIT_ADDR_MODE(ui2c) ((ui2c)->PROTCTL &= ~(UI2C_PROTCTL_ADDR10EN_Msk)) 218 219 /** 220 * @brief This macro enables the 10-bit address mode 221 * 222 * @param[in] ui2c The pointer of the specified USCI_I2C module. 223 * 224 * @return None 225 * 226 * @details To enable USCI_I2C 10-bit address match function. 227 * \hideinitializer 228 */ 229 #define UI2C_ENABLE_10BIT_ADDR_MODE(ui2c) ((ui2c)->PROTCTL |= UI2C_PROTCTL_ADDR10EN_Msk) 230 231 /** 232 * @brief This macro gets USCI_I2C protocol interrupt flag or bus status 233 * 234 * @param[in] ui2c The pointer of the specified USCI_I2C module. 235 * 236 * @return A word data of USCI_I2C_PROTSTS register 237 * 238 * @details Read a word data of USCI_I2C PROTSTS register to get USCI_I2C bus Interrupt flags or status. 239 * \hideinitializer 240 */ 241 #define UI2C_GET_PROT_STATUS(ui2c) ((ui2c)->PROTSTS) 242 243 /** 244 * @brief This macro clears specified protocol interrupt flag 245 * @param[in] ui2c The pointer of the specified USCI_I2C module. 246 * @param[in] u32IntTypeFlag Interrupt Type Flag, should be 247 * - \ref UI2C_PROTSTS_ACKIF_Msk 248 * - \ref UI2C_PROTSTS_ERRIF_Msk 249 * - \ref UI2C_PROTSTS_ARBLOIF_Msk 250 * - \ref UI2C_PROTSTS_NACKIF_Msk 251 * - \ref UI2C_PROTSTS_STORIF_Msk 252 * - \ref UI2C_PROTSTS_STARIF_Msk 253 * - \ref UI2C_PROTSTS_TOIF_Msk 254 * @return None 255 * 256 * @details To clear interrupt flag when USCI_I2C occurs interrupt and set interrupt flag. 257 * \hideinitializer 258 */ 259 #define UI2C_CLR_PROT_INT_FLAG(ui2c,u32IntTypeFlag) ((ui2c)->PROTSTS = (u32IntTypeFlag)) 260 261 /** 262 * @brief This macro enables specified protocol interrupt 263 * @param[in] ui2c The pointer of the specified USCI_I2C module. 264 * @param[in] u32IntSel Interrupt Type, should be 265 * - \ref UI2C_PROTIEN_ACKIEN_Msk 266 * - \ref UI2C_PROTIEN_ERRIEN_Msk 267 * - \ref UI2C_PROTIEN_ARBLOIEN_Msk 268 * - \ref UI2C_PROTIEN_NACKIEN_Msk 269 * - \ref UI2C_PROTIEN_STORIEN_Msk 270 * - \ref UI2C_PROTIEN_STARIEN_Msk 271 * - \ref UI2C_PROTIEN_TOIEN_Msk 272 * @return None 273 * 274 * @details Set specified USCI_I2C protocol interrupt bits to enable interrupt function. 275 * \hideinitializer 276 */ 277 #define UI2C_ENABLE_PROT_INT(ui2c, u32IntSel) ((ui2c)->PROTIEN |= (u32IntSel)) 278 279 /** 280 * @brief This macro disables specified protocol interrupt 281 * @param[in] ui2c The pointer of the specified USCI_I2C module. 282 * @param[in] u32IntSel Interrupt Type, should be 283 * - \ref UI2C_PROTIEN_ACKIEN_Msk 284 * - \ref UI2C_PROTIEN_ERRIEN_Msk 285 * - \ref UI2C_PROTIEN_ARBLOIEN_Msk 286 * - \ref UI2C_PROTIEN_NACKIEN_Msk 287 * - \ref UI2C_PROTIEN_STORIEN_Msk 288 * - \ref UI2C_PROTIEN_STARIEN_Msk 289 * - \ref UI2C_PROTIEN_TOIEN_Msk 290 * @return None 291 * 292 * @details Clear specified USCI_I2C protocol interrupt bits to disable interrupt function. 293 * \hideinitializer 294 */ 295 #define UI2C_DISABLE_PROT_INT(ui2c, u32IntSel) ((ui2c)->PROTIEN &= ~ (u32IntSel)) 296 297 298 uint32_t UI2C_Open(UI2C_T *ui2c, uint32_t u32BusClock); 299 void UI2C_Close(UI2C_T *ui2c); 300 void UI2C_ClearTimeoutFlag(UI2C_T *ui2c); 301 void UI2C_Trigger(UI2C_T *ui2c, uint8_t u8Start, uint8_t u8Stop, uint8_t u8Ptrg, uint8_t u8Ack); 302 void UI2C_DisableInt(UI2C_T *ui2c, uint32_t u32Mask); 303 void UI2C_EnableInt(UI2C_T *ui2c, uint32_t u32Mask); 304 uint32_t UI2C_GetBusClockFreq(UI2C_T *ui2c); 305 uint32_t UI2C_SetBusClockFreq(UI2C_T *ui2c, uint32_t u32BusClock); 306 uint32_t UI2C_GetIntFlag(UI2C_T *ui2c, uint32_t u32Mask); 307 void UI2C_ClearIntFlag(UI2C_T* ui2c, uint32_t u32Mask); 308 uint32_t UI2C_GetData(UI2C_T *ui2c); 309 void UI2C_SetData(UI2C_T *ui2c, uint8_t u8Data); 310 void UI2C_SetSlaveAddr(UI2C_T *ui2c, uint8_t u8SlaveNo, uint16_t u16SlaveAddr, uint8_t u8GCMode); 311 void UI2C_SetSlaveAddrMask(UI2C_T *ui2c, uint8_t u8SlaveNo, uint16_t u16SlaveAddrMask); 312 void UI2C_EnableTimeout(UI2C_T *ui2c, uint32_t u32TimeoutCnt); 313 void UI2C_DisableTimeout(UI2C_T *ui2c); 314 void UI2C_EnableWakeup(UI2C_T *ui2c, uint8_t u8WakeupMode); 315 void UI2C_DisableWakeup(UI2C_T *ui2c); 316 uint8_t UI2C_WriteByte(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint8_t data); 317 uint32_t UI2C_WriteMultiBytes(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint8_t *data, uint32_t u32wLen); 318 uint8_t UI2C_WriteByteOneReg(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr, uint8_t data); 319 uint32_t UI2C_WriteMultiBytesOneReg(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr, uint8_t *data, uint32_t u32wLen); 320 uint8_t UI2C_WriteByteTwoRegs(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr, uint8_t data); 321 uint32_t UI2C_WriteMultiBytesTwoRegs(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr, uint8_t *data, uint32_t u32wLen); 322 uint8_t UI2C_ReadByte(UI2C_T *ui2c, uint8_t u8SlaveAddr); 323 uint32_t UI2C_ReadMultiBytes(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint8_t *rdata, uint32_t u32rLen); 324 uint8_t UI2C_ReadByteOneReg(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr); 325 uint32_t UI2C_ReadMultiBytesOneReg(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr, uint8_t *rdata, uint32_t u32rLen); 326 uint8_t UI2C_ReadByteTwoRegs(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr); 327 uint32_t UI2C_ReadMultiBytesTwoRegs(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr, uint8_t *rdata, uint32_t u32rLen); 328 329 /*@}*/ /* end of group USCI_I2C_EXPORTED_FUNCTIONS */ 330 331 /*@}*/ /* end of group USCI_I2C_Driver */ 332 333 /*@}*/ /* end of group Standard_Driver */ 334 335 #ifdef __cplusplus 336 } 337 #endif 338 339 #endif 340