49 #include "common_util.h" 50 #include "app_error.h" 53 #include "hal_nop_delay.h" 55 static struct IMU_settings settings;
57 uint8_t * p_lsm3d_ = (uint8_t *)LSM6DS3_ADDR;
67 .irq_priority = APP_IRQ_PRIORITY_MID,
68 .evt_handler = twim_evt_handler,
71 .evt_mask = (TWIM_TX_RX_DONE_MSK|TWIM_RX_DONE_MSK|TWIM_TX_DONE_MSK),
80 void LSM6DS3_who_am_i(
void)
83 uint8_t p_wmi_reg = WHO_AM_I;
85 err_code =
hal_twim_tx_rx (&p_wmi_reg,
sizeof(who_am_i), &who_am_i,
sizeof(who_am_i));
89 log_printf(
"Status : %d, %d\n", err_code, __LINE__);
91 log_printf(
"%s : %x\n",__func__, who_am_i);
98 void LSM6DS3_init(
void)
104 settings.accel_enable = 1;
105 settings.accel_range = 2;
106 settings.accel_samplerate = 13;
107 settings.accel_bandwidth = 100;
108 settings.accel_FIFO_enable = 0;
109 settings.accel_FIFO_decimation = 0;
111 settings.gyro_enable = 0;
112 settings.gyro_range = 2000;
113 settings.gyro_samplerate = 104;
114 settings.gyro_bandwidth = 200;
115 settings.gyro_FIFO_enable = 0;
116 settings.gyro_FIFO_decimation = 0;
118 settings.temp_enable = 0;
121 settings.FIFO_threshold = 3000;
122 settings.FIFO_samplerate = 13;
123 settings.FIFO_mode = 6;
125 uint8_t tx_data[2] = {MASTER_CONFIG, 0x01};
128 log_printf(
"Status : %d, %d\n", err_code, __LINE__);
129 hal_nop_delay_ms (10);
132 tx_data[0] = CTRL3_C;
135 log_printf(
"Status : %d, %d\n", err_code, __LINE__);
136 hal_nop_delay_ms (10);
153 void LSM6DS3_config(
void)
159 tx_data[0] = CTRL1_XL;
161 if(settings.accel_enable == 1) {
163 switch(settings.accel_bandwidth) {
165 tx_data[1] |= LSM6DS3_IMU_BW_XL_50Hz;
169 tx_data[1] |= LSM6DS3_IMU_BW_XL_100Hz;
173 tx_data[1] |= LSM6DS3_IMU_BW_XL_200Hz;
178 tx_data[1] |= LSM6DS3_IMU_BW_XL_400Hz;
183 switch(settings.accel_range) {
185 tx_data[1] |= LSM6DS3_IMU_FS_XL_2g;
189 tx_data[1] |= LSM6DS3_IMU_FS_XL_4g;
193 tx_data[1] |= LSM6DS3_IMU_FS_XL_8g;
198 tx_data[1] |= LSM6DS3_IMU_FS_XL_16g;
203 switch(settings.accel_samplerate) {
206 tx_data[1] |= LSM6DS3_IMU_ODR_XL_POWER_DOWN;
210 tx_data[1] |= LSM6DS3_IMU_ODR_XL_13Hz;
214 tx_data[1] |= LSM6DS3_IMU_ODR_XL_26Hz;
218 tx_data[1] |= LSM6DS3_IMU_ODR_XL_52Hz;
223 tx_data[1] |= LSM6DS3_IMU_ODR_XL_104Hz;
227 tx_data[1] |= LSM6DS3_IMU_ODR_XL_208Hz;
231 tx_data[1] |= LSM6DS3_IMU_ODR_XL_416Hz;
235 tx_data[1] |= LSM6DS3_IMU_ODR_XL_833Hz;
239 tx_data[1] |= LSM6DS3_IMU_ODR_XL_1660Hz;
243 tx_data[1] |= LSM6DS3_IMU_ODR_XL_3330Hz;
247 tx_data[1] |= LSM6DS3_IMU_ODR_XL_6660Hz;
257 log_printf(
"Status : %d, %d\n", err_code, __LINE__);
258 hal_nop_delay_ms(10);
261 tx_data[0] = CTRL2_G;
263 if(settings.gyro_enable == 1) {
265 switch(settings.gyro_range) {
267 tx_data[1] |= LSM6DS3_IMU_FS_125_ENABLED;
271 tx_data[1] |= LSM6DS3_IMU_FS_G_245dps;
275 tx_data[1] |= LSM6DS3_IMU_FS_G_500dps;
279 tx_data[1] |= LSM6DS3_IMU_FS_G_1000dps;
284 tx_data[1] |= LSM6DS3_IMU_FS_G_2000dps;
289 switch(settings.gyro_samplerate) {
291 tx_data[1] |= LSM6DS3_IMU_ODR_G_13Hz;
295 tx_data[1] |= LSM6DS3_IMU_ODR_G_26Hz;
299 tx_data[1] |= LSM6DS3_IMU_ODR_G_52Hz;
304 tx_data[1] |= LSM6DS3_IMU_ODR_G_104Hz;
308 tx_data[1] |= LSM6DS3_IMU_ODR_G_208Hz;
312 tx_data[1] |= LSM6DS3_IMU_ODR_G_416Hz;
316 tx_data[1] |= LSM6DS3_IMU_ODR_G_833Hz;
320 tx_data[1] |= LSM6DS3_IMU_ODR_G_1660Hz;
329 log_printf(
"Status : %d, %d\n", err_code, __LINE__);
330 hal_nop_delay_ms(10);
338 void LSM6DS3_set_accel_power_down_mode()
342 uint8_t tx_data[2] = {CTRL1_XL, 0};
345 err_code =
hal_twim_tx_rx ((uint8_t *)CTRL1_XL, 1, &rx_data,
sizeof(rx_data));
347 log_printf(
"Status : %d, %d\n", err_code, __LINE__);
348 hal_nop_delay_ms(10);
351 tx_data[1] |= (0x00 << 4) | (rx_data & 0x0F);
355 log_printf(
"Status : %d, %d\n", err_code, __LINE__);
356 hal_nop_delay_ms(10);
364 void LSM6DS3_set_accel_low_power_mode(uint16_t value)
372 tx_data[0] = CTRL6_C;
377 log_printf(
"Status : %d, %d\n", err_code, __LINE__);
378 hal_nop_delay_ms(10);
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);
387 tx_data[0] = CTRL1_XL;
391 tx_data[1] |= (0x01 << 4) | (rx_data & 0x0F);
395 tx_data[1] |= (0x02 << 4) | (rx_data & 0x0F);
400 tx_data[1] |= (0x03 << 4) | (rx_data & 0x0F);
406 log_printf(
"Status : %d, %d\n", err_code, __LINE__);
407 hal_nop_delay_ms(10);
415 void LSM6DS3_set_accel_normal_mode(uint16_t value)
423 tx_data[0] = CTRL6_C;
428 log_printf(
"Status : %d, %d\n", err_code, __LINE__);
429 hal_nop_delay_ms(10);
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);
437 tx_data[0] = CTRL1_XL;
442 tx_data[1] |= (0x04 << 4) | (rx_data & 0x0F);
446 tx_data[1] |= (0x05 << 4) | (rx_data & 0x0F);
452 log_printf(
"Status : %d, %d\n", err_code, __LINE__);
453 hal_nop_delay_ms(10);
461 void LSM6DS3_set_accel_high_performance_mode(uint16_t value)
469 tx_data[0] = CTRL6_C;
474 log_printf(
"Status : %d, %d\n", err_code, __LINE__);
475 uint8_t ctrl1_xl = CTRL1_XL;
476 hal_nop_delay_ms(10);
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);
483 tx_data[0] = CTRL1_XL;
487 tx_data[1] |= (0x06 << 4) | (rx_data & 0x0F);
491 tx_data[1] |= (0x07 << 4) | (rx_data & 0x0F);
496 tx_data[1] |= (0x08 << 4) | (rx_data & 0x0F);
500 tx_data[1] |= (0x09 << 4) | (rx_data & 0x0F);
504 tx_data[1] |= (0x0A << 4) | (rx_data & 0x0F);
510 log_printf(
"Status : %d, %d\n", err_code, __LINE__);
511 hal_nop_delay_ms(10);
518 void LSM6DS3_read_accl_data(int16_t *x_axis, int16_t *y_axis, int16_t *z_axis)
534 uint8_t outxl = OUTX_L_XL;
539 hal_nop_delay_ms(100);
547 *x_axis = (data[1] << 8) | data[0];
548 *y_axis = (data[3] << 8) | data[2];
549 *z_axis = (data[5] << 8) | data[4];
558 int16_t LSM6DS3_accelData_in_g(int16_t raw_data)
560 return (int16_t)((float)((raw_data * 0.061 * (settings.accel_range >> 1)) / 10 ));
twim_transfer_t
Defines for the types of transfers possible.
twim_err_t
Defines for the types of errors possible during TWI transactions.
twim_ret_status
Defines for the return values for the transfer calls.
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.
Structure for the TWI master driver initialization.
void hal_twim_init(hal_twim_init_config_t *config)
Function for initializing and enabling one of the TWIM peripheral.
twim_ret_status hal_twim_tx(uint8_t *tx_ptr, uint32_t tx_len)
Start a Tx only TWI transfer.