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