01-05-2022 11:49 PM
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.
Solved! Go to Solution.
01-06-2022 08:09 PM
I can confirm that the sensor is working. Thank you for the code. 🙂
I will use this sensor to get the altitude information of a drone. Does the it have a direct register to get altitude or do I have to calculate it manually?
Also, are there any settings or filters you would recommend for use with the drone? Or can I use the direct pressure value by converting it to height without filtering?
01-11-2022 03:17 AM
Hello DroneKid,
Yes, the reference code runs under FreeRTOS.
The low layer hardware driver can be used for BMI 160.
To get altitude, you could calculate it manually.
For your application, it is recommended to calibrate sensor with standard barometer.