Appiko
LSM6DS3.c
1 /*
2  * File: LSM6DS3.c
3  * Copyright (c) 2017, Electronut Labs All rights reserved.
4  * Copyright (c) 2018 Appiko
5  * Created on 26 February, 2019, 12:54 PM
6  * Author: Tejas Vasekar (https://github.com/tejas-tj)
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright notice,
13  * this list of conditions and the following disclaimer.
14  *
15  * 2. Redistributions in binary form must reproduce the above copyright notice,
16  * this list of conditions and the following disclaimer in the documentation
17  * and/or other materials provided with the distribution.
18  *
19  * 3. Neither the name of the copyright holder nor the names of its contributors
20  * may be used to endorse or promote products derived from this software without
21  * specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
27  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33  * POSSIBILITY OF SUCH DAMAGE
34  */
45 #include "stdlib.h"
46 #include "time.h"
47 #include "LSM6DS3.h"
48 #include "hal_twim.h"
49 #include "common_util.h"
50 #include "app_error.h"
51 #include "log.h"
52 #include "nrf_util.h"
53 #include "hal_nop_delay.h"
54 uint8_t who_am_i = 0;
55 static struct IMU_settings settings;
56 
57 uint8_t * p_lsm3d_ = (uint8_t *)LSM6DS3_ADDR;
58 
59 void twim_evt_handler (twim_err_t evt, twim_transfer_t transfer)
60 {
61 // log_printf("%s : %d, %d\n", __func__, evt, transfer);
62 }
63 
64 hal_twim_init_config_t LSM6D_twi_config =
65 {
66  .address = LSM6DS3_ADDR,
67  .irq_priority = APP_IRQ_PRIORITY_MID,
68  .evt_handler = twim_evt_handler,
69  .sda = SDA_PIN,
70  .scl = SCL_PIN,
71  .evt_mask = (TWIM_TX_RX_DONE_MSK|TWIM_RX_DONE_MSK|TWIM_TX_DONE_MSK),
72  .frequency = HAL_TWI_FREQ_100K,
73 };
74 
75 
76 
80 void LSM6DS3_who_am_i(void)
81 {
82  twim_ret_status err_code;
83  uint8_t p_wmi_reg = WHO_AM_I;
84 // log_printf("Pointer : %x\n",*p_wmi_reg);
85  err_code = hal_twim_tx_rx (&p_wmi_reg, sizeof(who_am_i), &who_am_i, sizeof(who_am_i));
86 
87 // err_code = read_register(p_twi_sensors, LSM6DS3_ADDR, WHO_AM_I, &who_am_i, 1, false);
88 
89  log_printf("Status : %d, %d\n", err_code, __LINE__);
90  hal_nop_delay_ms(10);
91  log_printf("%s : %x\n",__func__, who_am_i);
92 }
93 
94 
98 void LSM6DS3_init(void)
99 {
100  hal_twim_init (&LSM6D_twi_config);
101 
102  twim_ret_status err_code;
103 
104  settings.accel_enable = 1; // 0 - Disable. 1 - Enable
105  settings.accel_range = 2; // Full Scale(FS) range (in g). Select from: 2, 4, 8, 16
106  settings.accel_samplerate = 13; // Hz. Select from: 13, 26, 52, 104, 208, 416, 833, 1666
107  settings.accel_bandwidth = 100; // Hz. Select from: 50, 100, 200, 400
108  settings.accel_FIFO_enable = 0; // Set to include accelerometer data in FIFO buffer
109  settings.accel_FIFO_decimation = 0; // Set to activate.
110 
111  settings.gyro_enable = 0; // 0 - Disable. 1 - Enable
112  settings.gyro_range = 2000; // Angular Rate range (in deg/s). Can be: 125, 245, 500, 1000, 2000
113  settings.gyro_samplerate = 104; // Hz. Select from: 13, 26, 52, 104, 208, 416, 833, 1666
114  settings.gyro_bandwidth = 200; // Hz. Select from: 50, 100, 200, 400;
115  settings.gyro_FIFO_enable = 0; // Set to include gyroscope data in FIFO buffer
116  settings.gyro_FIFO_decimation = 0; // Set to activate.
117 
118  settings.temp_enable = 0; // Set to activate temperature measure
119 
120  //FIFO control data
121  settings.FIFO_threshold = 3000; //Can be 0 to 4096 (16 bit bytes)
122  settings.FIFO_samplerate = 13; //default 13Hz
123  settings.FIFO_mode = 6; //Default off
124 
125  uint8_t tx_data[2] = {MASTER_CONFIG, 0x01};
126 // err_code = nrf_drv_twi_tx(&p_twi_sensors, LSM6DS3_ADDR, tx_data, sizeof(tx_data), false);
127  err_code = hal_twim_tx (tx_data, sizeof(tx_data));
128  log_printf("Status : %d, %d\n", err_code, __LINE__);
129  hal_nop_delay_ms (10);
130 
131  // set IF_INC in CTRL3_C register.
132  tx_data[0] = CTRL3_C;
133  tx_data[1] = 0x04;
134  err_code = hal_twim_tx (tx_data, sizeof(tx_data));
135  log_printf("Status : %d, %d\n", err_code, __LINE__);
136  hal_nop_delay_ms (10);
137  LSM6DS3_config();
138 }
139 
153 void LSM6DS3_config(void)
154 {
155  twim_ret_status err_code;
156  uint8_t tx_data[2];
157 
158  // configure accelerometer
159  tx_data[0] = CTRL1_XL;
160  tx_data[1] = 0;
161  if(settings.accel_enable == 1) {
162  // Bandwidth
163  switch(settings.accel_bandwidth) {
164  case 50:
165  tx_data[1] |= LSM6DS3_IMU_BW_XL_50Hz;
166  break;
167 
168  case 100:
169  tx_data[1] |= LSM6DS3_IMU_BW_XL_100Hz;
170  break;
171 
172  case 200:
173  tx_data[1] |= LSM6DS3_IMU_BW_XL_200Hz;
174  break;
175 
176  default:
177  case 400:
178  tx_data[1] |= LSM6DS3_IMU_BW_XL_400Hz;
179  break;
180  }
181 
182  // Full scale range
183  switch(settings.accel_range) {
184  case 2:
185  tx_data[1] |= LSM6DS3_IMU_FS_XL_2g;
186  break;
187 
188  case 4:
189  tx_data[1] |= LSM6DS3_IMU_FS_XL_4g;
190  break;
191 
192  case 8:
193  tx_data[1] |= LSM6DS3_IMU_FS_XL_8g;
194  break;
195 
196  default:
197  case 16:
198  tx_data[1] |= LSM6DS3_IMU_FS_XL_16g;
199  break;
200  }
201 
202  // ODR
203  switch(settings.accel_samplerate) {
204 
205  case 0:
206  tx_data[1] |= LSM6DS3_IMU_ODR_XL_POWER_DOWN;
207  break;
208 
209  case 13:
210  tx_data[1] |= LSM6DS3_IMU_ODR_XL_13Hz;
211  break;
212 
213  case 26:
214  tx_data[1] |= LSM6DS3_IMU_ODR_XL_26Hz;
215  break;
216 
217  case 52:
218  tx_data[1] |= LSM6DS3_IMU_ODR_XL_52Hz;
219  break;
220 
221  default:
222  case 104:
223  tx_data[1] |= LSM6DS3_IMU_ODR_XL_104Hz;
224  break;
225 
226  case 208:
227  tx_data[1] |= LSM6DS3_IMU_ODR_XL_208Hz;
228  break;
229 
230  case 416:
231  tx_data[1] |= LSM6DS3_IMU_ODR_XL_416Hz;
232  break;
233 
234  case 833:
235  tx_data[1] |= LSM6DS3_IMU_ODR_XL_833Hz;
236  break;
237 
238  case 1660:
239  tx_data[1] |= LSM6DS3_IMU_ODR_XL_1660Hz;
240  break;
241 
242  case 3330:
243  tx_data[1] |= LSM6DS3_IMU_ODR_XL_3330Hz;
244  break;
245 
246  case 6660:
247  tx_data[1] |= LSM6DS3_IMU_ODR_XL_6660Hz;
248  break;
249  }
250  }
251  else {
252  tx_data[1] = 0;
253  }
254 
255 // err_code = nrf_drv_twi_tx(&p_twi_sensors, LSM6DS3_ADDR, tx_data, sizeof(tx_data), false);
256  err_code = hal_twim_tx (tx_data, sizeof(tx_data));
257  log_printf("Status : %d, %d\n", err_code, __LINE__);
258  hal_nop_delay_ms(10);
259 
260  // configure gyroscope
261  tx_data[0] = CTRL2_G;
262  tx_data[1] = 0;
263  if(settings.gyro_enable == 1) {
264  // range
265  switch(settings.gyro_range) {
266  case 125:
267  tx_data[1] |= LSM6DS3_IMU_FS_125_ENABLED;
268  break;
269 
270  case 245:
271  tx_data[1] |= LSM6DS3_IMU_FS_G_245dps;
272  break;
273 
274  case 500:
275  tx_data[1] |= LSM6DS3_IMU_FS_G_500dps;
276  break;
277 
278  case 1000:
279  tx_data[1] |= LSM6DS3_IMU_FS_G_1000dps;
280  break;
281 
282  default:
283  case 2000:
284  tx_data[1] |= LSM6DS3_IMU_FS_G_2000dps;
285  break;
286  }
287 
288  // ODR
289  switch(settings.gyro_samplerate) {
290  case 13:
291  tx_data[1] |= LSM6DS3_IMU_ODR_G_13Hz;
292  break;
293 
294  case 26:
295  tx_data[1] |= LSM6DS3_IMU_ODR_G_26Hz;
296  break;
297 
298  case 52:
299  tx_data[1] |= LSM6DS3_IMU_ODR_G_52Hz;
300  break;
301 
302  default:
303  case 104:
304  tx_data[1] |= LSM6DS3_IMU_ODR_G_104Hz;
305  break;
306 
307  case 208:
308  tx_data[1] |= LSM6DS3_IMU_ODR_G_208Hz;
309  break;
310 
311  case 416:
312  tx_data[1] |= LSM6DS3_IMU_ODR_G_416Hz;
313  break;
314 
315  case 833:
316  tx_data[1] |= LSM6DS3_IMU_ODR_G_833Hz;
317  break;
318 
319  case 1660:
320  tx_data[1] |= LSM6DS3_IMU_ODR_G_1660Hz;
321  break;
322  }
323  }
324  else {
325  tx_data[1] = 0;
326  }
327 
328  err_code = hal_twim_tx (tx_data, sizeof(tx_data));
329  log_printf("Status : %d, %d\n", err_code, __LINE__);
330  hal_nop_delay_ms(10);
331 }
332 
338 void LSM6DS3_set_accel_power_down_mode()
339 {
340  twim_ret_status err_code;
341  uint8_t rx_data;
342  uint8_t tx_data[2] = {CTRL1_XL, 0};
343 
344  // read CTRL1_XL register to obtain current parameters.
345  err_code = hal_twim_tx_rx ((uint8_t *)CTRL1_XL, 1, &rx_data, sizeof(rx_data));
346 // err_code = read_register(p_twi_sensors, LSM6DS3_ADDR, CTRL1_XL, &rx_data, sizeof(rx_data), false);
347  log_printf("Status : %d, %d\n", err_code, __LINE__);
348  hal_nop_delay_ms(10);
349 
350  // bit mask CTRL1_XL to avoid losing previously set parameters. Only change ODR_XL bits.
351  tx_data[1] |= (0x00 << 4) | (rx_data & 0x0F);
352 
353  err_code = hal_twim_tx (tx_data, sizeof(tx_data));
354 // err_code = nrf_drv_twi_tx(&p_twi_sensors, LSM6DS3_ADDR, tx_data, sizeof(tx_data), false);
355  log_printf("Status : %d, %d\n", err_code, __LINE__);
356  hal_nop_delay_ms(10);
357 }
358 
364 void LSM6DS3_set_accel_low_power_mode(uint16_t value)
365 {
366  twim_ret_status err_code;
367  uint8_t rx_data;
368  // uint8_t tx_data[2] = {CTRL1_XL, 0};
369  uint8_t tx_data[2];
370 
371  // set XL_HM_MODE bit to 1 in CTRL6_C to enable high performance mode.
372  tx_data[0] = CTRL6_C;
373  tx_data[1] = 0x10;
374 
375  err_code = hal_twim_tx (tx_data, sizeof(tx_data));
376 // err_code = nrf_drv_twi_tx(&p_twi_sensors, LSM6DS3_ADDR, tx_data, sizeof(tx_data), false);
377  log_printf("Status : %d, %d\n", err_code, __LINE__);
378  hal_nop_delay_ms(10);
379 
380 
381  // read CTRL1_XL register to obtain current parameters.
382 // err_code = read_register(p_twi_sensors, LSM6DS3_ADDR, CTRL1_XL, &rx_data, sizeof(rx_data), false);
383  err_code = hal_twim_tx_rx ((uint8_t *)CTRL1_XL, 1, &rx_data, sizeof(rx_data));
384  log_printf("Status : %d, %d\n", err_code, __LINE__);
385  hal_nop_delay_ms(10);
386 
387  tx_data[0] = CTRL1_XL;
388  // bit mask CTRL1_XL to avoid losing previously set parameters. Only change ODR_XL bits.
389  switch(value) {
390  case 13:
391  tx_data[1] |= (0x01 << 4) | (rx_data & 0x0F);
392  break;
393 
394  case 26:
395  tx_data[1] |= (0x02 << 4) | (rx_data & 0x0F);
396  break;
397 
398  default:
399  case 52:
400  tx_data[1] |= (0x03 << 4) | (rx_data & 0x0F);
401  break;
402  }
403 
404  err_code = hal_twim_tx (tx_data, sizeof(tx_data));
405 // err_code = nrf_drv_twi_tx(&p_twi_sensors, LSM6DS3_ADDR, tx_data, sizeof(tx_data), false);
406  log_printf("Status : %d, %d\n", err_code, __LINE__);
407  hal_nop_delay_ms(10);
408 }
409 
415 void LSM6DS3_set_accel_normal_mode(uint16_t value)
416 {
417  twim_ret_status err_code;
418  uint8_t rx_data;
419  // uint8_t tx_data[2] = {CTRL1_XL, 0};
420  uint8_t tx_data[2];
421 
422  // set XL_HM_MODE bit to 1 in CTRL6_C to enable high performance mode.
423  tx_data[0] = CTRL6_C;
424  tx_data[1] = 0x10;
425 
426  err_code = hal_twim_tx (tx_data, sizeof(tx_data));
427 // err_code = nrf_drv_twi_tx(&p_twi_sensors, LSM6DS3_ADDR, tx_data, sizeof(tx_data), false);
428  log_printf("Status : %d, %d\n", err_code, __LINE__);
429  hal_nop_delay_ms(10);
430 
431  // read CTRL1_XL register to obtain current parameters.
432 // err_code = read_register(p_twi_sensors, LSM6DS3_ADDR, CTRL1_XL, &rx_data, sizeof(rx_data), false);
433  err_code = hal_twim_tx_rx ((uint8_t *)CTRL1_XL, 1, &rx_data, sizeof(rx_data));
434  log_printf("Status : %d, %d\n", err_code, __LINE__);
435  hal_nop_delay_ms(10);
436 
437  tx_data[0] = CTRL1_XL;
438  // bit mask CTRL1_XL to avoid losing previously set parameters. Only change ODR_XL bits.
439  switch(value) {
440  default:
441  case 104:
442  tx_data[1] |= (0x04 << 4) | (rx_data & 0x0F);
443  break;
444 
445  case 208:
446  tx_data[1] |= (0x05 << 4) | (rx_data & 0x0F);
447  break;
448  }
449 
450  err_code = hal_twim_tx (tx_data, sizeof(tx_data));
451 // err_code = nrf_drv_twi_tx(&p_twi_sensors, LSM6DS3_ADDR, tx_data, sizeof(tx_data), false);
452  log_printf("Status : %d, %d\n", err_code, __LINE__);
453  hal_nop_delay_ms(10);
454 }
455 
461 void LSM6DS3_set_accel_high_performance_mode(uint16_t value)
462 {
463  twim_ret_status err_code;
464  uint8_t rx_data;
465  // uint8_t tx_data[2] = {CTRL1_XL, 0};
466  uint8_t tx_data[2];
467 
468  // set XL_HM_MODE bit to 1 in CTRL6_C to enable high performance mode.
469  tx_data[0] = CTRL6_C;
470  tx_data[1] = 0x00;
471 
472 // err_code = nrf_drv_twi_tx(&p_twi_sensors, LSM6DS3_ADDR, tx_data, sizeof(tx_data), false);
473  err_code = hal_twim_tx (tx_data, sizeof(tx_data));
474  log_printf("Status : %d, %d\n", err_code, __LINE__);
475  uint8_t ctrl1_xl = CTRL1_XL;
476  hal_nop_delay_ms(10);
477 
478  // read CTRL1_XL register to obtain current parameters.
479  err_code = hal_twim_tx_rx (&ctrl1_xl, 1, &rx_data, sizeof(rx_data));
480  log_printf("Status : %d, %d\n", err_code, __LINE__);
481  hal_nop_delay_ms(10);
482 
483  tx_data[0] = CTRL1_XL;
484  // bit mask CTRL1_XL to avoid losing previously set parameters. Only change ODR_XL bits.
485  switch(value) {
486  case 416:
487  tx_data[1] |= (0x06 << 4) | (rx_data & 0x0F);
488  break;
489 
490  case 833:
491  tx_data[1] |= (0x07 << 4) | (rx_data & 0x0F);
492  break;
493 
494  default:
495  case 1660:
496  tx_data[1] |= (0x08 << 4) | (rx_data & 0x0F);
497  break;
498 
499  case 3330:
500  tx_data[1] |= (0x09 << 4) | (rx_data & 0x0F);
501  break;
502 
503  case 6660:
504  tx_data[1] |= (0x0A << 4) | (rx_data & 0x0F);
505  break;
506  }
507 
508  err_code = hal_twim_tx (tx_data, sizeof(tx_data));
509 // err_code = nrf_drv_twi_tx(&p_twi_sensors, LSM6DS3_ADDR, tx_data, sizeof(tx_data), false);
510  log_printf("Status : %d, %d\n", err_code, __LINE__);
511  hal_nop_delay_ms(10);
512 }
513 
514 
518 void LSM6DS3_read_accl_data(int16_t *x_axis, int16_t *y_axis, int16_t *z_axis)
519 {
520  twim_ret_status err_code;
521 // uint8_t status = 0;
522  uint8_t data[6];
523 
524 // LSM6DS3_set_accel_high_performance_mode(settings.accel_samplerate);
525 
526 // do {
527 // err_code = read_register(p_twi_sensors, LSM6DS3_ADDR, STATUS_REG, &status, sizeof(status), false);
528 // uint8_t status_reg = STATUS_REG;
529 // err_code = hal_twim_tx_rx (&status_reg, 1, &status, sizeof(status));
530 // log_printf("Status : %d, %d\n", err_code, __LINE__);
531 // hal_nop_delay_ms(10);
532 // } while(!(status & 0x01));
533 
534  uint8_t outxl = OUTX_L_XL;
535 
536  err_code = hal_twim_tx_rx (&outxl, 1, data, sizeof(data));
537 // err_code = read_register(p_twi_sensors, LSM6DS3_ADDR, OUTX_L_XL, data, sizeof(data), true);
538 // log_printf("Status : %d, %d\n", err_code, __LINE__);
539  hal_nop_delay_ms(100);
540  if(err_code == 0)
541  {
542 
543  }
544 
545 // LSM6DS3_set_accel_power_down_mode();
546 
547  *x_axis = (data[1] << 8) | data[0];
548  *y_axis = (data[3] << 8) | data[2];
549  *z_axis = (data[5] << 8) | data[4];
550 }
551 
558 int16_t LSM6DS3_accelData_in_g(int16_t raw_data)
559 {
560  return (int16_t)((float)((raw_data * 0.061 * (settings.accel_range >> 1)) / 10 ));
561 }
562 
563 
567 //void LSM6DS3_set_gyro_sleep_mode()
568 //{
569 // twim_ret_status err_code;
570 //
571 // // set SLEEP_G bit in CTRL4_C register to enable sleep mode
572 // uint8_t tx_data[2] = {CTRL4_C, LSM6DS3_IMU_SLEEP_G_ENABLED};
573 //
574 // err_code = nrf_drv_twi_tx(&p_twi_sensors, LSM6DS3_ADDR, tx_data, sizeof(tx_data), false);
575 // log_printf("Status : %d, %d\n", err_code, __LINE__);
576 //}
577 //
581 //void LSM6DS3_set_gyro_active_mode()
582 //{
583 // twim_ret_status err_code;
584 //
585 // // reset SLEEP_G bit in CTRL4_C register to disable sleep mode
586 // uint8_t tx_data[2] = {CTRL4_C, LSM6DS3_IMU_SLEEP_G_DISABLED};
587 //
588 // err_code = nrf_drv_twi_tx(&p_twi_sensors, LSM6DS3_ADDR, tx_data, sizeof(tx_data), false);
589 // log_printf("Status : %d, %d\n", err_code, __LINE__);
590 //}
591 //
595 //void LSM6DS3_read_gyro_data(int16_t *gyro_x, int16_t *gyro_y, int16_t *gyro_z)
596 //{
597 // twim_ret_status err_code;
598 // uint8_t status = 0;
599 // uint8_t data[6];
600 //
601 // LSM6DS3_set_gyro_active_mode();
602 //
603 // do {
605 // } while(!(status & 0x02));
606 //
607 // err_code = read_register(p_twi_sensors, LSM6DS3_ADDR, OUTX_L_G, data, sizeof(data), true);
608 // log_printf("Status : %d, %d\n", err_code, __LINE__);
609 //
610 // LSM6DS3_set_gyro_sleep_mode();
611 //
612 // *gyro_x = (data[1] << 8) | data[0];
613 // *gyro_y = (data[3] << 8) | data[2];
614 // *gyro_z = (data[5] << 8) | data[4];
615 //}
616 //
623 //float LSM6DS3_gyroData_in_dps(int16_t raw_data)
624 //{
625 // uint8_t gyro_range_divisor;
626 //
627 // if (settings.gyro_range == 245) {
628 // gyro_range_divisor = 2;
629 // }
630 // else {
631 // gyro_range_divisor = settings.gyro_range / 125;
632 // }
633 //
634 // return ((float) ((raw_data * 4.375 * gyro_range_divisor) / 1000 ));
635 //}
636 //
640 //void LSM6DS3_FIFO_config(void)
641 //{
642 // twim_ret_status err_code;
643 // uint8_t tx_data[2];
644 //
645 // // masking the threshold value in FIFO_CTRL1 register.
646 // tx_data[0] = FIFO_CTRL1;
647 // tx_data[1] = settings.FIFO_threshold & 0x00FF;
648 // err_code = nrf_drv_twi_tx(&p_twi_sensors, LSM6DS3_ADDR, tx_data, sizeof(tx_data), false);
649 // log_printf("Status : %d, %d\n", err_code, __LINE__);
650 //
651 // // masking the threshold value in FIFO_CTRL2 register.
652 // tx_data[0] = FIFO_CTRL2;
653 // tx_data[1] = (settings.FIFO_threshold & 0x0F00) >> 8;
654 // err_code = nrf_drv_twi_tx(&p_twi_sensors, LSM6DS3_ADDR, tx_data, sizeof(tx_data), false);
655 // log_printf("Status : %d, %d\n", err_code, __LINE__);
656 //
657 // // set up decimation factor for accelerometer and gyroscope
658 // tx_data[0] = FIFO_CTRL3;
659 // tx_data[1] = 0;
660 // if(settings.accel_FIFO_enable == 1) {
661 // tx_data[1] |= (settings.accel_FIFO_decimation & 0x07);
662 // }
663 //
664 // if (settings.gyro_FIFO_enable == 1) {
665 // tx_data[1] |= ((settings.gyro_FIFO_decimation & 0x07) << 3);
666 // }
667 // err_code = nrf_drv_twi_tx(&p_twi_sensors, LSM6DS3_ADDR, tx_data, sizeof(tx_data), false);
668 // log_printf("Status : %d, %d\n", err_code, __LINE__);
669 //
670 // // configure sensor hub (if any)
671 // // set decimation and ONLY_HIGH_DATA bit here
672 // // tx_data[0] = FIFO_CTRL4;
673 //
674 // // configure FIFO_CTRL5 register
675 // tx_data[0] = FIFO_CTRL5;
676 // // set FIFO ODR
677 // tx_data[1] = 0;
678 // switch(settings.FIFO_samplerate) {
679 // default:
680 // case 13:
681 // tx_data[1] |= LSM6DS3_IMU_ODR_FIFO_13Hz;
682 // break;
683 //
684 // case 26:
685 // tx_data[1] |= LSM6DS3_IMU_ODR_FIFO_26Hz;
686 // break;
687 //
688 // case 52:
689 // tx_data[1] |= LSM6DS3_IMU_ODR_FIFO_52Hz;
690 // break;
691 //
692 // case 104:
693 // tx_data[1] |= LSM6DS3_IMU_ODR_FIFO_104Hz;
694 // break;
695 //
696 // case 208:
697 // tx_data[1] |= LSM6DS3_IMU_ODR_FIFO_208Hz;
698 // break;
699 //
700 // case 416:
701 // tx_data[1] |= LSM6DS3_IMU_ODR_FIFO_416Hz;
702 // break;
703 //
704 // case 833:
705 // tx_data[1] |= LSM6DS3_IMU_ODR_FIFO_833Hz;
706 // break;
707 //
708 // case 1660:
709 // tx_data[1] |= LSM6DS3_IMU_ODR_FIFO_1660Hz;
710 // break;
711 //
712 // case 3330:
713 // tx_data[1] |= LSM6DS3_IMU_ODR_FIFO_3330Hz;
714 // break;
715 //
716 // case 6660:
717 // tx_data[1] |= LSM6DS3_IMU_ODR_FIFO_6660Hz;
718 // break;
719 // }
720 //
721 // // set FIFO mode
722 // switch(settings.FIFO_mode) {
723 // default:
724 // case 0:
725 // tx_data[1] |= LSM6DS3_IMU_FIFO_MODE_BYPASS;
726 // break;
727 //
728 // case 1:
729 // tx_data[1] |= LSM6DS3_IMU_FIFO_MODE_FIFO;
730 // break;
731 //
732 // case 3:
733 // tx_data[1] |= LSM6DS3_IMU_FIFO_MODE_STF;
734 // break;
735 //
736 // case 4:
737 // tx_data[1] |= LSM6DS3_IMU_FIFO_MODE_BTS;
738 // break;
739 //
740 // case 6:
741 // tx_data[1] |= LSM6DS3_IMU_FIFO_MODE_STREAM;
742 // break;
743 // }
744 // err_code = nrf_drv_twi_tx(&p_twi_sensors, LSM6DS3_ADDR, tx_data, sizeof(tx_data), false);
745 // log_printf("Status : %d, %d\n", err_code, __LINE__);
746 //}
747 
751 //uint16_t LSM6DS3_read_FIFO_status(void)
752 //{
753 // twim_ret_status err_code;
754 // uint8_t data[2];
755 // //uint8_t tx_data[2];
756 // uint16_t status = 0;
757 //
758 // /*// set BDU bit in CTRL3_C registers
759 // tx_data[0] = CTRL3_C;
760 // tx_data[1] = 0x40;
761 // err_code = nrf_drv_twi_tx(&p_twi_sensors, LSM6DS3_ADDR, tx_data, sizeof(tx_data), false);
762 // log_printf("Status : %d, %d\n", err_code, __LINE__);*/
763 //
764 // // read FIFO_STATUS1 and FIFO_STATUS2 registers
765 // err_code = read_register(p_twi_sensors, LSM6DS3_ADDR, FIFO_STATUS1, data, sizeof(data), true);
766 // log_printf("Status : %d, %d\n", err_code, __LINE__);
767 // status = (data[1] << 8) | data[0];
768 //
769 // return status;
770 //}
771 
775 //int16_t LSM6DS3_read_FIFO_buffer()
776 //{
777 // twim_ret_status err_code;
778 // uint8_t read_data[2];
779 // int16_t data = 0;
780 //
781 // // read FIFO_DATA_OUT_L and FIFO_DATA_OUT_H registers
782 // err_code = read_register(p_twi_sensors, LSM6DS3_ADDR, FIFO_DATA_OUT_L, read_data, sizeof(read_data), true);
783 // log_printf("Status : %d, %d\n", err_code, __LINE__);
784 // data = (read_data[1] << 8) | read_data[0];
785 //
786 // return data;
787 //}
788 
792 //void LSM6DS3_clear_FIFO_buffer(void)
793 //{
794 // // Read FIFO data and dump it.
795 // while((LSM6DS3_read_FIFO_status() & 0x1000) == 0) {
796 // LSM6DS3_read_FIFO_buffer();
797 // }
798 //}
799 
803 //void LSM6DS3_tap_detect_config()
804 //{
805 // twim_ret_status err_code;
806 // uint8_t tx_data[2];
807 //
808 // // Enable tap detection on X, Y, Z axis, but do not latch output
809 // tx_data[0] = TAP_CFG;
810 // tx_data[1] = 0x0E;
811 // err_code = nrf_drv_twi_tx(&p_twi_sensors, LSM6DS3_ADDR, tx_data, sizeof(tx_data), false);
812 // log_printf("Status : %d, %d\n", err_code, __LINE__);
813 //
814 // // Set tap threshold
815 // tx_data[0] = TAP_THRS_6D;
816 // tx_data[1] = 0x03;
817 // err_code = nrf_drv_twi_tx(&p_twi_sensors, LSM6DS3_ADDR, tx_data, sizeof(tx_data), false);
818 // log_printf("Status : %d, %d\n", err_code, __LINE__);
819 //
820 // // Set Duration, Quiet and Shock time windows
821 // tx_data[0] = INT_DUR2;
822 // tx_data[1] = 0x7F;
823 // err_code = nrf_drv_twi_tx(&p_twi_sensors, LSM6DS3_ADDR, tx_data, sizeof(tx_data), false);
824 // log_printf("Status : %d, %d\n", err_code, __LINE__);
825 //
826 // // Single & Double tap enabled (SINGLE_DOUBLE_TAP = 1)
827 // tx_data[0] = WAKE_UP_THRS;
828 // tx_data[1] = 0x80;
829 // err_code = nrf_drv_twi_tx(&p_twi_sensors, LSM6DS3_ADDR, tx_data, sizeof(tx_data), false);
830 // log_printf("Status : %d, %d\n", err_code, __LINE__);
831 //
832 // // Single tap interrupt driven to INT1 pin -- enable latch
833 // tx_data[0] = MD2_CFG;
834 // tx_data[1] = 0x48;
835 // err_code = nrf_drv_twi_tx(&p_twi_sensors, LSM6DS3_ADDR, tx_data, sizeof(tx_data), false);
836 // log_printf("Status : %d, %d\n", err_code, __LINE__);
837 //}
twim_transfer_t
Defines for the types of transfers possible.
Definition: hal_twim.h:61
100 kbps
Definition: hal_twim.h:54
twim_err_t
Defines for the types of errors possible during TWI transactions.
Definition: hal_twim.h:69
twim_ret_status
Defines for the return values for the transfer calls.
Definition: hal_twim.h:77
twim_ret_status hal_twim_tx_rx(uint8_t *tx_ptr, uint32_t tx_len, uint8_t *rx_ptr, uint32_t rx_len)
Start a Tx TWI transfer followed by a Rx by repeated start.
Definition: hal_twim.c:236
Structure for the TWI master driver initialization.
Definition: hal_twim.h:94
void hal_twim_init(hal_twim_init_config_t *config)
Function for initializing and enabling one of the TWIM peripheral.
Definition: hal_twim.c:100
twim_ret_status hal_twim_tx(uint8_t *tx_ptr, uint32_t tx_len)
Start a Tx only TWI transfer.
Definition: hal_twim.c:184