a library to use DS1337 as RTC
Fork of DS1337 by
Revision 0:129d962af46f, committed 2014-04-29
- Comitter:
- lawliet
- Date:
- Tue Apr 29 12:58:07 2014 +0000
- Commit message:
- Initial Version
Changed in this revision
DS1337.cpp | Show annotated file Show diff for this revision Revisions of this file |
DS1337.h | Show annotated file Show diff for this revision Revisions of this file |
diff -r 000000000000 -r 129d962af46f DS1337.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DS1337.cpp Tue Apr 29 12:58:07 2014 +0000 @@ -0,0 +1,142 @@ +#include "DS1337.h" + + +// NOTE: To keep the math from getting even more lengthy/annoying than it already is, the following constraints are imposed: +// 1) All times are in 24-hour format (military time) +// 2) DayOfWeek field is not used internally or checked for validity. Alarm functions may optionally set alarms repeating on DayOfWeek, but this feature has not been tested yet. +// 3) This library's buffer stores all times in raw BCD format, just as it is sent from the RTC. +// It is not converted to/from 'real' (binary) values until needed via get...() and set...() functions. +// In other words, don't go hacking around and reading from the rtc_bcd[] buffer directly, unless you want the raw BCD results. + + +// Cumulative number of days elapsed at the start of each month, assuming a normal (non-leap) year. +unsigned int monthdays[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; + +unsigned char DS1337::getRegister(unsigned char registerNumber) +{ + uint8_t val = registerNumber; + + i2c.write(DS1337_CTRL_ID,(char *)&val,1); + i2c.stop(); + i2c.read(DS1337_CTRL_ID, (char *)&val, 1); + return val; +} + +void DS1337::setRegister(unsigned char registerNumber, unsigned char value) +{ + uint8_t val[2]; + val[0] = registerNumber; + val[1] = value; + i2c.write(DS1337_CTRL_ID, (char *)val, 2); +} + +void DS1337::readTime(void) +{ + uint8_t val = 0x00; + + i2c.write(DS1337_CTRL_ID,(char *)&val,1); + i2c.stop(); + i2c.read(DS1337_CTRL_ID, (char *)rtc_bcd, 7); +} + +unsigned char DS1337::getSeconds() +{ + return bcd2bin(rtc_bcd[DS1337_SEC]); +} + +unsigned char DS1337::getMinutes() +{ + return bcd2bin(rtc_bcd[DS1337_MIN]); +} +unsigned char DS1337::getHours() +{ + return bcd2bin(rtc_bcd[DS1337_HR]); +} +unsigned char DS1337::getDays() +{ + return bcd2bin(rtc_bcd[DS1337_DATE]); +} +unsigned char DS1337::getDayOfWeek() +{ + return bcd2bin(rtc_bcd[DS1337_DOW]); +} +unsigned char DS1337::getMonths() +{ + return bcd2bin(rtc_bcd[DS1337_MTH]); +} +unsigned int DS1337::getYears() +{ + return 2000 + bcd2bin(rtc_bcd[DS1337_YR]); +} + + +void DS1337::setSeconds(unsigned char v) +{ + rtc_bcd[DS1337_SEC] = bin2bcd(v); + +} +void DS1337::setMinutes(unsigned char v) +{ + rtc_bcd[DS1337_MIN] = bin2bcd(v); + +} +void DS1337::setHours(unsigned char v) +{ + rtc_bcd[DS1337_HR] = bin2bcd(v); + +} +void DS1337::setDays(unsigned char v) +{ + rtc_bcd[DS1337_DATE] = bin2bcd(v); + +} +void DS1337::setDayOfWeek(unsigned char v) +{ + rtc_bcd[DS1337_DOW] = bin2bcd(v); + +} +void DS1337::setMonths(unsigned char v) +{ + rtc_bcd[DS1337_MTH] = bin2bcd(v); + +} +void DS1337::setYears(unsigned int v) +{ + if (v>1999) + { + v -= 2000; + } + rtc_bcd[DS1337_YR] = bin2bcd(v); + +} + +void DS1337::setTime() +{ + char set_[8]; + set_[0] = 0x00; + for(int i=0; i<7; i++) + { + set_[i+1] = rtc_bcd[i]; + } + i2c.write(DS1337_CTRL_ID, set_, 8); +} + +byte DS1337::bcd2bin(byte v) +{ + return (v&0x0F) + ((v>>4)*10); +} + +byte DS1337::bin2bcd(byte v) +{ + return ((v / 10)<<4) + (v % 10); +} + +void DS1337::stop(void) +{ + setRegister(DS1337_SP, getRegister(DS1337_SP) | DS1337_SP_EOSC); +} + +void DS1337::start(void) +{ + setRegister(DS1337_SP, getRegister(DS1337_SP) & !DS1337_SP_EOSC); +} \ No newline at end of file
diff -r 000000000000 -r 129d962af46f DS1337.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DS1337.h Tue Apr 29 12:58:07 2014 +0000 @@ -0,0 +1,138 @@ +/* + DS1337.h - library for DS1337 rtc +*/ + +// ensure this library description is only included once +#ifndef DS1337_h +#define DS1337_h + +// include types & constants of Wiring core API +#include "mbed.h" + +typedef int8_t byte; +#define I2C_FREQ 100000 +// indices within the rtc_bcd[] buffer +#define DS1337_SEC 0 +#define DS1337_MIN 1 +#define DS1337_HR 2 +#define DS1337_DOW 3 +#define DS1337_DATE 4 +#define DS1337_MTH 5 +#define DS1337_YR 6 + +#define DS1337_BASE_YR 2000 + +#define DS1337_CTRL_ID 0xD0 + + + +// Define register bit masks +#define DS1337_CLOCKHALT (1<<7) + +#define DS1337_LO_BCD 0xf +#define DS1337_HI_BCD 0xf0 + +#define DS1337_HI_SEC 0x70 +#define DS1337_HI_MIN 0x70 +#define DS1337_HI_HR 0x30 +#define DS1337_LO_DOW 0x07 +#define DS1337_HI_DATE 0x30 +#define DS1337_HI_MTH 0x30 +#define DS1337_HI_YR 0xf0 + +#define DS1337_ARLM1 0x07 +#define DS1337_ARLM1_LO_SEC 0xf +#define DS1337_ARLM1_HI_SEC 0x70 +#define DS1337_ARLM1_LO_MIN 0x70 +#define DS1337_ARLM1_HI_MIN 0xf + +#define DS1337_SP 0x0E +#define DS1337_SP_EOSC (1<<7) +#define DS1337_SP_RS2 (1<<4) +#define DS1337_SP_RS1 (1<<3) +#define DS1337_SP_INTCN (1<<2) +#define DS1337_SP_A2IE (1<<1) +#define DS1337_SP_A1IE (1<<0) + +#define DS1337_STATUS 0x0F +#define DS1337_STATUS_OSF (1<<7) +#define DS1337_STATUS_A2F (1<<1) +#define DS1337_STATUS_A1F (1<<0) + +/* Definitions for alarm repeat */ +/* The private variable alarm_repeat holds the user's alarm repeat preference. However, the DS1337 encodes these in the topmost bit(s) of the 4 alarm registers. */ +/* Splattering these bits across the alarm regs is handled in the writeAlarm() function. */ +/* If DY/DT is set, the day field is interpreted as a DayOfWeek (1 ~ 7), else it is interpreted as a DayOfMonth.*/ + +/* user alarm_repeat bit mask: + 7 6 5 4 3 2 1 0 + [x x x A1M4 DY/DT A1M3 A1M2 A1M1] +*/ + +#define EVERY_SECOND B00010111 +#define EVERY_MINUTE B00010110 +#define EVERY_HOUR B00010100 +#define EVERY_DAY B00010000 +#define EVERY_WEEK B00001000 +#define EVERY_MONTH B00000000 + + +/* typedef struct { + unsigned int year; + unsigned char month; + unsigned char day; + unsigned char dayOfWeek; + unsigned char hour; + unsigned char minute; + unsigned char second; +} TIME; */ + + +// library interface description +class DS1337 { + // user-accessible "public" interface +public: + DS1337::DS1337(PinName sda, PinName scl) : i2c(sda,scl) { + i2c.frequency(I2C_FREQ); + }; + void readTime(void); + unsigned char getSeconds(); + unsigned char getMinutes(); + unsigned char getHours(); + unsigned char getDays(); + unsigned char getDayOfWeek(); + unsigned char getMonths(); + unsigned int getYears(); + + void setSeconds(unsigned char); + void setMinutes(unsigned char); + void setHours(unsigned char); + void setDays(unsigned char); + void setDayOfWeek(unsigned char); + void setMonths(unsigned char); + void setYears(unsigned int); + + void setTime(); + + + void start(void); + void stop(void); + unsigned char getRegister(unsigned char registerNumber); + void setRegister(unsigned char registerNumber, unsigned char registerValue); + //void unsetRegister(unsigned char registerNumber, unsigned char registerMask); + + // library-accessible "private" interface +private: + I2C i2c; + byte time_set; + byte alarm_repeat; + byte rtc_bcd[7]; // used prior to read/set DS1337 registers; + void read(void); + void save(void); + byte bcd2bin(byte); + byte bin2bcd(byte); +}; + +//extern DS1337 RTC_DS1337(P0_5,P0_4); + +#endif \ No newline at end of file