2323
2424LOG_MODULE_REGISTER (bme680 , CONFIG_SENSOR_LOG_LEVEL );
2525
26+ struct bme_data_regs {
27+ uint8_t pressure [3 ];
28+ uint8_t temperature [3 ];
29+ uint8_t humidity [2 ];
30+ uint8_t padding [3 ];
31+ uint8_t gas [2 ];
32+ } __packed ;
2633
2734#if BME680_BUS_SPI
2835static inline bool bme680_is_on_spi (const struct device * dev )
@@ -41,7 +48,7 @@ static inline int bme680_bus_check(const struct device *dev)
4148}
4249
4350static inline int bme680_reg_read (const struct device * dev ,
44- uint8_t start , uint8_t * buf , int size )
51+ uint8_t start , void * buf , int size )
4552{
4653 const struct bme680_config * config = dev -> config ;
4754
@@ -209,12 +216,11 @@ static int bme680_sample_fetch(const struct device *dev,
209216 enum sensor_channel chan )
210217{
211218 struct bme680_data * data = dev -> data ;
212- uint8_t buff [ BME680_LEN_FIELD ] = { 0 } ;
219+ struct bme_data_regs data_regs ;
213220 uint8_t gas_range ;
214221 uint32_t adc_temp , adc_press ;
215222 uint16_t adc_hum , adc_gas_res ;
216223 uint8_t status ;
217- int size = BME680_LEN_FIELD ;
218224 int cnt = 0 ;
219225 int ret ;
220226
@@ -235,35 +241,29 @@ static int bme680_sample_fetch(const struct device *dev,
235241 return - EAGAIN ;
236242 }
237243 k_sleep (K_MSEC (1 ));
238- ret = bme680_reg_read (dev , BME680_REG_FIELD0 , & status , 1 );
244+ ret = bme680_reg_read (dev , BME680_REG_MEAS_STATUS , & status , 1 );
239245 if (ret < 0 ) {
240246 return ret ;
241247 }
242248 } while (!(status & BME680_MSK_NEW_DATA ));
243249 LOG_DBG ("New data after %d ms" , cnt );
244250
245- ret = bme680_reg_read (dev , BME680_REG_FIELD0 , buff , size );
251+ ret = bme680_reg_read (dev , BME680_REG_FIELD0 , & data_regs , sizeof ( data_regs ) );
246252 if (ret < 0 ) {
247253 return ret ;
248254 }
249255
250- data -> new_data = true;
251- data -> heatr_stab = buff [14 ] & BME680_MSK_HEATR_STAB ;
252-
253- adc_press = (uint32_t )(((uint32_t )buff [2 ] << 12 ) | ((uint32_t )buff [3 ] << 4 )
254- | ((uint32_t )buff [4 ] >> 4 ));
255- adc_temp = (uint32_t )(((uint32_t )buff [5 ] << 12 ) | ((uint32_t )buff [6 ] << 4 )
256- | ((uint32_t )buff [7 ] >> 4 ));
257- adc_hum = (uint16_t )(((uint32_t )buff [8 ] << 8 ) | (uint32_t )buff [9 ]);
258- adc_gas_res = (uint16_t )((uint32_t )buff [13 ] << 2 | (((uint32_t )buff [14 ]) >> 6 ));
259- gas_range = buff [14 ] & BME680_MSK_GAS_RANGE ;
260-
261- if (data -> new_data ) {
262- bme680_calc_temp (data , adc_temp );
263- bme680_calc_press (data , adc_press );
264- bme680_calc_humidity (data , adc_hum );
265- bme680_calc_gas_resistance (data , gas_range , adc_gas_res );
266- }
256+ adc_press = sys_get_be24 (data_regs .pressure ) >> 4 ;
257+ adc_temp = sys_get_be24 (data_regs .temperature ) >> 4 ;
258+ adc_hum = sys_get_be16 (data_regs .humidity );
259+ adc_gas_res = sys_get_be16 (data_regs .gas ) >> 6 ;
260+ data -> heatr_stab = data_regs .gas [1 ] & BME680_MSK_HEATR_STAB ;
261+ gas_range = data_regs .gas [1 ] & BME680_MSK_GAS_RANGE ;
262+
263+ bme680_calc_temp (data , adc_temp );
264+ bme680_calc_press (data , adc_press );
265+ bme680_calc_humidity (data , adc_hum );
266+ bme680_calc_gas_resistance (data , gas_range , adc_gas_res );
267267 return 0 ;
268268}
269269
0 commit comments