Skip to content

Commit 157fed0

Browse files
committed
vl53l1x: Check data ready and clear interrupt in read().
1 parent 1492c3e commit 157fed0

2 files changed

Lines changed: 62 additions & 34 deletions

File tree

lib/vl53l1x/vl53l1x/device.py

Lines changed: 25 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -136,40 +136,31 @@ def reset(self):
136136
machine.lightsleep(100)
137137
self._write_reg(0x0000, 0x01)
138138

139+
def start_ranging(self):
140+
self._write_reg(0x0087, 0x40)
141+
142+
def stop_ranging(self):
143+
self._write_reg(0x0087, 0x00)
144+
145+
def _is_data_ready(self):
146+
polarity = self._read_reg(0x0030) & 0x10
147+
ready_val = 1 if polarity == 0 else 0
148+
return (self._read_reg(0x0031) & 0x01) == ready_val
149+
150+
def _clear_interrupt(self):
151+
self._write_reg(0x0086, 0x01)
152+
153+
def _ensure_data(self):
154+
if not self._is_data_ready():
155+
self.start_ranging()
156+
for _ in range(100):
157+
if self._is_data_ready():
158+
return
159+
machine.lightsleep(10)
160+
139161
def read(self):
140-
data = self.i2c.readfrom_mem(self.address, 0x0089, 17, addrsize=16) # RESULT__RANGE_STATUS
141-
# range_status = data[0]
142-
# report_status = data[1]
143-
# stream_count = data[2]
144-
# dss_actual_effective_spads_sd0 = (data[3] << 8) + data[4]
145-
# peak_signal_count_rate_mcps_sd0 = (data[5]<<8) + data[6]
146-
# ambient_count_rate_mcps_sd0 = (data[7] << 8) + data[8]
147-
# sigma_sd0 = (data[9]<<8) + data[10]
148-
# phase_sd0 = (data[11]<<8) + data[12]
162+
self._ensure_data()
163+
data = self.i2c.readfrom_mem(self.address, 0x0089, 17, addrsize=16)
149164
final_crosstalk_corrected_range_mm_sd0 = (data[13] << 8) + data[14]
150-
# peak_signal_count_rate_crosstalk_corrected_mcps_sd0 = (data[15] << 8) + data[16]
151-
# status = None
152-
# if range_status in (17, 2, 1, 3):
153-
# status = "HardwareFail"
154-
# elif range_status == 13:
155-
# status = "MinRangeFail"
156-
# elif range_status == 18:
157-
# status = "SynchronizationInt"
158-
# elif range_status == 5:
159-
# status = "OutOfBoundsFail"
160-
# elif range_status == 4:
161-
# status = "SignalFail"
162-
# elif range_status == 6:
163-
# status = "SignalFail"
164-
# elif range_status == 7:
165-
# status = "WrapTargetFail"
166-
# elif range_status == 12:
167-
# status = "XtalkSignalFail"
168-
# elif range_status == 8:
169-
# status = "RangeValidMinRangeClipped"
170-
# elif range_status == 9:
171-
# if stream_count == 0:
172-
# status = "RangeValidNoWrapCheckFail"
173-
# else:
174-
# status = "OK"
165+
self._clear_interrupt()
175166
return final_crosstalk_corrected_range_mm_sd0

tests/scenarios/vl53l1x.yaml

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,14 @@ mock_registers:
1515
0x0000: 0x01
1616
# MM_CONFIG__OUTER_OFFSET_MM (0x0022): used during init
1717
0x0022: [0x00, 0x00]
18+
# GPIO__TIO_HV_STATUS (0x0031): data ready (bit 0 = 1 when polarity=0)
19+
0x0031: 0x01
20+
# SYSTEM__INTERRUPT_CLEAR (0x0086)
21+
0x0086: 0x00
22+
# SYSTEM__MODE_START (0x0087)
23+
0x0087: 0x40
24+
# GPIO__HV_MUX__CTRL (0x0030): interrupt polarity (bit 4 = 0 -> active low)
25+
0x0030: 0x01
1826
# RESULT__RANGE_STATUS (0x0089): 17-byte result block
1927
# Bytes: range_status, report_status, stream_count,
2028
# dss_spads(2), peak_rate(2), ambient_rate(2),
@@ -39,6 +47,35 @@ tests:
3947
expect: 250
4048
mode: [mock]
4149

50+
- name: "Data ready check works"
51+
action: script
52+
script: |
53+
result = dev._is_data_ready()
54+
expect_true: true
55+
mode: [mock]
56+
57+
- name: "Read clears interrupt"
58+
action: script
59+
script: |
60+
i2c.clear_write_log()
61+
dev.read()
62+
log = i2c.get_write_log()
63+
cleared = any(reg == 0x0086 and data[0] == 0x01 for reg, data in log)
64+
result = cleared
65+
expect_true: true
66+
mode: [mock]
67+
68+
- name: "Distance after stop and restart"
69+
action: script
70+
script: |
71+
dev.stop_ranging()
72+
d = dev.read()
73+
result = isinstance(d, int)
74+
expect_true: true
75+
mode: [mock]
76+
77+
# ----- Hardware -----
78+
4279
- name: "Distance in plausible range"
4380
action: call
4481
method: read

0 commit comments

Comments
 (0)