Mirror with some correction
Dependencies: mbed FastIO FastPWM USBDevice
Diff: VL6180X/VL6180X.h
- Revision:
- 82:4f6209cb5c33
- Child:
- 85:3c28aee81cde
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VL6180X/VL6180X.h Thu Apr 13 23:20:28 2017 +0000 @@ -0,0 +1,206 @@ +// VL6180X Time of Flight sensor interface + +#ifndef _VL6180X_H_ +#define _VL6180X_H_ + +#include "mbed.h" +#include "BitBangI2C.h" + + +class MyI2C: public I2C +{ +public: + MyI2C(PinName sda, PinName scl) : I2C(sda, scl) { } + + int write(int addr, const uint8_t *data, size_t len, bool repeated = false) + { + return I2C::write(addr, (const char *)data, len, repeated); + } + int read(int addr, uint8_t *data, size_t len, bool repeated = false) + { + return I2C::read(addr, (char *)data, len, repeated); + } + + void reset() { } +}; + +#define VL6180X_IDENTIFICATION_MODEL_ID 0x0000 +#define VL6180X_IDENTIFICATION_MODEL_REV_MAJOR 0x0001 +#define VL6180X_IDENTIFICATION_MODEL_REV_MINOR 0x0002 +#define VL6180X_IDENTIFICATION_MODULE_REV_MAJOR 0x0003 +#define VL6180X_IDENTIFICATION_MODULE_REV_MINOR 0x0004 +#define VL6180X_IDENTIFICATION_DATE 0x0006 // NB - 16-bit value +#define VL6180X_IDENTIFICATION_TIME 0x0008 // NB - 16-bit value + +#define VL6180X_SYSTEM_MODE_GPIO0 0x0010 +#define VL6180X_SYSTEM_MODE_GPIO1 0x0011 +#define VL6180X_SYSTEM_HISTORY_CTRL 0x0012 +#define VL6180X_SYSTEM_INTERRUPT_CONFIG_GPIO 0x0014 +#define VL6180X_SYSTEM_INTERRUPT_CLEAR 0x0015 +#define VL6180X_SYSTEM_FRESH_OUT_OF_RESET 0x0016 +#define VL6180X_SYSTEM_GROUPED_PARAMETER_HOLD 0x0017 + +#define VL6180X_SYSRANGE_START 0x0018 +#define VL6180X_SYSRANGE_THRESH_HIGH 0x0019 +#define VL6180X_SYSRANGE_THRESH_LOW 0x001A +#define VL6180X_SYSRANGE_INTERMEASUREMENT_PERIOD 0x001B +#define VL6180X_SYSRANGE_MAX_CONVERGENCE_TIME 0x001C +#define VL6180X_SYSRANGE_CROSSTALK_COMPENSATION_RATE 0x001E +#define VL6180X_SYSRANGE_CROSSTALK_VALID_HEIGHT 0x0021 +#define VL6180X_SYSRANGE_EARLY_CONVERGENCE_ESTIMATE 0x0022 +#define VL6180X_SYSRANGE_PART_TO_PART_RANGE_OFFSET 0x0024 +#define VL6180X_SYSRANGE_RANGE_IGNORE_VALID_HEIGHT 0x0025 +#define VL6180X_SYSRANGE_RANGE_IGNORE_THRESHOLD 0x0026 +#define VL6180X_SYSRANGE_MAX_AMBIENT_LEVEL_MULT 0x002C +#define VL6180X_SYSRANGE_RANGE_CHECK_ENABLES 0x002D +#define VL6180X_SYSRANGE_VHV_RECALIBRATE 0x002E +#define VL6180X_SYSRANGE_VHV_REPEAT_RATE 0x0031 + +#define VL6180X_SYSALS_START 0x0038 +#define VL6180X_SYSALS_THRESH_HIGH 0x003A +#define VL6180X_SYSALS_THRESH_LOW 0x003C +#define VL6180X_SYSALS_INTERMEASUREMENT_PERIOD 0x003E +#define VL6180X_SYSALS_ANALOGUE_GAIN 0x003F +#define VL6180X_SYSALS_INTEGRATION_PERIOD 0x0040 + +#define VL6180X_RESULT_RANGE_STATUS 0x004D +#define VL6180X_RESULT_ALS_STATUS 0x004E +#define VL6180X_RESULT_INTERRUPT_STATUS_GPIO 0x004F +#define VL6180X_RESULT_ALS_VAL 0x0050 +#define VL6180X_RESULT_HISTORY_BUFFER 0x0052 +#define VL6180X_RESULT_RANGE_VAL 0x0062 +#define VL6180X_RESULT_RANGE_RAW 0x0064 +#define VL6180X_RESULT_RANGE_RETURN_RATE 0x0066 +#define VL6180X_RESULT_RANGE_REFERENCE_RATE 0x0068 +#define VL6180X_RESULT_RANGE_RETURN_SIGNAL_COUNT 0x006C +#define VL6180X_RESULT_RANGE_REFERENCE_SIGNAL_COUNT 0x0070 +#define VL6180X_RESULT_RANGE_RETURN_AMB_COUNT 0x0074 +#define VL6180X_RESULT_RANGE_REFERENCE_AMB_COUNT 0x0078 +#define VL6180X_RESULT_RANGE_RETURN_CONV_TIME 0x007C +#define VL6180X_RESULT_RANGE_REFERENCE_CONV_TIME 0x0080 + +#define VL6180X_READOUT_AVERAGING_SAMPLE_PERIOD 0x010A +#define VL6180X_FIRMWARE_BOOTUP 0x0119 +#define VL6180X_FIRMWARE_RESULT_SCALER 0x0120 +#define VL6180X_I2C_SLAVE_DEVICE_ADDRESS 0x0212 +#define VL6180X_INTERLEAVED_MODE_ENABLE 0x02A3 + +// gain settings +enum VL6180X_ALS_Gain +{ + GAIN_20 = 0, // 20 + GAIN_10, // 10.32 + GAIN_5, // 5.21 + GAIN_2_5, // 2.60 + GAIN_1_67, // 1.72 + GAIN_1_25, // 1.28 + GAIN_1, // 1.01 + GAIN_40, // 40 +}; + +// identification +struct VL6180X_ID +{ + uint8_t model; // model number + uint8_t modelRevMajor; // model revision number major... + uint8_t modelRevMinor; // ...and minor + uint8_t moduleRevMajor; // module revision number major... + uint8_t moduleRevMinor; // ... and minior + struct + { + uint8_t month; // month 1..12 + uint8_t day; // day of month 1..31 + uint16_t year; // calendar year, 4-digit (e.g., 2016) + uint8_t phase; // manufacturing phase, 0..7 + uint8_t hh; // hour, 0..23 + uint8_t mm; // minute, 0..59 + uint8_t ss; // second, 0..59 + } manufDate; // manufacturing date and time +}; + +// range statistics +struct VL6180X_RangeStats +{ + uint16_t returnRate; // return signal rate + uint16_t refReturnRate; // reference return rate + uint32_t returnCnt; // return signal count + uint32_t refReturnCnt; // reference return count + uint32_t ambCnt; // ambient count + uint32_t refAmbCnt; // reference ambient count + uint32_t convTime; // convergence time + uint32_t refConvTime; // reference convergence time +}; + +class VL6180X +{ +public: + // Set up the interface with the given I2C pins, I2C address, and + // the GPIO0 pin (for resetting the sensor at startup). + // + // Note that the power-on default I2C address is always 0x29. The + // address can be changed during a session, but it's not saved + // persistently; it always resets to 0x29 on the next power cycle. + VL6180X(PinName sda, PinName scl, uint8_t addr, PinName gpio0); + + // destruction + ~VL6180X(); + + // Send the required initialization sequence. Returns true on + // success, false on failure. + bool init(); + + // set up default settings + void setDefaults(); + + // Start a distance reading, returning immediately without waiting + // for the reading to finish. The caller can poll for the finished + // reading via distanceReady(). + void startRangeReading(); + + // Get TOF range distance in mm. Returns 0 on success, a device + // "range error code" (>0) on failure, or -1 on timeout. + int getRange(uint8_t &distance, uint32_t timeout_us); + + // get range statistics + void getRangeStats(VL6180X_RangeStats &stats); + + // set continuous distance mode + void continuousDistanceMode(bool on); + + // is a sample ready? + bool rangeReady(); + + // get ambient light level in lux + float getAmbientLight(VL6180X_ALS_Gain gain); + + // get identification data + void getID(VL6180X_ID &id); + + // Change the address of the device. Returns the new address. + uint8_t changeAddress(uint8_t newAddress); + + +protected: + // I2C interface to device + BitBangI2C i2c; + + // GPIO0 pin for hard reset + DigitalOut gpio0Pin; + + // device address + uint8_t addr; + + // current distance mode: 0=single shot, 1=continuous + bool distMode; + + // read registers + uint8_t readReg8(uint16_t regAddr); + uint16_t readReg16(uint16_t regAddr); + uint32_t readReg32(uint16_t regAddr); + + // write registers + void writeReg8(uint16_t regAddr, uint8_t data); + void writeReg16(uint16_t regAddr, uint16_t data); +}; + +#endif