Empty readings from LSM9DS1 registers

Hi,

I am trying to connect my LSM9DS1 with nrf52840, this is Arduino nano 33 BLE board. I already figured out that i had to enable it and enable TWI bus. After some readings i found example with the library for this sensor https://devzone.nordicsemi.com/f/nordic-q-a/64902/no-readings-from-lsm9ds1-using-twi-example from this post i merged it with my code (only changed twi_init) and  there is no error but i get empty values 

I do not know what i can do more. 
Here is my code

#include <stdio.h>
#include "boards.h"
#include "app_util_platform.h"
#include "app_error.h"
#include "nrf_drv_twi.h"
#include "nrf_delay.h"
#include "nrf_gpio.h"
#include "lsm9ds1_reg.h"


#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"

#define TWI_INSTANCE_ID     0
/* // LSM9DS1 address for testing modul, uncomment if use test code
#define LSM9DS1_IMU_ADD_L_7Bit    0x6BU // 01101011
#define LSM9DS1_IMU_ADD_L         0xD5U // 11010101
#define LSM9DS1_IMU_ADD_H_7Bit    0x6AU // 01101010
#define LSM9DS1_IMU_ADD_H         0xD7U
#define LSM9DS1_MAG_ADD_L_7Bit    0x1EU
#define LSM9DS1_MAG_ADD_L         0x3DU
#define LSM9DS1_MAG_ADD_H_7Bit    0x1CU
#define LSM9DS1_MAG_ADD_H         0x39U*/

/* Private variables ---------------------------------------------------------*/
static axis3bit16_t data_raw_acceleration;
static axis3bit16_t data_raw_angular_rate;
static axis3bit16_t data_raw_magnetic_field;
static float acceleration_mg[3];
static float angular_rate_mdps[3];
static float magnetic_field_mgauss[3];
static lsm9ds1_id_t whoamI;
static lsm9ds1_status_t reg;
static uint8_t rst;
char tx_buffer[100];


/* TWI instance. */
static const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(TWI_INSTANCE_ID);
uint8_t register_address = 0x0F;    //Address of the who am i register to be read

static lsm9ds1_id_t whoamI;

static int32_t platform_read(void *handle, uint8_t reg, uint8_t *bufp, uint16_t len){
  uint8_t *i2c_address = handle;
  ret_code_t err_code;
  uint16_t reg16 = reg;
  err_code = nrf_drv_twi_tx(&m_twi, *i2c_address, (uint8_t *)&reg16, 1, true);
  if (NRF_SUCCESS != err_code){
    return 0;
  }
  err_code = nrf_drv_twi_rx(&m_twi, *i2c_address, bufp, len); 
  return 0;
}

static int32_t platform_write(void *handle, uint8_t reg, uint8_t *bufp, uint16_t len){
  uint8_t *i2c_address = handle;
  ret_code_t err_code;
  uint8_t buffer[1 + len];
  memcpy(buffer, &reg, 1);
  memcpy(buffer + 1, bufp, len);
    err_code = nrf_drv_twi_tx(&m_twi, *i2c_address, buffer, len + 1, true);
    if(err_code == NRF_SUCCESS){
      NRF_LOG_INFO("Device Address and Register Address and Data sent");
    }
    NRF_LOG_FLUSH();
  return 0;
}


#define imu_en 22
#define i2c_en 32

/**
 * @brief TWI initialization.
 */
void twi_init (void)
{
    ret_code_t err_code;

    const nrf_drv_twi_config_t twi_config = {
       .scl                = ARDUINO_SCL_PIN,
       .sda                = ARDUINO_SDA_PIN,
       .frequency          = NRF_DRV_TWI_FREQ_100K,
       .interrupt_priority = APP_IRQ_PRIORITY_HIGH,
       .clear_bus_init     = false
    };

    err_code = nrf_drv_twi_init(&m_twi, &twi_config, NULL, NULL);
    APP_ERROR_CHECK(err_code);
    nrf_gpio_cfg_output(imu_en);
    nrf_gpio_pin_set(imu_en);
    nrf_delay_ms(100);
    nrf_gpio_cfg_output(i2c_en);
    nrf_gpio_pin_set(i2c_en);
    nrf_delay_ms(100);
    nrf_drv_twi_enable(&m_twi);
}


/**
 * @brief Function for main application entry.
 */

/**
 * @brief Function for main application entry.
 */
int main(void)
{
    ret_code_t err_code;
    uint8_t sample_data;
    bool detected_device = false;

    APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
    NRF_LOG_DEFAULT_BACKENDS_INIT();

    NRF_LOG_INFO("\r\nTWI device example started.\r\n");
    NRF_LOG_FLUSH();
    twi_init();

    ///*****Test code for testing module
    //////*********************************************************************************** //
    err_code = nrf_drv_twi_tx(&m_twi, LSM9DS1_IMU_I2C_ADD_H >> 1, &register_address, 1, true);
    if(err_code == NRF_SUCCESS){
      NRF_LOG_INFO("Device Address and Register Address sent");
    }
    NRF_LOG_FLUSH();
    err_code = nrf_drv_twi_rx(&m_twi, LSM9DS1_IMU_I2C_ADD_H >> 1, &sample_data, sizeof(sample_data));
    if (err_code == NRF_SUCCESS){
      NRF_LOG_INFO("The Register read = 0x%x", sample_data);
    }
    NRF_LOG_FLUSH();
///////////////////////////////////////////////////////////////////////////

        /* Initialize platform specific hardware */
    //platform_init();

    /* Initialize inertial sensors (IMU) driver interface */
    uint8_t i2c_add_mag = LSM9DS1_MAG_I2C_ADD_L >> 1;
    lsm9ds1_ctx_t dev_ctx_mag;
    dev_ctx_mag.write_reg = platform_write;
    dev_ctx_mag.read_reg = platform_read;
    dev_ctx_mag.handle = (void*)&i2c_add_mag;

    /* Initialize magnetic sensors driver interface */
    uint8_t i2c_add_imu = LSM9DS1_IMU_I2C_ADD_H >> 1;
    lsm9ds1_ctx_t dev_ctx_imu;
    dev_ctx_imu.write_reg = platform_write;
    dev_ctx_imu.read_reg = platform_read;
    dev_ctx_imu.handle = (void*)&i2c_add_imu;

    /* Check device ID */
    lsm9ds1_dev_id_get(&dev_ctx_mag, &dev_ctx_imu, &whoamI);
    if (whoamI.imu != LSM9DS1_IMU_ID || whoamI.mag != LSM9DS1_MAG_ID){
      while(1){
        /* manage here device not found */
        //NRF_LOG_INFO("\r\nCannot find the LSM9DS1.********\r\n");
        //NRF_LOG_FLUSH();
        NRF_LOG_INFO("\r\nCannot find the LSM9DS1.********\r\n");
        NRF_LOG_FLUSH();
      }
    }
    NRF_LOG_INFO("Who am I register [IMU]: 0x%x [MAG]: 0x%x \r\n", whoamI.imu, whoamI.mag);   
    NRF_LOG_FLUSH();

    /* Restore default configuration 
    lsm9ds1_dev_reset_set(&dev_ctx_mag, &dev_ctx_imu, PROPERTY_ENABLE);
    do {
      lsm9ds1_dev_reset_get(&dev_ctx_mag, &dev_ctx_imu, &rst);
    } while (rst);

     Enable Block Data Update */
    //lsm9ds1_block_data_update_set(&dev_ctx_mag, &dev_ctx_imu, PROPERTY_ENABLE);

    /* Set full scale */
    lsm9ds1_xl_full_scale_set(&dev_ctx_imu, LSM9DS1_4g);
    lsm9ds1_gy_full_scale_set(&dev_ctx_imu, LSM9DS1_2000dps);
    lsm9ds1_mag_full_scale_set(&dev_ctx_mag, LSM9DS1_16Ga);

    /* Configure filtering chain - See datasheet for filtering chain details */
    /* Accelerometer filtering chain */
    //lsm9ds1_xl_filter_aalias_bandwidth_set(&dev_ctx_imu, LSM9DS1_AUTO);
    //lsm9ds1_xl_filter_lp_bandwidth_set(&dev_ctx_imu, LSM9DS1_LP_ODR_DIV_50);
    //lsm9ds1_xl_filter_out_path_set(&dev_ctx_imu, LSM9DS1_LP_OUT);
    /* Gyroscope filtering chain */
    //lsm9ds1_gy_filter_lp_bandwidth_set(&dev_ctx_imu, LSM9DS1_LP_ULTRA_LIGHT);
    //lsm9ds1_gy_filter_hp_bandwidth_set(&dev_ctx_imu, LSM9DS1_HP_MEDIUM);
    //lsm9ds1_gy_filter_out_path_set(&dev_ctx_imu, LSM9DS1_LPF1_HPF_LPF2_OUT);

    /* Set Output Data Rate / Power mode */
    lsm9ds1_imu_data_rate_set(&dev_ctx_imu, LSM9DS1_IMU_59Hz5);
    lsm9ds1_mag_data_rate_set(&dev_ctx_mag, LSM9DS1_MAG_UHP_10Hz);

    

    while (true)
    {
             /* Read device status register */
      lsm9ds1_dev_status_get(&dev_ctx_mag, &dev_ctx_imu, &reg);

      if ( reg.status_imu.xlda && reg.status_imu.gda ){
        /* Read imu data */
        memset(data_raw_acceleration.u8bit, 0x00, 3 * sizeof(int16_t));
        memset(data_raw_angular_rate.u8bit, 0x00, 3 * sizeof(int16_t));

        lsm9ds1_acceleration_raw_get(&dev_ctx_imu, data_raw_acceleration.u8bit);
        lsm9ds1_angular_rate_raw_get(&dev_ctx_imu, data_raw_angular_rate.u8bit);

        acceleration_mg[0] = lsm9ds1_from_fs4g_to_mg(data_raw_acceleration.i16bit[0]);
        acceleration_mg[1] = lsm9ds1_from_fs4g_to_mg(data_raw_acceleration.i16bit[1]);
        acceleration_mg[2] = lsm9ds1_from_fs4g_to_mg(data_raw_acceleration.i16bit[2]);

        angular_rate_mdps[0] = lsm9ds1_from_fs2000dps_to_mdps(data_raw_angular_rate.i16bit[0]);
        angular_rate_mdps[1] = lsm9ds1_from_fs2000dps_to_mdps(data_raw_angular_rate.i16bit[1]);
        angular_rate_mdps[2] = lsm9ds1_from_fs2000dps_to_mdps(data_raw_angular_rate.i16bit[2]);

        sprintf((char*)tx_buffer, "IMU - [mg]:%4.2f\t%4.2f\t%4.2f\t[mdps]:%4.2f\t%4.2f\t%4.2f\r\n",
                acceleration_mg[0], acceleration_mg[1], acceleration_mg[2],
                angular_rate_mdps[0], angular_rate_mdps[1], angular_rate_mdps[2]);
        //sprintf((char *)tx_buffer, "Moj IMU - mg[0]: %4.2f \r\n", acceleration_mg[0]);

        printf(tx_buffer/*, strlen((char const*)tx_buffer)*/);
        //NRF_LOG_INFO(tx_buffer);
        //NRF_LOG_FLUSH();
      }

      if ( reg.status_mag.zyxda ){
        /* Read magnetometer data */
        memset(data_raw_magnetic_field.u8bit, 0x00, 3 * sizeof(int16_t));

        lsm9ds1_magnetic_raw_get(&dev_ctx_mag, data_raw_magnetic_field.u8bit);

        magnetic_field_mgauss[0] = lsm9ds1_from_fs16gauss_to_mG(data_raw_magnetic_field.i16bit[0]);
        magnetic_field_mgauss[1] = lsm9ds1_from_fs16gauss_to_mG(data_raw_magnetic_field.i16bit[1]);
        magnetic_field_mgauss[2] = lsm9ds1_from_fs16gauss_to_mG(data_raw_magnetic_field.i16bit[2]);

        sprintf(tx_buffer, "MAG - [mG]:%4.2f\t%4.2f\t%4.2f\r\n",
                magnetic_field_mgauss[0], magnetic_field_mgauss[1], magnetic_field_mgauss[2]);
        printf(tx_buffer/*, strlen((char const*)tx_buffer)*/);
        //NRF_LOG_INFO(tx_buffer);
          //NRF_LOG_FLUSH();
      }
    }
}

/** @} */

Related