02-22-2024 01:11 AM
Hi
I built c library that works perfectly with BME280. It implements the I2C read, write and delay functions and then I use the Bosch api for the rest of the functions.
Now, I am using BME680 for final product prototoype. I am using the same implementation for the I2C functions created for the BME280.
I can read the chip_id, but I can't ready anything else. Self Test gives error 0xFB.
Return values of configuration functions is zero which means no error, but when i read the configuration registers, they are reading zero values, not the values I wrote.
So, if I am reading the chip_d, does this infer that the I2C implementation is still valid and correct ?
I have 2 prototypes with the same behaviour.
I2C @ 100kHz
I attached the I2C implementation as text file.
============
Code snippets::
// Globals BME68x Variables
struct bme68x_dev bme68X;
struct bme68x_data bme68X_data;
struct bme68x_conf bme68x_conf;
struct bme68x_heatr_conf bme68x_heater_conf;
// I use UART commands and switch-case to send commands to BME680:
switch(serial_in)
{
case '1':
I2C_scan();
break;
case '2': // Init
status = BME_initialize(&bme68X);
sprintf(uart_string, "BME280 initialized, status: 0x%x\n", status);
UART_PutString(uart_string);
sprintf(uart_string, "chip_id (0x61): 0x%x\n", bme68X.chip_id);
UART_PutString(uart_string);
break;
case '4': // Config sensor
// Oversampling
bme68x_conf.os_hum = BME68X_OS_1X;
bme68x_conf.os_temp = BME68X_OS_2X;
bme68x_conf.os_pres = BME68X_OS_16X;
// Standby time between sequential mode measurement profiles: BME68X_SEQUENTIAL_MODE
bme68x_conf.odr = BME68X_ODR_1000_MS;
// Filter coefficient
bme68x_conf.filter = BME68X_FILTER_SIZE_3;
status = bme68x_set_conf(&bme68x_conf, &bme68X);
sprintf(uart_string, "Status: 0x%x\n", status);
UART_PutString(uart_string);
//bme68x_heater_conf.enable = 1;
bme68x_heater_conf.heatr_dur = BME68X_ODR_250_MS;
bme68x_heater_conf.heatr_temp = BME68X_MAX_TEMPERATURE;
status = bme68x_set_heatr_conf(BME68X_FORCED_MODE, &bme68x_heater_conf, &bme68X);
sprintf(uart_string, "Write Gas Mode: 0x%x\n", status);
UART_PutString(uart_string);
break;
case '5': // Read sensor config
status = bme68x_get_conf(&bme68x_conf, &bme68X);
sprintf(uart_string, "Config os_hum: 0x%x\n", bme68x_conf.os_hum);
UART_PutString(uart_string);
sprintf(uart_string, "Config os_temp: 0x%x\n", bme68x_conf.os_temp);
UART_PutString(uart_string);
sprintf(uart_string, "Config os_pres: 0x%x\n", bme68x_conf.os_pres);
UART_PutString(uart_string);
sprintf(uart_string, "Config odr: 0x%x\n", bme68x_conf.odr);
UART_PutString(uart_string);
sprintf(uart_string, "Config filter: 0x%x\n", bme68x_conf.filter);
UART_PutString(uart_string);
break;
case '6': // Read chip id
status = BME_get_chipid(&bme68X);
sprintf(uart_string, "Status: 0x%x\n", status);
UART_PutString(uart_string);
sprintf(uart_string, "Chip ID (0x61): 0x%x\n", bme68X.chip_id);
UART_PutString(uart_string);
break;
case '7': // Set sensor mode: BME68X_SLEEP_MODE, BME68X_FORCED_MODE, BME68X_SEQUENTIAL_MODE
status = bme68x_set_op_mode(BME68X_FORCED_MODE, &bme68X);
sprintf(uart_string, "status: 0x%x\n", status);
UART_PutString(uart_string);
break;
case '8': // Get sensor mode
status = bme68x_get_op_mode(&temp, &bme68X);
sprintf(uart_string, "Op Mode: 0x%x\n", temp);
UART_PutString(uart_string);
break;
case '9': // Read T, P, H data in BME68X_FORCED_MODE
//status = bme68X_get_sensor_data(sensor_comp, &comp_data, &bme68X);
status = bme68x_get_data(BME68X_FORCED_MODE, &bme68X_data, &bme68x_n_data, &bme68X);
sprintf(uart_string, "Status: 0x%x\n", status);
UART_PutString(uart_string);
sprintf(uart_string, "T: %.2f\n", bme68x_data.temperature);
UART_PutString(uart_string);
sprintf(uart_string, "P: %.2f\n", bme68x_data.pressure);
UART_PutString(uart_string);
sprintf(uart_string, "H: %.2f\n", bme68x_data.humidity);
UART_PutString(uart_string);
break;
case 'a': // Self test
status = bme68x_selftest_check(&bme68X);
sprintf(uart_string, "Self test: 0x%x\n", status);
UART_PutString(uart_string);
break;
case 'b':
//bme68x_check_rslt("bme68x_interface_init", rslt);
status = bme68x_init(&bme68X);
bme68x_check_rslt("bme68x_init", status);
status = bme68x_selftest_check(&bme68X);
bme68x_check_rslt("bme68x_selftest_check", status);
if (status == BME68X_OK)
{
printf("Self-test passed\n");
}
if (status == BME68X_E_SELF_TEST)
{
printf("Self-test failed\n");
}
printf("Status: 0x%x\n", status);
break;
}
Thanks
02-26-2024 08:12 AM
Hi Salam,
Can you directly refer to and run the official example program to try it out? For example: https://github.com/boschsensortec/BME68x_SensorDriver/blob/master/examples/forced_mode/forced_mode.c