Thanks for the tip o_o Unfortunately I had no success setting the Magenetometer to "Enhanced Regular", "Regular" or "Low Power" presets. Here is my full initialisation of the sensor. Any thoughts? // --------------- Init BMX160 ---------------------
bmi.id = BMI160_I2C_ADDR;
bmi.interface = BMI160_I2C_INTF;
bmi.read = I2C_0_readDataBlock;
bmi.write = performDimWrite;
bmi.delay_ms = delay_miliSec;
bmm.dev_id = BMM150_DEFAULT_I2C_ADDRESS;
bmm.intf = BMM150_I2C_INTF;
bmm.read = bmm150_aux_read;
bmm.write = bmm150_aux_write;
bmm.delay_ms = delay_miliSec;
rslt_ = bmi160_init(&bmi);
printf("bmi160_init:%i\r\n", rslt_);
bmi.aux_cfg.aux_sensor_enable = BMI160_ENABLE;
bmi.aux_cfg.aux_i2c_addr = bmm.dev_id;
bmi.aux_cfg.manual_enable = BMI160_ENABLE;
bmi.aux_cfg.aux_rd_burst_len = BMI160_AUX_READ_LEN_3;
rslt_ = bmi160_aux_init(&bmi);
printf("bmi160_aux_init:%i\r\n", rslt_);
rslt_ = bmm150_init(&bmm);
printf("bmm150_init:%i\r\n", rslt_);
//// --------------- Acc & Gryo ---------------------
//// Configure accel and gyro sensors in normal mode
bmi.accel_cfg.odr = BMI160_ACCEL_ODR_50HZ;
bmi.accel_cfg.range = BMI160_ACCEL_RANGE_4G;
bmi.accel_cfg.bw = BMI160_ACCEL_BW_OSR4_AVG1;
bmi.accel_cfg.power = BMI160_ACCEL_NORMAL_MODE;
bmi.gyro_cfg.odr = BMI160_GYRO_ODR_50HZ;
bmi.gyro_cfg.range = BMI160_GYRO_RANGE_125_DPS;
bmi.gyro_cfg.bw = BMI160_GYRO_BW_OSR4_MODE;
bmi.gyro_cfg.power = BMI160_GYRO_SUSPEND_MODE;
rslt_ = bmi160_set_sens_conf(&bmi);
printf("bmi160_set_sens_conf:%i\r\n", rslt_);
// Configure sensor interrupt (Data Ready)
/* Select the Interrupt channel/pin */
bmi_int_config.int_channel = BMI160_INT_CHANNEL_1;// Interrupt channel/pin 1
/* Select the Interrupt type */
bmi_int_config.int_type = BMI160_ACC_GYRO_DATA_RDY_INT;// Choosing Data Readay interrupt
/* Select the interrupt channel/pin settings */
bmi_int_config.int_pin_settg.output_en = BMI160_ENABLE;// Enabling interrupt pins to act as output pin
bmi_int_config.int_pin_settg.output_mode = BMI160_DISABLE;// Choosing push-pull mode for interrupt pin
bmi_int_config.int_pin_settg.output_type = BMI160_ENABLE;// Choosing active High output
bmi_int_config.int_pin_settg.edge_ctrl = BMI160_ENABLE;// Choosing level triggered output
bmi_int_config.int_pin_settg.input_en = BMI160_DISABLE;// Disabling interrupt pin to act as input
bmi_int_config.int_pin_settg.latch_dur =BMI160_LATCH_DUR_NONE;// non-latched output
/* Set the Data Ready interrupt */
rslt_ = bmi160_set_int_config(&bmi_int_config, &bmi); /* sensor is an instance of the structure bmi160_dev */
printf("bmi160_set_int_config:%i\r\n", rslt_);
// Configure sensor interrupt (Tap)
//printf("Init:Tap\r\n");
/* Select the Interrupt channel/pin */
bmi_int_config.int_channel = BMI160_INT_CHANNEL_2;// Interrupt channel/pin 2
/* Select the Interrupt type: Tap */
bmi_int_config.int_type = BMI160_ACC_SINGLE_TAP_INT;// Choosing Step Detector interrupt
/* Select the interrupt channel/pin settings */
bmi_int_config.int_pin_settg.output_en = BMI160_ENABLE;// Enabling interrupt pins to act as output pin
bmi_int_config.int_pin_settg.output_mode = BMI160_DISABLE;// Choosing push-pull mode for interrupt pin
bmi_int_config.int_pin_settg.output_type = BMI160_ENABLE;// Choosing active High output
bmi_int_config.int_pin_settg.edge_ctrl = BMI160_ENABLE;// Choosing level triggered output
bmi_int_config.int_pin_settg.input_en = BMI160_DISABLE;// Disabling interrupt pin to act as input
bmi_int_config.int_pin_settg.latch_dur = BMI160_LATCH_DUR_NONE;// non-latched output
/* Select the Step Detector interrupt parameters, Kindly use the recommended settings for step detector */
bmi_int_config.int_type_cfg.acc_tap_int.tap_en = BMI160_ENABLE;// 1-enable, 0-disable the detector
bmi_int_config.int_type_cfg.acc_tap_int.tap_data_src=BMI160_ENABLE; // use pre-filter
bmi_int_config.int_type_cfg.acc_tap_int.tap_dur = 0b001;
bmi_int_config.int_type_cfg.acc_tap_int.tap_quiet = BMI160_DISABLE; // 30/20ms
bmi_int_config.int_type_cfg.acc_tap_int.tap_shock = BMI160_DISABLE; // 50/75ms
bmi_int_config.int_type_cfg.acc_tap_int.tap_thr = 0b11111; // 125mg/2 = 62.5mg per bit (4g range)
// Setup INT_TAP[0] correctly
rslt_ = 0b00000111;
performDimWrite(BMI160_I2C_ADDR, BMI160_INT_TAP_0_ADDR, &rslt_, 1 );
// Setup INT_TAP[1] correctly
rslt_ = 0b00001111;
performDimWrite(BMI160_I2C_ADDR, BMI160_INT_TAP_1_ADDR, &rslt_, 1 );
/* Set the Step Detector interrupt */
rslt_ = bmi160_set_int_config(&bmi_int_config, &bmi); /* sensor is an instance of the structure bmi160_dev */
printf("bmi160_set_int_config:%i\r\n", rslt_);
// correct INT channel for Tap. Bug in library
// disable int1_s_tap
I2C_0_readDataBlock(BMI160_I2C_ADDR, BMI160_INT_MAP_0_ADDR , &rslt_, 1);
rslt_ = rslt_ & 0b11011111;
performDimWrite(BMI160_I2C_ADDR, BMI160_INT_MAP_0_ADDR, &rslt_, 1 );
// enable int2_s_tap
I2C_0_readDataBlock(BMI160_I2C_ADDR, BMI160_INT_MAP_2_ADDR , &rslt_, 1);
rslt_ = rslt_ | 0b00100000;
performDimWrite(BMI160_I2C_ADDR, BMI160_INT_MAP_2_ADDR, &rslt_, 1 );
// --------------- Mag ---------------------
//printf("Init:Mag\r\n");
//// from <a href="https://community.bosch-sensortec.com/t5/MEMS-sensors-forum/BMX160-magnetometer-problem/td-p/7628/page/2" target="_blank">https://community.bosch-sensortec.com/t5/MEMS-sensors-forum/BMX160-magnetometer-problem/td-p/7628/page/2</a>
// from datasheet p.25
rslt_ = 0x19; performDimWrite(BMI160_I2C_ADDR, BMI160_COMMAND_REG_ADDR, &rslt_, 1 );
_delay_ms(2);
rslt_ = 0x80; performDimWrite(BMI160_I2C_ADDR, BMI160_AUX_IF_1_ADDR, &rslt_, 1 );
rslt_ = 0x01; performDimWrite(BMI160_I2C_ADDR, BMI160_AUX_IF_3_ADDR, &rslt_, 1 );
rslt_ = 0x4B; performDimWrite(BMI160_I2C_ADDR, BMI160_AUX_IF_2_ADDR, &rslt_, 1 );
rslt_ = 0x04; performDimWrite(BMI160_I2C_ADDR, BMI160_AUX_IF_3_ADDR, &rslt_, 1 );
rslt_ = 0x51; performDimWrite(BMI160_I2C_ADDR, BMI160_AUX_IF_2_ADDR, &rslt_, 1 );
rslt_ = 0x52; performDimWrite(BMI160_I2C_ADDR, BMI160_AUX_IF_3_ADDR, &rslt_, 1 );
rslt_ = 0x52; performDimWrite(BMI160_I2C_ADDR, BMI160_AUX_IF_2_ADDR, &rslt_, 1 );
rslt_ = 0x02; performDimWrite(BMI160_I2C_ADDR, BMI160_AUX_IF_3_ADDR, &rslt_, 1 );
rslt_ = 0x4C; performDimWrite(BMI160_I2C_ADDR, BMI160_AUX_IF_2_ADDR, &rslt_, 1 );
rslt_ = 0x42; performDimWrite(BMI160_I2C_ADDR, BMI160_AUX_IF_1_ADDR, &rslt_, 1 );
rslt_ = 0x07; performDimWrite(BMI160_I2C_ADDR, BMI160_AUX_ODR_ADDR, &rslt_, 1 );
rslt_ = 0x00; performDimWrite(BMI160_I2C_ADDR, BMI160_AUX_IF_1_ADDR, &rslt_, 1 );
rslt_ = 0x19; performDimWrite(BMI160_I2C_ADDR, BMI160_COMMAND_REG_ADDR, &rslt_, 1 );
_delay_ms(2);
bmm.settings.pwr_mode = BMM150_FORCED_MODE;
rslt_ = bmm150_set_op_mode(&bmm);
printf("bmm150_set_op_mode:%i\r\n", rslt_); and here is my read code: I2C_0_readDataBlock( BMI160_I2C_ADDR, BMI160_AUX_DATA_ADDR, &raw_data, 20 );
// Convert raw Acc data to "g"
*accX = ACC_CONVERT_TO_G * (float)( raw_data[7] );
*accY = ACC_CONVERT_TO_G * (float)( raw_data[8] );
*accZ = ACC_CONVERT_TO_G * (float)( raw_data[9] );
// Convert raw Mag data to "gauss"
*magX = MAG_CONVERT_TO_GAUSS * (float)( raw_data[0] );
*magY = MAG_CONVERT_TO_GAUSS * (float)( raw_data[1] );
*magZ = MAG_CONVERT_TO_GAUSS * (float)( raw_data[2] ); Thanks
... View more