Fork of Ds3231 library that replaces inheritance of I2C class with a private member var of type I2C *

Dependents:   ard2pmod DS3231_Alarm_Demo MAXREFDES130_131_Demo MAXREFDES130_Demo

Fork of ds3231 by Maxim Integrated

Committer:
j3
Date:
Mon Mar 28 19:17:34 2016 +0000
Revision:
15:16ca4c747252
Parent:
12:b9f13fd8c1b6
Child:
16:e1c0f63595d9
removed inheritance of I2C class and used private member for I2C bus

Who changed what in which revision?

UserRevisionLine numberNew contents of line
j3 0:b00c4699ae6f 1 /******************************************************************//**
j3 12:b9f13fd8c1b6 2 * Copyright (C) 2015 Maxim Integrated Products, Inc., All Rights Reserved.
j3 0:b00c4699ae6f 3 *
j3 0:b00c4699ae6f 4 * Permission is hereby granted, free of charge, to any person obtaining a
j3 0:b00c4699ae6f 5 * copy of this software and associated documentation files (the "Software"),
j3 0:b00c4699ae6f 6 * to deal in the Software without restriction, including without limitation
j3 0:b00c4699ae6f 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
j3 0:b00c4699ae6f 8 * and/or sell copies of the Software, and to permit persons to whom the
j3 0:b00c4699ae6f 9 * Software is furnished to do so, subject to the following conditions:
j3 0:b00c4699ae6f 10 *
j3 0:b00c4699ae6f 11 * The above copyright notice and this permission notice shall be included
j3 0:b00c4699ae6f 12 * in all copies or substantial portions of the Software.
j3 0:b00c4699ae6f 13 *
j3 0:b00c4699ae6f 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
j3 0:b00c4699ae6f 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
j3 0:b00c4699ae6f 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
j3 0:b00c4699ae6f 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
j3 0:b00c4699ae6f 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
j3 0:b00c4699ae6f 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
j3 0:b00c4699ae6f 20 * OTHER DEALINGS IN THE SOFTWARE.
j3 0:b00c4699ae6f 21 *
j3 0:b00c4699ae6f 22 * Except as contained in this notice, the name of Maxim Integrated
j3 0:b00c4699ae6f 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
j3 0:b00c4699ae6f 24 * Products, Inc. Branding Policy.
j3 0:b00c4699ae6f 25 *
j3 0:b00c4699ae6f 26 * The mere transfer of this software does not imply any licenses
j3 0:b00c4699ae6f 27 * of trade secrets, proprietary technology, copyrights, patents,
j3 0:b00c4699ae6f 28 * trademarks, maskwork rights, or any other form of intellectual
j3 0:b00c4699ae6f 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
j3 0:b00c4699ae6f 30 * ownership rights.
j3 0:b00c4699ae6f 31 **********************************************************************/
j3 0:b00c4699ae6f 32
j3 0:b00c4699ae6f 33
j3 0:b00c4699ae6f 34 #include "ds3231.h"
j3 0:b00c4699ae6f 35
j3 0:b00c4699ae6f 36
j3 15:16ca4c747252 37 #define DS3231_I2C_ADRS 0x68
j3 15:16ca4c747252 38 #define I2C_WRITE 0
j3 15:16ca4c747252 39 #define I2C_READ 1
j3 15:16ca4c747252 40
j3 15:16ca4c747252 41 #define AM_PM (1 << 5)
j3 15:16ca4c747252 42 #define MODE (1 << 6)
j3 15:16ca4c747252 43 #define DY_DT (1 << 6)
j3 15:16ca4c747252 44 #define ALRM_MASK (1 << 7)
j3 15:16ca4c747252 45
j3 15:16ca4c747252 46 //control register bit masks
j3 15:16ca4c747252 47 #define A1IE (1 << 0)
j3 15:16ca4c747252 48 #define A2IE (1 << 1)
j3 15:16ca4c747252 49 #define INTCN (1 << 2)
j3 15:16ca4c747252 50 #define RS1 (1 << 3)
j3 15:16ca4c747252 51 #define RS2 (1 << 4)
j3 15:16ca4c747252 52 #define CONV (1 << 5)
j3 15:16ca4c747252 53 #define BBSQW (1 << 6)
j3 15:16ca4c747252 54 #define EOSC (1 << 7)
j3 15:16ca4c747252 55
j3 15:16ca4c747252 56 //status register bit masks
j3 15:16ca4c747252 57 #define A1F (1 << 0)
j3 15:16ca4c747252 58 #define A2F (1 << 1)
j3 15:16ca4c747252 59 #define BSY (1 << 2)
j3 15:16ca4c747252 60 #define EN32KHZ (1 << 3)
j3 15:16ca4c747252 61 #define OSF (1 << 7)
j3 15:16ca4c747252 62
j3 15:16ca4c747252 63
j3 15:16ca4c747252 64 //*********************************************************************
j3 15:16ca4c747252 65 Ds3231::Ds3231(PinName sda, PinName scl)
j3 15:16ca4c747252 66 :_p_i2c(new I2C(sda, scl)), _i2c_owner(true), _w_adrs((DS3231_I2C_ADRS << 1) | I2C_WRITE),
j3 15:16ca4c747252 67 _r_adrs((DS3231_I2C_ADRS << 1) | I2C_READ)
j3 0:b00c4699ae6f 68 {
j3 0:b00c4699ae6f 69 }
j3 0:b00c4699ae6f 70
j3 0:b00c4699ae6f 71
j3 15:16ca4c747252 72 //*********************************************************************
j3 15:16ca4c747252 73 Ds3231::Ds3231(I2C & i2c_bus)
j3 15:16ca4c747252 74 :_p_i2c(&i2c_bus), _i2c_owner(false), _w_adrs((DS3231_I2C_ADRS << 1) | I2C_WRITE),
j3 15:16ca4c747252 75 _r_adrs((DS3231_I2C_ADRS << 1) | I2C_READ)
j3 15:16ca4c747252 76 {
j3 15:16ca4c747252 77 }
j3 15:16ca4c747252 78
j3 15:16ca4c747252 79
j3 15:16ca4c747252 80 //*********************************************************************
j3 15:16ca4c747252 81 Ds3231::~Ds3231()
j3 15:16ca4c747252 82 {
j3 15:16ca4c747252 83 if(_i2c_owner)
j3 15:16ca4c747252 84 {
j3 15:16ca4c747252 85 delete _p_i2c;
j3 15:16ca4c747252 86 }
j3 15:16ca4c747252 87 }
j3 15:16ca4c747252 88
j3 15:16ca4c747252 89
j3 15:16ca4c747252 90 //*********************************************************************
j3 0:b00c4699ae6f 91 uint16_t Ds3231::set_time(ds3231_time_t time)
j3 0:b00c4699ae6f 92 {
j3 2:4e6e761c60f2 93 uint8_t data[] = {0,0,0,0};
j3 2:4e6e761c60f2 94 uint8_t data_length = 0;
j3 2:4e6e761c60f2 95 uint8_t max_hour = 24;
j3 0:b00c4699ae6f 96
j3 2:4e6e761c60f2 97 data[data_length++] = SECONDS;
j3 2:4e6e761c60f2 98 data[data_length++] = uchar_2_bcd(time.seconds);
j3 2:4e6e761c60f2 99 data[data_length++] = uchar_2_bcd(time.minutes);
j3 2:4e6e761c60f2 100
j3 2:4e6e761c60f2 101 //format Hours register
j3 2:4e6e761c60f2 102 data[data_length] = uchar_2_bcd(time.hours);
j3 2:4e6e761c60f2 103 if(time.mode)
j3 2:4e6e761c60f2 104 {
j3 2:4e6e761c60f2 105 max_hour = max_hour/2;
j3 2:4e6e761c60f2 106
j3 2:4e6e761c60f2 107 data[data_length] |= MODE;
j3 2:4e6e761c60f2 108 if(time.am_pm)
j3 2:4e6e761c60f2 109 {
j3 2:4e6e761c60f2 110 data[data_length] |= AM_PM;
j3 2:4e6e761c60f2 111 }
j3 2:4e6e761c60f2 112
j3 2:4e6e761c60f2 113 }
j3 2:4e6e761c60f2 114 else
j3 2:4e6e761c60f2 115 {
j3 2:4e6e761c60f2 116 max_hour = max_hour - 1;
j3 2:4e6e761c60f2 117 }
j3 2:4e6e761c60f2 118 data_length++;
j3 2:4e6e761c60f2 119
j3 7:0551d7e7c13f 120 //Make sure data is within range.
j3 2:4e6e761c60f2 121 if((time.seconds > 59) || (time.minutes > 59) || (time.hours > max_hour))
j3 2:4e6e761c60f2 122 {
j3 2:4e6e761c60f2 123 return(1);
j3 2:4e6e761c60f2 124 }
j3 2:4e6e761c60f2 125 else
j3 2:4e6e761c60f2 126 {
j3 15:16ca4c747252 127 return(_p_i2c->write(_w_adrs,(const char*) data, data_length));
j3 2:4e6e761c60f2 128 }
j3 0:b00c4699ae6f 129 }
j3 0:b00c4699ae6f 130
j3 0:b00c4699ae6f 131
j3 15:16ca4c747252 132 //*********************************************************************
j3 0:b00c4699ae6f 133 uint16_t Ds3231::set_calendar(ds3231_calendar_t calendar)
j3 0:b00c4699ae6f 134 {
j3 2:4e6e761c60f2 135 uint8_t data[] = {0,0,0,0,0};
j3 2:4e6e761c60f2 136 uint8_t data_length = 0;
j3 2:4e6e761c60f2 137
j3 2:4e6e761c60f2 138 data[data_length++] = DAY;
j3 2:4e6e761c60f2 139 data[data_length++] = uchar_2_bcd(calendar.day);
j3 2:4e6e761c60f2 140 data[data_length++] = uchar_2_bcd(calendar.date);
j3 2:4e6e761c60f2 141 data[data_length++] = uchar_2_bcd(calendar.month);
j3 2:4e6e761c60f2 142 data[data_length++] = uchar_2_bcd(calendar.year);
j3 0:b00c4699ae6f 143
j3 7:0551d7e7c13f 144 //Make sure data is within range.
j3 7:0551d7e7c13f 145 if(((calendar.day < 1) || (calendar.day > 7)) ||
j3 7:0551d7e7c13f 146 ((calendar.date < 1) || (calendar.date > 31)) ||
j3 7:0551d7e7c13f 147 ((calendar.month < 1) || (calendar.month > 12)) ||
j3 7:0551d7e7c13f 148 (calendar.year > 99))
j3 7:0551d7e7c13f 149 {
j3 7:0551d7e7c13f 150 return(1);
j3 7:0551d7e7c13f 151 }
j3 7:0551d7e7c13f 152 else
j3 7:0551d7e7c13f 153 {
j3 15:16ca4c747252 154 return(_p_i2c->write(_w_adrs,(const char*) data, data_length));
j3 7:0551d7e7c13f 155 }
j3 0:b00c4699ae6f 156 }
j3 0:b00c4699ae6f 157
j3 0:b00c4699ae6f 158
j3 15:16ca4c747252 159 //*********************************************************************
j3 0:b00c4699ae6f 160 uint16_t Ds3231::set_alarm(ds3231_alrm_t alarm, bool one_r_two)
j3 0:b00c4699ae6f 161 {
j3 2:4e6e761c60f2 162 uint8_t data[] = {0,0,0,0,0};
j3 2:4e6e761c60f2 163 uint8_t data_length = 0;
j3 2:4e6e761c60f2 164 uint8_t max_hour = 24;
j3 2:4e6e761c60f2 165 uint8_t mask_var = 0;
j3 2:4e6e761c60f2 166
j3 2:4e6e761c60f2 167 //setting alarm 1 or 2?
j3 2:4e6e761c60f2 168 if(one_r_two)
j3 2:4e6e761c60f2 169 {
j3 2:4e6e761c60f2 170 data[data_length++] = ALRM1_SECONDS;
j3 2:4e6e761c60f2 171
j3 2:4e6e761c60f2 172 //config seconds register
j3 2:4e6e761c60f2 173 if(alarm.am1)
j3 2:4e6e761c60f2 174 {
j3 2:4e6e761c60f2 175 mask_var |= ALRM_MASK;
j3 2:4e6e761c60f2 176 }
j3 2:4e6e761c60f2 177 data[data_length++] = (mask_var | uchar_2_bcd(alarm.seconds));
j3 2:4e6e761c60f2 178 mask_var = 0;
j3 2:4e6e761c60f2 179
j3 2:4e6e761c60f2 180 //config minutes register
j3 2:4e6e761c60f2 181 if(alarm.am2)
j3 2:4e6e761c60f2 182 {
j3 2:4e6e761c60f2 183 mask_var |= ALRM_MASK;
j3 2:4e6e761c60f2 184 }
j3 2:4e6e761c60f2 185 data[data_length++] = (mask_var | uchar_2_bcd(alarm.minutes));
j3 2:4e6e761c60f2 186 mask_var = 0;
j3 2:4e6e761c60f2 187
j3 2:4e6e761c60f2 188 //config hours register
j3 2:4e6e761c60f2 189 if(alarm.am3)
j3 2:4e6e761c60f2 190 {
j3 2:4e6e761c60f2 191 mask_var |= ALRM_MASK;
j3 2:4e6e761c60f2 192 }
j3 2:4e6e761c60f2 193 if(alarm.mode)
j3 2:4e6e761c60f2 194 {
j3 2:4e6e761c60f2 195 max_hour = max_hour/2;
j3 2:4e6e761c60f2 196 mask_var |= MODE;
j3 2:4e6e761c60f2 197 if(alarm.am_pm)
j3 2:4e6e761c60f2 198 {
j3 2:4e6e761c60f2 199 mask_var |= AM_PM;
j3 2:4e6e761c60f2 200 }
j3 2:4e6e761c60f2 201 }
j3 2:4e6e761c60f2 202 else
j3 2:4e6e761c60f2 203 {
j3 2:4e6e761c60f2 204 max_hour = max_hour - 1;
j3 2:4e6e761c60f2 205 }
j3 2:4e6e761c60f2 206 data[data_length++] = (mask_var | uchar_2_bcd(alarm.hours));
j3 2:4e6e761c60f2 207 mask_var = 0;
j3 2:4e6e761c60f2 208
j3 2:4e6e761c60f2 209 //config day/date register
j3 2:4e6e761c60f2 210 if(alarm.am4)
j3 2:4e6e761c60f2 211 {
j3 2:4e6e761c60f2 212 mask_var |= ALRM_MASK;
j3 2:4e6e761c60f2 213 }
j3 2:4e6e761c60f2 214 if(alarm.dy_dt)
j3 2:4e6e761c60f2 215 {
j3 2:4e6e761c60f2 216 mask_var |= DY_DT;
j3 2:4e6e761c60f2 217 data[data_length++] = (mask_var | uchar_2_bcd(alarm.day));
j3 2:4e6e761c60f2 218 }
j3 2:4e6e761c60f2 219 else
j3 2:4e6e761c60f2 220 {
j3 2:4e6e761c60f2 221 data[data_length++] = (mask_var | uchar_2_bcd(alarm.date));
j3 2:4e6e761c60f2 222 }
j3 2:4e6e761c60f2 223 mask_var = 0;
j3 2:4e6e761c60f2 224 }
j3 2:4e6e761c60f2 225 else
j3 2:4e6e761c60f2 226 {
j3 2:4e6e761c60f2 227 data[data_length++] = ALRM2_MINUTES;
j3 2:4e6e761c60f2 228
j3 2:4e6e761c60f2 229 //config minutes register
j3 2:4e6e761c60f2 230 if(alarm.am2)
j3 2:4e6e761c60f2 231 {
j3 2:4e6e761c60f2 232 mask_var |= ALRM_MASK;
j3 2:4e6e761c60f2 233 }
j3 2:4e6e761c60f2 234 data[data_length++] = (mask_var | uchar_2_bcd(alarm.minutes));
j3 2:4e6e761c60f2 235 mask_var = 0;
j3 2:4e6e761c60f2 236
j3 2:4e6e761c60f2 237 //config hours register
j3 2:4e6e761c60f2 238 if(alarm.am3)
j3 2:4e6e761c60f2 239 {
j3 2:4e6e761c60f2 240 mask_var |= ALRM_MASK;
j3 2:4e6e761c60f2 241 }
j3 2:4e6e761c60f2 242 if(alarm.mode)
j3 2:4e6e761c60f2 243 {
j3 2:4e6e761c60f2 244 max_hour = max_hour/2;
j3 2:4e6e761c60f2 245 mask_var |= MODE;
j3 2:4e6e761c60f2 246 if(alarm.am_pm)
j3 2:4e6e761c60f2 247 {
j3 2:4e6e761c60f2 248 mask_var |= AM_PM;
j3 2:4e6e761c60f2 249 }
j3 2:4e6e761c60f2 250 }
j3 2:4e6e761c60f2 251 else
j3 2:4e6e761c60f2 252 {
j3 2:4e6e761c60f2 253 max_hour = max_hour - 1;
j3 2:4e6e761c60f2 254 }
j3 2:4e6e761c60f2 255 data[data_length++] = (mask_var | uchar_2_bcd(alarm.hours));
j3 2:4e6e761c60f2 256 mask_var = 0;
j3 2:4e6e761c60f2 257
j3 2:4e6e761c60f2 258 //config day/date register
j3 2:4e6e761c60f2 259 if(alarm.am4)
j3 2:4e6e761c60f2 260 {
j3 2:4e6e761c60f2 261 mask_var |= ALRM_MASK;
j3 2:4e6e761c60f2 262 }
j3 2:4e6e761c60f2 263 if(alarm.dy_dt)
j3 2:4e6e761c60f2 264 {
j3 2:4e6e761c60f2 265 mask_var |= DY_DT;
j3 2:4e6e761c60f2 266 data[data_length++] = (mask_var | uchar_2_bcd(alarm.day));
j3 2:4e6e761c60f2 267 }
j3 2:4e6e761c60f2 268 else
j3 2:4e6e761c60f2 269 {
j3 2:4e6e761c60f2 270 data[data_length++] = (mask_var | uchar_2_bcd(alarm.date));
j3 2:4e6e761c60f2 271 }
j3 2:4e6e761c60f2 272 mask_var = 0;
j3 2:4e6e761c60f2 273 }
j3 2:4e6e761c60f2 274
j3 7:0551d7e7c13f 275 //Make sure data is within range.
j3 7:0551d7e7c13f 276 if((alarm.seconds > 59) || (alarm.minutes > 59) || (alarm.hours > max_hour) ||
j3 7:0551d7e7c13f 277 ((alarm.day < 1) || (alarm.day > 7)) ||
j3 7:0551d7e7c13f 278 ((alarm.date < 1) || (alarm.date > 31)))
j3 2:4e6e761c60f2 279 {
j3 2:4e6e761c60f2 280 return(1);
j3 2:4e6e761c60f2 281 }
j3 2:4e6e761c60f2 282 else
j3 2:4e6e761c60f2 283 {
j3 15:16ca4c747252 284 return(_p_i2c->write(_w_adrs,(const char*) data, data_length));
j3 2:4e6e761c60f2 285 }
j3 0:b00c4699ae6f 286 }
j3 0:b00c4699ae6f 287
j3 0:b00c4699ae6f 288
j3 15:16ca4c747252 289 //*********************************************************************
j3 0:b00c4699ae6f 290 uint16_t Ds3231::set_cntl_stat_reg(ds3231_cntl_stat_t data)
j3 0:b00c4699ae6f 291 {
j3 2:4e6e761c60f2 292 uint8_t local_data[] = {0,0,0};
j3 2:4e6e761c60f2 293 uint8_t data_length = 0;
j3 2:4e6e761c60f2 294
j3 2:4e6e761c60f2 295 local_data[data_length++] = CONTROL;
j3 2:4e6e761c60f2 296 local_data[data_length++] = data.control;
j3 2:4e6e761c60f2 297 local_data[data_length++] = data.status;
j3 0:b00c4699ae6f 298
j3 2:4e6e761c60f2 299 //users responsibility to make sure data is logical
j3 15:16ca4c747252 300 return(_p_i2c->write(_w_adrs,(const char*) local_data, data_length));
j3 0:b00c4699ae6f 301 }
j3 0:b00c4699ae6f 302
j3 0:b00c4699ae6f 303
j3 15:16ca4c747252 304 //*********************************************************************
j3 2:4e6e761c60f2 305 uint16_t Ds3231::get_time(ds3231_time_t* time)
j3 0:b00c4699ae6f 306 {
j3 2:4e6e761c60f2 307 uint16_t rtn_val = 1;
j3 2:4e6e761c60f2 308 uint8_t data[3];
j3 2:4e6e761c60f2 309
j3 2:4e6e761c60f2 310 data[0] = SECONDS;
j3 15:16ca4c747252 311 rtn_val = _p_i2c->write(_w_adrs, (const char*) data, 1);
j3 2:4e6e761c60f2 312
j3 2:4e6e761c60f2 313 if(!rtn_val)
j3 2:4e6e761c60f2 314 {
j3 15:16ca4c747252 315 rtn_val = _p_i2c->read(_r_adrs,(char *) data, 3);
j3 2:4e6e761c60f2 316
j3 2:4e6e761c60f2 317 time->seconds = bcd_2_uchar(data[0]);
j3 2:4e6e761c60f2 318 time->minutes = bcd_2_uchar(data[1]);
j3 4:0beb5e9ac927 319 time->am_pm = (data[2]&AM_PM);
j3 4:0beb5e9ac927 320 time->mode = (data[2]&MODE);
j3 10:3b55ed3f71d3 321
j3 10:3b55ed3f71d3 322 if(time->mode)
j3 10:3b55ed3f71d3 323 {
j3 10:3b55ed3f71d3 324 time->hours = bcd_2_uchar((data[2]&0x1F));
j3 10:3b55ed3f71d3 325 }
j3 10:3b55ed3f71d3 326 else
j3 10:3b55ed3f71d3 327 {
j3 10:3b55ed3f71d3 328 time->hours = bcd_2_uchar((data[2]&0x3F));
j3 10:3b55ed3f71d3 329 }
j3 2:4e6e761c60f2 330 }
j3 2:4e6e761c60f2 331
j3 2:4e6e761c60f2 332 return(rtn_val);
j3 0:b00c4699ae6f 333 }
j3 0:b00c4699ae6f 334
j3 0:b00c4699ae6f 335
j3 15:16ca4c747252 336 //*********************************************************************
j3 2:4e6e761c60f2 337 uint16_t Ds3231::get_calendar(ds3231_calendar_t* calendar)
j3 0:b00c4699ae6f 338 {
j3 2:4e6e761c60f2 339 uint16_t rtn_val = 1;
j3 2:4e6e761c60f2 340 uint8_t data[4];
j3 2:4e6e761c60f2 341
j3 2:4e6e761c60f2 342 data[0] = DAY;
j3 15:16ca4c747252 343 rtn_val = _p_i2c->write(_w_adrs, (const char*) data, 1);
j3 2:4e6e761c60f2 344
j3 2:4e6e761c60f2 345 if(!rtn_val)
j3 2:4e6e761c60f2 346 {
j3 15:16ca4c747252 347 rtn_val = _p_i2c->read(_r_adrs,(char *) data, 4);
j3 2:4e6e761c60f2 348
j3 2:4e6e761c60f2 349 calendar->day = bcd_2_uchar(data[0]);
j3 2:4e6e761c60f2 350 calendar->date = bcd_2_uchar(data[1]);
j3 2:4e6e761c60f2 351 calendar->month = bcd_2_uchar((data[2]&0x1F));
j3 2:4e6e761c60f2 352 calendar->year = bcd_2_uchar(data[3]);
j3 2:4e6e761c60f2 353 }
j3 2:4e6e761c60f2 354
j3 2:4e6e761c60f2 355 return(rtn_val);
j3 0:b00c4699ae6f 356 }
j3 0:b00c4699ae6f 357
j3 0:b00c4699ae6f 358
j3 15:16ca4c747252 359 //*********************************************************************
j3 2:4e6e761c60f2 360 uint16_t Ds3231::get_alarm(ds3231_alrm_t* alarm, bool one_r_two)
j3 0:b00c4699ae6f 361 {
j3 2:4e6e761c60f2 362 uint16_t rtn_val = 1;
j3 2:4e6e761c60f2 363 uint8_t data[4];
j3 2:4e6e761c60f2 364
j3 2:4e6e761c60f2 365 if(one_r_two)
j3 2:4e6e761c60f2 366 {
j3 2:4e6e761c60f2 367 data[0] = ALRM1_SECONDS;
j3 15:16ca4c747252 368 rtn_val = _p_i2c->write(_w_adrs, (const char*) data, 1);
j3 2:4e6e761c60f2 369
j3 2:4e6e761c60f2 370 if(!rtn_val)
j3 2:4e6e761c60f2 371 {
j3 15:16ca4c747252 372 rtn_val = _p_i2c->read(_r_adrs,(char *) data, 4);
j3 2:4e6e761c60f2 373
j3 2:4e6e761c60f2 374 alarm->seconds = bcd_2_uchar(data[0]&0x7F);
j3 4:0beb5e9ac927 375 alarm->am1 = (data[0]&ALRM_MASK);
j3 2:4e6e761c60f2 376 alarm->minutes = bcd_2_uchar(data[1]&0x7F);
j3 4:0beb5e9ac927 377 alarm->am2 = (data[1]&ALRM_MASK);
j3 4:0beb5e9ac927 378 alarm->am3 = (data[2]&ALRM_MASK);
j3 4:0beb5e9ac927 379 alarm->am_pm = (data[2]&AM_PM);
j3 4:0beb5e9ac927 380 alarm->mode = (data[2]&MODE);
j3 2:4e6e761c60f2 381
j3 10:3b55ed3f71d3 382 if(alarm->mode)
j3 10:3b55ed3f71d3 383 {
j3 10:3b55ed3f71d3 384 alarm->hours = bcd_2_uchar((data[2]&0x1F));
j3 10:3b55ed3f71d3 385 }
j3 10:3b55ed3f71d3 386 else
j3 10:3b55ed3f71d3 387 {
j3 10:3b55ed3f71d3 388 alarm->hours = bcd_2_uchar((data[2]&0x3F));
j3 10:3b55ed3f71d3 389 }
j3 10:3b55ed3f71d3 390
j3 2:4e6e761c60f2 391 if(data[3] & DY_DT)
j3 2:4e6e761c60f2 392 {
j3 4:0beb5e9ac927 393 alarm->dy_dt = 1;
j3 2:4e6e761c60f2 394 alarm->day = bcd_2_uchar(data[3]&0x0F);
j3 2:4e6e761c60f2 395 }
j3 2:4e6e761c60f2 396 else
j3 2:4e6e761c60f2 397 {
j3 2:4e6e761c60f2 398 alarm->date = bcd_2_uchar(data[3]&0x3F);
j3 2:4e6e761c60f2 399 }
j3 4:0beb5e9ac927 400 alarm->am4 = (data[3]&ALRM_MASK);
j3 2:4e6e761c60f2 401 }
j3 2:4e6e761c60f2 402 }
j3 2:4e6e761c60f2 403 else
j3 2:4e6e761c60f2 404 {
j3 2:4e6e761c60f2 405 data[0] = ALRM2_MINUTES;
j3 15:16ca4c747252 406 rtn_val = _p_i2c->write(_w_adrs, (const char*) data, 1);
j3 2:4e6e761c60f2 407
j3 2:4e6e761c60f2 408 if(!rtn_val)
j3 2:4e6e761c60f2 409 {
j3 15:16ca4c747252 410 rtn_val = _p_i2c->read(_r_adrs,(char *) data, 4);
j3 2:4e6e761c60f2 411
j3 2:4e6e761c60f2 412 alarm->minutes = bcd_2_uchar(data[0]&0x7F);
j3 4:0beb5e9ac927 413 alarm->am2 = (data[0]&ALRM_MASK);
j3 4:0beb5e9ac927 414 alarm->am3 = (data[1]&ALRM_MASK);
j3 4:0beb5e9ac927 415 alarm->am_pm = (data[1]&AM_PM);
j3 4:0beb5e9ac927 416 alarm->mode = (data[1]&MODE);
j3 2:4e6e761c60f2 417
j3 10:3b55ed3f71d3 418 if(alarm->mode)
j3 10:3b55ed3f71d3 419 {
j3 10:3b55ed3f71d3 420 alarm->hours = bcd_2_uchar((data[2]&0x1F));
j3 10:3b55ed3f71d3 421 }
j3 10:3b55ed3f71d3 422 else
j3 10:3b55ed3f71d3 423 {
j3 10:3b55ed3f71d3 424 alarm->hours = bcd_2_uchar((data[2]&0x3F));
j3 10:3b55ed3f71d3 425 }
j3 10:3b55ed3f71d3 426
j3 4:0beb5e9ac927 427 if(data[2] & DY_DT)
j3 2:4e6e761c60f2 428 {
j3 4:0beb5e9ac927 429 alarm->dy_dt = 1;
j3 2:4e6e761c60f2 430 alarm->day = bcd_2_uchar(data[2]&0x0F);
j3 2:4e6e761c60f2 431 }
j3 2:4e6e761c60f2 432 else
j3 2:4e6e761c60f2 433 {
j3 2:4e6e761c60f2 434 alarm->date = bcd_2_uchar(data[2]&0x3F);
j3 2:4e6e761c60f2 435 }
j3 4:0beb5e9ac927 436 alarm->am4 = (data[2]&ALRM_MASK);
j3 2:4e6e761c60f2 437 }
j3 2:4e6e761c60f2 438 }
j3 2:4e6e761c60f2 439
j3 2:4e6e761c60f2 440 return(rtn_val);
j3 0:b00c4699ae6f 441 }
j3 0:b00c4699ae6f 442
j3 0:b00c4699ae6f 443
j3 15:16ca4c747252 444 //*********************************************************************
j3 2:4e6e761c60f2 445 uint16_t Ds3231::get_cntl_stat_reg(ds3231_cntl_stat_t* data)
j3 0:b00c4699ae6f 446 {
j3 2:4e6e761c60f2 447 uint16_t rtn_val = 1;
j3 2:4e6e761c60f2 448 uint8_t local_data[2];
j3 2:4e6e761c60f2 449
j3 2:4e6e761c60f2 450 local_data[0] = CONTROL;
j3 15:16ca4c747252 451 rtn_val = _p_i2c->write(_w_adrs, (const char*) local_data, 1);
j3 2:4e6e761c60f2 452
j3 2:4e6e761c60f2 453 if(!rtn_val)
j3 2:4e6e761c60f2 454 {
j3 15:16ca4c747252 455 rtn_val = _p_i2c->read(_r_adrs,(char *) local_data, 2);
j3 2:4e6e761c60f2 456
j3 2:4e6e761c60f2 457 data->control = local_data[0];
j3 2:4e6e761c60f2 458 data->status = local_data[1];
j3 2:4e6e761c60f2 459 }
j3 2:4e6e761c60f2 460
j3 2:4e6e761c60f2 461 return(rtn_val);
j3 0:b00c4699ae6f 462 }
j3 0:b00c4699ae6f 463
j3 0:b00c4699ae6f 464
j3 15:16ca4c747252 465 //*********************************************************************
j3 2:4e6e761c60f2 466 uint16_t Ds3231::get_temperature(void)
j3 0:b00c4699ae6f 467 {
j3 2:4e6e761c60f2 468 uint16_t rtn_val = 1;
j3 2:4e6e761c60f2 469 uint8_t data[2];
j3 2:4e6e761c60f2 470
j3 2:4e6e761c60f2 471 data[0] = MSB_TEMP;
j3 15:16ca4c747252 472 rtn_val = _p_i2c->write(_w_adrs, (const char*) data, 1);
j3 2:4e6e761c60f2 473
j3 2:4e6e761c60f2 474 if(!rtn_val)
j3 2:4e6e761c60f2 475 {
j3 15:16ca4c747252 476 _p_i2c->read(_r_adrs,(char *) data, 2);
j3 2:4e6e761c60f2 477
j3 2:4e6e761c60f2 478 rtn_val = data[0] << 8;
j3 2:4e6e761c60f2 479 rtn_val |= data[1];
j3 2:4e6e761c60f2 480 }
j3 2:4e6e761c60f2 481
j3 2:4e6e761c60f2 482 return(rtn_val);
j3 0:b00c4699ae6f 483 }
j3 0:b00c4699ae6f 484
j3 2:4e6e761c60f2 485
j3 15:16ca4c747252 486 //*********************************************************************
j3 5:61dfe2690360 487 time_t Ds3231::get_epoch(void)
j3 5:61dfe2690360 488 {
j3 5:61dfe2690360 489 //system vars
j3 5:61dfe2690360 490 struct tm sys_time;
j3 5:61dfe2690360 491
j3 5:61dfe2690360 492 //RTC vars
j3 6:e8850ad15893 493 ds3231_time_t rtc_time = {0,0,0,0,0};
j3 6:e8850ad15893 494 ds3231_calendar_t rtc_calendar = {0,0,0,0};
j3 5:61dfe2690360 495
j3 5:61dfe2690360 496 get_calendar(&rtc_calendar);
j3 5:61dfe2690360 497 get_time(&rtc_time);
j3 5:61dfe2690360 498
j3 5:61dfe2690360 499 sys_time.tm_wday = rtc_calendar.day - 1;
j3 5:61dfe2690360 500 sys_time.tm_mday = rtc_calendar.date;
j3 5:61dfe2690360 501 sys_time.tm_mon = rtc_calendar.month - 1;
j3 5:61dfe2690360 502 sys_time.tm_year = rtc_calendar.year + 100;
j3 5:61dfe2690360 503
j3 5:61dfe2690360 504 //check for 12hr or 24hr mode
j3 5:61dfe2690360 505 if(rtc_time.mode)
j3 5:61dfe2690360 506 {
j3 5:61dfe2690360 507 //check am/pm
j3 5:61dfe2690360 508 if(rtc_time.am_pm && (rtc_time.hours != 12))
j3 5:61dfe2690360 509 {
j3 5:61dfe2690360 510 sys_time.tm_hour = rtc_time.hours + 12;
j3 5:61dfe2690360 511 }
j3 5:61dfe2690360 512 else
j3 5:61dfe2690360 513 {
j3 5:61dfe2690360 514 sys_time.tm_hour = rtc_time.hours;
j3 5:61dfe2690360 515 }
j3 5:61dfe2690360 516
j3 5:61dfe2690360 517 }
j3 5:61dfe2690360 518 else
j3 5:61dfe2690360 519 {
j3 5:61dfe2690360 520 //24hr mode
j3 5:61dfe2690360 521 sys_time.tm_hour = rtc_time.hours;
j3 5:61dfe2690360 522 }
j3 5:61dfe2690360 523
j3 5:61dfe2690360 524 sys_time.tm_min = rtc_time.minutes;
j3 5:61dfe2690360 525 sys_time.tm_sec = rtc_time.seconds;
j3 5:61dfe2690360 526
j3 5:61dfe2690360 527 //make epoch time
j3 5:61dfe2690360 528 return(mktime(&sys_time));
j3 5:61dfe2690360 529 }
j3 5:61dfe2690360 530
j3 5:61dfe2690360 531
j3 15:16ca4c747252 532 //*********************************************************************
j3 2:4e6e761c60f2 533 uint16_t Ds3231::uchar_2_bcd(uint8_t data)
j3 2:4e6e761c60f2 534 {
j3 2:4e6e761c60f2 535 uint16_t bcd_result = 0;
j3 2:4e6e761c60f2 536
j3 2:4e6e761c60f2 537 //Get hundreds
j3 2:4e6e761c60f2 538 bcd_result |= ((data/100) << 8);
j3 2:4e6e761c60f2 539 data = (data - (data/100)*100);
j3 2:4e6e761c60f2 540
j3 2:4e6e761c60f2 541 //Get tens
j3 2:4e6e761c60f2 542 bcd_result |= ((data/10) << 4);
j3 2:4e6e761c60f2 543 data = (data - (data/10)*10);
j3 2:4e6e761c60f2 544
j3 2:4e6e761c60f2 545 //Get ones
j3 2:4e6e761c60f2 546 bcd_result |= data;
j3 2:4e6e761c60f2 547
j3 2:4e6e761c60f2 548 return(bcd_result);
j3 2:4e6e761c60f2 549 }
j3 2:4e6e761c60f2 550
j3 2:4e6e761c60f2 551
j3 15:16ca4c747252 552 //*********************************************************************
j3 2:4e6e761c60f2 553 uint8_t Ds3231::bcd_2_uchar(uint8_t bcd)
j3 2:4e6e761c60f2 554 {
j3 2:4e6e761c60f2 555 uint8_t rtn_val = 0;
j3 2:4e6e761c60f2 556
j3 2:4e6e761c60f2 557 rtn_val += ((bcd&0xf0)>>4)*10;
j3 2:4e6e761c60f2 558 rtn_val += (bcd&0x000f);
j3 2:4e6e761c60f2 559
j3 2:4e6e761c60f2 560 return rtn_val;
j3 2:4e6e761c60f2 561 }
j3 2:4e6e761c60f2 562
j3 2:4e6e761c60f2 563