Contiki 3.x
adxl345.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2010, Swedish Institute of Computer Science.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the Institute nor the names of its contributors
14  * may be used to endorse or promote products derived from this software
15  * without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  * This file is part of the Contiki operating system.
30  *
31  */
32 
33 /**
34  * \file
35  * Device drivers header file for adxl345 accelerometer in Zolertia Z1.
36  * \author
37  * Marcus Lundén, SICS <mlunden@sics.se>
38  * Enric Calvo, Zolertia <ecalvo@zolertia.com>
39  */
40 
41 #ifndef ADXL345_H_
42 #define ADXL345_H_
43 #include <stdio.h>
44 #include "dev/i2cmaster.h"
45 
46 #define DEBUGLEDS 0
47 #if DEBUGLEDS
48  #undef LEDS_ON(x)
49  #undef LEDS_OFF(x)
50  #define LEDS_ON(x) (LEDS_PxOUT &= ~x)
51  #define LEDS_OFF(x) (LEDS_PxOUT |= x)
52 #else
53  #undef LEDS_ON
54  #undef LEDS_OFF
55  #define LEDS_ON(x)
56  #define LEDS_OFF(x)
57 #endif
58 
59 #define LEDS_R 0x10
60 #define LEDS_G 0x40
61 #define LEDS_B 0x20
62 #define L_ON(x) (LEDS_PxOUT &= ~x)
63 #define L_OFF(x) (LEDS_PxOUT |= x)
64 
65 /* Used in accm_read_axis(), eg accm_read_axis(X_AXIS);*/
66 enum ADXL345_AXIS {
67  X_AXIS = 0,
68  Y_AXIS = 2,
69  Z_AXIS = 4,
70 };
71 
72 /* -------------------------------------------------------------------------- */
73 /* Init the accelerometer: ports, pins, registers, interrupts (none enabled), I2C,
74  default threshold values etc. */
75 void accm_init(void);
76 
77 /* Write to a register.
78  args:
79  reg register to write to
80  val value to write
81 */
82 void accm_write_reg(uint8_t reg, uint8_t val);
83 
84 /* Write several registers from a stream.
85  args:
86  len number of bytes to read
87  data pointer to where the data is read from
88  First byte in stream must be the register address to begin writing to.
89  The data is then written from the second byte and increasing. The address byte
90  is not included in length len. */
91 void accm_write_stream(uint8_t len, uint8_t *data);
92 
93 /* Read one register.
94  args:
95  reg what register to read
96  returns the value of the read register
97 */
98 uint8_t accm_read_reg(uint8_t reg);
99 
100 /* Read several registers in a stream.
101  args:
102  reg what register to start reading from
103  len number of bytes to read
104  whereto pointer to where the data is saved
105 */
106 void accm_read_stream(uint8_t reg, uint8_t len, uint8_t *whereto);
107 
108 /* Read an axis of the accelerometer (x, y or z). Return value is a signed 10 bit int.
109  The resolution of the acceleration measurement can be increased up to 13 bit, but
110  will change the data format of this read out. Refer to the data sheet if so is
111  wanted/needed. */
112 int16_t accm_read_axis(enum ADXL345_AXIS axis);
113 
114 /* Sets the g-range, ie the range the accelerometer measures (ie 2g means -2 to +2 g
115  on every axis). Possible values:
116  ADXL345_RANGE_2G
117  ADXL345_RANGE_4G
118  ADXL345_RANGE_8G
119  ADXL345_RANGE_16G
120  Example:
121  accm_set_grange(ADXL345_RANGE_4G);
122  */
123 void accm_set_grange(uint8_t grange);
124 
125 /* Map interrupt (FF, tap, dbltap etc) to interrupt pin (IRQ_INT1, IRQ_INT2).
126  This must come after accm_init() as the registers will otherwise be overwritten. */
127 void accm_set_irq(uint8_t int1, uint8_t int2);
128 
129 /* Macros for setting the pointers to callback functions from the interrupts.
130  The function will be called with an uint8_t as parameter, containing the interrupt
131  flag register from the ADXL345. That way, several interrupts can be mapped to
132  the same pin and be read from the */
133 #define ACCM_REGISTER_INT1_CB(ptr) accm_int1_cb = ptr;
134 #define ACCM_REGISTER_INT2_CB(ptr) accm_int2_cb = ptr;
135 /* -------------------------------------------------------------------------- */
136 /* Application definitions, change if required by application. */
137 
138 /* Interrupt suppress periods */
139 /*
140 // XXX Not used yet.
141 #define ADXL345_INT_OVERRUN_BACKOFF CLOCK_SECOND/8
142 #define ADXL345_INT_WATERMARK_BACKOFF CLOCK_SECOND/8
143 #define ADXL345_INT_FREEFALL_BACKOFF CLOCK_SECOND/8
144 #define ADXL345_INT_INACTIVITY_BACKOFF CLOCK_SECOND/8
145 #define ADXL345_INT_ACTIVITY_BACKOFF CLOCK_SECOND/8
146 #define ADXL345_INT_DOUBLETAP_BACKOFF CLOCK_SECOND/8
147 #define ADXL345_INT_TAP_BACKOFF CLOCK_SECOND/8
148 #define ADXL345_INT_DATAREADY_BACKOFF CLOCK_SECOND/8
149 */
150 /* Time after an interrupt that subsequent interrupts are suppressed. Should later
151  be turned into one specific time per type of interrupt (tap, freefall etc) */
152 #define SUPPRESS_TIME_INT1 CLOCK_SECOND/4
153 #define SUPPRESS_TIME_INT2 CLOCK_SECOND/4
154 
155 /* Suggested defaults according to the data sheet etc */
156 #define ADXL345_THRESH_TAP_DEFAULT 0x48 // 4.5g (0x30 == 3.0g) (datasheet: 3g++)
157 #define ADXL345_OFSX_DEFAULT 0x00 // for individual units calibration purposes
158 #define ADXL345_OFSY_DEFAULT 0x00
159 #define ADXL345_OFSZ_DEFAULT 0x00
160 #define ADXL345_DUR_DEFAULT 0x20 // 20 ms (datasheet: 10ms++)
161 #define ADXL345_LATENT_DEFAULT 0x50 // 100 ms (datasheet: 20ms++)
162 #define ADXL345_WINDOW_DEFAULT 0xFF // 320 ms (datasheet: 80ms++)
163 #define ADXL345_THRESH_ACT_DEFAULT 0x15 // 1.3g (62.5 mg/LSB)
164 #define ADXL345_THRESH_INACT_DEFAULT 0x08 // 0.5g (62.5 mg/LSB)
165 #define ADXL345_TIME_INACT_DEFAULT 0x02 // 2 s (1 s/LSB)
166 #define ADXL345_ACT_INACT_CTL_DEFAULT 0xFF // all axis involved, ac-coupled
167 #define ADXL345_THRESH_FF_DEFAULT 0x09 // 563 mg
168 #define ADXL345_TIME_FF_DEFAULT 0x20 // 160 ms
169 #define ADXL345_TAP_AXES_DEFAULT 0x07 // all axis, no suppression
170 
171 #define ADXL345_BW_RATE_DEFAULT (0x00|ADXL345_SRATE_100) // 100 Hz, normal operation
172 #define ADXL345_POWER_CTL_DEFAULT 0x28 // link bit set, no autosleep, start normal measuring
173 #define ADXL345_INT_ENABLE_DEFAULT 0x00 // no interrupts enabled
174 #define ADXL345_INT_MAP_DEFAULT 0x00 // all mapped to int_1
175 
176 /* XXX NB: In the data format register, data format of axis readings is chosen
177  between left or right justify. This affects the position of the MSB/LSB and is
178  different depending on g-range and resolution. If changed, make sure this is
179  reflected in the _read_axis() function. Also, the resolution can be increased
180  from 10 bit to at most 13 bit, but this also changes position of MSB etc on data
181  format so check this in read_axis() too. */
182 #define ADXL345_DATA_FORMAT_DEFAULT (0x00|ADXL345_RANGE_2G) // right-justify, 2g, 10-bit mode, int is active high
183 #define ADXL345_FIFO_CTL_DEFAULT 0x00 // FIFO bypass mode
184 
185 /* -------------------------------------------------------------------------- */
186 /* Reference definitions, should not be changed */
187 /* adxl345 slave address */
188 #define ADXL345_ADDR 0x53
189 
190 /* ADXL345 registers */
191 #define ADXL345_DEVID 0x00 // read only
192 /* registers 0x01 to 0x1C are reserved, do not access */
193 #define ADXL345_THRESH_TAP 0x1D
194 #define ADXL345_OFSX 0x1E
195 #define ADXL345_OFSY 0x1F
196 #define ADXL345_OFSZ 0x20
197 #define ADXL345_DUR 0x21
198 #define ADXL345_LATENT 0x22
199 #define ADXL345_WINDOW 0x23
200 #define ADXL345_THRESH_ACT 0x24
201 #define ADXL345_THRESH_INACT 0x25
202 #define ADXL345_TIME_INACT 0x26
203 #define ADXL345_ACT_INACT_CTL 0x27
204 #define ADXL345_THRESH_FF 0x28
205 #define ADXL345_TIME_FF 0x29
206 #define ADXL345_TAP_AXES 0x2A
207 #define ADXL345_ACT_TAP_STATUS 0x2B // read only
208 #define ADXL345_BW_RATE 0x2C
209 #define ADXL345_POWER_CTL 0x2D
210 #define ADXL345_INT_ENABLE 0x2E
211 #define ADXL345_INT_MAP 0x2F
212 #define ADXL345_INT_SOURCE 0x30 // read only
213 #define ADXL345_DATA_FORMAT 0x31
214 #define ADXL345_DATAX0 0x32 // read only, LSByte X, two's complement
215 #define ADXL345_DATAX1 0x33 // read only, MSByte X
216 #define ADXL345_DATAY0 0x34 // read only, LSByte Y
217 #define ADXL345_DATAY1 0x35 // read only, MSByte X
218 #define ADXL345_DATAZ0 0x36 // read only, LSByte Z
219 #define ADXL345_DATAZ1 0x37 // read only, MSByte X
220 #define ADXL345_FIFO_CTL 0x38
221 #define ADXL345_FIFO_STATUS 0x39 // read only
222 
223 /* ADXL345 interrupts */
224 #define ADXL345_INT_DISABLE 0X00 // used for disabling interrupts
225 #define ADXL345_INT_OVERRUN 0X01
226 #define ADXL345_INT_WATERMARK 0X02
227 #define ADXL345_INT_FREEFALL 0X04
228 #define ADXL345_INT_INACTIVITY 0X08
229 #define ADXL345_INT_ACTIVITY 0X10
230 #define ADXL345_INT_DOUBLETAP 0X20
231 #define ADXL345_INT_TAP 0X40
232 #define ADXL345_INT_DATAREADY 0X80
233 
234 /* Accelerometer hardware ports, pins and registers on the msp430 µC */
235 #define ADXL345_DIR P1DIR
236 #define ADXL345_PIN P1PIN
237 #define ADXL345_REN P1REN
238 #define ADXL345_SEL P1SEL
239 #define ADXL345_SEL2 P1SEL2
240 #define ADXL345_INT1_PIN (1<<6) // P1.6
241 #define ADXL345_INT2_PIN (1<<7) // P1.7
242 #define ADXL345_IES P1IES
243 #define ADXL345_IE P1IE
244 #define ADXL345_IFG P1IFG
245 #define ADXL345_VECTOR PORT1_VECTOR
246 
247 /* g-range for DATA_FORMAT register */
248 #define ADXL345_RANGE_2G 0x00
249 #define ADXL345_RANGE_4G 0x01
250 #define ADXL345_RANGE_8G 0x02
251 #define ADXL345_RANGE_16G 0x03
252 
253 
254 /* The adxl345 has programmable sample rates, but unexpected results may occur if the wrong
255  rate and I2C bus speed is used (see datasheet p 17). Sample rates in Hz. This
256  setting does not change the internal sampling rate, just how often it is piped
257  to the output registers (ie the interrupt features use the full sample rate
258  internally).
259 
260  Example use:
261  adxl345_set_reg(ADXL345_BW_RATE, ((_ADXL345_STATUS & LOW_POWER) | ADXL345_SRATE_50));
262  */
263 #define ADXL345_SRATE_3200 0x0F // XXX NB don't use at all as I2C data rate<= 400kHz (see datasheet)
264 #define ADXL345_SRATE_1600 0x0E // XXX NB don't use at all as I2C data rate<= 400kHz (see datasheet)
265 #define ADXL345_SRATE_800 0x0D // when I2C data rate == 400 kHz
266 #define ADXL345_SRATE_400 0x0C // when I2C data rate == 400 kHz
267 #define ADXL345_SRATE_200 0x0B // when I2C data rate >= 100 kHz
268 #define ADXL345_SRATE_100 0x0A // when I2C data rate >= 100 kHz
269 #define ADXL345_SRATE_50 0x09 // when I2C data rate >= 100 kHz
270 #define ADXL345_SRATE_25 0x08 // when I2C data rate >= 100 kHz
271 #define ADXL345_SRATE_12_5 0x07 // 12.5 Hz, when I2C data rate >= 100 kHz
272 #define ADXL345_SRATE_6_25 0x06 // when I2C data rate >= 100 kHz
273 #define ADXL345_SRATE_3_13 0x05 // when I2C data rate >= 100 kHz
274 #define ADXL345_SRATE_1_56 0x04 // when I2C data rate >= 100 kHz
275 #define ADXL345_SRATE_0_78 0x03 // when I2C data rate >= 100 kHz
276 #define ADXL345_SRATE_0_39 0x02 // when I2C data rate >= 100 kHz
277 #define ADXL345_SRATE_0_20 0x01 // when I2C data rate >= 100 kHz
278 #define ADXL345_SRATE_0_10 0x00 // 0.10 Hz, when I2C data rate >= 100 kHz
279 
280 /* Callback pointers for the interrupts */
281 extern void (*accm_int1_cb)(uint8_t reg);
282 extern void (*accm_int2_cb)(uint8_t reg);
283 
284 /* Interrupt 1 and 2 events; ADXL345 signals interrupt on INT1 or INT2 pins,
285  ISR is invoked and polls the accelerometer process which invokes the callbacks. */
286 extern process_event_t int1_event, int2_event; // static ?
287 
288 #define ACCM_INT1 0x01
289 #define ACCM_INT2 0x02
290 
291 
292 /* -------------------------------------------------------------------------- */
293 #endif /* ifndef ADXL345_H_ */
I2C communication device driver header file for Zolertia Z1 sensor node.