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();
}
}
... View more