MAX31343 RTC Mbed Driver

MAX31343 RTC Driver

Committer:
Erman Komurcu
Date:
Tue Dec 01 13:32:54 2020 +0300
Revision:
0:aa73b3c9d246
initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Erman Komurcu 0:aa73b3c9d246 1 /*******************************************************************************
Erman Komurcu 0:aa73b3c9d246 2 * Copyright (C) Maxim Integrated Products, Inc., All Rights Reserved.
Erman Komurcu 0:aa73b3c9d246 3 *
Erman Komurcu 0:aa73b3c9d246 4 * Permission is hereby granted, free of charge, to any person obtaining a
Erman Komurcu 0:aa73b3c9d246 5 * copy of this software and associated documentation files (the "Software"),
Erman Komurcu 0:aa73b3c9d246 6 * to deal in the Software without restriction, including without limitation
Erman Komurcu 0:aa73b3c9d246 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
Erman Komurcu 0:aa73b3c9d246 8 * and/or sell copies of the Software, and to permit persons to whom the
Erman Komurcu 0:aa73b3c9d246 9 * Software is furnished to do so, subject to the following conditions:
Erman Komurcu 0:aa73b3c9d246 10 *
Erman Komurcu 0:aa73b3c9d246 11 * The above copyright notice and this permission notice shall be included
Erman Komurcu 0:aa73b3c9d246 12 * in all copies or substantial portions of the Software.
Erman Komurcu 0:aa73b3c9d246 13 *
Erman Komurcu 0:aa73b3c9d246 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
Erman Komurcu 0:aa73b3c9d246 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Erman Komurcu 0:aa73b3c9d246 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
Erman Komurcu 0:aa73b3c9d246 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
Erman Komurcu 0:aa73b3c9d246 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
Erman Komurcu 0:aa73b3c9d246 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
Erman Komurcu 0:aa73b3c9d246 20 * OTHER DEALINGS IN THE SOFTWARE.
Erman Komurcu 0:aa73b3c9d246 21 *
Erman Komurcu 0:aa73b3c9d246 22 * Except as contained in this notice, the name of Maxim Integrated
Erman Komurcu 0:aa73b3c9d246 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
Erman Komurcu 0:aa73b3c9d246 24 * Products, Inc. Branding Policy.
Erman Komurcu 0:aa73b3c9d246 25 *
Erman Komurcu 0:aa73b3c9d246 26 * The mere transfer of this software does not imply any licenses
Erman Komurcu 0:aa73b3c9d246 27 * of trade secrets, proprietary technology, copyrights, patents,
Erman Komurcu 0:aa73b3c9d246 28 * trademarks, maskwork rights, or any other form of intellectual
Erman Komurcu 0:aa73b3c9d246 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
Erman Komurcu 0:aa73b3c9d246 30 * ownership rights.
Erman Komurcu 0:aa73b3c9d246 31 *******************************************************************************
Erman Komurcu 0:aa73b3c9d246 32 */
Erman Komurcu 0:aa73b3c9d246 33
Erman Komurcu 0:aa73b3c9d246 34 #ifndef Max31343_H_
Erman Komurcu 0:aa73b3c9d246 35 #define Max31343_H_
Erman Komurcu 0:aa73b3c9d246 36
Erman Komurcu 0:aa73b3c9d246 37 #include "mbed.h"
Erman Komurcu 0:aa73b3c9d246 38 #include <ctime>
Erman Komurcu 0:aa73b3c9d246 39
Erman Komurcu 0:aa73b3c9d246 40
Erman Komurcu 0:aa73b3c9d246 41 /**
Erman Komurcu 0:aa73b3c9d246 42 * @brief RTC base driver class for Maxim Max3134x RTC series.
Erman Komurcu 0:aa73b3c9d246 43 */
Erman Komurcu 0:aa73b3c9d246 44 class Max31343
Erman Komurcu 0:aa73b3c9d246 45 {
Erman Komurcu 0:aa73b3c9d246 46 public:
Erman Komurcu 0:aa73b3c9d246 47
Erman Komurcu 0:aa73b3c9d246 48 /**
Erman Komurcu 0:aa73b3c9d246 49 * @brief Device register addresses
Erman Komurcu 0:aa73b3c9d246 50 */
Erman Komurcu 0:aa73b3c9d246 51 enum max31343_register_address {
Erman Komurcu 0:aa73b3c9d246 52 MAX31343_REG_INT_STATUS_REG_ADDR = 0x00,
Erman Komurcu 0:aa73b3c9d246 53 MAX31343_REG_INT_EN_REG_ADDR = 0x01,
Erman Komurcu 0:aa73b3c9d246 54 MAX31343_REG_RTC_RESET_ADDR = 0x02,
Erman Komurcu 0:aa73b3c9d246 55 MAX31343_REG_CONFIG_REG1_ADDR = 0x03,
Erman Komurcu 0:aa73b3c9d246 56 MAX31343_REG_CONFIG_REG2_ADDR = 0x04,
Erman Komurcu 0:aa73b3c9d246 57 MAX31343_REG_TIMER_CONFIG_ADDR = 0x05,
Erman Komurcu 0:aa73b3c9d246 58 MAX31343_REG_SECONDS_ADDR = 0x06,
Erman Komurcu 0:aa73b3c9d246 59 MAX31343_REG_MINUTES_ADDR = 0x07,
Erman Komurcu 0:aa73b3c9d246 60 MAX31343_REG_HOURS_ADDR = 0x08,
Erman Komurcu 0:aa73b3c9d246 61 MAX31343_REG_DAY_ADDR = 0x09,
Erman Komurcu 0:aa73b3c9d246 62 MAX31343_REG_DATE_ADDR = 0x0A,
Erman Komurcu 0:aa73b3c9d246 63 MAX31343_REG_MONTH_ADDR = 0x0B,
Erman Komurcu 0:aa73b3c9d246 64 MAX31343_REG_YEAR_ADDR = 0x0C,
Erman Komurcu 0:aa73b3c9d246 65 MAX31343_REG_ALM1_SEC_ADDR = 0x0D,
Erman Komurcu 0:aa73b3c9d246 66 MAX31343_REG_ALM1_MIN_ADDR = 0x0E,
Erman Komurcu 0:aa73b3c9d246 67 MAX31343_REG_ALM1_HRS_ADDR = 0x0F,
Erman Komurcu 0:aa73b3c9d246 68 MAX31343_REG_ALM1DAY_DATE_ADDR = 0x10,
Erman Komurcu 0:aa73b3c9d246 69 MAX31343_REG_ALM1_MON_ADDR = 0x11,
Erman Komurcu 0:aa73b3c9d246 70 MAX31343_REG_ALM1_YEAR_ADDR = 0x12,
Erman Komurcu 0:aa73b3c9d246 71 MAX31343_REG_ALM2_MIN_ADDR = 0x13,
Erman Komurcu 0:aa73b3c9d246 72 MAX31343_REG_ALM2_HRS_ADDR = 0x14,
Erman Komurcu 0:aa73b3c9d246 73 MAX31343_REG_ALM2DAY_DATE_ADDR = 0x15,
Erman Komurcu 0:aa73b3c9d246 74 MAX31343_REG_TIMER_COUNT_ADDR = 0x16,
Erman Komurcu 0:aa73b3c9d246 75 MAX31343_REG_TIMER_INIT_ADDR = 0x17,
Erman Komurcu 0:aa73b3c9d246 76 MAX31343_REG_PWR_MGMT_REG_ADDR = 0x18,
Erman Komurcu 0:aa73b3c9d246 77 MAX31343_REG_TRICKLE_REG_ADDR = 0x19,
Erman Komurcu 0:aa73b3c9d246 78 MAX31343_REG_TEMP_MSB_ADDR = 0x1A,
Erman Komurcu 0:aa73b3c9d246 79 MAX31343_REG_TEMP_LSB_ADDR = 0x1B,
Erman Komurcu 0:aa73b3c9d246 80 MAX31343_REG_TS_CONFIG_ADDR = 0x1C,
Erman Komurcu 0:aa73b3c9d246 81 MAX31343_REG_END,
Erman Komurcu 0:aa73b3c9d246 82 };
Erman Komurcu 0:aa73b3c9d246 83
Erman Komurcu 0:aa73b3c9d246 84 /**
Erman Komurcu 0:aa73b3c9d246 85 * @brief Uncompensated clock output frequency selection
Erman Komurcu 0:aa73b3c9d246 86 */
Erman Komurcu 0:aa73b3c9d246 87 typedef enum {
Erman Komurcu 0:aa73b3c9d246 88 CLKO_FREQ_1HZ, /**< 1Hz */
Erman Komurcu 0:aa73b3c9d246 89 CLKO_FREQ_2HZ, /**< 2Hz */
Erman Komurcu 0:aa73b3c9d246 90 CLKO_FREQ_4HZ, /**< 4Hz */
Erman Komurcu 0:aa73b3c9d246 91 CLKO_FREQ_8HZ, /**< 8Hz */
Erman Komurcu 0:aa73b3c9d246 92 CLKO_FREQ_16HZ, /**< 16Hz */
Erman Komurcu 0:aa73b3c9d246 93 CLKO_FREQ_32HZ, /**< 32Hz */
Erman Komurcu 0:aa73b3c9d246 94 CLKO_FREQ_64HZ, /**< 64Hz */
Erman Komurcu 0:aa73b3c9d246 95 CLKO_FREQ_128HZ, /**< 128Hz */
Erman Komurcu 0:aa73b3c9d246 96 CLKO_FREQ_32000HZ, /**< 32KHz */
Erman Komurcu 0:aa73b3c9d246 97 } clko_freq_t;
Erman Komurcu 0:aa73b3c9d246 98
Erman Komurcu 0:aa73b3c9d246 99 /**
Erman Komurcu 0:aa73b3c9d246 100 * @brief Square wave output frequency selection
Erman Komurcu 0:aa73b3c9d246 101 */
Erman Komurcu 0:aa73b3c9d246 102 typedef enum {
Erman Komurcu 0:aa73b3c9d246 103 SQUARE_WAVE_OUT_FREQ_1HZ, /**< 1Hz */
Erman Komurcu 0:aa73b3c9d246 104 SQUARE_WAVE_OUT_FREQ_2HZ, /**< 2Hz */
Erman Komurcu 0:aa73b3c9d246 105 SQUARE_WAVE_OUT_FREQ_4HZ, /**< 4Hz */
Erman Komurcu 0:aa73b3c9d246 106 SQUARE_WAVE_OUT_FREQ_8HZ, /**< 8Hz */
Erman Komurcu 0:aa73b3c9d246 107 SQUARE_WAVE_OUT_FREQ_16HZ, /**< 16Hz */
Erman Komurcu 0:aa73b3c9d246 108 SQUARE_WAVE_OUT_FREQ_32HZ, /**< 32Hz */
Erman Komurcu 0:aa73b3c9d246 109 } square_wave_out_freq_t;
Erman Komurcu 0:aa73b3c9d246 110
Erman Komurcu 0:aa73b3c9d246 111 /**
Erman Komurcu 0:aa73b3c9d246 112 * @brief Power fail threshold voltage
Erman Komurcu 0:aa73b3c9d246 113 */
Erman Komurcu 0:aa73b3c9d246 114 typedef enum {
Erman Komurcu 0:aa73b3c9d246 115 COMP_THRESH_1V85 = 1, /**< 1.85V */
Erman Komurcu 0:aa73b3c9d246 116 COMP_THRESH_2V15, /**< 2.15V */
Erman Komurcu 0:aa73b3c9d246 117 COMP_THRESH_2V40, /**< 2.40V */
Erman Komurcu 0:aa73b3c9d246 118 } comp_thresh_t;
Erman Komurcu 0:aa73b3c9d246 119
Erman Komurcu 0:aa73b3c9d246 120 /**
Erman Komurcu 0:aa73b3c9d246 121 * @brief Supply voltage select.
Erman Komurcu 0:aa73b3c9d246 122 */
Erman Komurcu 0:aa73b3c9d246 123 typedef enum {
Erman Komurcu 0:aa73b3c9d246 124 POW_MGMT_SUPPLY_SEL_AUTO, /**< Circuit decides whether to use VCC or VBACKUP */
Erman Komurcu 0:aa73b3c9d246 125 POW_MGMT_SUPPLY_SEL_VCC, /**< Use VCC as supply */
Erman Komurcu 0:aa73b3c9d246 126 POW_MGMT_SUPPLY_SEL_VBACK, /**< Use VBACKUP as supply */
Erman Komurcu 0:aa73b3c9d246 127 } power_mgmt_supply_t;
Erman Komurcu 0:aa73b3c9d246 128
Erman Komurcu 0:aa73b3c9d246 129 /**
Erman Komurcu 0:aa73b3c9d246 130 * @brief Selection of charging path's resistor value
Erman Komurcu 0:aa73b3c9d246 131 */
Erman Komurcu 0:aa73b3c9d246 132 typedef enum {
Erman Komurcu 0:aa73b3c9d246 133 TRICKLE_CHARGER_3K_S, /**< 3Kohm in series with a Schottky diode */
Erman Komurcu 0:aa73b3c9d246 134 TRICKLE_CHARGER_3K_2_S, /**< 3Kohm in series with a Schottky diode */
Erman Komurcu 0:aa73b3c9d246 135 TRICKLE_CHARGER_6K_S, /**< 6Kohm in series with a Schottky diode */
Erman Komurcu 0:aa73b3c9d246 136 TRICKLE_CHARGER_11K_S, /**< 11Kohm in series with a Schottky diode */
Erman Komurcu 0:aa73b3c9d246 137 TRICKLE_CHARGER_3K_D_S, /**< 3Kohm in series with a diode+Schottky diode */
Erman Komurcu 0:aa73b3c9d246 138 TRICKLE_CHARGER_3K_2_D_S, /**< 3Kohm in series with a diode+Schottky diode */
Erman Komurcu 0:aa73b3c9d246 139 TRICKLE_CHARGER_6K_D_S, /**< 6Kohm in series with a diode+Schottky diode */
Erman Komurcu 0:aa73b3c9d246 140 TRICKLE_CHARGER_11K_D_S, /**< 11Kohm in series with a diode+Schottky diode */
Erman Komurcu 0:aa73b3c9d246 141 TRICKLE_CHARGER_NO_CONNECTION, /**< No Connection */
Erman Komurcu 0:aa73b3c9d246 142 } trickle_charger_path_t;
Erman Komurcu 0:aa73b3c9d246 143
Erman Komurcu 0:aa73b3c9d246 144 /**
Erman Komurcu 0:aa73b3c9d246 145 * @brief Timer frequency selection
Erman Komurcu 0:aa73b3c9d246 146 */
Erman Komurcu 0:aa73b3c9d246 147 typedef enum {
Erman Komurcu 0:aa73b3c9d246 148 TIMER_FREQ_1024HZ, /**< 1024Hz */
Erman Komurcu 0:aa73b3c9d246 149 TIMER_FREQ_256HZ, /**< 256Hz */
Erman Komurcu 0:aa73b3c9d246 150 TIMER_FREQ_64HZ, /**< 64Hz */
Erman Komurcu 0:aa73b3c9d246 151 TIMER_FREQ_16HZ, /**< 16Hz */
Erman Komurcu 0:aa73b3c9d246 152 } timer_freq_t;
Erman Komurcu 0:aa73b3c9d246 153
Erman Komurcu 0:aa73b3c9d246 154 /**
Erman Komurcu 0:aa73b3c9d246 155 * @brief Selection of interrupt ids
Erman Komurcu 0:aa73b3c9d246 156 */
Erman Komurcu 0:aa73b3c9d246 157 typedef enum {
Erman Komurcu 0:aa73b3c9d246 158 INTR_ID_ALARM1 = 0, /**< Alarm1 flag */
Erman Komurcu 0:aa73b3c9d246 159 INTR_ID_ALARM2 = 1, /**< Alarm2 flag */
Erman Komurcu 0:aa73b3c9d246 160 INTR_ID_TIMER = 2, /**< Timer interrupt flag */
Erman Komurcu 0:aa73b3c9d246 161 INTR_ID_TEMP = 3, /**< Temp sense ready flag */
Erman Komurcu 0:aa73b3c9d246 162 INTR_ID_PFAIL = 5, /**< Power fail interrupt enable */
Erman Komurcu 0:aa73b3c9d246 163 INTR_ID_DOSF = 6, /**< Disable Oscillator flag */
Erman Komurcu 0:aa73b3c9d246 164 INTR_ID_END,
Erman Komurcu 0:aa73b3c9d246 165 } intr_id_t;
Erman Komurcu 0:aa73b3c9d246 166
Erman Komurcu 0:aa73b3c9d246 167 /**
Erman Komurcu 0:aa73b3c9d246 168 * @brief Alarm number selection
Erman Komurcu 0:aa73b3c9d246 169 */
Erman Komurcu 0:aa73b3c9d246 170 typedef enum {
Erman Komurcu 0:aa73b3c9d246 171 ALARM1, /**< Alarm number 1 */
Erman Komurcu 0:aa73b3c9d246 172 ALARM2, /**< Alarm number 2 */
Erman Komurcu 0:aa73b3c9d246 173 } alarm_no_t;
Erman Komurcu 0:aa73b3c9d246 174
Erman Komurcu 0:aa73b3c9d246 175 /**
Erman Komurcu 0:aa73b3c9d246 176 * @brief Alarm periodicity selection
Erman Komurcu 0:aa73b3c9d246 177 */
Erman Komurcu 0:aa73b3c9d246 178 typedef enum {
Erman Komurcu 0:aa73b3c9d246 179 ALARM_PERIOD_EVERYSECOND, /**< Once per second */
Erman Komurcu 0:aa73b3c9d246 180 ALARM_PERIOD_EVERYMINUTE, /**< Second match / Once per minute */
Erman Komurcu 0:aa73b3c9d246 181 ALARM_PERIOD_HOURLY, /**< Second and Minute match */
Erman Komurcu 0:aa73b3c9d246 182 ALARM_PERIOD_DAILY, /**< Hour, Minute and Second match*/
Erman Komurcu 0:aa73b3c9d246 183 ALARM_PERIOD_WEEKLY, /**< Day and Time match */
Erman Komurcu 0:aa73b3c9d246 184 ALARM_PERIOD_MONTHLY, /**< Date and Time match */
Erman Komurcu 0:aa73b3c9d246 185 ALARM_PERIOD_YEARLY, /**< Month, Date and Time match (Max31342 only) */
Erman Komurcu 0:aa73b3c9d246 186 ALARM_PERIOD_ONETIME, /**< Year, Month, Date and Time match (Max31342 only) */
Erman Komurcu 0:aa73b3c9d246 187 } alarm_period_t;
Erman Komurcu 0:aa73b3c9d246 188
Erman Komurcu 0:aa73b3c9d246 189 /**
Erman Komurcu 0:aa73b3c9d246 190 * @brief Selection of INTB/CLKOUT pin function
Erman Komurcu 0:aa73b3c9d246 191 */
Erman Komurcu 0:aa73b3c9d246 192 typedef enum {
Erman Komurcu 0:aa73b3c9d246 193 CONFIGURE_PIN_AS_CLKOUT, /**< Output is square wave */
Erman Komurcu 0:aa73b3c9d246 194 CONFIGURE_PIN_AS_INTB, /**< Output is interrupt */
Erman Komurcu 0:aa73b3c9d246 195 } config_intb_clkout_pin_t;
Erman Komurcu 0:aa73b3c9d246 196
Erman Komurcu 0:aa73b3c9d246 197 /**
Erman Komurcu 0:aa73b3c9d246 198 * @brief Temperature measurement interval for automatic mode
Erman Komurcu 0:aa73b3c9d246 199 */
Erman Komurcu 0:aa73b3c9d246 200 typedef enum {
Erman Komurcu 0:aa73b3c9d246 201 TTS_INTERNAL_1SEC = 0,
Erman Komurcu 0:aa73b3c9d246 202 TTS_INTERNAL_2SEC,
Erman Komurcu 0:aa73b3c9d246 203 TTS_INTERNAL_4SEC,
Erman Komurcu 0:aa73b3c9d246 204 TTS_INTERNAL_8SEC,
Erman Komurcu 0:aa73b3c9d246 205 TTS_INTERNAL_16SEC,
Erman Komurcu 0:aa73b3c9d246 206 TTS_INTERNAL_32SEC,
Erman Komurcu 0:aa73b3c9d246 207 TTS_INTERNAL_64SEC,
Erman Komurcu 0:aa73b3c9d246 208 TTS_INTERNAL_128SEC,
Erman Komurcu 0:aa73b3c9d246 209 } ttsint_t;
Erman Komurcu 0:aa73b3c9d246 210
Erman Komurcu 0:aa73b3c9d246 211 /**
Erman Komurcu 0:aa73b3c9d246 212 * @brief Base class constructor.
Erman Komurcu 0:aa73b3c9d246 213 *
Erman Komurcu 0:aa73b3c9d246 214 * @param[in] i2c Pointer to I2C bus object for this device.
Erman Komurcu 0:aa73b3c9d246 215 * @param[in] pin_int MCU's pin number that device's INT pin connected
Erman Komurcu 0:aa73b3c9d246 216 */
Erman Komurcu 0:aa73b3c9d246 217 Max31343(I2C *i2c, PinName pin_int = NC);
Erman Komurcu 0:aa73b3c9d246 218
Erman Komurcu 0:aa73b3c9d246 219 /**
Erman Komurcu 0:aa73b3c9d246 220 * @brief Function pointer type to interrupt handler function
Erman Komurcu 0:aa73b3c9d246 221 */
Erman Komurcu 0:aa73b3c9d246 222 typedef void (*interrupt_handler_function)(void *);
Erman Komurcu 0:aa73b3c9d246 223
Erman Komurcu 0:aa73b3c9d246 224 /**
Erman Komurcu 0:aa73b3c9d246 225 * @brief Read from a register.
Erman Komurcu 0:aa73b3c9d246 226 *
Erman Komurcu 0:aa73b3c9d246 227 * @param[in] reg Address of a register to be read.
Erman Komurcu 0:aa73b3c9d246 228 * @param[out] value Pointer to save result value.
Erman Komurcu 0:aa73b3c9d246 229 * @param[in] len Size of result to be read.
Erman Komurcu 0:aa73b3c9d246 230 *
Erman Komurcu 0:aa73b3c9d246 231 * @returns 0 on success, negative error code on failure.
Erman Komurcu 0:aa73b3c9d246 232 */
Erman Komurcu 0:aa73b3c9d246 233 int read_register(uint8_t reg, uint8_t *value, uint8_t len);
Erman Komurcu 0:aa73b3c9d246 234
Erman Komurcu 0:aa73b3c9d246 235 /**
Erman Komurcu 0:aa73b3c9d246 236 * @brief Write to a register.
Erman Komurcu 0:aa73b3c9d246 237 *
Erman Komurcu 0:aa73b3c9d246 238 * @param[in] reg Address of a register to be written.
Erman Komurcu 0:aa73b3c9d246 239 * @param[out] value Pointer of value to be written to register.
Erman Komurcu 0:aa73b3c9d246 240 * @param[in] len Size of result to be written.
Erman Komurcu 0:aa73b3c9d246 241 *
Erman Komurcu 0:aa73b3c9d246 242 * @returns 0 on success, negative error code on failure.
Erman Komurcu 0:aa73b3c9d246 243 */
Erman Komurcu 0:aa73b3c9d246 244 int write_register(uint8_t reg, const uint8_t *value, uint8_t len);
Erman Komurcu 0:aa73b3c9d246 245
Erman Komurcu 0:aa73b3c9d246 246 /**
Erman Komurcu 0:aa73b3c9d246 247 * @brief Read time info from RTC.
Erman Komurcu 0:aa73b3c9d246 248 *
Erman Komurcu 0:aa73b3c9d246 249 * @param[out] rtc_time Time info from RTC.
Erman Komurcu 0:aa73b3c9d246 250 *
Erman Komurcu 0:aa73b3c9d246 251 * @returns 0 on success, negative error code on failure.
Erman Komurcu 0:aa73b3c9d246 252 */
Erman Komurcu 0:aa73b3c9d246 253 int get_time(struct tm *rtc_ctime);
Erman Komurcu 0:aa73b3c9d246 254
Erman Komurcu 0:aa73b3c9d246 255 /**
Erman Komurcu 0:aa73b3c9d246 256 * @brief Set time info to RTC.
Erman Komurcu 0:aa73b3c9d246 257 *
Erman Komurcu 0:aa73b3c9d246 258 * @param[in] rtc_time Time info to be written to RTC.
Erman Komurcu 0:aa73b3c9d246 259 *
Erman Komurcu 0:aa73b3c9d246 260 * @returns 0 on success, negative error code on failure.
Erman Komurcu 0:aa73b3c9d246 261 */
Erman Komurcu 0:aa73b3c9d246 262 int set_time(const struct tm *rtc_ctime);
Erman Komurcu 0:aa73b3c9d246 263
Erman Komurcu 0:aa73b3c9d246 264 /**
Erman Komurcu 0:aa73b3c9d246 265 * @brief Set an alarm condition
Erman Komurcu 0:aa73b3c9d246 266 *
Erman Komurcu 0:aa73b3c9d246 267 * @param[in] alarm_no Alarm number, ALARM1 or ALARM2
Erman Komurcu 0:aa73b3c9d246 268 * @param[in] alarm_time Pointer to alarm time to be set
Erman Komurcu 0:aa73b3c9d246 269 * @param[in] period Alarm periodicity, one of ALARM_PERIOD_*
Erman Komurcu 0:aa73b3c9d246 270 *
Erman Komurcu 0:aa73b3c9d246 271 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 272 */
Erman Komurcu 0:aa73b3c9d246 273 int set_alarm(alarm_no_t alarm_no, const struct tm *alarm_time, alarm_period_t period);
Erman Komurcu 0:aa73b3c9d246 274
Erman Komurcu 0:aa73b3c9d246 275 /**
Erman Komurcu 0:aa73b3c9d246 276 * @brief Get alarm data & time
Erman Komurcu 0:aa73b3c9d246 277 *
Erman Komurcu 0:aa73b3c9d246 278 * @param[in] alarm_no Alarm number, ALARM1 or ALARM2
Erman Komurcu 0:aa73b3c9d246 279 * @param[out] alarm_time Pointer to alarm time to be filled in
Erman Komurcu 0:aa73b3c9d246 280 * @param[out] period Pointer to the period of alarm, one of ALARM_PERIOD_*
Erman Komurcu 0:aa73b3c9d246 281 * @param[out] is_enabled Pointer to the state of alarm
Erman Komurcu 0:aa73b3c9d246 282 *
Erman Komurcu 0:aa73b3c9d246 283 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 284 */
Erman Komurcu 0:aa73b3c9d246 285 int get_alarm(alarm_no_t alarm_no, struct tm *alarm_time, alarm_period_t *period, bool *is_enabled);
Erman Komurcu 0:aa73b3c9d246 286
Erman Komurcu 0:aa73b3c9d246 287 /**
Erman Komurcu 0:aa73b3c9d246 288 * @brief Set power fail threshold voltage
Erman Komurcu 0:aa73b3c9d246 289 *
Erman Komurcu 0:aa73b3c9d246 290 * @param[in] th Set Analog Comparator Threshold level, one of COMP_THRESH_*
Erman Komurcu 0:aa73b3c9d246 291 *
Erman Komurcu 0:aa73b3c9d246 292 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 293 */
Erman Komurcu 0:aa73b3c9d246 294 int powerfail_threshold_level(comp_thresh_t th);
Erman Komurcu 0:aa73b3c9d246 295
Erman Komurcu 0:aa73b3c9d246 296 /**
Erman Komurcu 0:aa73b3c9d246 297 * @brief Select device power source
Erman Komurcu 0:aa73b3c9d246 298 *
Erman Komurcu 0:aa73b3c9d246 299 * @param[in] supply Supply selection, one of POW_MGMT_SUPPLY_SEL_*
Erman Komurcu 0:aa73b3c9d246 300 *
Erman Komurcu 0:aa73b3c9d246 301 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 302 */
Erman Komurcu 0:aa73b3c9d246 303 int supply_select(power_mgmt_supply_t supply);
Erman Komurcu 0:aa73b3c9d246 304
Erman Komurcu 0:aa73b3c9d246 305 /**
Erman Komurcu 0:aa73b3c9d246 306 * @brief Configure trickle charger charging path, also enable it
Erman Komurcu 0:aa73b3c9d246 307 *
Erman Komurcu 0:aa73b3c9d246 308 * @param[in] path Value of resister + diodes
Erman Komurcu 0:aa73b3c9d246 309 *
Erman Komurcu 0:aa73b3c9d246 310 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 311 */
Erman Komurcu 0:aa73b3c9d246 312 int trickle_charger_enable(trickle_charger_path_t path);
Erman Komurcu 0:aa73b3c9d246 313
Erman Komurcu 0:aa73b3c9d246 314 /**
Erman Komurcu 0:aa73b3c9d246 315 * @brief Disable trickle charger
Erman Komurcu 0:aa73b3c9d246 316 *
Erman Komurcu 0:aa73b3c9d246 317 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 318 */
Erman Komurcu 0:aa73b3c9d246 319 int trickle_charger_disable();
Erman Komurcu 0:aa73b3c9d246 320
Erman Komurcu 0:aa73b3c9d246 321 /**
Erman Komurcu 0:aa73b3c9d246 322 * @brief Select square wave output frequency selection
Erman Komurcu 0:aa73b3c9d246 323 *
Erman Komurcu 0:aa73b3c9d246 324 * @param[in] freq Clock frequency, one of SQUARE_WAVE_OUT_FREQ_*
Erman Komurcu 0:aa73b3c9d246 325 *
Erman Komurcu 0:aa73b3c9d246 326 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 327 */
Erman Komurcu 0:aa73b3c9d246 328 int set_output_square_wave_frequency(square_wave_out_freq_t freq);
Erman Komurcu 0:aa73b3c9d246 329
Erman Komurcu 0:aa73b3c9d246 330 /**
Erman Komurcu 0:aa73b3c9d246 331 * @brief Enable CLKO
Erman Komurcu 0:aa73b3c9d246 332 *
Erman Komurcu 0:aa73b3c9d246 333 * @param[in] freq Clock frequency, one of CLKO_FREQ_*
Erman Komurcu 0:aa73b3c9d246 334 *
Erman Komurcu 0:aa73b3c9d246 335 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 336 */
Erman Komurcu 0:aa73b3c9d246 337 int clko_enable(clko_freq_t freq);
Erman Komurcu 0:aa73b3c9d246 338
Erman Komurcu 0:aa73b3c9d246 339 /**
Erman Komurcu 0:aa73b3c9d246 340 * @brief Disable CLKO
Erman Komurcu 0:aa73b3c9d246 341 *
Erman Komurcu 0:aa73b3c9d246 342 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 343 */
Erman Komurcu 0:aa73b3c9d246 344 int clko_disable();
Erman Komurcu 0:aa73b3c9d246 345
Erman Komurcu 0:aa73b3c9d246 346 /**
Erman Komurcu 0:aa73b3c9d246 347 * @brief Initialize timer
Erman Komurcu 0:aa73b3c9d246 348 *
Erman Komurcu 0:aa73b3c9d246 349 * @param[in] value Timer initial value
Erman Komurcu 0:aa73b3c9d246 350 * @param[in] repeat Timer repeat mode enable/disable
Erman Komurcu 0:aa73b3c9d246 351 * @param[in] freq Timer frequency, one of TIMER_FREQ_*
Erman Komurcu 0:aa73b3c9d246 352 *
Erman Komurcu 0:aa73b3c9d246 353 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 354 */
Erman Komurcu 0:aa73b3c9d246 355 int timer_init(uint8_t value, bool repeat, timer_freq_t freq);
Erman Komurcu 0:aa73b3c9d246 356
Erman Komurcu 0:aa73b3c9d246 357 /**
Erman Komurcu 0:aa73b3c9d246 358 * @brief Read timer value
Erman Komurcu 0:aa73b3c9d246 359 *
Erman Komurcu 0:aa73b3c9d246 360 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 361 */
Erman Komurcu 0:aa73b3c9d246 362 uint8_t timer_get();
Erman Komurcu 0:aa73b3c9d246 363
Erman Komurcu 0:aa73b3c9d246 364 /**
Erman Komurcu 0:aa73b3c9d246 365 * @brief Enable timer
Erman Komurcu 0:aa73b3c9d246 366 *
Erman Komurcu 0:aa73b3c9d246 367 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 368 */
Erman Komurcu 0:aa73b3c9d246 369 int timer_start();
Erman Komurcu 0:aa73b3c9d246 370
Erman Komurcu 0:aa73b3c9d246 371 /**
Erman Komurcu 0:aa73b3c9d246 372 * @brief Pause timer, timer value is preserved
Erman Komurcu 0:aa73b3c9d246 373 *
Erman Komurcu 0:aa73b3c9d246 374 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 375 */
Erman Komurcu 0:aa73b3c9d246 376 int timer_pause();
Erman Komurcu 0:aa73b3c9d246 377
Erman Komurcu 0:aa73b3c9d246 378 /**
Erman Komurcu 0:aa73b3c9d246 379 * @brief Start timer from the paused value
Erman Komurcu 0:aa73b3c9d246 380 *
Erman Komurcu 0:aa73b3c9d246 381 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 382 */
Erman Komurcu 0:aa73b3c9d246 383 int timer_continue();
Erman Komurcu 0:aa73b3c9d246 384
Erman Komurcu 0:aa73b3c9d246 385 /**
Erman Komurcu 0:aa73b3c9d246 386 * @brief Disable timer
Erman Komurcu 0:aa73b3c9d246 387 *
Erman Komurcu 0:aa73b3c9d246 388 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 389 */
Erman Komurcu 0:aa73b3c9d246 390 int timer_stop();
Erman Komurcu 0:aa73b3c9d246 391
Erman Komurcu 0:aa73b3c9d246 392 /**
Erman Komurcu 0:aa73b3c9d246 393 * @brief Put device into data retention mode
Erman Komurcu 0:aa73b3c9d246 394 *
Erman Komurcu 0:aa73b3c9d246 395 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 396 */
Erman Komurcu 0:aa73b3c9d246 397 int data_retention_mode_enter();
Erman Komurcu 0:aa73b3c9d246 398
Erman Komurcu 0:aa73b3c9d246 399 /**
Erman Komurcu 0:aa73b3c9d246 400 * @brief Remove device from data retention mode
Erman Komurcu 0:aa73b3c9d246 401 *
Erman Komurcu 0:aa73b3c9d246 402 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 403 */
Erman Komurcu 0:aa73b3c9d246 404 int data_retention_mode_exit();
Erman Komurcu 0:aa73b3c9d246 405
Erman Komurcu 0:aa73b3c9d246 406 /**
Erman Komurcu 0:aa73b3c9d246 407 * @brief Enable I2C bus timeout mechanism
Erman Komurcu 0:aa73b3c9d246 408 *
Erman Komurcu 0:aa73b3c9d246 409 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 410 */
Erman Komurcu 0:aa73b3c9d246 411 int i2c_timeout_enable();
Erman Komurcu 0:aa73b3c9d246 412
Erman Komurcu 0:aa73b3c9d246 413 /**
Erman Komurcu 0:aa73b3c9d246 414 * @brief Disable I2C bus timeout mechanism
Erman Komurcu 0:aa73b3c9d246 415 *
Erman Komurcu 0:aa73b3c9d246 416 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 417 */
Erman Komurcu 0:aa73b3c9d246 418 int i2c_timeout_disable();
Erman Komurcu 0:aa73b3c9d246 419
Erman Komurcu 0:aa73b3c9d246 420 /**
Erman Komurcu 0:aa73b3c9d246 421 * @brief Read Temperature
Erman Komurcu 0:aa73b3c9d246 422 *
Erman Komurcu 0:aa73b3c9d246 423 * @param[out] temp temperature value
Erman Komurcu 0:aa73b3c9d246 424 *
Erman Komurcu 0:aa73b3c9d246 425 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 426 */
Erman Komurcu 0:aa73b3c9d246 427 int read_temp(float *temp);
Erman Komurcu 0:aa73b3c9d246 428
Erman Komurcu 0:aa73b3c9d246 429 /**
Erman Komurcu 0:aa73b3c9d246 430 * @brief Configure temperature sensor
Erman Komurcu 0:aa73b3c9d246 431 *
Erman Komurcu 0:aa73b3c9d246 432 * @param[in] automode temperature value
Erman Komurcu 0:aa73b3c9d246 433 * @param[in] interval temperature read interval for automode, one of
Erman Komurcu 0:aa73b3c9d246 434 * TTS_INTERNAL_*
Erman Komurcu 0:aa73b3c9d246 435 *
Erman Komurcu 0:aa73b3c9d246 436 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 437 */
Erman Komurcu 0:aa73b3c9d246 438 int temp_sensor_config(bool automode, ttsint_t interval = TTS_INTERNAL_1SEC);
Erman Komurcu 0:aa73b3c9d246 439
Erman Komurcu 0:aa73b3c9d246 440 /**
Erman Komurcu 0:aa73b3c9d246 441 * @brief Enable interrupt
Erman Komurcu 0:aa73b3c9d246 442 *
Erman Komurcu 0:aa73b3c9d246 443 * @param[in] id Interrupt id, one of INTR_ID_*
Erman Komurcu 0:aa73b3c9d246 444 *
Erman Komurcu 0:aa73b3c9d246 445 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 446 */
Erman Komurcu 0:aa73b3c9d246 447 int irq_enable(intr_id_t id);
Erman Komurcu 0:aa73b3c9d246 448
Erman Komurcu 0:aa73b3c9d246 449 /**
Erman Komurcu 0:aa73b3c9d246 450 * @brief Disable interrupt
Erman Komurcu 0:aa73b3c9d246 451 *
Erman Komurcu 0:aa73b3c9d246 452 * @param[in] id Interrupt id, one of INTR_ID_*
Erman Komurcu 0:aa73b3c9d246 453 *
Erman Komurcu 0:aa73b3c9d246 454 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 455 */
Erman Komurcu 0:aa73b3c9d246 456 int irq_disable(intr_id_t id);
Erman Komurcu 0:aa73b3c9d246 457
Erman Komurcu 0:aa73b3c9d246 458 /**
Erman Komurcu 0:aa73b3c9d246 459 * @brief Disable all interrupts
Erman Komurcu 0:aa73b3c9d246 460 *
Erman Komurcu 0:aa73b3c9d246 461 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 462 */
Erman Komurcu 0:aa73b3c9d246 463 int irq_disable_all();
Erman Komurcu 0:aa73b3c9d246 464
Erman Komurcu 0:aa73b3c9d246 465 /**
Erman Komurcu 0:aa73b3c9d246 466 * @brief Set interrupt handler for a specific interrupt id
Erman Komurcu 0:aa73b3c9d246 467 *
Erman Komurcu 0:aa73b3c9d246 468 * @param[in] id Interrupt id, one of INTR_ID_*
Erman Komurcu 0:aa73b3c9d246 469 * @param[in] func Interrupt handler function
Erman Komurcu 0:aa73b3c9d246 470 * @param[in] cb Interrupt handler data
Erman Komurcu 0:aa73b3c9d246 471 */
Erman Komurcu 0:aa73b3c9d246 472 void set_intr_handler(intr_id_t id, interrupt_handler_function func, void *cb);
Erman Komurcu 0:aa73b3c9d246 473
Erman Komurcu 0:aa73b3c9d246 474 /**
Erman Komurcu 0:aa73b3c9d246 475 * @brief Put device into reset state
Erman Komurcu 0:aa73b3c9d246 476 *
Erman Komurcu 0:aa73b3c9d246 477 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 478 */
Erman Komurcu 0:aa73b3c9d246 479 int sw_reset_assert();
Erman Komurcu 0:aa73b3c9d246 480
Erman Komurcu 0:aa73b3c9d246 481 /**
Erman Komurcu 0:aa73b3c9d246 482 * @brief Release device from reset state
Erman Komurcu 0:aa73b3c9d246 483 *
Erman Komurcu 0:aa73b3c9d246 484 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 485 */
Erman Komurcu 0:aa73b3c9d246 486 int sw_reset_release();
Erman Komurcu 0:aa73b3c9d246 487
Erman Komurcu 0:aa73b3c9d246 488 /**
Erman Komurcu 0:aa73b3c9d246 489 * @brief Enable the RTC oscillator
Erman Komurcu 0:aa73b3c9d246 490 *
Erman Komurcu 0:aa73b3c9d246 491 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 492 */
Erman Komurcu 0:aa73b3c9d246 493 int rtc_start();
Erman Komurcu 0:aa73b3c9d246 494
Erman Komurcu 0:aa73b3c9d246 495 /**
Erman Komurcu 0:aa73b3c9d246 496 * @brief Disable the RTC oscillator
Erman Komurcu 0:aa73b3c9d246 497 *
Erman Komurcu 0:aa73b3c9d246 498 * @return 0 on success, error code on failure
Erman Komurcu 0:aa73b3c9d246 499 */
Erman Komurcu 0:aa73b3c9d246 500 int rtc_stop();
Erman Komurcu 0:aa73b3c9d246 501
Erman Komurcu 0:aa73b3c9d246 502 /**
Erman Komurcu 0:aa73b3c9d246 503 * @brief Base class destructor.
Erman Komurcu 0:aa73b3c9d246 504 */
Erman Komurcu 0:aa73b3c9d246 505 ~Max31343();
Erman Komurcu 0:aa73b3c9d246 506
Erman Komurcu 0:aa73b3c9d246 507 protected:
Erman Komurcu 0:aa73b3c9d246 508 typedef struct {
Erman Komurcu 0:aa73b3c9d246 509 uint8_t config_reg1;
Erman Komurcu 0:aa73b3c9d246 510 uint8_t config_reg2;
Erman Komurcu 0:aa73b3c9d246 511 uint8_t int_ploarity_config;
Erman Komurcu 0:aa73b3c9d246 512 uint8_t timer_config;
Erman Komurcu 0:aa73b3c9d246 513 uint8_t int_en_reg;
Erman Komurcu 0:aa73b3c9d246 514 uint8_t int_status_reg;
Erman Komurcu 0:aa73b3c9d246 515 uint8_t seconds;
Erman Komurcu 0:aa73b3c9d246 516 uint8_t minutes;
Erman Komurcu 0:aa73b3c9d246 517 uint8_t hours;
Erman Komurcu 0:aa73b3c9d246 518 uint8_t day;
Erman Komurcu 0:aa73b3c9d246 519 uint8_t date;
Erman Komurcu 0:aa73b3c9d246 520 uint8_t month;
Erman Komurcu 0:aa73b3c9d246 521 uint8_t year;
Erman Komurcu 0:aa73b3c9d246 522 uint8_t alm1_sec;
Erman Komurcu 0:aa73b3c9d246 523 uint8_t alm1_min;
Erman Komurcu 0:aa73b3c9d246 524 uint8_t alm1_hrs;
Erman Komurcu 0:aa73b3c9d246 525 uint8_t alm1day_date;
Erman Komurcu 0:aa73b3c9d246 526 uint8_t alm1_mon;
Erman Komurcu 0:aa73b3c9d246 527 uint8_t alm1_year;
Erman Komurcu 0:aa73b3c9d246 528 uint8_t alm2_min;
Erman Komurcu 0:aa73b3c9d246 529 uint8_t alm2_hrs;
Erman Komurcu 0:aa73b3c9d246 530 uint8_t alm2day_date;
Erman Komurcu 0:aa73b3c9d246 531 uint8_t timer_count;
Erman Komurcu 0:aa73b3c9d246 532 uint8_t timer_init;
Erman Komurcu 0:aa73b3c9d246 533 uint8_t ram_start;
Erman Komurcu 0:aa73b3c9d246 534 uint8_t ram_end;
Erman Komurcu 0:aa73b3c9d246 535 uint8_t pwr_mgmt_reg;
Erman Komurcu 0:aa73b3c9d246 536 uint8_t trickle_reg;
Erman Komurcu 0:aa73b3c9d246 537 uint8_t clock_sync_delay;
Erman Komurcu 0:aa73b3c9d246 538 uint8_t temp_msb;
Erman Komurcu 0:aa73b3c9d246 539 uint8_t temp_lsb;
Erman Komurcu 0:aa73b3c9d246 540 uint8_t ts_config;
Erman Komurcu 0:aa73b3c9d246 541 } regmap_t;
Erman Komurcu 0:aa73b3c9d246 542
Erman Komurcu 0:aa73b3c9d246 543 typedef struct {
Erman Komurcu 0:aa73b3c9d246 544 union {
Erman Komurcu 0:aa73b3c9d246 545 unsigned char raw;
Erman Komurcu 0:aa73b3c9d246 546 struct {
Erman Komurcu 0:aa73b3c9d246 547 unsigned char seconds : 4; /**< RTC seconds value. */
Erman Komurcu 0:aa73b3c9d246 548 unsigned char sec_10 : 3; /**< RTC seconds in multiples of 10 */
Erman Komurcu 0:aa73b3c9d246 549 unsigned char : 1;
Erman Komurcu 0:aa73b3c9d246 550 } bits;
Erman Komurcu 0:aa73b3c9d246 551 struct {
Erman Komurcu 0:aa73b3c9d246 552 unsigned char value : 7;
Erman Komurcu 0:aa73b3c9d246 553 unsigned char : 1;
Erman Komurcu 0:aa73b3c9d246 554 } bcd;
Erman Komurcu 0:aa73b3c9d246 555 } seconds;
Erman Komurcu 0:aa73b3c9d246 556
Erman Komurcu 0:aa73b3c9d246 557 union {
Erman Komurcu 0:aa73b3c9d246 558 unsigned char raw;
Erman Komurcu 0:aa73b3c9d246 559 struct {
Erman Komurcu 0:aa73b3c9d246 560 unsigned char minutes : 4; /**< RTC minutes value */
Erman Komurcu 0:aa73b3c9d246 561 unsigned char min_10 : 3; /**< RTC minutes in multiples of 10 */
Erman Komurcu 0:aa73b3c9d246 562 unsigned char : 1;
Erman Komurcu 0:aa73b3c9d246 563 } bits;
Erman Komurcu 0:aa73b3c9d246 564 struct {
Erman Komurcu 0:aa73b3c9d246 565 unsigned char value : 7;
Erman Komurcu 0:aa73b3c9d246 566 unsigned char : 1;
Erman Komurcu 0:aa73b3c9d246 567 } bcd;
Erman Komurcu 0:aa73b3c9d246 568 } minutes;
Erman Komurcu 0:aa73b3c9d246 569
Erman Komurcu 0:aa73b3c9d246 570 union {
Erman Komurcu 0:aa73b3c9d246 571 unsigned char raw;
Erman Komurcu 0:aa73b3c9d246 572 struct {
Erman Komurcu 0:aa73b3c9d246 573 unsigned char hour : 4; /**< RTC hours value */
Erman Komurcu 0:aa73b3c9d246 574 unsigned char hr_10 : 2; /**< RTC hours in multiples of 10 */
Erman Komurcu 0:aa73b3c9d246 575 unsigned char : 2;
Erman Komurcu 0:aa73b3c9d246 576 } bits;
Erman Komurcu 0:aa73b3c9d246 577 struct {
Erman Komurcu 0:aa73b3c9d246 578 unsigned char value : 6;
Erman Komurcu 0:aa73b3c9d246 579 unsigned char : 2;
Erman Komurcu 0:aa73b3c9d246 580 } bcd;
Erman Komurcu 0:aa73b3c9d246 581 } hours;
Erman Komurcu 0:aa73b3c9d246 582
Erman Komurcu 0:aa73b3c9d246 583 union {
Erman Komurcu 0:aa73b3c9d246 584 unsigned char raw;
Erman Komurcu 0:aa73b3c9d246 585 struct {
Erman Komurcu 0:aa73b3c9d246 586 unsigned char day : 3; /**< RTC days */
Erman Komurcu 0:aa73b3c9d246 587 unsigned char : 5;
Erman Komurcu 0:aa73b3c9d246 588 } bits;
Erman Komurcu 0:aa73b3c9d246 589 struct {
Erman Komurcu 0:aa73b3c9d246 590 unsigned char value : 3;
Erman Komurcu 0:aa73b3c9d246 591 unsigned char : 5;
Erman Komurcu 0:aa73b3c9d246 592 } bcd;
Erman Komurcu 0:aa73b3c9d246 593 } day;
Erman Komurcu 0:aa73b3c9d246 594
Erman Komurcu 0:aa73b3c9d246 595 union {
Erman Komurcu 0:aa73b3c9d246 596 unsigned char raw;
Erman Komurcu 0:aa73b3c9d246 597 struct {
Erman Komurcu 0:aa73b3c9d246 598 unsigned char date : 4; /**< RTC date */
Erman Komurcu 0:aa73b3c9d246 599 unsigned char date_10 : 2; /**< RTC date in multiples of 10 */
Erman Komurcu 0:aa73b3c9d246 600 unsigned char : 2;
Erman Komurcu 0:aa73b3c9d246 601 } bits;
Erman Komurcu 0:aa73b3c9d246 602 struct {
Erman Komurcu 0:aa73b3c9d246 603 unsigned char value : 6;
Erman Komurcu 0:aa73b3c9d246 604 unsigned char : 2;
Erman Komurcu 0:aa73b3c9d246 605 } bcd;
Erman Komurcu 0:aa73b3c9d246 606 } date;
Erman Komurcu 0:aa73b3c9d246 607
Erman Komurcu 0:aa73b3c9d246 608 union {
Erman Komurcu 0:aa73b3c9d246 609 unsigned char raw;
Erman Komurcu 0:aa73b3c9d246 610 struct {
Erman Komurcu 0:aa73b3c9d246 611 unsigned char month : 4; /**< RTC months */
Erman Komurcu 0:aa73b3c9d246 612 unsigned char month_10 : 1; /**< RTC month in multiples of 10 */
Erman Komurcu 0:aa73b3c9d246 613 unsigned char : 2;
Erman Komurcu 0:aa73b3c9d246 614 unsigned char century : 1; /**< Century bit */
Erman Komurcu 0:aa73b3c9d246 615 } bits;
Erman Komurcu 0:aa73b3c9d246 616 struct {
Erman Komurcu 0:aa73b3c9d246 617 unsigned char value : 5;
Erman Komurcu 0:aa73b3c9d246 618 unsigned char : 3;
Erman Komurcu 0:aa73b3c9d246 619 } bcd;
Erman Komurcu 0:aa73b3c9d246 620 } month;
Erman Komurcu 0:aa73b3c9d246 621
Erman Komurcu 0:aa73b3c9d246 622 union {
Erman Komurcu 0:aa73b3c9d246 623 unsigned char raw;
Erman Komurcu 0:aa73b3c9d246 624 struct {
Erman Komurcu 0:aa73b3c9d246 625 unsigned char year : 4; /**< RTC years */
Erman Komurcu 0:aa73b3c9d246 626 unsigned char year_10 : 4; /**< RTC year multiples of 10 */
Erman Komurcu 0:aa73b3c9d246 627 } bits;
Erman Komurcu 0:aa73b3c9d246 628 struct {
Erman Komurcu 0:aa73b3c9d246 629 unsigned char value : 8;
Erman Komurcu 0:aa73b3c9d246 630 } bcd;
Erman Komurcu 0:aa73b3c9d246 631 } year;
Erman Komurcu 0:aa73b3c9d246 632 } rtc_time_regs_t;
Erman Komurcu 0:aa73b3c9d246 633
Erman Komurcu 0:aa73b3c9d246 634 typedef struct {
Erman Komurcu 0:aa73b3c9d246 635 union {
Erman Komurcu 0:aa73b3c9d246 636 unsigned char raw;
Erman Komurcu 0:aa73b3c9d246 637 struct {
Erman Komurcu 0:aa73b3c9d246 638 unsigned char seconds : 4; /**< Alarm1 seconds */
Erman Komurcu 0:aa73b3c9d246 639 unsigned char sec_10 : 3; /**< Alarm1 seconds in multiples of 10 */
Erman Komurcu 0:aa73b3c9d246 640 unsigned char a1m1 : 1; /**< Alarm1 mask bit for minutes */
Erman Komurcu 0:aa73b3c9d246 641 } bits;
Erman Komurcu 0:aa73b3c9d246 642 struct {
Erman Komurcu 0:aa73b3c9d246 643 unsigned char value : 7;
Erman Komurcu 0:aa73b3c9d246 644 unsigned char : 1;
Erman Komurcu 0:aa73b3c9d246 645 } bcd;
Erman Komurcu 0:aa73b3c9d246 646 } sec;
Erman Komurcu 0:aa73b3c9d246 647
Erman Komurcu 0:aa73b3c9d246 648 union {
Erman Komurcu 0:aa73b3c9d246 649 unsigned char raw;
Erman Komurcu 0:aa73b3c9d246 650 struct {
Erman Komurcu 0:aa73b3c9d246 651 unsigned char minutes : 4; /**< Alarm1 minutes */
Erman Komurcu 0:aa73b3c9d246 652 unsigned char min_10 : 3; /**< Alarm1 minutes in multiples of 10 */
Erman Komurcu 0:aa73b3c9d246 653 unsigned char a1m2 : 1; /**< Alarm1 mask bit for minutes */
Erman Komurcu 0:aa73b3c9d246 654 } bits;
Erman Komurcu 0:aa73b3c9d246 655 struct {
Erman Komurcu 0:aa73b3c9d246 656 unsigned char value : 7;
Erman Komurcu 0:aa73b3c9d246 657 unsigned char : 1;
Erman Komurcu 0:aa73b3c9d246 658 } bcd;
Erman Komurcu 0:aa73b3c9d246 659 } min;
Erman Komurcu 0:aa73b3c9d246 660
Erman Komurcu 0:aa73b3c9d246 661 union {
Erman Komurcu 0:aa73b3c9d246 662 unsigned char raw;
Erman Komurcu 0:aa73b3c9d246 663 struct {
Erman Komurcu 0:aa73b3c9d246 664 unsigned char hour : 4; /**< Alarm1 hours */
Erman Komurcu 0:aa73b3c9d246 665 unsigned char hr_10 : 2; /**< Alarm1 hours in multiples of 10 */
Erman Komurcu 0:aa73b3c9d246 666 unsigned char : 1;
Erman Komurcu 0:aa73b3c9d246 667 unsigned char a1m3 : 1; /**< Alarm1 mask bit for hours */
Erman Komurcu 0:aa73b3c9d246 668 } bits;
Erman Komurcu 0:aa73b3c9d246 669 struct {
Erman Komurcu 0:aa73b3c9d246 670 unsigned char value : 6;
Erman Komurcu 0:aa73b3c9d246 671 unsigned char : 2;
Erman Komurcu 0:aa73b3c9d246 672 } bcd;
Erman Komurcu 0:aa73b3c9d246 673 } hrs;
Erman Komurcu 0:aa73b3c9d246 674
Erman Komurcu 0:aa73b3c9d246 675 union {
Erman Komurcu 0:aa73b3c9d246 676 unsigned char raw;
Erman Komurcu 0:aa73b3c9d246 677 struct {
Erman Komurcu 0:aa73b3c9d246 678 unsigned char day_date : 4; /**< Alarm1 day/date */
Erman Komurcu 0:aa73b3c9d246 679 unsigned char date_10 : 2; /**< Alarm1 date in multiples of 10 */
Erman Komurcu 0:aa73b3c9d246 680 unsigned char dy_dt : 1;
Erman Komurcu 0:aa73b3c9d246 681 unsigned char a1m4 : 1; /**< Alarm1 mask bit for day/date */
Erman Komurcu 0:aa73b3c9d246 682 } bits;
Erman Komurcu 0:aa73b3c9d246 683 struct {
Erman Komurcu 0:aa73b3c9d246 684 unsigned char value : 3;
Erman Komurcu 0:aa73b3c9d246 685 unsigned char : 5;
Erman Komurcu 0:aa73b3c9d246 686 } bcd_day;
Erman Komurcu 0:aa73b3c9d246 687 struct {
Erman Komurcu 0:aa73b3c9d246 688 unsigned char value : 6;
Erman Komurcu 0:aa73b3c9d246 689 unsigned char : 2;
Erman Komurcu 0:aa73b3c9d246 690 } bcd_date;
Erman Komurcu 0:aa73b3c9d246 691 } day_date;
Erman Komurcu 0:aa73b3c9d246 692
Erman Komurcu 0:aa73b3c9d246 693 union {
Erman Komurcu 0:aa73b3c9d246 694 unsigned char raw;
Erman Komurcu 0:aa73b3c9d246 695 struct {
Erman Komurcu 0:aa73b3c9d246 696 unsigned char month : 4; /**< Alarm1 months */
Erman Komurcu 0:aa73b3c9d246 697 unsigned char month_10 : 1; /**< Alarm1 months in multiples of 10 */
Erman Komurcu 0:aa73b3c9d246 698 unsigned char : 1;
Erman Komurcu 0:aa73b3c9d246 699 unsigned char a1m6 : 1; /**< Alarm1 mask bit for year */
Erman Komurcu 0:aa73b3c9d246 700 unsigned char a1m5 : 1; /**< Alarm1 mask bit for month */
Erman Komurcu 0:aa73b3c9d246 701 } bits;
Erman Komurcu 0:aa73b3c9d246 702 struct {
Erman Komurcu 0:aa73b3c9d246 703 unsigned char value : 5;
Erman Komurcu 0:aa73b3c9d246 704 unsigned char : 3;
Erman Komurcu 0:aa73b3c9d246 705 } bcd;
Erman Komurcu 0:aa73b3c9d246 706 } mon;
Erman Komurcu 0:aa73b3c9d246 707
Erman Komurcu 0:aa73b3c9d246 708 union {
Erman Komurcu 0:aa73b3c9d246 709 unsigned char raw;
Erman Komurcu 0:aa73b3c9d246 710 struct {
Erman Komurcu 0:aa73b3c9d246 711 unsigned char year : 4; /* Alarm1 years */
Erman Komurcu 0:aa73b3c9d246 712 unsigned char year_10 : 4; /* Alarm1 multiples of 10 */
Erman Komurcu 0:aa73b3c9d246 713 } bits;
Erman Komurcu 0:aa73b3c9d246 714 struct {
Erman Komurcu 0:aa73b3c9d246 715 unsigned char value : 8;
Erman Komurcu 0:aa73b3c9d246 716 } bcd;
Erman Komurcu 0:aa73b3c9d246 717 } year;
Erman Komurcu 0:aa73b3c9d246 718 } alarm_regs_t;
Erman Komurcu 0:aa73b3c9d246 719
Erman Komurcu 0:aa73b3c9d246 720 typedef union {
Erman Komurcu 0:aa73b3c9d246 721 unsigned char raw;
Erman Komurcu 0:aa73b3c9d246 722 struct {
Erman Komurcu 0:aa73b3c9d246 723 unsigned char swrst : 1; /**< Active high software reset bit */
Erman Komurcu 0:aa73b3c9d246 724 unsigned char : 7;
Erman Komurcu 0:aa73b3c9d246 725 } bits;
Erman Komurcu 0:aa73b3c9d246 726 } rtc_reset_reg_t;
Erman Komurcu 0:aa73b3c9d246 727
Erman Komurcu 0:aa73b3c9d246 728 typedef union {
Erman Komurcu 0:aa73b3c9d246 729 unsigned char raw;
Erman Komurcu 0:aa73b3c9d246 730 struct {
Erman Komurcu 0:aa73b3c9d246 731 unsigned char : 1; /**< Reserved has to be set to 0. */
Erman Komurcu 0:aa73b3c9d246 732 unsigned char enosc : 1; /**< Oscillator is on when set to 0. Oscillator is off when set to 1. */
Erman Komurcu 0:aa73b3c9d246 733 unsigned char : 1;
Erman Komurcu 0:aa73b3c9d246 734 unsigned char i2c_timeout : 1; /**< I2C timeout Enable */
Erman Komurcu 0:aa73b3c9d246 735 unsigned char data_reten : 1; /**< Sets the circuit into data retention mode. */
Erman Komurcu 0:aa73b3c9d246 736 unsigned char : 3;
Erman Komurcu 0:aa73b3c9d246 737 } bits;
Erman Komurcu 0:aa73b3c9d246 738 } config_reg1_t;
Erman Komurcu 0:aa73b3c9d246 739
Erman Komurcu 0:aa73b3c9d246 740 typedef union {
Erman Komurcu 0:aa73b3c9d246 741 unsigned char raw;
Erman Komurcu 0:aa73b3c9d246 742 struct {
Erman Komurcu 0:aa73b3c9d246 743 unsigned char sqw_hz : 3; /**< When INTCN=0, set output clock on SQW to specified frequency */
Erman Komurcu 0:aa73b3c9d246 744 unsigned char clko_hz : 4; /**< Specify uncompensated clock frequency output on pin CLKO. */
Erman Komurcu 0:aa73b3c9d246 745 unsigned char enclko : 1; /**< CLKO enable */
Erman Komurcu 0:aa73b3c9d246 746 } bits;
Erman Komurcu 0:aa73b3c9d246 747 } config_reg2_t;
Erman Komurcu 0:aa73b3c9d246 748
Erman Komurcu 0:aa73b3c9d246 749 typedef union {
Erman Komurcu 0:aa73b3c9d246 750 unsigned char raw;
Erman Komurcu 0:aa73b3c9d246 751 struct {
Erman Komurcu 0:aa73b3c9d246 752 unsigned char tfs : 2; /**< Timer frequency selection */
Erman Komurcu 0:aa73b3c9d246 753 unsigned char trpt : 1; /**< Timer repeat mode. Controls the timer interrupt function along with TM. */
Erman Komurcu 0:aa73b3c9d246 754 unsigned char tpause : 1; /**< Timer Pause.*/
Erman Komurcu 0:aa73b3c9d246 755 unsigned char te : 1; /**< Timer enable */
Erman Komurcu 0:aa73b3c9d246 756 unsigned char : 3;
Erman Komurcu 0:aa73b3c9d246 757 } bits;
Erman Komurcu 0:aa73b3c9d246 758 } timer_config_t;
Erman Komurcu 0:aa73b3c9d246 759
Erman Komurcu 0:aa73b3c9d246 760 typedef union {
Erman Komurcu 0:aa73b3c9d246 761 unsigned char raw;
Erman Komurcu 0:aa73b3c9d246 762 struct {
Erman Komurcu 0:aa73b3c9d246 763 unsigned char : 2;
Erman Komurcu 0:aa73b3c9d246 764 unsigned char d_man_sel : 1; /**< Default low. When this bit is low, input control block decides which
Erman Komurcu 0:aa73b3c9d246 765 supply to use. When this bit is high, user can manually select
Erman Komurcu 0:aa73b3c9d246 766 whether to use V<sub>CC</sub> or VBACKUP as supply. */
Erman Komurcu 0:aa73b3c9d246 767 unsigned char d_vback_sel : 1; /**< Default low. When this bit is low, and
Erman Komurcu 0:aa73b3c9d246 768 D_MANUAL_SEL is high, V<sub>CC</sub> is switched to supply. When this bit is high, and
Erman Komurcu 0:aa73b3c9d246 769 D_MANUAL_SEL is high, V<sub>BACKUP</sub> is switched to supply. */
Erman Komurcu 0:aa73b3c9d246 770 unsigned char pfvt : 2; /**< Power fail threshold voltage. Sets analog comparator threshold voltage.
Erman Komurcu 0:aa73b3c9d246 771 Require D_MAN_SEL='0' for this setting to have effect. */
Erman Komurcu 0:aa73b3c9d246 772 unsigned char : 2;
Erman Komurcu 0:aa73b3c9d246 773 } bits;
Erman Komurcu 0:aa73b3c9d246 774 } pwr_mgmt_reg_t;
Erman Komurcu 0:aa73b3c9d246 775
Erman Komurcu 0:aa73b3c9d246 776 typedef union {
Erman Komurcu 0:aa73b3c9d246 777 unsigned char raw;
Erman Komurcu 0:aa73b3c9d246 778 struct {
Erman Komurcu 0:aa73b3c9d246 779 unsigned char sync_delay : 2; /* Sync delay to take for the internal countdown chain to reset
Erman Komurcu 0:aa73b3c9d246 780 after the rising edge of Set_RTC */
Erman Komurcu 0:aa73b3c9d246 781 unsigned char : 6;
Erman Komurcu 0:aa73b3c9d246 782 } bits;
Erman Komurcu 0:aa73b3c9d246 783 } clock_sync_reg_t;
Erman Komurcu 0:aa73b3c9d246 784
Erman Komurcu 0:aa73b3c9d246 785 typedef union {
Erman Komurcu 0:aa73b3c9d246 786 unsigned char raw;
Erman Komurcu 0:aa73b3c9d246 787 struct {
Erman Komurcu 0:aa73b3c9d246 788 unsigned char : 3;
Erman Komurcu 0:aa73b3c9d246 789 unsigned char ttint : 3; /**< Set temp measurement interval to specified time for auto mode */
Erman Komurcu 0:aa73b3c9d246 790 unsigned char oneshotmode : 1; /**< One-shot user requested temp measurement in real-time.
Erman Komurcu 0:aa73b3c9d246 791 AUTOMODE must be 0 in one-shot measurement mode. */
Erman Komurcu 0:aa73b3c9d246 792 unsigned char automode : 1; /**< Automatic mode of temperature measurement.
Erman Komurcu 0:aa73b3c9d246 793 This mode is valid only when ONESHOTMODE=0. */
Erman Komurcu 0:aa73b3c9d246 794 } bits;
Erman Komurcu 0:aa73b3c9d246 795 } ts_config_t;
Erman Komurcu 0:aa73b3c9d246 796
Erman Komurcu 0:aa73b3c9d246 797 private:
Erman Komurcu 0:aa73b3c9d246 798 /* PRIVATE TYPE DECLARATIONS */
Erman Komurcu 0:aa73b3c9d246 799
Erman Komurcu 0:aa73b3c9d246 800 /* PRIVATE VARIABLE DECLARATIONS */
Erman Komurcu 0:aa73b3c9d246 801 I2C *i2c_handler;
Erman Komurcu 0:aa73b3c9d246 802 InterruptIn *pin_int;
Erman Komurcu 0:aa73b3c9d246 803
Erman Komurcu 0:aa73b3c9d246 804 /* PRIVATE CONSTANT VARIABLE DECLARATIONS */
Erman Komurcu 0:aa73b3c9d246 805 static const uint8_t I2C_WRITE = 0;
Erman Komurcu 0:aa73b3c9d246 806 static const uint8_t I2C_READ = 1;
Erman Komurcu 0:aa73b3c9d246 807 static const uint8_t MAX3134X_I2C_ADDRESS = 0x68;
Erman Komurcu 0:aa73b3c9d246 808 static const uint8_t MAX3134X_I2C_W = ((MAX3134X_I2C_ADDRESS << 1) | I2C_WRITE);
Erman Komurcu 0:aa73b3c9d246 809 static const uint8_t MAX3134X_I2C_R = ((MAX3134X_I2C_ADDRESS << 1) | I2C_READ);
Erman Komurcu 0:aa73b3c9d246 810
Erman Komurcu 0:aa73b3c9d246 811 enum config_reg2_set_rtc {
Erman Komurcu 0:aa73b3c9d246 812 CONFIG_REG2_SET_RTC_RTCRUN = 0, /**< Setting this bit to zero doesn't allow to write into the RTC */
Erman Komurcu 0:aa73b3c9d246 813 CONFIG_REG2_SET_RTC_RTCPRGM, /**< This bit must be set to one, before writing into the RTC.
Erman Komurcu 0:aa73b3c9d246 814 i.e to set the initial time for the RTC this bit must be high. */
Erman Komurcu 0:aa73b3c9d246 815 };
Erman Komurcu 0:aa73b3c9d246 816
Erman Komurcu 0:aa73b3c9d246 817 /* PRIVATE FUNCTION DECLARATIONS */
Erman Komurcu 0:aa73b3c9d246 818 void interrupt_handler();
Erman Komurcu 0:aa73b3c9d246 819
Erman Komurcu 0:aa73b3c9d246 820 void (Max31343::*funcptr)(void);
Erman Komurcu 0:aa73b3c9d246 821
Erman Komurcu 0:aa73b3c9d246 822 void post_interrupt_work();
Erman Komurcu 0:aa73b3c9d246 823
Erman Komurcu 0:aa73b3c9d246 824 Thread *post_intr_work_thread;
Erman Komurcu 0:aa73b3c9d246 825
Erman Komurcu 0:aa73b3c9d246 826 struct handler {
Erman Komurcu 0:aa73b3c9d246 827 void (*func)(void *);
Erman Komurcu 0:aa73b3c9d246 828 void *cb;
Erman Komurcu 0:aa73b3c9d246 829 };
Erman Komurcu 0:aa73b3c9d246 830
Erman Komurcu 0:aa73b3c9d246 831 handler interrupt_handler_list[INTR_ID_END];
Erman Komurcu 0:aa73b3c9d246 832
Erman Komurcu 0:aa73b3c9d246 833 int rtc_regs_to_time(struct tm *time, const rtc_time_regs_t *regs);
Erman Komurcu 0:aa73b3c9d246 834
Erman Komurcu 0:aa73b3c9d246 835 int time_to_rtc_regs(rtc_time_regs_t *regs, const struct tm *time);
Erman Komurcu 0:aa73b3c9d246 836
Erman Komurcu 0:aa73b3c9d246 837 int set_alarm_regs(alarm_no_t alarm_no, const alarm_regs_t *regs);
Erman Komurcu 0:aa73b3c9d246 838
Erman Komurcu 0:aa73b3c9d246 839 int get_alarm_regs(alarm_no_t alarm_no, alarm_regs_t *regs);
Erman Komurcu 0:aa73b3c9d246 840
Erman Komurcu 0:aa73b3c9d246 841 int time_to_alarm_regs(alarm_regs_t &regs, const struct tm *alarm_time);
Erman Komurcu 0:aa73b3c9d246 842
Erman Komurcu 0:aa73b3c9d246 843 int alarm_regs_to_time(struct tm *alarm_time, const alarm_regs_t *regs);
Erman Komurcu 0:aa73b3c9d246 844
Erman Komurcu 0:aa73b3c9d246 845 int set_alarm_period(alarm_no_t alarm_no, alarm_regs_t &regs, alarm_period_t period);
Erman Komurcu 0:aa73b3c9d246 846
Erman Komurcu 0:aa73b3c9d246 847 int set_rtc_time();
Erman Komurcu 0:aa73b3c9d246 848
Erman Komurcu 0:aa73b3c9d246 849 int data_retention_mode_config(int state);
Erman Komurcu 0:aa73b3c9d246 850
Erman Komurcu 0:aa73b3c9d246 851 int i2c_timeout_config(int enable);
Erman Komurcu 0:aa73b3c9d246 852 };
Erman Komurcu 0:aa73b3c9d246 853
Erman Komurcu 0:aa73b3c9d246 854 #endif /* Max31343_H_ */