Library for use with VL53L0X, cut 1.1, based on mass-market API v1.1.

Dependencies:   ST_INTERFACES X_NUCLEO_COMMON

Dependents:   ConcorsoFinal HelloWorld_IHM01A1 m3pi_BT m3pi_LIDAR ... more

Fork of X_NUCLEO_53L0A1 by ST Expansion SW Team

X-NUCLEO-53L0A1 Proximity Sensor Expansion Board Firmware Package

Introduction

This firmware package includes Component Device Drivers and the Board Support Package for STMicroelectronics' X-NUCLEO-53L0A1 Proximity sensor expansion board based on VL53L0X.

Firmware Library

Class X_NUCLEO_53L0A1 is intended to represent the Proximity sensor expansion board with the same name.

The expansion board provides support for the following components:

  1. on-board VL53L0X proximity sensor,
  2. up to two additional VL53L0X Satellites,
  3. on-board 4-digit display

It is intentionally implemented as a singleton because only one X-NUCLEO-VL53L0A1 may be deployed at a time in a HW component stack. In order to get the singleton instance you have to call class method `Instance()`, e.g.:

// Sensors expansion board singleton instance
static X_NUCLEO_53L0A1 *board = X_NUCLEO_53L0A1::Instance(device_i2c, A2, D8, D2);

Example Applications

The library and sample application code were tested against mbed revision 143, dated 26th May 2017.

Files at this revision

API Documentation at this revision

Comitter:
johnAlexander
Date:
Tue Aug 08 14:41:03 2017 +0000
Parent:
14:8320b5ff96fa
Child:
20:cb95ef8a3508
Commit message:
Update references in all board components to allow continued use of DevI2C from X_Nucleo_Common.

Changed in this revision

Components/Display/Display_class.h Show annotated file Show diff for this revision Revisions of this file
Components/STMPE1600/stmpe1600_class.h Show annotated file Show diff for this revision Revisions of this file
Components/VL53L0X/vl53l0x_class.cpp Show annotated file Show diff for this revision Revisions of this file
Components/VL53L0X/vl53l0x_class.h Show annotated file Show diff for this revision Revisions of this file
X_NUCLEO_COMMON.lib Show annotated file Show diff for this revision Revisions of this file
--- a/Components/Display/Display_class.h	Mon Aug 07 14:30:21 2017 +0000
+++ b/Components/Display/Display_class.h	Tue Aug 08 14:41:03 2017 +0000
@@ -324,33 +324,33 @@
 class Display
 {
 private:
-    Stmpe1600 &stmpe1600_exp0;
-    Stmpe1600 &stmpe1600_exp1;
+    Stmpe1600 *stmpe1600_exp0;
+    Stmpe1600 *stmpe1600_exp1;
 public:
     /** Constructor
     * @param[in] &stmpe_1600 device handler to be used for display control
     */
-    Display(Stmpe1600 &stmpe_1600_exp0, Stmpe1600 &stmpe_1600_exp1) : stmpe1600_exp0(stmpe_1600_exp0),
-        stmpe1600_exp1(stmpe_1600_exp1)
+    Display(Stmpe1600 &stmpe_1600_exp0, Stmpe1600 &stmpe_1600_exp1) : stmpe1600_exp0(&stmpe_1600_exp0),
+        stmpe1600_exp1(&stmpe_1600_exp1)
     {
         uint16_t expander_data;
 
         // detect the extenders
-        stmpe1600_exp0.read_16bit_reg(0x00, &expander_data);
+        stmpe1600_exp0->read_16bit_reg(0x00, &expander_data);
 //        if (ExpanderData != 0x1600) {/* log - failed to find expander exp0 */ }
-        stmpe1600_exp1.read_16bit_reg(0x00, &expander_data);
+        stmpe1600_exp1->read_16bit_reg(0x00, &expander_data);
 //        if (ExpanderData != 0x1600) {/* log - failed to find expander exp1 */ }
 
         // configure all necessary GPIO pins as outputs
         expander_data = 0xFFFF;
-        stmpe1600_exp0.write_16bit_reg(GPDR, &expander_data);
+        stmpe1600_exp0->write_16bit_reg(GPDR, &expander_data);
         expander_data = 0xBFFF; // leave bit 14 as an input, for the pushbutton, PB1.
-        stmpe1600_exp1.write_16bit_reg(GPDR, &expander_data);
+        stmpe1600_exp1->write_16bit_reg(GPDR, &expander_data);
 
         // shut down all segment and all device
         expander_data = 0x7F + (0x7F << 7);
-        stmpe1600_exp0.write_16bit_reg(GPSR, &expander_data);
-        stmpe1600_exp1.write_16bit_reg(GPSR, &expander_data);
+        stmpe1600_exp0->write_16bit_reg(GPSR, &expander_data);
+        stmpe1600_exp1->write_16bit_reg(GPSR, &expander_data);
     }
 
     /*** Interface Methods ***/
@@ -386,10 +386,10 @@
 // ordered low-byte/high-byte!
         cur_io_val.bytes[1] |= 0xC0; // ensure highest bits are high, as these are xshutdown pins for left & right sensors!
         expander_data = (cur_io_val.bytes[1] << 8) + cur_io_val.bytes[0];
-        stmpe1600_exp0.write_16bit_reg(GPSR, &expander_data);
+        stmpe1600_exp0->write_16bit_reg(GPSR, &expander_data);
         cur_io_val.bytes[3] |= 0x80; // ensure highest bit is high, as this is xshutdown pin on central sensor!
         expander_data = (cur_io_val.bytes[3] << 8) + cur_io_val.bytes[2];
-        stmpe1600_exp1.write_16bit_reg(GPSR, &expander_data);
+        stmpe1600_exp1->write_16bit_reg(GPSR, &expander_data);
 
     }
 
@@ -398,8 +398,8 @@
         uint16_t expander_data;
 
         expander_data = 0x7F + (0x7F << 7);
-        stmpe1600_exp0.write_16bit_reg(GPSR, &expander_data);
-        stmpe1600_exp1.write_16bit_reg(GPSR, &expander_data);
+        stmpe1600_exp0->write_16bit_reg(GPSR, &expander_data);
+        stmpe1600_exp1->write_16bit_reg(GPSR, &expander_data);
     }
 
 };
--- a/Components/STMPE1600/stmpe1600_class.h	Mon Aug 07 14:30:21 2017 +0000
+++ b/Components/STMPE1600/stmpe1600_class.h	Tue Aug 08 14:41:03 2017 +0000
@@ -103,18 +103,18 @@
      * @param[in] lvl the default ot pin level
      */
     Stmpe1600DigiOut(DevI2C &i2c, ExpGpioPinName out_pin_name, uint8_t dev_addr = STMPE1600_DEF_DEVICE_ADDRESS,
-                     bool lvl = STMPE1600_DEF_DIGIOUT_LVL) : dev_i2c(i2c), exp_dev_addr(dev_addr), exp_pin_name(out_pin_name)
+                     bool lvl = STMPE1600_DEF_DIGIOUT_LVL) : dev_i2c(&i2c), exp_dev_addr(dev_addr), exp_pin_name(out_pin_name)
     {
         uint8_t data[2];
 
         if (exp_pin_name == NOT_CON)
             return;
         /* set the exp_pin_name as output */
-        dev_i2c.i2c_read(data, exp_dev_addr, GPDR_0_7, 1);
-        dev_i2c.i2c_read(&data[1], exp_dev_addr, GPDR_8_15, 1);
-        * (uint16_t *) data = * (uint16_t *) data | (1 << (uint16_t) exp_pin_name);         // set gpio as out
-        dev_i2c.i2c_write(data, exp_dev_addr, GPDR_0_7, 1);
-        dev_i2c.i2c_write(&data[1], exp_dev_addr, GPDR_8_15, 1);
+        dev_i2c->i2c_read(data, exp_dev_addr, GPDR_0_7, 1);
+        dev_i2c->i2c_read(&data[1], exp_dev_addr, GPDR_8_15, 1);
+        *(uint16_t *)data = *(uint16_t *)data | (1 << (uint16_t)exp_pin_name);         // set gpio as out
+        dev_i2c->i2c_write(data, exp_dev_addr, GPDR_0_7, 1);
+        dev_i2c->i2c_write(&data[1], exp_dev_addr, GPDR_8_15, 1);
         write(lvl);
     }
 
@@ -130,11 +130,11 @@
         if (exp_pin_name == NOT_CON)
             return;
         /* set the exp_pin_name state to lvl */
-        dev_i2c.i2c_read(data, exp_dev_addr, GPSR_0_7, 2);
-        * (uint16_t *) data = * (uint16_t *) data & (uint16_t)(~(1 << (uint16_t) exp_pin_name));               // set pin mask
+        dev_i2c->i2c_read(data, exp_dev_addr, GPSR_0_7, 2);
+        *(uint16_t *)data = *(uint16_t *)data & (uint16_t)(~(1 << (uint16_t)exp_pin_name));               // set pin mask
         if (lvl)
-            * (uint16_t *) data = * (uint16_t *) data | (uint16_t)(1 << (uint16_t) exp_pin_name);
-        dev_i2c.i2c_write(data, exp_dev_addr, GPSR_0_7, 2);
+            *(uint16_t *)data = *(uint16_t *)data | (uint16_t)(1 << (uint16_t)exp_pin_name);
+        dev_i2c->i2c_write(data, exp_dev_addr, GPSR_0_7, 2);
     }
 
     /**
@@ -147,7 +147,7 @@
     }
 
 private:
-    DevI2C &dev_i2c;
+    DevI2C *dev_i2c;
     uint8_t exp_dev_addr;
     ExpGpioPinName exp_pin_name;
 };
@@ -164,7 +164,7 @@
     * @param[in] DevAddr the stmpe1600 I2C device addres (deft STMPE1600_DEF_DEVICE_ADDRESS)
     */
     Stmpe1600DigiIn(DevI2C &i2c, ExpGpioPinName in_pin_name,
-                    uint8_t dev_addr = STMPE1600_DEF_DEVICE_ADDRESS) : dev_i2c(i2c), exp_dev_addr(dev_addr),
+                    uint8_t dev_addr = STMPE1600_DEF_DEVICE_ADDRESS) : dev_i2c(&i2c), exp_dev_addr(dev_addr),
         exp_pin_name(in_pin_name)
     {
         uint8_t data[2];
@@ -172,9 +172,9 @@
         if (exp_pin_name == NOT_CON)
             return;
         /* set the exp_pin_name as input pin direction */
-        dev_i2c.i2c_read(data, exp_dev_addr, GPDR_0_7, 2);
-        * (uint16_t *) data = * (uint16_t *) data & (uint16_t)(~(1 << (uint16_t) exp_pin_name));               // set gpio as in
-        dev_i2c.i2c_write(data, exp_dev_addr, GPDR_0_7, 2);
+        dev_i2c->i2c_read(data, exp_dev_addr, GPDR_0_7, 2);
+        *(uint16_t *)data = *(uint16_t *)data & (uint16_t)(~(1 << (uint16_t)exp_pin_name));               // set gpio as in
+        dev_i2c->i2c_write(data, exp_dev_addr, GPDR_0_7, 2);
     }
 
     /**
@@ -188,8 +188,8 @@
         if (exp_pin_name == NOT_CON)
             return false;
         /* read the exp_pin_name */
-        dev_i2c.i2c_read(data, exp_dev_addr, GPMR_0_7, 2);
-        * (uint16_t *) data = * (uint16_t *) data & (uint16_t)(1 << (uint16_t) exp_pin_name);            // mask the in gpio
+        dev_i2c->i2c_read(data, exp_dev_addr, GPMR_0_7, 2);
+        *(uint16_t *)data = *(uint16_t *)data & (uint16_t)(1 << (uint16_t)exp_pin_name);            // mask the in gpio
         if (data[0] || data[1])
             return true;
         return false;
@@ -201,7 +201,7 @@
     }
 
 private:
-    DevI2C &dev_i2c;
+    DevI2C *dev_i2c;
     uint8_t exp_dev_addr;
     ExpGpioPinName exp_pin_name;
 };
@@ -217,9 +217,8 @@
     * @param[in] &i2c device I2C to be used for communication
     * @param[in] DevAddr the stmpe1600 I2C device addres (deft STMPE1600_DEF_DEVICE_ADDRESS)
     */
-    Stmpe1600(DevI2C &i2c, uint8_t dev_addr = STMPE1600_DEF_DEVICE_ADDRESS) : dev_i2c(i2c)
+    Stmpe1600(DevI2C &i2c, uint8_t dev_addr = STMPE1600_DEF_DEVICE_ADDRESS) : dev_i2c(&i2c)
     {
-        dev_i2c = i2c;
         exp_dev_addr = dev_addr;
         write_sys_ctrl(SOFT_RESET);
 
@@ -235,7 +234,7 @@
      */
     void write_sys_ctrl(uint8_t data)      // data = SOFT_RESET reset the device
     {
-        dev_i2c.i2c_write(&data, exp_dev_addr, SYS_CTRL, 1);
+        dev_i2c->i2c_write(&data, exp_dev_addr, SYS_CTRL, 1);
     }
 
     /**
@@ -306,7 +305,7 @@
      */
     void read_16bit_reg(uint8_t reg16_addr, uint16_t *reg16_data)
     {
-        dev_i2c.i2c_read((uint8_t *) reg16_data, exp_dev_addr, reg16_addr, 2);
+        dev_i2c->i2c_read((uint8_t *) reg16_data, exp_dev_addr, reg16_addr, 2);
     }
 
     /**
@@ -316,11 +315,11 @@
      */
     void write_16bit_reg(uint8_t reg16_addr, uint16_t *reg16_data)
     {
-        dev_i2c.i2c_write((uint8_t *) reg16_data, exp_dev_addr, reg16_addr, 2);
+        dev_i2c->i2c_write((uint8_t *) reg16_data, exp_dev_addr, reg16_addr, 2);
     }
 
 private:
-    DevI2C &dev_i2c;
+    DevI2C *dev_i2c;
     uint16_t gpdr0_15;  // local copy of bit direction reg
     uint16_t gpsr0_15;  // local copy of bit status reg
     uint8_t exp_dev_addr; // expander device i2c addr
--- a/Components/VL53L0X/vl53l0x_class.cpp	Mon Aug 07 14:30:21 2017 +0000
+++ b/Components/VL53L0X/vl53l0x_class.cpp	Tue Aug 08 14:41:03 2017 +0000
@@ -5035,7 +5035,7 @@
 {
     int ret;
 
-    ret = dev_i2c.i2c_write(p_data, DeviceAddr, RegisterAddr, NumByteToWrite);
+    ret = dev_i2c->i2c_write(p_data, DeviceAddr, RegisterAddr, NumByteToWrite);
 
     if (ret)
         return -1;
@@ -5047,7 +5047,7 @@
 {
     int ret;
 
-    ret = dev_i2c.i2c_read(p_data, DeviceAddr, RegisterAddr, NumByteToRead);
+    ret = dev_i2c->i2c_read(p_data, DeviceAddr, RegisterAddr, NumByteToRead);
 
     if (ret)
         return -1;
--- a/Components/VL53L0X/vl53l0x_class.h	Mon Aug 07 14:30:21 2017 +0000
+++ b/Components/VL53L0X/vl53l0x_class.h	Tue Aug 08 14:41:03 2017 +0000
@@ -301,7 +301,7 @@
      * @param[in] &pin_gpio1 pin Mbed InterruptIn PinName to be used as component GPIO_1 INT
      * @param[in] dev_addr device address, 0x29 by default
      */
-    VL53L0X(DevI2C &i2c, DigitalOut &pin, PinName pin_gpio1, uint8_t dev_addr = DEFAULT_DEVICE_ADDRESS) : dev_i2c(i2c),
+    VL53L0X(DevI2C &i2c, DigitalOut &pin, PinName pin_gpio1, uint8_t dev_addr = DEFAULT_DEVICE_ADDRESS) : dev_i2c(&i2c),
         gpio0(&pin)
     {
         _my_device.I2cDevAddr = dev_addr;
@@ -323,7 +323,7 @@
      * @param[in] device address, 0x29 by default
      */
     VL53L0X(DevI2C &i2c, Stmpe1600DigiOut &pin, PinName pin_gpio1,
-            uint8_t dev_addr = DEFAULT_DEVICE_ADDRESS) : dev_i2c(i2c), expgpio0(&pin)
+            uint8_t dev_addr = DEFAULT_DEVICE_ADDRESS) : dev_i2c(&i2c), expgpio0(&pin)
     {
         _my_device.I2cDevAddr = dev_addr;
         _my_device.comms_type = 1; // VL53L0X_COMMS_I2C
@@ -2737,7 +2737,7 @@
     VL53L0X_DeviceInfo_t _device_info;
 
     /* IO Device */
-    DevI2C &dev_i2c;
+    DevI2C *dev_i2c;
     /* Digital out pin */
     DigitalOut *gpio0;
     /* GPIO expander */
--- a/X_NUCLEO_COMMON.lib	Mon Aug 07 14:30:21 2017 +0000
+++ b/X_NUCLEO_COMMON.lib	Tue Aug 08 14:41:03 2017 +0000
@@ -1,1 +1,1 @@
-https://developer.mbed.org/teams/ST/code/X_NUCLEO_COMMON/#0dbcdb8dab03
+https://developer.mbed.org/teams/ST/code/X_NUCLEO_COMMON/#21096473f63e