This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Don't get accurate data from accelerometer in nRF52832 using I2C

I am using nRF52832 evolution board and SDK version 15.3.0 in Segger studio(Ubuntu system) for Interface LSM6DSL accelerometer using I2C.

I am use TWI peripheral example path given below,

......\examples\peripheral\twi_sensor.

In application I want to read LSM6DSL Accelerometer axis data(Here I have datasheet for LSM6DSL Module)

First I am setting up registers for accelerometer configuration(for read Axis data) ,and then read X,Y and Z axis data (1 ms delay between every register read)from sensor using data register

Below  I am attached register setup function.

void LSM_set_mode(void)
{
    ret_code_t err_code;
    uint8_t reg[2];


    reg[0] = 0x10;
    reg[1] = 0x60;
    m_xfer_done = false;
    err_code = nrf_drv_twi_tx(&m_twi, LSM8DS3_ADDR, reg, sizeof(reg), false);
    APP_ERROR_CHECK(err_code);
    while (m_xfer_done == false);

    nrf_delay_ms(1);
    reg[0] = 0x13;
    reg[1] = 0x80;
    m_xfer_done = false;
    err_code = nrf_drv_twi_tx(&m_twi, LSM8DS3_ADDR, reg, sizeof(reg), false);
    APP_ERROR_CHECK(err_code);
    while (m_xfer_done == false);

    nrf_delay_ms(1);
    reg[0] = 0x11;
    reg[1] = 0x6c;
    m_xfer_done = false;
    err_code = nrf_drv_twi_tx(&m_twi, LSM8DS3_ADDR, reg, sizeof(reg), false);
    APP_ERROR_CHECK(err_code);
    while (m_xfer_done == false);
    
    NRF_LOG_INFO("init done");
}

Below I am attaching function for read x,y,z axis

static void read_sensor_data()
{
    ret_code_t err_code;
    uint8_t reg[1] = {0};
    
    axis_count ++;

    /* Writing to pointer byte. */
    #if 1
    reg[0] = 0x28;
    m_xfer_done = false;
    err_code = nrf_drv_twi_tx(&m_twi, LSM8DS3_ADDR, reg, 1, false);
    APP_ERROR_CHECK(err_code);
    while (m_xfer_done == false);
    m_xfer_done = false;
    /* Read 1 byte from the specified address - skip 3 bits dedicated for fractional part of temperature. */
    err_code = nrf_drv_twi_rx(&m_twi, LSM8DS3_ADDR, &AxisX_L, sizeof(AxisX_L));
	NRF_LOG_INFO("", AxisX_L);
    APP_ERROR_CHECK(err_code);

    nrf_delay_ms(1);
    reg[0] = 0x29;
    m_xfer_done = false;
    err_code = nrf_drv_twi_tx(&m_twi, LSM8DS3_ADDR, reg, 1, false);
    APP_ERROR_CHECK(err_code);
    while (m_xfer_done == false);
    m_xfer_done = false;
    /* Read 1 byte from the specified address - skip 3 bits dedicated for fractional part of temperature. */
    err_code = nrf_drv_twi_rx(&m_twi, LSM8DS3_ADDR, &AxisX_H, sizeof(AxisX_H));
    APP_ERROR_CHECK(err_code);

    nrf_delay_ms(1);
    reg[0] = 0x2A;
    m_xfer_done = false;
    err_code = nrf_drv_twi_tx(&m_twi, LSM8DS3_ADDR, reg, 1, false);
    APP_ERROR_CHECK(err_code);
    while (m_xfer_done == false);
    m_xfer_done = false;
    /* Read 1 byte from the specified address - skip 3 bits dedicated for fractional part of temperature. */
    err_code = nrf_drv_twi_rx(&m_twi, LSM8DS3_ADDR, &AxisY_L, sizeof(AxisY_L));
    APP_ERROR_CHECK(err_code);

    nrf_delay_ms(1);
    reg[0] = 0x2B;
    m_xfer_done = false;
    err_code = nrf_drv_twi_tx(&m_twi, LSM8DS3_ADDR, reg, 1, false);
    APP_ERROR_CHECK(err_code);
    while (m_xfer_done == false);
    m_xfer_done = false;
    /* Read 1 byte from the specified address - skip 3 bits dedicated for fractional part of temperature. */
    err_code = nrf_drv_twi_rx(&m_twi, LSM8DS3_ADDR, &AxisY_H, sizeof(AxisY_H));
	
    APP_ERROR_CHECK(err_code);

    nrf_delay_ms(1);
    reg[0] = 0x2C;
    m_xfer_done = false;
    err_code = nrf_drv_twi_tx(&m_twi, LSM8DS3_ADDR, reg, 1, false);
    APP_ERROR_CHECK(err_code);
    while (m_xfer_done == false);
    m_xfer_done = false;
    /* Read 1 byte from the specified address - skip 3 bits dedicated for fractional part of temperature. */
    err_code = nrf_drv_twi_rx(&m_twi, LSM8DS3_ADDR, &AxisZ_L, sizeof(AxisZ_L));
    APP_ERROR_CHECK(err_code);

    nrf_delay_ms(1);
    reg[0] = 0x2D;
    m_xfer_done = false;
    err_code = nrf_drv_twi_tx(&m_twi, LSM8DS3_ADDR, reg, 1, false);
    APP_ERROR_CHECK(err_code);
    while (m_xfer_done == false);
    m_xfer_done = false;
    /* Read 1 byte from the specified address - skip 3 bits dedicated for fractional part of temperature. */
    err_code = nrf_drv_twi_rx(&m_twi, LSM8DS3_ADDR, &AxisZ_H, sizeof(AxisZ_H));
    APP_ERROR_CHECK(err_code);

}

My problem is when I am reading data from registers in every 100ms interval I am getting wrong data and at same time I am setting same registers in arduino board with same interval ,it gives me accurate data .

Please give me suggestion what setting I want to done for read accelerometer data using I2C .

Give me suggestion for that as soon as possible.

Thanks & regards,

 Urvisha Andani

Parents Reply Children
No Data
Related