1 /****************************************************************************//**
\r
5 * $Date: 16/07/07 7:50p $
\r
6 * @brief M2351 series USCI I2C(UI2C) driver source file
\r
9 * Copyright (C) 2016 Nuvoton Technology Corp. All rights reserved.
\r
10 *****************************************************************************/
\r
11 #include "NuMicro.h"
\r
13 /** @addtogroup Standard_Driver Standard Driver
\r
17 /** @addtogroup USCI_I2C_Driver USCI_I2C Driver
\r
22 /** @addtogroup USCI_I2C_EXPORTED_FUNCTIONS USCI_I2C Exported Functions
\r
27 * @brief This function makes USCI_I2C module be ready and set the wanted bus clock
\r
29 * @param[in] ui2c The pointer of the specified USCI_I2C module.
\r
30 * @param[in] u32BusClock The target bus speed of USCI_I2C module.
\r
32 * @return Actual USCI_I2C bus clock frequency.
\r
34 * @details Enable USCI_I2C module and configure USCI_I2C module(bus clock, data format).
\r
36 uint32_t UI2C_Open(UI2C_T *ui2c, uint32_t u32BusClock)
\r
41 if((ui2c == UI2C1) || (ui2c == UI2C1_NS))
\r
43 u32Pclk = CLK_GetPCLK1Freq();
\r
47 u32Pclk = CLK_GetPCLK0Freq();
\r
50 u32ClkDiv = (uint32_t)((((((u32Pclk / 2u) * 10u) / (u32BusClock)) + 5u) / 10u) - 1u); /* Compute proper divider for USCI_I2C clock */
\r
52 /* Enable USCI_I2C protocol */
\r
53 ui2c->CTL &= ~UI2C_CTL_FUNMODE_Msk;
\r
54 ui2c->CTL = 4u << UI2C_CTL_FUNMODE_Pos;
\r
56 /* Data format configuration */
\r
57 /* 8 bit data length */
\r
58 ui2c->LINECTL &= ~UI2C_LINECTL_DWIDTH_Msk;
\r
59 ui2c->LINECTL |= 8u << UI2C_LINECTL_DWIDTH_Pos;
\r
61 /* MSB data format */
\r
62 ui2c->LINECTL &= ~UI2C_LINECTL_LSB_Msk;
\r
64 /* Set USCI_I2C bus clock */
\r
65 ui2c->BRGEN &= ~UI2C_BRGEN_CLKDIV_Msk;
\r
66 ui2c->BRGEN |= (u32ClkDiv << UI2C_BRGEN_CLKDIV_Pos);
\r
67 ui2c->PROTCTL |= UI2C_PROTCTL_PROTEN_Msk;
\r
69 return (u32Pclk / ((u32ClkDiv + 1u) << 1u));
\r
73 * @brief This function closes the USCI_I2C module
\r
75 * @param[in] ui2c The pointer of the specified USCI_I2C module.
\r
79 * @details Close USCI_I2C protocol function.
\r
81 void UI2C_Close(UI2C_T *ui2c)
\r
83 /* Disable USCI_I2C function */
\r
84 ui2c->CTL &= ~UI2C_CTL_FUNMODE_Msk;
\r
88 * @brief This function clears the time-out flag
\r
90 * @param[in] ui2c The pointer of the specified USCI_I2C module.
\r
94 * @details Clear time-out flag when time-out flag is set.
\r
96 void UI2C_ClearTimeoutFlag(UI2C_T *ui2c)
\r
98 ui2c->PROTSTS = UI2C_PROTSTS_TOIF_Msk;
\r
102 * @brief This function sets the control bit of the USCI_I2C module.
\r
104 * @param[in] ui2c The pointer of the specified USCI_I2C module.
\r
105 * @param[in] u8Start Set START bit to USCI_I2C module.
\r
106 * @param[in] u8Stop Set STOP bit to USCI_I2C module.
\r
107 * @param[in] u8Ptrg Set PTRG bit to USCI_I2C module.
\r
108 * @param[in] u8Ack Set ACK bit to USCI_I2C module.
\r
112 * @details The function set USCI_I2C control bit of USCI_I2C bus protocol.
\r
114 void UI2C_Trigger(UI2C_T *ui2c, uint8_t u8Start, uint8_t u8Stop, uint8_t u8Ptrg, uint8_t u8Ack)
\r
116 uint32_t u32Reg = 0u;
\r
117 uint32_t u32Val = ui2c->PROTCTL & ~(UI2C_PROTCTL_STA_Msk | UI2C_PROTCTL_STO_Msk | UI2C_PROTCTL_AA_Msk);
\r
121 u32Reg |= UI2C_PROTCTL_STA_Msk;
\r
125 u32Reg |= UI2C_PROTCTL_STO_Msk;
\r
129 u32Reg |= UI2C_PROTCTL_PTRG_Msk;
\r
133 u32Reg |= UI2C_PROTCTL_AA_Msk;
\r
135 ui2c->PROTCTL = u32Val | u32Reg;
\r
139 * @brief This function disables the interrupt of USCI_I2C module
\r
141 * @param[in] ui2c The pointer of the specified USCI_I2C module.
\r
142 * @param[in] u32Mask The combination of all related interrupt enable bits.
\r
143 * Each bit corresponds to an interrupt enable bit.
\r
144 * This parameter decides which interrupts will be disabled. It is combination of:
\r
145 * - \ref UI2C_TO_INT_MASK
\r
146 * - \ref UI2C_STAR_INT_MASK
\r
147 * - \ref UI2C_STOR_INT_MASK
\r
148 * - \ref UI2C_NACK_INT_MASK
\r
149 * - \ref UI2C_ARBLO_INT_MASK
\r
150 * - \ref UI2C_ERR_INT_MASK
\r
151 * - \ref UI2C_ACK_INT_MASK
\r
155 * @details The function is used to disable USCI_I2C bus interrupt events.
\r
157 void UI2C_DisableInt(UI2C_T *ui2c, uint32_t u32Mask)
\r
159 /* Disable time-out interrupt flag */
\r
160 if((u32Mask & UI2C_TO_INT_MASK) == UI2C_TO_INT_MASK)
\r
162 ui2c->PROTIEN &= ~UI2C_PROTIEN_TOIEN_Msk;
\r
164 /* Disable start condition received interrupt flag */
\r
165 if((u32Mask & UI2C_STAR_INT_MASK) == UI2C_STAR_INT_MASK)
\r
167 ui2c->PROTIEN &= ~UI2C_PROTIEN_STARIEN_Msk;
\r
169 /* Disable stop condition received interrupt flag */
\r
170 if((u32Mask & UI2C_STOR_INT_MASK) == UI2C_STOR_INT_MASK)
\r
172 ui2c->PROTIEN &= ~UI2C_PROTIEN_STORIEN_Msk;
\r
174 /* Disable non-acknowledge interrupt flag */
\r
175 if((u32Mask & UI2C_NACK_INT_MASK) == UI2C_NACK_INT_MASK)
\r
177 ui2c->PROTIEN &= ~UI2C_PROTIEN_NACKIEN_Msk;
\r
179 /* Disable arbitration lost interrupt flag */
\r
180 if((u32Mask & UI2C_ARBLO_INT_MASK) == UI2C_ARBLO_INT_MASK)
\r
182 ui2c->PROTIEN &= ~UI2C_PROTIEN_ARBLOIEN_Msk;
\r
185 /* Disable error interrupt flag */
\r
186 if((u32Mask & UI2C_ERR_INT_MASK) == UI2C_ERR_INT_MASK)
\r
188 ui2c->PROTIEN &= ~UI2C_PROTIEN_ERRIEN_Msk;
\r
190 /* Disable acknowledge interrupt flag */
\r
191 if((u32Mask & UI2C_ACK_INT_MASK) == UI2C_ACK_INT_MASK)
\r
193 ui2c->PROTIEN &= ~UI2C_PROTIEN_ACKIEN_Msk;
\r
198 * @brief This function enables the interrupt of USCI_I2C module.
\r
199 * @param[in] ui2c The pointer of the specified USCI_I2C module.
\r
200 * @param[in] u32Mask The combination of all related interrupt enable bits.
\r
201 * Each bit corresponds to a interrupt enable bit.
\r
202 * This parameter decides which interrupts will be enabled. It is combination of:
\r
203 * - \ref UI2C_TO_INT_MASK
\r
204 * - \ref UI2C_STAR_INT_MASK
\r
205 * - \ref UI2C_STOR_INT_MASK
\r
206 * - \ref UI2C_NACK_INT_MASK
\r
207 * - \ref UI2C_ARBLO_INT_MASK
\r
208 * - \ref UI2C_ERR_INT_MASK
\r
209 * - \ref UI2C_ACK_INT_MASK
\r
212 * @details The function is used to enable USCI_I2C bus interrupt events.
\r
214 void UI2C_EnableInt(UI2C_T *ui2c, uint32_t u32Mask)
\r
216 /* Enable time-out interrupt flag */
\r
217 if((u32Mask & UI2C_TO_INT_MASK) == UI2C_TO_INT_MASK)
\r
219 ui2c->PROTIEN |= UI2C_PROTIEN_TOIEN_Msk;
\r
221 /* Enable start condition received interrupt flag */
\r
222 if((u32Mask & UI2C_STAR_INT_MASK) == UI2C_STAR_INT_MASK)
\r
224 ui2c->PROTIEN |= UI2C_PROTIEN_STARIEN_Msk;
\r
226 /* Enable stop condition received interrupt flag */
\r
227 if((u32Mask & UI2C_STOR_INT_MASK) == UI2C_STOR_INT_MASK)
\r
229 ui2c->PROTIEN |= UI2C_PROTIEN_STORIEN_Msk;
\r
231 /* Enable non-acknowledge interrupt flag */
\r
232 if((u32Mask & UI2C_NACK_INT_MASK) == UI2C_NACK_INT_MASK)
\r
234 ui2c->PROTIEN |= UI2C_PROTIEN_NACKIEN_Msk;
\r
236 /* Enable arbitration lost interrupt flag */
\r
237 if((u32Mask & UI2C_ARBLO_INT_MASK) == UI2C_ARBLO_INT_MASK)
\r
239 ui2c->PROTIEN |= UI2C_PROTIEN_ARBLOIEN_Msk;
\r
241 /* Enable error interrupt flag */
\r
242 if((u32Mask & UI2C_ERR_INT_MASK) == UI2C_ERR_INT_MASK)
\r
244 ui2c->PROTIEN |= UI2C_PROTIEN_ERRIEN_Msk;
\r
246 /* Enable acknowledge interrupt flag */
\r
247 if((u32Mask & UI2C_ACK_INT_MASK) == UI2C_ACK_INT_MASK)
\r
249 ui2c->PROTIEN |= UI2C_PROTIEN_ACKIEN_Msk;
\r
254 * @brief This function returns the real bus clock of USCI_I2C module
\r
256 * @param[in] ui2c The pointer of the specified USCI_I2C module.
\r
258 * @return Actual USCI_I2C bus clock frequency.
\r
260 * @details The function returns the actual USCI_I2C module bus clock.
\r
262 uint32_t UI2C_GetBusClockFreq(UI2C_T *ui2c)
\r
264 uint32_t u32Divider;
\r
267 if((ui2c == UI2C1) || (ui2c == UI2C1_NS))
\r
269 u32Pclk = CLK_GetPCLK1Freq();
\r
273 u32Pclk = CLK_GetPCLK0Freq();
\r
275 u32Divider = (ui2c->BRGEN & UI2C_BRGEN_CLKDIV_Msk) >> UI2C_BRGEN_CLKDIV_Pos;
\r
277 return (u32Pclk / ((u32Divider + 1u) << 1u));
\r
281 * @brief This function sets bus clock frequency of USCI_I2C module
\r
283 * @param[in] ui2c The pointer of the specified USCI_I2C module.
\r
284 * @param[in] u32BusClock The target bus speed of USCI_I2C module.
\r
286 * @return Actual USCI_I2C bus clock frequency.
\r
288 * @details Use this function set USCI_I2C bus clock frequency and return actual bus clock.
\r
290 uint32_t UI2C_SetBusClockFreq(UI2C_T *ui2c, uint32_t u32BusClock)
\r
292 uint32_t u32ClkDiv;
\r
295 if((ui2c == UI2C1) || (ui2c == UI2C1_NS))
\r
297 u32Pclk = CLK_GetPCLK1Freq();
\r
301 u32Pclk = CLK_GetPCLK0Freq();
\r
303 u32ClkDiv = (uint32_t)((((((u32Pclk / 2u) * 10u) / (u32BusClock)) + 5u) / 10u) - 1u); /* Compute proper divider for USCI_I2C clock */
\r
305 /* Set USCI_I2C bus clock */
\r
306 ui2c->BRGEN &= ~UI2C_BRGEN_CLKDIV_Msk;
\r
307 ui2c->BRGEN |= (u32ClkDiv << UI2C_BRGEN_CLKDIV_Pos);
\r
309 return (u32Pclk / ((u32ClkDiv + 1u) << 1u));
\r
313 * @brief This function gets the interrupt flag of USCI_I2C module
\r
315 * @param[in] ui2c The pointer of the specified USCI_I2C module.
\r
316 * @param[in] u32Mask The combination of all related interrupt sources.
\r
317 * Each bit corresponds to a interrupt source.
\r
318 * This parameter decides which interrupt flags will be read. It is combination of:
\r
319 * - \ref UI2C_TO_INT_MASK
\r
320 * - \ref UI2C_STAR_INT_MASK
\r
321 * - \ref UI2C_STOR_INT_MASK
\r
322 * - \ref UI2C_NACK_INT_MASK
\r
323 * - \ref UI2C_ARBLO_INT_MASK
\r
324 * - \ref UI2C_ERR_INT_MASK
\r
325 * - \ref UI2C_ACK_INT_MASK
\r
327 * @return Interrupt flags of selected sources.
\r
329 * @details Use this function to get USCI_I2C interrupt flag when module occurs interrupt event.
\r
331 uint32_t UI2C_GetIntFlag(UI2C_T *ui2c, uint32_t u32Mask)
\r
333 uint32_t u32IntFlag = 0U;
\r
334 uint32_t u32TmpValue;
\r
336 u32TmpValue = ui2c->PROTSTS & UI2C_PROTSTS_TOIF_Msk;
\r
337 /* Check Time-out Interrupt Flag */
\r
338 if((u32Mask & UI2C_TO_INT_MASK) && (u32TmpValue))
\r
340 u32IntFlag |= UI2C_TO_INT_MASK;
\r
343 u32TmpValue = ui2c->PROTSTS & UI2C_PROTSTS_STARIF_Msk;
\r
344 /* Check Start Condition Received Interrupt Flag */
\r
345 if((u32Mask & UI2C_STAR_INT_MASK) && (u32TmpValue))
\r
347 u32IntFlag |= UI2C_STAR_INT_MASK;
\r
350 u32TmpValue = ui2c->PROTSTS & UI2C_PROTSTS_STORIF_Msk;
\r
351 /* Check Stop Condition Received Interrupt Flag */
\r
352 if((u32Mask & UI2C_STOR_INT_MASK) && (u32TmpValue))
\r
354 u32IntFlag |= UI2C_STOR_INT_MASK;
\r
357 u32TmpValue = ui2c->PROTSTS & UI2C_PROTSTS_NACKIF_Msk;
\r
358 /* Check Non-Acknowledge Interrupt Flag */
\r
359 if((u32Mask & UI2C_NACK_INT_MASK) && (u32TmpValue))
\r
361 u32IntFlag |= UI2C_NACK_INT_MASK;
\r
364 u32TmpValue = ui2c->PROTSTS & UI2C_PROTSTS_ARBLOIF_Msk;
\r
365 /* Check Arbitration Lost Interrupt Flag */
\r
366 if((u32Mask & UI2C_ARBLO_INT_MASK) && (u32TmpValue))
\r
368 u32IntFlag |= UI2C_ARBLO_INT_MASK;
\r
371 u32TmpValue = ui2c->PROTSTS & UI2C_PROTSTS_ERRIF_Msk;
\r
372 /* Check Error Interrupt Flag */
\r
373 if((u32Mask & UI2C_ERR_INT_MASK) && (u32TmpValue))
\r
375 u32IntFlag |= UI2C_ERR_INT_MASK;
\r
378 u32TmpValue = ui2c->PROTSTS & UI2C_PROTSTS_ACKIF_Msk;
\r
379 /* Check Acknowledge Interrupt Flag */
\r
380 if((u32Mask & UI2C_ACK_INT_MASK) && (u32TmpValue))
\r
382 u32IntFlag |= UI2C_ACK_INT_MASK;
\r
389 * @brief This function clears the interrupt flag of USCI_I2C module.
\r
390 * @param[in] ui2c The pointer of the specified USCI_I2C module.
\r
391 * @param[in] u32Mask The combination of all related interrupt sources.
\r
392 * Each bit corresponds to a interrupt source.
\r
393 * This parameter decides which interrupt flags will be cleared. It is combination of:
\r
394 * - \ref UI2C_TO_INT_MASK
\r
395 * - \ref UI2C_STAR_INT_MASK
\r
396 * - \ref UI2C_STOR_INT_MASK
\r
397 * - \ref UI2C_NACK_INT_MASK
\r
398 * - \ref UI2C_ARBLO_INT_MASK
\r
399 * - \ref UI2C_ERR_INT_MASK
\r
400 * - \ref UI2C_ACK_INT_MASK
\r
404 * @details Use this function to clear USCI_I2C interrupt flag when module occurs interrupt event and set flag.
\r
406 void UI2C_ClearIntFlag(UI2C_T *ui2c, uint32_t u32Mask)
\r
408 /* Clear Time-out Interrupt Flag */
\r
409 if(u32Mask & UI2C_TO_INT_MASK)
\r
411 ui2c->PROTSTS = UI2C_PROTSTS_TOIF_Msk;
\r
413 /* Clear Start Condition Received Interrupt Flag */
\r
414 if(u32Mask & UI2C_STAR_INT_MASK)
\r
416 ui2c->PROTSTS = UI2C_PROTSTS_STARIF_Msk;
\r
418 /* Clear Stop Condition Received Interrupt Flag */
\r
419 if(u32Mask & UI2C_STOR_INT_MASK)
\r
421 ui2c->PROTSTS = UI2C_PROTSTS_STORIF_Msk;
\r
423 /* Clear Non-Acknowledge Interrupt Flag */
\r
424 if(u32Mask & UI2C_NACK_INT_MASK)
\r
426 ui2c->PROTSTS = UI2C_PROTSTS_NACKIF_Msk;
\r
428 /* Clear Arbitration Lost Interrupt Flag */
\r
429 if(u32Mask & UI2C_ARBLO_INT_MASK)
\r
431 ui2c->PROTSTS = UI2C_PROTSTS_ARBLOIF_Msk;
\r
433 /* Clear Error Interrupt Flag */
\r
434 if(u32Mask & UI2C_ERR_INT_MASK)
\r
436 ui2c->PROTSTS = UI2C_PROTSTS_ERRIF_Msk;
\r
438 /* Clear Acknowledge Interrupt Flag */
\r
439 if(u32Mask & UI2C_ACK_INT_MASK)
\r
441 ui2c->PROTSTS = UI2C_PROTSTS_ACKIF_Msk;
\r
446 * @brief This function returns the data stored in data register of USCI_I2C module.
\r
448 * @param[in] ui2c The pointer of the specified USCI_I2C module.
\r
450 * @return USCI_I2C data.
\r
452 * @details To read a byte data from USCI_I2C module receive data register.
\r
454 uint32_t UI2C_GetData(UI2C_T *ui2c)
\r
456 return (ui2c->RXDAT);
\r
460 * @brief This function writes a byte data to data register of USCI_I2C module
\r
462 * @param[in] ui2c The pointer of the specified USCI_I2C module.
\r
463 * @param[in] u8Data The data which will be written to data register of USCI_I2C module.
\r
467 * @details To write a byte data to transmit data register to transmit data.
\r
469 void UI2C_SetData(UI2C_T *ui2c, uint8_t u8Data)
\r
471 ui2c->TXDAT = u8Data;
\r
475 * @brief Configure slave address and enable GC mode
\r
477 * @param[in] ui2c The pointer of the specified USCI_I2C module.
\r
478 * @param[in] u8SlaveNo Slave channel number [0/1]
\r
479 * @param[in] u16SlaveAddr The slave address.
\r
480 * @param[in] u8GCMode GC mode enable or not. Valid values are:
\r
481 * - \ref UI2C_GCMODE_ENABLE
\r
482 * - \ref UI2C_GCMODE_DISABLE
\r
486 * @details To configure USCI_I2C module slave address and GC mode.
\r
488 void UI2C_SetSlaveAddr(UI2C_T *ui2c, uint8_t u8SlaveNo, uint16_t u16SlaveAddr, uint8_t u8GCMode)
\r
492 ui2c->DEVADDR1 = u16SlaveAddr;
\r
496 ui2c->DEVADDR0 = u16SlaveAddr;
\r
498 ui2c->PROTCTL = (ui2c->PROTCTL & ~UI2C_PROTCTL_GCFUNC_Msk) | u8GCMode;
\r
502 * @brief Configure the mask bit of slave address.
\r
504 * @param[in] ui2c The pointer of the specified USCI_I2C module.
\r
505 * @param[in] u8SlaveNo Slave channle number [0/1]
\r
506 * @param[in] u16SlaveAddrMask The slave address mask.
\r
510 * @details To configure USCI_I2C module slave address mask bit.
\r
511 * @note The corresponding address bit is "Don't Care".
\r
513 void UI2C_SetSlaveAddrMask(UI2C_T *ui2c, uint8_t u8SlaveNo, uint16_t u16SlaveAddrMask)
\r
517 ui2c->ADDRMSK1 = u16SlaveAddrMask;
\r
521 ui2c->ADDRMSK0 = u16SlaveAddrMask;
\r
526 * @brief This function enables time-out function and configures timeout counter
\r
528 * @param[in] ui2c The pointer of the specified USCI_I2C module.
\r
529 * @param[in] u32TimeoutCnt Timeout counter. Valid values are between 0~0x3FF.
\r
533 * @details To enable USCI_I2C bus time-out function and set time-out counter.
\r
535 void UI2C_EnableTimeout(UI2C_T *ui2c, uint32_t u32TimeoutCnt)
\r
537 ui2c->PROTCTL = (ui2c->PROTCTL & ~UI2C_PROTCTL_TOCNT_Msk) | (u32TimeoutCnt << UI2C_PROTCTL_TOCNT_Pos);
\r
538 ui2c->BRGEN = (ui2c->BRGEN & ~UI2C_BRGEN_TMCNTSRC_Msk) | UI2C_BRGEN_TMCNTEN_Msk;
\r
542 * @brief This function disables time-out function
\r
544 * @param[in] ui2c The pointer of the specified USCI_I2C module.
\r
548 * @details To disable USCI_I2C bus time-out function.
\r
550 void UI2C_DisableTimeout(UI2C_T *ui2c)
\r
552 ui2c->PROTCTL &= ~UI2C_PROTCTL_TOCNT_Msk;
\r
553 ui2c->BRGEN &= ~UI2C_BRGEN_TMCNTEN_Msk;
\r
557 * @brief This function enables the wakeup function of USCI_I2C module
\r
559 * @param[in] ui2c The pointer of the specified USCI_I2C module.
\r
560 * @param[in] u8WakeupMode The wake-up mode selection. Valid values are:
\r
561 * - \ref UI2C_DATA_TOGGLE_WK
\r
562 * - \ref UI2C_ADDR_MATCH_WK
\r
566 * @details To enable USCI_I2C module wake-up function.
\r
568 void UI2C_EnableWakeup(UI2C_T *ui2c, uint8_t u8WakeupMode)
\r
570 ui2c->WKCTL = (ui2c->WKCTL & ~UI2C_WKCTL_WKADDREN_Msk) | (u8WakeupMode | UI2C_WKCTL_WKEN_Msk);
\r
574 * @brief This function disables the wakeup function of USCI_I2C module
\r
576 * @param[in] ui2c The pointer of the specified USCI_I2C module.
\r
580 * @details To disable USCI_I2C module wake-up function.
\r
582 void UI2C_DisableWakeup(UI2C_T *ui2c)
\r
584 ui2c->WKCTL &= ~UI2C_WKCTL_WKEN_Msk;
\r
588 * @brief Write a byte to Slave
\r
590 * @param[in] *ui2c The pointer of the specified USCI_I2C module.
\r
591 * @param[in] u8SlaveAddr Access Slave address(7-bit)
\r
592 * @param[in] data Write a byte data to Slave
\r
594 * @retval 0 Write data success
\r
595 * @retval 1 Write data fail, or bus occurs error events
\r
597 * @details The function is used for USCI_I2C Master write a byte data to Slave.
\r
601 uint8_t UI2C_WriteByte(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint8_t data)
\r
603 uint8_t u8Xfering = 1U, u8Err = 0U, u8Ctrl = 0U;
\r
604 enum UI2C_MASTER_EVENT eEvent = MASTER_SEND_START;
\r
606 UI2C_START(ui2c); /* Send START */
\r
610 while(!(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)); /* Wait UI2C new status occur */
\r
612 switch(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)
\r
614 case UI2C_PROTSTS_STARIF_Msk:
\r
615 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STARIF_Msk); /* Clear START INT Flag */
\r
616 UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x00U); /* Write SLA+W to Register UI2C_TXDAT */
\r
617 eEvent = MASTER_SEND_ADDRESS;
\r
618 u8Ctrl = UI2C_CTL_PTRG; /* Clear SI */
\r
621 case UI2C_PROTSTS_ACKIF_Msk:
\r
622 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_ACKIF_Msk); /* Clear ACK INT Flag */
\r
624 if(eEvent == MASTER_SEND_ADDRESS)
\r
626 UI2C_SET_DATA(ui2c, data); /* Write data to UI2C_TXDAT */
\r
627 eEvent = MASTER_SEND_DATA;
\r
631 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
636 case UI2C_PROTSTS_NACKIF_Msk:
\r
637 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_NACKIF_Msk); /* Clear NACK INT Flag */
\r
638 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
642 case UI2C_PROTSTS_STORIF_Msk:
\r
643 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STORIF_Msk); /* Clear STOP INT Flag */
\r
644 u8Ctrl = UI2C_CTL_PTRG; /* Clear SI */
\r
648 case UI2C_PROTSTS_ARBLOIF_Msk: /* Arbitration Lost */
\r
649 default: /* Unknow status */
\r
650 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
655 UI2C_SET_CONTROL_REG(ui2c, u8Ctrl); /* Write controlbit to UI2C_PROTCTL register */
\r
658 return (u8Err | u8Xfering); /* return (Success)/(Fail) status */
\r
662 * @brief Write multi bytes to Slave
\r
664 * @param[in] *ui2c The pointer of the specified USCI_I2C module.
\r
665 * @param[in] u8SlaveAddr Access Slave address(7-bit)
\r
666 * @param[in] *data Pointer to array to write data to Slave
\r
667 * @param[in] u32wLen How many bytes need to write to Slave
\r
669 * @return A length of how many bytes have been transmitted.
\r
671 * @details The function is used for USCI_I2C Master write multi bytes data to Slave.
\r
675 uint32_t UI2C_WriteMultiBytes(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint8_t *data, uint32_t u32wLen)
\r
677 uint8_t u8Xfering = 1U, u8Ctrl = 0U;
\r
678 uint32_t u32txLen = 0U;
\r
680 UI2C_START(ui2c); /* Send START */
\r
684 while(!(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)); /* Wait UI2C new status occur */
\r
686 switch(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)
\r
688 case UI2C_PROTSTS_STARIF_Msk:
\r
689 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STARIF_Msk); /* Clear START INT Flag */
\r
690 UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x00U); /* Write SLA+W to Register UI2C_TXDAT */
\r
691 u8Ctrl = UI2C_CTL_PTRG; /* Clear SI */
\r
694 case UI2C_PROTSTS_ACKIF_Msk:
\r
695 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_ACKIF_Msk); /* Clear ACK INT Flag */
\r
697 if(u32txLen < u32wLen)
\r
698 UI2C_SET_DATA(ui2c, data[u32txLen++]); /* Write data to UI2C_TXDAT */
\r
701 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
706 case UI2C_PROTSTS_NACKIF_Msk:
\r
707 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_NACKIF_Msk); /* Clear NACK INT Flag */
\r
708 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
711 case UI2C_PROTSTS_STORIF_Msk:
\r
712 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STORIF_Msk); /* Clear STOP INT Flag */
\r
713 u8Ctrl = UI2C_CTL_PTRG; /* Clear SI */
\r
717 case UI2C_PROTSTS_ARBLOIF_Msk: /* Arbitration Lost */
\r
718 default: /* Unknow status */
\r
719 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
723 UI2C_SET_CONTROL_REG(ui2c, u8Ctrl); /* Write controlbit to UI2C_CTL register */
\r
726 return u32txLen; /* Return bytes length that have been transmitted */
\r
730 * @brief Specify a byte register address and write a byte to Slave
\r
732 * @param[in] *ui2c The pointer of the specified USCI_I2C module.
\r
733 * @param[in] u8SlaveAddr Access Slave address(7-bit)
\r
734 * @param[in] u8DataAddr Specify a address (1 byte) of data write to
\r
735 * @param[in] data A byte data to write it to Slave
\r
737 * @retval 0 Write data success
\r
738 * @retval 1 Write data fail, or bus occurs error events
\r
740 * @details The function is used for USCI_I2C Master specify a address that data write to in Slave.
\r
744 uint8_t UI2C_WriteByteOneReg(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr, uint8_t data)
\r
746 uint8_t u8Xfering = 1U, u8Err = 0U, u8Ctrl = 0U;
\r
747 uint32_t u32txLen = 0U;
\r
749 UI2C_START(ui2c); /* Send START */
\r
753 while(!(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)); /* Wait UI2C new status occur */
\r
755 switch(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)
\r
757 case UI2C_PROTSTS_STARIF_Msk:
\r
758 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STARIF_Msk); /* Clear START INT Flag */
\r
759 UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x00U); /* Write SLA+W to Register UI2C_TXDAT */
\r
760 u8Ctrl = UI2C_CTL_PTRG; /* Clear SI */
\r
763 case UI2C_PROTSTS_ACKIF_Msk:
\r
764 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_ACKIF_Msk); /* Clear ACK INT Flag */
\r
768 UI2C_SET_DATA(ui2c, u8DataAddr); /* Write data address to UI2C_TXDAT */
\r
771 else if(u32txLen == 1U)
\r
773 UI2C_SET_DATA(ui2c, data); /* Write data to UI2C_TXDAT */
\r
778 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
783 case UI2C_PROTSTS_NACKIF_Msk:
\r
784 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_NACKIF_Msk); /* Clear NACK INT Flag */
\r
785 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
789 case UI2C_PROTSTS_STORIF_Msk:
\r
790 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STORIF_Msk); /* Clear STOP INT Flag */
\r
791 u8Ctrl = UI2C_CTL_PTRG; /* Clear SI */
\r
795 case UI2C_PROTSTS_ARBLOIF_Msk: /* Arbitration Lost */
\r
796 default: /* Unknow status */
\r
797 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
802 UI2C_SET_CONTROL_REG(ui2c, u8Ctrl); /* Write controlbit to UI2C_CTL register */
\r
805 return (u8Err | u8Xfering); /* return (Success)/(Fail) status */
\r
810 * @brief Specify a byte register address and write multi bytes to Slave
\r
812 * @param[in] *ui2c The pointer of the specified USCI_I2C module.
\r
813 * @param[in] u8SlaveAddr Access Slave address(7-bit)
\r
814 * @param[in] u8DataAddr Specify a address (1 byte) of data write to
\r
815 * @param[in] *data Pointer to array to write data to Slave
\r
816 * @param[in] u32wLen How many bytes need to write to Slave
\r
818 * @return A length of how many bytes have been transmitted.
\r
820 * @details The function is used for USCI_I2C Master specify a byte address that multi data bytes write to in Slave.
\r
824 uint32_t UI2C_WriteMultiBytesOneReg(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr, uint8_t *data, uint32_t u32wLen)
\r
826 uint8_t u8Xfering = 1U, u8Ctrl = 0U;
\r
827 uint32_t u32txLen = 0U;
\r
828 enum UI2C_MASTER_EVENT eEvent = MASTER_SEND_START;
\r
830 UI2C_START(ui2c); /* Send START */
\r
834 while(!(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)); /* Wait UI2C new status occur */
\r
836 switch(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)
\r
838 case UI2C_PROTSTS_STARIF_Msk:
\r
839 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STARIF_Msk); /* Clear START INT Flag */
\r
840 UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x00U); /* Write SLA+W to Register UI2C_TXDAT */
\r
841 eEvent = MASTER_SEND_ADDRESS;
\r
842 u8Ctrl = UI2C_CTL_PTRG; /* Clear SI */
\r
845 case UI2C_PROTSTS_ACKIF_Msk:
\r
846 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_ACKIF_Msk); /* Clear ACK INT Flag */
\r
848 if(eEvent == MASTER_SEND_ADDRESS)
\r
850 UI2C_SET_DATA(ui2c, u8DataAddr); /* Write data address to UI2C_TXDAT */
\r
851 eEvent = MASTER_SEND_DATA;
\r
855 if(u32txLen < u32wLen)
\r
856 UI2C_SET_DATA(ui2c, data[u32txLen++]); /* Write data to UI2C_TXDAT */
\r
859 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
865 case UI2C_PROTSTS_NACKIF_Msk:
\r
866 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_NACKIF_Msk); /* Clear NACK INT Flag */
\r
867 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
870 case UI2C_PROTSTS_STORIF_Msk:
\r
871 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STORIF_Msk); /* Clear STOP INT Flag */
\r
872 u8Ctrl = UI2C_CTL_PTRG; /* Clear SI */
\r
876 case UI2C_PROTSTS_ARBLOIF_Msk: /* Arbitration Lost */
\r
877 default: /* Unknow status */
\r
878 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
882 UI2C_SET_CONTROL_REG(ui2c, u8Ctrl); /* Write controlbit to UI2C_CTL register */
\r
885 return u32txLen; /* Return bytes length that have been transmitted */
\r
889 * @brief Specify two bytes register address and Write a byte to Slave
\r
891 * @param[in] *ui2c The pointer of the specified USCI_I2C module.
\r
892 * @param[in] u8SlaveAddr Access Slave address(7-bit)
\r
893 * @param[in] u16DataAddr Specify a address (2 byte) of data write to
\r
894 * @param[in] data Write a byte data to Slave
\r
896 * @retval 0 Write data success
\r
897 * @retval 1 Write data fail, or bus occurs error events
\r
899 * @details The function is used for USCI_I2C Master specify two bytes address that data write to in Slave.
\r
903 uint8_t UI2C_WriteByteTwoRegs(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr, uint8_t data)
\r
905 uint8_t u8Xfering = 1U, u8Err = 0U, u8Ctrl = 0U;
\r
906 uint32_t u32txLen = 0U;
\r
908 UI2C_START(ui2c); /* Send START */
\r
912 while(!(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)); /* Wait UI2C new status occur */
\r
914 switch(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)
\r
916 case UI2C_PROTSTS_STARIF_Msk:
\r
917 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STARIF_Msk); /* Clear START INT Flag */
\r
918 UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x00U); /* Write SLA+W to Register UI2C_TXDAT */
\r
919 u8Ctrl = UI2C_CTL_PTRG; /* Clear SI */
\r
922 case UI2C_PROTSTS_ACKIF_Msk:
\r
923 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_ACKIF_Msk); /* Clear ACK INT Flag */
\r
927 UI2C_SET_DATA(ui2c, (uint8_t)(u16DataAddr & 0xFF00U) >> 8U); /* Write Hi byte data address to UI2C_TXDAT */
\r
930 else if(u32txLen == 1U)
\r
932 UI2C_SET_DATA(ui2c, (uint8_t)(u16DataAddr & 0xFFU)); /* Write Lo byte data address to UI2C_TXDAT */
\r
935 else if(u32txLen == 2U)
\r
937 UI2C_SET_DATA(ui2c, data); /* Write data to UI2C_TXDAT */
\r
942 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
947 case UI2C_PROTSTS_NACKIF_Msk:
\r
948 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_NACKIF_Msk); /* Clear NACK INT Flag */
\r
949 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
953 case UI2C_PROTSTS_STORIF_Msk:
\r
954 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STORIF_Msk); /* Clear STOP INT Flag */
\r
955 u8Ctrl = UI2C_CTL_PTRG; /* Clear SI */
\r
959 case UI2C_PROTSTS_ARBLOIF_Msk: /* Arbitration Lost */
\r
960 default: /* Unknow status */
\r
961 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
966 UI2C_SET_CONTROL_REG(ui2c, u8Ctrl); /* Write controlbit to UI2C_CTL register */
\r
969 return (u8Err | u8Xfering);
\r
974 * @brief Specify two bytes register address and write multi bytes to Slave
\r
976 * @param[in] *ui2c The pointer of the specified USCI_I2C module.
\r
977 * @param[in] u8SlaveAddr Access Slave address(7-bit)
\r
978 * @param[in] u16DataAddr Specify a address (2 bytes) of data write to
\r
979 * @param[in] *data Pointer to array to write data to Slave
\r
980 * @param[in] u32wLen How many bytes need to write to Slave
\r
982 * @return A length of how many bytes have been transmitted.
\r
984 * @details The function is used for USCI_I2C Master specify a byte address that multi data write to in Slave.
\r
988 uint32_t UI2C_WriteMultiBytesTwoRegs(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr, uint8_t *data, uint32_t u32wLen)
\r
990 uint8_t u8Xfering = 1U, u8Addr = 1U, u8Ctrl = 0U;
\r
991 uint32_t u32txLen = 0U;
\r
992 enum UI2C_MASTER_EVENT eEvent = MASTER_SEND_START;
\r
994 UI2C_START(ui2c); /* Send START */
\r
998 while(!(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)); /* Wait UI2C new status occur */
\r
1000 switch(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)
\r
1002 case UI2C_PROTSTS_STARIF_Msk:
\r
1003 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STARIF_Msk); /* Clear START INT Flag */
\r
1004 UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x00U); /* Write SLA+W to Register UI2C_TXDAT */
\r
1005 eEvent = MASTER_SEND_ADDRESS;
\r
1006 u8Ctrl = UI2C_CTL_PTRG; /* Clear SI */
\r
1009 case UI2C_PROTSTS_ACKIF_Msk:
\r
1010 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_ACKIF_Msk); /* Clear ACK INT Flag */
\r
1012 if(eEvent == MASTER_SEND_ADDRESS)
\r
1014 UI2C_SET_DATA(ui2c, (uint8_t)(u16DataAddr & 0xFF00U) >> 8U); /* Write Hi byte data address to UI2C_TXDAT */
\r
1015 eEvent = MASTER_SEND_DATA;
\r
1017 else if(eEvent == MASTER_SEND_DATA)
\r
1021 UI2C_SET_DATA(ui2c, (uint8_t)(u16DataAddr & 0xFFU)); /* Write Lo byte data address to UI2C_TXDAT */
\r
1026 if(u32txLen < u32wLen)
\r
1028 UI2C_SET_DATA(ui2c, data[u32txLen++]); /* Write data to UI2C_TXDAT */
\r
1032 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
1039 case UI2C_PROTSTS_NACKIF_Msk:
\r
1040 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_NACKIF_Msk); /* Clear NACK INT Flag */
\r
1041 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
1044 case UI2C_PROTSTS_STORIF_Msk:
\r
1045 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STORIF_Msk); /* Clear STOP INT Flag */
\r
1046 u8Ctrl = UI2C_CTL_PTRG; /* Clear SI */
\r
1050 case UI2C_PROTSTS_ARBLOIF_Msk: /* Arbitration Lost */
\r
1051 default: /* Unknow status */
\r
1052 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
1056 UI2C_SET_CONTROL_REG(ui2c, u8Ctrl); /* Write controlbit to UI2C_CTL register */
\r
1059 return u32txLen; /* Return bytes length that have been transmitted */
\r
1063 * @brief Read a byte from Slave
\r
1065 * @param[in] *ui2c The pointer of the specified USCI_I2C module.
\r
1066 * @param[in] u8SlaveAddr Access Slave address(7-bit)
\r
1068 * @return Read a byte data from Slave
\r
1070 * @details The function is used for USCI_I2C Master to read a byte data from Slave.
\r
1073 uint8_t UI2C_ReadByte(UI2C_T *ui2c, uint8_t u8SlaveAddr)
\r
1075 uint8_t u8Xfering = 1U, u8Err = 0U, rdata = 0U, u8Ctrl = 0U;
\r
1076 enum UI2C_MASTER_EVENT eEvent = MASTER_SEND_START;
\r
1078 UI2C_START(ui2c); /* Send START */
\r
1082 while(!(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)); /* Wait UI2C new status occur */
\r
1084 switch(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)
\r
1086 case UI2C_PROTSTS_STARIF_Msk:
\r
1087 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STARIF_Msk); /* Clear START INT Flag */
\r
1088 UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x01U); /* Write SLA+R to Register UI2C_TXDAT */
\r
1089 eEvent = MASTER_SEND_H_RD_ADDRESS;
\r
1090 u8Ctrl = UI2C_CTL_PTRG;
\r
1093 case UI2C_PROTSTS_ACKIF_Msk:
\r
1094 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_ACKIF_Msk); /* Clear ACK INT Flag */
\r
1095 eEvent = MASTER_READ_DATA;
\r
1098 case UI2C_PROTSTS_NACKIF_Msk:
\r
1099 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_NACKIF_Msk); /* Clear NACK INT Flag */
\r
1101 if(eEvent == MASTER_SEND_H_RD_ADDRESS)
\r
1107 rdata = (unsigned char) UI2C_GET_DATA(ui2c); /* Receive Data */
\r
1110 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
1114 case UI2C_PROTSTS_STORIF_Msk:
\r
1115 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STORIF_Msk); /* Clear STOP INT Flag */
\r
1116 u8Ctrl = UI2C_CTL_PTRG; /* Clear SI */
\r
1120 case UI2C_PROTSTS_ARBLOIF_Msk: /* Arbitration Lost */
\r
1121 default: /* Unknow status */
\r
1122 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
1127 UI2C_SET_CONTROL_REG(ui2c, u8Ctrl); /* Write controlbit to UI2C_PROTCTL register */
\r
1133 return rdata; /* Return read data */
\r
1138 * @brief Read multi bytes from Slave
\r
1140 * @param[in] *ui2c The pointer of the specified USCI_I2C module.
\r
1141 * @param[in] u8SlaveAddr Access Slave address(7-bit)
\r
1142 * @param[out] *rdata Point to array to store data from Slave
\r
1143 * @param[in] u32rLen How many bytes need to read from Slave
\r
1145 * @return A length of how many bytes have been received
\r
1147 * @details The function is used for USCI_I2C Master to read multi data bytes from Slave.
\r
1151 uint32_t UI2C_ReadMultiBytes(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint8_t *rdata, uint32_t u32rLen)
\r
1153 uint8_t u8Xfering = 1U, u8Ctrl = 0U;
\r
1154 uint32_t u32rxLen = 0U;
\r
1155 enum UI2C_MASTER_EVENT eEvent = MASTER_SEND_START;
\r
1157 UI2C_START(ui2c); /* Send START */
\r
1161 while(!(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)); /* Wait UI2C new status occur */
\r
1163 switch(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)
\r
1165 case UI2C_PROTSTS_STARIF_Msk:
\r
1166 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STARIF_Msk); /* Clear START INT Flag */
\r
1167 UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x01U); /* Write SLA+R to Register UI2C_TXDAT */
\r
1168 eEvent = MASTER_SEND_H_RD_ADDRESS;
\r
1169 u8Ctrl = UI2C_CTL_PTRG;
\r
1172 case UI2C_PROTSTS_ACKIF_Msk:
\r
1173 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_ACKIF_Msk); /* Clear ACK INT Flag */
\r
1175 if(eEvent == MASTER_SEND_H_RD_ADDRESS)
\r
1177 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_AA);
\r
1178 eEvent = MASTER_READ_DATA;
\r
1182 rdata[u32rxLen++] = (unsigned char) UI2C_GET_DATA(ui2c); /* Receive Data */
\r
1184 if(u32rxLen < (u32rLen - 1U))
\r
1185 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_AA);
\r
1187 u8Ctrl = UI2C_CTL_PTRG;
\r
1192 case UI2C_PROTSTS_NACKIF_Msk:
\r
1193 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_NACKIF_Msk); /* Clear NACK INT Flag */
\r
1195 if(eEvent == MASTER_READ_DATA)
\r
1196 rdata[u32rxLen++] = (unsigned char) UI2C_GET_DATA(ui2c); /* Receive Data */
\r
1198 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
1202 case UI2C_PROTSTS_STORIF_Msk:
\r
1203 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STORIF_Msk); /* Clear STOP INT Flag */
\r
1204 u8Ctrl = UI2C_CTL_PTRG; /* Clear SI */
\r
1208 case UI2C_PROTSTS_ARBLOIF_Msk: /* Arbitration Lost */
\r
1209 default: /* Unknow status */
\r
1210 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
1214 UI2C_SET_CONTROL_REG(ui2c, u8Ctrl); /* Write controlbit to UI2C_PROTCTL register */
\r
1217 return u32rxLen; /* Return bytes length that have been received */
\r
1222 * @brief Specify a byte register address and read a byte from Slave
\r
1224 * @param[in] *ui2c The pointer of the specified USCI_I2C module.
\r
1225 * @param[in] u8SlaveAddr Access Slave address(7-bit)
\r
1226 * @param[in] u8DataAddr Specify a address(1 byte) of data read from
\r
1228 * @return Read a byte data from Slave
\r
1230 * @details The function is used for USCI_I2C Master specify a byte address that a data byte read from Slave.
\r
1234 uint8_t UI2C_ReadByteOneReg(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr)
\r
1236 uint8_t u8Xfering = 1U, u8Err = 0U, rdata = 0U, u8Ctrl = 0U;
\r
1237 enum UI2C_MASTER_EVENT eEvent = MASTER_SEND_START;
\r
1239 UI2C_START(ui2c); /* Send START */
\r
1243 while(!(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)); /* Wait UI2C new status occur */
\r
1245 switch(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)
\r
1247 case UI2C_PROTSTS_STARIF_Msk:
\r
1248 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STARIF_Msk); /* Clear START INT Flag */
\r
1250 if(eEvent == MASTER_SEND_START)
\r
1252 UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x00U); /* Write SLA+W to Register UI2C_TXDAT */
\r
1253 eEvent = MASTER_SEND_ADDRESS;
\r
1255 else if(eEvent == MASTER_SEND_REPEAT_START)
\r
1257 UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x01U); /* Write SLA+R to Register TXDAT */
\r
1258 eEvent = MASTER_SEND_H_RD_ADDRESS;
\r
1261 u8Ctrl = UI2C_CTL_PTRG;
\r
1264 case UI2C_PROTSTS_ACKIF_Msk:
\r
1265 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_ACKIF_Msk); /* Clear ACK INT Flag */
\r
1267 if(eEvent == MASTER_SEND_ADDRESS)
\r
1269 UI2C_SET_DATA(ui2c, u8DataAddr); /* Write data address of register */
\r
1270 u8Ctrl = UI2C_CTL_PTRG;
\r
1271 eEvent = MASTER_SEND_DATA;
\r
1273 else if(eEvent == MASTER_SEND_DATA)
\r
1275 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STA); /* Send repeat START signal */
\r
1276 eEvent = MASTER_SEND_REPEAT_START;
\r
1281 u8Ctrl = UI2C_CTL_PTRG;
\r
1282 eEvent = MASTER_READ_DATA;
\r
1287 case UI2C_PROTSTS_NACKIF_Msk:
\r
1288 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_NACKIF_Msk); /* Clear NACK INT Flag */
\r
1290 if(eEvent == MASTER_READ_DATA)
\r
1292 rdata = (uint8_t) UI2C_GET_DATA(ui2c); /* Receive Data */
\r
1299 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
1303 case UI2C_PROTSTS_STORIF_Msk:
\r
1304 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STORIF_Msk); /* Clear STOP INT Flag */
\r
1305 u8Ctrl = UI2C_CTL_PTRG; /* Clear SI */
\r
1309 case UI2C_PROTSTS_ARBLOIF_Msk: /* Arbitration Lost */
\r
1310 default: /* Unknow status */
\r
1311 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
1316 UI2C_SET_CONTROL_REG(ui2c, u8Ctrl); /* Write controlbit to UI2C_PROTCTL register */
\r
1320 rdata = 0U; /* If occurs error, return 0 */
\r
1322 return rdata; /* Return read data */
\r
1326 * @brief Specify a byte register address and read multi bytes from Slave
\r
1328 * @param[in] *ui2c The pointer of the specified USCI_I2C module.
\r
1329 * @param[in] u8SlaveAddr Access Slave address(7-bit)
\r
1330 * @param[in] u8DataAddr Specify a address (1 bytes) of data read from
\r
1331 * @param[out] *rdata Point to array to store data from Slave
\r
1332 * @param[in] u32rLen How many bytes need to read from Slave
\r
1334 * @return A length of how many bytes have been received
\r
1336 * @details The function is used for USCI_I2C Master specify a byte address that multi data bytes read from Slave.
\r
1340 uint32_t UI2C_ReadMultiBytesOneReg(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr, uint8_t *rdata, uint32_t u32rLen)
\r
1342 uint8_t u8Xfering = 1U, u8Ctrl = 0U;
\r
1343 uint32_t u32rxLen = 0U;
\r
1344 enum UI2C_MASTER_EVENT eEvent = MASTER_SEND_START;
\r
1346 UI2C_START(ui2c); /* Send START */
\r
1350 while(!(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)); /* Wait UI2C new status occur */
\r
1352 switch(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)
\r
1354 case UI2C_PROTSTS_STARIF_Msk:
\r
1355 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STARIF_Msk); /* Clear START INT Flag */
\r
1357 if(eEvent == MASTER_SEND_START)
\r
1359 UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x00U); /* Write SLA+W to Register UI2C_TXDAT */
\r
1360 eEvent = MASTER_SEND_ADDRESS;
\r
1362 else if(eEvent == MASTER_SEND_REPEAT_START)
\r
1364 UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x01U); /* Write SLA+R to Register TXDAT */
\r
1365 eEvent = MASTER_SEND_H_RD_ADDRESS;
\r
1368 u8Ctrl = UI2C_CTL_PTRG;
\r
1371 case UI2C_PROTSTS_ACKIF_Msk:
\r
1372 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_ACKIF_Msk); /* Clear ACK INT Flag */
\r
1374 if(eEvent == MASTER_SEND_ADDRESS)
\r
1376 UI2C_SET_DATA(ui2c, u8DataAddr); /* Write data address of register */
\r
1377 u8Ctrl = UI2C_CTL_PTRG;
\r
1378 eEvent = MASTER_SEND_DATA;
\r
1380 else if(eEvent == MASTER_SEND_DATA)
\r
1382 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STA); /* Send repeat START signal */
\r
1383 eEvent = MASTER_SEND_REPEAT_START;
\r
1385 else if(eEvent == MASTER_SEND_H_RD_ADDRESS)
\r
1388 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_AA);
\r
1389 eEvent = MASTER_READ_DATA;
\r
1393 rdata[u32rxLen++] = (uint8_t) UI2C_GET_DATA(ui2c); /* Receive Data */
\r
1395 if(u32rxLen < u32rLen - 1U)
\r
1396 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_AA);
\r
1398 u8Ctrl = UI2C_CTL_PTRG;
\r
1403 case UI2C_PROTSTS_NACKIF_Msk:
\r
1404 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_NACKIF_Msk); /* Clear NACK INT Flag */
\r
1406 if(eEvent == MASTER_READ_DATA)
\r
1407 rdata[u32rxLen++] = (uint8_t) UI2C_GET_DATA(ui2c); /* Receive Data */
\r
1409 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
1413 case UI2C_PROTSTS_STORIF_Msk:
\r
1414 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STORIF_Msk); /* Clear STOP INT Flag */
\r
1415 u8Ctrl = UI2C_CTL_PTRG; /* Clear SI */
\r
1419 case UI2C_PROTSTS_ARBLOIF_Msk: /* Arbitration Lost */
\r
1420 default: /* Unknow status */
\r
1421 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
1425 UI2C_SET_CONTROL_REG(ui2c, u8Ctrl); /* Write controlbit to UI2C_PROTCTL register */
\r
1428 return u32rxLen; /* Return bytes length that have been received */
\r
1432 * @brief Specify two bytes register address and read a byte from Slave
\r
1434 * @param[in] *ui2c The pointer of the specified USCI_I2C module.
\r
1435 * @param[in] u8SlaveAddr Access Slave address(7-bit)
\r
1436 * @param[in] u16DataAddr Specify a address(2 byte) of data read from
\r
1438 * @return Read a byte data from Slave
\r
1440 * @details The function is used for USCI_I2C Master specify two bytes address that a data byte read from Slave.
\r
1444 uint8_t UI2C_ReadByteTwoRegs(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr)
\r
1446 uint8_t u8Xfering = 1U, u8Err = 0U, rdata = 0U, u8Addr = 1U, u8Ctrl = 0U;
\r
1447 enum UI2C_MASTER_EVENT eEvent = MASTER_SEND_START;
\r
1449 UI2C_START(ui2c); /* Send START */
\r
1453 while(!(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)); /* Wait UI2C new status occur */
\r
1455 switch(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)
\r
1457 case UI2C_PROTSTS_STARIF_Msk:
\r
1458 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STARIF_Msk); /* Clear START INT Flag */
\r
1460 if(eEvent == MASTER_SEND_START)
\r
1462 UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x00U); /* Write SLA+W to Register UI2C_TXDAT */
\r
1463 eEvent = MASTER_SEND_ADDRESS;
\r
1465 else if(eEvent == MASTER_SEND_REPEAT_START)
\r
1467 UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x01U); /* Write SLA+R to Register TXDAT */
\r
1468 eEvent = MASTER_SEND_H_RD_ADDRESS;
\r
1471 u8Ctrl = UI2C_CTL_PTRG;
\r
1474 case UI2C_PROTSTS_ACKIF_Msk:
\r
1475 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_ACKIF_Msk); /* Clear ACK INT Flag */
\r
1477 if(eEvent == MASTER_SEND_ADDRESS)
\r
1479 UI2C_SET_DATA(ui2c, (uint8_t)(u16DataAddr & 0xFF00U) >> 8U); /* Write Hi byte address of register */
\r
1480 eEvent = MASTER_SEND_DATA;
\r
1482 else if(eEvent == MASTER_SEND_DATA)
\r
1486 UI2C_SET_DATA(ui2c, (uint8_t)(u16DataAddr & 0xFFU)); /* Write Lo byte address of register */
\r
1491 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STA); /* Send repeat START signal */
\r
1492 eEvent = MASTER_SEND_REPEAT_START;
\r
1498 u8Ctrl = UI2C_CTL_PTRG;
\r
1499 eEvent = MASTER_READ_DATA;
\r
1504 case UI2C_PROTSTS_NACKIF_Msk:
\r
1505 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_NACKIF_Msk); /* Clear NACK INT Flag */
\r
1507 if(eEvent == MASTER_READ_DATA)
\r
1509 rdata = (uint8_t) UI2C_GET_DATA(ui2c); /* Receive Data */
\r
1516 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
1520 case UI2C_PROTSTS_STORIF_Msk:
\r
1521 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STORIF_Msk); /* Clear STOP INT Flag */
\r
1522 u8Ctrl = UI2C_CTL_PTRG; /* Clear SI */
\r
1526 case UI2C_PROTSTS_ARBLOIF_Msk: /* Arbitration Lost */
\r
1527 default: /* Unknow status */
\r
1528 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
1533 UI2C_SET_CONTROL_REG(ui2c, u8Ctrl); /* Write controlbit to UI2C_PROTCTL register */
\r
1537 rdata = 0U; /* If occurs error, return 0 */
\r
1539 return rdata; /* Return read data */
\r
1543 * @brief Specify two bytes register address and read multi bytes from Slave
\r
1545 * @param[in] *ui2c The pointer of the specified USCI_I2C module.
\r
1546 * @param[in] u8SlaveAddr Access Slave address(7-bit)
\r
1547 * @param[in] u16DataAddr Specify a address (2 bytes) of data read from
\r
1548 * @param[out] *rdata Point to array to store data from Slave
\r
1549 * @param[in] u32rLen How many bytes need to read from Slave
\r
1551 * @return A length of how many bytes have been received
\r
1553 * @details The function is used for USCI_I2C Master specify two bytes address that multi data bytes read from Slave.
\r
1557 uint32_t UI2C_ReadMultiBytesTwoRegs(UI2C_T *ui2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr, uint8_t *rdata, uint32_t u32rLen)
\r
1559 uint8_t u8Xfering = 1U, u8Addr = 1U, u8Ctrl = 0U;
\r
1560 uint32_t u32rxLen = 0U;
\r
1561 enum UI2C_MASTER_EVENT eEvent = MASTER_SEND_START;
\r
1563 UI2C_START(ui2c); /* Send START */
\r
1567 while(!(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)); /* Wait UI2C new status occur */
\r
1569 switch(UI2C_GET_PROT_STATUS(ui2c) & 0x3F00U)
\r
1571 case UI2C_PROTSTS_STARIF_Msk:
\r
1572 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STARIF_Msk); /* Clear START INT Flag */
\r
1574 if(eEvent == MASTER_SEND_START)
\r
1576 UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x00U); /* Write SLA+W to Register UI2C_TXDAT */
\r
1577 eEvent = MASTER_SEND_ADDRESS;
\r
1579 else if(eEvent == MASTER_SEND_REPEAT_START)
\r
1581 UI2C_SET_DATA(ui2c, (u8SlaveAddr << 1U) | 0x01U); /* Write SLA+R to Register TXDAT */
\r
1582 eEvent = MASTER_SEND_H_RD_ADDRESS;
\r
1585 u8Ctrl = UI2C_CTL_PTRG;
\r
1588 case UI2C_PROTSTS_ACKIF_Msk:
\r
1589 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_ACKIF_Msk); /* Clear ACK INT Flag */
\r
1591 if(eEvent == MASTER_SEND_ADDRESS)
\r
1593 UI2C_SET_DATA(ui2c, (uint8_t)(u16DataAddr & 0xFF00U) >> 8U); /* Write Hi byte address of register */
\r
1594 eEvent = MASTER_SEND_DATA;
\r
1596 else if(eEvent == MASTER_SEND_DATA)
\r
1600 UI2C_SET_DATA(ui2c, (uint8_t)(u16DataAddr & 0xFFU)); /* Write Lo byte address of register */
\r
1605 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STA); /* Send repeat START signal */
\r
1606 eEvent = MASTER_SEND_REPEAT_START;
\r
1609 else if(eEvent == MASTER_SEND_H_RD_ADDRESS)
\r
1611 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_AA);
\r
1612 eEvent = MASTER_READ_DATA;
\r
1616 rdata[u32rxLen++] = (uint8_t) UI2C_GET_DATA(ui2c); /* Receive Data */
\r
1618 if(u32rxLen < u32rLen - 1U)
\r
1619 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_AA);
\r
1621 u8Ctrl = UI2C_CTL_PTRG;
\r
1626 case UI2C_PROTSTS_NACKIF_Msk:
\r
1627 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_NACKIF_Msk); /* Clear NACK INT Flag */
\r
1629 if(eEvent == MASTER_READ_DATA)
\r
1630 rdata[u32rxLen++] = (uint8_t) UI2C_GET_DATA(ui2c); /* Receive Data */
\r
1632 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
1636 case UI2C_PROTSTS_STORIF_Msk:
\r
1637 UI2C_CLR_PROT_INT_FLAG(ui2c, UI2C_PROTSTS_STORIF_Msk); /* Clear STOP INT Flag */
\r
1638 u8Ctrl = UI2C_CTL_PTRG; /* Clear SI */
\r
1642 case UI2C_PROTSTS_ARBLOIF_Msk: /* Arbitration Lost */
\r
1643 default: /* Unknow status */
\r
1644 u8Ctrl = (UI2C_CTL_PTRG | UI2C_CTL_STO); /* Clear SI and send STOP */
\r
1648 UI2C_SET_CONTROL_REG(ui2c, u8Ctrl); /* Write controlbit to UI2C_PROTCTL register */
\r
1651 return u32rxLen; /* Return bytes length that have been received */
\r
1654 /*@}*/ /* end of group USCI_I2C_EXPORTED_FUNCTIONS */
\r
1656 /*@}*/ /* end of group USCI_I2C_Driver */
\r
1658 /*@}*/ /* end of group Standard_Driver */
\r
1660 /*** (C) COPYRIGHT 2016 Nuvoton Technology Corp. ***/
\r