M4521_BSP V3.02.000
The Board Support Package for M4521
i2c.c
Go to the documentation of this file.
1/**************************************************************************/
12#include "M4521.h"
13
40uint32_t I2C_Open(I2C_T *i2c, uint32_t u32BusClock)
41{
42 uint32_t u32Div;
43
44 u32Div = (uint32_t)(((SystemCoreClock * 10) / (u32BusClock * 4) + 5) / 10 - 1); /* Compute proper divider for I2C clock */
45 i2c->CLKDIV = u32Div;
46
47 /* Enable I2C */
48 i2c->CTL |= I2C_CTL_I2CEN_Msk;
49
50 return (SystemCoreClock / ((u32Div + 1) << 2));
51}
52
64void I2C_Close(I2C_T *i2c)
65{
66 /* Reset I2C Controller */
67 if((uint32_t)i2c == I2C0_BASE)
68 {
69 SYS->IPRST1 |= SYS_IPRST1_I2C0RST_Msk;
70 SYS->IPRST1 &= ~SYS_IPRST1_I2C0RST_Msk;
71 }
72 else if((uint32_t)i2c == I2C1_BASE)
73 {
74 SYS->IPRST1 |= SYS_IPRST1_I2C1RST_Msk;
75 SYS->IPRST1 &= ~SYS_IPRST1_I2C1RST_Msk;
76 }
77
78 /* Disable I2C */
79 i2c->CTL &= ~I2C_CTL_I2CEN_Msk;
80}
81
93{
95}
96
111void I2C_Trigger(I2C_T *i2c, uint8_t u8Start, uint8_t u8Stop, uint8_t u8Si, uint8_t u8Ack)
112{
113 uint32_t u32Reg = 0;
114
115 if(u8Start)
116 u32Reg |= I2C_CTL_STA;
117 if(u8Stop)
118 u32Reg |= I2C_CTL_STO;
119 if(u8Si)
120 u32Reg |= I2C_CTL_SI;
121 if(u8Ack)
122 u32Reg |= I2C_CTL_AA;
123
124 i2c->CTL = (i2c->CTL & ~0x3C) | u32Reg;
125}
126
138{
139 i2c->CTL &= ~I2C_CTL_INTEN_Msk;
140}
141
153{
154 i2c->CTL |= I2C_CTL_INTEN_Msk;
155}
156
167{
168 uint32_t u32Divider = i2c->CLKDIV;
169
170 return (SystemCoreClock / ((u32Divider + 1) << 2));
171}
172
183uint32_t I2C_SetBusClockFreq(I2C_T *i2c, uint32_t u32BusClock)
184{
185 uint32_t u32Div;
186
187 u32Div = (uint32_t)(((SystemCoreClock * 10) / (u32BusClock * 4) + 5) / 10 - 1); /* Compute proper divider for I2C clock */
188 i2c->CLKDIV = u32Div;
189
190 return (SystemCoreClock / ((u32Div + 1) << 2));
191}
192
202uint32_t I2C_GetIntFlag(I2C_T *i2c)
203{
204 return ((i2c->CTL & I2C_CTL_SI_Msk) == I2C_CTL_SI_Msk ? 1 : 0);
205}
206
216uint32_t I2C_GetStatus(I2C_T *i2c)
217{
218 return (i2c->STATUS);
219}
220
230uint8_t I2C_GetData(I2C_T *i2c)
231{
232 return (i2c->DAT);
233}
234
245void I2C_SetData(I2C_T *i2c, uint8_t u8Data)
246{
247 i2c->DAT = u8Data;
248}
249
264void I2C_SetSlaveAddr(I2C_T *i2c, uint8_t u8SlaveNo, uint8_t u8SlaveAddr, uint8_t u8GCMode)
265{
266 switch(u8SlaveNo)
267 {
268 case 1:
269 i2c->ADDR1 = (u8SlaveAddr << 1) | u8GCMode;
270 break;
271 case 2:
272 i2c->ADDR2 = (u8SlaveAddr << 1) | u8GCMode;
273 break;
274 case 3:
275 i2c->ADDR3 = (u8SlaveAddr << 1) | u8GCMode;
276 break;
277 case 0:
278 default:
279 i2c->ADDR0 = (u8SlaveAddr << 1) | u8GCMode;
280 break;
281 }
282}
283
296void I2C_SetSlaveAddrMask(I2C_T *i2c, uint8_t u8SlaveNo, uint8_t u8SlaveAddrMask)
297{
298 switch(u8SlaveNo)
299 {
300 case 1:
301 i2c->ADDRMSK1 = u8SlaveAddrMask << 1;
302 break;
303 case 2:
304 i2c->ADDRMSK2 = u8SlaveAddrMask << 1;
305 break;
306 case 3:
307 i2c->ADDRMSK3 = u8SlaveAddrMask << 1;
308 break;
309 case 0:
310 default:
311 i2c->ADDRMSK0 = u8SlaveAddrMask << 1;
312 break;
313 }
314}
315
328void I2C_EnableTimeout(I2C_T *i2c, uint8_t u8LongTimeout)
329{
330 if(u8LongTimeout)
332 else
333 i2c->TOCTL &= ~I2C_TOCTL_TOCDIV4_Msk;
334
336}
337
349{
350 i2c->TOCTL &= ~I2C_TOCTL_TOCEN_Msk;
351}
352
364{
366}
367
379{
380 i2c->WKCTL &= ~I2C_WKCTL_WKEN_Msk;
381}
382
394{
395 return (i2c->BUSSTS);
396}
397
409void I2C_SMBusClearInterruptFlag(I2C_T *i2c, uint8_t u8SMBusIntFlag)
410{
411 i2c->BUSSTS |= u8SMBusIntFlag;
412}
413
425void I2C_SMBusSetPacketByteCount(I2C_T *i2c, uint32_t u32PktSize)
426{
427 i2c->PKTSIZE = u32PktSize;
428}
429
441void I2C_SMBusOpen(I2C_T *i2c, uint8_t u8HostDevice)
442{
443 /* Clear BMHEN, BMDEN of BUSCTL Register */
445
446 /* Set SMBus Host/Device Mode, and enable Bus Management*/
447 if(u8HostDevice == I2C_SMBH_ENABLE)
449 else
451}
452
464{
465
466 i2c->BUSCTL = 0x00;
467}
468
480void I2C_SMBusPECTxEnable(I2C_T *i2c, uint8_t u8PECTxEn)
481{
482 i2c->BUSCTL &= ~I2C_BUSCTL_PECTXEN_Msk;
483
484 if(u8PECTxEn)
486 else
488}
489
501{
502 return i2c->PKTCRC;
503}
504
518void I2C_SMBusIdleTimeout(I2C_T *i2c, uint32_t us, uint32_t u32Hclk)
519{
520 uint32_t u32Div, u32Hclk_kHz;
521
523 u32Hclk_kHz = u32Hclk / 1000;
524 u32Div = (((us * u32Hclk_kHz) / 1000) >> 2) - 1;
525 if(u32Div > 255)
526 {
527 i2c->BUSTOUT = 0xFF;
528 }
529 else
530 {
531 i2c->BUSTOUT = u32Div;
532 }
533
534}
535
550void I2C_SMBusTimeout(I2C_T *i2c, uint32_t ms, uint32_t u32Pclk)
551{
552 uint32_t u32Div, u32Pclk_kHz;
553
554 i2c->BUSCTL &= ~I2C_BUSCTL_TIDLE_Msk;
555
556 /* DIV4 disabled */
557 i2c->TOCTL &= ~I2C_TOCTL_TOCEN_Msk;
558 u32Pclk_kHz = u32Pclk / 1000;
559 u32Div = ((ms * u32Pclk_kHz) / (16 * 1024)) - 1;
560 if(u32Div <= 0xFF)
561 {
562 i2c->BUSTOUT = u32Div;
563 return;
564 }
565
566 /* DIV4 enabled */
568
569 i2c->BUSTOUT = (((ms * u32Pclk_kHz) / (16 * 1024 * 4)) - 1) & 0xFF; //The max value is 255
570}
571
586void I2C_SMBusClockLoTimeout(I2C_T *i2c, uint32_t ms, uint32_t u32Pclk)
587{
588 uint32_t u32Div, u32Pclk_kHz;
589
590 i2c->BUSCTL &= ~I2C_BUSCTL_TIDLE_Msk;
591
592 /* DIV4 disabled */
593 i2c->TOCTL &= ~I2C_TOCTL_TOCEN_Msk;
594 u32Pclk_kHz = u32Pclk / 1000;
595 u32Div = ((ms * u32Pclk_kHz) / (16 * 1024)) - 1;
596 if(u32Div <= 0xFF)
597 {
598 i2c->CLKTOUT = u32Div;
599 return;
600 }
601
602 /* DIV4 enabled */
604 i2c->CLKTOUT = (((ms * u32Pclk_kHz) / (16 * 1024 * 4)) - 1) & 0xFF; //The max value is 255
605}
606 /* end of group I2C_EXPORTED_FUNCTIONS */
608 /* end of group I2C_Driver */
610 /* end of group Standard_Driver */
612
613/*** (C) COPYRIGHT 2022 Nuvoton Technology Corp. ***/
#define SYS_IPRST1_I2C1RST_Msk
Definition: M4521.h:10421
#define I2C_BUSCTL_PECEN_Msk
Definition: M4521.h:3820
#define I2C_CTL_INTEN_Msk
Definition: M4521.h:3754
#define I2C_BUSCTL_PECTXEN_Msk
Definition: M4521.h:3841
#define I2C_TOCTL_TOIF_Msk
Definition: M4521.h:3772
#define I2C_TOCTL_TOCEN_Msk
Definition: M4521.h:3778
#define I2C_BUSCTL_BMDEN_Msk
Definition: M4521.h:3823
#define I2C_BUSCTL_TIDLE_Msk
Definition: M4521.h:3844
#define I2C_WKCTL_WKEN_Msk
Definition: M4521.h:3811
#define I2C_BUSCTL_BUSEN_Msk
Definition: M4521.h:3838
#define I2C_CTL_I2CEN_Msk
Definition: M4521.h:3751
#define SYS_IPRST1_I2C0RST_Msk
Definition: M4521.h:10418
#define I2C_BUSCTL_BMHEN_Msk
Definition: M4521.h:3826
#define I2C_CTL_SI_Msk
Definition: M4521.h:3742
#define I2C_TOCTL_TOCDIV4_Msk
Definition: M4521.h:3775
#define I2C_CTL_STO
Definition: i2c.h:45
#define I2C_CTL_AA
Definition: i2c.h:46
#define I2C_CTL_SI
Definition: i2c.h:42
#define I2C_CTL_STA
Definition: i2c.h:44
#define I2C_SMBH_ENABLE
Definition: i2c.h:57
uint32_t I2C_SMBusGetStatus(I2C_T *i2c)
To get SMBus Status.
Definition: i2c.c:393
void I2C_SMBusIdleTimeout(I2C_T *i2c, uint32_t us, uint32_t u32Hclk)
Calculate Time-out of SMBus idle period.
Definition: i2c.c:518
void I2C_SetSlaveAddrMask(I2C_T *i2c, uint8_t u8SlaveNo, uint8_t u8SlaveAddrMask)
Configure the mask bits of 7-bit Slave Address.
Definition: i2c.c:296
void I2C_Close(I2C_T *i2c)
Disable specify I2C Controller.
Definition: i2c.c:64
void I2C_SMBusSetPacketByteCount(I2C_T *i2c, uint32_t u32PktSize)
Set SMBus Bytes Counts of Transmission or Reception.
Definition: i2c.c:425
uint32_t I2C_SetBusClockFreq(I2C_T *i2c, uint32_t u32BusClock)
Set I2C Bus Clock.
Definition: i2c.c:183
void I2C_Trigger(I2C_T *i2c, uint8_t u8Start, uint8_t u8Stop, uint8_t u8Si, uint8_t u8Ack)
Set Control bit of I2C Controller.
Definition: i2c.c:111
void I2C_SMBusClose(I2C_T *i2c)
Disable SMBus function.
Definition: i2c.c:463
void I2C_EnableTimeout(I2C_T *i2c, uint8_t u8LongTimeout)
Enable Time-out Counter Function and support Long Time-out.
Definition: i2c.c:328
void I2C_SMBusClockLoTimeout(I2C_T *i2c, uint32_t ms, uint32_t u32Pclk)
Calculate Cumulative Clock low Time-out of SMBus active period.
Definition: i2c.c:586
void I2C_ClearTimeoutFlag(I2C_T *i2c)
Clear Time-out Counter flag.
Definition: i2c.c:92
void I2C_SetSlaveAddr(I2C_T *i2c, uint8_t u8SlaveNo, uint8_t u8SlaveAddr, uint8_t u8GCMode)
Set 7-bit Slave Address and GC Mode.
Definition: i2c.c:264
void I2C_SetData(I2C_T *i2c, uint8_t u8Data)
Send a byte to I2C Bus.
Definition: i2c.c:245
uint32_t I2C_GetBusClockFreq(I2C_T *i2c)
Get I2C Bus Clock.
Definition: i2c.c:166
void I2C_EnableInt(I2C_T *i2c)
Enable Interrupt of I2C Controller.
Definition: i2c.c:152
void I2C_DisableWakeup(I2C_T *i2c)
Disable I2C Wake-up Function.
Definition: i2c.c:378
uint32_t I2C_GetStatus(I2C_T *i2c)
Get I2C Bus Status Code.
Definition: i2c.c:216
void I2C_DisableInt(I2C_T *i2c)
Disable Interrupt of I2C Controller.
Definition: i2c.c:137
void I2C_SMBusPECTxEnable(I2C_T *i2c, uint8_t u8PECTxEn)
Enable SMBus PEC Transmit Function.
Definition: i2c.c:480
void I2C_EnableWakeup(I2C_T *i2c)
Enable I2C Wake-up Function.
Definition: i2c.c:363
void I2C_SMBusOpen(I2C_T *i2c, uint8_t u8HostDevice)
Init SMBus Host/Device Mode.
Definition: i2c.c:441
uint32_t I2C_GetIntFlag(I2C_T *i2c)
Get Interrupt Flag.
Definition: i2c.c:202
void I2C_SMBusTimeout(I2C_T *i2c, uint32_t ms, uint32_t u32Pclk)
Calculate Time-out of SMBus active period.
Definition: i2c.c:550
uint8_t I2C_GetData(I2C_T *i2c)
Read a Byte from I2C Bus.
Definition: i2c.c:230
uint8_t I2C_SMBusGetPECValue(I2C_T *i2c)
Get SMBus CRC value.
Definition: i2c.c:500
uint32_t I2C_Open(I2C_T *i2c, uint32_t u32BusClock)
Enable specify I2C Controller and set Clock Divider.
Definition: i2c.c:40
void I2C_DisableTimeout(I2C_T *i2c)
Disable Time-out Counter Function.
Definition: i2c.c:348
void I2C_SMBusClearInterruptFlag(I2C_T *i2c, uint8_t u8ClrSMBusIntFlag)
Clear SMBus Interrupt Flag.
Definition: i2c.c:409
#define I2C0_BASE
Definition: M4521.h:13796
#define I2C1_BASE
Definition: M4521.h:13808
__IO uint32_t CLKTOUT
Definition: M4521.h:3727
__IO uint32_t ADDR2
Definition: M4521.h:3712
__IO uint32_t ADDR3
Definition: M4521.h:3713
__IO uint32_t ADDRMSK1
Definition: M4521.h:3715
__IO uint32_t ADDR0
Definition: M4521.h:3706
__IO uint32_t TOCTL
Definition: M4521.h:3710
__IO uint32_t CLKDIV
Definition: M4521.h:3709
__IO uint32_t CTL
Definition: M4521.h:3705
__IO uint32_t DAT
Definition: M4521.h:3707
__I uint32_t PKTCRC
Definition: M4521.h:3725
__IO uint32_t ADDR1
Definition: M4521.h:3711
__IO uint32_t BUSTOUT
Definition: M4521.h:3726
__IO uint32_t ADDRMSK2
Definition: M4521.h:3716
__IO uint32_t BUSSTS
Definition: M4521.h:3723
__IO uint32_t ADDRMSK0
Definition: M4521.h:3714
__IO uint32_t BUSCTL
Definition: M4521.h:3721
__IO uint32_t ADDRMSK3
Definition: M4521.h:3717
__IO uint32_t PKTSIZE
Definition: M4521.h:3724
__I uint32_t STATUS
Definition: M4521.h:3708
#define SYS
Definition: M4521.h:13820
__IO uint32_t WKCTL
Definition: M4521.h:3719
Definition: M4521.h:3339
uint32_t SystemCoreClock
Definition: system_M4521.c:24