Bosch Sensortec Community

    Showing results for 
    Search instead for 
    Did you mean: 

    BMX055 Magnetometer self test

    BMX055 Magnetometer self test

    New Poster


    I'm using the BMX055 in a company's project. I read the data using the bma2x2_driver, bmg160_driver and bmm150_sensor_api for ACC, GYRO and MAG respectively.

    The data coming from ACC and DATA seem to be fine, whereas the data from the MAG doesn't seem relyable.

    As a preliminary test I'm using the smartphone compass to detect the North, in order to compare it with the result I get from the BMX055. Since the results are very different and the readings from the BMX055 are varying over time I tried to perform a self test:

    - the normal test completes successfully

    - the advanced test always fails (I used 3 different boards)

    Here is a snipped of my code:

    static struct bmm150_dev dev;
    s8 initMAG(void) {
        s8 ret = BMM150_OK;

        /* Sensor interface over I2C */
        dev.dev_id = BMM150_DEFAULT_I2C_ADDRESS;
        dev.intf = BMM150_I2C_INTF; = user_i2c_read;
        dev.write = user_i2c_write;
        dev.delay_ms = user_delay_ms;
        ret = bmm150_init(&dev);

        if(ret != 0) {
            ESP_LOGE(TAG_IMU, "Error initializing the magnetometer. Error code: %d", ret);
        ret += perform_mag_self_tests();

        /* Setting the power mode as normal */
        dev.settings.pwr_mode = BMM150_NORMAL_MODE;
        ret += bmm150_set_op_mode(&dev);
        /* Setting the preset mode as Low power mode 
        i.e. data rate = 10Hz XY-rep = 1 Z-rep = 2*/
        dev.settings.preset_mode = BMM150_PRESETMODE_REGULAR;
        ret += bmm150_set_presetmode(&dev);

        return ret; 


    int8_t perform_mag_self_tests(void)
        int8_t rslt;

        /* Perform Normal Self test */
        rslt = bmm150_perform_self_test(BMM150_NORMAL_SELF_TEST, &dev);
        /* Validate normal self test result */
        if (rslt == BMM150_OK) {
            ESP_LOGI(TAG_IMU, "Normal Self test passed");
        } else {
            ESP_LOGE(TAG_IMU, "Normal Self test failed");
        /* Perform Advanced Self test */
        rslt |= bmm150_perform_self_test(BMM150_ADVANCED_SELF_TEST, &dev);

        /* Validate Advanced self test result */
        if (rslt == BMM150_OK) {
            ESP_LOGI(TAG_IMU, "Advanced Self test passed");
        } else {
            ESP_LOGE(TAG_IMU, "Advanced Self test failed");
        return rslt;
    Could you please help me identifying the problem?
    Thank you!
    1 REPLY 1

    Occasional Contributor

    Please make sure the magnetic field environment of advanced self-test is stable, and do not move the device under testing.