use VL6180XA1 chip wothout X-NUCLEO-6180XA1 Board. Simple way to use the chip.
Dependents: Check_VL6180XA1_ToF
Fork of X_NUCLEO_6180XA1 by
VL6180X.h@60:972b4898a007, 2018-02-01 (annotated)
- Committer:
- kenjiArai
- Date:
- Thu Feb 01 12:05:43 2018 +0000
- Revision:
- 60:972b4898a007
- Parent:
- 59:81afbb75311d
more simple / delete DevI2C and others
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Davidroid | 57:fa4c622b04a7 | 1 | /** |
Davidroid | 57:fa4c622b04a7 | 2 | ****************************************************************************** |
Davidroid | 57:fa4c622b04a7 | 3 | * @file VL6180X.h |
Davidroid | 57:fa4c622b04a7 | 4 | * @author AST / EST |
Davidroid | 57:fa4c622b04a7 | 5 | * @version V0.0.1 |
Davidroid | 57:fa4c622b04a7 | 6 | * @date 9-November-2015 |
Davidroid | 57:fa4c622b04a7 | 7 | * @brief Header file for component VL6180X |
Davidroid | 57:fa4c622b04a7 | 8 | ****************************************************************************** |
Davidroid | 57:fa4c622b04a7 | 9 | * @attention |
Davidroid | 57:fa4c622b04a7 | 10 | * |
Davidroid | 57:fa4c622b04a7 | 11 | * <h2><center>© 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 | |
kenjiArai | 60:972b4898a007 | 38 | //------- Feburary 1st, 2018 by JH1PJL / K.Arai -------------------------------- |
kenjiArai | 60:972b4898a007 | 39 | // Change X_NUCLEO_6180XA1 library to 6180XA1_simplest library |
kenjiArai | 60:972b4898a007 | 40 | // modified -> all related files |
kenjiArai | 59:81afbb75311d | 41 | //------------------------------------------------------------------------------ |
Davidroid | 57:fa4c622b04a7 | 42 | |
Davidroid | 57:fa4c622b04a7 | 43 | #ifndef __VL6180X_CLASS_H |
Davidroid | 57:fa4c622b04a7 | 44 | #define __VL6180X_CLASS_H |
Davidroid | 57:fa4c622b04a7 | 45 | |
Davidroid | 57:fa4c622b04a7 | 46 | /* Includes ------------------------------------------------------------------*/ |
kenjiArai | 60:972b4898a007 | 47 | #include "mbed.h" |
Davidroid | 57:fa4c622b04a7 | 48 | #include "vl6180x_cfg.h" |
Davidroid | 57:fa4c622b04a7 | 49 | #include "vl6180x_def.h" |
Davidroid | 57:fa4c622b04a7 | 50 | |
Davidroid | 57:fa4c622b04a7 | 51 | /* Definitions ---------------------------------------------------------------*/ |
Davidroid | 57:fa4c622b04a7 | 52 | #define DEFAULT_DEVICE_ADDRESS 0x29 |
Davidroid | 57:fa4c622b04a7 | 53 | |
Davidroid | 57:fa4c622b04a7 | 54 | /* Types ---------------------------------------------------------------------*/ |
Davidroid | 57:fa4c622b04a7 | 55 | |
Davidroid | 57:fa4c622b04a7 | 56 | /* data struct containing range measure, light measure and type of error provided to the user |
kenjiArai | 59:81afbb75311d | 57 | in case of invalid data range_mm=0xFFFFFFFF and lux=0xFFFFFFFF */ |
kenjiArai | 59:81afbb75311d | 58 | typedef struct MeasureData { |
kenjiArai | 59:81afbb75311d | 59 | uint32_t range_mm; |
kenjiArai | 59:81afbb75311d | 60 | uint32_t lux; |
kenjiArai | 59:81afbb75311d | 61 | uint32_t range_error; |
kenjiArai | 59:81afbb75311d | 62 | uint32_t als_error; |
kenjiArai | 59:81afbb75311d | 63 | uint32_t int_error; |
Davidroid | 57:fa4c622b04a7 | 64 | } measure_data_t; |
Davidroid | 57:fa4c622b04a7 | 65 | |
kenjiArai | 59:81afbb75311d | 66 | /* sensor operating modes */ |
kenjiArai | 59:81afbb75311d | 67 | typedef enum { |
kenjiArai | 59:81afbb75311d | 68 | range_single_shot_polling=1, |
kenjiArai | 59:81afbb75311d | 69 | als_single_shot_polling, |
kenjiArai | 59:81afbb75311d | 70 | range_continuous_polling, |
kenjiArai | 59:81afbb75311d | 71 | als_continuous_polling, |
Davidroid | 57:fa4c622b04a7 | 72 | } operating_mode_t; |
Davidroid | 57:fa4c622b04a7 | 73 | |
kenjiArai | 60:972b4898a007 | 74 | struct MyVL6180Dev_t { |
kenjiArai | 60:972b4898a007 | 75 | struct VL6180XDevData_t Data; |
kenjiArai | 60:972b4898a007 | 76 | uint8_t I2cAddr; |
kenjiArai | 60:972b4898a007 | 77 | unsigned Present:1; |
kenjiArai | 60:972b4898a007 | 78 | unsigned Ready:1; |
kenjiArai | 60:972b4898a007 | 79 | }; |
kenjiArai | 60:972b4898a007 | 80 | typedef struct MyVL6180Dev_t *VL6180XDev_t; |
kenjiArai | 60:972b4898a007 | 81 | |
kenjiArai | 60:972b4898a007 | 82 | /** Interface for STMicronics VL6180X |
kenjiArai | 60:972b4898a007 | 83 | * Proximity sensor, gesture and ambient light sensing (ALS) module |
kenjiArai | 60:972b4898a007 | 84 | * |
kenjiArai | 60:972b4898a007 | 85 | * @code |
kenjiArai | 60:972b4898a007 | 86 | * #include "mbed.h" |
kenjiArai | 60:972b4898a007 | 87 | * |
kenjiArai | 60:972b4898a007 | 88 | * // I2C Communication |
kenjiArai | 60:972b4898a007 | 89 | * VL6180X sensor(I2C_SDA, I2C_SCL, D8); // SDA, SCL & Chip Enable |
kenjiArai | 60:972b4898a007 | 90 | * // If you connected I2C line not only this device but also other devices, |
kenjiArai | 60:972b4898a007 | 91 | * // you need to declare following method. |
kenjiArai | 60:972b4898a007 | 92 | * I2C i2c(I2C_SDA, I2C_SCL); |
kenjiArai | 60:972b4898a007 | 93 | * VL6180X sensor(i2c, D8); // I2C, Chip Enable |
kenjiArai | 60:972b4898a007 | 94 | * |
kenjiArai | 60:972b4898a007 | 95 | * int main() |
kenjiArai | 60:972b4898a007 | 96 | * { |
kenjiArai | 60:972b4898a007 | 97 | * uint32_t lux; |
kenjiArai | 60:972b4898a007 | 98 | * uint32_t dist; |
kenjiArai | 60:972b4898a007 | 99 | * |
kenjiArai | 60:972b4898a007 | 100 | * while (true) { |
kenjiArai | 60:972b4898a007 | 101 | * sensor.get_distance(&dist); |
kenjiArai | 60:972b4898a007 | 102 | * sensor.get_lux(&lux); |
kenjiArai | 60:972b4898a007 | 103 | * wait_ms(500); |
kenjiArai | 60:972b4898a007 | 104 | * } |
kenjiArai | 60:972b4898a007 | 105 | * } |
kenjiArai | 60:972b4898a007 | 106 | * @endcode |
kenjiArai | 60:972b4898a007 | 107 | */ |
Davidroid | 57:fa4c622b04a7 | 108 | |
Davidroid | 57:fa4c622b04a7 | 109 | /* Classes -------------------------------------------------------------------*/ |
Davidroid | 57:fa4c622b04a7 | 110 | /** |
Davidroid | 57:fa4c622b04a7 | 111 | * Class representing a VL6180X sensor component |
Davidroid | 57:fa4c622b04a7 | 112 | */ |
kenjiArai | 60:972b4898a007 | 113 | class VL6180X |
Davidroid | 57:fa4c622b04a7 | 114 | { |
Davidroid | 57:fa4c622b04a7 | 115 | public: |
kenjiArai | 60:972b4898a007 | 116 | /** Constructor 1 |
kenjiArai | 60:972b4898a007 | 117 | * @param[in] Pin for I2C SDA & SDL |
kenjiArai | 59:81afbb75311d | 118 | * @param[in] pin Mbed DigitalOut PinName to be used as component GPIO_0 CE |
kenjiArai | 59:81afbb75311d | 119 | * @param[in] DevAddr device address, 0x29 by default |
Davidroid | 57:fa4c622b04a7 | 120 | */ |
kenjiArai | 60:972b4898a007 | 121 | VL6180X(PinName p_sda, PinName p_scl,PinName ce_pin, uint8_t DevAddr=DEFAULT_DEVICE_ADDRESS) |
kenjiArai | 60:972b4898a007 | 122 | : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p), _gpio0(ce_pin) |
kenjiArai | 60:972b4898a007 | 123 | { |
kenjiArai | 59:81afbb75311d | 124 | _my_device.I2cAddr=DevAddr; |
Davidroid | 57:fa4c622b04a7 | 125 | _my_device.Present=0; |
Davidroid | 57:fa4c622b04a7 | 126 | _my_device.Ready=0; |
Davidroid | 57:fa4c622b04a7 | 127 | _device=&_my_device;; |
kenjiArai | 60:972b4898a007 | 128 | init(); |
kenjiArai | 59:81afbb75311d | 129 | } |
kenjiArai | 59:81afbb75311d | 130 | |
kenjiArai | 60:972b4898a007 | 131 | /** Constructor 2 |
kenjiArai | 60:972b4898a007 | 132 | * @param[in] &i2c device I2C to be used for communication |
kenjiArai | 60:972b4898a007 | 133 | * @param[in] pin Mbed DigitalOut PinName to be used as component GPIO_0 CE |
kenjiArai | 60:972b4898a007 | 134 | * @param[in] DevAddr device address, 0x29 by default |
kenjiArai | 59:81afbb75311d | 135 | */ |
kenjiArai | 60:972b4898a007 | 136 | VL6180X(I2C& p_i2c, PinName ce_pin, uint8_t DevAddr=DEFAULT_DEVICE_ADDRESS) |
kenjiArai | 60:972b4898a007 | 137 | : _i2c(p_i2c), _gpio0(ce_pin) |
kenjiArai | 60:972b4898a007 | 138 | { |
kenjiArai | 60:972b4898a007 | 139 | _my_device.I2cAddr=DevAddr; |
kenjiArai | 60:972b4898a007 | 140 | _my_device.Present=0; |
kenjiArai | 59:81afbb75311d | 141 | _my_device.Ready=0; |
kenjiArai | 60:972b4898a007 | 142 | _device=&_my_device;; |
kenjiArai | 60:972b4898a007 | 143 | init(); |
kenjiArai | 59:81afbb75311d | 144 | } |
kenjiArai | 59:81afbb75311d | 145 | |
kenjiArai | 59:81afbb75311d | 146 | /** |
kenjiArai | 60:972b4898a007 | 147 | * @brief Get a single distance measure result |
kenjiArai | 60:972b4898a007 | 148 | * |
kenjiArai | 60:972b4898a007 | 149 | * @par Function Description |
kenjiArai | 60:972b4898a007 | 150 | * It can be called after having initialized a component. It start a single |
kenjiArai | 60:972b4898a007 | 151 | * distance measure in polling mode and wait until the measure is finisched. |
kenjiArai | 60:972b4898a007 | 152 | * The function block until the measure is finished, it can blocks indefinitely |
kenjiArai | 60:972b4898a007 | 153 | * in case the measure never ends for any reason \n |
kenjiArai | 60:972b4898a007 | 154 | * |
kenjiArai | 60:972b4898a007 | 155 | * @param pi_data Pointer to distance |
kenjiArai | 60:972b4898a007 | 156 | * @return 0 on success |
kenjiArai | 59:81afbb75311d | 157 | */ |
kenjiArai | 60:972b4898a007 | 158 | virtual int get_distance(uint32_t *pi_data) { |
kenjiArai | 60:972b4898a007 | 159 | int status=0; |
kenjiArai | 60:972b4898a007 | 160 | status=start_measurement(range_single_shot_polling); |
kenjiArai | 60:972b4898a007 | 161 | if (!status) { |
kenjiArai | 60:972b4898a007 | 162 | VL6180X_RangeWaitDeviceReady(_device, 2000); |
kenjiArai | 60:972b4898a007 | 163 | for (status=1; status!=0; status=VL6180X_RangeGetResult(_device, pi_data)); |
kenjiArai | 59:81afbb75311d | 164 | } |
kenjiArai | 60:972b4898a007 | 165 | stop_measurement(range_single_shot_polling); |
kenjiArai | 60:972b4898a007 | 166 | VL6180X_RangeWaitDeviceReady(_device, 2000); |
kenjiArai | 60:972b4898a007 | 167 | return status; |
Davidroid | 57:fa4c622b04a7 | 168 | } |
Davidroid | 57:fa4c622b04a7 | 169 | |
kenjiArai | 59:81afbb75311d | 170 | /** |
kenjiArai | 60:972b4898a007 | 171 | * @brief Get a single light (in Lux) measure result |
kenjiArai | 60:972b4898a007 | 172 | * |
kenjiArai | 60:972b4898a007 | 173 | * @par Function Description |
kenjiArai | 60:972b4898a007 | 174 | * It can be called after having initialized a component. It start a single |
kenjiArai | 60:972b4898a007 | 175 | * light measure in polling mode and wait until the measure is finisched. |
kenjiArai | 60:972b4898a007 | 176 | * The function block until the measure is finished, it can blocks indefinitely |
kenjiArai | 60:972b4898a007 | 177 | * in case the measure never ends for any reason \n |
kenjiArai | 59:81afbb75311d | 178 | */ |
kenjiArai | 60:972b4898a007 | 179 | virtual int get_lux(uint32_t *pi_data) { |
kenjiArai | 60:972b4898a007 | 180 | int status=0; |
kenjiArai | 59:81afbb75311d | 181 | |
kenjiArai | 60:972b4898a007 | 182 | status = start_measurement(als_single_shot_polling); |
kenjiArai | 60:972b4898a007 | 183 | if (!status) { |
kenjiArai | 60:972b4898a007 | 184 | VL6180X_AlsWaitDeviceReady(_device, 2000); |
kenjiArai | 60:972b4898a007 | 185 | for (status=1; status!=0; status=VL6180X_AlsGetLux(_device, pi_data)); |
kenjiArai | 60:972b4898a007 | 186 | } |
kenjiArai | 60:972b4898a007 | 187 | stop_measurement(als_single_shot_polling); |
kenjiArai | 60:972b4898a007 | 188 | VL6180X_AlsWaitDeviceReady(_device, 2000); |
kenjiArai | 60:972b4898a007 | 189 | return status; |
Davidroid | 57:fa4c622b04a7 | 190 | } |
Davidroid | 57:fa4c622b04a7 | 191 | |
kenjiArai | 59:81afbb75311d | 192 | /** |
kenjiArai | 59:81afbb75311d | 193 | * |
kenjiArai | 59:81afbb75311d | 194 | * @brief One time device initialization |
kenjiArai | 59:81afbb75311d | 195 | * |
kenjiArai | 59:81afbb75311d | 196 | * To be called once and only once after device is brought out of reset (Chip enable) and booted see @a VL6180X_WaitDeviceBooted() |
kenjiArai | 59:81afbb75311d | 197 | * |
kenjiArai | 59:81afbb75311d | 198 | * @par Function Description |
kenjiArai | 59:81afbb75311d | 199 | * When not used after a fresh device "power up" or reset, it may return @a #CALIBRATION_WARNING |
kenjiArai | 59:81afbb75311d | 200 | * meaning wrong calibration data may have been fetched from device that can result in ranging offset error\n |
kenjiArai | 59:81afbb75311d | 201 | * If application cannot execute device reset or need to run VL6180X_InitData multiple time |
kenjiArai | 59:81afbb75311d | 202 | * then it must ensure proper offset calibration saving and restore on its own |
kenjiArai | 59:81afbb75311d | 203 | * by using @a VL6180X_GetOffsetCalibrationData() on first power up and then @a VL6180X_SetOffsetCalibrationData() all all subsequent init |
kenjiArai | 59:81afbb75311d | 204 | * |
kenjiArai | 59:81afbb75311d | 205 | * @param void |
kenjiArai | 59:81afbb75311d | 206 | * @return 0 on success, @a #CALIBRATION_WARNING if failed |
kenjiArai | 59:81afbb75311d | 207 | */ |
kenjiArai | 60:972b4898a007 | 208 | int init(void) { |
kenjiArai | 59:81afbb75311d | 209 | int status; |
kenjiArai | 59:81afbb75311d | 210 | |
kenjiArai | 60:972b4898a007 | 211 | _gpio0 = 0; |
kenjiArai | 60:972b4898a007 | 212 | for(volatile uint32_t i = 0; i < 100000; i++) { |
kenjiArai | 60:972b4898a007 | 213 | ; |
kenjiArai | 59:81afbb75311d | 214 | } |
kenjiArai | 60:972b4898a007 | 215 | _gpio0 = 1; |
kenjiArai | 60:972b4898a007 | 216 | for(volatile uint32_t i = 0; i < 100000; i++) { |
kenjiArai | 60:972b4898a007 | 217 | ; |
kenjiArai | 60:972b4898a007 | 218 | } |
kenjiArai | 60:972b4898a007 | 219 | status = VL6180X_WaitDeviceBooted(_device); |
kenjiArai | 60:972b4898a007 | 220 | status = IsPresent(); |
kenjiArai | 59:81afbb75311d | 221 | if(!status) { |
kenjiArai | 59:81afbb75311d | 222 | _device->Present=1; |
kenjiArai | 59:81afbb75311d | 223 | VL6180X_InitData(_device); |
kenjiArai | 59:81afbb75311d | 224 | if(status) { |
kenjiArai | 59:81afbb75311d | 225 | printf("Failed to init VL6180X sensor!\n\r"); |
kenjiArai | 59:81afbb75311d | 226 | return status; |
kenjiArai | 59:81afbb75311d | 227 | } |
kenjiArai | 60:972b4898a007 | 228 | //status=prepare(); |
kenjiArai | 60:972b4898a007 | 229 | status = VL6180X_Prepare(_device); |
kenjiArai | 59:81afbb75311d | 230 | if(status) { |
kenjiArai | 59:81afbb75311d | 231 | printf("Failed to prepare VL6180X!\n\r"); |
kenjiArai | 59:81afbb75311d | 232 | return status; |
kenjiArai | 59:81afbb75311d | 233 | } |
kenjiArai | 60:972b4898a007 | 234 | _device->Ready = 1; |
kenjiArai | 59:81afbb75311d | 235 | } |
kenjiArai | 59:81afbb75311d | 236 | return status; |
Davidroid | 57:fa4c622b04a7 | 237 | } |
Davidroid | 57:fa4c622b04a7 | 238 | |
kenjiArai | 60:972b4898a007 | 239 | private: |
kenjiArai | 60:972b4898a007 | 240 | static const unsigned int TEMP_BUF_SIZE = 32; |
Davidroid | 57:fa4c622b04a7 | 241 | |
kenjiArai | 59:81afbb75311d | 242 | /** |
kenjiArai | 60:972b4898a007 | 243 | * @brief Writes a buffer towards the I2C peripheral device. |
kenjiArai | 60:972b4898a007 | 244 | * @param pBuffer pointer to the byte-array data to send |
kenjiArai | 60:972b4898a007 | 245 | * @param DeviceAddr specifies the peripheral device slave address. |
kenjiArai | 60:972b4898a007 | 246 | * @param RegisterAddr specifies the internal address register |
kenjiArai | 60:972b4898a007 | 247 | * where to start writing to (must be correctly masked). |
kenjiArai | 60:972b4898a007 | 248 | * @param NumByteToWrite number of bytes to be written. |
kenjiArai | 60:972b4898a007 | 249 | * @retval 0 if ok, |
kenjiArai | 60:972b4898a007 | 250 | * @retval -1 if an I2C error has occured, or |
kenjiArai | 60:972b4898a007 | 251 | * @retval -2 on temporary buffer overflow (i.e. NumByteToWrite was too high) |
kenjiArai | 60:972b4898a007 | 252 | * @note On some devices if NumByteToWrite is greater |
kenjiArai | 60:972b4898a007 | 253 | * than one, the RegisterAddr must be masked correctly! |
kenjiArai | 59:81afbb75311d | 254 | */ |
kenjiArai | 60:972b4898a007 | 255 | int i2c_write(uint8_t* pBuffer, uint8_t DeviceAddr, uint8_t RegisterAddr, |
kenjiArai | 60:972b4898a007 | 256 | uint16_t NumByteToWrite) { |
kenjiArai | 60:972b4898a007 | 257 | int ret; |
kenjiArai | 60:972b4898a007 | 258 | uint8_t tmp[TEMP_BUF_SIZE]; |
Davidroid | 57:fa4c622b04a7 | 259 | |
kenjiArai | 60:972b4898a007 | 260 | if(NumByteToWrite >= TEMP_BUF_SIZE) return -2; |
Davidroid | 57:fa4c622b04a7 | 261 | |
kenjiArai | 60:972b4898a007 | 262 | /* First, send device address. Then, send data and STOP condition */ |
kenjiArai | 60:972b4898a007 | 263 | tmp[0] = RegisterAddr; |
kenjiArai | 60:972b4898a007 | 264 | memcpy(tmp+1, pBuffer, NumByteToWrite); |
Davidroid | 57:fa4c622b04a7 | 265 | |
kenjiArai | 60:972b4898a007 | 266 | ret = _i2c.write(DeviceAddr, (const char*)tmp, NumByteToWrite+1, false); |
Davidroid | 57:fa4c622b04a7 | 267 | |
kenjiArai | 60:972b4898a007 | 268 | if(ret) return -1; |
kenjiArai | 60:972b4898a007 | 269 | return 0; |
Davidroid | 57:fa4c622b04a7 | 270 | } |
Davidroid | 57:fa4c622b04a7 | 271 | |
kenjiArai | 59:81afbb75311d | 272 | /** |
kenjiArai | 60:972b4898a007 | 273 | * @brief Reads a buffer from the I2C peripheral device. |
kenjiArai | 60:972b4898a007 | 274 | * @param pBuffer pointer to the byte-array to read data in to |
kenjiArai | 60:972b4898a007 | 275 | * @param DeviceAddr specifies the peripheral device slave address. |
kenjiArai | 60:972b4898a007 | 276 | * @param RegisterAddr specifies the internal address register |
kenjiArai | 60:972b4898a007 | 277 | * where to start reading from (must be correctly masked). |
kenjiArai | 60:972b4898a007 | 278 | * @param NumByteToRead number of bytes to be read. |
kenjiArai | 60:972b4898a007 | 279 | * @retval 0 if ok, |
kenjiArai | 60:972b4898a007 | 280 | * @retval -1 if an I2C error has occured |
kenjiArai | 60:972b4898a007 | 281 | * @note On some devices if NumByteToWrite is greater |
kenjiArai | 60:972b4898a007 | 282 | * than one, the RegisterAddr must be masked correctly! |
kenjiArai | 59:81afbb75311d | 283 | */ |
kenjiArai | 60:972b4898a007 | 284 | int i2c_read(uint8_t* pBuffer, uint8_t DeviceAddr, uint8_t RegisterAddr, |
kenjiArai | 60:972b4898a007 | 285 | uint16_t NumByteToRead) { |
kenjiArai | 60:972b4898a007 | 286 | int ret; |
Davidroid | 57:fa4c622b04a7 | 287 | |
kenjiArai | 60:972b4898a007 | 288 | /* Send device address, with no STOP condition */ |
kenjiArai | 60:972b4898a007 | 289 | ret = _i2c.write(DeviceAddr, (const char*)&RegisterAddr, 1, true); |
kenjiArai | 60:972b4898a007 | 290 | if(!ret) { |
kenjiArai | 60:972b4898a007 | 291 | /* Read data, with STOP condition */ |
kenjiArai | 60:972b4898a007 | 292 | ret = _i2c.read(DeviceAddr, (char*)pBuffer, NumByteToRead, false); |
kenjiArai | 60:972b4898a007 | 293 | } |
kenjiArai | 59:81afbb75311d | 294 | |
kenjiArai | 60:972b4898a007 | 295 | if(ret) return -1; |
kenjiArai | 60:972b4898a007 | 296 | return 0; |
Davidroid | 57:fa4c622b04a7 | 297 | } |
Davidroid | 57:fa4c622b04a7 | 298 | |
kenjiArai | 60:972b4898a007 | 299 | int start_measurement(operating_mode_t operating_mode); |
kenjiArai | 60:972b4898a007 | 300 | int stop_measurement(operating_mode_t operating_mode); |
Davidroid | 57:fa4c622b04a7 | 301 | int VL6180X_WaitDeviceBooted(VL6180XDev_t dev); |
Davidroid | 57:fa4c622b04a7 | 302 | int VL6180X_InitData(VL6180XDev_t dev ); |
Davidroid | 57:fa4c622b04a7 | 303 | int VL6180X_Prepare(VL6180XDev_t dev); |
Davidroid | 57:fa4c622b04a7 | 304 | int VL6180X_RangeSetMaxConvergenceTime(VL6180XDev_t dev, uint8_t MaxConTime_msec); |
Davidroid | 57:fa4c622b04a7 | 305 | int VL6180X_RangeGetResult(VL6180XDev_t dev, uint32_t *pRange_mm); |
Davidroid | 57:fa4c622b04a7 | 306 | int VL6180X_AlsSetIntegrationPeriod(VL6180XDev_t dev, uint16_t period_ms); |
Davidroid | 57:fa4c622b04a7 | 307 | int VL6180X_AlsSetInterMeasurementPeriod(VL6180XDev_t dev, uint16_t intermeasurement_period_ms); |
Davidroid | 57:fa4c622b04a7 | 308 | int VL6180X_AlsSetAnalogueGain(VL6180XDev_t dev, uint8_t gain); |
Davidroid | 57:fa4c622b04a7 | 309 | int VL6180X_AlsSetThresholds(VL6180XDev_t dev, uint16_t low, uint16_t high); |
Davidroid | 57:fa4c622b04a7 | 310 | int VL6180X_StaticInit(VL6180XDev_t dev); |
Davidroid | 57:fa4c622b04a7 | 311 | int VL6180X_RangeWaitDeviceReady(VL6180XDev_t dev, int MaxLoop ); |
Davidroid | 57:fa4c622b04a7 | 312 | int VL6180X_RangeSetRawThresholds(VL6180XDev_t dev, uint8_t low, uint8_t high); |
Davidroid | 57:fa4c622b04a7 | 313 | int VL6180X_RangeSetSystemMode(VL6180XDev_t dev, uint8_t mode); |
kenjiArai | 60:972b4898a007 | 314 | |
Davidroid | 57:fa4c622b04a7 | 315 | int VL6180X_AlsWaitDeviceReady(VL6180XDev_t dev, int MaxLoop ); |
kenjiArai | 59:81afbb75311d | 316 | int VL6180X_AlsSetSystemMode(VL6180XDev_t dev, uint8_t mode); |
Davidroid | 57:fa4c622b04a7 | 317 | int VL6180X_SetGroupParamHold(VL6180XDev_t dev, int Hold); |
kenjiArai | 59:81afbb75311d | 318 | |
Davidroid | 57:fa4c622b04a7 | 319 | /* Other functions defined in api.c */ |
kenjiArai | 59:81afbb75311d | 320 | int VL6180X_RangeStaticInit(VL6180XDev_t dev); |
Davidroid | 57:fa4c622b04a7 | 321 | int VL6180X_AlsGetLux(VL6180XDev_t dev, lux_t *pLux); |
Davidroid | 57:fa4c622b04a7 | 322 | int VL6180X_RangeSetEarlyConvergenceEestimateThreshold(VL6180XDev_t dev); |
kenjiArai | 59:81afbb75311d | 323 | int32_t _GetAveTotalTime(VL6180XDev_t dev); |
kenjiArai | 59:81afbb75311d | 324 | |
Davidroid | 57:fa4c622b04a7 | 325 | /* Read function of the ID device */ |
Davidroid | 57:fa4c622b04a7 | 326 | virtual int read_id(uint8_t *id); |
kenjiArai | 59:81afbb75311d | 327 | |
Davidroid | 57:fa4c622b04a7 | 328 | /* Write and read functions from I2C */ |
Davidroid | 57:fa4c622b04a7 | 329 | int VL6180X_WrByte(VL6180XDev_t dev, uint16_t index, uint8_t data); |
Davidroid | 57:fa4c622b04a7 | 330 | int VL6180X_WrWord(VL6180XDev_t dev, uint16_t index, uint16_t data); |
Davidroid | 57:fa4c622b04a7 | 331 | int VL6180X_WrDWord(VL6180XDev_t dev, uint16_t index, uint32_t data); |
Davidroid | 57:fa4c622b04a7 | 332 | int VL6180X_RdByte(VL6180XDev_t dev, uint16_t index, uint8_t *data); |
Davidroid | 57:fa4c622b04a7 | 333 | int VL6180X_RdWord(VL6180XDev_t dev, uint16_t index, uint16_t *data); |
Davidroid | 57:fa4c622b04a7 | 334 | int VL6180X_RdDWord(VL6180XDev_t dev, uint16_t index, uint32_t *data); |
Davidroid | 57:fa4c622b04a7 | 335 | int VL6180X_UpdateByte(VL6180XDev_t dev, uint16_t index, uint8_t AndData, uint8_t OrData); |
Davidroid | 57:fa4c622b04a7 | 336 | int VL6180X_I2CWrite(uint8_t DeviceAddr, uint16_t RegisterAddr, uint8_t *pBuffer, uint16_t NumByteToWrite); |
Davidroid | 57:fa4c622b04a7 | 337 | int VL6180X_I2CRead(uint8_t DeviceAddr, uint16_t RegisterAddr, uint8_t *pBuffer, uint16_t NumByteToRead); |
kenjiArai | 59:81afbb75311d | 338 | |
Davidroid | 57:fa4c622b04a7 | 339 | int IsPresent(); |
Davidroid | 57:fa4c622b04a7 | 340 | |
kenjiArai | 59:81afbb75311d | 341 | /* IO _device */ |
kenjiArai | 60:972b4898a007 | 342 | I2C *_i2c_p; |
kenjiArai | 60:972b4898a007 | 343 | I2C &_i2c; |
Davidroid | 57:fa4c622b04a7 | 344 | /* Digital out pin */ |
kenjiArai | 59:81afbb75311d | 345 | DigitalOut _gpio0; |
Davidroid | 57:fa4c622b04a7 | 346 | /* _device data */ |
Davidroid | 57:fa4c622b04a7 | 347 | MyVL6180Dev_t _my_device; |
kenjiArai | 59:81afbb75311d | 348 | VL6180XDev_t _device; |
Davidroid | 57:fa4c622b04a7 | 349 | }; |
Davidroid | 57:fa4c622b04a7 | 350 | |
Davidroid | 57:fa4c622b04a7 | 351 | #endif // __VL6180X_CLASS_H |