Contiki 2.5
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 "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 //XXX Temporary place for defines that are lacking in mspgcc4's gpio.h
66 #ifdef __GNUC__
67 #ifndef P1SEL2_
68  #define P1SEL2_ 0x0041 /* Port 1 Selection 2*/
69  sfrb(P1SEL2, P1SEL2_);
70 #endif
71 #endif
72 #ifdef __IAR_SYSTEMS_ICC__
73 #ifndef P1SEL2_
74 #define P1SEL2_ (0x0041u) /* Port 1 Selection 2*/
75 DEFC( P1SEL2 , P1SEL2_)
76 #endif
77 #endif
78 
79 
80 /* Used in accm_read_axis(), eg accm_read_axis(X_AXIS);*/
81 enum ADXL345_AXIS {
82  X_AXIS = 0,
83  Y_AXIS = 2,
84  Z_AXIS = 4,
85 };
86 
87 /* -------------------------------------------------------------------------- */
88 /* Init the accelerometer: ports, pins, registers, interrupts (none enabled), I2C,
89  default threshold values etc. */
90 void accm_init(void);
91 
92 /* Write to a register.
93  args:
94  reg register to write to
95  val value to write
96 */
97 void accm_write_reg(u8_t reg, u8_t val);
98 
99 /* Write several registers from a stream.
100  args:
101  len number of bytes to read
102  data pointer to where the data is read from
103  First byte in stream must be the register address to begin writing to.
104  The data is then written from the second byte and increasing. The address byte
105  is not included in length len. */
106 void accm_write_stream(u8_t len, u8_t *data);
107 
108 /* Read one register.
109  args:
110  reg what register to read
111  returns the value of the read register
112 */
113 u8_t accm_read_reg(u8_t reg);
114 
115 /* Read several registers in a stream.
116  args:
117  reg what register to start reading from
118  len number of bytes to read
119  whereto pointer to where the data is saved
120 */
121 void accm_read_stream(u8_t reg, u8_t len, u8_t *whereto);
122 
123 /* Read an axis of the accelerometer (x, y or z). Return value is a signed 10 bit int.
124  The resolution of the acceleration measurement can be increased up to 13 bit, but
125  will change the data format of this read out. Refer to the data sheet if so is
126  wanted/needed. */
127 int16_t accm_read_axis(enum ADXL345_AXIS axis);
128 
129 /* Sets the g-range, ie the range the accelerometer measures (ie 2g means -2 to +2 g
130  on every axis). Possible values:
131  ADXL345_RANGE_2G
132  ADXL345_RANGE_4G
133  ADXL345_RANGE_8G
134  ADXL345_RANGE_16G
135  Example:
136  accm_set_grange(ADXL345_RANGE_4G);
137  */
138 void accm_set_grange(u8_t grange);
139 
140 /* Map interrupt (FF, tap, dbltap etc) to interrupt pin (IRQ_INT1, IRQ_INT2).
141  This must come after accm_init() as the registers will otherwise be overwritten. */
142 void accm_set_irq(uint8_t int1, uint8_t int2);
143 
144 /* Macros for setting the pointers to callback functions from the interrupts.
145  The function will be called with an u8_t as parameter, containing the interrupt
146  flag register from the ADXL345. That way, several interrupts can be mapped to
147  the same pin and be read from the */
148 #define ACCM_REGISTER_INT1_CB(ptr) accm_int1_cb = ptr;
149 #define ACCM_REGISTER_INT2_CB(ptr) accm_int2_cb = ptr;
150 /* -------------------------------------------------------------------------- */
151 /* Application definitions, change if required by application. */
152 
153 /* Interrupt suppress periods */
154 /*
155 // XXX Not used yet.
156 #define ADXL345_INT_OVERRUN_BACKOFF CLOCK_SECOND/8
157 #define ADXL345_INT_WATERMARK_BACKOFF CLOCK_SECOND/8
158 #define ADXL345_INT_FREEFALL_BACKOFF CLOCK_SECOND/8
159 #define ADXL345_INT_INACTIVITY_BACKOFF CLOCK_SECOND/8
160 #define ADXL345_INT_ACTIVITY_BACKOFF CLOCK_SECOND/8
161 #define ADXL345_INT_DOUBLETAP_BACKOFF CLOCK_SECOND/8
162 #define ADXL345_INT_TAP_BACKOFF CLOCK_SECOND/8
163 #define ADXL345_INT_DATAREADY_BACKOFF CLOCK_SECOND/8
164 */
165 /* Time after an interrupt that subsequent interrupts are suppressed. Should later
166  be turned into one specific time per type of interrupt (tap, freefall etc) */
167 #define SUPPRESS_TIME_INT1 CLOCK_SECOND/4
168 #define SUPPRESS_TIME_INT2 CLOCK_SECOND/4
169 
170 /* Suggested defaults according to the data sheet etc */
171 #define ADXL345_THRESH_TAP_DEFAULT 0x48 // 4.5g (0x30 == 3.0g) (datasheet: 3g++)
172 #define ADXL345_OFSX_DEFAULT 0x00 // for individual units calibration purposes
173 #define ADXL345_OFSY_DEFAULT 0x00
174 #define ADXL345_OFSZ_DEFAULT 0x00
175 #define ADXL345_DUR_DEFAULT 0x20 // 20 ms (datasheet: 10ms++)
176 #define ADXL345_LATENT_DEFAULT 0x50 // 100 ms (datasheet: 20ms++)
177 #define ADXL345_WINDOW_DEFAULT 0xFF // 320 ms (datasheet: 80ms++)
178 #define ADXL345_THRESH_ACT_DEFAULT 0x15 // 1.3g (62.5 mg/LSB)
179 #define ADXL345_THRESH_INACT_DEFAULT 0x08 // 0.5g (62.5 mg/LSB)
180 #define ADXL345_TIME_INACT_DEFAULT 0x02 // 2 s (1 s/LSB)
181 #define ADXL345_ACT_INACT_CTL_DEFAULT 0xFF // all axis involved, ac-coupled
182 #define ADXL345_THRESH_FF_DEFAULT 0x09 // 563 mg
183 #define ADXL345_TIME_FF_DEFAULT 0x20 // 160 ms
184 #define ADXL345_TAP_AXES_DEFAULT 0x07 // all axis, no suppression
185 
186 #define ADXL345_BW_RATE_DEFAULT (0x00|ADXL345_SRATE_100) // 100 Hz, normal operation
187 #define ADXL345_POWER_CTL_DEFAULT 0x28 // link bit set, no autosleep, start normal measuring
188 #define ADXL345_INT_ENABLE_DEFAULT 0x00 // no interrupts enabled
189 #define ADXL345_INT_MAP_DEFAULT 0x00 // all mapped to int_1
190 
191 /* XXX NB: In the data format register, data format of axis readings is chosen
192  between left or right justify. This affects the position of the MSB/LSB and is
193  different depending on g-range and resolution. If changed, make sure this is
194  reflected in the _read_axis() function. Also, the resolution can be increased
195  from 10 bit to at most 13 bit, but this also changes position of MSB etc on data
196  format so check this in read_axis() too. */
197 #define ADXL345_DATA_FORMAT_DEFAULT (0x00|ADXL345_RANGE_2G) // right-justify, 2g, 10-bit mode, int is active high
198 #define ADXL345_FIFO_CTL_DEFAULT 0x00 // FIFO bypass mode
199 
200 /* -------------------------------------------------------------------------- */
201 /* Reference definitions, should not be changed */
202 /* adxl345 slave address */
203 #define ADXL345_ADDR 0x53
204 
205 /* ADXL345 registers */
206 #define ADXL345_DEVID 0x00 // read only
207 /* registers 0x01 to 0x1C are reserved, do not access */
208 #define ADXL345_THRESH_TAP 0x1D
209 #define ADXL345_OFSX 0x1E
210 #define ADXL345_OFSY 0x1F
211 #define ADXL345_OFSZ 0x20
212 #define ADXL345_DUR 0x21
213 #define ADXL345_LATENT 0x22
214 #define ADXL345_WINDOW 0x23
215 #define ADXL345_THRESH_ACT 0x24
216 #define ADXL345_THRESH_INACT 0x25
217 #define ADXL345_TIME_INACT 0x26
218 #define ADXL345_ACT_INACT_CTL 0x27
219 #define ADXL345_THRESH_FF 0x28
220 #define ADXL345_TIME_FF 0x29
221 #define ADXL345_TAP_AXES 0x2A
222 #define ADXL345_ACT_TAP_STATUS 0x2B // read only
223 #define ADXL345_BW_RATE 0x2C
224 #define ADXL345_POWER_CTL 0x2D
225 #define ADXL345_INT_ENABLE 0x2E
226 #define ADXL345_INT_MAP 0x2F
227 #define ADXL345_INT_SOURCE 0x30 // read only
228 #define ADXL345_DATA_FORMAT 0x31
229 #define ADXL345_DATAX0 0x32 // read only, LSByte X, two's complement
230 #define ADXL345_DATAX1 0x33 // read only, MSByte X
231 #define ADXL345_DATAY0 0x34 // read only, LSByte Y
232 #define ADXL345_DATAY1 0x35 // read only, MSByte X
233 #define ADXL345_DATAZ0 0x36 // read only, LSByte Z
234 #define ADXL345_DATAZ1 0x37 // read only, MSByte X
235 #define ADXL345_FIFO_CTL 0x38
236 #define ADXL345_FIFO_STATUS 0x39 // read only
237 
238 /* ADXL345 interrupts */
239 #define ADXL345_INT_DISABLE 0X00 // used for disabling interrupts
240 #define ADXL345_INT_OVERRUN 0X01
241 #define ADXL345_INT_WATERMARK 0X02
242 #define ADXL345_INT_FREEFALL 0X04
243 #define ADXL345_INT_INACTIVITY 0X08
244 #define ADXL345_INT_ACTIVITY 0X10
245 #define ADXL345_INT_DOUBLETAP 0X20
246 #define ADXL345_INT_TAP 0X40
247 #define ADXL345_INT_DATAREADY 0X80
248 
249 /* Accelerometer hardware ports, pins and registers on the msp430 µC */
250 #define ADXL345_DIR P1DIR
251 #define ADXL345_PIN P1PIN
252 #define ADXL345_REN P1REN
253 #define ADXL345_SEL P1SEL
254 #define ADXL345_SEL2 P1SEL2
255 #define ADXL345_INT1_PIN (1<<6) // P1.6
256 #define ADXL345_INT2_PIN (1<<7) // P1.7
257 #define ADXL345_IES P1IES
258 #define ADXL345_IE P1IE
259 #define ADXL345_IFG P1IFG
260 #define ADXL345_VECTOR PORT1_VECTOR
261 
262 /* g-range for DATA_FORMAT register */
263 #define ADXL345_RANGE_2G 0x00
264 #define ADXL345_RANGE_4G 0x01
265 #define ADXL345_RANGE_8G 0x02
266 #define ADXL345_RANGE_16G 0x03
267 
268 
269 /* The adxl345 has programmable sample rates, but unexpected results may occur if the wrong
270  rate and I2C bus speed is used (see datasheet p 17). Sample rates in Hz. This
271  setting does not change the internal sampling rate, just how often it is piped
272  to the output registers (ie the interrupt features use the full sample rate
273  internally).
274 
275  Example use:
276  adxl345_set_reg(ADXL345_BW_RATE, ((_ADXL345_STATUS & LOW_POWER) | ADXL345_SRATE_50));
277  */
278 #define ADXL345_SRATE_3200 0x0F // XXX NB don't use at all as I2C data rate<= 400kHz (see datasheet)
279 #define ADXL345_SRATE_1600 0x0E // XXX NB don't use at all as I2C data rate<= 400kHz (see datasheet)
280 #define ADXL345_SRATE_800 0x0D // when I2C data rate == 400 kHz
281 #define ADXL345_SRATE_400 0x0C // when I2C data rate == 400 kHz
282 #define ADXL345_SRATE_200 0x0B // when I2C data rate >= 100 kHz
283 #define ADXL345_SRATE_100 0x0A // when I2C data rate >= 100 kHz
284 #define ADXL345_SRATE_50 0x09 // when I2C data rate >= 100 kHz
285 #define ADXL345_SRATE_25 0x08 // when I2C data rate >= 100 kHz
286 #define ADXL345_SRATE_12_5 0x07 // 12.5 Hz, when I2C data rate >= 100 kHz
287 #define ADXL345_SRATE_6_25 0x06 // when I2C data rate >= 100 kHz
288 #define ADXL345_SRATE_3_13 0x05 // when I2C data rate >= 100 kHz
289 #define ADXL345_SRATE_1_56 0x04 // when I2C data rate >= 100 kHz
290 #define ADXL345_SRATE_0_78 0x03 // when I2C data rate >= 100 kHz
291 #define ADXL345_SRATE_0_39 0x02 // when I2C data rate >= 100 kHz
292 #define ADXL345_SRATE_0_20 0x01 // when I2C data rate >= 100 kHz
293 #define ADXL345_SRATE_0_10 0x00 // 0.10 Hz, when I2C data rate >= 100 kHz
294 
295 /* Callback pointers for the interrupts */
296 void (*accm_int1_cb)(u8_t reg);
297 void (*accm_int2_cb)(u8_t reg);
298 
299 /* Interrupt 1 and 2 events; ADXL345 signals interrupt on INT1 or INT2 pins,
300  ISR is invoked and polls the accelerometer process which invokes the callbacks. */
301 process_event_t int1_event, int2_event; // static ?
302 
303 #define ACCM_INT1 0x01
304 #define ACCM_INT2 0x02
305 
306 
307 /* -------------------------------------------------------------------------- */
308 #endif /* ifndef __ADXL345_H__ */
309