Library to handle the X-NUCLEO-6180XA1 Proximity and ambient light sensor expansion board based on VL6180X.

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Dependents:   HelloWorld_6180XA1 SunTracker_BLE Servo_6180XA1 BLE_HR_Light ... more

Fork of X_NUCLEO_6180XA1 by ST Expansion SW Team

X-NUCLEO-6180XA1 Proximity and Ambient Light Sensor Expansion Board Firmware Package

Introduction

This firmware package includes Components Device Drivers and Board Support Package for STMicroelectronics' X-NUCLEO-6180XA1 Proximity and ambient light sensor expansion board based on VL6180X.

Firmware Library

Class X_NUCLEO_6180XA1 is intended to represent the Proximity and ambient light sensor expansion board with the same name.

The expansion board is providing the support of the following components:

  1. on-board VL6180X proximity and ambient light sensor,
  2. up to three additional VL6180X Satellites,
  3. on-board 4-digit display

It is intentionally implemented as a singleton because only one X-NUCLEO-VL6180XA1 at a time might be deployed 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_6180XA1 *6180X_expansion_board = X_NUCLEO_6180XA1::Instance();

Arduino Connector Compatibility Warning

Using the X-NUCLEO-6180XA1 expansion board with the NUCLEO-F429ZI requires adopting the following patch:

  • to remove R46 resistor connected to A3 pin;
  • to solder R47 resistor connected to A5 pin.

Alternatively, you can route the Nucleo board’s A5 pin directly to the expansion board’s A3 pin with a wire. In case you patch your expansion board or route the pin, the interrupt signal for the front sensor will be driven on A5 pin rather than on A3 pin.


Example Applications

Committer:
nikapov
Date:
Mon Aug 21 15:44:34 2017 +0000
Revision:
58:1e9a3a46f814
Parent:
57:fa4c622b04a7
Make compatible with non-copyable version of I2C.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Davidroid 57:fa4c622b04a7 1 /**
Davidroid 57:fa4c622b04a7 2 ******************************************************************************
Davidroid 57:fa4c622b04a7 3 * @file STMPE1600.h
Davidroid 57:fa4c622b04a7 4 * @author AST / EST
Davidroid 57:fa4c622b04a7 5 * @version V0.0.1
Davidroid 57:fa4c622b04a7 6 * @date 14-April-2015
Davidroid 57:fa4c622b04a7 7 * @brief Header file for component stmpe1600
Davidroid 57:fa4c622b04a7 8 ******************************************************************************
Davidroid 57:fa4c622b04a7 9 * @attention
Davidroid 57:fa4c622b04a7 10 *
Davidroid 57:fa4c622b04a7 11 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
Davidroid 57:fa4c622b04a7 12 *
Davidroid 57:fa4c622b04a7 13 * Redistribution and use in source and binary forms, with or without modification,
Davidroid 57:fa4c622b04a7 14 * are permitted provided that the following conditions are met:
Davidroid 57:fa4c622b04a7 15 * 1. Redistributions of source code must retain the above copyright notice,
Davidroid 57:fa4c622b04a7 16 * this list of conditions and the following disclaimer.
Davidroid 57:fa4c622b04a7 17 * 2. Redistributions in binary form must reproduce the above copyright notice,
Davidroid 57:fa4c622b04a7 18 * this list of conditions and the following disclaimer in the documentation
Davidroid 57:fa4c622b04a7 19 * and/or other materials provided with the distribution.
Davidroid 57:fa4c622b04a7 20 * 3. Neither the name of STMicroelectronics nor the names of its contributors
Davidroid 57:fa4c622b04a7 21 * may be used to endorse or promote products derived from this software
Davidroid 57:fa4c622b04a7 22 * without specific prior written permission.
Davidroid 57:fa4c622b04a7 23 *
Davidroid 57:fa4c622b04a7 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Davidroid 57:fa4c622b04a7 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Davidroid 57:fa4c622b04a7 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Davidroid 57:fa4c622b04a7 27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
Davidroid 57:fa4c622b04a7 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Davidroid 57:fa4c622b04a7 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
Davidroid 57:fa4c622b04a7 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
Davidroid 57:fa4c622b04a7 31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
Davidroid 57:fa4c622b04a7 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Davidroid 57:fa4c622b04a7 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Davidroid 57:fa4c622b04a7 34 *
Davidroid 57:fa4c622b04a7 35 ******************************************************************************
Davidroid 57:fa4c622b04a7 36 */
Davidroid 57:fa4c622b04a7 37 #ifndef __STMPE1600_CLASS
Davidroid 57:fa4c622b04a7 38 #define __STMPE1600_CLASS
Davidroid 57:fa4c622b04a7 39 /* Includes ------------------------------------------------------------------*/
Davidroid 57:fa4c622b04a7 40 #include "DevI2C.h"
Davidroid 57:fa4c622b04a7 41
Davidroid 57:fa4c622b04a7 42 #define STMPE1600_DEF_DEVICE_ADDRESS (uint8_t)0x42*2
Davidroid 57:fa4c622b04a7 43 #define STMPE1600_DEF_DIGIOUT_LVL 1
Davidroid 57:fa4c622b04a7 44
Davidroid 57:fa4c622b04a7 45 /** STMPE1600 registr map **/
Davidroid 57:fa4c622b04a7 46 #define ChipID_0_7 (uint8_t)0x00
Davidroid 57:fa4c622b04a7 47 #define ChipID_8_15 (uint8_t)0x01
Davidroid 57:fa4c622b04a7 48 #define VersionId (uint8_t)0x02
Davidroid 57:fa4c622b04a7 49 #define SYS_CTRL (uint8_t)0x03
Davidroid 57:fa4c622b04a7 50 #define IEGPIOR_0_7 (uint8_t)0x08
Davidroid 57:fa4c622b04a7 51 #define IEGPIOR_8_15 (uint8_t)0x09
Davidroid 57:fa4c622b04a7 52 #define ISGPIOR_0_7 (uint8_t)0x0A
Davidroid 57:fa4c622b04a7 53 #define ISGPIOR_8_15 (uint8_t)0x0B
Davidroid 57:fa4c622b04a7 54 #define GPMR_0_7 (uint8_t)0x10
Davidroid 57:fa4c622b04a7 55 #define GPMR_8_15 (uint8_t)0x11
Davidroid 57:fa4c622b04a7 56 #define GPSR_0_7 (uint8_t)0x12
Davidroid 57:fa4c622b04a7 57 #define GPSR_8_15 (uint8_t)0x13
Davidroid 57:fa4c622b04a7 58 #define GPDR_0_7 (uint8_t)0x14
Davidroid 57:fa4c622b04a7 59 #define GPDR_8_15 (uint8_t)0x15
Davidroid 57:fa4c622b04a7 60 #define GPIR_0_7 (uint8_t)0x16
Davidroid 57:fa4c622b04a7 61 #define GPIR_8_15 (uint8_t)0x17
Davidroid 57:fa4c622b04a7 62
Davidroid 57:fa4c622b04a7 63 #define SOFT_RESET (uint8_t)0x80
Davidroid 57:fa4c622b04a7 64
Davidroid 57:fa4c622b04a7 65 typedef enum {
Davidroid 57:fa4c622b04a7 66 // GPIO Expander pin names
Davidroid 57:fa4c622b04a7 67 GPIO_0=0,
Davidroid 57:fa4c622b04a7 68 GPIO_1,
Davidroid 57:fa4c622b04a7 69 GPIO_2,
Davidroid 57:fa4c622b04a7 70 GPIO_3,
Davidroid 57:fa4c622b04a7 71 GPIO_4,
Davidroid 57:fa4c622b04a7 72 GPIO_5,
Davidroid 57:fa4c622b04a7 73 GPIO_6,
Davidroid 57:fa4c622b04a7 74 GPIO_7,
Davidroid 57:fa4c622b04a7 75 GPIO_8,
Davidroid 57:fa4c622b04a7 76 GPIO_9,
Davidroid 57:fa4c622b04a7 77 GPIO_10,
Davidroid 57:fa4c622b04a7 78 GPIO_11,
Davidroid 57:fa4c622b04a7 79 GPIO_12,
Davidroid 57:fa4c622b04a7 80 GPIO_13,
Davidroid 57:fa4c622b04a7 81 GPIO_14,
Davidroid 57:fa4c622b04a7 82 GPIO_15,
Davidroid 57:fa4c622b04a7 83 NOT_CON
Davidroid 57:fa4c622b04a7 84 } exp_gpio_pin_name;
Davidroid 57:fa4c622b04a7 85
Davidroid 57:fa4c622b04a7 86 typedef enum {
Davidroid 57:fa4c622b04a7 87 INPUT = 0,
Davidroid 57:fa4c622b04a7 88 OUTPUT,
Davidroid 57:fa4c622b04a7 89 NOT_CONNECTED
Davidroid 57:fa4c622b04a7 90 } exp_gpio_pin_direction;
Davidroid 57:fa4c622b04a7 91
Davidroid 57:fa4c622b04a7 92
Davidroid 57:fa4c622b04a7 93 /* Classes -------------------------------------------------------------------*/
Davidroid 57:fa4c622b04a7 94
Davidroid 57:fa4c622b04a7 95 /**
Davidroid 57:fa4c622b04a7 96 * Class representing a single stmpe1600 GPIO expander output pin
Davidroid 57:fa4c622b04a7 97 */
Davidroid 57:fa4c622b04a7 98 class STMPE1600DigiOut {
Davidroid 57:fa4c622b04a7 99 public:
Davidroid 57:fa4c622b04a7 100 /** Constructor
Davidroid 57:fa4c622b04a7 101 * @param[in] &i2c device I2C to be used for communication
Davidroid 57:fa4c622b04a7 102 * @param[in] outpinname the desired out pin name to be created
Davidroid 57:fa4c622b04a7 103 * @param[in] DevAddr the stmpe1600 I2C device addres (deft STMPE1600_DEF_DEVICE_ADDRESS)
Davidroid 57:fa4c622b04a7 104 * @param[in] lvl the default ot pin level
Davidroid 57:fa4c622b04a7 105 */
Davidroid 57:fa4c622b04a7 106 STMPE1600DigiOut (DevI2C &i2c, exp_gpio_pin_name outpinname, uint8_t DevAddr=STMPE1600_DEF_DEVICE_ADDRESS, bool lvl=STMPE1600_DEF_DIGIOUT_LVL):
nikapov 58:1e9a3a46f814 107 _dev_i2c(&i2c),
Davidroid 57:fa4c622b04a7 108 _expdevaddr(DevAddr),
Davidroid 57:fa4c622b04a7 109 _exppinname(outpinname)
Davidroid 57:fa4c622b04a7 110 {
Davidroid 57:fa4c622b04a7 111 uint8_t data[2];
Davidroid 57:fa4c622b04a7 112 if (_exppinname == NOT_CON) {
Davidroid 57:fa4c622b04a7 113 return;
Davidroid 57:fa4c622b04a7 114 }
Davidroid 57:fa4c622b04a7 115 /* set the _exppinname as output */
nikapov 58:1e9a3a46f814 116 _dev_i2c->i2c_read(data, _expdevaddr, GPDR_0_7, 1);
nikapov 58:1e9a3a46f814 117 _dev_i2c->i2c_read(&data[1], _expdevaddr, GPDR_8_15, 1);
Davidroid 57:fa4c622b04a7 118 *(uint16_t*)data = *(uint16_t*)data | (1<<(uint16_t)_exppinname); // set gpio as out
nikapov 58:1e9a3a46f814 119 _dev_i2c->i2c_write(data, _expdevaddr, GPDR_0_7, 1);
nikapov 58:1e9a3a46f814 120 _dev_i2c->i2c_write(&data[1], _expdevaddr, GPDR_8_15, 1);
Davidroid 57:fa4c622b04a7 121 write (lvl);
Davidroid 57:fa4c622b04a7 122 }
Davidroid 57:fa4c622b04a7 123
Davidroid 57:fa4c622b04a7 124 /**
Davidroid 57:fa4c622b04a7 125 * @brief Write on the out pin
Davidroid 57:fa4c622b04a7 126 * @param[in] lvl level to write
Davidroid 57:fa4c622b04a7 127 * @return 0 on Success
Davidroid 57:fa4c622b04a7 128 */
Davidroid 57:fa4c622b04a7 129 void write (int lvl)
Davidroid 57:fa4c622b04a7 130 {
Davidroid 57:fa4c622b04a7 131 uint8_t data[2];
Davidroid 57:fa4c622b04a7 132 if (_exppinname == NOT_CON) return;
Davidroid 57:fa4c622b04a7 133 /* set the _exppinname state to lvl */
nikapov 58:1e9a3a46f814 134 _dev_i2c->i2c_read(data, _expdevaddr, GPSR_0_7, 2);
Davidroid 57:fa4c622b04a7 135 *(uint16_t*)data = *(uint16_t*)data & (uint16_t)(~(1<<(uint16_t)_exppinname)); // set pin mask
Davidroid 57:fa4c622b04a7 136 if (lvl) *(uint16_t*)data = *(uint16_t*)data | (uint16_t)(1<<(uint16_t)_exppinname);
nikapov 58:1e9a3a46f814 137 _dev_i2c->i2c_write(data, _expdevaddr, GPSR_0_7, 2);
Davidroid 57:fa4c622b04a7 138 }
Davidroid 57:fa4c622b04a7 139
Davidroid 57:fa4c622b04a7 140 /**
Davidroid 57:fa4c622b04a7 141 * @brief Overload assignement operator
Davidroid 57:fa4c622b04a7 142 */
Davidroid 57:fa4c622b04a7 143 STMPE1600DigiOut& operator=(int lvl)
Davidroid 57:fa4c622b04a7 144 {
Davidroid 57:fa4c622b04a7 145 write (lvl);
Davidroid 57:fa4c622b04a7 146 return *this;
Davidroid 57:fa4c622b04a7 147 }
Davidroid 57:fa4c622b04a7 148
Davidroid 57:fa4c622b04a7 149 private:
nikapov 58:1e9a3a46f814 150 DevI2C *_dev_i2c;
Davidroid 57:fa4c622b04a7 151 uint8_t _expdevaddr;
Davidroid 57:fa4c622b04a7 152 exp_gpio_pin_name _exppinname;
Davidroid 57:fa4c622b04a7 153 };
Davidroid 57:fa4c622b04a7 154
Davidroid 57:fa4c622b04a7 155 /* Classes -------------------------------------------------------------------*/
Davidroid 57:fa4c622b04a7 156 /** Class representing a single stmpe1600 GPIO expander input pin
Davidroid 57:fa4c622b04a7 157 */
Davidroid 57:fa4c622b04a7 158 class STMPE1600DigiIn
Davidroid 57:fa4c622b04a7 159 {
Davidroid 57:fa4c622b04a7 160 public:
Davidroid 57:fa4c622b04a7 161 /** Constructor
Davidroid 57:fa4c622b04a7 162 * @param[in] &i2c device I2C to be used for communication
Davidroid 57:fa4c622b04a7 163 * @param[in] inpinname the desired input pin name to be created
Davidroid 57:fa4c622b04a7 164 * @param[in] DevAddr the stmpe1600 I2C device addres (deft STMPE1600_DEF_DEVICE_ADDRESS)
Davidroid 57:fa4c622b04a7 165 */
nikapov 58:1e9a3a46f814 166 STMPE1600DigiIn (DevI2C &i2c, exp_gpio_pin_name inpinname, uint8_t DevAddr=STMPE1600_DEF_DEVICE_ADDRESS): _dev_i2c(&i2c), _expdevaddr(DevAddr), _exppinname(inpinname)
Davidroid 57:fa4c622b04a7 167 {
Davidroid 57:fa4c622b04a7 168 uint8_t data[2];
Davidroid 57:fa4c622b04a7 169 if (_exppinname == NOT_CON) return;
Davidroid 57:fa4c622b04a7 170 /* set the _exppinname as input pin direction */
nikapov 58:1e9a3a46f814 171 _dev_i2c->i2c_read(data, _expdevaddr, GPDR_0_7, 2);
Davidroid 57:fa4c622b04a7 172 *(uint16_t*)data = *(uint16_t*)data & (uint16_t)(~(1<<(uint16_t) _exppinname)); // set gpio as in
nikapov 58:1e9a3a46f814 173 _dev_i2c->i2c_write(data, _expdevaddr, GPDR_0_7, 2);
Davidroid 57:fa4c622b04a7 174 }
Davidroid 57:fa4c622b04a7 175
Davidroid 57:fa4c622b04a7 176 /**
Davidroid 57:fa4c622b04a7 177 * @brief Read the input pin
Davidroid 57:fa4c622b04a7 178 * @return The pin logical state 0 or 1
Davidroid 57:fa4c622b04a7 179 */
Davidroid 57:fa4c622b04a7 180 bool read () {
Davidroid 57:fa4c622b04a7 181 uint8_t data[2];
Davidroid 57:fa4c622b04a7 182 if (_exppinname == NOT_CON) {
Davidroid 57:fa4c622b04a7 183 return 0;
Davidroid 57:fa4c622b04a7 184 }
Davidroid 57:fa4c622b04a7 185
Davidroid 57:fa4c622b04a7 186 /* read the _exppinname */
nikapov 58:1e9a3a46f814 187 _dev_i2c->i2c_read(data, _expdevaddr, GPMR_0_7, 2);
Davidroid 57:fa4c622b04a7 188 *(uint16_t*)data = *(uint16_t*)data & (uint16_t)(1<<(uint16_t)_exppinname); // mask the in gpio
Davidroid 57:fa4c622b04a7 189
Davidroid 57:fa4c622b04a7 190 if (data[0] || data[1]) {
Davidroid 57:fa4c622b04a7 191 return 1;
Davidroid 57:fa4c622b04a7 192 }
Davidroid 57:fa4c622b04a7 193 return 0;
Davidroid 57:fa4c622b04a7 194 }
Davidroid 57:fa4c622b04a7 195
Davidroid 57:fa4c622b04a7 196 operator int() {
Davidroid 57:fa4c622b04a7 197 return read();
Davidroid 57:fa4c622b04a7 198 }
Davidroid 57:fa4c622b04a7 199
Davidroid 57:fa4c622b04a7 200 private:
nikapov 58:1e9a3a46f814 201 DevI2C *_dev_i2c;
Davidroid 57:fa4c622b04a7 202 uint8_t _expdevaddr;
Davidroid 57:fa4c622b04a7 203 exp_gpio_pin_name _exppinname;
Davidroid 57:fa4c622b04a7 204 };
Davidroid 57:fa4c622b04a7 205
Davidroid 57:fa4c622b04a7 206
Davidroid 57:fa4c622b04a7 207 /* Classes -------------------------------------------------------------------*/
Davidroid 57:fa4c622b04a7 208
Davidroid 57:fa4c622b04a7 209 /**
Davidroid 57:fa4c622b04a7 210 * Class representing a whole stmpe1600 component (16 gpio)
Davidroid 57:fa4c622b04a7 211 */
Davidroid 57:fa4c622b04a7 212 class STMPE1600 {
Davidroid 57:fa4c622b04a7 213 public:
Davidroid 57:fa4c622b04a7 214 /** Constructor
Davidroid 57:fa4c622b04a7 215 * @param[in] &i2c device I2C to be used for communication
Davidroid 57:fa4c622b04a7 216 * @param[in] DevAddr the stmpe1600 I2C device addres (deft STMPE1600_DEF_DEVICE_ADDRESS)
Davidroid 57:fa4c622b04a7 217 */
nikapov 58:1e9a3a46f814 218 STMPE1600 (DevI2C &i2c, uint8_t DevAddr=STMPE1600_DEF_DEVICE_ADDRESS ) : _dev_i2c(&i2c)
Davidroid 57:fa4c622b04a7 219 {
nikapov 58:1e9a3a46f814 220 _dev_i2c = &i2c;
Davidroid 57:fa4c622b04a7 221 _expdevaddr = DevAddr;
Davidroid 57:fa4c622b04a7 222 write_sys_ctrl (SOFT_RESET);
Davidroid 57:fa4c622b04a7 223
Davidroid 57:fa4c622b04a7 224 _gpdro_15 = (uint16_t)0; // gpio dir all IN
Davidroid 57:fa4c622b04a7 225 write_16_bit_reg (GPDR_0_7, &_gpdro_15);
Davidroid 57:fa4c622b04a7 226 _gpsro_15 = (uint16_t)0x0ffff; // gpio status all 1
Davidroid 57:fa4c622b04a7 227 write_16_bit_reg (GPSR_0_7, &_gpsro_15);
Davidroid 57:fa4c622b04a7 228 }
Davidroid 57:fa4c622b04a7 229
Davidroid 57:fa4c622b04a7 230 /**
Davidroid 57:fa4c622b04a7 231 * @brief Write the SYS_CTRL register
Davidroid 57:fa4c622b04a7 232 * @param[in] Data to be written (bit fields)
Davidroid 57:fa4c622b04a7 233 */
Davidroid 57:fa4c622b04a7 234 void write_sys_ctrl (uint8_t data) // data = SOFT_RESET reset the device
Davidroid 57:fa4c622b04a7 235 {
nikapov 58:1e9a3a46f814 236 _dev_i2c->i2c_write((uint8_t*)SYS_CTRL, _expdevaddr, data, 1);
Davidroid 57:fa4c622b04a7 237 }
Davidroid 57:fa4c622b04a7 238
Davidroid 57:fa4c622b04a7 239 /**
Davidroid 57:fa4c622b04a7 240 * @brief Set the out pin
Davidroid 57:fa4c622b04a7 241 * @param[in] The pin name
Davidroid 57:fa4c622b04a7 242 * @return 0 on Success
Davidroid 57:fa4c622b04a7 243 */
Davidroid 57:fa4c622b04a7 244 bool set_gpio (exp_gpio_pin_name pin_name)
Davidroid 57:fa4c622b04a7 245 {
Davidroid 57:fa4c622b04a7 246 if (pin_name == NOT_CON) return true;
Davidroid 57:fa4c622b04a7 247 _gpsro_15 = _gpsro_15 | ((uint16_t)0x0001<<pin_name);
Davidroid 57:fa4c622b04a7 248 write_16_bit_reg (GPSR_0_7 , &_gpsro_15);
Davidroid 57:fa4c622b04a7 249 return false;
Davidroid 57:fa4c622b04a7 250 }
Davidroid 57:fa4c622b04a7 251
Davidroid 57:fa4c622b04a7 252 /**
Davidroid 57:fa4c622b04a7 253 * @brief Clear the out pin
Davidroid 57:fa4c622b04a7 254 * @param[in] The pin name
Davidroid 57:fa4c622b04a7 255 * @return 0 on Success
Davidroid 57:fa4c622b04a7 256 */
Davidroid 57:fa4c622b04a7 257 bool clr_gpio (exp_gpio_pin_name pin_name)
Davidroid 57:fa4c622b04a7 258 {
Davidroid 57:fa4c622b04a7 259 if (pin_name == NOT_CON) return true;
Davidroid 57:fa4c622b04a7 260 _gpsro_15 = _gpsro_15 & (~((uint16_t)0x0001<<pin_name));
Davidroid 57:fa4c622b04a7 261 write_16_bit_reg (GPSR_0_7 , &_gpsro_15);
Davidroid 57:fa4c622b04a7 262 return false;
Davidroid 57:fa4c622b04a7 263 }
Davidroid 57:fa4c622b04a7 264
Davidroid 57:fa4c622b04a7 265 /**
Davidroid 57:fa4c622b04a7 266 * @brief Read the input pin
Davidroid 57:fa4c622b04a7 267 * @param[in] The pin name
Davidroid 57:fa4c622b04a7 268 * @return The logical pin level
Davidroid 57:fa4c622b04a7 269 */
Davidroid 57:fa4c622b04a7 270 bool rd_gpio (exp_gpio_pin_name pin_name)
Davidroid 57:fa4c622b04a7 271 {
Davidroid 57:fa4c622b04a7 272 uint16_t gpmr0_15;
Davidroid 57:fa4c622b04a7 273 if (pin_name == NOT_CON) return true;
Davidroid 57:fa4c622b04a7 274 read_16_bit_reg (GPMR_0_7, &gpmr0_15);
Davidroid 57:fa4c622b04a7 275 gpmr0_15 = gpmr0_15 & ((uint16_t)0x0001<<pin_name);
Davidroid 57:fa4c622b04a7 276 if (gpmr0_15) {
Davidroid 57:fa4c622b04a7 277 return true;
Davidroid 57:fa4c622b04a7 278 }
Davidroid 57:fa4c622b04a7 279 return false;
Davidroid 57:fa4c622b04a7 280 }
Davidroid 57:fa4c622b04a7 281
Davidroid 57:fa4c622b04a7 282 /**
Davidroid 57:fa4c622b04a7 283 * @brief Set the pin direction
Davidroid 57:fa4c622b04a7 284 * @param[in] The pin name
Davidroid 57:fa4c622b04a7 285 * @param[in] The pin direction
Davidroid 57:fa4c622b04a7 286 * @return 0 on success
Davidroid 57:fa4c622b04a7 287 */
Davidroid 57:fa4c622b04a7 288 bool set_gpio_dir (exp_gpio_pin_name pin_name, exp_gpio_pin_direction pin_dir)
Davidroid 57:fa4c622b04a7 289 {
Davidroid 57:fa4c622b04a7 290 if (pin_name == NOT_CON || pin_dir == NOT_CONNECTED) {
Davidroid 57:fa4c622b04a7 291 return true;
Davidroid 57:fa4c622b04a7 292 }
Davidroid 57:fa4c622b04a7 293 _gpdro_15 = _gpdro_15 & (~((uint16_t)0x0001<<pin_name)); // clear the Pin
Davidroid 57:fa4c622b04a7 294 _gpdro_15 = _gpdro_15 | ((uint16_t)pin_dir<<pin_name);
Davidroid 57:fa4c622b04a7 295 write_16_bit_reg (GPDR_0_7 , &_gpdro_15);
Davidroid 57:fa4c622b04a7 296 return false;
Davidroid 57:fa4c622b04a7 297 }
Davidroid 57:fa4c622b04a7 298
Davidroid 57:fa4c622b04a7 299 /**
Davidroid 57:fa4c622b04a7 300 * @brief Read a 16 bits register
Davidroid 57:fa4c622b04a7 301 * @param[in] The register address
Davidroid 57:fa4c622b04a7 302 * @param[in] The pointer to the read data
Davidroid 57:fa4c622b04a7 303 */
Davidroid 57:fa4c622b04a7 304 void read_16_bit_reg (uint8_t reg_16_addr, uint16_t *reg_16_data)
Davidroid 57:fa4c622b04a7 305 {
nikapov 58:1e9a3a46f814 306 _dev_i2c->i2c_read((uint8_t*)reg_16_data, _expdevaddr, reg_16_addr, 2);
Davidroid 57:fa4c622b04a7 307 }
Davidroid 57:fa4c622b04a7 308
Davidroid 57:fa4c622b04a7 309 /**
Davidroid 57:fa4c622b04a7 310 * @brief Write a 16 bits register
Davidroid 57:fa4c622b04a7 311 * @param[in] The register address
Davidroid 57:fa4c622b04a7 312 * @param[in] The pointer to the data to be written
Davidroid 57:fa4c622b04a7 313 */
Davidroid 57:fa4c622b04a7 314 void write_16_bit_reg (uint8_t reg_16_addr, uint16_t *reg_16_data)
Davidroid 57:fa4c622b04a7 315 {
nikapov 58:1e9a3a46f814 316 _dev_i2c->i2c_write((uint8_t*)reg_16_data, _expdevaddr, reg_16_addr, 2);
Davidroid 57:fa4c622b04a7 317 }
Davidroid 57:fa4c622b04a7 318
Davidroid 57:fa4c622b04a7 319 private:
nikapov 58:1e9a3a46f814 320 DevI2C *_dev_i2c;
Davidroid 57:fa4c622b04a7 321 uint16_t _gpdro_15; // local copy of bit direction reg
Davidroid 57:fa4c622b04a7 322 uint16_t _gpsro_15; // local copy of bit status reg
Davidroid 57:fa4c622b04a7 323 uint8_t _expdevaddr; // expander device i2c addr
Davidroid 57:fa4c622b04a7 324 };
Davidroid 57:fa4c622b04a7 325
Davidroid 57:fa4c622b04a7 326 #endif // __STMPE1600_CLASS