smb380-board.h
9.26 KB
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
251
252
253
254
255
256
257
258
/*
* msba2acc-smb380.h - Definitions of the Driver for the SMB380 acceleration
* sensor.
* Copyright (C) 2013 Freie Universität Berlin
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
**/
/**
* @file
* @internal
* @brief SMB380 acceleration sensor definitions for the LPC2387
*
* @author Marco Ziegert <ziegert@inf.fu-berlin.de>
* @author Zakaria Kasmi <zkasmi@inf.fu-berlin.de>
*
*/
#ifndef SMB380_H_
#define SMB380_H_
#include <stdint.h>
#include "bitarithm.h"
#ifdef __cplusplus
extern "C" {
#endif
#define SMB380_DEBUG_MESSAGE "SMB380 Driver Error: "
#define MSG_TYPE_SMB380_WAKEUP 814
#define SMB380_X_AXIS 0 /* X Axis-Name */
#define SMB380_Y_AXIS 1 /* Y Axis-Name */
#define SMB380_Z_AXIS 2 /* Z Axis-Name */
#define LPM_PREVENT_SLEEP_ACCSENSOR BIT2
enum SMB380_MODE {
SMB380_POLL,
SMB380_POLL_AFTER_CONTINOUS,
SMB380_CONTINOUS,
SMB380_THRESHOLD,
SMB380_FALSEALERT
};
volatile enum SMB380_MODE smb380_mode;
/* Writeable values to EEPROM: from 0x0A (control1) to 0x1D (offset_T).
For writing enable ... flag and add eeprom_offset_address.
Generally it is a good idea to read out shared register addresses before writing,
registers 0x14 and 34h are especially critical.
*/
#define SMB380_EEPROM_OFFSET 0x20
/* Chip-ID Bit0-2, default: 010b */
#define SMB380_CHIP_ID 0x00
/* Chip-ID mask */
#define SMB380_CHIP_ID_MASK 0x07
/* ml_version Bit0-3 ; al_version Bit4-7 */
#define SMB380_AL_ML_VERSION 0x01
#define SMB380_AL_MASK 0xF0
#define SMB380_ML_MASK 0x0F
/* LSB_acc_x Bit6-7; new_data_x Bit0 */
#define SMB380_ACC_X_LSB_NEWDATA 0x02
/* MSB_acc_x Bit0-7 */
#define SMB380_ACC_X_MSB 0x03
/* LSB_acc_y Bit6-7; new_data_y Bit0 */
#define SMB380_ACC_Y_LSB_NEWDATA 0x04
/* MSB_acc_y Bit0-7 */
#define SMB380_ACC_Y_MSB 0x05
/* LSB_acc_z Bit6-7; new_data_z Bit0 */
#define SMB380_ACC_Z_LSB_NEWDATA 0x06
/* MSB_acc_z Bit0-7 */
#define SMB380_ACC_Z_MSB 0x07
#define SMB380_ACC_LSB_MASK 0xC0
#define SMB380_ACC_MSB_MASK 0xFF
#define SMB380_ACC_NEWDATA_MASK 0x01
/* Temperature Bit0-7 */
#define SMB380_TEMP 0x08
/* Status register, contains six flags */
#define SMB380_STATUS 0x09
#define SMB380_STATUS_ST_RESULT_MASK 0x80
#define SMB380_STATUS_ALERT_PHASE_MASK 0x10
#define SMB380_STATUS_LG_LATCHED_MASK 0x08
#define SMB380_STATUS_HG_LATCHED_MASK 0x04
#define SMB380_STATUS_STATUS_LG_MASK 0x02
#define SMB380_STATUS_STATUS_HG_MASK 0x01
/* Control register - contains seven values, default: x000 0000b */
#define SMB380_CONTROL1 0x0A
#define SMB380_CONTROL1_RESET_INT_MASK 0x40
#define SMB380_CONTROL1_UPDATE_MASK 0x20
#define SMB380_CONTROL1_EE_W_MASK 0x10
#define SMB380_CONTROL1_SELF_TEST_1_MASK 0x08
#define SMB380_CONTROL1_SELF_TEST_0_MASK 0x04
#define SMB380_CONTROL1_SOFT_RESET_MASK 0x02
#define SMB380_CONTROL1_SLEEP_MASK 0x01
/* Control register - contains six values, default: x000 0011b */
#define SMB380_CONTROL2 0x0B
#define SMB380_CONTROL2_ALERT_MASK 0x80
#define SMB380_CONTROL2_ANY_MOTION_MASK 0x40
#define SMB380_CONTROL2_COUNTER_HG_MASK 0x30
#define SMB380_CONTROL2_COUNTER_LG_MASK 0x0C
#define SMB380_CONTROL2_ENABLE_HG_MASK 0x02
#define SMB380_CONTROL2_ENABLE_LG_MASK 0x01
/* default: 20 */
#define SMB380_LG_THRES 0x0C
/* default: 150 */
#define SMB380_LG_DUR 0x0D
/* default: 160 */
#define SMB380_HG_THRES 0x0E
/* default: 150 */
#define SMB380_HG_DUR 0x0F
/* default: 0 */
#define SMB380_ANY_MOTION_THRES 0x10
/* default: 0000 0000b */
#define SMB380_ANY_MOTION_DUR_HYST 0x1
#define SMB380_ANY_MOTION_DUR_MASK 0xC0
#define SMB380_ANY_MOTION_DUR_HG_HYST_MASK 0x38
#define SMB380_ANY_MOTION_DUR_LG_HYST_MASK 0x07
/* default: 162 */
#define SMB380_CUST1 0x12
/* default: 13 */
#define SMB380_CUST2 0x13
/* default: xxx0 1110b */
#define SMB380_CONTROL3 0x14
#define SMB380_CONTROL3_RANGE_MASK 0x18
#define SMB380_CONTROL3_BANDWITH_MASK 0x07
/* default: 1000 0000b */
#define SMB380_CONTROL4 0x15
#define SMB380_CONTROL4_SPI4_MASK 0x80
#define SMB380_CONTROL4_ENABLE_ADV_INT_MASK 0x40
#define SMB380_CONTROL4_NEW_DATA_INT_MASK 0x20
#define SMB380_CONTROL4_LATCH_INT_MASK 0x10
#define SMB380_CONTROL4_SHADOW_DIS_MASK 0x08
#define SMB380_CONTROL4_WAKEUP_PAUSE_MASK 0x06
#define SMB380_CONTROL4_WAKEUP_MASK 0x01
#define SMB380_OFFSET_LSB_GAIN_X 0x16
#define SMB380_OFFSET_LSB_GAIN_Y 0x17
#define SMB380_OFFSET_LSB_GAIN_Z 0x18
#define SMB380_OFFSET_LSB_GAIN_T 0x19
#define SMB380_OFFSET_LSB_MASK 0xC0
#define SMB380_OFFSET_GAIN_MASK 0x3F
#define SMB380_OFFSET_MSB_X 0x1A
#define SMB380_OFFSET_MSB_Y 0x1B
#define SMB380_OFFSET_MSB_Z 0x1C
#define SMB380_OFFSET_MSB_T 0x1D
#define SMB380_TEMP_OFFSET -30
#define SMB380_DEFAULT_MAXG 4.0f
#define SMB380_READ_REGISTER 0x00
#define SMB380_WRITE_REGISTER 0x01
#define SMB380_WAKE_UP_PAUSE_20MS 0x00
#define SMB380_WAKE_UP_PAUSE_80MS 0x01
#define SMB380_WAKE_UP_PAUSE_320MS 0x02
#define SMB380_WAKE_UP_PAUSE_2560MS 0x03
#define SMB380_RANGE_2G 0x00
#define SMB380_RANGE_4G 0x01
#define SMB380_RANGE_8G 0x02
#define SMB380_BAND_WIDTH_25HZ 0x00
#define SMB380_BAND_WIDTH_50HZ 0x01
#define SMB380_BAND_WIDTH_100HZ 0x02
#define SMB380_BAND_WIDTH_190HZ 0x03
#define SMB380_BAND_WIDTH_375HZ 0x04
#define SMB380_BAND_WIDTH_750HZ 0x05
#define SMB380_BAND_WIDTH_1500HZ 0x06
/* SMB380_RING_BUFF_SIZE * int16_t (2Byte) * 4 (x,y,z,Temp) = 512 Byte (for 64) */
#define SMB380_RING_BUFF_SIZE 256
/* TODO chsnge size to 2048 */
#define SMB380_RING_BUFF_MAX_THREADS 10
#define SMB380_SAMPLE_RATE_MAX 3000
/*
* change from Header (public) to internal use (private)
* (use it after every write to EEPROM).
* set update_image Bit in control1 to
* copie content from EEPROM (0x2B to 0x3D) to Image (0x0B to 0x1D)
**/
void SMB380_update_image(void);
/*
* change from Header (public) to internal use (private)
* set ee_w Bit in control1 to
* enable read to 0x16 to 0x22 and
* enable write to 0x16 to 0x3D
**/
void SMB380_enable_eeprom_default(void);
/* Example Hysterese function */
uint8_t SMB380_HystereseFunctionSample(int16_t *value);
/* Simple api for single-sample, single thread interrupt mode */
uint8_t SMB380_init_simple(uint16_t samplerate, uint8_t bandwidth,
uint8_t range);
/* Enables Interrupts (normally only once called) */
uint8_t SMB380_init(uint8_t (*func)(int16_t *));
void SMB380_setSampleRate(uint16_t rate);
uint16_t SMB380_getSampleRate(void);
void freeRingReadPointer(void);
void actualizeRingReadPointer(void);
uint8_t readRingBuff(int16_t *value);
uint8_t writeRingBuff(int16_t *value);
void SMB380_activateDynRangeSet(uint8_t activate);
uint8_t checkRange(int16_t *value);
void SMB380_enableEEPROM(void);
void SMB380_disableEEPROM(void);
/* getter */
float SMB380_getSampleRatio(void);
void SMB380_getAcceleration(unsigned char axis, int16_t *pAbs, int16_t *pMg);
int16_t SMB380_getTemperature(void);
unsigned char SMB380_getChipID(void);
unsigned char SMB380_getWakeUpPause(void);
unsigned char SMB380_getBandWidth(void);
int16_t SMB380_getBandWidthAbs(void);
unsigned char SMB380_getRange(void);
unsigned char SMB380_getCustomerReg(void);
unsigned char SMB380_readOffset(uint16_t *offset);
unsigned char SMB380_readOffsetTemp(uint16_t *offset);
unsigned char SMB380_readGain(uint16_t *gain);
unsigned char SMB380_readGainTemp(uint16_t *gain);
/* setter */
void SMB380_setTempOffset(uint16_t offset, uint8_t EEPROM);
void SMB380_setWakeUpPause(unsigned char duration);
void SMB380_setBandWidth(unsigned char bandWidth);
void SMB380_setRange(unsigned char range);
void SMB380_softReset(void);
void SMB380_setCustomerReg(unsigned char data);
void SMB380_setUpperLimit(void);
void SMB380_enableUpperLimit(void);
void SMB380_disableUpperLimit(void);
void SMB380_enableLowerLimit(void);
void SMB380_disableLowerLimit(void);
uint8_t SMB380_setAnyMotionLimit(uint16_t mg, uint16_t gvalueint);
void SMB380_enableAnyMotionLimit(void);
void SMB380_disableAnyMotionLimit(void);
void SMB380_enableNewDataInt(void);
void SMB380_disableNewDataInt(void);
void SMB380_resetInterruptFlags(void);
void SMB380_writeOffset(uint16_t *offset, uint8_t EEPROM);
void SMB380_writeOffsetTemp(uint16_t *offset, uint8_t EEPROM);
/* stats */
void SMB380_ShowMemory(void);
void SMB380_Selftest_1(void);
#ifdef __cplusplus
}
#endif
#endif /* SMB380_H_ */