1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
|
/**
* @file i2c.h
* @brief Inter-integrated circuit (I2C) communications interface driver.
*/
/* ****************************************************************************
* Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
* OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
* Except as contained in this notice, the name of Maxim Integrated
* Products, Inc. shall not be used except as stated in the Maxim Integrated
* Products, Inc. Branding Policy.
*
* The mere transfer of this software does not imply any licenses
* of trade secrets, proprietary technology, copyrights, patents,
* trademarks, maskwork rights, or any other form of intellectual
* property whatsoever. Maxim Integrated Products, Inc. retains all
* ownership rights.
*
* $Date: 2019-06-28 09:42:42 -0500 (Fri, 28 Jun 2019) $
* $Revision: 44330 $
*
*************************************************************************** */
#ifndef _I2C_H_
#define _I2C_H_
#include <stdint.h>
#include "i2c_regs.h"
#include "mxc_sys.h"
/**
* @defgroup i2c I2C
* @ingroup periphlibs
* @{
*/
/***** Definitions *****/
/// @brief I2C Speed Modes
typedef enum {
I2C_STD_MODE = 100000, //!< 100KHz Bus Speed
I2C_FAST_MODE = 400000, //!< 400KHz Bus Speed
I2C_FASTPLUS_MODE = 1000000, //!< 1MHz Bus Speed
I2C_HS_MODE = 3400000 //!< 3.4MHz Bus Speed
} i2c_speed_t;
//State for Master
typedef enum {
I2C_STATE_READING = 0,
I2C_STATE_WRITING = 1
} i2c_state_t;
// @brief Enable/Disable TXFIFO Autoflush mode
typedef enum {
I2C_AUTOFLUSH_ENABLE = 0,
I2C_AUTOFLUSH_DISABLE = 1
} i2c_autoflush_disable_t;
// @brief I2C Transaction request.
typedef struct i2c_req i2c_req_t;
struct i2c_req {
uint8_t addr; /**< @parblock I2C 7-bit Address left aligned, bit 7 to bit 1.
* Only supports 7-bit addressing. LSb of the given address
* will be used as the read/write bit, the @p addr <b>will
* not be shifted</b>. Used for <em>both master</em> and
* @em slave transactions. @endparblock
*/
const uint8_t *tx_data; ///< Data for mater write/slave read.
uint8_t *rx_data; ///< Data for master read/slave write.
unsigned tx_len; ///< Length of tx data.
unsigned rx_len; ///< Length of rx.
unsigned tx_num; ///< Number of tx bytes sent.
unsigned rx_num; ///< Number of rx bytes sent.
i2c_state_t state; ///< Read or Write.
/**
* @details 0 to send a stop bit at the end of the transaction,
otherwise send a restart. Only used in master trasnactions.
*/
int restart; /**< @parblock Restart or stop bit indicator.
* @arg 0 to send a stop bit at the end of the transaction
* @arg Non-zero to send a restart at end of the transaction
* @note Only used for Master transactions.
* @endparblock
*/
i2c_autoflush_disable_t sw_autoflush_disable; ///< Enable/Disable autoflush.
/**
* @brief Callback for asynchronous request.
* @param i2c_req_t* Pointer to the transaction request.
* @param int Error code.
*/
void (*callback)(i2c_req_t*, int);
};
/***** Function Prototypes *****/
/**
* @brief Initialize and enable I2C.
* @param i2c Pointer to I2C peripheral registers.
* @param i2cspeed desired speed (I2C mode)
* @param sys_cfg System configuration object
* @returns \c #E_NO_ERROR if everything is successful,
* @ref MXC_Error_Codes if an error occurred.
*/
int I2C_Init(mxc_i2c_regs_t * i2c, i2c_speed_t i2cspeed, const sys_cfg_i2c_t* sys_cfg);
/**
* @brief Shutdown I2C module.
* @param i2c Pointer to the I2C registers.
* @returns #E_NO_ERROR I2C shutdown successfully, @ref MXC_Error_Codes "error" if
* unsuccessful.
*/
int I2C_Shutdown(mxc_i2c_regs_t *i2c);
/**
* @brief Master write data. Will block until transaction is complete.
* @param i2c Pointer to I2C regs.
* @param addr @parblock I2C 7-bit Address left aligned, bit 7 to bit 1.
* Only supports 7-bit addressing. LSb of the given address
* will be used as the read/write bit, the \p addr <b>will
* not be shifted</b>. Used for <em>both master</em> and
* @em slave transactions. @endparblock
* @param data Data to be written.
* @param len Number of bytes to Write.
* @param restart 0 to send a stop bit at the end of the transaction,
otherwise send a restart.
* @returns Bytes transacted if everything is successful,
* @ref MXC_Error_Codes if an error occurred.
*/
int I2C_MasterWrite(mxc_i2c_regs_t *i2c, uint8_t addr, const uint8_t* data, int len, int restart);
/**
* @brief Master read data. Will block until transaction is complete.
* @param i2c Pointer to I2C regs.
* @param addr @parblock I2C 7-bit Address left aligned, bit 7 to bit 1.
* Only supports 7-bit addressing. LSb of the given address
* will be used as the read/write bit, the @p addr <b>will
* not be shifted</b>. Used for <em>both master</em> and
* @em slave transactions. @endparblock
* @param data Data to be written.
* @param len Number of bytes to Write.
* @param restart 0 to send a stop bit at the end of the transaction,
otherwise send a restart.
* @returns Bytes transacted if everything is successful, @ref MXC_Error_Codes if an error occurred.
*/
int I2C_MasterRead(mxc_i2c_regs_t *i2c, uint8_t addr, uint8_t* data, int len, int restart);
/**
* @brief Slave read data. Will block until transaction is complete.
* @param i2c Pointer to I2C regs.
* @param addr @parblock I2C 7-bit Address left aligned, bit 7 to bit 1.
* Only supports 7-bit addressing. LSb of the given address
* will be used as the read/write bit, the @p addr <b>will
* not be shifted</b>. Used for <em>both master</em> and
* @em slave transactions. @endparblock
* @param read_data Buffer that the master will read from.
* @param read_len Number of bytes the master can read.
* @param write_data Buffer that the master will write to.
* @param write_len Number of bytes the master can write.
* @param tx_num Number of bytes transmitted by the slave.
* @param rx_num Number of bytes received by the slave.
* @param sw_autoflush_disable TX Autoflush enabled by default.Set this bit to disable autoflush manually.
* @returns #E_NO_ERROR if everything is successful, @ref MXC_Error_Codes if an error occurred.
*/
int I2C_Slave(mxc_i2c_regs_t *i2c, uint8_t addr, const uint8_t* read_data,
int read_len, uint8_t* write_data, int write_len, int* tx_num,
int* rx_num, i2c_autoflush_disable_t sw_autoflush_disable);
/**
* @brief Master Read and Write Asynchronous.
* @param i2c Pointer to I2C regs.
* @param req Request for an I2C transaction.
* @returns #E_NO_ERROR if everything is successful, @ref MXC_Error_Codes if an error occurred.
*/
int I2C_MasterAsync(mxc_i2c_regs_t *i2c, i2c_req_t *req);
/**
* @brief Slave Read and Write Asynchronous.
* @param i2c Pointer to I2C regs.
* @param req Request for an I2C transaction.
* @returns #E_NO_ERROR if everything is successful, @ref MXC_Error_Codes if an error occurred.
*/
int I2C_SlaveAsync(mxc_i2c_regs_t *i2c, i2c_req_t *req);
/**
* @brief I2C interrupt handler.
* @details This function should be called by the application from the interrupt
* handler if I2C interrupts are enabled. Alternately, this function
* can be periodically called by the application if I2C interrupts are
* disabled.
* @param i2c Base address of the I2C module.
*/
void I2C_Handler(mxc_i2c_regs_t *i2c);
/**
* @brief Drain all of the data in the RXFIFO.
* @param i2c Pointer to I2C regs.
*/
void I2C_DrainRX(mxc_i2c_regs_t *i2c);
/**
* @brief Drain all of the data in the TXFIFO.
* @param i2c Pointer to I2C regs.
*/
void I2C_DrainTX(mxc_i2c_regs_t *i2c);
/**
* @brief Abort Async request based on the request you want to abort.
* @param req Pointer to I2C Transaction.
*/
int I2C_AbortAsync(i2c_req_t *req);
/**
* @brief Enable and Set Timeout
*
* @param i2c pointer to I2C regs
* @param[in] us micro seconds to delay
*
* @return E_NO_ERROR or E_BAD_PARAM if delay is to long.
*/
int I2C_SetTimeout(mxc_i2c_regs_t *i2c, int us);
/**
* @brief clear and disable timeout
*
* @param i2c pointer to I2C regs
*/
void I2C_ClearTimeout(mxc_i2c_regs_t *i2c);
/**@} end of group i2c */
#endif /* _I2C_H_ */
|