#include "app_config.h" #include "asm/clock.h" #include "asm/cpu.h" #include "generic/typedef.h" #include "generic/gpio.h" #include "typedef.h" #include "system/includes.h" #include "media/includes.h" #include "asm/iic_hw.h" #include "asm/iic_soft.h" #include "asm/timer.h" #include "imuSensor_manage.h" #include "lsm6dsl.h" // #include "spi1.h" // #include "port_wkup.h" #if TCFG_LSM6DSL_ENABLE /*************Betterlife ic debug***********/ #undef LOG_TAG_CONST #define LOG_TAG "[LSM6DSL]" #define LOG_ERROR_ENABLE #define LOG_INFO_ENABLE #include "debug.h" void delay(volatile u32 t); void udelay(u32 us); #define MDELAY(n) mdelay(n) static lsm6dsl_param *lsm6dsl_info; #if (LSM6DSL_USER_INTERFACE==LSM6DSL_USE_I2C) #if TCFG_LSM6DSL_USER_IIC_TYPE #define iic_init(iic) hw_iic_init(iic) #define iic_uninit(iic) hw_iic_uninit(iic) #define iic_start(iic) hw_iic_start(iic) #define iic_stop(iic) hw_iic_stop(iic) #define iic_tx_byte(iic, byte) hw_iic_tx_byte(iic, byte) #define iic_rx_byte(iic, ack) hw_iic_rx_byte(iic, ack) #define iic_read_buf(iic, buf, len) hw_iic_read_buf(iic, buf, len) #define iic_write_buf(iic, buf, len) hw_iic_write_buf(iic, buf, len) #define iic_suspend(iic) hw_iic_suspend(iic) #define iic_resume(iic) hw_iic_resume(iic) #else #define iic_init(iic) soft_iic_init(iic) #define iic_uninit(iic) soft_iic_uninit(iic) #define iic_start(iic) soft_iic_start(iic) #define iic_stop(iic) soft_iic_stop(iic) #define iic_tx_byte(iic, byte) soft_iic_tx_byte(iic, byte) #define iic_rx_byte(iic, ack) soft_iic_rx_byte(iic, ack) #define iic_read_buf(iic, buf, len) soft_iic_read_buf(iic, buf, len) #define iic_write_buf(iic, buf, len) soft_iic_write_buf(iic, buf, len) #define iic_suspend(iic) soft_iic_suspend(iic) #define iic_resume(iic) soft_iic_resume(iic) #endif //起止信号间隔:standard mode(100khz):4.7us; fast mode(400khz):1.3us //return: readLen:ok, other:fail u16 lsm6dsl_I2C_Read_NBytes(unsigned char devAddr, unsigned char regAddr, unsigned char *readBuf, u16 readLen) { u16 i = 0; local_irq_disable(); iic_start(lsm6dsl_info->iic_hdl); if (0 == iic_tx_byte(lsm6dsl_info->iic_hdl, devAddr)) { log_error("lsm6dsl iic read err1"); goto __iic_exit_r; } delay(lsm6dsl_info->iic_delay); /* if (0 == iic_tx_byte(lsm6dsl_info->iic_hdl, regAddr |0x80)) {//|0x80地址自动递增 */ if (0 == iic_tx_byte(lsm6dsl_info->iic_hdl, regAddr)) {//|0x80地址自动递增 log_error("lsm6dsl iic read err2"); goto __iic_exit_r; } delay(lsm6dsl_info->iic_delay); iic_start(lsm6dsl_info->iic_hdl); if (0 == iic_tx_byte(lsm6dsl_info->iic_hdl, devAddr + 1)) { log_error("lsm6dsl iic read err3"); goto __iic_exit_r; } for (i = 0; i < readLen; i++) { delay(lsm6dsl_info->iic_delay); if (i == (readLen - 1)) { *readBuf++ = iic_rx_byte(lsm6dsl_info->iic_hdl, 0); } else { *readBuf++ = iic_rx_byte(lsm6dsl_info->iic_hdl, 1); } /* if(i%100==0)wdt_clear(); */ } __iic_exit_r: iic_stop(lsm6dsl_info->iic_hdl); local_irq_enable(); return i; } //起止信号间隔:standard mode(100khz):4.7us; fast mode(400khz):1.3us //return:writeLen:ok, other:fail u16 lsm6dsl_I2C_Write_NBytes(unsigned char devAddr, unsigned char regAddr, unsigned char *writeBuf, u16 writeLen) { u16 i = 0; local_irq_disable(); iic_start(lsm6dsl_info->iic_hdl); if (0 == iic_tx_byte(lsm6dsl_info->iic_hdl, devAddr)) { log_error("lsm6dsl iic write err1"); goto __iic_exit_w; } delay(lsm6dsl_info->iic_delay); if (0 == iic_tx_byte(lsm6dsl_info->iic_hdl, regAddr)) { log_error("lsm6dsl iic write err2"); goto __iic_exit_w; } for (i = 0; i < writeLen; i++) { delay(lsm6dsl_info->iic_delay); if (0 == iic_tx_byte(lsm6dsl_info->iic_hdl, writeBuf[i])) { log_error("lsm6dsl iic write err3:%d", i); goto __iic_exit_w; } } __iic_exit_w: iic_stop(lsm6dsl_info->iic_hdl); local_irq_enable(); return i; } //起止信号间隔:standard mode(100khz):4.7us; fast mode(400khz):1.3us //return:1:ok, 0:fail unsigned char lsm6dsl_I2C_Write_Byte(unsigned char devAddr, //芯片支持1byte写 unsigned char regAddr, unsigned char byte) { u8 ret = 1; local_irq_disable(); iic_start(lsm6dsl_info->iic_hdl); if (0 == iic_tx_byte(lsm6dsl_info->iic_hdl, devAddr)) { log_error("lsm6dsl iic write err1"); ret = 0; goto __iic_exit_w; } delay(lsm6dsl_info->iic_delay); if (0 == iic_tx_byte(lsm6dsl_info->iic_hdl, regAddr)) { log_error("lsm6dsl iic write err2"); ret = 0; goto __iic_exit_w; } delay(lsm6dsl_info->iic_delay); if (0 == iic_tx_byte(lsm6dsl_info->iic_hdl, byte)) { log_error("lsm6dsl iic write err3"); ret = 0; goto __iic_exit_w; } __iic_exit_w: iic_stop(lsm6dsl_info->iic_hdl); local_irq_enable(); return ret; } IMU_read lsm6dsl_read = lsm6dsl_I2C_Read_NBytes; IMU_write lsm6dsl_write = lsm6dsl_I2C_Write_Byte; #elif (LSM6DSL_USER_INTERFACE==LSM6DSL_USE_SPI) #define spi_cs_init() \ do { \ gpio_write(lsm6dsl_info->spi_cs_pin, 1); \ gpio_set_direction(lsm6dsl_info->spi_cs_pin, 0); \ gpio_set_die(lsm6dsl_info->spi_cs_pin, 1); \ } while (0) #define spi_cs_uninit() \ do { \ gpio_set_die(lsm6dsl_info->spi_cs_pin, 0); \ gpio_set_direction(lsm6dsl_info->spi_cs_pin, 1); \ gpio_set_pull_up(lsm6dsl_info->spi_cs_pin, 0); \ gpio_set_pull_down(lsm6dsl_info->spi_cs_pin, 0); \ } while (0) #define spi_cs_h() gpio_write(lsm6dsl_info->spi_cs_pin, 1) #define spi_cs_l() gpio_write(lsm6dsl_info->spi_cs_pin, 0) #define spi_read_byte() spi_recv_byte(lsm6dsl_info->spi_hdl, NULL) #define spi_write_byte(x) spi_send_byte(lsm6dsl_info->spi_hdl, x) #define spi_dma_read(x, y) spi_dma_recv(lsm6dsl_info->spi_hdl, x, y) #define spi_dma_write(x, y) spi_dma_send(lsm6dsl_info->spi_hdl, x, y) #define spi_set_width(x) spi_set_bit_mode(lsm6dsl_info->spi_hdl, x) #define spi_init() spi_open(lsm6dsl_info->spi_hdl) #define spi_closed() spi_close(lsm6dsl_info->spi_hdl) #define spi_suspend() hw_spi_suspend(lsm6dsl_info->spi_hdl) #define spi_resume() hw_spi_resume(lsm6dsl_info->spi_hdl) u16 lsm6dsl_SPI_readNBytes(unsigned char devAddr, unsigned char regAddr, unsigned char *readBuf, u16 readLen) { spi_cs_l(); spi_write_byte(regAddr | 0x80);//| 0x80:read mode spi_dma_read(readBuf, readLen); spi_cs_h(); return (readLen); } unsigned char lsm6dsl_SPI_writeByte(unsigned char devAddr, unsigned char regAddr, unsigned char writebyte) { spi_cs_l(); spi_write_byte(regAddr); spi_write_byte(writebyte); spi_cs_h(); udelay(5);//delay5us return (1); } u16 lsm6dsl_SPI_writeNBytes(unsigned char devAddr, unsigned char regAddr, unsigned char *writeBuf, u16 writeLen) { #if 1 //多字节dma写 spi_cs_l(); spi_write_byte(regAddr); spi_dma_write(writeBuf, writeLen); spi_cs_h(); #else u16 i = 0; for (; i < writeLen; i++) { lsm6dsl_SPI_writeByte(devAddr, regAddr + i, writeBuf[i]); } #endif //SPIWrite((regAddr & 0x7F), writeBuf, writeLen); return (i); } IMU_read lsm6dsl_read = lsm6dsl_SPI_readNBytes; IMU_write lsm6dsl_write = lsm6dsl_SPI_writeByte; #endif static int32_t platform_write(void *handle, uint8_t Reg, uint8_t *Bufp, uint16_t len) { /* if(handle==iic){} */ #if (LSM6DSL_USER_INTERFACE==LSM6DSL_USE_I2C) return lsm6dsl_I2C_Write_NBytes(LSM6DSL_IIC_SLAVE_ADDRESS, Reg, Bufp, len); #elif (LSM6DSL_USER_INTERFACE==LSM6DSL_USE_SPI) return lsm6dsl_SPI_writeNBytes(0, Reg, Bufp, len); #endif } static int32_t platform_read(void *handle, uint8_t Reg, uint8_t *Bufp, uint16_t len) { /* if(handle==iic){} */ #if (LSM6DSL_USER_INTERFACE==LSM6DSL_USE_I2C) return lsm6dsl_I2C_Read_NBytes(LSM6DSL_IIC_SLAVE_ADDRESS, Reg, Bufp, len); #elif (LSM6DSL_USER_INTERFACE==LSM6DSL_USE_SPI) return lsm6dsl_SPI_readNBytes(0, Reg, Bufp, len); #endif } lsm6dsl_ctx_t lsm6dsl_ctx = { .write_reg = platform_write, .read_reg = platform_read, .handle = NULL//spi or iic }; /* ****************************************************************************** * @file lsm6dsl_reg.c * @author MEMS Software Solution Team * @date 30-August-2017 * @brief driver file ****************************************************************************** * @attention * *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. Neither the name of STMicroelectronics nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @addtogroup lsm6dsl * @brief This file provides a set of functions needed to drive the * lsm6dsl enanced inertial module. * @{ */ /** * @addtogroup interfaces_functions * @brief This section provide a set of functions used to read and write * a generic register of the device. * @{ */ /** * @brief Read generic device register * * @param lsm6dsl_ctx_t* ctx: read / write interface definitions * @param uint8_t reg: register to read * @param uint8_t* data: pointer to buffer that store the data read * @param uint16_t len: number of consecutive register to read * */ int32_t lsm6dsl_read_reg(lsm6dsl_ctx_t *ctx, uint8_t reg, uint8_t *data, uint16_t len) { return ctx->read_reg(ctx->handle, reg, data, len); } /** * @brief Write generic device register * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t reg: register to write * @param uint8_t* data: pointer to data to write in register reg * @param uint16_t len: number of consecutive register to write * */ int32_t lsm6dsl_write_reg(lsm6dsl_ctx_t *ctx, uint8_t reg, uint8_t *data, uint16_t len) { return ctx->write_reg(ctx->handle, reg, data, len); } /** * @} */ /** @addtogroup common_functions * @brief This section provide a set of most common functions used * to drive the device. * @{ */ /** * @brief drdy_mode: [set] Define DataReady mode, pulses are 75 μs long, * latched on outputs reads * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_drdy_pulsed_t: change the values of drdy_pulsed * in reg DRDY_PULSE_CFG_G * */ int32_t lsm6dsl_drdy_mode_set(lsm6dsl_ctx_t *ctx, lsm6dsl_drdy_pulsed_t val) { lsm6dsl_drdy_pulse_cfg_g_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_DRDY_PULSE_CFG_G, (uint8_t *)®, 1); reg.drdy_pulsed = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_DRDY_PULSE_CFG_G, (uint8_t *)®, 1); return mm_error; } /** * @brief drdy_mode: [get] Define DataReady mode, pulses are 75 μs long, * latched on outputs reads * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_drdy_pulsed_t: Get the values of drdy_pulsed * in reg DRDY_PULSE_CFG_G * */ int32_t lsm6dsl_drdy_mode_get(lsm6dsl_ctx_t *ctx, lsm6dsl_drdy_pulsed_t *val) { lsm6dsl_drdy_pulse_cfg_g_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_DRDY_PULSE_CFG_G, (uint8_t *)®, 1); *val = (lsm6dsl_drdy_pulsed_t) reg.drdy_pulsed; return mm_error; } /** * @brief xl_data_rate: [set] Accelerometer data rate selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_odr_xl_t: change the values of odr_xl in reg CTRL1_XL * */ int32_t lsm6dsl_xl_data_rate_set(lsm6dsl_ctx_t *ctx, lsm6dsl_odr_xl_t val) { lsm6dsl_ctrl1_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL1_XL, (uint8_t *)®, 1); reg.odr_xl = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL1_XL, (uint8_t *)®, 1); return mm_error; } /** * @brief xl_data_rate: [get] Accelerometer data rate selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_odr_xl_t: Get the values of odr_xl in reg CTRL1_XL * */ int32_t lsm6dsl_xl_data_rate_get(lsm6dsl_ctx_t *ctx, lsm6dsl_odr_xl_t *val) { lsm6dsl_ctrl1_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL1_XL, (uint8_t *)®, 1); *val = (lsm6dsl_odr_xl_t) reg.odr_xl; return mm_error; } /** * @brief xl_full_scale: [set] Accelerometer full-scale selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_fs_xl_t: change the values of fs_xl in reg CTRL1_XL * */ int32_t lsm6dsl_xl_full_scale_set(lsm6dsl_ctx_t *ctx, lsm6dsl_fs_xl_t val) { lsm6dsl_ctrl1_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL1_XL, (uint8_t *)®, 1); reg.fs_xl = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL1_XL, (uint8_t *)®, 1); return mm_error; } /** * @brief xl_full_scale: [get] Accelerometer full-scale selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_fs_xl_t: Get the values of fs_xl in reg CTRL1_XL * */ int32_t lsm6dsl_xl_full_scale_get(lsm6dsl_ctx_t *ctx, lsm6dsl_fs_xl_t *val) { lsm6dsl_ctrl1_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL1_XL, (uint8_t *)®, 1); *val = (lsm6dsl_fs_xl_t) reg.fs_xl; return mm_error; } /** * @brief gyro_data_rate: [set] Gyroscope data rate selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_odr_g_t: change the values of odr_g in reg CTRL2_G * */ int32_t lsm6dsl_gyro_data_rate_set(lsm6dsl_ctx_t *ctx, lsm6dsl_odr_g_t val) { lsm6dsl_ctrl2_g_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL2_G, (uint8_t *)®, 1); reg.odr_g = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL2_G, (uint8_t *)®, 1); return mm_error; } /** * @brief gyro_data_rate: [get] Gyroscope data rate selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_odr_g_t: Get the values of odr_g in reg CTRL2_G * */ int32_t lsm6dsl_gyro_data_rate_get(lsm6dsl_ctx_t *ctx, lsm6dsl_odr_g_t *val) { lsm6dsl_ctrl2_g_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL2_G, (uint8_t *)®, 1); *val = (lsm6dsl_odr_g_t) reg.odr_g; return mm_error; } /** * @brief gyro_full_scale: [set] Gyroscope full-scale selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_fs_g_t: change the values of fs_g in reg CTRL2_G * */ int32_t lsm6dsl_gyro_full_scale_set(lsm6dsl_ctx_t *ctx, lsm6dsl_fs_g_t val) { lsm6dsl_ctrl2_g_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL2_G, (uint8_t *)®, 1); reg.fs_g = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL2_G, (uint8_t *)®, 1); return mm_error; } /** * @brief gyro_full_scale: [get] Gyroscope full-scale selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_fs_g_t: Get the values of fs_g in reg CTRL2_G * */ int32_t lsm6dsl_gyro_full_scale_get(lsm6dsl_ctx_t *ctx, lsm6dsl_fs_g_t *val) { lsm6dsl_ctrl2_g_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL2_G, (uint8_t *)®, 1); *val = (lsm6dsl_fs_g_t) reg.fs_g; return mm_error; } /** * @brief reset: [set] Software reset. This bit is automatically cleared. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of sw_reset in reg CTRL3_C * */ int32_t lsm6dsl_reset_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_ctrl3_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)®, 1); reg.sw_reset = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)®, 1); return mm_error; } /** * @brief reset: [get] Software reset. This bit is automatically cleared. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of sw_reset in reg CTRL3_C * */ int32_t lsm6dsl_reset_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_ctrl3_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)®, 1); *val = reg.sw_reset; return mm_error; } /** * @brief block_data_update: [set] If enabled registers not updated * until MSB and LSB have been read. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of bdu in reg CTRL3_C * */ int32_t lsm6dsl_block_data_update_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_ctrl3_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)®, 1); reg.bdu = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)®, 1); return mm_error; } /** * @brief block_data_update: [get] If enabled registers not updated * until MSB and LSB have been read. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of bdu in reg CTRL3_C * */ int32_t lsm6dsl_block_data_update_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_ctrl3_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)®, 1); *val = reg.bdu; return mm_error; } /** * @brief gyro_lpf1: [set] Enable gyroscope digital LPF1. The bandwidth * can be selected through FTYPE * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of lpf1_sel_g in reg CTRL4_C * */ int32_t lsm6dsl_gyro_lpf1_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_ctrl4_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)®, 1); reg.lpf1_sel_g = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)®, 1); return mm_error; } /** * @brief gyro_lpf1: [get] Enable gyroscope digital LPF1. * The bandwidth can be selected through FTYPE * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of lpf1_sel_g in reg CTRL4_C * */ int32_t lsm6dsl_gyro_lpf1_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_ctrl4_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)®, 1); *val = reg.lpf1_sel_g; return mm_error; } /** * @brief device_id: [get] device_id value in DIGIT * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t : union that group together the device_id data * */ int32_t lsm6dsl_device_id(lsm6dsl_ctx_t *ctx, uint8_t *buff) { return lsm6dsl_read_reg(ctx, LSM6DSL_WHO_AM_I, (uint8_t *) buff, sizeof(uint8_t)); } /** * @brief temperature: [get] temperature value in DIGIT * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param axis1byt16_t : union that group together the temperature data * */ int32_t lsm6dsl_temperature_raw(lsm6dsl_ctx_t *ctx, axis1bit16_t *buff) { return lsm6dsl_read_reg(ctx, LSM6DSL_OUT_TEMP_L, (uint8_t *) buff, sizeof(axis1bit16_t)); } float lsm6dsl_read_temperature(lsm6dsl_ctx_t *ctx) { axis1bit16_t buff; lsm6dsl_read_reg(ctx, LSM6DSL_OUT_TEMP_L, (uint8_t *) &buff, sizeof(axis1bit16_t)); return (float)(buff.i16bit) / 256.0f + 25; } /** * @brief angular_rate: [get] angular_rate value in DIGIT * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param axis3bit16_t : union that group together the angular_rate data * */ int32_t lsm6dsl_angular_rate_raw(lsm6dsl_ctx_t *ctx, axis3bit16_t *buff) { return lsm6dsl_read_reg(ctx, LSM6DSL_OUTX_L_G, (uint8_t *) buff, sizeof(axis3bit16_t)); } /** * @brief acceleration: [get] acceleration value in DIGIT * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param axis3bit16_t : union that group together the acceleration data * */ int32_t lsm6dsl_acceleration_raw(lsm6dsl_ctx_t *ctx, axis3bit16_t *buff) { return lsm6dsl_read_reg(ctx, LSM6DSL_OUTX_L_XL, (uint8_t *) buff, sizeof(axis3bit16_t)); } void lsm6dsl_read_raw_acc_xyz(lsm6dsl_ctx_t *ctx, void *acc_data) { unsigned char buf_reg[8]; imu_axis_data_t *raw_acc_xyz = (imu_axis_data_t *)acc_data; lsm6dsl_read_reg(ctx, LSM6DSL_OUTX_L_XL, buf_reg, 6); raw_acc_xyz->x = (short)((unsigned short)(buf_reg[1] << 8) | (buf_reg[0])); raw_acc_xyz->y = (short)((unsigned short)(buf_reg[3] << 8) | (buf_reg[2])); raw_acc_xyz->z = (short)((unsigned short)(buf_reg[5] << 8) | (buf_reg[4])); /* log_info("Qmi8658 acc: %d %d %d\n", raw_acc_xyz->x, raw_acc_xyz->y, raw_acc_xyz->z); */ } void lsm6dsl_read_raw_gyro_xyz(lsm6dsl_ctx_t *ctx, void *gyro_data) { unsigned char buf_reg[6]; imu_axis_data_t *raw_gyro_xyz = (imu_axis_data_t *)gyro_data; lsm6dsl_read_reg(ctx, LSM6DSL_OUTX_L_G, buf_reg, 6); raw_gyro_xyz->x = (short)((unsigned short)(buf_reg[1] << 8) | (buf_reg[0])); raw_gyro_xyz->y = (short)((unsigned short)(buf_reg[3] << 8) | (buf_reg[2])); raw_gyro_xyz->z = (short)((unsigned short)(buf_reg[5] << 8) | (buf_reg[4])); /* log_info("Qmi8658 gyro: %d %d %d\n", raw_gyro_xyz->x, raw_gyro_xyz->y, raw_gyro_xyz->z); */ } void lsm6dsl_read_raw_acc_gyro_xyz(lsm6dsl_ctx_t *ctx, void *raw_data) { unsigned char buf_reg[14]; short temp = 0; imu_sensor_data_t *raw_sensor_data = (imu_sensor_data_t *)raw_data; /* lsm6dsl_read_reg(ctx, LSM6DSL_OUTX_L_G, (uint8_t*) buf_reg,12); */ lsm6dsl_read_reg(ctx, LSM6DSL_OUT_TEMP_L, (uint8_t *) buf_reg, 14); temp = ((short)buf_reg[1] << 8) | buf_reg[0]; raw_sensor_data->temp_data = (float)temp / 256.0f + 25; raw_sensor_data->gyro.x = (short)((unsigned short)(buf_reg[3] << 8) | (buf_reg[2])); raw_sensor_data->gyro.y = (short)((unsigned short)(buf_reg[5] << 8) | (buf_reg[4])); raw_sensor_data->gyro.z = (short)((unsigned short)(buf_reg[7] << 8) | (buf_reg[6])); raw_sensor_data->acc.x = (short)((unsigned short)(buf_reg[9] << 8) | (buf_reg[8])); raw_sensor_data->acc.y = (short)((unsigned short)(buf_reg[11] << 8) | (buf_reg[10])); raw_sensor_data->acc.z = (short)((unsigned short)(buf_reg[13] << 8) | (buf_reg[12])); /* log_info("lsm6dsl raw:acc_x:%d acc_y:%d acc_z:%d gyro_x:%d gyro_y:%d gyro_z:%d", raw_sensor_data->acc.x, raw_sensor_data->acc.y, raw_sensor_data->acc.z, raw_sensor_data->gyro.x, raw_sensor_data->gyro.y, raw_sensor_data->gyro.z); */ /* log_info("lsm6dsl temp:%d.%d\n", (u16)(raw_sensor_data->temp_data), (u16)(((u16)((raw_sensor_data->temp_data)* 100)) % 100)); */ } /** * @brief lsm6dsl_status: [get] read all the device status and * source registers * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_multi_status_t: union of refisters * from WAKE_UP_SRC to WRIST_TILT_IA * */ int32_t lsm6dsl_status_get(lsm6dsl_ctx_t *ctx, lsm6dsl_multi_status_t *val) { int32_t mm_error; /* WAKE_UP_SRC + TAP_SRC + D6D_SRC + STATUS_REG */ mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_WAKE_UP_SRC, (uint8_t *)val, 4); val += 4; /* FUNC_SRC1 + FUNC_SRC2 + WRIST_TILT_IA */ mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FUNC_SRC1, (uint8_t *)val, 3); return mm_error; } /** * @} */ /** * @addtogroup Interrupt_functions * @brief This section provide a set of functions used * to manage the interrupts of the devices. * @{ */ /** * @brief wrist_tilt_on_int2: [set] Wrist tilt interrupt on INT2 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of int2_wrist_tilt * in reg DRDY_PULSE_CFG_G * */ int32_t lsm6dsl_wrist_tilt_on_int2_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_drdy_pulse_cfg_g_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_DRDY_PULSE_CFG_G, (uint8_t *)®, 1); reg.int2_wrist_tilt = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_DRDY_PULSE_CFG_G, (uint8_t *)®, 1); return mm_error; } /** * @brief wrist_tilt_on_int2: [get] Wrist tilt interrupt on INT2 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of int2_wrist_tilt * in reg DRDY_PULSE_CFG_G * */ int32_t lsm6dsl_wrist_tilt_on_int2_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_drdy_pulse_cfg_g_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_DRDY_PULSE_CFG_G, (uint8_t *)®, 1); *val = reg.int2_wrist_tilt; return mm_error; } /** * @brief xl_drdy_on_int1: [set] Accelerometer Data Ready on INT1 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of int1_drdy_xl in reg INT1_CTRL * */ int32_t lsm6dsl_xl_drdy_on_int1_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_int1_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)®, 1); reg.int1_drdy_xl = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)®, 1); return mm_error; } /** * @brief xl_drdy_on_int1: [get] Accelerometer Data Ready on INT1 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of int1_drdy_xl in reg INT1_CTRL * */ int32_t lsm6dsl_xl_drdy_on_int1_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_int1_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)®, 1); *val = reg.int1_drdy_xl; return mm_error; } /** * @brief gyro_drdy_on_int1: [set] Giroscope Data Ready on INT1 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of int1_drdy_g in reg INT1_CTRL * */ int32_t lsm6dsl_gyro_drdy_on_int1_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_int1_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)®, 1); reg.int1_drdy_g = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)®, 1); return mm_error; } /** * @brief gyro_drdy_on_int1: [get] Giroscope Data Ready on INT1 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of int1_drdy_g in reg INT1_CTRL * */ int32_t lsm6dsl_gyro_drdy_on_int1_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_int1_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)®, 1); *val = reg.int1_drdy_g; return mm_error; } /** * @brief boot_on_int1: [set] Boot signal on INT1 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of int1_boot in reg INT1_CTRL * */ int32_t lsm6dsl_boot_on_int1_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_int1_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)®, 1); reg.int1_boot = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)®, 1); return mm_error; } /** * @brief boot_on_int1: [get] Boot signal on INT1 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of int1_boot in reg INT1_CTRL * */ int32_t lsm6dsl_boot_on_int1_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_int1_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)®, 1); *val = reg.int1_boot; return mm_error; } /** * @brief fifo_threshold_on_int1: [set] FIFO threshold signal on INT1 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of int1_fth in reg INT1_CTRL * */ int32_t lsm6dsl_fifo_threshold_on_int1_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_int1_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)®, 1); reg.int1_fth = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)®, 1); return mm_error; } /** * @brief fifo_threshold_on_int1: [get] FIFO threshold signal on INT1 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of int1_fth in reg INT1_CTRL * */ int32_t lsm6dsl_fifo_threshold_on_int1_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_int1_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)®, 1); *val = reg.int1_fth; return mm_error; } /** * @brief fifo_overrun_on_int1: [set] FIFO overrun signal on INT1 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of int1_fifo_ovr in reg INT1_CTRL * */ int32_t lsm6dsl_fifo_overrun_on_int1_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_int1_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)®, 1); reg.int1_fifo_ovr = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)®, 1); return mm_error; } /** * @brief fifo_overrun_on_int1: [get] FIFO overrun signal on INT1 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of int1_fifo_ovr in reg INT1_CTRL * */ int32_t lsm6dsl_fifo_overrun_on_int1_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_int1_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)®, 1); *val = reg.int1_fifo_ovr; return mm_error; } /** * @brief fifo_full_on_int1: [set] FIFO full signal on INT1 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of int1_full_flag in reg INT1_CTRL * */ int32_t lsm6dsl_fifo_full_on_int1_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_int1_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)®, 1); reg.int1_full_flag = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)®, 1); return mm_error; } /** * @brief fifo_full_on_int1: [get] FIFO full signal on INT1 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of int1_full_flag in reg INT1_CTRL * */ int32_t lsm6dsl_fifo_full_on_int1_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_int1_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)®, 1); *val = reg.int1_full_flag; return mm_error; } /** * @brief sign_motion_on_int1: [set] Significant motion interrupt * enable on INT1 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of int1_sign_mot in reg INT1_CTRL * */ int32_t lsm6dsl_sign_motion_on_int1_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_int1_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)®, 1); reg.int1_sign_mot = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)®, 1); return mm_error; } /** * @brief sign_motion_on_int1: [get] Significant motion interrupt * enable on INT1 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of int1_sign_mot in reg INT1_CTRL * */ int32_t lsm6dsl_sign_motion_on_int1_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_int1_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)®, 1); *val = reg.int1_sign_mot; return mm_error; } /** * @brief step_detect_on_int1: [set] Pedometer step recognition * interrupt enable on INT1 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of int1_step_detector * in reg INT1_CTRL * */ int32_t lsm6dsl_step_detect_on_int1_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_int1_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)®, 1); reg.int1_step_detector = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)®, 1); return mm_error; } /** * @brief step_detect_on_int1: [get] Pedometer step recognition interrupt * enable on INT1 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of int1_step_detector * in reg INT1_CTRL * */ int32_t lsm6dsl_step_detect_on_int1_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_int1_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)®, 1); *val = reg.int1_step_detector; return mm_error; } /** * @brief xl_drdy_on_int2: [set] Accelerometer Data Ready on INT2 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of int2_drdy_xl in reg INT2_CTRL * */ int32_t lsm6dsl_xl_drdy_on_int2_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_int2_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)®, 1); reg.int2_drdy_xl = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)®, 1); return mm_error; } /** * @brief xl_drdy_on_int2: [get] Accelerometer Data Ready on INT2 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of int2_drdy_xl in reg INT2_CTRL * */ int32_t lsm6dsl_xl_drdy_on_int2_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_int2_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)®, 1); *val = reg.int2_drdy_xl; return mm_error; } /** * @brief gyro_drdy_on_int2: [set] Giroscope Data Ready on INT2 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of int2_drdy_g in reg INT2_CTRL * */ int32_t lsm6dsl_gyro_drdy_on_int2_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_int2_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)®, 1); reg.int2_drdy_g = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)®, 1); return mm_error; } /** * @brief gyro_drdy_on_int2: [get] Giroscope Data Ready on INT2 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of int2_drdy_g in reg INT2_CTRL * */ int32_t lsm6dsl_gyro_drdy_on_int2_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_int2_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)®, 1); *val = reg.int2_drdy_g; return mm_error; } /** * @brief temperature_drdy_on_int2: [set] Temperature Data Ready * on INT2 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of int2_drdy_temp in reg INT2_CTRL * */ int32_t lsm6dsl_temperature_drdy_on_int2_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_int2_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)®, 1); reg.int2_drdy_temp = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)®, 1); return mm_error; } /** * @brief temperature_drdy_on_int2: [get] Temperature Data Ready * on INT2 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of int2_drdy_temp in reg INT2_CTRL * */ int32_t lsm6dsl_temperature_drdy_on_int2_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_int2_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)®, 1); *val = reg.int2_drdy_temp; return mm_error; } /** * @brief fifo_threshold_on_int2: [set] FIFO threshold signal on INT2 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of int2_fth in reg INT2_CTRL * */ int32_t lsm6dsl_fifo_threshold_on_int2_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_int2_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)®, 1); reg.int2_fth = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)®, 1); return mm_error; } /** * @brief fifo_threshold_on_int2: [get] FIFO threshold signal on INT2 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of int2_fth in reg INT2_CTRL * */ int32_t lsm6dsl_fifo_threshold_on_int2_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_int2_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)®, 1); *val = reg.int2_fth; return mm_error; } /** * @brief fifo_overrun_on_int2: [set] FIFO overrun signal on INT2 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of int2_fifo_ovr in reg INT2_CTRL * */ int32_t lsm6dsl_fifo_overrun_on_int2_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_int2_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)®, 1); reg.int2_fifo_ovr = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)®, 1); return mm_error; } /** * @brief fifo_overrun_on_int2: [get] FIFO overrun signal on INT2 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of int2_fifo_ovr in reg INT2_CTRL * */ int32_t lsm6dsl_fifo_overrun_on_int2_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_int2_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)®, 1); *val = reg.int2_fifo_ovr; return mm_error; } /** * @brief fifo_full_on_int2: [set] FIFO full signal on INT2 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of int2_full_flag in reg INT2_CTRL * */ int32_t lsm6dsl_fifo_full_on_int2_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_int2_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)®, 1); reg.int2_full_flag = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)®, 1); return mm_error; } /** * @brief fifo_full_on_int2: [get] FIFO full signal on INT2 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of int2_full_flag in reg INT2_CTRL * */ int32_t lsm6dsl_fifo_full_on_int2_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_int2_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)®, 1); *val = reg.int2_full_flag; return mm_error; } /** * @brief step_overflow_on_int2: [set] Step counter overflow * interrupt enable on INT2 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of int2_step_count_ov * in reg INT2_CTRL * */ int32_t lsm6dsl_step_overflow_on_int2_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_int2_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)®, 1); reg.int2_step_count_ov = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)®, 1); return mm_error; } /** * @brief step_overflow_on_int2: [get] Step counter overflow * interrupt enable on INT2 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of int2_step_count_ov in reg INT2_CTRL * */ int32_t lsm6dsl_step_overflow_on_int2_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_int2_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)®, 1); *val = reg.int2_step_count_ov; return mm_error; } /** * @brief step_on_time_interval_on_int2: [set] Pedometer step * recognition interrupt on * delta time enable on INT2 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of int2_step_delta in reg INT2_CTRL * */ int32_t lsm6dsl_step_on_time_interval_on_int2_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_int2_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)®, 1); reg.int2_step_delta = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)®, 1); return mm_error; } /** * @brief step_on_time_interval_on_int2: [get] Pedometer step recognition * interrupt on delta time enable * on INT2 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of int2_step_delta in reg INT2_CTRL * */ int32_t lsm6dsl_step_on_time_interval_on_int2_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_int2_ctrl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)®, 1); *val = reg.int2_step_delta; return mm_error; } /** * @} */ /** @addtogroup FIFO_functions * @brief This section provide a set of functions used * to manage the FIFO of the devices. * @{ */ /** * @brief fifo_temperature: [set] Enable the temperature data * storage in FIFO. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of fifo_temp_en in reg FIFO_CTRL2 * */ int32_t lsm6dsl_fifo_temperature_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_fifo_ctrl2_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL2, (uint8_t *)®, 1); reg.fifo_temp_en = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FIFO_CTRL2, (uint8_t *)®, 1); return mm_error; } /** * @brief fifo_temperature: [get] Enable the temperature * data storage in FIFO. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of fifo_temp_en in reg FIFO_CTRL2 * */ int32_t lsm6dsl_fifo_temperature_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_fifo_ctrl2_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL2, (uint8_t *)®, 1); *val = reg.fifo_temp_en; return mm_error; } /** * @brief fifo_write_mode: [set] Enable write in FIFO on XL/Gyro * data-ready or at every step detected by * step counter * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_timer_pedo_fifo_drdy_t: change the values of * timer_pedo_fifo_drdy in * reg FIFO_CTRL2 * */ int32_t lsm6dsl_fifo_write_mode_set(lsm6dsl_ctx_t *ctx, lsm6dsl_timer_pedo_fifo_drdy_t val) { lsm6dsl_fifo_ctrl2_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL2, (uint8_t *)®, 1); reg.timer_pedo_fifo_drdy = val; reg.not_used_01 = 0; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FIFO_CTRL2, (uint8_t *)®, 1); return mm_error; } /** * @brief fifo_write_mode: [get] Enable write in FIFO on XL/Gyro * data-ready or at every step detected by step counter * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_timer_pedo_fifo_drdy_t: Get the values of * timer_pedo_fifo_drdy in * reg FIFO_CTRL2 * */ int32_t lsm6dsl_fifo_write_mode_get(lsm6dsl_ctx_t *ctx, lsm6dsl_timer_pedo_fifo_drdy_t *val) { lsm6dsl_fifo_ctrl2_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL2, (uint8_t *)®, 1); *val = (lsm6dsl_timer_pedo_fifo_drdy_t) reg.timer_pedo_fifo_drdy; return mm_error; } /** * @brief fifo_step_timestamp: [set] Enable pedometer step * counter and timestamp as 4th FIFO data set. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of timer_pedo_fifo_en * in reg FIFO_CTRL2 * */ int32_t lsm6dsl_fifo_step_timestamp_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_fifo_ctrl2_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL2, (uint8_t *)®, 1); reg.timer_pedo_fifo_en = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FIFO_CTRL2, (uint8_t *)®, 1); return mm_error; } /** * @brief fifo_step_timestamp: [get] Enable pedometer step counter * and timestamp as 4th FIFO data set. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of timer_pedo_fifo_en in reg FIFO_CTRL2 * */ int32_t lsm6dsl_fifo_step_timestamp_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_fifo_ctrl2_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL2, (uint8_t *)®, 1); *val = reg.timer_pedo_fifo_en; return mm_error; } /** * @brief xl_decimation: [set] Accelerometer FIFO (second data set) * decimation setting. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_dec_fifo_xl_t: change the values of * dec_fifo_xl in reg FIFO_CTRL3 * */ int32_t lsm6dsl_xl_decimation_set(lsm6dsl_ctx_t *ctx, lsm6dsl_dec_fifo_xl_t val) { lsm6dsl_fifo_ctrl3_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL3, (uint8_t *)®, 1); reg.dec_fifo_xl = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FIFO_CTRL3, (uint8_t *)®, 1); return mm_error; } /** * @brief xl_decimation: [get] Accelerometer FIFO (second data set) * decimation setting. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_dec_fifo_xl_t: Get the values of dec_fifo_xl * in reg FIFO_CTRL3 * */ int32_t lsm6dsl_xl_decimation_get(lsm6dsl_ctx_t *ctx, lsm6dsl_dec_fifo_xl_t *val) { lsm6dsl_fifo_ctrl3_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL3, (uint8_t *)®, 1); *val = (lsm6dsl_dec_fifo_xl_t) reg.dec_fifo_xl; return mm_error; } /** * @brief gyro_decimation: [set] Gyro FIFO (first data set) * decimation setting. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_dec_fifo_gyro_t: change the values of * dec_fifo_gyro in reg FIFO_CTRL3 * */ int32_t lsm6dsl_gyro_decimation_set(lsm6dsl_ctx_t *ctx, lsm6dsl_dec_fifo_gyro_t val) { lsm6dsl_fifo_ctrl3_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL3, (uint8_t *)®, 1); reg.dec_fifo_gyro = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FIFO_CTRL3, (uint8_t *)®, 1); return mm_error; } /** * @brief gyro_decimation: [get] Gyro FIFO (first data set) * decimation setting. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_dec_fifo_gyro_t: Get the values of dec_fifo_gyro * in reg FIFO_CTRL3 * */ int32_t lsm6dsl_gyro_decimation_get(lsm6dsl_ctx_t *ctx, lsm6dsl_dec_fifo_gyro_t *val) { lsm6dsl_fifo_ctrl3_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL3, (uint8_t *)®, 1); *val = (lsm6dsl_dec_fifo_gyro_t) reg.dec_fifo_gyro; return mm_error; } /** * @brief dataset3_decimation: [set] Third FIFO data set * decimation setting. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_dec_ds3_fifo_t: change the values of dec_ds3_fifo * in reg FIFO_CTRL4 * */ int32_t lsm6dsl_dataset3_decimation_set(lsm6dsl_ctx_t *ctx, lsm6dsl_dec_ds3_fifo_t val) { lsm6dsl_fifo_ctrl4_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL4, (uint8_t *)®, 1); reg.dec_ds3_fifo = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FIFO_CTRL4, (uint8_t *)®, 1); return mm_error; } /** * @brief dataset3_decimation: [get] Third FIFO data set * decimation setting. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_dec_ds3_fifo_t: Get the values of dec_ds3_fifo * in reg FIFO_CTRL4 * */ int32_t lsm6dsl_dataset3_decimation_get(lsm6dsl_ctx_t *ctx, lsm6dsl_dec_ds3_fifo_t *val) { lsm6dsl_fifo_ctrl4_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL4, (uint8_t *)®, 1); *val = (lsm6dsl_dec_ds3_fifo_t) reg.dec_ds3_fifo; return mm_error; } /** * @brief dataset4_decimation: [set] Fourth FIFO data set * decimation setting. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_dec_ds4_fifo_t: change the values of dec_ds4_fifo * in reg FIFO_CTRL4 * */ int32_t lsm6dsl_dataset4_decimation_set(lsm6dsl_ctx_t *ctx, lsm6dsl_dec_ds4_fifo_t val) { lsm6dsl_fifo_ctrl4_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL4, (uint8_t *)®, 1); reg.dec_ds4_fifo = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FIFO_CTRL4, (uint8_t *)®, 1); return mm_error; } /** * @brief dataset4_decimation: [get] Fourth FIFO data set decimation * setting. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_dec_ds4_fifo_t: Get the values of dec_ds4_fifo * in reg FIFO_CTRL4 * */ int32_t lsm6dsl_dataset4_decimation_get(lsm6dsl_ctx_t *ctx, lsm6dsl_dec_ds4_fifo_t *val) { lsm6dsl_fifo_ctrl4_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL4, (uint8_t *)®, 1); *val = (lsm6dsl_dec_ds4_fifo_t) reg.dec_ds4_fifo; return mm_error; } /** * @brief fifo_xl_gy_8bit_data: [set] MSByte only memorization in FIFO * for XL and Gyro in FIFO. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of only_high_data in reg FIFO_CTRL4 * */ int32_t lsm6dsl_fifo_xl_gy_8bit_data_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_fifo_ctrl4_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL4, (uint8_t *)®, 1); reg.only_high_data = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FIFO_CTRL4, (uint8_t *)®, 1); return mm_error; } /** * @brief fifo_xl_gy_8bit_data: [get] MSByte only memorization * in FIFO for XL and Gyro in FIFO. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of only_high_data in reg FIFO_CTRL4 * */ int32_t lsm6dsl_fifo_xl_gy_8bit_data_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_fifo_ctrl4_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL4, (uint8_t *)®, 1); *val = reg.only_high_data; return mm_error; } /** * @brief fifo_threshold: [set] Enable FIFO threshold level use. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of stop_on_fth in reg FIFO_CTRL4 * */ int32_t lsm6dsl_fifo_stop_on_thr_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_fifo_ctrl4_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL4, (uint8_t *)®, 1); reg.stop_on_fth = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FIFO_CTRL4, (uint8_t *)®, 1); return mm_error; } /** * @brief fifo_threshold: [get] Enable FIFO threshold level use. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of stop_on_fth in reg FIFO_CTRL4 * */ int32_t lsm6dsl_fifo_stop_on_thr_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_fifo_ctrl4_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL4, (uint8_t *)®, 1); *val = reg.stop_on_fth; return mm_error; } /** * @brief fifo_mode: [set] Define FIFO working mode. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_fifo_mode_t: change the values of fifo_mode * in reg FIFO_CTRL5 * */ int32_t lsm6dsl_fifo_mode_set(lsm6dsl_ctx_t *ctx, lsm6dsl_fifo_mode_t val) { lsm6dsl_fifo_ctrl5_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL5, (uint8_t *)®, 1); reg.fifo_mode = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FIFO_CTRL5, (uint8_t *)®, 1); return mm_error; } /** * @brief fifo_mode: [get] Define FIFO working mode. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_fifo_mode_t: Get the values of fifo_mode in reg FIFO_CTRL5 * */ int32_t lsm6dsl_fifo_mode_get(lsm6dsl_ctx_t *ctx, lsm6dsl_fifo_mode_t *val) { lsm6dsl_fifo_ctrl5_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL5, (uint8_t *)®, 1); *val = (lsm6dsl_fifo_mode_t) reg.fifo_mode; return mm_error; } /** * @brief fifo_data_rate: [set] Define FIFO working data rate. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_odr_fifo_t: change the values of odr_fifo * in reg FIFO_CTRL5 * */ int32_t lsm6dsl_fifo_data_rate_set(lsm6dsl_ctx_t *ctx, lsm6dsl_odr_fifo_t val) { lsm6dsl_fifo_ctrl5_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL5, (uint8_t *)®, 1); reg.odr_fifo = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FIFO_CTRL5, (uint8_t *)®, 1); return mm_error; } /** * @brief fifo_data_rate: [get] Define FIFO working data rate. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_odr_fifo_t: Get the values of odr_fifo in reg FIFO_CTRL5 * */ int32_t lsm6dsl_fifo_data_rate_get(lsm6dsl_ctx_t *ctx, lsm6dsl_odr_fifo_t *val) { lsm6dsl_fifo_ctrl5_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL5, (uint8_t *)®, 1); *val = (lsm6dsl_odr_fifo_t) reg.odr_fifo; return mm_error; } /** * @brief fifo_data_valid: [set] Selection of FIFO data-valid signal. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_data_valid_sel_fifo_t: change the values of * data_valid_sel_fifo in * reg MASTER_CONFIG * */ int32_t lsm6dsl_fifo_data_valid_set(lsm6dsl_ctx_t *ctx, lsm6dsl_data_valid_sel_fifo_t val) { lsm6dsl_master_config_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)®, 1); reg.data_valid_sel_fifo = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)®, 1); return mm_error; } /** * @brief fifo_data_valid: [get] Selection of FIFO data-valid signal. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_data_valid_sel_fifo_t: Get the values of * data_valid_sel_fifo in * reg MASTER_CONFIG * */ int32_t lsm6dsl_fifo_data_valid_get(lsm6dsl_ctx_t *ctx, lsm6dsl_data_valid_sel_fifo_t *val) { lsm6dsl_master_config_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)®, 1); *val = (lsm6dsl_data_valid_sel_fifo_t) reg.data_valid_sel_fifo; return mm_error; } /** * @brief fifo_empty: [get] FIFOemptybit. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of fifo_empty in reg FIFO_STATUS2 * */ int32_t lsm6dsl_fifo_empty_get(lsm6dsl_ctx_t *ctx) { lsm6dsl_fifo_status2_t reg; lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_STATUS2, (uint8_t *)®, 1); return reg.fifo_empty; } /** * @brief fifo_full_next_cycle: [get] FSmart FIFO full status. * FIFO will be full at the next ODR. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of fifo_full_smart in reg FIFO_STATUS2 * */ int32_t lsm6dsl_fifo_full_next_cycle_get(lsm6dsl_ctx_t *ctx) { lsm6dsl_fifo_status2_t reg; lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_STATUS2, (uint8_t *)®, 1); return reg.fifo_full_smart; } /** * @brief fifo_over_run: [get] FIFO overrun status. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of over_run in reg FIFO_STATUS2 * */ int32_t lsm6dsl_fifo_over_run_get(lsm6dsl_ctx_t *ctx) { lsm6dsl_fifo_status2_t reg; lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_STATUS2, (uint8_t *)®, 1); return reg.over_run; } /** * @brief fifo_watermark_level: [get] FIFO watermark status. FIFO * filling is equal to or higher than * the watermark level. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of waterm in reg FIFO_STATUS2 * */ int32_t lsm6dsl_fifo_watermark_level_get(lsm6dsl_ctx_t *ctx) { lsm6dsl_fifo_status2_t reg; lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_STATUS2, (uint8_t *)®, 1); return reg.waterm; } /** * @brief fifo_threshold: [set] Watermark flag rises when the number * of bytes written to FIFO after the next write * is greater than or equal to the threshold level. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint16_t: change the values of fth * */ int32_t lsm6dsl_fifo_threshold_set(lsm6dsl_ctx_t *ctx, uint16_t val) { int32_t mm_error; uint16_t reg; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL1, (uint8_t *) ®, sizeof(uint16_t)); reg &= 0xF800; reg |= (val & 0x07FF); mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FIFO_CTRL1, (uint8_t *) ®, sizeof(uint16_t)); return mm_error; } /** * @brief fifo_threshold: [get] Watermark flag rises when the number * of bytes written to FIFO after the next write * is greater than or equal to the threshold level. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint16_t: get the values of fth * */ int32_t lsm6dsl_fifo_threshold_get(lsm6dsl_ctx_t *ctx, uint16_t *val) { int32_t mm_error; uint16_t reg; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL1, (uint8_t *) ®, sizeof(uint16_t)); reg &= 0x07FF; return mm_error; } /** * @brief fifo_unread_words: [get] Number of unread words (16-bit axes) * stored in FIFO. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint16_t: get the values of diff_fifo * */ int32_t lsm6dsl_fifo_unread_words_get(lsm6dsl_ctx_t *ctx, uint16_t *val) { int32_t mm_error; uint16_t reg; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_STATUS1, (uint8_t *) ®, sizeof(uint16_t)); reg &= 0x07FF; return mm_error; } /** * @brief fifo_recursive_pattern: [get] Word of recursive pattern * read at the next reading. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint16_t: Word of recursive pattern read at the next reading. * */ int32_t lsm6dsl_fifo_recursive_pattern_get(lsm6dsl_ctx_t *ctx, uint16_t *val) { int32_t mm_error; uint16_t reg; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_STATUS3, (uint8_t *) ®, sizeof(uint16_t)); reg &= 0x03FF; return mm_error; } /** * @brief fifo_output: [get] fifo_output value in DIGIT * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param axis1bit16_t : union that group together the fifo_output data * */ int32_t lsm6dsl_fifo_output_raw(lsm6dsl_ctx_t *ctx, axis1bit16_t *buff) { return lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_DATA_OUT_L, (uint8_t *) buff, sizeof(axis1bit16_t)); } lsm6dsl_fifo_mode_t fifo_mode_old = STOP_WHEN_FULL; void lsm6dsl_fifo_mode_start() { lsm6dsl_fifo_mode_set(&lsm6dsl_ctx, BYPASS); lsm6dsl_fifo_mode_set(&lsm6dsl_ctx, STOP_WHEN_FULL); } //data:gyro(6bytes)+acc(6bytes)+step(6bytes)+temperature(6bytes头尾补0) int32_t lsm6dsl_read_fifo(lsm6dsl_ctx_t *ctx, u8 *buff) { uint16_t reg = 0; uint16_t ret = 0; lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_STATUS1, (uint8_t *)®, 2); /* log_info("fifo status[15~12]:0x%x!",reg); */ if (reg & 0x1000) { /* log_info("fifo empty!"); */ putchar('.'); /* } else if (reg & 0xe000) { */ } else { /* } else if (reg & 0x8000) { */ reg &= 0x07FF; /* log_info("fifo level:%d!",reg); */ if (reg > 0) { #if 0 for (i = 1; i < reg; i++) { } #else ret = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_DATA_OUT_L, (uint8_t *) buff, reg * 2); if (fifo_mode_old == STOP_WHEN_FULL) { lsm6dsl_fifo_mode_start(); } return ret; #endif } } return 0; } /** * @} */ /** * @addtogroup advanced_function_functions * @brief This section provide a set of functions used * to manage the advanced feature of the device. * @{ */ /** * @brief xl_analog_bandwidth: [set] Accelerometer analog chain bandwidth * selection (only for accelerometer * ODR ≥ 1.67 kHz). * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_bw0_xl_t: change the values of bw0_xl in reg CTRL1_XL * */ int32_t lsm6dsl_xl_analog_bandwidth_set(lsm6dsl_ctx_t *ctx, lsm6dsl_bw0_xl_t val) { lsm6dsl_ctrl1_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL1_XL, (uint8_t *)®, 1); reg.bw0_xl = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL1_XL, (uint8_t *)®, 1); return mm_error; } /** * @brief xl_analog_bandwidth: [get] Accelerometer analog chain * bandwidth selection (only for accelerometer * ODR ≥ 1.67 kHz). * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_bw0_xl_t: Get the values of bw0_xl in reg CTRL1_XL * */ int32_t lsm6dsl_xl_analog_bandwidth_get(lsm6dsl_ctx_t *ctx, lsm6dsl_bw0_xl_t *val) { lsm6dsl_ctrl1_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL1_XL, (uint8_t *)®, 1); *val = (lsm6dsl_bw0_xl_t) reg.bw0_xl; return mm_error; } /** * @brief xl_lpf1_bandwidth: [set] Accelerometer digital LPF (LPF1) * bandwidth selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_lpf1_bw_sel_t: change the values of lpf1_bw_sel * in reg CTRL1_XL * */ int32_t lsm6dsl_xl_lpf1_bandwidth_set(lsm6dsl_ctx_t *ctx, lsm6dsl_lpf1_bw_sel_t val) { lsm6dsl_ctrl1_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL1_XL, (uint8_t *)®, 1); reg.lpf1_bw_sel = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL1_XL, (uint8_t *)®, 1); return mm_error; } /** * @brief xl_lpf1_bandwidth: [get] Accelerometer digital LPF (LPF1) * bandwidth selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_lpf1_bw_sel_t: Get the values of lpf1_bw_sel * in reg CTRL1_XL * */ int32_t lsm6dsl_xl_lpf1_bandwidth_get(lsm6dsl_ctx_t *ctx, lsm6dsl_lpf1_bw_sel_t *val) { lsm6dsl_ctrl1_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL1_XL, (uint8_t *)®, 1); *val = (lsm6dsl_lpf1_bw_sel_t) reg.lpf1_bw_sel; return mm_error; } /** * @brief data_format: [set] Big/Little Endian Data selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_ble_t: change the values of ble in reg CTRL3_C * */ int32_t lsm6dsl_data_format_set(lsm6dsl_ctx_t *ctx, lsm6dsl_ble_t val) { lsm6dsl_ctrl3_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)®, 1); reg.ble = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)®, 1); return mm_error; } /** * @brief data_format: [get] Big/Little Endian Data selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_ble_t: Get the values of ble in reg CTRL3_C * */ int32_t lsm6dsl_data_format_get(lsm6dsl_ctx_t *ctx, lsm6dsl_ble_t *val) { lsm6dsl_ctrl3_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)®, 1); *val = (lsm6dsl_ble_t) reg.ble; return mm_error; } /** default: 1:auto_increment * @brief auto_increment: [set] Register address automatically * incremented during a multiple byte access with * a serial interface (I2C or SPI). * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of if_inc in reg CTRL3_C * */ int32_t lsm6dsl_auto_increment_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_ctrl3_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)®, 1); reg.if_inc = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)®, 1); return mm_error; } /** * @brief auto_increment: [get] Register address automatically * incremented during a multiple byte access with * a serial interface (I2C or SPI). * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of if_inc in reg CTRL3_C * */ int32_t lsm6dsl_auto_increment_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_ctrl3_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)®, 1); *val = reg.if_inc; return mm_error; } /** default: 0:4wire * @brief spi_mode: [set] SPI Serial Interface Mode selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_sim_t: change the values of sim in reg CTRL3_C * */ int32_t lsm6dsl_spi_mode_set(lsm6dsl_ctx_t *ctx, lsm6dsl_sim_t val) { lsm6dsl_ctrl3_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)®, 1); reg.sim = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)®, 1); return mm_error; } /** * @brief spi_mode: [get] SPI Serial Interface Mode selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_sim_t: Get the values of sim in reg CTRL3_C * */ int32_t lsm6dsl_spi_mode_get(lsm6dsl_ctx_t *ctx, lsm6dsl_sim_t *val) { lsm6dsl_ctrl3_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)®, 1); *val = (lsm6dsl_sim_t) reg.sim; return mm_error; } /** * @brief pads_mode: [set] Push-pull/open-drain selection on * INT1 and INT2 pads. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_pp_od_t: change the values of pp_od in reg CTRL3_C * */ int32_t lsm6dsl_pads_mode_set(lsm6dsl_ctx_t *ctx, lsm6dsl_pp_od_t val) { lsm6dsl_ctrl3_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)®, 1); reg.pp_od = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)®, 1); return mm_error; } /** * @brief pads_mode: [get] Push-pull/open-drain selection * on INT1 and INT2 pads. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_pp_od_t: Get the values of pp_od in reg CTRL3_C * */ int32_t lsm6dsl_pads_mode_get(lsm6dsl_ctx_t *ctx, lsm6dsl_pp_od_t *val) { lsm6dsl_ctrl3_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)®, 1); *val = (lsm6dsl_pp_od_t) reg.pp_od; return mm_error; } /** * @brief pads_polatity: [set] Interrupt activation level. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_h_lactive_t: change the values of h_lactive * in reg CTRL3_C * */ int32_t lsm6dsl_pads_polatity_set(lsm6dsl_ctx_t *ctx, lsm6dsl_h_lactive_t val) { lsm6dsl_ctrl3_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)®, 1); reg.h_lactive = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)®, 1); return mm_error; } /** * @brief pads_polatity: [get] Interrupt activation level. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_h_lactive_t: Get the values of h_lactive in reg CTRL3_C * */ int32_t lsm6dsl_pads_polatity_get(lsm6dsl_ctx_t *ctx, lsm6dsl_h_lactive_t *val) { lsm6dsl_ctrl3_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)®, 1); *val = (lsm6dsl_h_lactive_t) reg.h_lactive; return mm_error; } /** * @brief i2c_interface: [set] Enable / Disable I2C interface. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of i2c_disable in reg CTRL4_C * */ int32_t lsm6dsl_i2c_interface_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_ctrl4_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)®, 1); reg.i2c_disable = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)®, 1); return mm_error; } /** * @brief i2c_interface: [get] Enable / Disable I2C interface. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of i2c_disable in reg CTRL4_C * */ int32_t lsm6dsl_i2c_interface_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_ctrl4_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)®, 1); *val = reg.i2c_disable; return mm_error; } /** * @brief mask_drdy_on_settling_data: [set] Acts only on the * accelerometer LPF1 and the gyroscope * LPF2 digital filters settling time. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of drdy_mask in reg CTRL4_C * */ int32_t lsm6dsl_mask_drdy_on_settling_data_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_ctrl4_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)®, 1); reg.drdy_mask = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)®, 1); return mm_error; } /** * @brief mask_drdy_on_settling_data: [get] Acts only on the accelerometer * LPF1 and the gyroscope LPF2 digital * filters settling time. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of drdy_mask in reg CTRL4_C * */ int32_t lsm6dsl_mask_drdy_on_settling_data_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_ctrl4_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)®, 1); *val = reg.drdy_mask; return mm_error; } /** * @brief all_on_int1_pad: [set] All interrupt signals available * on INT1 pad enable. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of int2_on_int1 in reg CTRL4_C * */ int32_t lsm6dsl_all_on_int1_pad_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_ctrl4_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)®, 1); reg.int2_on_int1 = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)®, 1); return mm_error; } /** * @brief all_on_int1_pad: [get] All interrupt signals available * on INT1 pad enable. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of int2_on_int1 in reg CTRL4_C * */ int32_t lsm6dsl_all_on_int1_pad_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_ctrl4_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)®, 1); *val = reg.int2_on_int1; return mm_error; } /** * @brief gyro_sleep_mode: [set] Gyroscope sleep mode enable. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of sleep in reg CTRL4_C * */ int32_t lsm6dsl_gyro_sleep_mode_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_ctrl4_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)®, 1); reg.sleep = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)®, 1); return mm_error; } /** * @brief gyro_sleep_mode: [get] Gyroscope sleep mode enable. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of sleep in reg CTRL4_C * */ int32_t lsm6dsl_gyro_sleep_mode_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_ctrl4_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)®, 1); *val = reg.sleep; return mm_error; } /** * @brief den_func_on_xl: [set] Extend DEN functionality to * accelerometer sensor. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of den_xl_en in reg CTRL4_C * */ int32_t lsm6dsl_den_func_on_xl_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_ctrl4_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)®, 1); reg.den_xl_en = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)®, 1); return mm_error; } /** * @brief den_func_on_xl: [get] Extend DEN functionality * to accelerometer sensor. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of den_xl_en in reg CTRL4_C * */ int32_t lsm6dsl_den_func_on_xl_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_ctrl4_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)®, 1); *val = reg.den_xl_en; return mm_error; } /** * @brief xl_self_test: [set] Linear acceleration sensor self-test. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_st_xl_t: change the values of st_xl in reg CTRL5_C * */ int32_t lsm6dsl_xl_self_test_set(lsm6dsl_ctx_t *ctx, lsm6dsl_st_xl_t val) { lsm6dsl_ctrl5_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL5_C, (uint8_t *)®, 1); reg.st_xl = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL5_C, (uint8_t *)®, 1); return mm_error; } /** * @brief xl_self_test: [get] Linear acceleration sensor self-test. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_st_xl_t: Get the values of st_xl in reg CTRL5_C * */ int32_t lsm6dsl_xl_self_test_get(lsm6dsl_ctx_t *ctx, lsm6dsl_st_xl_t *val) { lsm6dsl_ctrl5_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL5_C, (uint8_t *)®, 1); *val = (lsm6dsl_st_xl_t) reg.st_xl; return mm_error; } /** * @brief gyro_self_test: [set] Linear gyro sensor self-test. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_st_g_t: change the values of st_g in reg CTRL5_C * */ int32_t lsm6dsl_gyro_self_test_set(lsm6dsl_ctx_t *ctx, lsm6dsl_st_g_t val) { lsm6dsl_ctrl5_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL5_C, (uint8_t *)®, 1); reg.st_g = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL5_C, (uint8_t *)®, 1); return mm_error; } /** * @brief gyro_self_test: [get] Linear gyro sensor self-test. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_st_g_t: Get the values of st_g in reg CTRL5_C * */ int32_t lsm6dsl_gyro_self_test_get(lsm6dsl_ctx_t *ctx, lsm6dsl_st_g_t *val) { lsm6dsl_ctrl5_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL5_C, (uint8_t *)®, 1); *val = (lsm6dsl_st_g_t) reg.st_g; return mm_error; } /** * @brief den_func_polarity: [set] DEN active level configuration. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_den_lh_t: change the values of den_lh in reg CTRL5_C * */ int32_t lsm6dsl_den_func_polarity_set(lsm6dsl_ctx_t *ctx, lsm6dsl_den_lh_t val) { lsm6dsl_ctrl5_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL5_C, (uint8_t *)®, 1); reg.den_lh = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL5_C, (uint8_t *)®, 1); return mm_error; } /** * @brief den_func_polarity: [get] DEN active level configuration. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_den_lh_t: Get the values of den_lh in reg CTRL5_C * */ int32_t lsm6dsl_den_func_polarity_get(lsm6dsl_ctx_t *ctx, lsm6dsl_den_lh_t *val) { lsm6dsl_ctrl5_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL5_C, (uint8_t *)®, 1); *val = (lsm6dsl_den_lh_t) reg.den_lh; return mm_error; } /** * @brief rounding_mode: [set] Circular burst-mode (rounding) read * from the output registers. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_rounding_t: change the values of rounding in reg CTRL5_C * */ int32_t lsm6dsl_rounding_mode_set(lsm6dsl_ctx_t *ctx, lsm6dsl_rounding_t val) { lsm6dsl_ctrl5_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL5_C, (uint8_t *)®, 1); reg.rounding = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL5_C, (uint8_t *)®, 1); return mm_error; } /** * @brief rounding_mode: [get] Circular burst-mode (rounding) read * from the output registers. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_rounding_t: Get the values of rounding in reg CTRL5_C * */ int32_t lsm6dsl_rounding_mode_get(lsm6dsl_ctx_t *ctx, lsm6dsl_rounding_t *val) { lsm6dsl_ctrl5_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL5_C, (uint8_t *)®, 1); *val = (lsm6dsl_rounding_t) reg.rounding; return mm_error; } /** * @brief gyro_lpf1_bandwidth: [set] Gyroscope's low-pass filter * (LPF1) bandwidth selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_ftype_t: change the values of ftype in reg CTRL6_C * */ int32_t lsm6dsl_gyro_lpf1_bandwidth_set(lsm6dsl_ctx_t *ctx, lsm6dsl_ftype_t val) { lsm6dsl_ctrl6_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL6_C, (uint8_t *)®, 1); reg.ftype = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL6_C, (uint8_t *)®, 1); return mm_error; } /** * @brief gyro_lpf1_bandwidth: [get] Gyroscope's low-pass filter * (LPF1) bandwidth selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_ftype_t: Get the values of ftype in reg CTRL6_C * */ int32_t lsm6dsl_gyro_lpf1_bandwidth_get(lsm6dsl_ctx_t *ctx, lsm6dsl_ftype_t *val) { lsm6dsl_ctrl6_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL6_C, (uint8_t *)®, 1); *val = (lsm6dsl_ftype_t) reg.ftype; return mm_error; } /** * @brief xl_offset_weight: [set] Weight of XL user offset bits of * registers X_OFS_USR (73h), Y_OFS_USR (74h), * Z_OFS_USR (75h) * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_usr_off_w_t: change the values of usr_off_w in reg CTRL6_C * */ int32_t lsm6dsl_xl_offset_weight_set(lsm6dsl_ctx_t *ctx, lsm6dsl_usr_off_w_t val) { lsm6dsl_ctrl6_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL6_C, (uint8_t *)®, 1); reg.usr_off_w = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL6_C, (uint8_t *)®, 1); return mm_error; } /** * @brief xl_offset_weight: [get] Weight of XL user offset bits of * registers X_OFS_USR (73h), Y_OFS_USR (74h), * Z_OFS_USR (75h) * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_usr_off_w_t: Get the values of usr_off_w in reg CTRL6_C * */ int32_t lsm6dsl_xl_offset_weight_get(lsm6dsl_ctx_t *ctx, lsm6dsl_usr_off_w_t *val) { lsm6dsl_ctrl6_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL6_C, (uint8_t *)®, 1); *val = (lsm6dsl_usr_off_w_t) reg.usr_off_w; return mm_error; } /** * @brief xl_high_performance: [set] High-performance operating * mode disable for accelerometer. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_xl_hm_mode_t: change the values of xl_hm_mode * in reg CTRL6_C * */ int32_t lsm6dsl_xl_high_performance_set(lsm6dsl_ctx_t *ctx, lsm6dsl_xl_hm_mode_t val) { lsm6dsl_ctrl6_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL6_C, (uint8_t *)®, 1); reg.xl_hm_mode = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL6_C, (uint8_t *)®, 1); return mm_error; } /** * @brief xl_high_performance: [get] High-performance operating mode * disable for accelerometer. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_xl_hm_mode_t: Get the values of xl_hm_mode in reg CTRL6_C * */ int32_t lsm6dsl_xl_high_performance_get(lsm6dsl_ctx_t *ctx, lsm6dsl_xl_hm_mode_t *val) { lsm6dsl_ctrl6_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL6_C, (uint8_t *)®, 1); *val = (lsm6dsl_xl_hm_mode_t) reg.xl_hm_mode; return mm_error; } /** * @brief den_func_mode: [set] DEN functionality trigger mode selection. * (TRIG_EN & LVL_EN & LVL2_EN) * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_den_mode_t: change the values of den_mode in reg CTRL6_C * */ int32_t lsm6dsl_den_func_mode_set(lsm6dsl_ctx_t *ctx, lsm6dsl_den_mode_t val) { lsm6dsl_ctrl6_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL6_C, (uint8_t *)®, 1); reg.den_mode = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL6_C, (uint8_t *)®, 1); return mm_error; } /** * @brief den_func_mode: [get] DEN functionality trigger mode selection. * (TRIG_EN & LVL_EN & LVL2_EN) * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_den_mode_t: Get the values of den_mode in reg CTRL6_C * */ int32_t lsm6dsl_den_func_mode_get(lsm6dsl_ctx_t *ctx, lsm6dsl_den_mode_t *val) { lsm6dsl_ctrl6_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL6_C, (uint8_t *)®, 1); *val = (lsm6dsl_den_mode_t) reg.den_mode; return mm_error; } /** * @brief rounding_on_status: [set] Source register rounding function * on WAKE_UP_SRC (1Bh), TAP_SRC (1Ch), * D6D_SRC (1Dh), STATUS_REG (1Eh) * and FUNC_SRC (53h). * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_den_mode_t: change the values of rounding_status * in reg CTRL7_G * */ int32_t lsm6dsl_rounding_on_status_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_ctrl7_g_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL7_G, (uint8_t *)®, 1); reg.rounding_status = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL7_G, (uint8_t *)®, 1); return mm_error; } /** * @brief rounding_on_status: [get] Source register rounding function * on WAKE_UP_SRC (1Bh), TAP_SRC (1Ch), * D6D_SRC (1Dh), STATUS_REG (1Eh) * and FUNC_SRC (53h). * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of rounding_status in reg CTRL7_G * */ int32_t lsm6dsl_rounding_on_status_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_ctrl7_g_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL7_G, (uint8_t *)®, 1); *val = reg.rounding_status; return mm_error; } /** * @brief gyro_hp_cutoff: [set] Gyroscope digital HP filter * cutoff selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_hpm_g_t: change the values of hpm_g in reg CTRL7_G * */ int32_t lsm6dsl_gyro_hp_cutoff_set(lsm6dsl_ctx_t *ctx, lsm6dsl_hpm_g_t val) { lsm6dsl_ctrl7_g_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL7_G, (uint8_t *)®, 1); reg.hpm_g = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL7_G, (uint8_t *)®, 1); return mm_error; } /** * @brief gyro_hp_cutoff: [get] Gyroscope digital HP filter * cutoff selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_hpm_g_t: Get the values of hpm_g in reg CTRL7_G * */ int32_t lsm6dsl_gyro_hp_cutoff_get(lsm6dsl_ctx_t *ctx, lsm6dsl_hpm_g_t *val) { lsm6dsl_ctrl7_g_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL7_G, (uint8_t *)®, 1); *val = (lsm6dsl_hpm_g_t) reg.hpm_g; return mm_error; } /** * @brief gyro_hp_filter: [set] Gyroscope digital high-pass filter enable. * The filter is enabled only if the gyro * is in HP mode. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of hp_en_g in reg CTRL7_G * */ int32_t lsm6dsl_gyro_hp_filter_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_ctrl7_g_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL7_G, (uint8_t *)®, 1); reg.hp_en_g = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL7_G, (uint8_t *)®, 1); return mm_error; } /** * @brief gyro_hp_filter: [get] Gyroscope digital high-pass filter * enable. The filter is enabled only if the * gyro is in HP mode. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of hp_en_g in reg CTRL7_G * */ int32_t lsm6dsl_gyro_hp_filter_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_ctrl7_g_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL7_G, (uint8_t *)®, 1); *val = reg.hp_en_g; return mm_error; } /** * @brief gyro_high_performance: [set] High-performance operating * mode disable for gyroscope. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_g_hm_mode_t: change the values of g_hm_mode * in reg CTRL7_G * */ int32_t lsm6dsl_gyro_high_performance_set(lsm6dsl_ctx_t *ctx, lsm6dsl_g_hm_mode_t val) { lsm6dsl_ctrl7_g_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL7_G, (uint8_t *)®, 1); reg.g_hm_mode = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL7_G, (uint8_t *)®, 1); return mm_error; } /** * @brief gyro_high_performance: [get] High-performance operating * mode disable for gyroscope. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_g_hm_mode_t: Get the values of g_hm_mode in reg CTRL7_G * */ int32_t lsm6dsl_gyro_high_performance_get(lsm6dsl_ctx_t *ctx, lsm6dsl_g_hm_mode_t *val) { lsm6dsl_ctrl7_g_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL7_G, (uint8_t *)®, 1); *val = (lsm6dsl_g_hm_mode_t) reg.g_hm_mode; return mm_error; } /** * @brief data_on_6d: [set] Select data for 6d function. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_low_pass_on_6d_t: change the values of low_pass_on_6d * in reg CTRL8_XL * */ int32_t lsm6dsl_data_on_6d_set(lsm6dsl_ctx_t *ctx, lsm6dsl_low_pass_on_6d_t val) { lsm6dsl_ctrl8_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)®, 1); reg.low_pass_on_6d = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)®, 1); return mm_error; } /** * @brief data_on_6d: [get] Select data for 6d function. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_low_pass_on_6d_t: Get the values of low_pass_on_6d * in reg CTRL8_XL * */ int32_t lsm6dsl_data_on_6d_get(lsm6dsl_ctx_t *ctx, lsm6dsl_low_pass_on_6d_t *val) { lsm6dsl_ctrl8_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)®, 1); *val = (lsm6dsl_low_pass_on_6d_t) reg.low_pass_on_6d; return mm_error; } /** * @brief xl_out_data: [set] Accelerometer slope filter / high-pass * filter selection on outputs. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_hp_slope_xl_en_t: change the values of * hp_slope_xl_en in reg CTRL8_XL * */ int32_t lsm6dsl_xl_out_data_set(lsm6dsl_ctx_t *ctx, lsm6dsl_hp_slope_xl_en_t val) { lsm6dsl_ctrl8_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)®, 1); reg.hp_slope_xl_en = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)®, 1); return mm_error; } /** * @brief xl_out_data: [get] Accelerometer slope filter / high-pass * filter selection on outputs. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_hp_slope_xl_en_t: Get the values of hp_slope_xl_en * in reg CTRL8_XL * */ int32_t lsm6dsl_xl_out_data_get(lsm6dsl_ctx_t *ctx, lsm6dsl_hp_slope_xl_en_t *val) { lsm6dsl_ctrl8_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)®, 1); *val = (lsm6dsl_hp_slope_xl_en_t) reg.hp_slope_xl_en; return mm_error; } /** * @brief xl_composite_filter_input: [set] Accelerometer composite * filter input selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_input_composite_t: change the values of input_composite * in reg CTRL8_XL * */ int32_t lsm6dsl_xl_composite_filter_input_set(lsm6dsl_ctx_t *ctx, lsm6dsl_input_composite_t val) { lsm6dsl_ctrl8_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)®, 1); reg.input_composite = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)®, 1); return mm_error; } /** * @brief xl_composite_filter_input: [get] Accelerometer composite * filter input selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_input_composite_t: Get the values of input_composite * in reg CTRL8_XL * */ int32_t lsm6dsl_xl_composite_filter_input_get(lsm6dsl_ctx_t *ctx, lsm6dsl_input_composite_t *val) { lsm6dsl_ctrl8_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)®, 1); *val = (lsm6dsl_input_composite_t) reg.input_composite; return mm_error; } /** * @brief xl_hp_ref_mode: [set] Enable accelerometer HP filter * reference mode. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of hp_ref_mode in reg CTRL8_XL * */ int32_t lsm6dsl_xl_hp_ref_mode_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_ctrl8_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)®, 1); reg.hp_ref_mode = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)®, 1); return mm_error; } /** * @brief xl_hp_ref_mode: [get] Enable accelerometer HP filter * reference mode. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of hp_ref_mode in reg CTRL8_XL * */ int32_t lsm6dsl_xl_hp_ref_mode_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_ctrl8_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)®, 1); *val = reg.hp_ref_mode; return mm_error; } /** * @brief xl_cutoff: [set] Accelerometer LPF2 and high-pass filter * configuration and cutoff setting. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_hpcf_xl_t: change the values of hpcf_xl in reg CTRL8_XL * */ int32_t lsm6dsl_xl_cutoff_set(lsm6dsl_ctx_t *ctx, lsm6dsl_hpcf_xl_t val) { lsm6dsl_ctrl8_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)®, 1); reg.hpcf_xl = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)®, 1); return mm_error; } /** * @brief xl_cutoff: [get] Accelerometer LPF2 and high-pass filter * configuration and cutoff setting. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_hpcf_xl_t: Get the values of hpcf_xl in reg CTRL8_XL * */ int32_t lsm6dsl_xl_cutoff_get(lsm6dsl_ctx_t *ctx, lsm6dsl_hpcf_xl_t *val) { lsm6dsl_ctrl8_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)®, 1); *val = (lsm6dsl_hpcf_xl_t) reg.hpcf_xl; return mm_error; } /** * @brief xl_lpf2: [set] Accelerometer low-pass filter LPF2 selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of lpf2_xl_en in reg CTRL8_XL * */ int32_t lsm6dsl_xl_lpf2_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_ctrl8_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)®, 1); reg.lpf2_xl_en = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)®, 1); return mm_error; } /** * @brief xl_lpf2: [get] Accelerometer low-pass filter LPF2 selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of lpf2_xl_en in reg CTRL8_XL * */ int32_t lsm6dsl_xl_lpf2_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_ctrl8_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)®, 1); *val = reg.lpf2_xl_en; return mm_error; } /** * @brief soft_iron_correction: [set] Accelerometer composite * filter input selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of soft_en in reg CTRL9_XL * */ int32_t lsm6dsl_soft_iron_correction_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_ctrl9_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)®, 1); reg.soft_en = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)®, 1); return mm_error; } /** * @brief soft_iron_correction: [get] Accelerometer composite * filter input selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of soft_en in reg CTRL9_XL * */ int32_t lsm6dsl_soft_iron_correction_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_ctrl9_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)®, 1); *val = reg.soft_en; return mm_error; } /** * @brief den_stamping_selection: [set] DEN stamping sensor selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_den_xl_g_t: change the values of den_xl_g in reg CTRL9_XL * */ int32_t lsm6dsl_den_stamping_selection_set(lsm6dsl_ctx_t *ctx, lsm6dsl_den_xl_g_t val) { lsm6dsl_ctrl9_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)®, 1); reg.den_xl_g = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)®, 1); return mm_error; } /** * @brief den_stamping_selection: [get] DEN stamping sensor selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_den_xl_g_t: Get the values of den_xl_g in reg CTRL9_XL * */ int32_t lsm6dsl_den_stamping_selection_get(lsm6dsl_ctx_t *ctx, lsm6dsl_den_xl_g_t *val) { lsm6dsl_ctrl9_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)®, 1); *val = (lsm6dsl_den_xl_g_t) reg.den_xl_g; return mm_error; } /** * @brief den_store_on_x_axis: [set] DEN value stored in LSB of X-axis. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of den_x in reg CTRL9_XL * */ int32_t lsm6dsl_den_store_on_x_axis_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_ctrl9_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)®, 1); reg.den_x = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)®, 1); return mm_error; } /** * @brief den_store_on_x_axis: [get] DEN value stored in LSB of X-axis. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of den_x in reg CTRL9_XL * */ int32_t lsm6dsl_den_store_on_x_axis_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_ctrl9_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)®, 1); *val = reg.den_x; return mm_error; } /** * @brief den_store_on_y_axis: [set] DEN value stored in LSB of Y-axis. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of den_y in reg CTRL9_XL * */ int32_t lsm6dsl_den_store_on_y_axis_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_ctrl9_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)®, 1); reg.den_y = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)®, 1); return mm_error; } /** * @brief den_store_on_y_axis: [get] DEN value stored in LSB of Y-axis. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of den_y in reg CTRL9_XL * */ int32_t lsm6dsl_den_store_on_y_axis_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_ctrl9_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)®, 1); *val = reg.den_y; return mm_error; } /** * @brief den_store_on_z_axis: [set] DEN value stored in LSB of Z-axis. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of den_z in reg CTRL9_XL * */ int32_t lsm6dsl_den_store_on_z_axis_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_ctrl9_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)®, 1); reg.den_z = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)®, 1); return mm_error; } /** * @brief den_store_on_z_axis: [get] DEN value stored in LSB of Z-axis. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of den_z in reg CTRL9_XL * */ int32_t lsm6dsl_den_store_on_z_axis_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_ctrl9_xl_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)®, 1); *val = reg.den_z; return mm_error; } /** * @brief significant_motion: [set] Enable significant motion detection * function.This is effective if the FUNC_EN * bit is set to '1'. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of sign_motion_en in reg CTRL10_C * */ int32_t lsm6dsl_significant_motion_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_ctrl10_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)®, 1); reg.sign_motion_en = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)®, 1); return mm_error; } /** * @brief significant_motion: [get] Enable significant motion detection * function.This is effective if the FUNC_EN bit * is set to '1'. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of sign_motion_en in reg CTRL10_C * */ int32_t lsm6dsl_significant_motion_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_ctrl10_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)®, 1); *val = reg.sign_motion_en; return mm_error; } /** * @brief rst_step_counter: [set] Reset pedometer step counter. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of pedo_rst_step in * reg CTRL10_C * */ int32_t lsm6dsl_rst_step_counter_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_ctrl10_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)®, 1); reg.pedo_rst_step = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)®, 1); return mm_error; } /** * @brief rst_step_counter: [get] Reset pedometer step counter. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of pedo_rst_step in reg CTRL10_C * */ int32_t lsm6dsl_rst_step_counter_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_ctrl10_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)®, 1); *val = reg.pedo_rst_step; return mm_error; } /** * @brief embedded_functions: [set] Enable embedded functionalities * (pedometer, tilt, significant motion * detection, sensor hub and ironing). * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of func_en in reg CTRL10_C * */ int32_t lsm6dsl_embedded_functions_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_ctrl10_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)®, 1); reg.func_en = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)®, 1); return mm_error; } /** * @brief embedded_functions: [get] Enable embedded functionalities * (pedometer, tilt, significant motion * detection, sensor hub and ironing). * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of func_en in reg CTRL10_C * */ int32_t lsm6dsl_embedded_functions_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_ctrl10_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)®, 1); *val = reg.func_en; return mm_error; } /** * @brief tilt_calculation: [set] Enable tilt calculation.This is * effective if the FUNC_EN bit is set to '1'. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of tilt_en in reg CTRL10_C * */ int32_t lsm6dsl_tilt_calculation_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_ctrl10_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)®, 1); reg.tilt_en = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)®, 1); return mm_error; } /** * @brief tilt_calculation: [get] Enable tilt calculation.This is * effective if the FUNC_EN bit is set to '1'. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of tilt_en in reg CTRL10_C * */ int32_t lsm6dsl_tilt_calculation_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_ctrl10_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)®, 1); *val = reg.tilt_en; return mm_error; } /** * @brief pedometer: [set] Enable pedometer algorithm.This is effective * if the FUNC_EN bit is set to '1'. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of pedo_en in reg CTRL10_C * */ int32_t lsm6dsl_pedometer_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_ctrl10_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)®, 1); reg.pedo_en = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)®, 1); return mm_error; } /** * @brief pedometer: [get] Enable pedometer algorithm.This is effective * if the FUNC_EN bit is set to '1'. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of pedo_en in reg CTRL10_C * */ int32_t lsm6dsl_pedometer_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_ctrl10_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)®, 1); *val = reg.pedo_en; return mm_error; } /** * @brief timestamp_count: [set] Enable timestamp count. The count is * saved in TIMESTAMP0_REG (40h), * TIMESTAMP1_REG (41h) and TIMESTAMP2_REG (42h). * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of timer_en in reg CTRL10_C * */ int32_t lsm6dsl_timestamp_count_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_ctrl10_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)®, 1); reg.timer_en = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)®, 1); return mm_error; } /** * @brief timestamp_count: [get] Enable timestamp count. The count is * saved in TIMESTAMP0_REG (40h), * TIMESTAMP1_REG (41h) and TIMESTAMP2_REG (42h). * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of timer_en in reg CTRL10_C * */ int32_t lsm6dsl_timestamp_count_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_ctrl10_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)®, 1); *val = reg.timer_en; return mm_error; } /** * @brief wrist_tilt: [set] Enable wrist tilt algorithm. This is * effective if the FUNC_EN bit is set to '1'. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of wrist_tilt_en in reg CTRL10_C * */ int32_t lsm6dsl_wrist_tilt_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_ctrl10_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)®, 1); reg.wrist_tilt_en = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)®, 1); return mm_error; } /** * @brief wrist_tilt: [get] Enable wrist tilt algorithm. This is effective * if the FUNC_EN bit is set to '1'. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of wrist_tilt_en in reg CTRL10_C * */ int32_t lsm6dsl_wrist_tilt_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_ctrl10_c_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)®, 1); *val = reg.wrist_tilt_en; return mm_error; } /** * @brief hard_iron: [set] Enable hard-iron correction algorithm * for magnetometer. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of iron_en in reg MASTER_CONFIG * */ int32_t lsm6dsl_hard_iron_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_master_config_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)®, 1); reg.iron_en = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)®, 1); return mm_error; } /** * @brief hard_iron: [get] Enable hard-iron correction algorithm * for magnetometer. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of iron_en in reg MASTER_CONFIG * */ int32_t lsm6dsl_hard_iron_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_master_config_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)®, 1); *val = reg.iron_en; return mm_error; } /** * @brief letched_interrupts: [set] Latched/pulsed interrupt. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of lir in reg TAP_CFG * */ int32_t lsm6dsl_letched_interrupts_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_tap_cfg_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)®, 1); reg.lir = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)®, 1); return mm_error; } /** * @brief letched_interrupts: [get] Latched/pulsed interrupt. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of lir in reg TAP_CFG * */ int32_t lsm6dsl_letched_interrupts_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_tap_cfg_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)®, 1); *val = reg.lir; return mm_error; } /** * @brief tap_on_z_axis: [set] Enable Z direction in tap recognition. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of tap_z_en in reg TAP_CFG * */ int32_t lsm6dsl_tap_on_z_axis_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_tap_cfg_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)®, 1); reg.tap_z_en = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)®, 1); return mm_error; } /** * @brief tap_on_z_axis: [get] Enable Z direction in tap recognition. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of tap_z_en in reg TAP_CFG * */ int32_t lsm6dsl_tap_on_z_axis_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_tap_cfg_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)®, 1); *val = reg.tap_z_en; return mm_error; } /** * @brief tap_on_y_axis: [set] Enable Y direction in tap recognition. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of tap_y_en in reg TAP_CFG * */ int32_t lsm6dsl_tap_on_y_axis_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_tap_cfg_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)®, 1); reg.tap_y_en = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)®, 1); return mm_error; } /** * @brief tap_on_y_axis: [get] Enable Y direction in tap recognition. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of tap_y_en in reg TAP_CFG * */ int32_t lsm6dsl_tap_on_y_axis_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_tap_cfg_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)®, 1); *val = reg.tap_y_en; return mm_error; } /** * @brief tap_on_x_axis: [set] Enable X direction in tap recognition. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of tap_x_en in reg TAP_CFG * */ int32_t lsm6dsl_tap_on_x_axis_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_tap_cfg_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)®, 1); reg.tap_x_en = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)®, 1); return mm_error; } /** * @brief tap_on_x_axis: [get] Enable X direction in tap recognition. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of tap_x_en in reg TAP_CFG * */ int32_t lsm6dsl_tap_on_x_axis_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_tap_cfg_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)®, 1); *val = reg.tap_x_en; return mm_error; } /** * @brief inactivity_mode: [set] Enable inactivity function. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_inact_en_t: change the values of inact_en in reg TAP_CFG * */ int32_t lsm6dsl_inactivity_mode_set(lsm6dsl_ctx_t *ctx, lsm6dsl_inact_en_t val) { lsm6dsl_tap_cfg_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)®, 1); reg.inact_en = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)®, 1); return mm_error; } /** * @brief inactivity_mode: [get] Enable inactivity function. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_inact_en_t: Get the values of inact_en in reg TAP_CFG * */ int32_t lsm6dsl_inactivity_mode_get(lsm6dsl_ctx_t *ctx, lsm6dsl_inact_en_t *val) { lsm6dsl_tap_cfg_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)®, 1); *val = (lsm6dsl_inact_en_t) reg.inact_en; return mm_error; } /** * @brief enable_basic_interrupts: [set] Enable basic interrupts * (6D/4D, free-fall, wake-up, tap, * inactivity). * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of interrupts_enable in reg TAP_CFG * */ int32_t lsm6dsl_enable_basic_interrupts_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_tap_cfg_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)®, 1); reg.interrupts_enable = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)®, 1); return mm_error; } /** * @brief enable_basic_interrupts: [get] Enable basic interrupts (6D/4D, * free-fall, wake-up, tap, inactivity). * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of interrupts_enable in reg TAP_CFG * */ int32_t lsm6dsl_enable_basic_interrupts_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_tap_cfg_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)®, 1); *val = reg.interrupts_enable; return mm_error; } /** * @brief threshold_6d_3d: [set] Threshold for 4D/6D function. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_sixd_ths_t: change the values of sixd_ths in * reg TAP_THS_6D * */ int32_t lsm6dsl_threshold_6d_3d_set(lsm6dsl_ctx_t *ctx, lsm6dsl_sixd_ths_t val) { lsm6dsl_tap_ths_6d_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_THS_6D, (uint8_t *)®, 1); reg.sixd_ths = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_TAP_THS_6D, (uint8_t *)®, 1); return mm_error; } /** * @brief threshold_6d_3d: [get] Threshold for 4D/6D function. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_sixd_ths_t: Get the values of sixd_ths in reg TAP_THS_6D * */ int32_t lsm6dsl_threshold_6d_3d_get(lsm6dsl_ctx_t *ctx, lsm6dsl_sixd_ths_t *val) { lsm6dsl_tap_ths_6d_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_THS_6D, (uint8_t *)®, 1); *val = (lsm6dsl_sixd_ths_t) reg.sixd_ths; return mm_error; } /** * @brief reduce_6d_to_4d: [set] 4D orientation detection enable. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of d4d_en in reg TAP_THS_6D * */ int32_t lsm6dsl_reduce_6d_to_4d_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_tap_ths_6d_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_THS_6D, (uint8_t *)®, 1); reg.d4d_en = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_TAP_THS_6D, (uint8_t *)®, 1); return mm_error; } /** * @brief reduce_6d_to_4d: [get] 4D orientation detection enable. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of d4d_en in reg TAP_THS_6D * */ int32_t lsm6dsl_reduce_6d_to_4d_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_tap_ths_6d_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_THS_6D, (uint8_t *)®, 1); *val = reg.d4d_en; return mm_error; } /** * @brief tap_mode: [set] Single/double-tap event enable. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_single_double_tap_t: change the values of * single_double_tap in * reg WAKE_UP_THS * */ int32_t lsm6dsl_tap_mode_set(lsm6dsl_ctx_t *ctx, lsm6dsl_single_double_tap_t val) { lsm6dsl_wake_up_ths_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_WAKE_UP_THS, (uint8_t *)®, 1); reg.single_double_tap = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_WAKE_UP_THS, (uint8_t *)®, 1); return mm_error; } /** * @brief tap_mode: [get] Single/double-tap event enable. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_single_double_tap_t: Get the values of single_double_tap * in reg WAKE_UP_THS * */ int32_t lsm6dsl_tap_mode_get(lsm6dsl_ctx_t *ctx, lsm6dsl_single_double_tap_t *val) { lsm6dsl_wake_up_ths_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_WAKE_UP_THS, (uint8_t *)®, 1); *val = (lsm6dsl_single_double_tap_t) reg.single_double_tap; return mm_error; } /** * @brief timestamp_resolution: [set] Timestamp register resolution * setting. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_timer_hr_t: change the values of timer_hr * in reg WAKE_UP_DUR * */ int32_t lsm6dsl_timestamp_resolution_set(lsm6dsl_ctx_t *ctx, lsm6dsl_timer_hr_t val) { lsm6dsl_wake_up_dur_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_WAKE_UP_DUR, (uint8_t *)®, 1); reg.timer_hr = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_WAKE_UP_DUR, (uint8_t *)®, 1); return mm_error; } /** * @brief timestamp_resolution: [get] Timestamp register * resolution setting. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_timer_hr_t: Get the values of timer_hr in * reg WAKE_UP_DUR * */ int32_t lsm6dsl_timestamp_resolution_get(lsm6dsl_ctx_t *ctx, lsm6dsl_timer_hr_t *val) { lsm6dsl_wake_up_dur_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_WAKE_UP_DUR, (uint8_t *)®, 1); *val = (lsm6dsl_timer_hr_t) reg.timer_hr; return mm_error; } /** * @brief free_fall_threshold: [set] Free fall threshold setting. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_ff_ths_t: change the values of ff_ths in reg FREE_FALL * */ int32_t lsm6dsl_free_fall_threshold_set(lsm6dsl_ctx_t *ctx, lsm6dsl_ff_ths_t val) { lsm6dsl_free_fall_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FREE_FALL, (uint8_t *)®, 1); reg.ff_ths = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FREE_FALL, (uint8_t *)®, 1); return mm_error; } /** * @brief free_fall_threshold: [get] Free fall threshold setting. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_ff_ths_t: Get the values of ff_ths in reg FREE_FALL * */ int32_t lsm6dsl_free_fall_threshold_get(lsm6dsl_ctx_t *ctx, lsm6dsl_ff_ths_t *val) { lsm6dsl_free_fall_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FREE_FALL, (uint8_t *)®, 1); *val = (lsm6dsl_ff_ths_t) reg.ff_ths; return mm_error; } /** * @brief int1_routing: [set] Functions routing on INT1 pad * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_md1_cfg_t: change the values of reg MD1_CFG * */ int32_t lsm6dsl_int1_routing_set(lsm6dsl_ctx_t *ctx, lsm6dsl_md1_cfg_t val) { int32_t mm_error; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_MD1_CFG, (uint8_t *)&val, 1); return mm_error; } /** * @brief int1_routing: [get] Functions routing on INT1 pad * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_md1_cfg_t: change the values of reg MD1_CFG * */ int32_t lsm6dsl_int1_routing_get(lsm6dsl_ctx_t *ctx, lsm6dsl_md1_cfg_t *val) { int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MD1_CFG, (uint8_t *)val, 1); return mm_error; } /** * @brief int2_routing: [set] Functions routing on INT2 pad * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_md2_cfg_t: change the values of reg MD2_CFG * */ int32_t lsm6dsl_int2_routing_set(lsm6dsl_ctx_t *ctx, lsm6dsl_md2_cfg_t val) { int32_t mm_error; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_MD2_CFG, (uint8_t *)&val, 1); return mm_error; } /** * @brief int2_routing: [get] Functions routing on INT2 pad * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_md2_cfg_t: change the values of reg MD2_CFG * */ int32_t lsm6dsl_int2_routing_get(lsm6dsl_ctx_t *ctx, lsm6dsl_md2_cfg_t *val) { int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MD2_CFG, (uint8_t *)val, 1); return mm_error; } /** * @brief sincro_time_frame: [set] sensor_synchronization time frame * with the step of 500 ms and full range of 5 s. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of tph * */ int32_t lsm6dsl_sincro_time_frame_set(lsm6dsl_ctx_t *ctx, uint8_t val) { int32_t mm_error; uint8_t reg; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_SENSOR_SYNC_TIME_FRAME, (uint8_t *)®, sizeof(uint8_t)); reg &= 0xF0; reg |= (val & 0x0F); mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_SENSOR_SYNC_TIME_FRAME, (uint8_t *)®, sizeof(uint8_t)); return mm_error; } /** * @brief sincro_time_frame: [get] sensor_synchronization time frame * with the step of 500 ms and full range of 5 s. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: get the values of tph * */ int32_t lsm6dsl_sincro_time_frame_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_SENSOR_SYNC_TIME_FRAME, val, sizeof(uint8_t)); *val &= 0x0F; return mm_error; } /** * @brief timestamp: [get] timestamp value in DIGIT * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param axis1bit32_t : union that group together the timestamp data * */ int32_t lsm6dsl_timestamp_raw(lsm6dsl_ctx_t *ctx, axis1bit32_t *buff) { return lsm6dsl_read_reg(ctx, LSM6DSL_TIMESTAMP0_REG, (uint8_t *) buff, sizeof(axis1bit32_t)); } /** * @brief step_timestamp: [get] step_timestamp value in DIGIT * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param axis1bit16_t : union that group together the step_timestamp data * */ int32_t lsm6dsl_step_timestamp_raw(lsm6dsl_ctx_t *ctx, axis1bit16_t *buff) { return lsm6dsl_read_reg(ctx, LSM6DSL_STEP_TIMESTAMP_L, (uint8_t *) buff, sizeof(axis1bit16_t)); } /** * @brief step_counter: [get] step_counter value in DIGIT * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param axis1bit16_t : union that group together the step_counter data * */ int32_t lsm6dsl_step_counter_raw(lsm6dsl_ctx_t *ctx, axis1bit16_t *buff) { return lsm6dsl_read_reg(ctx, LSM6DSL_STEP_COUNTER_L, (uint8_t *) buff, sizeof(axis1bit16_t)); } /** * @brief tap_treshold: [set] Threshold for tap recognition. 1 LSb * corresponds to FS_XL/32. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of tap_ths * */ int32_t lsm6dsl_tap_treshold_set(lsm6dsl_ctx_t *ctx, uint8_t val) { int32_t mm_error; uint8_t reg; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_THS_6D, (uint8_t *)®, sizeof(uint8_t)); reg &= 0xE0; reg |= (val & 0x1F); mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_TAP_THS_6D, (uint8_t *)®, sizeof(uint8_t)); return mm_error; } /** * @brief tap_treshold: [get] Threshold for tap recognition. * 1 LSb corresponds to FS_XL/32. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: get the values of tap_ths * */ int32_t lsm6dsl_tap_treshold_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_THS_6D, val, sizeof(uint8_t)); *val &= 0x1F; return mm_error; } /** * @brief gap_double_tap: [set] Duration of maximum time gap for double * tap recognition. The default value of these bits * is 0000b which corresponds to 16*ODR_XL time. * If the DUR[3:0] bits are set to a different value, * 1LSB corresponds to 32*ODR_XL time. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of dur * */ int32_t lsm6dsl_gap_double_tap_set(lsm6dsl_ctx_t *ctx, uint8_t val) { int32_t mm_error; uint8_t reg; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT_DUR2, (uint8_t *)®, sizeof(uint8_t)); reg &= 0x0F; reg |= ((val << 4) & 0xF0); mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT_DUR2, (uint8_t *)®, sizeof(uint8_t)); return mm_error; } /** * @brief gap_double_tap: [get] Duration of maximum time gap for double * tap recognition. The default value of these * bits is 0000b which corresponds to 16*ODR_XL time. * If the DUR[3:0] bits are set to a different value, * 1LSB corresponds to 32*ODR_XL time. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: get the values of dur * */ int32_t lsm6dsl_gap_double_tap_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT_DUR2, val, sizeof(uint8_t)); *val &= 0xF0 >> 4; return mm_error; } /** * @brief quiet_after_tap: [set] Quiet time is the time after the first * detected tap in which there must not be any * overthreshold event. The default value of these * bits is 00b which corresponds to 2*ODR_XL time. * If the QUIET[1:0] bits are set to a different * value, 1LSB corresponds to 4*ODR_XL time. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of quiet * */ int32_t lsm6dsl_quiet_after_tap_set(lsm6dsl_ctx_t *ctx, uint8_t val) { int32_t mm_error; uint8_t reg; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT_DUR2, (uint8_t *)®, sizeof(uint8_t)); reg &= ~0x0C; reg |= ((val << 2) & 0x0C); mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT_DUR2, (uint8_t *)®, sizeof(uint8_t)); return mm_error; } /** * @brief quiet_after_tap: [get] Quiet time is the time after the first * detected tap in which there must not be any * overthreshold event. The default value of these * bits is 00b which corresponds to 2*ODR_XL time. * If the QUIET[1:0] bits are set to a different * value, 1LSB corresponds to 4*ODR_XL time. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: get the values of quiet * */ int32_t lsm6dsl_quiet_after_tap_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT_DUR2, val, sizeof(uint8_t)); *val &= 0x0C >> 2; return mm_error; } /** * @brief duration_tap_overthreshold: [set] Maximum duration is the * maximum time of an overthreshold * signal detection to be recognized as * a tap event. The default value of * these bits is 00b which corresponds * to 4*ODR_XL time. If the SHOCK[1:0] * bits are set to a different value, * 1LSB corresponds to 8*ODR_XL time. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of shock * */ int32_t lsm6dsl_duration_tap_overthreshold_set(lsm6dsl_ctx_t *ctx, uint8_t val) { int32_t mm_error; uint8_t reg; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT_DUR2, (uint8_t *)®, sizeof(uint8_t)); reg &= ~0x03; reg |= (val & 0x03); mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT_DUR2, (uint8_t *)®, sizeof(uint8_t)); return mm_error; } /** * @brief duration_tap_overthreshold: [get] Maximum duration is the * maximum time of an overthreshold * signal detection to be recognized as * a tap event. The default value of * these bits is 00b which correspondsto * 4*ODR_XL time. If the SHOCK[1:0] bits * are set to a different value, * 1LSB corresponds to 8*ODR_XL time. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: get the values of shock * */ int32_t lsm6dsl_duration_tap_overthreshold_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT_DUR2, val, sizeof(uint8_t)); *val &= 0x03 >> 2; return mm_error; } /** * @brief threshold_wakeup: [set] Threshold for wake-up. 1 LSb corresponds * to FS_XL/64 * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of wk_ths * */ int32_t lsm6dsl_threshold_wakeup_set(lsm6dsl_ctx_t *ctx, uint8_t val) { int32_t mm_error; uint8_t reg; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_WAKE_UP_THS, (uint8_t *)®, sizeof(uint8_t)); reg &= ~0x3F; reg |= (val & 0x3F); mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_WAKE_UP_THS, (uint8_t *)®, sizeof(uint8_t)); return mm_error; } /** * @brief threshold_wakeup: [get] Threshold for wake-up. 1 LSb corresponds * to FS_XL/64 * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: get the values of wk_ths * */ int32_t lsm6dsl_threshold_wakeup_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_WAKE_UP_THS, val, sizeof(uint8_t)); *val &= 0x3F >> 2; return mm_error; } /** * @brief wait_before_sleep: [set] Duration to go in sleep mode. Default * value: 0000 (this corresponds to 16 ODR) * 1 LSB = 512 ODR * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of sleep_dur * */ int32_t lsm6dsl_wait_before_sleep_set(lsm6dsl_ctx_t *ctx, uint8_t val) { int32_t mm_error; lsm6dsl_wake_up_dur_t reg; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_WAKE_UP_DUR, (uint8_t *)®, sizeof(uint8_t)); reg.sleep_dur = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_WAKE_UP_DUR, (uint8_t *)®, sizeof(uint8_t)); return mm_error; } /** * @brief wait_before_sleep: [get] Duration to go in sleep mode. * Default value: 0000 (this corresponds * to 16 ODR) 1 LSB = 512 ODR * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: get the values of sleep_dur * */ int32_t lsm6dsl_wait_before_sleep_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_WAKE_UP_DUR, val, sizeof(uint8_t)); *val &= 0x0F >> 2; return mm_error; } /** * @brief lsm6dsl_wakeup_dur: [set] Wake-up duration event. * 1LSB = 1 ODR_time * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of wake_dur * */ int32_t lsm6dsl_wakeup_dur_set(lsm6dsl_ctx_t *ctx, uint8_t val) { int32_t mm_error; lsm6dsl_wake_up_dur_t reg; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_WAKE_UP_DUR, (uint8_t *)®, sizeof(uint8_t)); reg.wake_dur = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_WAKE_UP_DUR, (uint8_t *)®, sizeof(uint8_t)); return mm_error; } /** * @brief lsm6dsl_wakeup_dur: [get] Wake-up duration event. * 1LSB = 1 ODR_time * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: get the values of wake_dur * */ int32_t lsm6dsl_wakeup_dur_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_WAKE_UP_DUR, val, sizeof(uint8_t)); *val &= 0x60 >> 5; return mm_error; } /** * @brief free_fall_duration: [set] For the complete configuration of * the free fall duration, refer to FF_DUR5 in * WAKE_UP_DUR (5Ch) configuration. * Value is expressed in number of samples * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of ff_dur * */ int32_t lsm6dsl_free_fall_duration_set(lsm6dsl_ctx_t *ctx, uint8_t val) { int32_t mm_error; uint8_t reg; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FREE_FALL, (uint8_t *)®, sizeof(uint8_t)); reg &= ~0xF8; reg |= ((val << 3) & 0xF8); mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FREE_FALL, (uint8_t *)®, sizeof(uint8_t)); mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_WAKE_UP_DUR, (uint8_t *)®, sizeof(uint8_t)); reg &= ~0x80; reg |= ((val << 7) & 0x80); mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_WAKE_UP_DUR, (uint8_t *)®, sizeof(uint8_t)); return mm_error; } /** * @brief free_fall_duration: [get] For the complete configuration of * the free fall duration, refer to FF_DUR5 * in WAKE_UP_DUR (5Ch) configuration. * Value is expressed in number of samples * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: get the values of ff_dur * */ int32_t lsm6dsl_free_fall_duration_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { int32_t mm_error; uint8_t reg; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FREE_FALL, ®, sizeof(uint8_t)); *val = (reg & 0xF8) >> 3; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_WAKE_UP_DUR, ®, sizeof(uint8_t)); *val |= (reg & 0x80) >> 2; return mm_error; } /** * @brief master_error_code: [get] master_error_code value in DIGIT * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t : union that group together the master_error_code data * */ int32_t lsm6dsl_master_error_code_raw(lsm6dsl_ctx_t *ctx, uint8_t *buff) { return lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CMD_CODE, (uint8_t *) buff, sizeof(uint8_t)); } /** * @brief synchro_error_code: [get] synchro_error_code value in DIGIT * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t : union that group together the synchro_error_code data * */ int32_t lsm6dsl_synchro_error_code_raw(lsm6dsl_ctx_t *ctx, uint8_t *buff) { return lsm6dsl_read_reg(ctx, LSM6DSL_SENS_SYNC_SPI_ERROR_CODE, (uint8_t *) buff, sizeof(uint8_t)); } /** * @brief ext_magnetometer: [get] ext_magnetometer value in DIGIT * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param axis3bit16_t : union that group together the ext_magnetometer data * */ int32_t lsm6dsl_ext_magnetometer_raw(lsm6dsl_ctx_t *ctx, axis3bit16_t *buff) { return lsm6dsl_read_reg(ctx, LSM6DSL_OUT_MAG_RAW_X_L, (uint8_t *) buff, sizeof(axis3bit16_t)); } /** * @brief xl_x_axis_offset: [set] Accelerometer X-axis user offset * correction expressed in two’s complement, * weight depends on CTRL6_C(4) bit. * The value must be in the range [-127 127]. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of x_ofs_usr * */ int32_t lsm6dsl_xl_x_axis_offset_set(lsm6dsl_ctx_t *ctx, uint8_t val) { int32_t mm_error; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_X_OFS_USR, &val, sizeof(uint8_t)); return mm_error; } /** * @brief xl_x_axis_offset: [get] Accelerometer X-axis user offset * correction expressed in two’s complement, * weight depends on CTRL6_C(4) bit. * The value must be in the range [-127 127]. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: get the values of x_ofs_usr * */ int32_t lsm6dsl_xl_x_axis_offset_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_X_OFS_USR, val, sizeof(uint8_t)); return mm_error; } /** * @brief xl_y_axis_offset: [set] Accelerometer Y-axis user offset * correction expressed in two’s complement, * weight depends on CTRL6_C(4) bit. * The value must be in the range [-127 127]. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of y_ofs_usr * */ int32_t lsm6dsl_xl_y_axis_offset_set(lsm6dsl_ctx_t *ctx, uint8_t val) { int32_t mm_error; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_Y_OFS_USR, &val, sizeof(uint8_t)); return mm_error; } /** * @brief xl_y_axis_offset: [get] Accelerometer Y-axis user offset * correction expressed in two’s complement, * weight depends on CTRL6_C(4) bit. * The value must be in the range [-127 127]. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: get the values of y_ofs_usr * */ int32_t lsm6dsl_xl_y_axis_offset_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_Y_OFS_USR, val, sizeof(uint8_t)); return mm_error; } /** * @brief xl_z_axis_offset: [set] Accelerometer Z-axis user offset * correction expressed in two’s complement, * weight depends on CTRL6_C(4) bit. * The value must be in the range [-127 127]. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of y_ofs_usr * */ int32_t lsm6dsl_xl_z_axis_offset_set(lsm6dsl_ctx_t *ctx, uint8_t val) { int32_t mm_error; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_Z_OFS_USR, &val, sizeof(uint8_t)); return mm_error; } /** * @brief xl_z_axis_offset: [get] Accelerometer Z-axis user offset * correction expressed in two’s complement, * weight depends on CTRL6_C(4) bit. * The value must be in the range [-127 127]. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: get the values of y_ofs_usr * */ int32_t lsm6dsl_xl_z_axis_offset_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_Z_OFS_USR, val, sizeof(uint8_t)); return mm_error; } /** * @brief sensor_hub_i2c: [set] Sensor hub I2C master enable. * This is effective if the FUNC_EN bit * is set to '1'. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of master_on in reg MASTER_CONFIG * */ int32_t lsm6dsl_sensor_hub_i2c_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_master_config_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)®, 1); reg.master_on = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)®, 1); return mm_error; } /** * @brief sensor_hub_i2c: [get] Sensor hub I2C master enable. This * is effective if the FUNC_EN bit is set to '1'. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of master_on in reg MASTER_CONFIG * */ int32_t lsm6dsl_sensor_hub_i2c_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_master_config_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)®, 1); *val = reg.master_on; return mm_error; } /** * @brief sensor_hub_pass_through: [set] Sensor hub I2C interface act * as pass-through. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of pass_through_mode * in reg MASTER_CONFIG * */ int32_t lsm6dsl_sensor_hub_pass_through_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_master_config_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)®, 1); reg.pass_through_mode = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)®, 1); return mm_error; } /** * @brief sensor_hub_pass_through: [get] Sensor hub I2C interface act * as pass-through. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of pass_through_mode * in reg MASTER_CONFIG * */ int32_t lsm6dsl_sensor_hub_pass_through_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_master_config_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)®, 1); *val = reg.pass_through_mode; return mm_error; } /** * @brief sensor_hub_pull_up: [set] Auxiliary I2C pull-up. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_pull_up_en_t: change the values of pull_up_en * in reg MASTER_CONFIG * */ int32_t lsm6dsl_sensor_hub_pull_up_set(lsm6dsl_ctx_t *ctx, lsm6dsl_pull_up_en_t val) { lsm6dsl_master_config_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)®, 1); reg.pull_up_en = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)®, 1); return mm_error; } /** * @brief sensor_hub_pull_up: [get] Auxiliary I2C pull-up. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_pull_up_en_t: Get the values of pull_up_en * in reg MASTER_CONFIG * */ int32_t lsm6dsl_sensor_hub_pull_up_get(lsm6dsl_ctx_t *ctx, lsm6dsl_pull_up_en_t *val) { lsm6dsl_master_config_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)®, 1); *val = (lsm6dsl_pull_up_en_t) reg.pull_up_en; return mm_error; } /** * @brief sensor_hub_op_trigger: [set] Sensor Hub trigger signal selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_start_config_t: change the values of start_config * in reg MASTER_CONFIG * */ int32_t lsm6dsl_sensor_hub_op_trigger_set(lsm6dsl_ctx_t *ctx, lsm6dsl_start_config_t val) { lsm6dsl_master_config_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)®, 1); reg.start_config = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)®, 1); return mm_error; } /** * @brief sensor_hub_op_trigger: [get] Sensor Hub trigger signal selection. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_start_config_t: Get the values of start_config * in reg MASTER_CONFIG * */ int32_t lsm6dsl_sensor_hub_op_trigger_get(lsm6dsl_ctx_t *ctx, lsm6dsl_start_config_t *val) { lsm6dsl_master_config_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)®, 1); *val = (lsm6dsl_start_config_t) reg.start_config; return mm_error; } /** * @brief sensor_hub_drdy_on_int1: [set] Manage the Master DRDY * signal on INT1 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t val: change the values of drdy_on_int1 * in reg MASTER_CONFIG * */ int32_t lsm6dsl_sensor_hub_drdy_on_int1_set(lsm6dsl_ctx_t *ctx, uint8_t val) { lsm6dsl_master_config_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)®, 1); reg.drdy_on_int1 = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)®, 1); return mm_error; } /** * @brief sensor_hub_drdy_on_int1: [get] Manage the Master DRDY * signal on INT1 pad. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t: change the values of drdy_on_int1 in * reg MASTER_CONFIG * */ int32_t lsm6dsl_sensor_hub_drdy_on_int1_get(lsm6dsl_ctx_t *ctx, uint8_t *val) { lsm6dsl_master_config_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)®, 1); *val = reg.drdy_on_int1; return mm_error; } /** * @brief res_ratio: [set] Resolution ratio of error code for * sensor_synchronization * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_rr_t: change the values of rr in * reg SENSOR_SYNC_RES_RATIO * */ int32_t lsm6dsl_res_ratio_set(lsm6dsl_ctx_t *ctx, lsm6dsl_rr_t val) { lsm6dsl_sensor_sync_res_ratio_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_SENSOR_SYNC_RES_RATIO, (uint8_t *)®, 1); reg.rr = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_SENSOR_SYNC_RES_RATIO, (uint8_t *)®, 1); return mm_error; } /** * @brief res_ratio: [get] Resolution ratio of error code for * sensor_synchronization * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_rr_t: Get the values of rr in * reg SENSOR_SYNC_RES_RATIO * */ int32_t lsm6dsl_res_ratio_get(lsm6dsl_ctx_t *ctx, lsm6dsl_rr_t *val) { lsm6dsl_sensor_sync_res_ratio_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_SENSOR_SYNC_RES_RATIO, (uint8_t *)®, 1); *val = (lsm6dsl_rr_t) reg.rr; return mm_error; } /** * @brief sensorhub_set1_out: [get] sensorhub_set1_out value in DIGIT * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t : union that group together the sensorhub_set1_out data * */ int32_t lsm6dsl_sensorhub_set1_out_raw(lsm6dsl_ctx_t *ctx, uint8_t *buff) { return lsm6dsl_read_reg(ctx, LSM6DSL_SENSORHUB1_REG, (uint8_t *) buff, sizeof(uint8_t)); } /** * @brief sensorhub_set2_out: [get] sensorhub_set2_out value in DIGIT * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param uint8_t : union that group together the sensorhub_set2_out data * */ int32_t lsm6dsl_sensorhub_set2_out_raw(lsm6dsl_ctx_t *ctx, uint8_t *buff) { return lsm6dsl_read_reg(ctx, LSM6DSL_SENSORHUB13_REG, (uint8_t *) buff, sizeof(uint8_t)); } /** * @brief change_bank: [set] Enable access to the embedded_functions * configuration registers bank A and B * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_func_cfg_en_t: change the values of func_cfg_en * in reg FUNC_CFG_EN * */ int32_t lsm6dsl_change_bank_set(lsm6dsl_ctx_t *ctx, lsm6dsl_func_cfg_en_t val) { lsm6dsl_func_cfg_access_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FUNC_CFG_ACCESS, (uint8_t *)®, 1); reg.func_cfg_en = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FUNC_CFG_ACCESS, (uint8_t *)®, 1); return mm_error; } /** * @brief change_bank: [get] Enable access to the embedded_functions * configuration registers bank A and B * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_func_cfg_en_t: Get the values of func_cfg_en * in reg FUNC_CFG_EN * */ int32_t lsm6dsl_change_bank_get(lsm6dsl_ctx_t *ctx, lsm6dsl_func_cfg_en_t *val) { lsm6dsl_func_cfg_access_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FUNC_CFG_ACCESS, (uint8_t *)®, 1); *val = (lsm6dsl_func_cfg_en_t) reg.func_cfg_en; return mm_error; } /** * @brief data_for_wake_up: [set] HPF or SLOPE filter selection on * wake-up and Activity/Inactivity functions. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_slope_fds_t: change the values of slope_fds in reg TAP_CFG * */ int32_t lsm6dsl_data_for_wake_up_set(lsm6dsl_ctx_t *ctx, lsm6dsl_slope_fds_t val) { lsm6dsl_tap_cfg_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)®, 1); reg.slope_fds = val; mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)®, 1); return mm_error; } /** * @brief data_for_wake_up: [get] HPF or SLOPE filter selection * on wake-up and Activity/Inactivity functions. * * @param lsm6dsl_ctx_t *ctx: read / write interface definitions * @param lsm6dsl_slope_fds_t: Get the values of slope_fds in reg TAP_CFG * */ int32_t lsm6dsl_data_for_wake_up_get(lsm6dsl_ctx_t *ctx, lsm6dsl_slope_fds_t *val) { lsm6dsl_tap_cfg_t reg; int32_t mm_error; mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)®, 1); *val = (lsm6dsl_slope_fds_t) reg.slope_fds; return mm_error; } /** * @} */ /** * @} */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ lsm6dsl_odr_xl_t xl_odr_temp = XL_104Hz; u8 lsm6dsl_xl_power_down() { int32_t mm_error; mm_error = lsm6dsl_xl_data_rate_get(&lsm6dsl_ctx, &xl_odr_temp); if (mm_error != 1) { xl_odr_temp = XL_OFF; log_error("lsm6dsl acc power down fail!"); return 0; } log_info("xl_odr:%d", xl_odr_temp); mm_error = lsm6dsl_xl_data_rate_set(&lsm6dsl_ctx, XL_OFF); if (mm_error == 1) { log_info("lsm6dsl acc power down ok!"); return 1; } else { log_error("lsm6dsl acc power down fail!"); return 0; } } u8 lsm6dsl_xl_wake_up() { int32_t mm_error; if (xl_odr_temp == XL_OFF) { log_error("lsm6dsl acc wake up fail!"); return 0; } mm_error = lsm6dsl_xl_data_rate_set(&lsm6dsl_ctx, xl_odr_temp); if (mm_error == 1) { log_info("lsm6dsl acc wake up ok!"); return 1; } else { log_error("lsm6dsl acc wake up fail!"); return 0; } } lsm6dsl_odr_g_t g_odr_temp = GY_104Hz; u8 lsm6dsl_g_power_down() { int32_t mm_error; mm_error = lsm6dsl_gyro_data_rate_get(&lsm6dsl_ctx, &g_odr_temp); if (mm_error != 1) { g_odr_temp = GY_OFF; log_error("lsm6dsl gyro power down fail!"); return 0; } log_info("g_odr:%d", g_odr_temp); mm_error = lsm6dsl_gyro_data_rate_set(&lsm6dsl_ctx, GY_OFF); if (mm_error == 1) { log_info("lsm6dsl gyro power down ok!"); return 1; } else { log_error("lsm6dsl gyro power down fail!"); return 0; } } u8 lsm6dsl_g_wake_up() { int32_t mm_error; if (g_odr_temp == GY_OFF) { log_error("lsm6dsl gyro wake up fail!"); return 0; } mm_error = lsm6dsl_gyro_data_rate_set(&lsm6dsl_ctx, g_odr_temp); if (mm_error == 1) { log_info("lsm6dsl gyro wake up ok!"); return 1; } else { log_error("lsm6dsl gyro wake up fail!"); return 0; } } unsigned char lsm6dsl_init() { unsigned char lsm6dsl_chip_id = 0x00, rst; unsigned char lsm6dsl_revision_id = 0x00; unsigned char iCount = 0; unsigned char fw_version[3] = {0}; unsigned char usid_version[6] = {0}; #if (LSM6DSL_USER_INTERFACE==LSM6DSL_USE_SPI) if (lsm6dsl_info->spi_work_mode) { lsm6dsl_spi_mode_set(&lsm6dsl_ctx, 1);//使能spi_3_wire } else { lsm6dsl_spi_mode_set(&lsm6dsl_ctx, 0);//使能spi_4_wire } #endif /* Check device ID */ while ((lsm6dsl_chip_id != LSM6DSL_ID) && (iCount < 10)) { lsm6dsl_device_id(&lsm6dsl_ctx, &lsm6dsl_chip_id); if (lsm6dsl_chip_id == LSM6DSL_ID) { break; } iCount++; mdelay(1); } if (lsm6dsl_chip_id == LSM6DSL_ID) { /* Restore default configuration */ lsm6dsl_reset_set(&lsm6dsl_ctx, PROPERTY_ENABLE); do { lsm6dsl_reset_get(&lsm6dsl_ctx, &rst); } while (rst); log_info("lsm6dsl_init slave=0x%x lsm6dslRegister_WhoAmI=0x%x\n", LSM6DSL_IIC_SLAVE_ADDRESS, lsm6dsl_chip_id); #if (LSM6DSL_USE_TAP_EN) /* tap_enable(); */ #endif #if (LSM6DSL_USE_ANYMOTION_EN) /* anymotion_lowpwr_config(); */ #endif #if (LSM6DSL_USE_FIFO_EN) lsm6dsl_fifo_write_mode_set(&lsm6dsl_ctx, ON_DRDY); lsm6dsl_fifo_temperature_set(&lsm6dsl_ctx, 0);//0: temperature not included in FIFO; 1: temperature included in FIFO //1:DS4_NO_DEC lsm6dsl_fifo_step_timestamp_set(&lsm6dsl_ctx, 0);//0: disable step counter and timestamp data as 3rd FIFO data set; 1:enable //1:DS3_NO_DEC lsm6dsl_xl_decimation_set(&lsm6dsl_ctx, XL_NO_DEC);//抽样XL_DEC_4 lsm6dsl_gyro_decimation_set(&lsm6dsl_ctx, GY_NO_DEC);//抽样GY_DEC_4 lsm6dsl_dataset3_decimation_set(&lsm6dsl_ctx, DS3_NO_FILL);//DS3_NO_DEC:step=1 lsm6dsl_dataset4_decimation_set(&lsm6dsl_ctx, DS4_NO_FILL);//DS4_NO_DEC:tmeperature=1 lsm6dsl_fifo_xl_gy_8bit_data_set(&lsm6dsl_ctx, 0);// lsm6dsl_fifo_stop_on_thr_set(&lsm6dsl_ctx, 1);//0: FIFO depth is not limited; 1: FIFO depth is limited to threshold level lsm6dsl_fifo_threshold_set(&lsm6dsl_ctx, 504);//0~2047(word).stop_on_thr=1 lsm6dsl_fifo_data_rate_set(&lsm6dsl_ctx, FIFO_104Hz);//be effective only fifo write mode=ON_DRDY. fifo_rate<=acc&gyro rate /* lsm6dsl_fifo_mode_set(&lsm6dsl_ctx, CONTINUOS);fifo_mode_old = CONTINUOS; */ lsm6dsl_fifo_mode_set(&lsm6dsl_ctx, STOP_WHEN_FULL); fifo_mode_old = STOP_WHEN_FULL; //fifo int: #if LSM6DSL_FIFO_INT_OMAP_INT1 /* lsm6dsl_fifo_threshold_on_int1_set(&lsm6dsl_ctx, 1); */ /* lsm6dsl_fifo_overrun_on_int1_set(&lsm6dsl_ctx, 1);// */ lsm6dsl_fifo_full_on_int1_set(&lsm6dsl_ctx, 1); #else /* lsm6dsl_fifo_threshold_on_int2_set(&lsm6dsl_ctx, 1); */ /* lsm6dsl_fifo_overrun_on_int2_set(&lsm6dsl_ctx, 1);// */ lsm6dsl_fifo_full_on_int2_set(&lsm6dsl_ctx, 1); #endif #endif #if (LSM6DSL_USE_STEP_EN) /* qmi8658_config.inputSelection = QMI8658_CONFIG_ACC_ENABLE; */ /* qmi8658_config.accRange = Qmi8658AccRange_8g; */ /* qmi8658_config.accOdr = Qmi8658AccOdr_LowPower_21Hz;//Qmi8658AccOdr_62_5Hz;//Qmi8658AccOdr_LowPower_21Hz; */ /* qmi8658_config.gyrRange = Qmi8658GyrRange_1024dps; //Qmi8658GyrRange_2048dps Qmi8658GyrRange_1024dps */ /* qmi8658_config.gyrOdr = Qmi8658GyrOdr_500Hz; */ /* */ /* Qmi8658_write(QMI8658_SLAVE_ADDRESS, Qmi8658Register_Ctrl7, 0x00); // */ /* Qmi8658_write(QMI8658_SLAVE_ADDRESS, Qmi8658Register_Ctrl8, 0xD0); */ /* stepConfig(21); //ODR = 21hz */ #endif /* Set xl Full Scale */ lsm6dsl_xl_full_scale_set(&lsm6dsl_ctx, FS_16g); /* Set gyro Full Scale */ lsm6dsl_gyro_full_scale_set(&lsm6dsl_ctx, FS_2000dps); /* Enable Acc Block Data Update */ lsm6dsl_block_data_update_set(&lsm6dsl_ctx, PROPERTY_ENABLE);//fifo mode:updata=1 /* Set AXL bandwith: ODR/100 */ lsm6dsl_xl_lpf2_set(&lsm6dsl_ctx, 1); lsm6dsl_xl_cutoff_set(&lsm6dsl_ctx, XL_ODR_DIV_100); //lsm6dsl_xl_cutoff_set(&lsm6dsl_ctx, XL_ODR_DIV_400); /* Set GYR bandwith:121HZ */ lsm6dsl_gyro_lpf1_set(&lsm6dsl_ctx, 1); lsm6dsl_gyro_lpf1_bandwidth_set(&lsm6dsl_ctx, GY_LPF1_VERY_AGGRESSIVE); /* Set xl Output Data Rate */ lsm6dsl_xl_data_rate_set(&lsm6dsl_ctx, XL_104Hz); /* Set gyro Output Data Rate */ lsm6dsl_gyro_data_rate_set(&lsm6dsl_ctx, GY_104Hz); //int: #if LSM6DSL_USE_INT_EN /* lsm6dsl_xl_drdy_on_int2_set(&lsm6dsl_ctx, 1); */ lsm6dsl_gyro_drdy_on_int2_set(&lsm6dsl_ctx, 1); /* lsm6dsl_temperature_drdy_on_int2_set(&lsm6dsl_ctx, 1); */ #endif /* Read samples in polling mode (no int) */ #if 0 unsigned char read_data[10]; lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_CTRL1_XL, (uint8_t *)&read_data, 10); log_info("LSM6DSL_CTRL1_XL, CTRL2_G,CTRL3_C,CTRL4_C,CTRL5_C,CTRL6_C,CTRL7_G,CTRL8_XL,CTRL9_XL,CTRL10_C\n"); log_info_hexdump(read_data, 10); lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_FIFO_CTRL1, (uint8_t *)&read_data, 5); log_info("LSM6DSL_fifo_CTRL1~5\n"); log_info_hexdump(read_data, 5); lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_INT1_CTRL, (uint8_t *)&read_data, 2); log_info("LSM6DSL_int_CTRL1~2\n"); log_info_hexdump(read_data, 2); #endif return 1; } else { log_error("lsm6dsl_init fail(id:0x%x)\n", lsm6dsl_chip_id); lsm6dsl_chip_id = 0; return 0; } } static u8 lsm6dsl_int_pin1 = IO_PORTB_04; static u8 lsm6dsl_int_pin2 = IO_PORTB_03; //return:0:fail, 1:ok u8 lsm6dsl_sensor_init(void *priv) { if (priv == NULL) { log_error("lsm6dsl init fail(no param)\n"); return 0; } lsm6dsl_info = (lsm6dsl_param *)priv; #if (LSM6DSL_USER_INTERFACE==LSM6DSL_USE_I2C) //iic interface iic_init(lsm6dsl_info->iic_hdl); #elif (LSM6DSL_USER_INTERFACE==LSM6DSL_USE_SPI)//spi interface spi_cs_init(); spi_init(); #else #endif gpio_set_die(lsm6dsl_int_pin1, 1); gpio_set_direction(lsm6dsl_int_pin1, 1); // gpio_set_pull_up(lsm6dsl_int_pin1,1); gpio_set_die(lsm6dsl_int_pin2, 1); gpio_set_direction(lsm6dsl_int_pin2, 1); // gpio_set_pull_up(lsm6dsl_int_pin2,1); return lsm6dsl_init(); } static volatile u32 lsm6dsl_init_flag ; static u8 imu_busy = 0; static lsm6dsl_param lsm6dsl_info_data; /* #define SENSORS_MPU_BUFF_LEN 14 */ /* u8 read_lsm6dsl_buf[SENSORS_MPU_BUFF_LEN]; */ #if (LSM6DSL_USE_FIFO_EN) static u8 lsm6dsl_fifo_data[1024 * 4]; //size:n*6 * Number_of_enabled_sensors<4kbytes #endif void lsm6dsl_int_callback() { if (lsm6dsl_init_flag == 0) { log_error("lsm6dsl init fail!"); return ; } if (imu_busy) { log_error("lsm6dsl busy!"); return ; } imu_busy = 1; imu_sensor_data_t raw_sensor_datas; float TempData = 0.0; #if (LSM6DSL_USE_FIFO_EN) u16 fifo_level = 0;//fifo cnt(bytes) fifo_level = lsm6dsl_read_fifo(&lsm6dsl_ctx, lsm6dsl_fifo_data); TempData = lsm6dsl_read_temperature(&lsm6dsl_ctx); /* log_info("lsm6dsl raw:gyro_x:%d gyro_y:%d gyro_z:%d, acc_x:%d acc_y:%d acc_z:%d tim_count:%d", (s16)(lsm6dsl_fifo_data[1]<<8|lsm6dsl_fifo_data[0]), (s16)(lsm6dsl_fifo_data[3]<<8|lsm6dsl_fifo_data[2]), (s16)(lsm6dsl_fifo_data[5]<<8|lsm6dsl_fifo_data[4]), (s16)(lsm6dsl_fifo_data[7]<<8|lsm6dsl_fifo_data[6]), (s16)(lsm6dsl_fifo_data[9]<<8|lsm6dsl_fifo_data[8]), (s16)(lsm6dsl_fifo_data[11]<<8|lsm6dsl_fifo_data[10]),fifo_level);//共fifo_level组数据, 只打印第一组数据 */ #else /* lsm6dsl_status_reg_t status_reg; */ u8 status_reg; lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_STATUS_REG, (uint8_t *)&status_reg, 1); /* log_info("status:0x%x", status_reg); */ if (status_reg & 0x03) { lsm6dsl_read_raw_acc_gyro_xyz(&lsm6dsl_ctx, &raw_sensor_datas);//获取原始值 /* TempData = lsm6dsl_read_temperature(&lsm6dsl_ctx); */ TempData = raw_sensor_datas.temp_data; /* log_info("lsm6dsl raw:acc_x:%d acc_y:%d acc_z:%d gyro_x:%d gyro_y:%d gyro_z:%d", raw_sensor_datas.acc.x, raw_sensor_datas.acc.y, raw_sensor_datas.acc.z, raw_sensor_datas.gyro.x, raw_sensor_datas.gyro.y, raw_sensor_datas.gyro.z); */ } #endif /* log_info("lsm6dsl temp:%d.%d\n", (u16)TempData, (u16)(((u16)(TempData * 100)) % 100)); */ imu_busy = 0; } s8 lsm6dsl_dev_init(void *arg) { if (arg == NULL) { log_error("lsm6dsl init fail(no arg)\n"); return -1; } #if (LSM6DSL_USER_INTERFACE==LSM6DSL_USE_I2C) lsm6dsl_info_data.iic_hdl = ((struct imusensor_platform_data *)arg)->peripheral_hdl; lsm6dsl_info_data.iic_delay = ((struct imusensor_platform_data *)arg)->peripheral_param0; //这个延时并非影响iic的时钟频率,而是2Byte数据之间的延时 // u8 iic_clk; //iic_clk: <=400kHz #elif (LSM6DSL_USER_INTERFACE==LSM6DSL_USE_SPI) lsm6dsl_info_data.spi_hdl = ((struct imusensor_platform_data *)arg)->peripheral_hdl, //SPIx (role:master) lsm6dsl_info_data.spi_cs_pin = ((struct imusensor_platform_data *)arg)->peripheral_param0; //IO_PORTA_05 lsm6dsl_info_data.spi_work_mode = ((struct imusensor_platform_data *)arg)->peripheral_param1; //1:3wire(SPI_MODE_UNIDIR_1BIT) or 0:4wire(SPI_MODE_BIDIR_1BIT) (与spi结构体一样) // u8 port; //SPIx group:A,B,C,D (spi结构体) // U8 spi_clk; //spi_clk: <=15MHz (spi结构体) #else #endif lsm6dsl_int_pin2 = ((struct imusensor_platform_data *)arg)->imu_sensor_int_io; lsm6dsl_int_pin1 = lsm6dsl_int_pin2; if (imu_busy) { log_error("lsm6dsl busy!"); return -1; } imu_busy = 1; if (lsm6dsl_sensor_init(&lsm6dsl_info_data)) { #if (LSM6DSL_USE_INT_EN) //中断模式,暂不支持 log_info("int mode en!"); /* port_wkup_enable(lsm6dsl_int_pin2, 1, lsm6dsl_int_callback); //PA08-IO中断,1:下降沿触发,回调函数lsm6dsl_int_callback*/ #ifdef CONFIG_CPU_BR23 io_ext_interrupt_init(lsm6dsl_int_pin2, 1, lsm6dsl_int_callback); #elif defined(CONFIG_CPU_BR28) // br28外部中断回调函数,按照现在的外部中断注册方式 // io配置在板级,定义在板级头文件,这里只是注册回调函数 /* port_edge_wkup_set_callback_by_index(3, lsm6dsl_int_callback); // 序号需要和板级配置中的wk_param对应上 */ port_edge_wkup_set_callback(lsm6dsl_int_callback); #elif defined(CONFIG_CPU_BR27) port_edge_wkup_set_callback(lsm6dsl_int_callback); #endif #else //定时 #endif lsm6dsl_init_flag = 1; imu_busy = 0; log_info("lsm6dsl Device init success!%d\n", lsm6dsl_init_flag); return 0; } else { log_info("lsm6dsl Device init fail!\n"); imu_busy = 0; return -1; } } int lsm6dsl_dev_ctl(u8 cmd, void *arg); REGISTER_IMU_SENSOR(lsm6dsl_sensor) = { .logo = "lsm6dsl", .imu_sensor_init = lsm6dsl_dev_init, .imu_sensor_check = NULL, .imu_sensor_ctl = lsm6dsl_dev_ctl, }; int lsm6dsl_dev_ctl(u8 cmd, void *arg) { int ret = -1; u8 status_temp = 0; /* lsm6dsl_status_reg_t status_temp; */ if (lsm6dsl_init_flag == 0) { log_error("lsm6dsl init fail!"); return ret;//0:ok,,<0:err } if (imu_busy) { log_error("lsm6dsl busy!"); return ret;//0:ok,,<0:err } imu_busy = 1; switch (cmd) { case IMU_GET_SENSOR_NAME: memcpy((u8 *)arg, &(lsm6dsl_sensor.logo), 20); ret = 0; break; case IMU_SENSOR_ENABLE: //enable demand cali /* cbuf_init(&hrsensor_cbuf, hrsensorcbuf, 24 * sizeof(int)); */ lsm6dsl_init(); ret = 0; break; case IMU_SENSOR_DISABLE: /* cbuf_clear(&hrsensor_cbuf); */ //close power lsm6dsl_xl_power_down(); lsm6dsl_g_power_down(); ret = 0; break; case IMU_SENSOR_RESET://reset后必须enable /* Restore default configuration */ u8 rst; lsm6dsl_reset_set(&lsm6dsl_ctx, PROPERTY_ENABLE); do { lsm6dsl_reset_get(&lsm6dsl_ctx, &rst); } while (rst); ret = 0; break; case IMU_SENSOR_SLEEP: if ((lsm6dsl_xl_power_down()) && (lsm6dsl_g_power_down())) { log_info("lsm6dsl enter sleep ok!"); ret = 0; } else { log_error("lsm6dsl enter sleep fail!"); } break; case IMU_SENSOR_WAKEUP: //disable demand cali if ((lsm6dsl_xl_wake_up()) && (lsm6dsl_g_wake_up())) { log_info("lsm6dsl wakeup ok!"); ret = 0; } else { log_error("lsm6dsl wakeup fail!"); } break; case IMU_SENSOR_INT_DET://传感器中断状态检查 break; case IMU_SENSOR_DATA_READY://传感器数据准备就绪待读 break; case IMU_SENSOR_CHECK_DATA://检查传感器缓存buf是否存满 break; case IMU_SENSOR_READ_DATA://默认读传感器所有数据 lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_STATUS_REG, (uint8_t *)&status_temp, 1); /* log_info("status:0x%x", status_temp); */ if (status_temp & 0x03) { lsm6dsl_read_raw_acc_gyro_xyz(&lsm6dsl_ctx, arg);//获取原始值 ret = 0; } break; case IMU_GET_ACCEL_DATA://加速度数据 /* float TempData = 0.0; */ lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_STATUS_REG, (uint8_t *)&status_temp, 1); /* log_info("status:0x%x", status_temp); */ if (status_temp & 0x01) { lsm6dsl_read_raw_acc_xyz(&lsm6dsl_ctx, arg);//获取原始值 ret = 0; /* TempData = lsm6dsl_read_temperature(&lsm6dsl_ctx); */ } break; case IMU_GET_GYRO_DATA://陀螺仪数据 lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_STATUS_REG, (uint8_t *)&status_temp, 1); /* log_info("status:0x%x", status_temp); */ if (status_temp & 0x02) { lsm6dsl_read_raw_gyro_xyz(&lsm6dsl_ctx, arg);//获取原始值 ret = 0; } break; case IMU_GET_MAG_DATA://磁力计数据 log_error("lsm6dsl have no mag!\n"); break; case IMU_SENSOR_SEARCH://检查传感器id lsm6dsl_device_id(&lsm6dsl_ctx, (u8 *)arg); if (*(u8 *)arg == LSM6DSL_ID) { ret = 0; log_info("lsm6dsl online!\n"); } else { log_error("lsm6dsl offline!\n"); } break; case IMU_GET_SENSOR_STATUS://获取传感器状态 lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_STATUS_REG, (uint8_t *)&status_temp, 1); *(u8 *)arg = status_temp; ret = 0; break; case IMU_SET_SENSOR_FIFO_CONFIG://配置传感器FIFO #if (LSM6DSL_USE_FIFO_EN) /* u8 *tmp = (u8 *)arg; */ /* u8 wm_th = tmp[0]; */ /* u8 fifo_size = tmp[1];//Qmi8658_Fifo_64 */ /* u8 fifo_mode = tmp[2];//Qmi8658_Fifo_Stream */ /* u8 fifo_format = tmp[3];//QMI8658_FORMAT_12_BYTES */ /* Qmi8658_config_fifo(wm_th, fifo_size, fifo_mode, fifo_format); */ ret = 0; #endif break; case IMU_GET_SENSOR_READ_FIFO://读取传感器FIFO数据 #if (LSM6DSL_USE_FIFO_EN) ret = lsm6dsl_read_fifo(&lsm6dsl_ctx, (u8 *)arg); #endif break; case IMU_SET_SENSOR_TEMP_DISABLE://温度传感器无法控制 u8 temp = *(u8 *)arg; ret = 0; break; default: log_error("--cmd err!\n"); break; } imu_busy = 0; return ret;//0:ok,,<0:err } /***************************lsm6dsl test*******************************/ #if 0 //测试 static lsm6dsl_param lsm6dsl_info_test = { #if (LSM6DSL_USER_INTERFACE==LSM6DSL_USE_I2C) .iic_hdl = 0, .iic_delay = 0, //这个延时并非影响iic的时钟频率,而是2Byte数据之间的延时 #elif (LSM6DSL_USER_INTERFACE==LSM6DSL_USE_SPI) .spi_hdl = 1, //SPIx (role:master) .spi_cs_pin = IO_PORTA_05, // .spi_work_mode = 0; //4wire #endif }; /* Main Example --------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ static axis3bit16_t data_raw; static axis3bit32_t acceleration_mg; static axis3bit32_t angular_rate_mdps; static axis1bit16_t temperature_deg_c; static uint8_t USBbuffer[5000]; int example_main(void) { if (lsm6dsl_sensor_init(&lsm6dsl_info_test)) { //ok } /* * Read samples in polling mode (no int) */ u16 fifo_cnt = 0; static axis3bit16_t data_raw_acc; local_irq_disable(); while (1) { #if (LSM6DSL_USE_FIFO_EN) fifo_cnt = lsm6dsl_read_fifo(&lsm6dsl_ctx, USBbuffer); if (fifo_cnt > 0) { for (u16 i = 0; i < 84; i++) { memcpy((u8 *)&data_raw, USBbuffer + i * 12, 6); memcpy((u8 *)&data_raw_acc, USBbuffer + i * 12 + 6, 6); printf("gy:%6d\t%6d\t%6d\t\txl:%6d\t%6d\t%6d, %d", data_raw.i16bit[0], data_raw.i16bit[1], data_raw.i16bit[2], data_raw_acc.i16bit[0], data_raw_acc.i16bit[1], data_raw_acc.i16bit[2], i); } memset(USBbuffer, 0, 1024); } #else /* * Read output only if new value is available */ lsm6dsl_status_reg_t status_reg; lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_STATUS_REG, (uint8_t *)&status_reg, 1); log_info("status reg:0x%x", *((u8 *)&status_reg)); lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_STATUS_REG, (uint8_t *)&status_reg, 1); log_info("status reg:0x%x", *((u8 *)&status_reg)); if (status_reg.gda) { lsm6dsl_angular_rate_raw(&lsm6dsl_ctx, &data_raw); angular_rate_mdps.i32bit[0] = FROM_FS_1000dps_TO_mdps(data_raw.i16bit[0]); angular_rate_mdps.i32bit[1] = FROM_FS_1000dps_TO_mdps(data_raw.i16bit[1]); angular_rate_mdps.i32bit[2] = FROM_FS_1000dps_TO_mdps(data_raw.i16bit[2]); printf("gy:%6d\t%6d\t%6d\t\t", data_raw.i16bit[0], data_raw.i16bit[1], data_raw.i16bit[2]); printf("gy:%6d\t%6d\t%6d\r\n", angular_rate_mdps.i32bit[0], angular_rate_mdps.i32bit[1], angular_rate_mdps.i32bit[2]); } if (status_reg.xlda) { lsm6dsl_acceleration_raw(&lsm6dsl_ctx, &data_raw); acceleration_mg.i32bit[0] = FROM_FS_4g_TO_mg(data_raw.i16bit[0]); acceleration_mg.i32bit[1] = FROM_FS_4g_TO_mg(data_raw.i16bit[1]); acceleration_mg.i32bit[2] = FROM_FS_4g_TO_mg(data_raw.i16bit[2]); printf("xl:%6d\t%6d\t%6d\t\t", data_raw.i16bit[0], data_raw.i16bit[1], data_raw.i16bit[2]); printf("xl:%6d\t%6d\t%6d\r\n", acceleration_mg.i32bit[0], acceleration_mg.i32bit[1], acceleration_mg.i32bit[2]); } /* * If the gyroscope is not in Power-Down mode, the temperature data rate * is equal to 52Hz, regardless of the accelerometer and gyroscope * configuration. (Ref AN5040) */ if (status_reg.tda) { lsm6dsl_temperature_raw(&lsm6dsl_ctx, &temperature_deg_c); printf("temp:%3d\t\t", temperature_deg_c.i16bit); temperature_deg_c.i16bit = FROM_LSB_TO_degC(temperature_deg_c.i16bit); printf("temp:%3d\r\n", temperature_deg_c.i16bit); } #endif mdelay(100); wdt_clear(); } return 0; } #endif #endif