1
0
mirror of https://github.com/DCC-EX/CommandStation-EX.git synced 2024-12-23 21:01:25 +01:00

Update IO_VL53L0X.h

Improve comments;  drive XSHUT pin through pullup resistor, not directly.
This commit is contained in:
Neil McKechnie 2023-02-03 12:46:38 +00:00
parent 49713badb2
commit 847ced2f49

View File

@ -42,14 +42,17 @@
* If you have more than one module, then you will need to specify a digital VPIN (Arduino * If you have more than one module, then you will need to specify a digital VPIN (Arduino
* digital output or I/O extender pin) which you connect to the module's XSHUT pin. Now, * digital output or I/O extender pin) which you connect to the module's XSHUT pin. Now,
* when the device driver starts, the XSHUT pin is set LOW to turn the module off. Once * when the device driver starts, the XSHUT pin is set LOW to turn the module off. Once
* all VL53L0X modules are turned off, the driver works through each module in turn by * all VL53L0X modules are turned off, the driver works through each module in turn,
* setting XSHUT to HIGH to turn the module on,, then writing the module's desired I2C address. * setting XSHUT to HIGH to turn that module on, then writing that module's desired I2C address.
* In this way, many VL53L0X modules can be connected to the one I2C bus, each one * In this way, many VL53L0X modules can be connected to the one I2C bus, each one
* using a distinct I2C address. * using a distinct I2C address. The process is described in ST Microelectronics application
* note AN4846.
* *
* WARNING: If the device's XSHUT pin is not connected, then it is very prone to noise, * WARNING: If the device's XSHUT pin is not connected, then it is very prone to noise,
* and the device may even reset when handled. If you're not using XSHUT, then it's * and the device may reset spontaneously or when handled and the device will stop responding
* best to tie it to +5V. * on its allocated address. If you're not using XSHUT, then tie it to +5V via a resistor
* (should be tied to +2.8V strictly). Some manufacturers (Adafruit and Polulu for example)
* include a pull-up on the module, but others don't.
* *
* The driver is configured as follows: * The driver is configured as follows:
* *
@ -173,14 +176,17 @@ protected:
break; break;
case STATE_RESTARTMODULE: case STATE_RESTARTMODULE:
// On second entry, set XSHUT pin high to allow this module to restart. // On second entry, set XSHUT pin high to allow this module to restart.
// On the module, there is a diode in series with the XSHUT pin to // On some modules, there is a diode in series with the XSHUT pin to
// protect the low-voltage pin against +5V. // protect the low-voltage pin against +5V, but we can provide additional
// Ensure this is done for only one module at a time by using a // protection by enabling the pull-up resistor on the microcontroller
// instead of driving the output directly.
// Ensure XSHUT is set for only one module at a time by using a
// shared flag accessible to all device instances. // shared flag accessible to all device instances.
if (_addressConfigInProgress) return; if (_addressConfigInProgress) return;
_addressConfigInProgress = true; _addressConfigInProgress = true;
// Set XSHUT pin (if connected) // Set XSHUT pin (if connected). Because of supply voltage differences,
if (_xshutPin != VPIN_NONE) IODevice::write(_xshutPin, 1); // drive the signal through the digital output's pull-up resistor.
if (_xshutPin != VPIN_NONE) IODevice::configureInput(_xshutPin, 1);
// Allow the module time to restart // Allow the module time to restart
delayUntil(currentMicros+10000); delayUntil(currentMicros+10000);
_nextState = STATE_CONFIGUREADDRESS; _nextState = STATE_CONFIGUREADDRESS;