Hi, I am using the API for bosch bmi160 and bmm 150 for the bmx160. Everything is working fine except the magnetometer for the z axis. In certain orientations (pointing up), the magnetometer reading will read 2047 and not change until it is moved out of that range. I have included the setup code that is mostly from the bmi160 github. I have also just included a short reading I have gotten. Is this perhaps sent as an errror code. Also, I have checked and it seems like I get negative values on the magnetometer x and y readings but never the z, and the error seems to occur around the zero point. bmi.id = 0; bmi.interface = BMI160_SPI_INTF; bmi.read = spi_read_transfer; bmi.write = spi_write_transfer; bmi.delay_ms = user_delay_ms; rslt = BMI160_OK; rslt = bmi160_init(&bmi); /* Select the Output data rate, range of accelerometer sensor */ bmi.accel_cfg.odr = BMI160_ACCEL_ODR_100HZ; bmi.accel_cfg.range = BMI160_ACCEL_RANGE_4G; bmi.accel_cfg.bw = BMI160_GYRO_BW_NORMAL_MODE; /* Select the power mode of accelerometer sensor */ bmi.accel_cfg.power = BMI160_ACCEL_NORMAL_MODE; /* Select the Output data rate, range of Gyroscope sensor */ bmi.gyro_cfg.odr = BMI160_GYRO_ODR_100HZ; bmi.gyro_cfg.range = BMI160_GYRO_RANGE_1000_DPS; bmi.gyro_cfg.bw = BMI160_GYRO_BW_NORMAL_MODE; /* Select the power mode of Gyroscope sensor */ bmi.gyro_cfg.power = BMI160_GYRO_NORMAL_MODE; bmm.write = user_aux_write; bmm.read = user_aux_read; /* Set the sensor configuration */ rslt = bmi160_set_sens_conf(&bmi); rslt = BMI160_OK; struct bmi160_sensor_data accel; struct bmi160_sensor_data gyro; /* To read both Accel and Gyro data */ bmi.aux_cfg.aux_sensor_enable = 1; // auxiliary sensor enable bmi.aux_cfg.aux_i2c_addr = BMI160_AUX_BMM150_I2C_ADDR; // auxiliary sensor address bmi.aux_cfg.manual_enable = 1; // setup mode enable bmi.aux_cfg.aux_rd_burst_len = 2;// burst read of 2 byte /* Configure the BMM150 device structure by mapping user_aux_read and user_aux_write */ bmm.read = user_aux_read; bmm.write = user_aux_write; bmm.dev_id = BMM150_DEFAULT_I2C_ADDRESS; /* Ensure that sensor.aux_cfg.aux_i2c_addr = bmm150.id for proper sensor operation */ bmm.delay_ms = user_delay_ms; bmm.intf = BMM150_I2C_INTF; rslt = bmi160_aux_init(&bmi); rslt = bmm150_init(&bmm); bmm.settings.preset_mode = BMM150_PRESETMODE_REGULAR; bmm150_set_presetmode(&bmm); bmm.settings.pwr_mode = BMM150_FORCED_MODE; bmm150_set_op_mode(&bmm); uint8_t aux_addr = 0x42; uint8_t index; bmi.aux_cfg.aux_odr = 8; bmi160_config_aux_mode(&bmi); bmi160_set_aux_auto_mode(&aux_addr, &bmi); Read code is called by a timer bmi160_get_sensor_data((BMI160_ACCEL_SEL | BMI160_GYRO_SEL), &accel, &gyro, &bmi); bmi160_read_aux_data_auto_mode(mag_data, &bmi); bmm150_aux_mag_data(mag_data, &bmm);
... View more