ST / X_NUCLEO_6180XA1

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:
davide.aliprandi@st.com
Date:
Mon Mar 13 17:57:03 2017 +0100
Revision:
56:37d1736bd896
Aligning to ARM mbed coding style.

Who changed what in which revision?

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