1 ////////////////////////////////////////////////////////////////////////////////
2 /// @file     hal_i2c.h
3 /// @author   AE TEAM
4 /// @brief    THIS FILE CONTAINS ALL THE FUNCTIONS PROTOTYPES FOR THE I2C
5 ///           FIRMWARE LIBRARY.
6 ////////////////////////////////////////////////////////////////////////////////
7 /// @attention
8 ///
9 /// THE EXISTING FIRMWARE IS ONLY FOR REFERENCE, WHICH IS DESIGNED TO PROVIDE
10 /// CUSTOMERS WITH CODING INFORMATION ABOUT THEIR PRODUCTS SO THEY CAN SAVE
11 /// TIME. THEREFORE, MINDMOTION SHALL NOT BE LIABLE FOR ANY DIRECT, INDIRECT OR
12 /// CONSEQUENTIAL DAMAGES ABOUT ANY CLAIMS ARISING OUT OF THE CONTENT OF SUCH
13 /// HARDWARE AND/OR THE USE OF THE CODING INFORMATION CONTAINED HEREIN IN
14 /// CONNECTION WITH PRODUCTS MADE BY CUSTOMERS.
15 ///
16 /// <H2><CENTER>&COPY; COPYRIGHT MINDMOTION </CENTER></H2>
17 ////////////////////////////////////////////////////////////////////////////////
18 
19 // Define to prevent recursive inclusion
20 #ifndef __HAL_I2C_H
21 #define __HAL_I2C_H
22 
23 // Files includes
24 #include "types.h"
25 #include "reg_i2c.h"
26 
27 ////////////////////////////////////////////////////////////////////////////////
28 /// @addtogroup MM32_Hardware_Abstract_Layer
29 /// @{
30 
31 ////////////////////////////////////////////////////////////////////////////////
32 /// @defgroup I2C_HAL
33 /// @brief I2C HAL modules
34 /// @{
35 
36 ////////////////////////////////////////////////////////////////////////////////
37 /// @defgroup I2C_Exported_Types
38 /// @{
39 
40 ////////////////////////////////////////////////////////////////////////////////
41 /// @defgroup DRV_Exported_Constants
42 /// @{
43 
44 #define I2C_OWN_ADDRESS  0x20
45 
46 /// @}
47 
48 ////////////////////////////////////////////////////////////////////////////////
49 /// @brief  I2C Init structure definition
50 ////////////////////////////////////////////////////////////////////////////////
51 typedef struct {
52     union {
53         u16 Mode;        ///< Specifies the I2C mode. This parameter can be a value of I2C_mode.
54         u16 I2C_Mode;
55     };
56     union {
57         u16 Speed;       ///< Specifies the I2C speed. This parameter can be a value of I2C_speed.
58         u16 I2C_Speed;
59     };
60     union {
61         u16 OwnAddress;  ///< Specifies the first device own address. This parameter can be a 7-bit or 10-bit address.
62         u16 I2C_OwnAddress;
63     };
64 
65     union {
66         u32 ClockSpeed;  ///< Specifies the clock speed.
67         u32 I2C_ClockSpeed;
68     };
69 } I2C_InitTypeDef;
70 /// @}
71 
72 ////////////////////////////////////////////////////////////////////////////////
73 /// @defgroup I2C_Exported_Constants
74 /// @{
75 
76 ////////////////////////////////////////////////////////////////////////////////
77 /// @brief I2C DMA Direction
78 ////////////////////////////////////////////////////////////////////////////////
79 typedef enum {
80     RDMAE_SET = 1,  // 1 - DMA read
81     TDMAE_SET       // 2 - DMA transmit
82 } I2C_DMA_Dir_TypeDef;
83 ////////////////////////////////////////////////////////////////////////////////
84 /// @brief I2C Transfer Direction
85 ////////////////////////////////////////////////////////////////////////////////
86 typedef enum {
87     I2C_Direction_Transmitter,  // I2C Transmitter
88     I2C_Direction_Receiver      // I2C Receiver
89 } I2C_Trans_Dir_TypeDef;
90 
91 ////////////////////////////////////////////////////////////////////////////////
92 /// @brief I2C Acknowledged Address
93 ////////////////////////////////////////////////////////////////////////////////
94 typedef enum {
95     I2C_AcknowledgedAddress_7bit  = 0x4000,  // 7-bit address
96     I2C_AcknowledgedAddress_10bit = 0xC000   // 10-bit address
97 } I2C_ACKaddr_TypeDef;
98 
99 ////////////////////////////////////////////////////////////////////////////////
100 /// @defgroup I2C_Private_Defines
101 /// @{
102 #define INTR_MASK           ((u16)0xC000)
103 #define FLAG_Mask           ((u32)0x00793FFF)
104 #define IC_TAR_ENDUAL_Set   ((u16)0x1000)
105 #define IC_TAR_ENDUAL_Reset ((u16)0xEFFF)
106 /// @}
107 
108 ////////////////////////////////////////////////////////////////////////////////
109 /// @defgroup I2C_modes
110 /// @{
111 #define TX_EMPTY_CTRL       I2C_CR_EMPINT
112 #define IC_SLAVE_DISABLE    I2C_CR_SLAVEDIS
113 #define IC_RESTART_EN       I2C_CR_REPEN
114 /// @}
115 
116 ////////////////////////////////////////////////////////////////////////////////
117 /// @defgroup I2C_interrupts_definition
118 /// @{
119 #define I2C_IT_RX_UNDER     ((u16)0x0001)
120 #define I2C_IT_RX_OVER      ((u16)0x0002)
121 #define I2C_IT_RX_FULL      ((u16)0x0004)
122 #define I2C_IT_TX_OVER      ((u16)0x0008)
123 #define I2C_IT_TX_EMPTY     ((u16)0x0010)
124 #define I2C_IT_RD_REQ       ((u16)0x0020)
125 #define I2C_IT_TX_ABRT      ((u16)0x0040)
126 #define I2C_IT_RX_DONE      ((u16)0x0080)
127 #define I2C_IT_ACTIVITY     ((u16)0x0100)
128 #define I2C_IT_STOP_DET     ((u16)0x0200)
129 #define I2C_IT_START_DET    ((u16)0x0400)
130 #define I2C_IT_GEN_CALL     ((u16)0x0800)
131 /// @}
132 
133 ////////////////////////////////////////////////////////////////////////////////
134 /// @defgroup I2C_flags_definition
135 /// @{
136 #define I2C_FLAG_RX_UNDER     ((u16)0x0001)
137 #define I2C_FLAG_RX_OVER      ((u16)0x0002)
138 #define I2C_FLAG_RX_FULL      ((u16)0x0004)
139 #define I2C_FLAG_TX_OVER      ((u16)0x0008)
140 #define I2C_FLAG_TX_EMPTY     ((u16)0x0010)
141 #define I2C_FLAG_RD_REQ       ((u16)0x0020)
142 #define I2C_FLAG_TX_ABRT      ((u16)0x0040)
143 #define I2C_FLAG_RX_DONE      ((u16)0x0080)
144 #define I2C_FLAG_ACTIVITY     ((u16)0x0100)
145 #define I2C_FLAG_STOP_DET     ((u16)0x0200)
146 #define I2C_FLAG_START_DET    ((u16)0x0400)
147 #define I2C_FLAG_GEN_CALL     ((u16)0x0800)
148 /// @}
149 
150 ////////////////////////////////////////////////////////////////////////////////
151 /// @defgroup I2C_Events
152 /// @{
153 #define I2C_EVENT_RX_UNDER     ((u16)0x0001)
154 #define I2C_EVENT_RX_OVER      ((u16)0x0002)
155 #define I2C_EVENT_RX_FULL      ((u16)0x0004)
156 #define I2C_EVENT_TX_OVER      ((u16)0x0008)
157 #define I2C_EVENT_TX_EMPTY     ((u16)0x0010)
158 #define I2C_EVENT_RD_REQ       ((u16)0x0020)
159 #define I2C_EVENT_TX_ABRT      ((u16)0x0040)
160 #define I2C_EVENT_RX_DONE      ((u16)0x0080)
161 #define I2C_EVENT_ACTIVITY     ((u16)0x0100)
162 #define I2C_EVENT_STOP_DET     ((u16)0x0200)
163 #define I2C_EVENT_START_DET    ((u16)0x0400)
164 #define I2C_EVENT_GEN_CALL     ((u16)0x0800)
165 /// @}
166 
167 ////////////////////////////////////////////////////////////////////////////////
168 /// @defgroup I2C_Statusflags_definition
169 /// @{
170 #define I2C_STATUS_FLAG_ACTIVITY    ((u16)0x8001)
171 #define I2C_STATUS_FLAG_TFNF        ((u16)0x8002)
172 #define I2C_STATUS_FLAG_TFE         ((u16)0x8004)
173 #define I2C_STATUS_FLAG_RFNE        ((u16)0x8008)
174 #define I2C_STATUS_FLAG_RFF         ((u16)0x8010)
175 #define I2C_STATUS_FLAG_M_ACTIVITY  ((u16)0x8020)
176 #define I2C_STATUS_FLAG_S_ACTIVITY  ((u16)0x8040)
177 /// @}
178 
179 
180 
181 #define IC_SLAVE_ENABLE                 (0x0000<<6)
182 #define IC_7BITADDR_MASTER              (0x0000<<4)
183 #define IC_7BITADDR_SLAVE               (0x0000<<3)
184 #define I2C_Speed_STANDARD              ((u16)0x0002)
185 #define I2C_Speed_FAST                  ((u16)0x0004)
186 #define I2C_Mode_MASTER                 ((u16)0x0001)
187 #define I2C_Mode_SLAVE                  ((u16)0x0000)
188 #define CMD_READ                        ((u16)0x0100)
189 #define CMD_WRITE                       ((u16)0x0000)
190 #define I2C_Mode_I2C                    ((u16)0x0000)
191 
192 /// @}
193 
194 ////////////////////////////////////////////////////////////////////////////////
195 /// @defgroup I2C_Exported_Variables
196 /// @{
197 #ifdef _HAL_I2C_C_
198 
199 #define GLOBAL
200 
201 static u8 I2C_CMD_DIR = 0;
202 u16       I2C_DMA_DIR = 0;
203 
204 #else
205 #define GLOBAL extern
206 #endif
207 
208 #undef GLOBAL
209 /// @}
210 
211 ////////////////////////////////////////////////////////////////////////////////
212 /// @defgroup I2C_Exported_Functions
213 /// @{
214 void I2C_DeInit(I2C_TypeDef* i2c);
215 void I2C_Init(I2C_TypeDef* i2c, I2C_InitTypeDef* init_struct);
216 void I2C_StructInit(I2C_InitTypeDef* init_struct);
217 void I2C_Cmd(I2C_TypeDef* i2c, FunctionalState state);
218 void I2C_DMACmd(I2C_TypeDef* i2c, FunctionalState state);
219 void I2C_GenerateSTART(I2C_TypeDef* i2c, FunctionalState state);
220 void I2C_GenerateSTOP(I2C_TypeDef* i2c, FunctionalState state);
221 void I2C_OwnAddress2Config(I2C_TypeDef* i2c, u8 addr);
222 void I2C_DualAddressCmd(I2C_TypeDef* i2c, FunctionalState state);
223 void I2C_GeneralCallCmd(I2C_TypeDef* i2c, FunctionalState state);
224 void I2C_ITConfig(I2C_TypeDef* i2c, u16 it, FunctionalState state);
225 void I2C_SendData(I2C_TypeDef* i2c, u8 dat);
226 void I2C_ReadCmd(I2C_TypeDef* i2c);
227 void I2C_Send7bitAddress(I2C_TypeDef* i2c, u8 addr, u8 dir);
228 void I2C_ClearFlag(I2C_TypeDef* i2c, u32 flag);
229 void I2C_ClearITPendingBit(I2C_TypeDef* i2c, u32 it);
230 
231 u8  I2C_ReceiveData(I2C_TypeDef* i2c);
232 u16 I2C_ReadRegister(I2C_TypeDef* i2c, u8 reg);
233 u32 I2C_GetLastEvent(I2C_TypeDef* i2c);
234 
235 ErrorStatus I2C_CheckEvent(I2C_TypeDef* i2c, u32 event);
236 FlagStatus  I2C_GetFlagStatus(I2C_TypeDef* i2c, u32 flag);
237 ITStatus    I2C_GetITStatus(I2C_TypeDef* i2c, u32 it);
238 
239 ////////////////////////////////////////////////////////////////////////////////
240 //          Extended function interface
241 ////////////////////////////////////////////////////////////////////////////////
242 void I2C_SendSlaveAddress(I2C_TypeDef* i2c, u8 addr);
243 void I2C_SlaveConfigure(I2C_TypeDef* i2c, FunctionalState state);
244 void I2C_DMAConfigure(I2C_TypeDef* i2c, u8 dir);
245 
246 
247 /// @}
248 
249 /// @}
250 
251 /// @}
252 
253 ////////////////////////////////////////////////////////////////////////////////
254 #endif //__HAL_I2C_H
255 ////////////////////////////////////////////////////////////////////////////////
256