Bosch Sensortec Community

    cancel
    Showing results for 
    Search instead for 
    Did you mean: 
    SOLVED

    BMX160 RETURNS 0

    Highlighted
    Member

    BMX160 RETURNS 0

    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, &reg_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();
        }
    }

     

    3 REPLIES 3
    Highlighted
    Member

    Re: BMX160 RETURNS 0

    I finally figured out the issue..

    Highlighted
    Occasional Visitor

    Re: BMX160 RETURNS 0

    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.

    Highlighted
    Occasional Visitor

    Re: BMX160 RETURNS 0

    Nevermind, solved the issue. I had a problem with my i2c write function which wasn't including the reg addr. Its working now.

    Icon--AD-black-48x48Icon--address-consumer-data-black-48x48Icon--appointment-black-48x48Icon--back-left-black-48x48Icon--calendar-black-48x48Icon--center-alignedIcon--Checkbox-checkIcon--clock-black-48x48Icon--close-black-48x48Icon--compare-black-48x48Icon--confirmation-black-48x48Icon--dealer-details-black-48x48Icon--delete-black-48x48Icon--delivery-black-48x48Icon--down-black-48x48Icon--download-black-48x48Ic-OverlayAlertIcon--externallink-black-48x48Icon-Filledforward-right_adjustedIcon--grid-view-black-48x48IC_gd_Check-Circle170821_Icons_Community170823_Bosch_Icons170823_Bosch_Icons170821_Icons_CommunityIC-logout170821_Icons_Community170825_Bosch_Icons170821_Icons_CommunityIC-shopping-cart2170821_Icons_CommunityIC-upIC_UserIcon--imageIcon--info-i-black-48x48Icon--left-alignedIcon--Less-minimize-black-48x48Icon-FilledIcon--List-Check-grennIcon--List-Check-blackIcon--List-Cross-blackIcon--list-view-mobile-black-48x48Icon--list-view-black-48x48Icon--More-Maximize-black-48x48Icon--my-product-black-48x48Icon--newsletter-black-48x48Icon--payment-black-48x48Icon--print-black-48x48Icon--promotion-black-48x48Icon--registration-black-48x48Icon--Reset-black-48x48Icon--right-alignedshare-circle1Icon--share-black-48x48Icon--shopping-bag-black-48x48Icon-shopping-cartIcon--start-play-black-48x48Icon--store-locator-black-48x48Ic-OverlayAlertIcon--summary-black-48x48tumblrIcon-FilledvineIc-OverlayAlertwhishlist