source: rtems/c/src/lib/libbsp/arm/lpc32xx/include/i2c.h @ c499856

4.115
Last change on this file since c499856 was c499856, checked in by Chris Johns <chrisj@…>, on 03/20/14 at 21:10:47

Change all references of rtems.com to rtems.org.

  • Property mode set to 100644
File size: 6.0 KB
RevLine 
[3103d4cb]1/**
2 * @file
3 *
4 * @ingroup lpc32xx_i2c
5 *
6 * @brief I2C support API.
7 */
8
9/*
10 * Copyright (c) 2010
11 * embedded brains GmbH
12 * Obere Lagerstr. 30
13 * D-82178 Puchheim
14 * Germany
15 * <rtems@embedded-brains.de>
16 *
17 * The license and distribution terms for this file may be
18 * found in the file LICENSE in this distribution or at
[c499856]19 * http://www.rtems.org/license/LICENSE.
[3103d4cb]20 */
21
22#ifndef LIBBSP_ARM_LPC32XX_I2C_H
23#define LIBBSP_ARM_LPC32XX_I2C_H
24
25#include <rtems.h>
26
27#include <bsp/lpc32xx.h>
28
29#ifdef __cplusplus
30extern "C" {
31#endif /* __cplusplus */
32
33/**
34 * @defgroup lpc32xx_i2c I2C Support
35 *
[2d6543d4]36 * @ingroup arm_lpc32xx
[3103d4cb]37 *
38 * @brief I2C Support
39 *
40 * All writes and reads will be performed in master mode.  Exclusive bus access
41 * will be assumed.
42 *
43 * @{
44 */
45
46/**
47 * @name I2C Clock Control Register (I2CCLK_CTRL)
48 *
49 * @{
50 */
51
[4a14d7b1]52#define I2CCLK_1_EN BSP_BIT32(0)
53#define I2CCLK_2_EN BSP_BIT32(1)
54#define I2CCLK_1_HIGH_DRIVE BSP_BIT32(2)
55#define I2CCLK_2_HIGH_DRIVE BSP_BIT32(3)
56#define I2CCLK_USB_HIGH_DRIVE BSP_BIT32(4)
[3103d4cb]57
58/** @} */
59
60/**
61 * @name I2C TX Data FIFO Register (I2Cn_TX)
62 *
63 * @{
64 */
65
[4a14d7b1]66#define I2C_TX_READ BSP_BIT32(0)
67#define I2C_TX_ADDR(val) BSP_FLD32(val, 1, 7)
68#define I2C_TX_START BSP_BIT32(8)
69#define I2C_TX_STOP BSP_BIT32(9)
[3103d4cb]70
71/** @} */
72
73/**
74 * @name I2C Status Register (I2Cn_STAT)
75 *
76 * @{
77 */
78
[4a14d7b1]79#define I2C_STAT_TDI BSP_BIT32(0)
80#define I2C_STAT_AFI BSP_BIT32(1)
81#define I2C_STAT_NAI BSP_BIT32(2)
82#define I2C_STAT_DRMI BSP_BIT32(3)
83#define I2C_STAT_DRSI BSP_BIT32(4)
84#define I2C_STAT_ACTIVE BSP_BIT32(5)
85#define I2C_STAT_SCL BSP_BIT32(6)
86#define I2C_STAT_SDA BSP_BIT32(7)
87#define I2C_STAT_RFF BSP_BIT32(8)
88#define I2C_STAT_RFE BSP_BIT32(9)
89#define I2C_STAT_TFF BSP_BIT32(10)
90#define I2C_STAT_TFE BSP_BIT32(11)
91#define I2C_STAT_TFFS BSP_BIT32(12)
92#define I2C_STAT_TFES BSP_BIT32(13)
[3103d4cb]93
94/** @} */
95
96/**
97 * @name I2C Control Register (I2Cn_CTRL)
98 *
99 * @{
100 */
101
[4a14d7b1]102#define I2C_CTRL_TDIE BSP_BIT32(0)
103#define I2C_CTRL_AFIE BSP_BIT32(1)
104#define I2C_CTRL_NAIE BSP_BIT32(2)
105#define I2C_CTRL_DRMIE BSP_BIT32(3)
106#define I2C_CTRL_DRSIE BSP_BIT32(4)
107#define I2C_CTRL_RFFIE BSP_BIT32(5)
108#define I2C_CTRL_RFDAIE BSP_BIT32(6)
109#define I2C_CTRL_TFFIO BSP_BIT32(7)
110#define I2C_CTRL_RESET BSP_BIT32(8)
111#define I2C_CTRL_SEVEN BSP_BIT32(9)
112#define I2C_CTRL_TFFSIE BSP_BIT32(10)
[3103d4cb]113
114/** @} */
115
116/**
117 * @brief Initializes the I2C module @a i2c.
118 *
119 * Valid @a clock_in_hz values are 100000 and 400000.
120 *
121 * @retval RTEMS_SUCCESSFUL Successful operation.
122 * @retval RTEMS_INVALID_ID Invalid @a i2c value.
123 * @retval RTEMS_INVALID_CLOCK Invalid @a clock_in_hz value.
124 */
125rtems_status_code lpc32xx_i2c_init(
126  volatile lpc32xx_i2c *i2c,
127  unsigned clock_in_hz
128);
129
130/**
131 * @brief Resets the I2C module @a i2c.
132 */
133void lpc32xx_i2c_reset(volatile lpc32xx_i2c *i2c);
134
135/**
136 * @brief Sets the I2C module @a i2c clock.
137 *
138 * Valid @a clock_in_hz values are 100000 and 400000.
139 *
140 * @retval RTEMS_SUCCESSFUL Successful operation.
141 * @retval RTEMS_INVALID_CLOCK Invalid @a clock_in_hz value.
142 */
143rtems_status_code lpc32xx_i2c_clock(
144  volatile lpc32xx_i2c *i2c,
145  unsigned clock_in_hz
146);
147
148/**
149 * @brief Starts a write transaction on the I2C module @a i2c.
150 *
151 * The address parameter @a addr must not contain the read/write bit.
152 *
153 * The error status may be delayed to the next
154 * lpc32xx_i2c_write_with_optional_stop() due to controller flaws.
155 *
156 * @retval RTEMS_SUCCESSFUL Successful operation.
157 * @retval RTEMS_IO_ERROR Received a NACK from the slave.
158 */
159rtems_status_code lpc32xx_i2c_write_start(
160  volatile lpc32xx_i2c *i2c,
161  unsigned addr
162);
163
164/**
165 * @brief Writes data via the I2C module @a i2c with optional stop.
166 *
167 * The error status may be delayed to the next
168 * lpc32xx_i2c_write_with_optional_stop() due to controller flaws.
169 *
170 * @retval RTEMS_SUCCESSFUL Successful operation.
171 * @retval RTEMS_IO_ERROR Received a NACK from the slave.
172 */
173rtems_status_code lpc32xx_i2c_write_with_optional_stop(
174  volatile lpc32xx_i2c *i2c,
175  const uint8_t *out,
176  size_t n,
177  bool stop
178);
179
180/**
181 * @brief Starts a read transaction on the I2C module @a i2c.
182 *
183 * The address parameter @a addr must not contain the read/write bit.
184 *
185 * The error status may be delayed to the next
186 * lpc32xx_i2c_read_with_optional_stop() due to controller flaws.
187 *
188 * @retval RTEMS_SUCCESSFUL Successful operation.
189 * @retval RTEMS_IO_ERROR Received a NACK from the slave.
190 */
191rtems_status_code lpc32xx_i2c_read_start(
192  volatile lpc32xx_i2c *i2c,
193  unsigned addr
194);
195
196/**
197 * @brief Reads data via the I2C module @a i2c with optional stop.
198 *
199 * @retval RTEMS_SUCCESSFUL Successful operation.
200 * @retval RTEMS_IO_ERROR Received a NACK from the slave.
201 * @retval RTEMS_NOT_IMPLEMENTED Stop is @a false.
202 */
203rtems_status_code lpc32xx_i2c_read_with_optional_stop(
204  volatile lpc32xx_i2c *i2c,
205  uint8_t *in,
206  size_t n,
207  bool stop
208);
209
210/**
211 * @brief Writes and reads data via the I2C module @a i2c.
212 *
213 * This will be one bus transaction.
214 *
215 * @retval RTEMS_SUCCESSFUL Successful operation.
216 * @retval RTEMS_IO_ERROR Received a NACK from the slave.
217 */
218rtems_status_code lpc32xx_i2c_write_and_read(
219  volatile lpc32xx_i2c *i2c,
220  unsigned addr,
221  const uint8_t *out,
222  size_t out_size,
223  uint8_t *in,
224  size_t in_size
225);
226
227/**
228 * @brief Writes data via the I2C module @a i2c.
229 *
230 * This will be one bus transaction.
231 *
232 * @retval RTEMS_SUCCESSFUL Successful operation.
233 * @retval RTEMS_IO_ERROR Received a NACK from the slave.
234 */
235static inline rtems_status_code lpc32xx_i2c_write(
236  volatile lpc32xx_i2c *i2c,
237  unsigned addr,
238  const uint8_t *out,
239  size_t out_size
240)
241{
242  return lpc32xx_i2c_write_and_read(i2c, addr, out, out_size, NULL, 0);
243}
244
245/**
246 * @brief Reads data via the I2C module @a i2c.
247 *
248 * This will be one bus transaction.
249 *
250 * @retval RTEMS_SUCCESSFUL Successful operation.
251 * @retval RTEMS_IO_ERROR Received a NACK from the slave.
252 */
253static inline rtems_status_code lpc32xx_i2c_read(
254  volatile lpc32xx_i2c *i2c,
255  unsigned addr,
256  uint8_t *in,
257  size_t in_size
258)
259{
260  return lpc32xx_i2c_write_and_read(i2c, addr, NULL, 0, in, in_size);
261}
262
263/** @} */
264
265#ifdef __cplusplus
266}
267#endif /* __cplusplus */
268
269#endif /* LIBBSP_ARM_LPC32XX_I2C_H */
Note: See TracBrowser for help on using the repository browser.