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
Diff: ds3231.cpp
- Revision:
- 15:16ca4c747252
- Parent:
- 12:b9f13fd8c1b6
- Child:
- 16:e1c0f63595d9
--- a/ds3231.cpp Wed Mar 18 00:06:59 2015 +0000 +++ b/ds3231.cpp Mon Mar 28 19:17:34 2016 +0000 @@ -1,19 +1,4 @@ /******************************************************************//** -* @file ds3231.cpp -* -* @author Justin Jordan -* -* @version 1.0 -* -* Started: 11NOV14 -* -* Updated: -* -* @brief Source file for DS3231 class -* -*********************************************************************** -* -* @copyright * Copyright (C) 2015 Maxim Integrated Products, Inc., All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a @@ -49,56 +34,60 @@ #include "ds3231.h" -/**********************************************************//** -* Constructor for Ds3231 Class -* -* On Entry: -* @param[in] sda - sda pin of I2C bus -* @param[in] scl - scl pin of I2C bus -* -* On Exit: -* @return none -* -* Example: -* @code -* -* //instantiate rtc object -* Ds3231 rtc(D14, D15); -* -* @endcode -**************************************************************/ -Ds3231::Ds3231(PinName sda, PinName scl) : I2C(sda, scl) +#define DS3231_I2C_ADRS 0x68 +#define I2C_WRITE 0 +#define I2C_READ 1 + +#define AM_PM (1 << 5) +#define MODE (1 << 6) +#define DY_DT (1 << 6) +#define ALRM_MASK (1 << 7) + +//control register bit masks +#define A1IE (1 << 0) +#define A2IE (1 << 1) +#define INTCN (1 << 2) +#define RS1 (1 << 3) +#define RS2 (1 << 4) +#define CONV (1 << 5) +#define BBSQW (1 << 6) +#define EOSC (1 << 7) + +//status register bit masks +#define A1F (1 << 0) +#define A2F (1 << 1) +#define BSY (1 << 2) +#define EN32KHZ (1 << 3) +#define OSF (1 << 7) + + +//********************************************************************* +Ds3231::Ds3231(PinName sda, PinName scl) +:_p_i2c(new I2C(sda, scl)), _i2c_owner(true), _w_adrs((DS3231_I2C_ADRS << 1) | I2C_WRITE), +_r_adrs((DS3231_I2C_ADRS << 1) | I2C_READ) { - w_adrs = ((DS3231_I2C_ADRS << 1) | I2C_WRITE); - r_adrs = ((DS3231_I2C_ADRS << 1) | I2C_READ); } -/**********************************************************//** -* Sets the time on DS3231 -* Struct data is in integrer format, not BCD. Fx will convert -* to BCD for you. -* -* On Entry: -* @param[in] time - struct cotaining time data; -* -* On Exit: -* @return return value = 0 on success, non-0 on failure -* -* Example: -* @code -* -* //instantiate rtc object -* Ds3231 rtc(D14, D15); -* -* //time = 12:00:00 AM 12hr mode -* ds3231_time_t time = {12, 0, 0, 0, 1} -* uint16_t rtn_val; -* -* rtn_val = rtc.set_time(time); -* -* @endcode -**************************************************************/ +//********************************************************************* +Ds3231::Ds3231(I2C & i2c_bus) +:_p_i2c(&i2c_bus), _i2c_owner(false), _w_adrs((DS3231_I2C_ADRS << 1) | I2C_WRITE), +_r_adrs((DS3231_I2C_ADRS << 1) | I2C_READ) +{ +} + + +//********************************************************************* +Ds3231::~Ds3231() +{ + if(_i2c_owner) + { + delete _p_i2c; + } +} + + +//********************************************************************* uint16_t Ds3231::set_time(ds3231_time_t time) { uint8_t data[] = {0,0,0,0}; @@ -135,34 +124,12 @@ } else { - return(write(w_adrs,(const char*) data, data_length)); + return(_p_i2c->write(_w_adrs,(const char*) data, data_length)); } } -/**********************************************************//** -* Sets the calendar on DS3231 -* -* On Entry: -* @param[in] calendar - struct cotaining calendar data -* -* On Exit: -* @return return value = 0 on success, non-0 on failure -* -* Example: -* @code -* -* //instantiate rtc object -* Ds3231 rtc(D14, D15); -* -* //see datasheet for calendar format -* ds3231_calendar_t calendar = {1, 1, 1, 0}; -* uint16_t rtn_val; -* -* rtn_val = rtc.set_calendar(calendar); -* -* @endcode -**************************************************************/ +//********************************************************************* uint16_t Ds3231::set_calendar(ds3231_calendar_t calendar) { uint8_t data[] = {0,0,0,0,0}; @@ -184,37 +151,12 @@ } else { - return(write(w_adrs,(const char*) data, data_length)); + return(_p_i2c->write(_w_adrs,(const char*) data, data_length)); } } -/**********************************************************//** -* Set either Alarm1 or Alarm2 of DS3231 -* -* On Entry: -* @param[in] alarm - struct cotaining alarm data -* -* @param[in] one_r_two - TRUE for Alarm1 and FALSE for -* Alarm2 -* -* On Exit: -* @return return value = 0 on success, non-0 on failure -* -* Example: -* @code -* -* //instantiate rtc object -* Ds3231 rtc(D14, D15); -* -* //see ds3231.h for .members and datasheet for alarm format -* ds3231_alrm_t alarm; -* uint16_t rtn_val; -* -* rtn_val = rtc.set_alarm(alarm, FALSE); -* -* @endcode -**************************************************************/ +//********************************************************************* uint16_t Ds3231::set_alarm(ds3231_alrm_t alarm, bool one_r_two) { uint8_t data[] = {0,0,0,0,0}; @@ -339,34 +281,12 @@ } else { - return(write(w_adrs,(const char*) data, data_length)); + return(_p_i2c->write(_w_adrs,(const char*) data, data_length)); } } -/**********************************************************//** -* Set control and status registers of DS3231 -* -* On Entry: -* @param[in] data - Struct containing control and status -* register data -* -* On Exit: -* @return return value = 0 on success, non-0 on failure -* -* Example: -* @code -* -* //instantiate rtc object -* Ds3231 rtc(D14, D15); -* -* //do not use 0xAA, see datasheet for appropriate data -* ds3231_cntl_stat_t data = {0xAA, 0xAA}; -* -* rtn_val = rtc.set_cntl_stat_reg(data); -* -* @endcode -**************************************************************/ +//********************************************************************* uint16_t Ds3231::set_cntl_stat_reg(ds3231_cntl_stat_t data) { uint8_t local_data[] = {0,0,0}; @@ -377,46 +297,22 @@ local_data[data_length++] = data.status; //users responsibility to make sure data is logical - return(write(w_adrs,(const char*) local_data, data_length)); + return(_p_i2c->write(_w_adrs,(const char*) local_data, data_length)); } -/**********************************************************//** -* Gets the time on DS3231 -* -* On Entry: -* @param[in] time - pointer to struct for storing time data -* -* On Exit: -* @param[out] time - contains current integrer rtc time -* data -* @return return value = 0 on success, non-0 on failure -* -* Example: -* @code -* -* //instantiate rtc object -* Ds3231 rtc(D14, D15); -* -* //time = 12:00:00 AM 12hr mode -* ds3231_time_t time = {12, 0, 0, 0, 1} -* uint16_t rtn_val; -* -* rtn_val = rtc.get_time(&time); -* -* @endcode -**************************************************************/ +//********************************************************************* uint16_t Ds3231::get_time(ds3231_time_t* time) { uint16_t rtn_val = 1; uint8_t data[3]; data[0] = SECONDS; - rtn_val = write(w_adrs, (const char*) data, 1); + rtn_val = _p_i2c->write(_w_adrs, (const char*) data, 1); if(!rtn_val) { - rtn_val = read(r_adrs,(char *) data, 3); + rtn_val = _p_i2c->read(_r_adrs,(char *) data, 3); time->seconds = bcd_2_uchar(data[0]); time->minutes = bcd_2_uchar(data[1]); @@ -437,43 +333,18 @@ } -/**********************************************************//** -* Gets the calendar on DS3231 -* -* On Entry: -* @param[in] calendar - pointer to struct for storing -* calendar data -* -* On Exit: -* @param[out] calendar - contains current integer rtc -* calendar data -* @return return value = 0 on success, non-0 on failure -* -* Example: -* @code -* -* //instantiate rtc object -* Ds3231 rtc(D14, D15); -* -* //see datasheet for calendar format -* ds3231_calendar_t calendar = {1, 1, 1, 0}; -* uint16_t rtn_val; -* -* rtn_val = rtc.get_calendar(&calendar); -* -* @endcode -**************************************************************/ +//********************************************************************* uint16_t Ds3231::get_calendar(ds3231_calendar_t* calendar) { uint16_t rtn_val = 1; uint8_t data[4]; data[0] = DAY; - rtn_val = write(w_adrs, (const char*) data, 1); + rtn_val = _p_i2c->write(_w_adrs, (const char*) data, 1); if(!rtn_val) { - rtn_val = read(r_adrs,(char *) data, 4); + rtn_val = _p_i2c->read(_r_adrs,(char *) data, 4); calendar->day = bcd_2_uchar(data[0]); calendar->date = bcd_2_uchar(data[1]); @@ -485,34 +356,7 @@ } -/**********************************************************//** -* Get either Alarm1 or Alarm2 of DS3231 -* -* On Entry: -* @param[in] alarm - pointer to struct for storing alarm -* data; -* -* @param[in] one_r_two - TRUE for Alarm1 and FALSE for -* Alarm2 -* -* On Exit: -* @param[out] alarm - contains integer alarm data -* @return return value = 0 on success, non-0 on failure -* -* Example: -* @code -* -* //instantiate rtc object -* Ds3231 rtc(D14, D15); -* -* //see ds3231.h for .members and datasheet for alarm format -* ds3231_alrm_t alarm; -* uint16_t rtn_val; -* -* rtn_val = rtc.get_alarm(&alarm, FALSE); -* -* @endcode -**************************************************************/ +//********************************************************************* uint16_t Ds3231::get_alarm(ds3231_alrm_t* alarm, bool one_r_two) { uint16_t rtn_val = 1; @@ -521,11 +365,11 @@ if(one_r_two) { data[0] = ALRM1_SECONDS; - rtn_val = write(w_adrs, (const char*) data, 1); + rtn_val = _p_i2c->write(_w_adrs, (const char*) data, 1); if(!rtn_val) { - rtn_val = read(r_adrs,(char *) data, 4); + rtn_val = _p_i2c->read(_r_adrs,(char *) data, 4); alarm->seconds = bcd_2_uchar(data[0]&0x7F); alarm->am1 = (data[0]&ALRM_MASK); @@ -559,11 +403,11 @@ else { data[0] = ALRM2_MINUTES; - rtn_val = write(w_adrs, (const char*) data, 1); + rtn_val = _p_i2c->write(_w_adrs, (const char*) data, 1); if(!rtn_val) { - rtn_val = read(r_adrs,(char *) data, 4); + rtn_val = _p_i2c->read(_r_adrs,(char *) data, 4); alarm->minutes = bcd_2_uchar(data[0]&0x7F); alarm->am2 = (data[0]&ALRM_MASK); @@ -597,42 +441,18 @@ } -/**********************************************************//** -* Get control and status registers of DS3231 -* -* On Entry: -* @param[in] data - pointer to struct for storing control -* and status register data -* -* On Exit: -* @param[out] data - contains control and status registers -* data -* @return return value = 0 on success, non-0 on failure -* -* Example: -* @code -* -* //instantiate rtc object -* Ds3231 rtc(D14, D15); -* -* //do not use 0xAA, see datasheet for appropriate data -* ds3231_cntl_stat_t data = {0xAA, 0xAA}; -* -* rtn_val = rtc.get_cntl_stat_reg(&data); -* -* @endcode -**************************************************************/ +//********************************************************************* uint16_t Ds3231::get_cntl_stat_reg(ds3231_cntl_stat_t* data) { uint16_t rtn_val = 1; uint8_t local_data[2]; local_data[0] = CONTROL; - rtn_val = write(w_adrs, (const char*) local_data, 1); + rtn_val = _p_i2c->write(_w_adrs, (const char*) local_data, 1); if(!rtn_val) { - rtn_val = read(r_adrs,(char *) local_data, 2); + rtn_val = _p_i2c->read(_r_adrs,(char *) local_data, 2); data->control = local_data[0]; data->status = local_data[1]; @@ -642,37 +462,18 @@ } -/**********************************************************//** -* Get temperature data of DS3231 -* -* On Entry: -* -* On Exit: -* @return return value = raw temperature data -* -* Example: -* @code -* -* //instantiate rtc object -* Ds3231 rtc(D14, D15); -* -* uint16_t temp; -* -* temp = rtc.get_temperature(); -* -* @endcode -**************************************************************/ +//********************************************************************* uint16_t Ds3231::get_temperature(void) { uint16_t rtn_val = 1; uint8_t data[2]; data[0] = MSB_TEMP; - rtn_val = write(w_adrs, (const char*) data, 1); + rtn_val = _p_i2c->write(_w_adrs, (const char*) data, 1); if(!rtn_val) { - read(r_adrs,(char *) data, 2); + _p_i2c->read(_r_adrs,(char *) data, 2); rtn_val = data[0] << 8; rtn_val |= data[1]; @@ -682,28 +483,7 @@ } -/**********************************************************//** -* Get epoch time based on current RTC time and date. -* DS3231 must be configured and running before this fx is -* called -* -* On Entry: -* -* On Exit: -* @return return value = epoch time -* -* Example: -* @code -* -* //instantiate rtc object -* Ds3231 rtc(D14, D15); -* -* time_t epoch_time; -* -* epoch_time = rtc.get_epoch(); -* -* @endcode -**************************************************************/ +//********************************************************************* time_t Ds3231::get_epoch(void) { //system vars @@ -749,16 +529,7 @@ } -/**********************************************************//** -* Private mmber fx, converts unsigned char to BCD -* -* On Entry: -* @param[in] data - 0-255 -* -* On Exit: -* @return bcd_result = BCD representation of data -* -**************************************************************/ +//********************************************************************* uint16_t Ds3231::uchar_2_bcd(uint8_t data) { uint16_t bcd_result = 0; @@ -778,16 +549,7 @@ } -/**********************************************************//** -* Private mmber fx, converts BCD to a uint8_t -* -* On Entry: -* @param[in] bcd - 0-99 -* -* On Exit: -* @return rtn_val = integer rep. of BCD -* -**************************************************************/ +//********************************************************************* uint8_t Ds3231::bcd_2_uchar(uint8_t bcd) { uint8_t rtn_val = 0;