03-12-2020 04:44 PM
Hi everyone,
I am trying to read data from the BMX160 sensor. I used the driver for the BMI160 sensor as I read that it is compatible.
I changed the CHIP_ID to 0xD8 and also I scanned the I2C address (which is 0x68). However, the return values for accel and gyro are zero.
Do I miss something?
This is the 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_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"
#include "bmi160.h"
/* TWI instance ID. */
#define TWI_INSTANCE_ID 0
/* Indicates if operation on TWI has ended. */
static volatile bool m_xfer_done = false;
/* TWI instance. */
static const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(TWI_INSTANCE_ID);
struct bmi160_dev sensor;
struct bmi160_sensor_data accel;
struct bmi160_sensor_data gyro;
int8_t rslt = BMI160_OK;
/*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);
if (NRF_SUCCESS == err_code)
{
nrf_drv_twi_enable(&m_twi);
NRF_LOG_INFO("TWI init success...");
}
}
int8_t Acc_i2c_Write(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len)
{
// NRF_LOG_INFO("WRITE: dev_id: %x reg_addr: %x reg_data: %x len: %i\n", dev_id, reg_addr, *reg_data, len);
int8_t rslt = 0;
uint8_t data[len + 1];
data[0] = reg_addr;
for (uint16_t i = 0; i < len; i++) {
data[i + 1] = reg_data[i];
}
rslt = nrf_drv_twi_tx(&m_twi, dev_id, reg_data, len + 1, false);
APP_ERROR_CHECK(rslt);
return rslt;
}
int8_t Acc_i2c_Read(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len)
{
int8_t rslt = 0;
// NRF_LOG_INFO("READ: dev_id: %x reg_addr: %x len: %i\n", dev_id, reg_addr, len);
rslt = nrf_drv_twi_tx(&m_twi, dev_id, ®_addr, 1, false);
APP_ERROR_CHECK(rslt);
if (rslt == 0)
{
rslt = nrf_drv_twi_rx(&m_twi, dev_id, reg_data, len);
}
NRF_LOG_INFO("READ: %x",*reg_data);
return rslt;
}
void Acc_delay_ms(uint32_t period)
{
/*if (period==NULL){
period = 1;
}// delay time*/
nrf_delay_ms( period ) ;
}
void BMI160_init (void)
{
sensor.id = BMI160_I2C_ADDR; //0x68
sensor.interface = BMI160_I2C_INTF; //0x00
sensor.read = &Acc_i2c_Read;
sensor.write = &Acc_i2c_Write;
sensor.delay_ms = &Acc_delay_ms;
rslt = bmi160_init(&sensor);
APP_ERROR_CHECK(rslt);
if(rslt == BMI160_OK){
NRF_LOG_INFO("BMI160 Initialized...");
} else {
NRF_LOG_INFO("BMI160 not Initialized...");
}NRF_LOG_FLUSH();
sensor.accel_cfg.odr = BMI160_ACCEL_ODR_1600HZ;
sensor.accel_cfg.range = BMI160_ACCEL_RANGE_2G;
sensor.accel_cfg.bw = BMI160_ACCEL_BW_NORMAL_AVG4;
sensor.accel_cfg.power = BMI160_ACCEL_NORMAL_MODE;
sensor.gyro_cfg.odr = BMI160_GYRO_ODR_100HZ;
sensor.gyro_cfg.range = BMI160_GYRO_RANGE_2000_DPS;
sensor.gyro_cfg.bw = BMI160_GYRO_BW_NORMAL_MODE;
sensor.gyro_cfg.power = BMI160_GYRO_NORMAL_MODE;
rslt = bmi160_set_sens_conf(&sensor);
APP_ERROR_CHECK(rslt);
if(rslt == BMI160_OK){
NRF_LOG_INFO("sensor Configured...");
} else {
NRF_LOG_INFO("sensor not Configured...");
}NRF_LOG_FLUSH();
}
static void read_sensor_data()
{
m_xfer_done = false;
bmi160_get_sensor_data((BMI160_ACCEL_SEL | BMI160_GYRO_SEL), &accel, &gyro, &sensor);
NRF_LOG_INFO("DataX:%d", accel.x);
NRF_LOG_INFO("DataY:%d", accel.y);
NRF_LOG_INFO("DataZ:%d", accel.z);
NRF_LOG_INFO("GyroX:%d", gyro.x);
NRF_LOG_INFO("GyroY:%d", gyro.y);
NRF_LOG_INFO("GyroZ:%d", gyro.z);
}
int main(void)
{
bsp_board_init(BSP_INIT_LEDS);
APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
NRF_LOG_DEFAULT_BACKENDS_INIT();
NRF_LOG_INFO("BMI160 get started.\n");
NRF_LOG_FLUSH();
Acc_delay_ms(100);
twi_init();
Acc_delay_ms(50);
BMI160_init();
Acc_delay_ms(100);
while(true)
{
nrf_delay_ms( 1000 ) ;
/* do
{
__WFE();
}while (m_xfer_done == false);*/
read_sensor_data();
NRF_LOG_FLUSH();
}
}
Solved! Go to Solution.
03-26-2020 03:52 PM
I finally figured out the issue..
03-27-2020 01:18 AM - edited 03-27-2020 01:20 AM
Can you share what the fix was? I'm having a similar issue. Thanks
Here is my code:
/* imu setup */
struct bmi160_dev sensor;
sensor.id = BMI160_I2C_ADDR;
sensor.interface = BMI160_I2C_INTF;
sensor.read = &bmx160_i2c_read; // Function pointer to SPI read
sensor.write = &bmx160_i2c_write; // Function pointer to SPI write
sensor.delay_ms = &delay_ms; // Function pointer to delay(ms) function
int8_t rslt = BMI160_OK;
rslt = bmi160_init(&sensor);
rslt = BMI160_OK;
/* Select the Output data rate, range of accelerometer sensor */
sensor.accel_cfg.odr = BMI160_ACCEL_ODR_1600HZ;
sensor.accel_cfg.range = BMI160_ACCEL_RANGE_2G;
sensor.accel_cfg.bw = BMI160_ACCEL_BW_NORMAL_AVG4;
/* Select the power mode of accelerometer sensor */
sensor.accel_cfg.power = BMI160_ACCEL_NORMAL_MODE;
/* Select the Output data rate, range of Gyroscope sensor */
sensor.gyro_cfg.odr = BMI160_GYRO_ODR_3200HZ;
sensor.gyro_cfg.range = BMI160_GYRO_RANGE_2000_DPS;
sensor.gyro_cfg.bw = BMI160_GYRO_BW_NORMAL_MODE;
/* Select the power mode of Gyroscope sensor */
sensor.gyro_cfg.power = BMI160_GYRO_NORMAL_MODE;
/* Set the sensor configuration */
rslt = bmi160_set_sens_conf(&sensor);
rslt = BMI160_OK;
struct bmi160_sensor_data accel;
struct bmi160_sensor_data gyro;
/* To read both Accel and Gyro data along with time*/
rslt = bmi160_get_sensor_data((BMI160_ACCEL_SEL | BMI160_GYRO_SEL | BMI160_TIME_SEL), &accel, &gyro, &sensor);
I'm able to read the sensor time fine, but the accel and gyro values are all reading 0.
03-27-2020 01:57 AM
Nevermind, solved the issue. I had a problem with my i2c write function which wasn't including the reg addr. Its working now.
10-04-2020 07:40 PM
Can you please share the solution.