M471M/R1/S BSP V3.01.000
The Board Support Package for M4521
i2c.h
Go to the documentation of this file.
1/**************************************************************************/
8#ifndef __I2C_H__
9#define __I2C_H__
10
11#include "NuMicro.h"
12
13#ifdef __cplusplus
14extern "C"
15{
16#endif
17
18
31/*---------------------------------------------------------------------------------------------------------*/
32/* I2C_CTL constant definitions. */
33/*---------------------------------------------------------------------------------------------------------*/
34#define I2C_CTL_STA_SI 0x28UL
35#define I2C_CTL_STA_SI_AA 0x2CUL
36#define I2C_CTL_STO_SI 0x18UL
37#define I2C_CTL_STO_SI_AA 0x1CUL
38#define I2C_CTL_SI 0x08UL
39#define I2C_CTL_SI_AA 0x0CUL
40#define I2C_CTL_STA 0x20UL
41#define I2C_CTL_STO 0x10UL
42#define I2C_CTL_AA 0x04UL
44/*---------------------------------------------------------------------------------------------------------*/
45/* I2C GCMode constant definitions. */
46/*---------------------------------------------------------------------------------------------------------*/
47#define I2C_GCMODE_ENABLE 1
48#define I2C_GCMODE_DISABLE 0
50/*---------------------------------------------------------------------------------------------------------*/
51/* I2C SMBUS constant definitions. */
52/*---------------------------------------------------------------------------------------------------------*/
53#define I2C_SMBH_ENABLE 1
54#define I2C_SMBD_ENABLE 0
55#define I2C_PECTX_ENABLE 1
56#define I2C_PECTX_DISABLE 0 /* end of group I2C_EXPORTED_CONSTANTS */
59
73#define I2C_SET_CONTROL_REG(i2c, u8Ctrl) ((i2c)->CTL = ((i2c)->CTL & ~0x3c) | (u8Ctrl))
74
84#define I2C_START(i2c) ((i2c)->CTL = ((i2c)->CTL & ~I2C_CTL_SI_Msk) | I2C_CTL_STA_Msk)
85
95#define I2C_WAIT_READY(i2c) while(!((i2c)->CTL & I2C_CTL_SI_Msk))
96
106#define I2C_GET_DATA(i2c) ((i2c)->DAT)
107
118#define I2C_SET_DATA(i2c, u8Data) ((i2c)->DAT = (u8Data))
119
129#define I2C_GET_STATUS(i2c) ((i2c)->STATUS)
130
141#define I2C_GET_TIMEOUT_FLAG(i2c) ( ((i2c)->TOCTL & I2C_TOCTL_TOIF_Msk) == I2C_TOCTL_TOIF_Msk ? 1:0 )
142
153#define I2C_GET_WAKEUP_FLAG(i2c) ( ((i2c)->WKSTS & I2C_WKSTS_WKIF_Msk) == I2C_WKSTS_WKIF_Msk ? 1:0 )
154
164#define I2C_CLEAR_WAKEUP_FLAG(i2c) ((i2c)->WKSTS = I2C_WKSTS_WKIF_Msk)
165
176#define I2C_SMBUS_GET_STATUS(i2c) ((i2c)->BUSSTS)
177
188#define I2C_SMBUS_GET_PEC_VALUE(i2c) ((i2c)->PKTCRC)
189
201#define I2C_SMBUS_SET_PACKET_BYTE_COUNT(i2c, u32PktSize) ((i2c)->PKTSIZE = (u32PktSize))
202
214#define I2C_SMBUS_ENABLE_ALERT(i2c) ((i2c)->BUSCTL |= I2C_BUSCTL_ALERTEN_Msk)
215
227#define I2C_SMBUS_DISABLE_ALERT(i2c) ((i2c)->BUSCTL &= ~I2C_BUSCTL_ALERTEN_Msk)
228
240#define I2C_SMBUS_SET_SUSCON_OUT(i2c) ((i2c)->BUSCTL |= I2C_BUSCTL_SCTLOEN_Msk)
241
253#define I2C_SMBUS_SET_SUSCON_IN(i2c) ((i2c)->BUSCTL &= ~I2C_BUSCTL_SCTLOEN_Msk)
254
265#define I2C_SMBUS_SET_SUSCON_HIGH(i2c) ((i2c)->BUSCTL |= I2C_BUSCTL_SCTLOSTS_Msk)
266
267
278#define I2C_SMBUS_SET_SUSCON_LOW(i2c) ((i2c)->BUSCTL &= ~I2C_BUSCTL_SCTLOSTS_Msk)
279
290#define I2C_SMBUS_ACK_MANUAL(i2c) ((i2c)->BUSCTL |= I2C_BUSCTL_ACKMEN_Msk)
291
302#define I2C_SMBUS_ACK_AUTO(i2c) ((i2c)->BUSCTL &= ~I2C_BUSCTL_ACKMEN_Msk)
303
314#define I2C_SMBUS_9THBIT_INT_ENABLE(i2c) ((i2c)->BUSCTL |= I2C_BUSCTL_ACKM9SI_Msk)
315
326#define I2C_SMBUS_9THBIT_INT_DISABLE(i2c) ((i2c)->BUSCTL &= ~I2C_BUSCTL_ACKM9SI_Msk)
327
338#define I2C_SMBUS_RST_PEC_AT_START_ENABLE(i2c) ((i2c)->BUSCTL |= I2C_BUSCTL_PECCLR_Msk)
339
350#define I2C_SMBUS_RST_PEC_AT_START_DISABLE(i2c) ((i2c)->BUSCTL &= ~I2C_BUSCTL_PECCLR_Msk)
351
352/*---------------------------------------------------------------------------------------------------------*/
353/* inline functions */
354/*---------------------------------------------------------------------------------------------------------*/
365static __INLINE int32_t I2C_STOP(I2C_T *i2c)
366{
367 uint32_t u32TimeOutCount = SystemCoreClock; // 1 second timeout
368 (i2c)->CTL |= (I2C_CTL_SI_Msk | I2C_CTL_STO_Msk);
369 while((i2c->CTL & I2C_CTL_STO_Msk) && (u32TimeOutCount-- > 0));
370 if(u32TimeOutCount == 0)
371 return -1;
372 else
373 return 0;
374}
375
376void I2C_ClearTimeoutFlag(I2C_T *i2c);
377void I2C_Close(I2C_T *i2c);
378void I2C_Trigger(I2C_T *i2c, uint8_t u8Start, uint8_t u8Stop, uint8_t u8Si, uint8_t u8Ack);
379void I2C_DisableInt(I2C_T *i2c);
380void I2C_EnableInt(I2C_T *i2c);
381uint32_t I2C_GetBusClockFreq(I2C_T *i2c);
382uint32_t I2C_GetIntFlag(I2C_T *i2c);
383uint32_t I2C_GetStatus(I2C_T *i2c);
384uint32_t I2C_Open(I2C_T *i2c, uint32_t u32BusClock);
385uint8_t I2C_GetData(I2C_T *i2c);
386void I2C_SetSlaveAddr(I2C_T *i2c, uint8_t u8SlaveNo, uint8_t u8SlaveAddr, uint8_t u8GCMode);
387void I2C_SetSlaveAddrMask(I2C_T *i2c, uint8_t u8SlaveNo, uint8_t u8SlaveAddrMask);
388uint32_t I2C_SetBusClockFreq(I2C_T *i2c, uint32_t u32BusClock);
389void I2C_EnableTimeout(I2C_T *i2c, uint8_t u8LongTimeout);
390void I2C_DisableTimeout(I2C_T *i2c);
391void I2C_EnableWakeup(I2C_T *i2c);
392void I2C_DisableWakeup(I2C_T *i2c);
393void I2C_SetData(I2C_T *i2c, uint8_t u8Data);
394
395uint32_t I2C_SMBusGetStatus(I2C_T *i2c);
396void I2C_SMBusClearInterruptFlag(I2C_T *i2c, uint8_t u8ClrSMBusIntFlag);
397void I2C_SMBusSetPacketByteCount(I2C_T *i2c, uint32_t u32PktSize);
398void I2C_SMBusOpen(I2C_T *i2c, uint8_t u8HostDevice);
399void I2C_SMBusClose(I2C_T *i2c);
400void I2C_SMBusPECTxEnable(I2C_T *i2c, uint8_t u8PECTxEn);
401uint8_t I2C_SMBusGetPECValue(I2C_T *i2c);
402void I2C_SMBusIdleTimeout(I2C_T *i2c, uint32_t us, uint32_t u32Hclk);
403void I2C_SMBusTimeout(I2C_T *i2c, uint32_t ms, uint32_t u32Pclk);
404void I2C_SMBusClockLoTimeout(I2C_T *i2c, uint32_t ms, uint32_t u32Pclk); /* end of group I2C_EXPORTED_FUNCTIONS */
406 /* end of group I2C_Driver */
408 /* end of group Standard_Driver */
410
411#ifdef __cplusplus
412}
413#endif
414#endif //__I2C_H__
#define I2C_CTL_STO_Msk
Definition: M471M_R1_S.h:3741
#define I2C_CTL_SI_Msk
Definition: M471M_R1_S.h:3738
NuMicro peripheral access layer header file.
uint32_t I2C_SMBusGetStatus(I2C_T *i2c)
To get SMBus Status.
Definition: i2c.c:389
void I2C_SMBusIdleTimeout(I2C_T *i2c, uint32_t us, uint32_t u32Hclk)
Calculate Time-out of SMBus idle period.
Definition: i2c.c:514
void I2C_SetSlaveAddrMask(I2C_T *i2c, uint8_t u8SlaveNo, uint8_t u8SlaveAddrMask)
Configure the mask bits of 7-bit Slave Address.
Definition: i2c.c:292
static __INLINE int32_t I2C_STOP(I2C_T *i2c)
The macro is used to set STOP condition of I2C Bus.
Definition: i2c.h:365
void I2C_Close(I2C_T *i2c)
Disable specify I2C Controller.
Definition: i2c.c:60
void I2C_SMBusSetPacketByteCount(I2C_T *i2c, uint32_t u32PktSize)
Set SMBus Bytes Counts of Transmission or Reception.
Definition: i2c.c:421
uint32_t I2C_SetBusClockFreq(I2C_T *i2c, uint32_t u32BusClock)
Set I2C Bus Clock.
Definition: i2c.c:179
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:107
void I2C_SMBusClose(I2C_T *i2c)
Disable SMBus function.
Definition: i2c.c:459
void I2C_EnableTimeout(I2C_T *i2c, uint8_t u8LongTimeout)
Enable Time-out Counter Function and support Long Time-out.
Definition: i2c.c:324
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:582
void I2C_ClearTimeoutFlag(I2C_T *i2c)
Clear Time-out Counter flag.
Definition: i2c.c:88
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:260
void I2C_SetData(I2C_T *i2c, uint8_t u8Data)
Send a byte to I2C Bus.
Definition: i2c.c:241
uint32_t I2C_GetBusClockFreq(I2C_T *i2c)
Get I2C Bus Clock.
Definition: i2c.c:162
void I2C_EnableInt(I2C_T *i2c)
Enable Interrupt of I2C Controller.
Definition: i2c.c:148
void I2C_DisableWakeup(I2C_T *i2c)
Disable I2C Wake-up Function.
Definition: i2c.c:374
uint32_t I2C_GetStatus(I2C_T *i2c)
Get I2C Bus Status Code.
Definition: i2c.c:212
void I2C_DisableInt(I2C_T *i2c)
Disable Interrupt of I2C Controller.
Definition: i2c.c:133
void I2C_SMBusPECTxEnable(I2C_T *i2c, uint8_t u8PECTxEn)
Enable SMBus PEC Transmit Function.
Definition: i2c.c:476
void I2C_EnableWakeup(I2C_T *i2c)
Enable I2C Wake-up Function.
Definition: i2c.c:359
void I2C_SMBusOpen(I2C_T *i2c, uint8_t u8HostDevice)
Init SMBus Host/Device Mode.
Definition: i2c.c:437
uint32_t I2C_GetIntFlag(I2C_T *i2c)
Get Interrupt Flag.
Definition: i2c.c:198
void I2C_SMBusTimeout(I2C_T *i2c, uint32_t ms, uint32_t u32Pclk)
Calculate Time-out of SMBus active period.
Definition: i2c.c:546
uint8_t I2C_GetData(I2C_T *i2c)
Read a Byte from I2C Bus.
Definition: i2c.c:226
uint8_t I2C_SMBusGetPECValue(I2C_T *i2c)
Get SMBus CRC value.
Definition: i2c.c:496
uint32_t I2C_Open(I2C_T *i2c, uint32_t u32BusClock)
Enable specify I2C Controller and set Clock Divider.
Definition: i2c.c:36
void I2C_DisableTimeout(I2C_T *i2c)
Disable Time-out Counter Function.
Definition: i2c.c:344
void I2C_SMBusClearInterruptFlag(I2C_T *i2c, uint8_t u8ClrSMBusIntFlag)
Clear SMBus Interrupt Flag.
Definition: i2c.c:405
__IO uint32_t CTL
Definition: M471M_R1_S.h:3701
uint32_t SystemCoreClock