Program test for Coragem

Dependencies:   SX1272 SPI_MX25R

Committer:
marcoantonioara
Date:
Wed Nov 13 16:42:06 2019 +0000
Revision:
4:05d5aa4d3f2d
Test version firmware Coragem using all sensors

Who changed what in which revision?

UserRevisionLine numberNew contents of line
marcoantonioara 4:05d5aa4d3f2d 1 /***************************************************************************//**
marcoantonioara 4:05d5aa4d3f2d 2 * @file Si1133.cpp
marcoantonioara 4:05d5aa4d3f2d 3 *******************************************************************************
marcoantonioara 4:05d5aa4d3f2d 4 * @section License
marcoantonioara 4:05d5aa4d3f2d 5 * <b>(C) Copyright 2017 Silicon Labs, http://www.silabs.com</b>
marcoantonioara 4:05d5aa4d3f2d 6 *******************************************************************************
marcoantonioara 4:05d5aa4d3f2d 7 *
marcoantonioara 4:05d5aa4d3f2d 8 * SPDX-License-Identifier: Apache-2.0
marcoantonioara 4:05d5aa4d3f2d 9 *
marcoantonioara 4:05d5aa4d3f2d 10 * Licensed under the Apache License, Version 2.0 (the "License"); you may
marcoantonioara 4:05d5aa4d3f2d 11 * not use this file except in compliance with the License.
marcoantonioara 4:05d5aa4d3f2d 12 * You may obtain a copy of the License at
marcoantonioara 4:05d5aa4d3f2d 13 *
marcoantonioara 4:05d5aa4d3f2d 14 * http://www.apache.org/licenses/LICENSE-2.0
marcoantonioara 4:05d5aa4d3f2d 15 *
marcoantonioara 4:05d5aa4d3f2d 16 * Unless required by applicable law or agreed to in writing, software
marcoantonioara 4:05d5aa4d3f2d 17 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
marcoantonioara 4:05d5aa4d3f2d 18 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
marcoantonioara 4:05d5aa4d3f2d 19 * See the License for the specific language governing permissions and
marcoantonioara 4:05d5aa4d3f2d 20 * limitations under the License.
marcoantonioara 4:05d5aa4d3f2d 21 *
marcoantonioara 4:05d5aa4d3f2d 22 ******************************************************************************/
marcoantonioara 4:05d5aa4d3f2d 23
marcoantonioara 4:05d5aa4d3f2d 24 #include "Si1133.h"
marcoantonioara 4:05d5aa4d3f2d 25
marcoantonioara 4:05d5aa4d3f2d 26 #define SI1133_I2C_ADDRESS (0xAA) /** Hardcoded address for Si1133 sensor */
marcoantonioara 4:05d5aa4d3f2d 27
marcoantonioara 4:05d5aa4d3f2d 28 /** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
marcoantonioara 4:05d5aa4d3f2d 29
marcoantonioara 4:05d5aa4d3f2d 30 #define X_ORDER_MASK 0x0070
marcoantonioara 4:05d5aa4d3f2d 31 #define Y_ORDER_MASK 0x0007
marcoantonioara 4:05d5aa4d3f2d 32 #define SIGN_MASK 0x0080
marcoantonioara 4:05d5aa4d3f2d 33 #define GET_X_ORDER(m) ( ((m) & X_ORDER_MASK) >> 4)
marcoantonioara 4:05d5aa4d3f2d 34 #define GET_Y_ORDER(m) ( ((m) & Y_ORDER_MASK) )
marcoantonioara 4:05d5aa4d3f2d 35 #define GET_SIGN(m) ( ((m) & SIGN_MASK) >> 7)
marcoantonioara 4:05d5aa4d3f2d 36
marcoantonioara 4:05d5aa4d3f2d 37 #define UV_INPUT_FRACTION 15
marcoantonioara 4:05d5aa4d3f2d 38 #define UV_OUTPUT_FRACTION 12
marcoantonioara 4:05d5aa4d3f2d 39 #define UV_NUMCOEFF 2
marcoantonioara 4:05d5aa4d3f2d 40
marcoantonioara 4:05d5aa4d3f2d 41 #define ADC_THRESHOLD 16000
marcoantonioara 4:05d5aa4d3f2d 42 #define INPUT_FRACTION_HIGH 7
marcoantonioara 4:05d5aa4d3f2d 43 #define INPUT_FRACTION_LOW 15
marcoantonioara 4:05d5aa4d3f2d 44 #define LUX_OUTPUT_FRACTION 12
marcoantonioara 4:05d5aa4d3f2d 45 #define NUMCOEFF_LOW 9
marcoantonioara 4:05d5aa4d3f2d 46 #define NUMCOEFF_HIGH 4
marcoantonioara 4:05d5aa4d3f2d 47
marcoantonioara 4:05d5aa4d3f2d 48 /** @endcond */
marcoantonioara 4:05d5aa4d3f2d 49
marcoantonioara 4:05d5aa4d3f2d 50 /** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
marcoantonioara 4:05d5aa4d3f2d 51 /***************************************************************************//**
marcoantonioara 4:05d5aa4d3f2d 52 * @brief
marcoantonioara 4:05d5aa4d3f2d 53 * Coefficients for lux calculation
marcoantonioara 4:05d5aa4d3f2d 54 ******************************************************************************/
marcoantonioara 4:05d5aa4d3f2d 55 const Si1133::LuxCoeff_t Si1133::lk = {
marcoantonioara 4:05d5aa4d3f2d 56 { { 0, 209 }, /**< coeff_high[0] */
marcoantonioara 4:05d5aa4d3f2d 57 { 1665, 93 }, /**< coeff_high[1] */
marcoantonioara 4:05d5aa4d3f2d 58 { 2064, 65 }, /**< coeff_high[2] */
marcoantonioara 4:05d5aa4d3f2d 59 { -2671, 234 } }, /**< coeff_high[3] */
marcoantonioara 4:05d5aa4d3f2d 60 { { 0, 0 }, /**< coeff_low[0] */
marcoantonioara 4:05d5aa4d3f2d 61 { 1921, 29053 }, /**< coeff_low[1] */
marcoantonioara 4:05d5aa4d3f2d 62 { -1022, 36363 }, /**< coeff_low[2] */
marcoantonioara 4:05d5aa4d3f2d 63 { 2320, 20789 }, /**< coeff_low[3] */
marcoantonioara 4:05d5aa4d3f2d 64 { -367, 57909 }, /**< coeff_low[4] */
marcoantonioara 4:05d5aa4d3f2d 65 { -1774, 38240 }, /**< coeff_low[5] */
marcoantonioara 4:05d5aa4d3f2d 66 { -608, 46775 }, /**< coeff_low[6] */
marcoantonioara 4:05d5aa4d3f2d 67 { -1503, 51831 }, /**< coeff_low[7] */
marcoantonioara 4:05d5aa4d3f2d 68 { -1886, 58928 } } /**< coeff_low[8] */
marcoantonioara 4:05d5aa4d3f2d 69 };
marcoantonioara 4:05d5aa4d3f2d 70
marcoantonioara 4:05d5aa4d3f2d 71 /***************************************************************************//**
marcoantonioara 4:05d5aa4d3f2d 72 * @brief
marcoantonioara 4:05d5aa4d3f2d 73 * Coefficients for UV index calculation
marcoantonioara 4:05d5aa4d3f2d 74 ******************************************************************************/
marcoantonioara 4:05d5aa4d3f2d 75 const Si1133::Coeff_t Si1133::uk[2] = {
marcoantonioara 4:05d5aa4d3f2d 76 { 1281, 30902 }, /**< coeff[0] */
marcoantonioara 4:05d5aa4d3f2d 77 { -638, 46301 } /**< coeff[1] */
marcoantonioara 4:05d5aa4d3f2d 78 };
marcoantonioara 4:05d5aa4d3f2d 79
marcoantonioara 4:05d5aa4d3f2d 80 /**************************************************************************//**
marcoantonioara 4:05d5aa4d3f2d 81 * @name Error Codes
marcoantonioara 4:05d5aa4d3f2d 82 * @{
marcoantonioara 4:05d5aa4d3f2d 83 ******************************************************************************/
marcoantonioara 4:05d5aa4d3f2d 84 #define SI1133_OK 0x0000 /**< No errors */
marcoantonioara 4:05d5aa4d3f2d 85 #define SI1133_ERROR_I2C_TRANSACTION_FAILED 0x0001 /**< I2C transaction failed */
marcoantonioara 4:05d5aa4d3f2d 86 #define SI1133_ERROR_SLEEP_FAILED 0x0002 /**< Entering sleep mode failed */
marcoantonioara 4:05d5aa4d3f2d 87 /**@}*/
marcoantonioara 4:05d5aa4d3f2d 88
marcoantonioara 4:05d5aa4d3f2d 89 /** @endcond */
marcoantonioara 4:05d5aa4d3f2d 90
marcoantonioara 4:05d5aa4d3f2d 91 Si1133::Si1133(PinName sda, PinName scl, int hz) : m_I2C(sda, scl)
marcoantonioara 4:05d5aa4d3f2d 92 {
marcoantonioara 4:05d5aa4d3f2d 93 //Set the I2C bus frequency
marcoantonioara 4:05d5aa4d3f2d 94 m_I2C.frequency(hz);
marcoantonioara 4:05d5aa4d3f2d 95 }
marcoantonioara 4:05d5aa4d3f2d 96
marcoantonioara 4:05d5aa4d3f2d 97 Si1133::~Si1133(void)
marcoantonioara 4:05d5aa4d3f2d 98 {
marcoantonioara 4:05d5aa4d3f2d 99 deinit();
marcoantonioara 4:05d5aa4d3f2d 100 }
marcoantonioara 4:05d5aa4d3f2d 101
marcoantonioara 4:05d5aa4d3f2d 102 bool Si1133::open()
marcoantonioara 4:05d5aa4d3f2d 103 {
marcoantonioara 4:05d5aa4d3f2d 104 //Probe for the Si1133 using a Zero Length Transfer
marcoantonioara 4:05d5aa4d3f2d 105 if (m_I2C.write(SI1133_I2C_ADDRESS, NULL, 0)) {
marcoantonioara 4:05d5aa4d3f2d 106 //Return success
marcoantonioara 4:05d5aa4d3f2d 107 return false;
marcoantonioara 4:05d5aa4d3f2d 108 }
marcoantonioara 4:05d5aa4d3f2d 109
marcoantonioara 4:05d5aa4d3f2d 110 // initialize sensor
marcoantonioara 4:05d5aa4d3f2d 111 if (SI1133_OK == init()) {
marcoantonioara 4:05d5aa4d3f2d 112 return true;
marcoantonioara 4:05d5aa4d3f2d 113 }
marcoantonioara 4:05d5aa4d3f2d 114 return false;
marcoantonioara 4:05d5aa4d3f2d 115 }
marcoantonioara 4:05d5aa4d3f2d 116
marcoantonioara 4:05d5aa4d3f2d 117 /** Measure the current light level (in lux) on the Si1133
marcoantonioara 4:05d5aa4d3f2d 118 *
marcoantonioara 4:05d5aa4d3f2d 119 * @returns The current temperature measurement in Lux.
marcoantonioara 4:05d5aa4d3f2d 120 */
marcoantonioara 4:05d5aa4d3f2d 121 float Si1133::get_light_level()
marcoantonioara 4:05d5aa4d3f2d 122 {
marcoantonioara 4:05d5aa4d3f2d 123 float lux, uvi;
marcoantonioara 4:05d5aa4d3f2d 124 measure_lux_uv(&lux, &uvi);
marcoantonioara 4:05d5aa4d3f2d 125 return lux;
marcoantonioara 4:05d5aa4d3f2d 126 }
marcoantonioara 4:05d5aa4d3f2d 127
marcoantonioara 4:05d5aa4d3f2d 128 /** Measure the current UV Index on the Si1133
marcoantonioara 4:05d5aa4d3f2d 129 *
marcoantonioara 4:05d5aa4d3f2d 130 * @returns The current UV index.
marcoantonioara 4:05d5aa4d3f2d 131 */
marcoantonioara 4:05d5aa4d3f2d 132 float Si1133::get_uv_index()
marcoantonioara 4:05d5aa4d3f2d 133 {
marcoantonioara 4:05d5aa4d3f2d 134 float lux, uvi;
marcoantonioara 4:05d5aa4d3f2d 135 measure_lux_uv(&lux, &uvi);
marcoantonioara 4:05d5aa4d3f2d 136 return uvi;
marcoantonioara 4:05d5aa4d3f2d 137 }
marcoantonioara 4:05d5aa4d3f2d 138
marcoantonioara 4:05d5aa4d3f2d 139 bool Si1133::get_light_and_uv(float *light_level, float *uv_index)
marcoantonioara 4:05d5aa4d3f2d 140 {
marcoantonioara 4:05d5aa4d3f2d 141 if(measure_lux_uv(light_level, uv_index)) {
marcoantonioara 4:05d5aa4d3f2d 142 return false;
marcoantonioara 4:05d5aa4d3f2d 143 }
marcoantonioara 4:05d5aa4d3f2d 144 return true;
marcoantonioara 4:05d5aa4d3f2d 145 }
marcoantonioara 4:05d5aa4d3f2d 146
marcoantonioara 4:05d5aa4d3f2d 147 /***************************************************************************//**
marcoantonioara 4:05d5aa4d3f2d 148 * @brief
marcoantonioara 4:05d5aa4d3f2d 149 * Reads register from the Si1133 sensor
marcoantonioara 4:05d5aa4d3f2d 150 *
marcoantonioara 4:05d5aa4d3f2d 151 * @param[in] reg
marcoantonioara 4:05d5aa4d3f2d 152 * The register address to read from in the sensor.
marcoantonioara 4:05d5aa4d3f2d 153 *
marcoantonioara 4:05d5aa4d3f2d 154 * @param[out] data
marcoantonioara 4:05d5aa4d3f2d 155 * The data read from the sensor
marcoantonioara 4:05d5aa4d3f2d 156 *
marcoantonioara 4:05d5aa4d3f2d 157 * @return
marcoantonioara 4:05d5aa4d3f2d 158 * Returns zero on OK, non-zero otherwise
marcoantonioara 4:05d5aa4d3f2d 159 ******************************************************************************/
marcoantonioara 4:05d5aa4d3f2d 160 uint32_t Si1133::read_register(enum Si1133::Register reg, uint8_t *data)
marcoantonioara 4:05d5aa4d3f2d 161 {
marcoantonioara 4:05d5aa4d3f2d 162 char buf[1];
marcoantonioara 4:05d5aa4d3f2d 163 buf[0] = (char) reg;
marcoantonioara 4:05d5aa4d3f2d 164
marcoantonioara 4:05d5aa4d3f2d 165 if (m_I2C.write(SI1133_I2C_ADDRESS, buf, 1, true)) {
marcoantonioara 4:05d5aa4d3f2d 166 //Return failure
marcoantonioara 4:05d5aa4d3f2d 167 return SI1133_ERROR_I2C_TRANSACTION_FAILED;
marcoantonioara 4:05d5aa4d3f2d 168 }
marcoantonioara 4:05d5aa4d3f2d 169
marcoantonioara 4:05d5aa4d3f2d 170 if (m_I2C.read(SI1133_I2C_ADDRESS, buf, 1)) {
marcoantonioara 4:05d5aa4d3f2d 171 //Return failure
marcoantonioara 4:05d5aa4d3f2d 172 return SI1133_ERROR_I2C_TRANSACTION_FAILED;
marcoantonioara 4:05d5aa4d3f2d 173 }
marcoantonioara 4:05d5aa4d3f2d 174
marcoantonioara 4:05d5aa4d3f2d 175 *data = buf[0];
marcoantonioara 4:05d5aa4d3f2d 176
marcoantonioara 4:05d5aa4d3f2d 177 return SI1133_OK;
marcoantonioara 4:05d5aa4d3f2d 178 }
marcoantonioara 4:05d5aa4d3f2d 179
marcoantonioara 4:05d5aa4d3f2d 180 /***************************************************************************//**
marcoantonioara 4:05d5aa4d3f2d 181 * @brief
marcoantonioara 4:05d5aa4d3f2d 182 * Writes register in the Si1133 sensor
marcoantonioara 4:05d5aa4d3f2d 183 *
marcoantonioara 4:05d5aa4d3f2d 184 * @param[in] reg
marcoantonioara 4:05d5aa4d3f2d 185 * The register address to write to in the sensor
marcoantonioara 4:05d5aa4d3f2d 186 *
marcoantonioara 4:05d5aa4d3f2d 187 * @param[in] data
marcoantonioara 4:05d5aa4d3f2d 188 * The data to write to the sensor
marcoantonioara 4:05d5aa4d3f2d 189 *
marcoantonioara 4:05d5aa4d3f2d 190 * @return
marcoantonioara 4:05d5aa4d3f2d 191 * Returns zero on OK, non-zero otherwise
marcoantonioara 4:05d5aa4d3f2d 192 ******************************************************************************/
marcoantonioara 4:05d5aa4d3f2d 193 uint32_t Si1133::write_register(enum Si1133::Register reg, uint8_t data)
marcoantonioara 4:05d5aa4d3f2d 194 {
marcoantonioara 4:05d5aa4d3f2d 195 char buf[2];
marcoantonioara 4:05d5aa4d3f2d 196 buf[0] = (char) reg;
marcoantonioara 4:05d5aa4d3f2d 197 buf[1] = (char) data;
marcoantonioara 4:05d5aa4d3f2d 198
marcoantonioara 4:05d5aa4d3f2d 199 if (m_I2C.write(SI1133_I2C_ADDRESS, buf, 2)) {
marcoantonioara 4:05d5aa4d3f2d 200 //Return failure
marcoantonioara 4:05d5aa4d3f2d 201 return SI1133_ERROR_I2C_TRANSACTION_FAILED;
marcoantonioara 4:05d5aa4d3f2d 202 }
marcoantonioara 4:05d5aa4d3f2d 203
marcoantonioara 4:05d5aa4d3f2d 204 return SI1133_OK;
marcoantonioara 4:05d5aa4d3f2d 205 }
marcoantonioara 4:05d5aa4d3f2d 206
marcoantonioara 4:05d5aa4d3f2d 207 /***************************************************************************//**
marcoantonioara 4:05d5aa4d3f2d 208 * @brief
marcoantonioara 4:05d5aa4d3f2d 209 * Writes a block of data to the Si1133 sensor.
marcoantonioara 4:05d5aa4d3f2d 210 *
marcoantonioara 4:05d5aa4d3f2d 211 * @param[in] reg
marcoantonioara 4:05d5aa4d3f2d 212 * The first register to begin writing to
marcoantonioara 4:05d5aa4d3f2d 213 *
marcoantonioara 4:05d5aa4d3f2d 214 * @param[in] length
marcoantonioara 4:05d5aa4d3f2d 215 * The number of bytes to write to the sensor
marcoantonioara 4:05d5aa4d3f2d 216 *
marcoantonioara 4:05d5aa4d3f2d 217 * @param[in] data
marcoantonioara 4:05d5aa4d3f2d 218 * The data to write to the sensor
marcoantonioara 4:05d5aa4d3f2d 219 *
marcoantonioara 4:05d5aa4d3f2d 220 * @return
marcoantonioara 4:05d5aa4d3f2d 221 * Returns zero on OK, non-zero otherwise
marcoantonioara 4:05d5aa4d3f2d 222 ******************************************************************************/
marcoantonioara 4:05d5aa4d3f2d 223 uint32_t Si1133::write_register_block(enum Si1133::Register reg, uint8_t length, uint8_t *data)
marcoantonioara 4:05d5aa4d3f2d 224 {
marcoantonioara 4:05d5aa4d3f2d 225 char buf[3];
marcoantonioara 4:05d5aa4d3f2d 226 buf[0] = (char)reg;
marcoantonioara 4:05d5aa4d3f2d 227
marcoantonioara 4:05d5aa4d3f2d 228 if (length > 2) {
marcoantonioara 4:05d5aa4d3f2d 229 return SI1133_ERROR_I2C_TRANSACTION_FAILED;
marcoantonioara 4:05d5aa4d3f2d 230 }
marcoantonioara 4:05d5aa4d3f2d 231
marcoantonioara 4:05d5aa4d3f2d 232 memcpy(&buf[1], data, length);
marcoantonioara 4:05d5aa4d3f2d 233
marcoantonioara 4:05d5aa4d3f2d 234 if (m_I2C.write(SI1133_I2C_ADDRESS, buf, length + 1)) {
marcoantonioara 4:05d5aa4d3f2d 235 //Return failure
marcoantonioara 4:05d5aa4d3f2d 236 return SI1133_ERROR_I2C_TRANSACTION_FAILED;
marcoantonioara 4:05d5aa4d3f2d 237 }
marcoantonioara 4:05d5aa4d3f2d 238
marcoantonioara 4:05d5aa4d3f2d 239 return SI1133_OK;
marcoantonioara 4:05d5aa4d3f2d 240 }
marcoantonioara 4:05d5aa4d3f2d 241
marcoantonioara 4:05d5aa4d3f2d 242 /***************************************************************************//**
marcoantonioara 4:05d5aa4d3f2d 243 * @brief
marcoantonioara 4:05d5aa4d3f2d 244 * Reads a block of data from the Si1133 sensor.
marcoantonioara 4:05d5aa4d3f2d 245 *
marcoantonioara 4:05d5aa4d3f2d 246 * @param[in] reg
marcoantonioara 4:05d5aa4d3f2d 247 * The first register to begin reading from
marcoantonioara 4:05d5aa4d3f2d 248 *
marcoantonioara 4:05d5aa4d3f2d 249 * @param[in] length
marcoantonioara 4:05d5aa4d3f2d 250 * The number of bytes to write to the sensor
marcoantonioara 4:05d5aa4d3f2d 251 *
marcoantonioara 4:05d5aa4d3f2d 252 * @param[out] data
marcoantonioara 4:05d5aa4d3f2d 253 * The data read from the sensor
marcoantonioara 4:05d5aa4d3f2d 254 *
marcoantonioara 4:05d5aa4d3f2d 255 * @return
marcoantonioara 4:05d5aa4d3f2d 256 * Returns zero on OK, non-zero otherwise
marcoantonioara 4:05d5aa4d3f2d 257 ******************************************************************************/
marcoantonioara 4:05d5aa4d3f2d 258 uint32_t Si1133::read_register_block(enum Si1133::Register reg, uint8_t length, uint8_t *data)
marcoantonioara 4:05d5aa4d3f2d 259 {
marcoantonioara 4:05d5aa4d3f2d 260 char reg_c = (char)reg;
marcoantonioara 4:05d5aa4d3f2d 261 if (m_I2C.write(SI1133_I2C_ADDRESS, &reg_c, 1, true)) {
marcoantonioara 4:05d5aa4d3f2d 262 //Return failure
marcoantonioara 4:05d5aa4d3f2d 263 return SI1133_ERROR_I2C_TRANSACTION_FAILED;
marcoantonioara 4:05d5aa4d3f2d 264 }
marcoantonioara 4:05d5aa4d3f2d 265
marcoantonioara 4:05d5aa4d3f2d 266 if (m_I2C.read(SI1133_I2C_ADDRESS, (char*) data, length)) {
marcoantonioara 4:05d5aa4d3f2d 267 //Return failure
marcoantonioara 4:05d5aa4d3f2d 268 return SI1133_ERROR_I2C_TRANSACTION_FAILED;
marcoantonioara 4:05d5aa4d3f2d 269 }
marcoantonioara 4:05d5aa4d3f2d 270
marcoantonioara 4:05d5aa4d3f2d 271 return SI1133_OK;
marcoantonioara 4:05d5aa4d3f2d 272 }
marcoantonioara 4:05d5aa4d3f2d 273
marcoantonioara 4:05d5aa4d3f2d 274 /***************************************************************************//**
marcoantonioara 4:05d5aa4d3f2d 275 * @brief
marcoantonioara 4:05d5aa4d3f2d 276 * Reads the interrupt status register of the device
marcoantonioara 4:05d5aa4d3f2d 277 *
marcoantonioara 4:05d5aa4d3f2d 278 * @param[out] irqStatus
marcoantonioara 4:05d5aa4d3f2d 279 * The contentof the IRQ status register
marcoantonioara 4:05d5aa4d3f2d 280 *
marcoantonioara 4:05d5aa4d3f2d 281 * @return
marcoantonioara 4:05d5aa4d3f2d 282 * Returns zero on OK, non-zero otherwise
marcoantonioara 4:05d5aa4d3f2d 283 ******************************************************************************/
marcoantonioara 4:05d5aa4d3f2d 284 uint32_t Si1133::get_irq_status(uint8_t *irq_status)
marcoantonioara 4:05d5aa4d3f2d 285 {
marcoantonioara 4:05d5aa4d3f2d 286 return read_register(REG_IRQ_STATUS, irq_status);
marcoantonioara 4:05d5aa4d3f2d 287 }
marcoantonioara 4:05d5aa4d3f2d 288
marcoantonioara 4:05d5aa4d3f2d 289 uint32_t Si1133::wake(void)
marcoantonioara 4:05d5aa4d3f2d 290 {
marcoantonioara 4:05d5aa4d3f2d 291 uint8_t response;
marcoantonioara 4:05d5aa4d3f2d 292 read_register(REG_RESPONSE0, &response);
marcoantonioara 4:05d5aa4d3f2d 293 response = (response & 31) | 128;
marcoantonioara 4:05d5aa4d3f2d 294 write_register(REG_RESPONSE0, response);
marcoantonioara 4:05d5aa4d3f2d 295 read_register(REG_RESPONSE0, &response);
marcoantonioara 4:05d5aa4d3f2d 296 if (response & 224 == 128)
marcoantonioara 4:05d5aa4d3f2d 297 return 0;
marcoantonioara 4:05d5aa4d3f2d 298 else return 1;
marcoantonioara 4:05d5aa4d3f2d 299 }
marcoantonioara 4:05d5aa4d3f2d 300
marcoantonioara 4:05d5aa4d3f2d 301
marcoantonioara 4:05d5aa4d3f2d 302 /***************************************************************************//**
marcoantonioara 4:05d5aa4d3f2d 303 * @brief
marcoantonioara 4:05d5aa4d3f2d 304 * Waits until the Si1133 is sleeping before proceeding
marcoantonioara 4:05d5aa4d3f2d 305 *
marcoantonioara 4:05d5aa4d3f2d 306 * @return
marcoantonioara 4:05d5aa4d3f2d 307 * Returns zero on OK, non-zero otherwise
marcoantonioara 4:05d5aa4d3f2d 308 ******************************************************************************/
marcoantonioara 4:05d5aa4d3f2d 309 uint32_t Si1133::wait_until_sleep(void)
marcoantonioara 4:05d5aa4d3f2d 310 {
marcoantonioara 4:05d5aa4d3f2d 311 uint32_t ret;
marcoantonioara 4:05d5aa4d3f2d 312 uint8_t response;
marcoantonioara 4:05d5aa4d3f2d 313 size_t count = 0;
marcoantonioara 4:05d5aa4d3f2d 314
marcoantonioara 4:05d5aa4d3f2d 315 /* This loops until the Si1133 is known to be in its sleep state */
marcoantonioara 4:05d5aa4d3f2d 316 /* or if an i2c error occurs */
marcoantonioara 4:05d5aa4d3f2d 317 while ( count < 5 ) {
marcoantonioara 4:05d5aa4d3f2d 318 ret = read_register(REG_RESPONSE0, &response);
marcoantonioara 4:05d5aa4d3f2d 319 if ( (response & (uint8_t)RSP0_CHIPSTAT_MASK) == (uint8_t)RSP0_SLEEP ) {
marcoantonioara 4:05d5aa4d3f2d 320 return SI1133_OK;
marcoantonioara 4:05d5aa4d3f2d 321 }
marcoantonioara 4:05d5aa4d3f2d 322
marcoantonioara 4:05d5aa4d3f2d 323 if ( ret != SI1133_OK ) {
marcoantonioara 4:05d5aa4d3f2d 324 return SI1133_ERROR_SLEEP_FAILED;
marcoantonioara 4:05d5aa4d3f2d 325 }
marcoantonioara 4:05d5aa4d3f2d 326
marcoantonioara 4:05d5aa4d3f2d 327 count++;
marcoantonioara 4:05d5aa4d3f2d 328 }
marcoantonioara 4:05d5aa4d3f2d 329
marcoantonioara 4:05d5aa4d3f2d 330 return SI1133_ERROR_SLEEP_FAILED;
marcoantonioara 4:05d5aa4d3f2d 331 }
marcoantonioara 4:05d5aa4d3f2d 332
marcoantonioara 4:05d5aa4d3f2d 333 /***************************************************************************//**
marcoantonioara 4:05d5aa4d3f2d 334 * @brief
marcoantonioara 4:05d5aa4d3f2d 335 * Resets the Si1133
marcoantonioara 4:05d5aa4d3f2d 336 *
marcoantonioara 4:05d5aa4d3f2d 337 * @return
marcoantonioara 4:05d5aa4d3f2d 338 * Returns zero on OK, non-zero otherwise
marcoantonioara 4:05d5aa4d3f2d 339 ******************************************************************************/
marcoantonioara 4:05d5aa4d3f2d 340 uint32_t Si1133::reset(void)
marcoantonioara 4:05d5aa4d3f2d 341 {
marcoantonioara 4:05d5aa4d3f2d 342 uint32_t retval;
marcoantonioara 4:05d5aa4d3f2d 343
marcoantonioara 4:05d5aa4d3f2d 344 /* Do not access the Si1133 earlier than 25 ms from power-up */
marcoantonioara 4:05d5aa4d3f2d 345 wait_ms(30);
marcoantonioara 4:05d5aa4d3f2d 346
marcoantonioara 4:05d5aa4d3f2d 347 /* Perform the Reset Command */
marcoantonioara 4:05d5aa4d3f2d 348 retval = write_register(REG_COMMAND, (uint8_t)CMD_RESET);
marcoantonioara 4:05d5aa4d3f2d 349
marcoantonioara 4:05d5aa4d3f2d 350 /* Delay for 10 ms. This delay is needed to allow the Si1133 */
marcoantonioara 4:05d5aa4d3f2d 351 /* to perform internal reset sequence. */
marcoantonioara 4:05d5aa4d3f2d 352 wait_ms(10);
marcoantonioara 4:05d5aa4d3f2d 353
marcoantonioara 4:05d5aa4d3f2d 354 return retval;
marcoantonioara 4:05d5aa4d3f2d 355 }
marcoantonioara 4:05d5aa4d3f2d 356
marcoantonioara 4:05d5aa4d3f2d 357 /***************************************************************************//**
marcoantonioara 4:05d5aa4d3f2d 358 * @brief
marcoantonioara 4:05d5aa4d3f2d 359 * Helper function to send a command to the Si1133
marcoantonioara 4:05d5aa4d3f2d 360 *
marcoantonioara 4:05d5aa4d3f2d 361 * @param[in] command
marcoantonioara 4:05d5aa4d3f2d 362 * The command to send to the sensor
marcoantonioara 4:05d5aa4d3f2d 363 *
marcoantonioara 4:05d5aa4d3f2d 364 * @return
marcoantonioara 4:05d5aa4d3f2d 365 * Returns zero on OK, non-zero otherwise
marcoantonioara 4:05d5aa4d3f2d 366 ******************************************************************************/
marcoantonioara 4:05d5aa4d3f2d 367 uint32_t Si1133::send_cmd(enum Si1133::Command command)
marcoantonioara 4:05d5aa4d3f2d 368 {
marcoantonioara 4:05d5aa4d3f2d 369 uint8_t response;
marcoantonioara 4:05d5aa4d3f2d 370 uint8_t response_stored;
marcoantonioara 4:05d5aa4d3f2d 371 uint8_t count = 0;
marcoantonioara 4:05d5aa4d3f2d 372 uint32_t ret;
marcoantonioara 4:05d5aa4d3f2d 373
marcoantonioara 4:05d5aa4d3f2d 374 /* Get the response register contents */
marcoantonioara 4:05d5aa4d3f2d 375 ret = read_register(REG_RESPONSE0, &response_stored);
marcoantonioara 4:05d5aa4d3f2d 376 if ( ret != SI1133_OK ) {
marcoantonioara 4:05d5aa4d3f2d 377 return ret;
marcoantonioara 4:05d5aa4d3f2d 378 }
marcoantonioara 4:05d5aa4d3f2d 379
marcoantonioara 4:05d5aa4d3f2d 380 response_stored = response_stored & (uint8_t)RSP0_COUNTER_MASK;
marcoantonioara 4:05d5aa4d3f2d 381
marcoantonioara 4:05d5aa4d3f2d 382 /* Double-check the response register is consistent */
marcoantonioara 4:05d5aa4d3f2d 383 while ( count < 5 ) {
marcoantonioara 4:05d5aa4d3f2d 384 ret = wait_until_sleep();
marcoantonioara 4:05d5aa4d3f2d 385 if ( ret != SI1133_OK ) {
marcoantonioara 4:05d5aa4d3f2d 386 return ret;
marcoantonioara 4:05d5aa4d3f2d 387 }
marcoantonioara 4:05d5aa4d3f2d 388 /* Skip if the command is RESET COMMAND COUNTER */
marcoantonioara 4:05d5aa4d3f2d 389 if ( command == (uint8_t)CMD_RESET_CMD_CTR ) {
marcoantonioara 4:05d5aa4d3f2d 390 break;
marcoantonioara 4:05d5aa4d3f2d 391 }
marcoantonioara 4:05d5aa4d3f2d 392
marcoantonioara 4:05d5aa4d3f2d 393 ret = read_register(REG_RESPONSE0, &response);
marcoantonioara 4:05d5aa4d3f2d 394
marcoantonioara 4:05d5aa4d3f2d 395 if ( (response & (uint8_t)RSP0_COUNTER_MASK) == response_stored ) {
marcoantonioara 4:05d5aa4d3f2d 396 break;
marcoantonioara 4:05d5aa4d3f2d 397 } else {
marcoantonioara 4:05d5aa4d3f2d 398 if ( ret != SI1133_OK ) {
marcoantonioara 4:05d5aa4d3f2d 399 return ret;
marcoantonioara 4:05d5aa4d3f2d 400 } else {
marcoantonioara 4:05d5aa4d3f2d 401 response_stored = response & (uint8_t)RSP0_COUNTER_MASK;
marcoantonioara 4:05d5aa4d3f2d 402 }
marcoantonioara 4:05d5aa4d3f2d 403 }
marcoantonioara 4:05d5aa4d3f2d 404
marcoantonioara 4:05d5aa4d3f2d 405 count++;
marcoantonioara 4:05d5aa4d3f2d 406 }
marcoantonioara 4:05d5aa4d3f2d 407
marcoantonioara 4:05d5aa4d3f2d 408 /* Send the command */
marcoantonioara 4:05d5aa4d3f2d 409 ret = write_register(REG_COMMAND, command);
marcoantonioara 4:05d5aa4d3f2d 410 if ( ret != SI1133_OK ) {
marcoantonioara 4:05d5aa4d3f2d 411 return ret;
marcoantonioara 4:05d5aa4d3f2d 412 }
marcoantonioara 4:05d5aa4d3f2d 413
marcoantonioara 4:05d5aa4d3f2d 414 count = 0;
marcoantonioara 4:05d5aa4d3f2d 415 /* Expect a change in the response register */
marcoantonioara 4:05d5aa4d3f2d 416 while ( count < 5 ) {
marcoantonioara 4:05d5aa4d3f2d 417 /* Skip if the command is RESET COMMAND COUNTER */
marcoantonioara 4:05d5aa4d3f2d 418 if ( command == (uint8_t)CMD_RESET_CMD_CTR ) {
marcoantonioara 4:05d5aa4d3f2d 419 break;
marcoantonioara 4:05d5aa4d3f2d 420 }
marcoantonioara 4:05d5aa4d3f2d 421
marcoantonioara 4:05d5aa4d3f2d 422 ret = read_register(REG_RESPONSE0, &response);
marcoantonioara 4:05d5aa4d3f2d 423 if ( (response & (uint8_t)RSP0_COUNTER_MASK) != response_stored ) {
marcoantonioara 4:05d5aa4d3f2d 424 break;
marcoantonioara 4:05d5aa4d3f2d 425 } else {
marcoantonioara 4:05d5aa4d3f2d 426 if ( ret != SI1133_OK ) {
marcoantonioara 4:05d5aa4d3f2d 427 return ret;
marcoantonioara 4:05d5aa4d3f2d 428 }
marcoantonioara 4:05d5aa4d3f2d 429 }
marcoantonioara 4:05d5aa4d3f2d 430
marcoantonioara 4:05d5aa4d3f2d 431 count++;
marcoantonioara 4:05d5aa4d3f2d 432 }
marcoantonioara 4:05d5aa4d3f2d 433
marcoantonioara 4:05d5aa4d3f2d 434 return SI1133_OK;
marcoantonioara 4:05d5aa4d3f2d 435 }
marcoantonioara 4:05d5aa4d3f2d 436
marcoantonioara 4:05d5aa4d3f2d 437 /***************************************************************************//**
marcoantonioara 4:05d5aa4d3f2d 438 * @brief
marcoantonioara 4:05d5aa4d3f2d 439 * Sends a RESET COMMAND COUNTER command to the Si1133
marcoantonioara 4:05d5aa4d3f2d 440 *
marcoantonioara 4:05d5aa4d3f2d 441 * @return
marcoantonioara 4:05d5aa4d3f2d 442 * Returns zero on OK, non-zero otherwise
marcoantonioara 4:05d5aa4d3f2d 443 ******************************************************************************/
marcoantonioara 4:05d5aa4d3f2d 444 uint32_t Si1133::reset_cmd_counter(void)
marcoantonioara 4:05d5aa4d3f2d 445 {
marcoantonioara 4:05d5aa4d3f2d 446 return send_cmd(CMD_RESET_CMD_CTR);
marcoantonioara 4:05d5aa4d3f2d 447 }
marcoantonioara 4:05d5aa4d3f2d 448
marcoantonioara 4:05d5aa4d3f2d 449 /***************************************************************************//**
marcoantonioara 4:05d5aa4d3f2d 450 * @brief
marcoantonioara 4:05d5aa4d3f2d 451 * Sends a FORCE command to the Si1133
marcoantonioara 4:05d5aa4d3f2d 452 *
marcoantonioara 4:05d5aa4d3f2d 453 * @return
marcoantonioara 4:05d5aa4d3f2d 454 * Returns zero on OK, non-zero otherwise
marcoantonioara 4:05d5aa4d3f2d 455 ******************************************************************************/
marcoantonioara 4:05d5aa4d3f2d 456 uint32_t Si1133::force_measurement(void)
marcoantonioara 4:05d5aa4d3f2d 457 {
marcoantonioara 4:05d5aa4d3f2d 458 return send_cmd(CMD_FORCE_CH);
marcoantonioara 4:05d5aa4d3f2d 459 }
marcoantonioara 4:05d5aa4d3f2d 460
marcoantonioara 4:05d5aa4d3f2d 461 /***************************************************************************//**
marcoantonioara 4:05d5aa4d3f2d 462 * @brief
marcoantonioara 4:05d5aa4d3f2d 463 * Sends a START command to the Si1133
marcoantonioara 4:05d5aa4d3f2d 464 *
marcoantonioara 4:05d5aa4d3f2d 465 * @return
marcoantonioara 4:05d5aa4d3f2d 466 * Returns zero on OK, non-zero otherwise
marcoantonioara 4:05d5aa4d3f2d 467 ******************************************************************************/
marcoantonioara 4:05d5aa4d3f2d 468 uint32_t Si1133::start_measurement(void)
marcoantonioara 4:05d5aa4d3f2d 469 {
marcoantonioara 4:05d5aa4d3f2d 470 return send_cmd(CMD_START);
marcoantonioara 4:05d5aa4d3f2d 471 }
marcoantonioara 4:05d5aa4d3f2d 472
marcoantonioara 4:05d5aa4d3f2d 473 /***************************************************************************//**
marcoantonioara 4:05d5aa4d3f2d 474 * @brief
marcoantonioara 4:05d5aa4d3f2d 475 * Sends a PAUSE command to the Si1133
marcoantonioara 4:05d5aa4d3f2d 476 *
marcoantonioara 4:05d5aa4d3f2d 477 * @return
marcoantonioara 4:05d5aa4d3f2d 478 * Returns zero on OK, non-zero otherwise
marcoantonioara 4:05d5aa4d3f2d 479 ******************************************************************************/
marcoantonioara 4:05d5aa4d3f2d 480 uint32_t Si1133::pause_measurement(void)
marcoantonioara 4:05d5aa4d3f2d 481 {
marcoantonioara 4:05d5aa4d3f2d 482 return send_cmd(CMD_PAUSE_CH);
marcoantonioara 4:05d5aa4d3f2d 483 }
marcoantonioara 4:05d5aa4d3f2d 484
marcoantonioara 4:05d5aa4d3f2d 485 /***************************************************************************//**
marcoantonioara 4:05d5aa4d3f2d 486 * @brief
marcoantonioara 4:05d5aa4d3f2d 487 * Writes a byte to an Si1133 Parameter
marcoantonioara 4:05d5aa4d3f2d 488 *
marcoantonioara 4:05d5aa4d3f2d 489 * @param[in] address
marcoantonioara 4:05d5aa4d3f2d 490 * The parameter address
marcoantonioara 4:05d5aa4d3f2d 491 *
marcoantonioara 4:05d5aa4d3f2d 492 * @param[in] value
marcoantonioara 4:05d5aa4d3f2d 493 * The byte value to be written to the Si1133 parameter
marcoantonioara 4:05d5aa4d3f2d 494 *
marcoantonioara 4:05d5aa4d3f2d 495 * @return
marcoantonioara 4:05d5aa4d3f2d 496 * Returns zero on OK, non-zero otherwise
marcoantonioara 4:05d5aa4d3f2d 497 *
marcoantonioara 4:05d5aa4d3f2d 498 * @note
marcoantonioara 4:05d5aa4d3f2d 499 * This function ensures that the Si1133 is idle and ready to
marcoantonioara 4:05d5aa4d3f2d 500 * receive a command before writing the parameter. Furthermore,
marcoantonioara 4:05d5aa4d3f2d 501 * command completion is checked. If setting parameter is not done
marcoantonioara 4:05d5aa4d3f2d 502 * properly, no measurements will occur. This is the most common
marcoantonioara 4:05d5aa4d3f2d 503 * error. It is highly recommended that host code make use of this
marcoantonioara 4:05d5aa4d3f2d 504 * function.
marcoantonioara 4:05d5aa4d3f2d 505 ******************************************************************************/
marcoantonioara 4:05d5aa4d3f2d 506 uint32_t Si1133::set_parameter (enum Si1133::Parameter address, uint8_t value)
marcoantonioara 4:05d5aa4d3f2d 507 {
marcoantonioara 4:05d5aa4d3f2d 508 uint32_t retval;
marcoantonioara 4:05d5aa4d3f2d 509 uint8_t buffer[2];
marcoantonioara 4:05d5aa4d3f2d 510 uint8_t response_stored;
marcoantonioara 4:05d5aa4d3f2d 511 uint8_t response;
marcoantonioara 4:05d5aa4d3f2d 512 size_t count;
marcoantonioara 4:05d5aa4d3f2d 513
marcoantonioara 4:05d5aa4d3f2d 514 retval = wait_until_sleep();
marcoantonioara 4:05d5aa4d3f2d 515 if ( retval != SI1133_OK ) {
marcoantonioara 4:05d5aa4d3f2d 516 return retval;
marcoantonioara 4:05d5aa4d3f2d 517 }
marcoantonioara 4:05d5aa4d3f2d 518
marcoantonioara 4:05d5aa4d3f2d 519 read_register(REG_RESPONSE0, &response_stored);
marcoantonioara 4:05d5aa4d3f2d 520 response_stored &= (uint8_t)RSP0_COUNTER_MASK;
marcoantonioara 4:05d5aa4d3f2d 521
marcoantonioara 4:05d5aa4d3f2d 522 buffer[0] = value;
marcoantonioara 4:05d5aa4d3f2d 523 buffer[1] = 0x80 + ((uint8_t)address & 0x3F);
marcoantonioara 4:05d5aa4d3f2d 524
marcoantonioara 4:05d5aa4d3f2d 525 retval = write_register_block(REG_HOSTIN0, 2, (uint8_t*) buffer);
marcoantonioara 4:05d5aa4d3f2d 526 if ( retval != SI1133_OK ) {
marcoantonioara 4:05d5aa4d3f2d 527 return retval;
marcoantonioara 4:05d5aa4d3f2d 528 }
marcoantonioara 4:05d5aa4d3f2d 529
marcoantonioara 4:05d5aa4d3f2d 530 /* Wait for command to finish */
marcoantonioara 4:05d5aa4d3f2d 531 count = 0;
marcoantonioara 4:05d5aa4d3f2d 532 /* Expect a change in the response register */
marcoantonioara 4:05d5aa4d3f2d 533 while ( count < 5 ) {
marcoantonioara 4:05d5aa4d3f2d 534 retval = read_register(REG_RESPONSE0, &response);
marcoantonioara 4:05d5aa4d3f2d 535 if ( (response & (uint8_t)RSP0_COUNTER_MASK) != response_stored ) {
marcoantonioara 4:05d5aa4d3f2d 536 break;
marcoantonioara 4:05d5aa4d3f2d 537 } else {
marcoantonioara 4:05d5aa4d3f2d 538 if ( retval != SI1133_OK ) {
marcoantonioara 4:05d5aa4d3f2d 539 return retval;
marcoantonioara 4:05d5aa4d3f2d 540 }
marcoantonioara 4:05d5aa4d3f2d 541 }
marcoantonioara 4:05d5aa4d3f2d 542
marcoantonioara 4:05d5aa4d3f2d 543 count++;
marcoantonioara 4:05d5aa4d3f2d 544 }
marcoantonioara 4:05d5aa4d3f2d 545
marcoantonioara 4:05d5aa4d3f2d 546 if (count >= 5) {
marcoantonioara 4:05d5aa4d3f2d 547 return SI1133_ERROR_I2C_TRANSACTION_FAILED;
marcoantonioara 4:05d5aa4d3f2d 548 }
marcoantonioara 4:05d5aa4d3f2d 549
marcoantonioara 4:05d5aa4d3f2d 550 return SI1133_OK;
marcoantonioara 4:05d5aa4d3f2d 551 }
marcoantonioara 4:05d5aa4d3f2d 552
marcoantonioara 4:05d5aa4d3f2d 553 /***************************************************************************//**
marcoantonioara 4:05d5aa4d3f2d 554 * @brief
marcoantonioara 4:05d5aa4d3f2d 555 * Reads a parameter from the Si1133
marcoantonioara 4:05d5aa4d3f2d 556 *
marcoantonioara 4:05d5aa4d3f2d 557 * @param[in] address
marcoantonioara 4:05d5aa4d3f2d 558 * The address of the parameter.
marcoantonioara 4:05d5aa4d3f2d 559 *
marcoantonioara 4:05d5aa4d3f2d 560 * @return
marcoantonioara 4:05d5aa4d3f2d 561 * Returns zero on OK, non-zero otherwise
marcoantonioara 4:05d5aa4d3f2d 562 ******************************************************************************/
marcoantonioara 4:05d5aa4d3f2d 563 uint32_t Si1133::read_parameter (enum Si1133::Parameter address)
marcoantonioara 4:05d5aa4d3f2d 564 {
marcoantonioara 4:05d5aa4d3f2d 565 uint8_t retval;
marcoantonioara 4:05d5aa4d3f2d 566 uint8_t cmd;
marcoantonioara 4:05d5aa4d3f2d 567
marcoantonioara 4:05d5aa4d3f2d 568 cmd = 0x40 + ((uint8_t)address & 0x3F);
marcoantonioara 4:05d5aa4d3f2d 569
marcoantonioara 4:05d5aa4d3f2d 570 retval = send_cmd((enum Si1133::Command)cmd);
marcoantonioara 4:05d5aa4d3f2d 571 if ( retval != SI1133_OK ) {
marcoantonioara 4:05d5aa4d3f2d 572 return retval;
marcoantonioara 4:05d5aa4d3f2d 573 }
marcoantonioara 4:05d5aa4d3f2d 574
marcoantonioara 4:05d5aa4d3f2d 575 read_register(REG_RESPONSE1, &retval);
marcoantonioara 4:05d5aa4d3f2d 576
marcoantonioara 4:05d5aa4d3f2d 577 return retval;
marcoantonioara 4:05d5aa4d3f2d 578 }
marcoantonioara 4:05d5aa4d3f2d 579
marcoantonioara 4:05d5aa4d3f2d 580 /**************************************************************************//**
marcoantonioara 4:05d5aa4d3f2d 581 * @brief
marcoantonioara 4:05d5aa4d3f2d 582 * Initializes the Si1133 chip
marcoantonioara 4:05d5aa4d3f2d 583 *
marcoantonioara 4:05d5aa4d3f2d 584 * @return
marcoantonioara 4:05d5aa4d3f2d 585 * Returns zero on OK, non-zero otherwise
marcoantonioara 4:05d5aa4d3f2d 586 *****************************************************************************/
marcoantonioara 4:05d5aa4d3f2d 587 uint32_t Si1133::init (void)
marcoantonioara 4:05d5aa4d3f2d 588 {
marcoantonioara 4:05d5aa4d3f2d 589 uint32_t retval;
marcoantonioara 4:05d5aa4d3f2d 590
marcoantonioara 4:05d5aa4d3f2d 591 /* Allow some time for the part to power up */
marcoantonioara 4:05d5aa4d3f2d 592 wait_ms(5);
marcoantonioara 4:05d5aa4d3f2d 593
marcoantonioara 4:05d5aa4d3f2d 594 retval = reset();
marcoantonioara 4:05d5aa4d3f2d 595
marcoantonioara 4:05d5aa4d3f2d 596 wait_ms(10);
marcoantonioara 4:05d5aa4d3f2d 597
marcoantonioara 4:05d5aa4d3f2d 598 retval += set_parameter(PARAM_CH_LIST, 0x0f);
marcoantonioara 4:05d5aa4d3f2d 599 retval += set_parameter(PARAM_ADCCONFIG0, 0x78);
marcoantonioara 4:05d5aa4d3f2d 600 retval += set_parameter(PARAM_ADCSENS0, 0x71);
marcoantonioara 4:05d5aa4d3f2d 601 retval += set_parameter(PARAM_ADCPOST0, 0x40);
marcoantonioara 4:05d5aa4d3f2d 602 retval += set_parameter(PARAM_ADCCONFIG1, 0x4d);
marcoantonioara 4:05d5aa4d3f2d 603 retval += set_parameter(PARAM_ADCSENS1, 0xe1);
marcoantonioara 4:05d5aa4d3f2d 604 retval += set_parameter(PARAM_ADCPOST1, 0x40);
marcoantonioara 4:05d5aa4d3f2d 605 retval += set_parameter(PARAM_ADCCONFIG2, 0x41);
marcoantonioara 4:05d5aa4d3f2d 606 retval += set_parameter(PARAM_ADCSENS2, 0xe1);
marcoantonioara 4:05d5aa4d3f2d 607 retval += set_parameter(PARAM_ADCPOST2, 0x50);
marcoantonioara 4:05d5aa4d3f2d 608 retval += set_parameter(PARAM_ADCCONFIG3, 0x4d);
marcoantonioara 4:05d5aa4d3f2d 609 retval += set_parameter(PARAM_ADCSENS3, 0x87);
marcoantonioara 4:05d5aa4d3f2d 610 retval += set_parameter(PARAM_ADCPOST3, 0x40);
marcoantonioara 4:05d5aa4d3f2d 611
marcoantonioara 4:05d5aa4d3f2d 612 retval += write_register(REG_IRQ_ENABLE, 0x0f);
marcoantonioara 4:05d5aa4d3f2d 613
marcoantonioara 4:05d5aa4d3f2d 614 return retval;
marcoantonioara 4:05d5aa4d3f2d 615 }
marcoantonioara 4:05d5aa4d3f2d 616
marcoantonioara 4:05d5aa4d3f2d 617 /***************************************************************************//**
marcoantonioara 4:05d5aa4d3f2d 618 * @brief
marcoantonioara 4:05d5aa4d3f2d 619 * Stops the measurements on all channel and waits until the chip
marcoantonioara 4:05d5aa4d3f2d 620 * goes to sleep state.
marcoantonioara 4:05d5aa4d3f2d 621 *
marcoantonioara 4:05d5aa4d3f2d 622 * @return
marcoantonioara 4:05d5aa4d3f2d 623 * Returns zero on OK, non-zero otherwise
marcoantonioara 4:05d5aa4d3f2d 624 ******************************************************************************/
marcoantonioara 4:05d5aa4d3f2d 625 uint32_t Si1133::deinit (void)
marcoantonioara 4:05d5aa4d3f2d 626 {
marcoantonioara 4:05d5aa4d3f2d 627 uint32_t retval;
marcoantonioara 4:05d5aa4d3f2d 628
marcoantonioara 4:05d5aa4d3f2d 629 retval = set_parameter(PARAM_CH_LIST, 0x3f);
marcoantonioara 4:05d5aa4d3f2d 630 retval += pause_measurement();
marcoantonioara 4:05d5aa4d3f2d 631 retval += wait_until_sleep();
marcoantonioara 4:05d5aa4d3f2d 632
marcoantonioara 4:05d5aa4d3f2d 633 return retval;
marcoantonioara 4:05d5aa4d3f2d 634 }
marcoantonioara 4:05d5aa4d3f2d 635
marcoantonioara 4:05d5aa4d3f2d 636 /***************************************************************************//**
marcoantonioara 4:05d5aa4d3f2d 637 * @brief
marcoantonioara 4:05d5aa4d3f2d 638 * Read samples from the Si1133 chip
marcoantonioara 4:05d5aa4d3f2d 639 *
marcoantonioara 4:05d5aa4d3f2d 640 * @param[out] samples
marcoantonioara 4:05d5aa4d3f2d 641 * Retrieves interrupt status and measurement data for channel 0..3 and
marcoantonioara 4:05d5aa4d3f2d 642 * converts the data to int32_t format
marcoantonioara 4:05d5aa4d3f2d 643 *
marcoantonioara 4:05d5aa4d3f2d 644 * @return
marcoantonioara 4:05d5aa4d3f2d 645 * Returns zero on OK, non-zero otherwise
marcoantonioara 4:05d5aa4d3f2d 646 ******************************************************************************/
marcoantonioara 4:05d5aa4d3f2d 647 uint32_t Si1133::measure (Si1133::Samples_t *samples)
marcoantonioara 4:05d5aa4d3f2d 648 {
marcoantonioara 4:05d5aa4d3f2d 649 uint8_t buffer[13];
marcoantonioara 4:05d5aa4d3f2d 650 uint32_t retval;
marcoantonioara 4:05d5aa4d3f2d 651
marcoantonioara 4:05d5aa4d3f2d 652 retval = read_register_block(REG_IRQ_STATUS, 13, buffer);
marcoantonioara 4:05d5aa4d3f2d 653
marcoantonioara 4:05d5aa4d3f2d 654 samples->irq_status = buffer[0];
marcoantonioara 4:05d5aa4d3f2d 655
marcoantonioara 4:05d5aa4d3f2d 656 samples->ch0 = buffer[1] << 16;
marcoantonioara 4:05d5aa4d3f2d 657 samples->ch0 |= buffer[2] << 8;
marcoantonioara 4:05d5aa4d3f2d 658 samples->ch0 |= buffer[3];
marcoantonioara 4:05d5aa4d3f2d 659 if ( samples->ch0 & 0x800000 ) {
marcoantonioara 4:05d5aa4d3f2d 660 samples->ch0 |= 0xFF000000;
marcoantonioara 4:05d5aa4d3f2d 661 }
marcoantonioara 4:05d5aa4d3f2d 662
marcoantonioara 4:05d5aa4d3f2d 663 samples->ch1 = buffer[4] << 16;
marcoantonioara 4:05d5aa4d3f2d 664 samples->ch1 |= buffer[5] << 8;
marcoantonioara 4:05d5aa4d3f2d 665 samples->ch1 |= buffer[6];
marcoantonioara 4:05d5aa4d3f2d 666 if ( samples->ch1 & 0x800000 ) {
marcoantonioara 4:05d5aa4d3f2d 667 samples->ch1 |= 0xFF000000;
marcoantonioara 4:05d5aa4d3f2d 668 }
marcoantonioara 4:05d5aa4d3f2d 669
marcoantonioara 4:05d5aa4d3f2d 670 samples->ch2 = buffer[7] << 16;
marcoantonioara 4:05d5aa4d3f2d 671 samples->ch2 |= buffer[8] << 8;
marcoantonioara 4:05d5aa4d3f2d 672 samples->ch2 |= buffer[9];
marcoantonioara 4:05d5aa4d3f2d 673 if ( samples->ch2 & 0x800000 ) {
marcoantonioara 4:05d5aa4d3f2d 674 samples->ch2 |= 0xFF000000;
marcoantonioara 4:05d5aa4d3f2d 675 }
marcoantonioara 4:05d5aa4d3f2d 676
marcoantonioara 4:05d5aa4d3f2d 677 samples->ch3 = buffer[10] << 16;
marcoantonioara 4:05d5aa4d3f2d 678 samples->ch3 |= buffer[11] << 8;
marcoantonioara 4:05d5aa4d3f2d 679 samples->ch3 |= buffer[12];
marcoantonioara 4:05d5aa4d3f2d 680 if ( samples->ch3 & 0x800000 ) {
marcoantonioara 4:05d5aa4d3f2d 681 samples->ch3 |= 0xFF000000;
marcoantonioara 4:05d5aa4d3f2d 682 }
marcoantonioara 4:05d5aa4d3f2d 683
marcoantonioara 4:05d5aa4d3f2d 684 return retval;
marcoantonioara 4:05d5aa4d3f2d 685 }
marcoantonioara 4:05d5aa4d3f2d 686
marcoantonioara 4:05d5aa4d3f2d 687 int32_t Si1133::calculate_polynomial_helper (int32_t input, int8_t fraction, uint16_t mag, int8_t shift)
marcoantonioara 4:05d5aa4d3f2d 688 {
marcoantonioara 4:05d5aa4d3f2d 689 int32_t value;
marcoantonioara 4:05d5aa4d3f2d 690
marcoantonioara 4:05d5aa4d3f2d 691 if ( shift < 0 ) {
marcoantonioara 4:05d5aa4d3f2d 692 value = ( (input << fraction) / mag) >> -shift;
marcoantonioara 4:05d5aa4d3f2d 693 } else {
marcoantonioara 4:05d5aa4d3f2d 694 value = ( (input << fraction) / mag) << shift;
marcoantonioara 4:05d5aa4d3f2d 695 }
marcoantonioara 4:05d5aa4d3f2d 696
marcoantonioara 4:05d5aa4d3f2d 697 return value;
marcoantonioara 4:05d5aa4d3f2d 698 }
marcoantonioara 4:05d5aa4d3f2d 699
marcoantonioara 4:05d5aa4d3f2d 700 int32_t Si1133::calculate_polynomial (int32_t x, int32_t y, uint8_t input_fraction, uint8_t output_fraction, uint8_t num_coeff, const Si1133::Coeff_t *kp)
marcoantonioara 4:05d5aa4d3f2d 701 {
marcoantonioara 4:05d5aa4d3f2d 702 uint8_t info, x_order, y_order, counter;
marcoantonioara 4:05d5aa4d3f2d 703 int8_t sign, shift;
marcoantonioara 4:05d5aa4d3f2d 704 uint16_t mag;
marcoantonioara 4:05d5aa4d3f2d 705 int32_t output = 0, x1, x2, y1, y2;
marcoantonioara 4:05d5aa4d3f2d 706
marcoantonioara 4:05d5aa4d3f2d 707 for ( counter = 0; counter < num_coeff; counter++ ) {
marcoantonioara 4:05d5aa4d3f2d 708 info = kp->info;
marcoantonioara 4:05d5aa4d3f2d 709 x_order = GET_X_ORDER(info);
marcoantonioara 4:05d5aa4d3f2d 710 y_order = GET_Y_ORDER(info);
marcoantonioara 4:05d5aa4d3f2d 711
marcoantonioara 4:05d5aa4d3f2d 712 shift = ( (uint16_t) kp->info & 0xff00) >> 8;
marcoantonioara 4:05d5aa4d3f2d 713 shift ^= 0x00ff;
marcoantonioara 4:05d5aa4d3f2d 714 shift += 1;
marcoantonioara 4:05d5aa4d3f2d 715 shift = -shift;
marcoantonioara 4:05d5aa4d3f2d 716
marcoantonioara 4:05d5aa4d3f2d 717 mag = kp->mag;
marcoantonioara 4:05d5aa4d3f2d 718
marcoantonioara 4:05d5aa4d3f2d 719 if ( GET_SIGN(info) ) {
marcoantonioara 4:05d5aa4d3f2d 720 sign = -1;
marcoantonioara 4:05d5aa4d3f2d 721 } else {
marcoantonioara 4:05d5aa4d3f2d 722 sign = 1;
marcoantonioara 4:05d5aa4d3f2d 723 }
marcoantonioara 4:05d5aa4d3f2d 724
marcoantonioara 4:05d5aa4d3f2d 725 if ( (x_order == 0) && (y_order == 0) ) {
marcoantonioara 4:05d5aa4d3f2d 726 output += sign * mag << output_fraction;
marcoantonioara 4:05d5aa4d3f2d 727 } else {
marcoantonioara 4:05d5aa4d3f2d 728 if ( x_order > 0 ) {
marcoantonioara 4:05d5aa4d3f2d 729 x1 = calculate_polynomial_helper(x, input_fraction, mag, shift);
marcoantonioara 4:05d5aa4d3f2d 730 if ( x_order > 1 ) {
marcoantonioara 4:05d5aa4d3f2d 731 x2 = calculate_polynomial_helper(x, input_fraction, mag, shift);
marcoantonioara 4:05d5aa4d3f2d 732 } else {
marcoantonioara 4:05d5aa4d3f2d 733 x2 = 1;
marcoantonioara 4:05d5aa4d3f2d 734 }
marcoantonioara 4:05d5aa4d3f2d 735 } else {
marcoantonioara 4:05d5aa4d3f2d 736 x1 = 1;
marcoantonioara 4:05d5aa4d3f2d 737 x2 = 1;
marcoantonioara 4:05d5aa4d3f2d 738 }
marcoantonioara 4:05d5aa4d3f2d 739
marcoantonioara 4:05d5aa4d3f2d 740 if ( y_order > 0 ) {
marcoantonioara 4:05d5aa4d3f2d 741 y1 = calculate_polynomial_helper(y, input_fraction, mag, shift);
marcoantonioara 4:05d5aa4d3f2d 742 if ( y_order > 1 ) {
marcoantonioara 4:05d5aa4d3f2d 743 y2 = calculate_polynomial_helper(y, input_fraction, mag, shift);
marcoantonioara 4:05d5aa4d3f2d 744 } else {
marcoantonioara 4:05d5aa4d3f2d 745 y2 = 1;
marcoantonioara 4:05d5aa4d3f2d 746 }
marcoantonioara 4:05d5aa4d3f2d 747 } else {
marcoantonioara 4:05d5aa4d3f2d 748 y1 = 1;
marcoantonioara 4:05d5aa4d3f2d 749 y2 = 1;
marcoantonioara 4:05d5aa4d3f2d 750 }
marcoantonioara 4:05d5aa4d3f2d 751
marcoantonioara 4:05d5aa4d3f2d 752 output += sign * x1 * x2 * y1 * y2;
marcoantonioara 4:05d5aa4d3f2d 753 }
marcoantonioara 4:05d5aa4d3f2d 754
marcoantonioara 4:05d5aa4d3f2d 755 kp++;
marcoantonioara 4:05d5aa4d3f2d 756 }
marcoantonioara 4:05d5aa4d3f2d 757
marcoantonioara 4:05d5aa4d3f2d 758 if ( output < 0 ) {
marcoantonioara 4:05d5aa4d3f2d 759 output = -output;
marcoantonioara 4:05d5aa4d3f2d 760 }
marcoantonioara 4:05d5aa4d3f2d 761
marcoantonioara 4:05d5aa4d3f2d 762 return output;
marcoantonioara 4:05d5aa4d3f2d 763 }
marcoantonioara 4:05d5aa4d3f2d 764
marcoantonioara 4:05d5aa4d3f2d 765 /***************************************************************************//**
marcoantonioara 4:05d5aa4d3f2d 766 * @brief
marcoantonioara 4:05d5aa4d3f2d 767 * Compute UV index
marcoantonioara 4:05d5aa4d3f2d 768 *
marcoantonioara 4:05d5aa4d3f2d 769 * @param[in] uv
marcoantonioara 4:05d5aa4d3f2d 770 * UV sensor raw data
marcoantonioara 4:05d5aa4d3f2d 771 *
marcoantonioara 4:05d5aa4d3f2d 772 * @param[in] uk
marcoantonioara 4:05d5aa4d3f2d 773 * UV calculation coefficients
marcoantonioara 4:05d5aa4d3f2d 774 *
marcoantonioara 4:05d5aa4d3f2d 775 * @return
marcoantonioara 4:05d5aa4d3f2d 776 * UV index scaled by UV_OUPTUT_FRACTION
marcoantonioara 4:05d5aa4d3f2d 777 ******************************************************************************/
marcoantonioara 4:05d5aa4d3f2d 778 int32_t Si1133::get_uv (int32_t uv)
marcoantonioara 4:05d5aa4d3f2d 779 {
marcoantonioara 4:05d5aa4d3f2d 780 int32_t uvi;
marcoantonioara 4:05d5aa4d3f2d 781
marcoantonioara 4:05d5aa4d3f2d 782 uvi = calculate_polynomial(0, uv, UV_INPUT_FRACTION, UV_OUTPUT_FRACTION, UV_NUMCOEFF, uk);
marcoantonioara 4:05d5aa4d3f2d 783
marcoantonioara 4:05d5aa4d3f2d 784 return uvi;
marcoantonioara 4:05d5aa4d3f2d 785 }
marcoantonioara 4:05d5aa4d3f2d 786
marcoantonioara 4:05d5aa4d3f2d 787 /***************************************************************************//**
marcoantonioara 4:05d5aa4d3f2d 788 * @brief
marcoantonioara 4:05d5aa4d3f2d 789 * Compute lux value
marcoantonioara 4:05d5aa4d3f2d 790 *
marcoantonioara 4:05d5aa4d3f2d 791 * @param[in] vis_high
marcoantonioara 4:05d5aa4d3f2d 792 * Visible light sensor raw data
marcoantonioara 4:05d5aa4d3f2d 793 *
marcoantonioara 4:05d5aa4d3f2d 794 * @param[in] vis_low
marcoantonioara 4:05d5aa4d3f2d 795 * Visible light sensor raw data
marcoantonioara 4:05d5aa4d3f2d 796 *
marcoantonioara 4:05d5aa4d3f2d 797 * @param[in] ir
marcoantonioara 4:05d5aa4d3f2d 798 * Infrared sensor raw data
marcoantonioara 4:05d5aa4d3f2d 799 *
marcoantonioara 4:05d5aa4d3f2d 800 * @param[in] lk
marcoantonioara 4:05d5aa4d3f2d 801 * Lux calculation coefficients
marcoantonioara 4:05d5aa4d3f2d 802 *
marcoantonioara 4:05d5aa4d3f2d 803 * @return
marcoantonioara 4:05d5aa4d3f2d 804 * Lux value scaled by LUX_OUPTUT_FRACTION
marcoantonioara 4:05d5aa4d3f2d 805 ******************************************************************************/
marcoantonioara 4:05d5aa4d3f2d 806 int32_t Si1133::get_lux (int32_t vis_high, int32_t vis_low, int32_t ir)
marcoantonioara 4:05d5aa4d3f2d 807 {
marcoantonioara 4:05d5aa4d3f2d 808 int32_t lux;
marcoantonioara 4:05d5aa4d3f2d 809
marcoantonioara 4:05d5aa4d3f2d 810 if ( (vis_high > ADC_THRESHOLD) || (ir > ADC_THRESHOLD) ) {
marcoantonioara 4:05d5aa4d3f2d 811 lux = calculate_polynomial(vis_high,
marcoantonioara 4:05d5aa4d3f2d 812 ir,
marcoantonioara 4:05d5aa4d3f2d 813 INPUT_FRACTION_HIGH,
marcoantonioara 4:05d5aa4d3f2d 814 LUX_OUTPUT_FRACTION,
marcoantonioara 4:05d5aa4d3f2d 815 NUMCOEFF_HIGH,
marcoantonioara 4:05d5aa4d3f2d 816 &(lk.coeff_high[0]) );
marcoantonioara 4:05d5aa4d3f2d 817 } else {
marcoantonioara 4:05d5aa4d3f2d 818 lux = calculate_polynomial(vis_low,
marcoantonioara 4:05d5aa4d3f2d 819 ir,
marcoantonioara 4:05d5aa4d3f2d 820 INPUT_FRACTION_LOW,
marcoantonioara 4:05d5aa4d3f2d 821 LUX_OUTPUT_FRACTION,
marcoantonioara 4:05d5aa4d3f2d 822 NUMCOEFF_LOW,
marcoantonioara 4:05d5aa4d3f2d 823 &(lk.coeff_low[0]) );
marcoantonioara 4:05d5aa4d3f2d 824 }
marcoantonioara 4:05d5aa4d3f2d 825
marcoantonioara 4:05d5aa4d3f2d 826 return lux;
marcoantonioara 4:05d5aa4d3f2d 827 }
marcoantonioara 4:05d5aa4d3f2d 828
marcoantonioara 4:05d5aa4d3f2d 829 /***************************************************************************//**
marcoantonioara 4:05d5aa4d3f2d 830 * @brief
marcoantonioara 4:05d5aa4d3f2d 831 * Measure lux and UV index using the Si1133 sensor
marcoantonioara 4:05d5aa4d3f2d 832 *
marcoantonioara 4:05d5aa4d3f2d 833 * @param[out] lux
marcoantonioara 4:05d5aa4d3f2d 834 * The measured ambient light illuminace in lux
marcoantonioara 4:05d5aa4d3f2d 835 *
marcoantonioara 4:05d5aa4d3f2d 836 * @param[out] uvi
marcoantonioara 4:05d5aa4d3f2d 837 * UV index
marcoantonioara 4:05d5aa4d3f2d 838 *
marcoantonioara 4:05d5aa4d3f2d 839 * @return
marcoantonioara 4:05d5aa4d3f2d 840 * Returns zero on OK, non-zero otherwise
marcoantonioara 4:05d5aa4d3f2d 841 ******************************************************************************/
marcoantonioara 4:05d5aa4d3f2d 842 uint32_t Si1133::measure_lux_uv (float *lux, float *uvi)
marcoantonioara 4:05d5aa4d3f2d 843 {
marcoantonioara 4:05d5aa4d3f2d 844 Si1133::Samples_t samples;
marcoantonioara 4:05d5aa4d3f2d 845 uint32_t retval;
marcoantonioara 4:05d5aa4d3f2d 846 uint8_t response;
marcoantonioara 4:05d5aa4d3f2d 847
marcoantonioara 4:05d5aa4d3f2d 848 /* Force measurement */
marcoantonioara 4:05d5aa4d3f2d 849 retval = force_measurement();
marcoantonioara 4:05d5aa4d3f2d 850
marcoantonioara 4:05d5aa4d3f2d 851 /* Go to sleep while the sensor does the conversion */
marcoantonioara 4:05d5aa4d3f2d 852 wait_ms(200);
marcoantonioara 4:05d5aa4d3f2d 853
marcoantonioara 4:05d5aa4d3f2d 854 /* Check if the measurement finished, if not then wait */
marcoantonioara 4:05d5aa4d3f2d 855 retval += read_register(REG_IRQ_STATUS, &response);
marcoantonioara 4:05d5aa4d3f2d 856 while ( response != 0x0F ) {
marcoantonioara 4:05d5aa4d3f2d 857 wait_ms(5);
marcoantonioara 4:05d5aa4d3f2d 858 retval += read_register(REG_IRQ_STATUS, &response);
marcoantonioara 4:05d5aa4d3f2d 859 }
marcoantonioara 4:05d5aa4d3f2d 860
marcoantonioara 4:05d5aa4d3f2d 861 /* Get the results */
marcoantonioara 4:05d5aa4d3f2d 862 measure(&samples);
marcoantonioara 4:05d5aa4d3f2d 863
marcoantonioara 4:05d5aa4d3f2d 864 /* Convert the readings to lux */
marcoantonioara 4:05d5aa4d3f2d 865 *lux = (float) get_lux(samples.ch1, samples.ch3, samples.ch2);
marcoantonioara 4:05d5aa4d3f2d 866 *lux = *lux / (1 << LUX_OUTPUT_FRACTION);
marcoantonioara 4:05d5aa4d3f2d 867
marcoantonioara 4:05d5aa4d3f2d 868 /* Convert the readings to UV index */
marcoantonioara 4:05d5aa4d3f2d 869 *uvi = (float) get_uv(samples.ch0);
marcoantonioara 4:05d5aa4d3f2d 870 *uvi = *uvi / (1 << UV_OUTPUT_FRACTION);
marcoantonioara 4:05d5aa4d3f2d 871
marcoantonioara 4:05d5aa4d3f2d 872 return retval;
marcoantonioara 4:05d5aa4d3f2d 873 }
marcoantonioara 4:05d5aa4d3f2d 874
marcoantonioara 4:05d5aa4d3f2d 875 /***************************************************************************//**
marcoantonioara 4:05d5aa4d3f2d 876 * @brief
marcoantonioara 4:05d5aa4d3f2d 877 * Reads Hardware ID from the SI1133 sensor
marcoantonioara 4:05d5aa4d3f2d 878 *
marcoantonioara 4:05d5aa4d3f2d 879 * @param[out] hardwareID
marcoantonioara 4:05d5aa4d3f2d 880 * The Hardware ID of the chip (should be 0x33)
marcoantonioara 4:05d5aa4d3f2d 881 *
marcoantonioara 4:05d5aa4d3f2d 882 * @return
marcoantonioara 4:05d5aa4d3f2d 883 * Returns zero on OK, non-zero otherwise
marcoantonioara 4:05d5aa4d3f2d 884 ******************************************************************************/
marcoantonioara 4:05d5aa4d3f2d 885 uint32_t Si1133::get_hardware_id (uint8_t *hardware_id)
marcoantonioara 4:05d5aa4d3f2d 886 {
marcoantonioara 4:05d5aa4d3f2d 887 uint32_t retval;
marcoantonioara 4:05d5aa4d3f2d 888
marcoantonioara 4:05d5aa4d3f2d 889 retval = read_register(REG_PART_ID, hardware_id);
marcoantonioara 4:05d5aa4d3f2d 890
marcoantonioara 4:05d5aa4d3f2d 891 return retval;
marcoantonioara 4:05d5aa4d3f2d 892 }
marcoantonioara 4:05d5aa4d3f2d 893
marcoantonioara 4:05d5aa4d3f2d 894 /***************************************************************************//**
marcoantonioara 4:05d5aa4d3f2d 895 * @brief
marcoantonioara 4:05d5aa4d3f2d 896 * Retrieve the sample values from the chip and convert them
marcoantonioara 4:05d5aa4d3f2d 897 * to lux and UV index values
marcoantonioara 4:05d5aa4d3f2d 898 *
marcoantonioara 4:05d5aa4d3f2d 899 * @param[out] lux
marcoantonioara 4:05d5aa4d3f2d 900 * The measured ambient light illuminace in lux
marcoantonioara 4:05d5aa4d3f2d 901 *
marcoantonioara 4:05d5aa4d3f2d 902 * @param[out] uvi
marcoantonioara 4:05d5aa4d3f2d 903 * UV index
marcoantonioara 4:05d5aa4d3f2d 904 *
marcoantonioara 4:05d5aa4d3f2d 905 * @return
marcoantonioara 4:05d5aa4d3f2d 906 * Returns zero on OK, non-zero otherwise
marcoantonioara 4:05d5aa4d3f2d 907 ******************************************************************************/
marcoantonioara 4:05d5aa4d3f2d 908 uint32_t Si1133::get_measurement (float *lux, float *uvi)
marcoantonioara 4:05d5aa4d3f2d 909 {
marcoantonioara 4:05d5aa4d3f2d 910 Si1133::Samples_t samples;
marcoantonioara 4:05d5aa4d3f2d 911 uint32_t retval;
marcoantonioara 4:05d5aa4d3f2d 912
marcoantonioara 4:05d5aa4d3f2d 913 /* Get the results */
marcoantonioara 4:05d5aa4d3f2d 914 retval = measure(&samples);
marcoantonioara 4:05d5aa4d3f2d 915
marcoantonioara 4:05d5aa4d3f2d 916 /* Convert the readings to lux */
marcoantonioara 4:05d5aa4d3f2d 917 *lux = (float) get_lux(samples.ch1, samples.ch3, samples.ch2);
marcoantonioara 4:05d5aa4d3f2d 918 *lux = *lux / (1 << LUX_OUTPUT_FRACTION);
marcoantonioara 4:05d5aa4d3f2d 919
marcoantonioara 4:05d5aa4d3f2d 920 /* Convert the readings to UV index */
marcoantonioara 4:05d5aa4d3f2d 921 *uvi = (float) get_uv(samples.ch0);
marcoantonioara 4:05d5aa4d3f2d 922 *uvi = *uvi / (1 << UV_OUTPUT_FRACTION);
marcoantonioara 4:05d5aa4d3f2d 923
marcoantonioara 4:05d5aa4d3f2d 924 return retval;
marcoantonioara 4:05d5aa4d3f2d 925 }
marcoantonioara 4:05d5aa4d3f2d 926