Bosch Sensortec Community

    cancel
    Showing results for 
    Search instead for 
    Did you mean: 

    Unable to get data accelerometer data from BHI160

    Unable to get data accelerometer data from BHI160

    kuljinderkalsi
    Occasional Visitor

    I am using the following git repositry and trying to get data from accelerometer using accelerometer_remapping_example. 

    I have connected the board with raspberry Pi Pico and ported the library as specified in the doc folder of the repositry. 

    After doing the above step I am successfully able to initialize BHI160 using function 

    if(bhy_driver_init(bhy1_fw)){
          printf("Fail to init bhy\n");
        }
     After this, when the below code executes it gets stuck in the first while loop as in the INT pin of BHI160 always send value 1.
    So i have commented out the following code.
        /* wait for the bhy trigger the interrupt pin go down and up again */
    /* while (gpio_get(10)){
          printf("i am here \n");
        }
        while (!gpio_get(10)){
          printf("i am there \n");
        } */
     
    And I am also able to successfully install sensor callback and enable virtual sensor. using following lines of code
     
    if(bhy_install_sensor_callback(VS_TYPE_ACCELEROMETER, VS_WAKEUP, sensors_callback_acc))
        {
          printf("Fail to install sensor callback\n");
        }
        else{printf("calbck initialized \n");}
       
        sleep_ms(100);

        if(bhy_enable_virtual_sensor(VS_TYPE_ACCELEROMETER, VS_WAKEUP, 10, 0, VS_FLUSH_NONE, 0, 0))
        {
          printf("Fail to enable sensor id=%d\n", VS_TYPE_ACCELEROMETER);
        }
        else{printf("sens enabled \n");}

    But when i run the below code I don't get any accelerometer data.

    Here I am pasting the complete code

    #include "bhy_support.h"
    #include "bhy_uc_driver.h"
    #include "Bosch_PCB_7183_di03_BMI160-7183_di03.2.1.11696_170103.h"
     
    #define FIFO_SIZE                      69
    #define GESTURE_SAMPLE_RATE            1
    #define OUT_BUFFER_SIZE                80
    #define MAX_PACKET_LENGTH              18
    #define TICKS_IN_ONE_SECOND            32000.0F
    #define SENSOR_ID_MASK                 0x1F

    /* system timestamp */
    uint32_t bhy_timestamp = 0;

    uint8_t fifo[FIFO_SIZE];

        float   time_stamp    = 0;
        uint8_t sensor_type   = 0;
        int16_t x_raw         = 0;
        int16_t y_raw         = 0;
        int16_t z_raw         = 0;
        float   x_data        = 0;
        float   y_data        = 0;
        float   z_data        = 0;
        int newdata = 0;
        int intrtoggled = 0;
    /********************************************************************************/
    /*                                 FUNCTIONS                                    */
    /********************************************************************************/

    /*!
     * @brief This function is time stamp callback function that process data in fifo.
     *
     * @param[in]   new_timestamp
     */
    static void timestamp_callback(bhy_data_scalar_u16_t *new_timestamp)
    {
        /* updates the system timestamp */
        bhy_update_system_timestamp(new_timestamp, &bhy_timestamp);
    }

    /*!
     * @brief This function is  callback function for acquring sensor datas
     *
     * @param[in]   sensor_data
     * @param[in]   sensor_id
     */
    static void sensors_callback_acc(bhy_data_generic_t * sensor_data, bhy_virtual_sensor_t sensor_id)
    {
        /* Since a timestamp is always sent before every new data, and that the callbacks   */
        /* are called while the parsing is done, then the system timestamp is always equal  */
        /* to the sample timestamp. (in callback mode only)                                 */
        time_stamp = (float)(bhy_timestamp) / TICKS_IN_ONE_SECOND;

        printf("sensor_id = %d\n", sensor_id);

        switch(sensor_id)
        {
            case VS_ID_ACCELEROMETER_WAKEUP:
            case VS_ID_ACCELEROMETER:
                x_raw  = sensor_data->data_vector.x;
                y_raw  = sensor_data->data_vector.y;
                z_raw  = sensor_data->data_vector.z;
                /* The resolution is  15bit ,the default range is 4g, actual acceleration equals: raw_data/(exp(2,15) == 32768) */
                x_data = (float)x_raw / 32768.0f * 4.0f;
                y_data = (float)y_raw / 32768.0f * 4.0f;
                z_data = (float)z_raw / 32768.0f * 4.0f;

                printf("Time:%6.3fs acc %f %f %f\n", time_stamp, x_data, y_data, z_data);
                break;

            default:
                printf("unknown id = %d\n", sensor_id);
                break;
        }
        newdata = 1;
    }

     

    int main(void)
    {
      //Code for checking BHI160B
      stdio_init_all();
      i2c_init(i2c_default,400*1000);
      gpio_set_function(PICO_DEFAULT_I2C_SDA_PIN,GPIO_FUNC_I2C);
      gpio_set_function(PICO_DEFAULT_I2C_SCL_PIN,GPIO_FUNC_I2C);
      gpio_pull_up(PICO_DEFAULT_I2C_SDA_PIN);
      gpio_pull_up(PICO_DEFAULT_I2C_SCL_PIN);
      gpio_init(10);
      gpio_set_dir(10,0);
        int8_t ret;

        /* BHY Variable*/
        uint8_t                    *fifoptr           = NULL;
        uint8_t                    bytes_left_in_fifo = 0;
        uint16_t                   bytes_remaining    = 0;
        uint16_t                   bytes_read         = 0;
        bhy_data_generic_t         fifo_packet;
        bhy_data_type_t            packet_type;
        BHY_RETURN_FUNCTION_TYPE   result;
        int8_t                    bhy_mapping_matrix_init[3*3]   = {0};
        int8_t                    bhy_mapping_matrix_config[3*3] = {0,1,0,-1,0,0,0,0,1};

        /* To get the customized version number in firmware, it is necessary to read Parameter Page 2, index 125 */
        /* to get this information. This feature is only supported for customized firmware. To get this customized */
        /* firmware, you need to contact your local FAE of Bosch Sensortec. */
        //struct cus_version_t      bhy_cus_version;

        //gpio_set_irq_enabled_with_callback(10,GPIO_IRQ_EDGE_RISE,true,&int_callback);
       
        sleep_ms(20000);
        /* init the bhy chip */
        if(bhy_driver_init(bhy1_fw)){
          printf("Fail to init bhy\n");
        }
        //intrtoggled = 0;
        //waitForBhyInterrupt();
        /* while(1){
          printf("HELLO \n");
          //int aval = gpio_get(10);
          //printf("INT PIN STATE = %d \n",aval);
          //bhy_driver_init(&bhy1_fw);
        } */
        /* wait for the bhy trigger the interrupt pin go down and up again */
    /*     while (gpio_get(10)){
          printf("i am here \n");
        }//;

        while (!gpio_get(10)){
          printf("i am there \n");
        }//; */
        sleep_ms(10000);
       
        bhy_mapping_matrix_get(PHYSICAL_SENSOR_INDEX_ACC, bhy_mapping_matrix_init);
        bhy_mapping_matrix_set(PHYSICAL_SENSOR_INDEX_ACC, bhy_mapping_matrix_config);
        bhy_mapping_matrix_get(PHYSICAL_SENSOR_INDEX_ACC, bhy_mapping_matrix_init);

        /* install time stamp callback */
        bhy_install_timestamp_callback(VS_WAKEUP, timestamp_callback);
        bhy_install_timestamp_callback(VS_NON_WAKEUP, timestamp_callback);
       
        if(bhy_install_sensor_callback(VS_TYPE_ACCELEROMETER, VS_WAKEUP, sensors_callback_acc))
        {
          printf("Fail to install sensor callback\n");
        }
        else{printf("calbck initialized \n");}
       
        sleep_ms(100);

        if(bhy_enable_virtual_sensor(VS_TYPE_ACCELEROMETER, VS_WAKEUP, 10, 0, VS_FLUSH_NONE, 0, 0))
        {
          printf("Fail to enable sensor id=%d\n", VS_TYPE_ACCELEROMETER);
        }
        else{printf("sens enabled \n");}

       
        /* enables the virtual sensor */
       
        sleep_ms(10000);
        /* continuously read and parse the fifo */
        /* while(1){
          sensors_callback_acc(&fifo_packet,VS_TYPE_ACCELEROMETER);
        } */
       while(1)
        {
            /* wait until the interrupt fires */
            /* unless we already know there are bytes remaining in the fifo */
            //printf("HELLO \n");
            //if(intrtoggled){
            //intrtoggled = 0;
            //while (!gpio_get(10) && !bytes_remaining);
            //printf("HELLO \n");
            result = bhy_read_fifo(fifo + bytes_left_in_fifo, FIFO_SIZE - bytes_left_in_fifo, &bytes_read, &bytes_remaining);
            bytes_read           += bytes_left_in_fifo;
            fifoptr              = fifo;
            packet_type          = BHY_DATA_TYPE_PADDING;
            //packet_type          = BHY_DATA_TYPE_VECTOR;
            //printf("Bytes read = %d \n",bytes_read);
            do
            {
                /* this function will call callbacks that are registered */
                result = bhy_parse_next_fifo_packet(&fifoptr, &bytes_read, &fifo_packet, &packet_type);
                //sensors_callback_acc(&fifo_packet,VS_TYPE_ACCELEROMETER);
                /* prints all the debug packets */
                //if (packet_type == BHY_DATA_TYPE_DEBUG)
                if (packet_type == BHY_DATA_TYPE_DEBUG)
                {
                    //bhy_print_vector_packet(&fifo_packet.data_vector);
                    bhy_print_debug_packet(&fifo_packet.data_debug, bhy_printf);
                }
                //if(newdata){
                //printf("Time:%6.3fs acc %f %f %f\n", time_stamp, x_data, y_data, z_data);
                //}
                /* the logic here is that if doing a partial parsing of the fifo, then we should not parse  */
                /* the last 18 bytes (max length of a packet) so that we don't try to parse an incomplete   */
                /* packet */
            } while ((result == BHY_SUCCESS) && (bytes_read > (bytes_remaining ? MAX_PACKET_LENGTH : 0)));

            bytes_left_in_fifo = 0;

            if (bytes_remaining)
            {
                /* shifts the remaining bytes to the beginning of the buffer */
                while (bytes_left_in_fifo < bytes_read)
                {
                    fifo[bytes_left_in_fifo++] = *(fifoptr++);
                }
            }
            //}
        }
    }
    Please help ASAP to solve this issue 
    1 REPLY 1

    BSTRobin
    Community Moderator
    Community Moderator

    Hi kuljinderkalsi,

    You could refer attached example code on STM32. This example code supported poll mode and interrupt mode to get sensor data with macro Definition in the code.
    #define USE_POLL_MODE
    //#define USE_INTERRUPT_MODE

    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