Bosch Sensortec Community

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

    How to adapt Bosch Sensor API's to use with STM32?

    DroneKid
    Established Member

    How to adapt Bosch Sensor API's to use with STM32?

    I have two Bosch sensors model BMI160 and BMP388. I am trying to use these sensors with my STM32 based NUCLEO board. I am using CubeIDE and C to code STM32.

    Bosch has APIs for its sensors and they are pretty detailed. However, as far as I understand, a wrapper needs to be written in order to provide I2C or SPI connection.

    https://github.com/BoschSensortec/BMP3-Sensor-API

    Let me give an example from BMP388. Besides the main .c and .h files of the API, there are common.c and common.h files. As far as I understand interface communication happens via these files. In the standard version, "coines" protocol is used, but I need to convert it to STM32 HAL I2C communication for both sensors.

    For the BMP388 I created something like this:

    BMP3_INTF_RET_TYPE bmp3_i2c_read(uint8_t reg_addr, uint8_t * reg_data, uint32_t len, void * intf_ptr);
    BMP3_INTF_RET_TYPE bmp3_i2c_write(uint8_t reg_addr,
    const uint8_t * reg_data, uint32_t len, void * intf_ptr);
    
    uint8_t GTXBuffer[512], GRXBuffer[2048];
    int8_t SensorAPI_I2Cx_Read(uint8_t subaddress, uint8_t * pBuffer, uint32_t ReadNumbr, void * intf_ptr) {
    uint8_t dev_addr = * (uint8_t * ) intf_ptr;
    uint16_t DevAddress = dev_addr << 1;
    
    // send register address
    HAL_I2C_Master_Transmit( & I2C_HANDLE, DevAddress, & subaddress, 1, BUS_TIMEOUT);
    HAL_I2C_Master_Receive( & I2C_HANDLE, DevAddress, pBuffer, ReadNumbr, BUS_TIMEOUT);
    return 0;
    }
    
    int8_t SensorAPI_I2Cx_Write(uint8_t subaddress, uint8_t * pBuffer, uint32_t WriteNumbr, void * intf_ptr) {
    uint8_t dev_addr = * (uint8_t * ) intf_ptr;
    uint16_t DevAddress = dev_addr << 1;
    
    GTXBuffer[0] = subaddress;
    memcpy( & GTXBuffer[1], pBuffer, WriteNumbr);
    
    // send register address
    HAL_I2C_Master_Transmit( & I2C_HANDLE, DevAddress, GTXBuffer, WriteNumbr + 1, BUS_TIMEOUT);
    return 0;
    }

    But I have no idea how to edit common.c and common.h to be able to run this function.

    6 REPLIES 6
    BSTRobin
    Community Moderator

    Re: How to adapt Bosch Sensor API's to use with STM32?

    Hello DroneKid,

    It seems you discuss same topic in https://community.bosch-sensortec.com/t5/MEMS-sensors-forum/How-to-use-BMP388-with-STM32/td-p/50411, you could continue to discuss in that topic.

    DroneKid
    Established Member

    Re: How to adapt Bosch Sensor API's to use with STM32?

    Hi, yes, I asked a similar question on that subject. However, I thought this new topic I opened was a more general question.

    I'm trying to understand the Bosch Sensor API system, sorry if I did anything against the forum rules.

    BSTRobin
    Community Moderator

    Re: How to adapt Bosch Sensor API's to use with STM32?

    Hello DroneKid,

    Welcome to ask question in community. I mean you could ask similar question in one topic, then reduce repetitive discussions. Bosch sensortec community an open forum with no special rules.
    I tested read sensor data example on STM32F401 for your reference. You could see attached reference code and the following test restu, it work well.

    BMP390_SPI read sensor data.pngBMP390_I2C read sensor data.png

    DroneKid
    Established Member

    Re: How to adapt Bosch Sensor API's to use with STM32?

    Thank you for the answer. I see you used RTOS format, correct?

    I can also adapt this code to BMI160, right?

    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