@@ -203,6 +203,10 @@ class DPS310:
203
203
204
204
_calib_coeff_temp_src_bit = ROBit (_DPS310_TMPCOEFSRCE , 7 )
205
205
206
+ _reg0e = RWBits (8 , 0x0E , 0 )
207
+ _reg0f = RWBits (8 , 0x0F , 0 )
208
+ _reg62 = RWBits (8 , 0x62 , 0 )
209
+
206
210
def __init__ (self , i2c_bus , address = _DPS310_DEFAULT_ADDRESS ):
207
211
self .i2c_device = i2c_device .I2CDevice (i2c_bus , address )
208
212
@@ -234,13 +238,9 @@ def __init__(self, i2c_bus, address=_DPS310_DEFAULT_ADDRESS):
234
238
self .initialize ()
235
239
236
240
def initialize (self ):
237
- """Reset the sensor to the default state"""
238
-
239
- self ._reset ()
240
- self ._read_calibration ()
241
+ """Initialize the sensor to continuous measurement"""
241
242
242
- # make sure we're using the temperature source used for calibration
243
- self ._temp_measurement_src_bit = self ._calib_coeff_temp_src_bit
243
+ self .reset ()
244
244
245
245
self .pressure_rate = Rate .RATE_64_HZ
246
246
self .pressure_oversample_count = SampleCount .COUNT_64
@@ -249,17 +249,35 @@ def initialize(self):
249
249
self .mode = Mode .CONT_PRESTEMP
250
250
251
251
# wait until we have at least one good measurement
252
-
253
- while (self ._temp_ready is False ) or (self ._pressure_ready is False ):
254
- sleep (0.001 )
255
-
256
- def _reset (self ):
257
- """Perform a soft-reset on the sensor"""
252
+ self .wait_temperature_ready ()
253
+ self .wait_pressure_ready ()
254
+
255
+ # (https://github.com/Infineon/DPS310-Pressure-Sensor#temperature-measurement-issue)
256
+ # similar to DpsClass::correctTemp(void) from infineon's c++ library
257
+ def _correct_temp (self ):
258
+ """Correct temperature readings on ICs with a fuse bit problem"""
259
+ self ._reg0e = 0xA5
260
+ self ._reg0f = 0x96
261
+ self ._reg62 = 0x02
262
+ self ._reg0e = 0
263
+ self ._reg0f = 0
264
+
265
+ # perform a temperature measurement
266
+ # the most recent temperature will be saved internally
267
+ # and used for compensation when calculating pressure
268
+ _unused = self ._raw_temperature
269
+
270
+ def reset (self ):
271
+ """Reset the sensor"""
258
272
self ._reset_register = 0x89
259
273
# wait for hardware reset to finish
260
274
sleep (0.010 )
261
275
while not self ._sensor_ready :
262
276
sleep (0.001 )
277
+ self ._correct_temp ()
278
+ self ._read_calibration ()
279
+ # make sure we're using the temperature source used for calibration
280
+ self ._temp_measurement_src_bit = self ._calib_coeff_temp_src_bit
263
281
264
282
@property
265
283
def pressure (self ):
@@ -296,11 +314,51 @@ def temperature_ready(self):
296
314
"""Returns true if there is a temperature reading ready"""
297
315
return self ._temp_ready
298
316
317
+ def wait_temperature_ready (self ):
318
+ """Wait until a temperature measurement is available.
319
+
320
+ To avoid waiting indefinitely this function raises an
321
+ error if the sensor isn't configured for temperate measurements,
322
+ ie. ``Mode.ONE_TEMPERATURE``, ``Mode.CONT_TEMP`` or ``Mode.CONT_PRESTEMP``.
323
+ See the `Mode` documentation for details.
324
+ """
325
+ if (
326
+ self ._mode_bits == Mode .IDLE
327
+ or self ._mode_bits == Mode .ONE_PRESSURE
328
+ or self ._mode_bits == Mode .CONT_PRESSURE
329
+ ):
330
+ raise RuntimeError (
331
+ "Sensor mode is set to idle or pressure measurement,\
332
+ can't wait for a temperature measurement"
333
+ )
334
+ while self ._temp_ready is False :
335
+ sleep (0.001 )
336
+
299
337
@property
300
338
def pressure_ready (self ):
301
339
"""Returns true if pressure readings are ready"""
302
340
return self ._pressure_ready
303
341
342
+ def wait_pressure_ready (self ):
343
+ """Wait until a pressure measurement is available
344
+
345
+ To avoid waiting indefinitely this function raises an
346
+ error if the sensor isn't configured for pressure measurements,
347
+ ie. ``Mode.ONE_PRESSURE``, ``Mode.CONT_PRESSURE`` or ``Mode.CONT_PRESTEMP``
348
+ See the `Mode` documentation for details.
349
+ """
350
+ if (
351
+ self ._mode_bits == Mode .IDLE
352
+ or self ._mode_bits == Mode .ONE_TEMPERATURE
353
+ or self ._mode_bits == Mode .CONT_TEMP
354
+ ):
355
+ raise RuntimeError (
356
+ "Sensor mode is set to idle or temperature measurement,\
357
+ can't wait for a pressure measurement"
358
+ )
359
+ while self ._pressure_ready is False :
360
+ sleep (0.001 )
361
+
304
362
@property
305
363
def mode (self ):
306
364
"""The measurement mode. Must be a `Mode`. See the `Mode` documentation for details"""
0 commit comments