1 /**
2   ******************************************************************************
3   * @file    lib_i2c.h
4   * @author  Application Team
5   * @version V1.1.0
6   * @date    2019-10-28
7   * @brief   IIC library.
8   ******************************************************************************
9   * @attention
10   *
11   ******************************************************************************
12   */
13 #ifndef __LIB_I2C_H
14 #define __LIB_I2C_H
15 
16 #ifdef __cplusplus
17  extern "C" {
18 #endif
19 
20 #include "target.h"
21 
22 typedef struct
23 {
24   uint32_t SlaveAddr;
25   uint32_t GeneralCallAck;
26   uint32_t AssertAcknowledge;
27   uint32_t ClockSource;
28 } I2C_InitType;
29 
30 /**************  Bits definition for I2C_CTRL register       ******************/
31 #define I2C_CTRL_CR_0                 (0x0U << I2C_CTRL_CR0_Pos)                /*!< 0x0000000 */
32 #define I2C_CTRL_CR_1                 (0x1U << I2C_CTRL_CR0_Pos)                /*!< 0x0000001 */
33 #define I2C_CTRL_CR_2                 (0x2U << I2C_CTRL_CR0_Pos)                /*!< 0x0000002 */
34 #define I2C_CTRL_CR_3                 (0x3U << I2C_CTRL_CR0_Pos)                /*!< 0x0000003 */
35 #define I2C_CTRL_CR_4                 (0x80U << I2C_CTRL_CR0_Pos)               /*!< 0x0000080 */
36 #define I2C_CTRL_CR_5                 (0x81U << I2C_CTRL_CR0_Pos)               /*!< 0x0000081 */
37 #define I2C_CTRL_CR_6                 (0x82U << I2C_CTRL_CR0_Pos)               /*!< 0x0000082 */
38 #define I2C_CTRL_CR_7                 (0x83U << I2C_CTRL_CR0_Pos)               /*!< 0x0000083 */
39 
40 /**************  Bits definition for I2C_STS register        ******************/
41 #define I2C_STS_STS_0x00              (0x0U << I2C_STS_STS_Pos)                /*!< 0x0000000 */
42 #define I2C_STS_STS_0x08              (0x1U << I2C_STS_STS_Pos)                /*!< 0x0000008 */
43 #define I2C_STS_STS_0x10              (0x2U << I2C_STS_STS_Pos)                /*!< 0x0000010 */
44 #define I2C_STS_STS_0x18              (0x3U << I2C_STS_STS_Pos)                /*!< 0x0000018 */
45 #define I2C_STS_STS_0x20              (0x4U << I2C_STS_STS_Pos)                /*!< 0x0000020 */
46 #define I2C_STS_STS_0x28              (0x5U << I2C_STS_STS_Pos)                /*!< 0x0000028 */
47 #define I2C_STS_STS_0x30              (0x6U << I2C_STS_STS_Pos)                /*!< 0x0000030 */
48 #define I2C_STS_STS_0x38              (0x7U << I2C_STS_STS_Pos)                /*!< 0x0000038 */
49 #define I2C_STS_STS_0x40              (0x8U << I2C_STS_STS_Pos)                /*!< 0x0000040 */
50 #define I2C_STS_STS_0x48              (0x9U << I2C_STS_STS_Pos)                /*!< 0x0000048 */
51 #define I2C_STS_STS_0x50              (0xAU << I2C_STS_STS_Pos)                /*!< 0x0000050 */
52 #define I2C_STS_STS_0x58              (0xBU << I2C_STS_STS_Pos)                /*!< 0x0000058 */
53 #define I2C_STS_STS_0x60              (0xCU << I2C_STS_STS_Pos)                /*!< 0x0000060 */
54 #define I2C_STS_STS_0x68              (0xDU << I2C_STS_STS_Pos)                /*!< 0x0000068 */
55 #define I2C_STS_STS_0x70              (0xEU << I2C_STS_STS_Pos)                /*!< 0x0000070 */
56 #define I2C_STS_STS_0x78              (0xFU << I2C_STS_STS_Pos)                /*!< 0x0000078 */
57 #define I2C_STS_STS_0x80              (0x10U << I2C_STS_STS_Pos)               /*!< 0x0000080 */
58 #define I2C_STS_STS_0x88              (0x11U << I2C_STS_STS_Pos)               /*!< 0x0000088 */
59 #define I2C_STS_STS_0x90              (0x12U << I2C_STS_STS_Pos)               /*!< 0x0000090 */
60 #define I2C_STS_STS_0x98              (0x13U << I2C_STS_STS_Pos)               /*!< 0x0000098 */
61 #define I2C_STS_STS_0xA0              (0x14U << I2C_STS_STS_Pos)               /*!< 0x00000A0 */
62 #define I2C_STS_STS_0xA8              (0x15U << I2C_STS_STS_Pos)               /*!< 0x00000A8 */
63 #define I2C_STS_STS_0xB0              (0x16U << I2C_STS_STS_Pos)               /*!< 0x00000B0 */
64 #define I2C_STS_STS_0xB8              (0x17U << I2C_STS_STS_Pos)               /*!< 0x00000B8 */
65 #define I2C_STS_STS_0xC0              (0x18U << I2C_STS_STS_Pos)               /*!< 0x00000C0 */
66 #define I2C_STS_STS_0xC8              (0x19U << I2C_STS_STS_Pos)               /*!< 0x00000C8 */
67 #define I2C_STS_STS_0xF8              (0x1FU << I2C_STS_STS_Pos)               /*!< 0x00000F8 */
68 
69 //GeneralCallAck
70 #define I2C_GENERALCALLACK_ENABLE   I2C_ADDR_GC
71 #define I2C_GENERALCALLACK_DISABLE  0
72 //AssertAcknowledge
73 #define I2C_ASSERTACKNOWLEDGE_ENABLE    I2C_CTRL_AA
74 #define I2C_ASSERTACKNOWLEDGE_DISABLE   0
75 //ClockSource
76 #define I2C_CLOCKSOURCE_APBD256     I2C_CTRL_CR_0
77 #define I2C_CLOCKSOURCE_APBD224     I2C_CTRL_CR_1
78 #define I2C_CLOCKSOURCE_APBD192     I2C_CTRL_CR_2
79 #define I2C_CLOCKSOURCE_APBD160     I2C_CTRL_CR_3
80 #define I2C_CLOCKSOURCE_APBD960     I2C_CTRL_CR_4
81 #define I2C_CLOCKSOURCE_APBD120     I2C_CTRL_CR_5
82 #define I2C_CLOCKSOURCE_APBD60      I2C_CTRL_CR_6
83 #define I2C_CLOCKSOURCE_TIM3OFD8    I2C_CTRL_CR_7
84 
85 #define I2C_CTRL_CR   (0x83)
86 typedef struct
87 {
88   uint16_t SlaveAddr;
89   uint8_t SubAddrType;
90   uint32_t PageRange;
91   uint32_t SubAddress;
92   uint8_t *pBuffer;
93   uint32_t Length;
94 } I2C_WRType;
95 //SubAddrType
96 #define I2C_SUBADDR_1BYTE   (1)
97 #define I2C_SUBADDR_2BYTE   (2)
98 #define I2C_SUBADDR_OTHER   (3)
99 
100 //remap
101 #define I2C_REMAP_ENABLE    (1)
102 #define I2C_REMAP_DISABLE   (0)
103 
104 /* Private macros ------------------------------------------------------------*/
105 
106 #define IS_I2C_GC(__GC__)  (((__GC__) == I2C_GENERALCALLACK_ENABLE) ||\
107                             ((__GC__) == I2C_GENERALCALLACK_DISABLE))
108 
109 #define IS_I2C_AA(__AA__)  (((__AA__) == I2C_ASSERTACKNOWLEDGE_ENABLE) ||\
110                             ((__AA__) == I2C_ASSERTACKNOWLEDGE_DISABLE))
111 
112 #define IS_I2C_CLKSRC(__CLKSRC__)  (((__CLKSRC__) == I2C_CLOCKSOURCE_APBD256) ||\
113                                     ((__CLKSRC__) == I2C_CLOCKSOURCE_APBD224) ||\
114                                     ((__CLKSRC__) == I2C_CLOCKSOURCE_APBD192) ||\
115                                     ((__CLKSRC__) == I2C_CLOCKSOURCE_APBD160) ||\
116                                     ((__CLKSRC__) == I2C_CLOCKSOURCE_APBD960) ||\
117                                     ((__CLKSRC__) == I2C_CLOCKSOURCE_APBD120) ||\
118                                     ((__CLKSRC__) == I2C_CLOCKSOURCE_APBD60)  ||\
119                                     ((__CLKSRC__) == I2C_CLOCKSOURCE_TIM3OFD8))
120 
121 #define I2C_SUBADDR_TYPE(__TYPE__)  (((__TYPE__) == I2C_SUBADDR_1BYTE) ||\
122                                      ((__TYPE__) == I2C_SUBADDR_2BYTE) ||\
123                                      ((__TYPE__) == I2C_SUBADDR_OTHER))
124 
125 /****************************** I2C Instances *********************************/
126 #define IS_I2C_ALL_INSTANCE(INSTANCE) ((INSTANCE) == I2C)
127 
128 
129 /* Exported Functions ------------------------------------------------------- */
130 /* I2C Exported Functions Group1:
131                                    (De)Initialization ------------------------*/
132 void I2C_DeInit(uint32_t remap);
133 void I2C_StructInit(I2C_InitType *InitStruct);
134 void I2C_Init(I2C_InitType *InitStruct);
135 /* I2C Exported Functions Group2:
136                                    Interrupt ---------------------------------*/
137 void I2C_INTConfig(uint32_t NewState);
138 uint8_t I2C_GetINTStatus(void);
139 void I2C_ClearINTStatus(void);
140 /* I2C Exported Functions Group3:
141                                    Transfer datas ----------------------------*/
142 uint16_t I2C_MasterReadBytes(I2C_WRType *InitStruct);
143 uint16_t I2C_MasterWriteBytes(I2C_WRType *InitStruct);
144 /* I2C Exported Functions Group4:
145                                    MISC Configuration ------------------------*/
146 void I2C_Cmd(uint32_t NewState);
147 
148 /* I2C Exported Functions Group5:
149                                    Others ------------------------------------*/
150 void I2C_AssertAcknowledgeConfig(uint32_t NewState);
151 uint8_t I2C_ReceiveData(void);
152 void I2C_SendData(uint8_t Dat);
153 void I2C_GenerateSTART(uint32_t NewState);
154 void I2C_GenerateSTOP(uint32_t NewState);
155 uint8_t I2C_GetStatusCode(void);
156 
157 
158 #ifdef __cplusplus
159 }
160 #endif
161 
162 #endif  /* __LIB_I2C_H */
163 
164 /*********************************** END OF FILE ******************************/
165