in shakti/parashu/main.c [124:202]
int read_bmp280_values(i2c_struct * instance, uint32_t reg_offset,
uint32_t *pressure, uint32_t *temperature, uint32_t delay)
{
unsigned char read_buf[6] = {'\0'};
int32_t adc_P, adc_T, var1, var2, t_fine;
int32_t temp;
int32_t p;
//Writes the slave address for write
i2c_send_slave_address(instance, BMP280_SLAVE_ADDRESS, I2C_WRITE, 800);
//Writes the pointer to address that needs to be read
i2c_write_data(instance, reg_offset , delay);
//Stops the I2C transaction to start reading the temperature value.
instance->control = I2C_STOP;
//Writes the slave address for read
i2c_send_slave_address(instance, BMP280_SLAVE_ADDRESS, I2C_READ, 800);
/* Make a dummy read as per spec of the I2C controller */
i2c_read_data(instance, read_buf, delay);
//Read Pressure
i2c_read_data(instance, &read_buf[0], delay);
i2c_read_data(instance, &read_buf[1], delay);
i2c_read_data(instance, &read_buf[2], delay);
//Read Temperature
i2c_read_data(instance, &read_buf[3], delay);
i2c_read_data(instance, &read_buf[4], delay);
instance->control = I2C_NACK;
i2c_read_data(instance, &read_buf[5], delay);
instance->control = I2C_STOP;
adc_P = ((read_buf[0] << 12) | (read_buf[1] << 4) | (read_buf[2] >> 4));
adc_T = ((read_buf[3] << 12) | (read_buf[4] << 4) | (read_buf[5] >> 4));
// Calculate TEMPERATURE
var1 = ((((adc_T / 8) - ((int32_t)bmp280_calib_dig_T1 * 2))) * ((int32_t)bmp280_calib_dig_T2)) / 2048;
var2 = (((((adc_T / 16) - ((int32_t)bmp280_calib_dig_T1)) * ((adc_T / 16) - ((int32_t)bmp280_calib_dig_T1))) / 4096) * ((int32_t)bmp280_calib_dig_T3)) / 16384;
t_fine = var1 + var2;
temp = (t_fine * 5 + 128) / 256;
*temperature = temp;
printf("\nTemperature Value:%lu.%lu °C", (temp/100),(temp%100));
//Calculate Pressure
var1 = 0;
var2 = 0;
var1 = (((int32_t)t_fine) / 2) - (int32_t)64000;
var2 = (((var1/4) * (var1/4)) / 2048 ) * ((int32_t)bmp280_calib_dig_P6);
var2 = var2 + ((var1 * ((int32_t)bmp280_calib_dig_P5)) * 2);
var2 = (var2/4) + (((int32_t)bmp280_calib_dig_P4) * 65536);
var1 = ((((int32_t)bmp280_calib_dig_P3 * (((var1/4) * (var1/4)) / 8192 )) / 8) + ((((int32_t)bmp280_calib_dig_P2) * var1)/2)) / 262144;
var1 =((((32768 + var1)) * ((int32_t)bmp280_calib_dig_P1)) / 32768);
if (var1 == 0)
return 0; // avoid exception caused by division by zero
p = (((uint32_t)(((int32_t)1048576) - adc_P) - (var2 / 4096))) * 3125;
if (p < (int32_t) 0x80000000)
p = (p * 2) / ((uint32_t)var1);
else
p = (p / (uint32_t)var1) * 2;
var1 = (((int32_t)bmp280_calib_dig_P9) * ((int32_t)(((p/8) * (p/8)) / 8192))) / 4096;
var2 = (((int32_t)(p/4)) * ((int32_t)bmp280_calib_dig_P8)) / 8192;
p = (uint32_t)((int32_t)p + ((var1 + var2 + (int32_t)bmp280_calib_dig_P7)/16));
*pressure = p;
printf("\nThe Pressure Value:%lu.%lu Kpa",(p/1000),(p%1000));
return 0;
}