Blame view

RIOT/boards/avsextrem/include/smb380-board.h 9.26 KB
fb11e647   vrobic   reseau statique a...
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_ */